Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'UVtools.GUI')
-rw-r--r--UVtools.GUI/App.config114
-rw-r--r--UVtools.GUI/Forms/FrmAbout.cs8
-rw-r--r--UVtools.GUI/Forms/FrmMutation.cs21
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs296
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.cs182
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.resx131
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs289
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs173
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx131
-rw-r--r--UVtools.GUI/Forms/FrmMutationResize.Designer.cs152
-rw-r--r--UVtools.GUI/Forms/FrmSettings.Designer.cs1112
-rw-r--r--UVtools.GUI/Forms/FrmSettings.cs157
-rw-r--r--UVtools.GUI/Forms/FrmSettings.resx2204
-rw-r--r--UVtools.GUI/FrmMain.Designer.cs145
-rw-r--r--UVtools.GUI/FrmMain.cs610
-rw-r--r--UVtools.GUI/FrmMain.resx122
-rw-r--r--UVtools.GUI/Images/settings-16x16.pngbin0 -> 290 bytes
-rw-r--r--UVtools.GUI/Mutation.cs26
-rw-r--r--UVtools.GUI/Properties/Resources.Designer.cs10
-rw-r--r--UVtools.GUI/Properties/Resources.resx63
-rw-r--r--UVtools.GUI/Properties/Settings.Designer.cs420
-rw-r--r--UVtools.GUI/Properties/Settings.settings116
-rw-r--r--UVtools.GUI/UVtools.GUI.csproj51
-rw-r--r--UVtools.GUI/packages.config9
24 files changed, 6069 insertions, 473 deletions
diff --git a/UVtools.GUI/App.config b/UVtools.GUI/App.config
index d896ff5..6e67ee6 100644
--- a/UVtools.GUI/App.config
+++ b/UVtools.GUI/App.config
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
+ <configSections>
+ <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <section name="UVtools.GUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+ </sectionGroup>
+ </configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
@@ -23,4 +28,113 @@
</dependentAssembly>
</assemblyBinding>
</runtime>
+ <userSettings>
+ <UVtools.GUI.Properties.Settings>
+ <setting name="PreviousNextLayerColor" serializeAs="String">
+ <value>Red</value>
+ </setting>
+ <setting name="IslandColor" serializeAs="String">
+ <value>Yellow</value>
+ </setting>
+ <setting name="ResinTrapColor" serializeAs="String">
+ <value>Orange</value>
+ </setting>
+ <setting name="TouchingBoundsColor" serializeAs="String">
+ <value>Red</value>
+ </setting>
+ <setting name="PreviousLayerColor" serializeAs="String">
+ <value>Magenta</value>
+ </setting>
+ <setting name="NextLayerColor" serializeAs="String">
+ <value>Cyan</value>
+ </setting>
+ <setting name="UpdateSettings" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="StartMaximized" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="CheckForUpdatesOnStartup" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="LayerAutoRotateBestView" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="LayerDifferenceDefault" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="ComputeIssuesOnLoad" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="LayerZoomToFit" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ComputeIslands" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ComputeResinTraps" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="IslandRequiredAreaToProcessCheck" serializeAs="String">
+ <value>1</value>
+ </setting>
+ <setting name="IslandRequiredPixelBrightnessToProcessCheck" serializeAs="String">
+ <value>1</value>
+ </setting>
+ <setting name="IslandRequiredPixelsToSupport" serializeAs="String">
+ <value>10</value>
+ </setting>
+ <setting name="IslandRequiredPixelBrightnessToSupport" serializeAs="String">
+ <value>150</value>
+ </setting>
+ <setting name="ResinTrapRequiredAreaToProcessCheck" serializeAs="String">
+ <value>17</value>
+ </setting>
+ <setting name="ResinTrapRequiredBlackPixelsToDrain" serializeAs="String">
+ <value>10</value>
+ </setting>
+ <setting name="ResinTrapMaximumPixelBrightnessToDrain" serializeAs="String">
+ <value>30</value>
+ </setting>
+ <setting name="AutoComputeIssuesClickOnTab" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBoundsColor" serializeAs="String">
+ <value>Lime</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBoundsLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlineLayerBoundsColor" serializeAs="String">
+ <value>Lime</value>
+ </setting>
+ <setting name="OutlineLayerBoundsLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlineHollowAreasColor" serializeAs="String">
+ <value>Orange</value>
+ </setting>
+ <setting name="OutlineHollowAreasLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBounds" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="OutlineLayerBounds" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="OutlineHollowAreas" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="ZoomToFitPrintVolumeBounds" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ResinTrapBinaryThreshold" serializeAs="String">
+ <value>127</value>
+ </setting>
+ <setting name="IslandBinaryThreshold" serializeAs="String">
+ <value>0</value>
+ </setting>
+ </UVtools.GUI.Properties.Settings>
+ </userSettings>
</configuration>
diff --git a/UVtools.GUI/Forms/FrmAbout.cs b/UVtools.GUI/Forms/FrmAbout.cs
index feeb862..baeebdc 100644
--- a/UVtools.GUI/Forms/FrmAbout.cs
+++ b/UVtools.GUI/Forms/FrmAbout.cs
@@ -46,13 +46,7 @@ namespace UVtools.GUI.Forms
}
}
- public static string AssemblyVersion
- {
- get
- {
- return Assembly.GetExecutingAssembly().GetName().Version.ToString();
- }
- }
+ public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString();
public static string AssemblyDescription
{
diff --git a/UVtools.GUI/Forms/FrmMutation.cs b/UVtools.GUI/Forms/FrmMutation.cs
index 0729e88..be92c0e 100644
--- a/UVtools.GUI/Forms/FrmMutation.cs
+++ b/UVtools.GUI/Forms/FrmMutation.cs
@@ -8,6 +8,7 @@
using System;
using System.Windows.Forms;
+using UVtools.Core;
namespace UVtools.GUI.Forms
{
@@ -49,15 +50,21 @@ namespace UVtools.GUI.Forms
#endregion
#region Constructors
- public FrmMutation(Mutation mutation, uint defaultIterations = 1)
+
+ public FrmMutation()
{
InitializeComponent();
+ }
+
+ public FrmMutation(Mutation mutation, uint defaultIterations = 1) : this()
+ {
+
Mutation = mutation;
DialogResult = DialogResult.Cancel;
if (defaultIterations == 0 ||
- mutation.Mutate == Mutation.Mutates.PyrDownUp ||
- mutation.Mutate == Mutation.Mutates.Solidify)
+ mutation.Mutate == LayerManager.Mutate.PyrDownUp ||
+ mutation.Mutate == LayerManager.Mutate.Solidify)
{
lbIterationsStart.Enabled =
numIterationsStart.Enabled =
@@ -72,8 +79,8 @@ namespace UVtools.GUI.Forms
numIterationsStart.Select();
}
- if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian ||
- Mutation.Mutate == Mutation.Mutates.SmoothMedian)
+ if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian ||
+ Mutation.Mutate == LayerManager.Mutate.SmoothMedian)
{
lbIterationsStop.Enabled =
nmIterationsEnd.Enabled =
@@ -185,8 +192,8 @@ namespace UVtools.GUI.Forms
return;
}
- if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian ||
- Mutation.Mutate == Mutation.Mutates.SmoothMedian)
+ if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian ||
+ Mutation.Mutate == LayerManager.Mutate.SmoothMedian)
{
if (IterationsFade)
{
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs
new file mode 100644
index 0000000..4742fbf
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs
@@ -0,0 +1,296 @@
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
+{
+ partial class FrmMutationOneComboBox
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneComboBox));
+ this.lbDescription = new System.Windows.Forms.Label();
+ this.lbValue = new System.Windows.Forms.Label();
+ this.lbLayerRange = new System.Windows.Forms.Label();
+ this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
+ this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
+ this.lbLayerRangeTo = new System.Windows.Forms.Label();
+ this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnMutate = new System.Windows.Forms.Button();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.cbValue = new System.Windows.Forms.ComboBox();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.cbMakeCopy = new System.Windows.Forms.CheckBox();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
+ this.cmLayerRange.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lbDescription
+ //
+ this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbDescription.Location = new System.Drawing.Point(13, 14);
+ this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbDescription.Name = "lbDescription";
+ this.lbDescription.Size = new System.Drawing.Size(584, 128);
+ this.lbDescription.TabIndex = 0;
+ this.lbDescription.Text = "Description";
+ //
+ // lbValue
+ //
+ this.lbValue.Location = new System.Drawing.Point(2, 185);
+ this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbValue.Name = "lbValue";
+ this.lbValue.Size = new System.Drawing.Size(108, 20);
+ this.lbValue.TabIndex = 3;
+ this.lbValue.Text = "Label:";
+ this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lbLayerRange
+ //
+ this.lbLayerRange.AutoSize = true;
+ this.lbLayerRange.Location = new System.Drawing.Point(13, 150);
+ this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRange.Name = "lbLayerRange";
+ this.lbLayerRange.Size = new System.Drawing.Size(97, 20);
+ this.lbLayerRange.TabIndex = 9;
+ this.lbLayerRange.Text = "Layer range:";
+ this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip"));
+ //
+ // nmLayerRangeStart
+ //
+ this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147);
+ this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeStart.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeStart.Name = "nmLayerRangeStart";
+ this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeStart.TabIndex = 0;
+ //
+ // nmLayerRangeEnd
+ //
+ this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147);
+ this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeEnd.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeEnd.Name = "nmLayerRangeEnd";
+ this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeEnd.TabIndex = 1;
+ //
+ // lbLayerRangeTo
+ //
+ this.lbLayerRangeTo.AutoSize = true;
+ this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150);
+ this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRangeTo.Name = "lbLayerRangeTo";
+ this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20);
+ this.lbLayerRangeTo.TabIndex = 12;
+ this.lbLayerRangeTo.Text = "To:";
+ //
+ // cmLayerRange
+ //
+ this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btnLayerRangeAllLayers,
+ this.btnLayerRangeCurrentLayer,
+ this.btnLayerRangeBottomLayers,
+ this.btnLayerRangeNormalLayers});
+ this.cmLayerRange.Name = "cmLayerRange";
+ this.cmLayerRange.Size = new System.Drawing.Size(226, 92);
+ //
+ // btnLayerRangeAllLayers
+ //
+ this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers";
+ this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.A)));
+ this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeAllLayers.Text = "&All Layers";
+ this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeCurrentLayer
+ //
+ this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer";
+ this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.C)));
+ this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeCurrentLayer.Text = "&Current Layer";
+ this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeBottomLayers
+ //
+ this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers";
+ this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.B)));
+ this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeBottomLayers.Text = "&Bottom Layers";
+ this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeNormalLayers
+ //
+ this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers";
+ this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.N)));
+ this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
+ this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(434, 230);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnMutate
+ //
+ this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnMutate.Location = new System.Drawing.Point(276, 230);
+ this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnMutate.Name = "btnMutate";
+ this.btnMutate.Size = new System.Drawing.Size(150, 48);
+ this.btnMutate.TabIndex = 5;
+ this.btnMutate.Text = "&Mutate";
+ this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMutate.UseVisualStyleBackColor = true;
+ this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // cbValue
+ //
+ this.cbValue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cbValue.FormattingEnabled = true;
+ this.cbValue.Location = new System.Drawing.Point(117, 181);
+ this.cbValue.Name = "cbValue";
+ this.cbValue.Size = new System.Drawing.Size(121, 28);
+ this.cbValue.TabIndex = 13;
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
+ // cbMakeCopy
+ //
+ this.cbMakeCopy.AutoSize = true;
+ this.cbMakeCopy.Location = new System.Drawing.Point(244, 183);
+ this.cbMakeCopy.Name = "cbMakeCopy";
+ this.cbMakeCopy.Size = new System.Drawing.Size(104, 24);
+ this.cbMakeCopy.TabIndex = 14;
+ this.cbMakeCopy.Text = "Make copy";
+ this.cbMakeCopy.UseVisualStyleBackColor = true;
+ //
+ // FrmMutationOneComboBox
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(599, 292);
+ this.Controls.Add(this.cbMakeCopy);
+ this.Controls.Add(this.cbValue);
+ this.Controls.Add(this.btnLayerRangeSelect);
+ this.Controls.Add(this.lbLayerRangeTo);
+ this.Controls.Add(this.nmLayerRangeEnd);
+ this.Controls.Add(this.nmLayerRangeStart);
+ this.Controls.Add(this.lbLayerRange);
+ this.Controls.Add(this.btnMutate);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.lbValue);
+ this.Controls.Add(this.lbDescription);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.KeyPreview = true;
+ this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmMutationOneComboBox";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.Text = "Form1";
+ this.TopMost = true;
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
+ this.cmLayerRange.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbDescription;
+ private System.Windows.Forms.Label lbValue;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnMutate;
+ private System.Windows.Forms.Label lbLayerRange;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeStart;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeEnd;
+ private System.Windows.Forms.Label lbLayerRangeTo;
+ private Controls.SplitButton btnLayerRangeSelect;
+ private System.Windows.Forms.ContextMenuStrip cmLayerRange;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
+ private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.ComboBox cbValue;
+ private System.Windows.Forms.CheckBox cbMakeCopy;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs
new file mode 100644
index 0000000..b68012f
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs
@@ -0,0 +1,182 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using System;
+using System.Windows.Forms;
+using UVtools.Core;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmMutationOneComboBox : Form
+ {
+ #region Properties
+
+ private Mutation Mutation { get; }
+
+ public uint LayerRangeStart
+ {
+ get => (uint) nmLayerRangeStart.Value;
+ set => nmLayerRangeStart.Value = value;
+ }
+
+ public uint LayerRangeEnd
+ {
+ get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1);
+ set => nmLayerRangeEnd.Value = value;
+ }
+
+ public int SelectedValue
+ {
+ get => cbValue.SelectedIndex;
+ set => cbValue.SelectedIndex = value;
+ }
+
+ public bool MakeCopy
+ {
+ get => cbMakeCopy.Checked;
+ set => cbMakeCopy.Checked = value;
+ }
+ #endregion
+
+ #region Constructors
+ public FrmMutationOneComboBox(Mutation mutation)
+ {
+ InitializeComponent();
+ Mutation = mutation;
+ DialogResult = DialogResult.Cancel;
+
+ Text = $"Mutate: {mutation.Mutate}";
+ lbDescription.Text = Mutation.Description;
+
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+
+ switch (mutation.Mutate)
+ {
+ case LayerManager.Mutate.Flip:
+ lbValue.Text = "Flip Direction";
+ cbValue.Items.AddRange(new object[]
+ {
+ "Horizontally",
+ "Vertically",
+ "Both"
+ });
+ break;
+ }
+
+ SelectedValue = 0;
+ }
+ #endregion
+
+ #region Overrides
+ protected override void OnKeyUp(KeyEventArgs e)
+ {
+ base.OnKeyUp(e);
+ if (e.KeyCode == Keys.Enter)
+ {
+ btnMutate.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control)
+ {
+ if (e.KeyCode == Keys.A)
+ {
+ btnLayerRangeAllLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.C)
+ {
+ btnLayerRangeCurrentLayer.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.B)
+ {
+ btnLayerRangeBottomLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.N)
+ {
+ btnLayerRangeNormalLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Events
+ private void ItemClicked(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, btnLayerRangeAllLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeCurrentLayer))
+ {
+ nmLayerRangeStart.Value = Program.FrmMain.ActualLayer;
+ nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeBottomLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeNormalLayers))
+ {
+ nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnMutate))
+ {
+ if (!btnMutate.Enabled) return;
+ if (LayerRangeStart > LayerRangeEnd)
+ {
+ MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ nmLayerRangeStart.Select();
+ return;
+ }
+
+ if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnCancel))
+ {
+ DialogResult = DialogResult.Cancel;
+ return;
+ }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx
new file mode 100644
index 0000000..ceac7ae
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>148, 17</value>
+ </metadata>
+ <data name="lbLayerRange.ToolTip" xml:space="preserve">
+ <value>Selects the layers range within start layer and end layer where mutator will operate.
+Select same layer start as end to operate only within that layer.
+Note: "Layer Start" start can't be higher than "Layer End".</value>
+ </data>
+ <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs
new file mode 100644
index 0000000..8e83792
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs
@@ -0,0 +1,289 @@
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
+{
+ partial class FrmMutationOneNumericalInput
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneNumericalInput));
+ this.lbDescription = new System.Windows.Forms.Label();
+ this.lbValue = new System.Windows.Forms.Label();
+ this.lbLayerRange = new System.Windows.Forms.Label();
+ this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
+ this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
+ this.lbLayerRangeTo = new System.Windows.Forms.Label();
+ this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnMutate = new System.Windows.Forms.Button();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.nmValue = new System.Windows.Forms.NumericUpDown();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
+ this.cmLayerRange.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmValue)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lbDescription
+ //
+ this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbDescription.Location = new System.Drawing.Point(13, 14);
+ this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbDescription.Name = "lbDescription";
+ this.lbDescription.Size = new System.Drawing.Size(584, 128);
+ this.lbDescription.TabIndex = 0;
+ this.lbDescription.Text = "Description";
+ //
+ // lbValue
+ //
+ this.lbValue.Location = new System.Drawing.Point(13, 185);
+ this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbValue.Name = "lbValue";
+ this.lbValue.Size = new System.Drawing.Size(293, 20);
+ this.lbValue.TabIndex = 3;
+ this.lbValue.Text = "Label:";
+ this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lbLayerRange
+ //
+ this.lbLayerRange.AutoSize = true;
+ this.lbLayerRange.Location = new System.Drawing.Point(13, 150);
+ this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRange.Name = "lbLayerRange";
+ this.lbLayerRange.Size = new System.Drawing.Size(97, 20);
+ this.lbLayerRange.TabIndex = 9;
+ this.lbLayerRange.Text = "Layer range:";
+ this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip"));
+ //
+ // nmLayerRangeStart
+ //
+ this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147);
+ this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeStart.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeStart.Name = "nmLayerRangeStart";
+ this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeStart.TabIndex = 0;
+ //
+ // nmLayerRangeEnd
+ //
+ this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147);
+ this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeEnd.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeEnd.Name = "nmLayerRangeEnd";
+ this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeEnd.TabIndex = 1;
+ //
+ // lbLayerRangeTo
+ //
+ this.lbLayerRangeTo.AutoSize = true;
+ this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150);
+ this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRangeTo.Name = "lbLayerRangeTo";
+ this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20);
+ this.lbLayerRangeTo.TabIndex = 12;
+ this.lbLayerRangeTo.Text = "To:";
+ //
+ // cmLayerRange
+ //
+ this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btnLayerRangeAllLayers,
+ this.btnLayerRangeCurrentLayer,
+ this.btnLayerRangeBottomLayers,
+ this.btnLayerRangeNormalLayers});
+ this.cmLayerRange.Name = "cmLayerRange";
+ this.cmLayerRange.Size = new System.Drawing.Size(226, 92);
+ //
+ // btnLayerRangeAllLayers
+ //
+ this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers";
+ this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.A)));
+ this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeAllLayers.Text = "&All Layers";
+ this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeCurrentLayer
+ //
+ this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer";
+ this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.C)));
+ this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeCurrentLayer.Text = "&Current Layer";
+ this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeBottomLayers
+ //
+ this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers";
+ this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.B)));
+ this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeBottomLayers.Text = "&Bottom Layers";
+ this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeNormalLayers
+ //
+ this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers";
+ this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.N)));
+ this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
+ this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(434, 230);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnMutate
+ //
+ this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnMutate.Location = new System.Drawing.Point(276, 230);
+ this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnMutate.Name = "btnMutate";
+ this.btnMutate.Size = new System.Drawing.Size(150, 48);
+ this.btnMutate.TabIndex = 5;
+ this.btnMutate.Text = "&Mutate";
+ this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMutate.UseVisualStyleBackColor = true;
+ this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // nmValue
+ //
+ this.nmValue.Location = new System.Drawing.Point(314, 183);
+ this.nmValue.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmValue.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmValue.Name = "nmValue";
+ this.nmValue.Size = new System.Drawing.Size(120, 26);
+ this.nmValue.TabIndex = 13;
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
+ // FrmMutationOneNumericalInput
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(599, 292);
+ this.Controls.Add(this.nmValue);
+ this.Controls.Add(this.btnLayerRangeSelect);
+ this.Controls.Add(this.lbLayerRangeTo);
+ this.Controls.Add(this.nmLayerRangeEnd);
+ this.Controls.Add(this.nmLayerRangeStart);
+ this.Controls.Add(this.lbLayerRange);
+ this.Controls.Add(this.btnMutate);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.lbValue);
+ this.Controls.Add(this.lbDescription);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.KeyPreview = true;
+ this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmMutationOneNumericalInput";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.Text = "Form1";
+ this.TopMost = true;
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
+ this.cmLayerRange.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.nmValue)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbDescription;
+ private System.Windows.Forms.Label lbValue;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnMutate;
+ private System.Windows.Forms.Label lbLayerRange;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeStart;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeEnd;
+ private System.Windows.Forms.Label lbLayerRangeTo;
+ private Controls.SplitButton btnLayerRangeSelect;
+ private System.Windows.Forms.ContextMenuStrip cmLayerRange;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
+ private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.NumericUpDown nmValue;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs
new file mode 100644
index 0000000..a44bc21
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs
@@ -0,0 +1,173 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using System;
+using System.Windows.Forms;
+using UVtools.Core;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmMutationOneNumericalInput : Form
+ {
+ #region Properties
+
+ private Mutation Mutation { get; }
+
+ public uint LayerRangeStart
+ {
+ get => (uint) nmLayerRangeStart.Value;
+ set => nmLayerRangeStart.Value = value;
+ }
+
+ public uint LayerRangeEnd
+ {
+ get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1);
+ set => nmLayerRangeEnd.Value = value;
+ }
+
+ public decimal Value
+ {
+ get => nmValue.Value;
+ set => nmValue.Value = value;
+ }
+ #endregion
+
+ #region Constructors
+ public FrmMutationOneNumericalInput(Mutation mutation)
+ {
+ InitializeComponent();
+ Mutation = mutation;
+ DialogResult = DialogResult.Cancel;
+
+ Text = $"Mutate: {mutation.Mutate}";
+ lbDescription.Text = Mutation.Description;
+
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+
+ switch (mutation.Mutate)
+ {
+ case LayerManager.Mutate.Rotate:
+ lbValue.Text = "Rotation degrees:";
+ nmValue.Maximum = 360;
+ nmValue.Minimum = -360;
+ nmValue.DecimalPlaces = 2;
+
+ Value = 90;
+ break;
+ }
+ }
+ #endregion
+
+ #region Overrides
+ protected override void OnKeyUp(KeyEventArgs e)
+ {
+ base.OnKeyUp(e);
+ if (e.KeyCode == Keys.Enter)
+ {
+ btnMutate.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control)
+ {
+ if (e.KeyCode == Keys.A)
+ {
+ btnLayerRangeAllLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.C)
+ {
+ btnLayerRangeCurrentLayer.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.B)
+ {
+ btnLayerRangeBottomLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.N)
+ {
+ btnLayerRangeNormalLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Events
+ private void ItemClicked(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, btnLayerRangeAllLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeCurrentLayer))
+ {
+ nmLayerRangeStart.Value = Program.FrmMain.ActualLayer;
+ nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeBottomLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeNormalLayers))
+ {
+ nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnMutate))
+ {
+ if (!btnMutate.Enabled) return;
+ if (LayerRangeStart > LayerRangeEnd)
+ {
+ MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ nmLayerRangeStart.Select();
+ return;
+ }
+
+ if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnCancel))
+ {
+ DialogResult = DialogResult.Cancel;
+ return;
+ }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx
new file mode 100644
index 0000000..ceac7ae
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>148, 17</value>
+ </metadata>
+ <data name="lbLayerRange.ToolTip" xml:space="preserve">
+ <value>Selects the layers range within start layer and end layer where mutator will operate.
+Select same layer start as end to operate only within that layer.
+Note: "Layer Start" start can't be higher than "Layer End".</value>
+ </data>
+ <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
index 97af6c4..8eb1ef1 100644
--- a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
+++ b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
@@ -34,7 +34,6 @@ namespace UVtools.GUI.Forms
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationResize));
this.lbDescription = new System.Windows.Forms.Label();
this.lbX = new System.Windows.Forms.Label();
- this.nmX = new System.Windows.Forms.NumericUpDown();
this.lbLayerRange = new System.Windows.Forms.Label();
this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
@@ -44,20 +43,21 @@ namespace UVtools.GUI.Forms
this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
this.btnCancel = new System.Windows.Forms.Button();
this.btnMutate = new System.Windows.Forms.Button();
+ this.nmX = new System.Windows.Forms.NumericUpDown();
+ this.label1 = new System.Windows.Forms.Label();
this.lbY = new System.Windows.Forms.Label();
this.nmY = new System.Windows.Forms.NumericUpDown();
- this.cbConstrainXY = 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.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.cbConstrainXY = new System.Windows.Forms.CheckBox();
this.cbFade = new System.Windows.Forms.CheckBox();
- ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
this.cmLayerRange.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmY)).BeginInit();
this.SuspendLayout();
//
@@ -84,31 +84,6 @@ namespace UVtools.GUI.Forms
this.lbX.Text = "X:";
this.toolTip.SetToolTip(this.lbX, resources.GetString("lbX.ToolTip"));
//
- // nmX
- //
- this.nmX.DecimalPlaces = 2;
- this.nmX.Location = new System.Drawing.Point(118, 187);
- this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.nmX.Maximum = new decimal(new int[] {
- 1000,
- 0,
- 0,
- 0});
- this.nmX.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.nmX.Name = "nmX";
- this.nmX.Size = new System.Drawing.Size(120, 26);
- this.nmX.TabIndex = 3;
- this.nmX.Value = new decimal(new int[] {
- 100,
- 0,
- 0,
- 0});
- this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged);
- //
// lbLayerRange
//
this.lbLayerRange.AutoSize = true;
@@ -202,6 +177,25 @@ namespace UVtools.GUI.Forms
this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
//
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
// btnCancel
//
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@@ -233,6 +227,42 @@ namespace UVtools.GUI.Forms
this.btnMutate.UseVisualStyleBackColor = true;
this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
//
+ // nmX
+ //
+ this.nmX.DecimalPlaces = 2;
+ this.nmX.Location = new System.Drawing.Point(118, 187);
+ this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmX.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.nmX.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmX.Name = "nmX";
+ this.nmX.Size = new System.Drawing.Size(120, 26);
+ this.nmX.TabIndex = 3;
+ this.nmX.Value = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(246, 190);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(23, 20);
+ this.label1.TabIndex = 16;
+ this.label1.Text = "%";
+ this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip"));
+ //
// lbY
//
this.lbY.AutoSize = true;
@@ -269,38 +299,6 @@ namespace UVtools.GUI.Forms
0,
0});
//
- // cbConstrainXY
- //
- this.cbConstrainXY.AutoSize = true;
- this.cbConstrainXY.Checked = true;
- this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked;
- this.cbConstrainXY.Location = new System.Drawing.Point(470, 188);
- this.cbConstrainXY.Name = "cbConstrainXY";
- this.cbConstrainXY.Size = new System.Drawing.Size(126, 24);
- this.cbConstrainXY.TabIndex = 15;
- this.cbConstrainXY.Text = "Constrain X/Y";
- this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged);
- //
- // toolTip
- //
- this.toolTip.AutoPopDelay = 32767;
- this.toolTip.InitialDelay = 500;
- this.toolTip.IsBalloon = true;
- this.toolTip.ReshowDelay = 100;
- this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
- this.toolTip.ToolTipTitle = "Information";
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(246, 190);
- this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(23, 20);
- this.label1.TabIndex = 16;
- this.label1.Text = "%";
- this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip"));
- //
// label2
//
this.label2.AutoSize = true;
@@ -312,15 +310,17 @@ namespace UVtools.GUI.Forms
this.label2.Text = "%";
this.toolTip.SetToolTip(this.label2, resources.GetString("label2.ToolTip"));
//
- // btnLayerRangeSelect
+ // cbConstrainXY
//
- this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
- this.btnLayerRangeSelect.Menu = this.cmLayerRange;
- this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
- this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
- this.btnLayerRangeSelect.TabIndex = 2;
- this.btnLayerRangeSelect.Text = "Select";
- this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ this.cbConstrainXY.AutoSize = true;
+ this.cbConstrainXY.Checked = true;
+ this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.cbConstrainXY.Location = new System.Drawing.Point(470, 188);
+ this.cbConstrainXY.Name = "cbConstrainXY";
+ this.cbConstrainXY.Size = new System.Drawing.Size(126, 24);
+ this.cbConstrainXY.TabIndex = 15;
+ this.cbConstrainXY.Text = "Constrain X/Y";
+ this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged);
//
// cbFade
//
@@ -364,10 +364,10 @@ namespace UVtools.GUI.Forms
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "Form1";
this.TopMost = true;
- ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
this.cmLayerRange.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmY)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -378,7 +378,6 @@ namespace UVtools.GUI.Forms
private System.Windows.Forms.Label lbDescription;
private System.Windows.Forms.Label lbX;
- private System.Windows.Forms.NumericUpDown nmX;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnMutate;
private System.Windows.Forms.Label lbLayerRange;
@@ -391,12 +390,13 @@ namespace UVtools.GUI.Forms
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
- private System.Windows.Forms.Label lbY;
- private System.Windows.Forms.NumericUpDown nmY;
- private System.Windows.Forms.CheckBox cbConstrainXY;
private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.NumericUpDown nmX;
private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lbY;
+ private System.Windows.Forms.NumericUpDown nmY;
private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.CheckBox cbConstrainXY;
private System.Windows.Forms.CheckBox cbFade;
}
} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmSettings.Designer.cs b/UVtools.GUI/Forms/FrmSettings.Designer.cs
new file mode 100644
index 0000000..9456992
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.Designer.cs
@@ -0,0 +1,1112 @@
+namespace UVtools.GUI.Forms
+{
+ partial class FrmSettings
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSettings));
+ this.label1 = new System.Windows.Forms.Label();
+ this.btnPreviousNextLayerColor = new System.Windows.Forms.Button();
+ this.colorDialog = new System.Windows.Forms.ColorDialog();
+ this.btnPreviousLayerColor = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnNextLayerColor = new System.Windows.Forms.Button();
+ this.label3 = new System.Windows.Forms.Label();
+ this.btnTouchingBoundsColor = new System.Windows.Forms.Button();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.btnResinTrapColor = new System.Windows.Forms.Button();
+ this.btnIslandColor = new System.Windows.Forms.Button();
+ this.btnSave = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.groupGeneral = new System.Windows.Forms.GroupBox();
+ this.cbCheckForUpdatesOnStartup = new System.Windows.Forms.CheckBox();
+ this.cbStartMaximized = new System.Windows.Forms.CheckBox();
+ this.groupLayerPreview = new System.Windows.Forms.GroupBox();
+ this.cbZoomToFitPrintVolumeBounds = new System.Windows.Forms.CheckBox();
+ this.cbOutlineHollowAreas = new System.Windows.Forms.CheckBox();
+ this.label18 = new System.Windows.Forms.Label();
+ this.nmOutlineHollowAreasLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label19 = new System.Windows.Forms.Label();
+ this.btnOutlineHollowAreasColor = new System.Windows.Forms.Button();
+ this.cbOutlineLayerBounds = new System.Windows.Forms.CheckBox();
+ this.label16 = new System.Windows.Forms.Label();
+ this.nmOutlineLayerBoundsLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label17 = new System.Windows.Forms.Label();
+ this.btnOutlineLayerBoundsColor = new System.Windows.Forms.Button();
+ this.cbOutlinePrintVolumeBounds = new System.Windows.Forms.CheckBox();
+ this.label15 = new System.Windows.Forms.Label();
+ this.nmOutlinePrintVolumeBoundsLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label14 = new System.Windows.Forms.Label();
+ this.btnOutlinePrintVolumeBoundsColor = new System.Windows.Forms.Button();
+ this.cbLayerZoomToFit = new System.Windows.Forms.CheckBox();
+ this.cbLayerDifferenceDefault = new System.Windows.Forms.CheckBox();
+ this.cbLayerAutoRotateBestView = new System.Windows.Forms.CheckBox();
+ this.cbComputeIssuesOnLoad = new System.Windows.Forms.CheckBox();
+ this.btnReset = new System.Windows.Forms.Button();
+ this.cbComputeIslands = new System.Windows.Forms.CheckBox();
+ this.cbComputeResinTraps = new System.Windows.Forms.CheckBox();
+ this.gbIssues = new System.Windows.Forms.GroupBox();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.nmResinTrapMaximumPixelBrightnessToDrain = new System.Windows.Forms.NumericUpDown();
+ this.label13 = new System.Windows.Forms.Label();
+ this.nmResinTrapRequiredBlackPixelsToDrain = new System.Windows.Forms.NumericUpDown();
+ this.label12 = new System.Windows.Forms.Label();
+ this.nmResinTrapRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.label11 = new System.Windows.Forms.Label();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.label10 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelBrightnessToSupport = new System.Windows.Forms.NumericUpDown();
+ this.label9 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelsToSupport = new System.Windows.Forms.NumericUpDown();
+ this.nmIslandRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelBrightnessToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.cbAutoComputeIssuesClickOnTab = new System.Windows.Forms.CheckBox();
+ this.nmResinTrapBinaryThreshold = new System.Windows.Forms.NumericUpDown();
+ this.label20 = new System.Windows.Forms.Label();
+ this.nmIslandBinaryThreshold = new System.Windows.Forms.NumericUpDown();
+ this.label21 = new System.Windows.Forms.Label();
+ this.groupGeneral.SuspendLayout();
+ this.groupLayerPreview.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).BeginInit();
+ this.gbIssues.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).BeginInit();
+ this.groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(7, 30);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(202, 18);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Previous and next layer color:";
+ //
+ // btnPreviousNextLayerColor
+ //
+ this.btnPreviousNextLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnPreviousNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnPreviousNextLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnPreviousNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnPreviousNextLayerColor.Location = new System.Drawing.Point(217, 23);
+ this.btnPreviousNextLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnPreviousNextLayerColor.Name = "btnPreviousNextLayerColor";
+ this.btnPreviousNextLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnPreviousNextLayerColor.TabIndex = 1;
+ this.btnPreviousNextLayerColor.UseVisualStyleBackColor = false;
+ this.btnPreviousNextLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // colorDialog
+ //
+ this.colorDialog.AnyColor = true;
+ this.colorDialog.FullOpen = true;
+ //
+ // btnPreviousLayerColor
+ //
+ this.btnPreviousLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnPreviousLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnPreviousLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnPreviousLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnPreviousLayerColor.Location = new System.Drawing.Point(217, 63);
+ this.btnPreviousLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnPreviousLayerColor.Name = "btnPreviousLayerColor";
+ this.btnPreviousLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnPreviousLayerColor.TabIndex = 3;
+ this.btnPreviousLayerColor.UseVisualStyleBackColor = false;
+ this.btnPreviousLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(7, 70);
+ this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(139, 18);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "Previous layer color";
+ //
+ // btnNextLayerColor
+ //
+ this.btnNextLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnNextLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnNextLayerColor.Location = new System.Drawing.Point(217, 103);
+ this.btnNextLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnNextLayerColor.Name = "btnNextLayerColor";
+ this.btnNextLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnNextLayerColor.TabIndex = 5;
+ this.btnNextLayerColor.UseVisualStyleBackColor = false;
+ this.btnNextLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(7, 110);
+ this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(111, 18);
+ this.label3.TabIndex = 4;
+ this.label3.Text = "Next layer color";
+ //
+ // btnTouchingBoundsColor
+ //
+ this.btnTouchingBoundsColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnTouchingBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnTouchingBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnTouchingBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnTouchingBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnTouchingBoundsColor.Location = new System.Drawing.Point(566, 103);
+ this.btnTouchingBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnTouchingBoundsColor.Name = "btnTouchingBoundsColor";
+ this.btnTouchingBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnTouchingBoundsColor.TabIndex = 7;
+ this.btnTouchingBoundsColor.UseVisualStyleBackColor = false;
+ this.btnTouchingBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label4
+ //
+ this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(402, 30);
+ this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(88, 18);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "Island color:";
+ //
+ // label5
+ //
+ this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(402, 70);
+ this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(117, 18);
+ this.label5.TabIndex = 8;
+ this.label5.Text = "Resin trap color:";
+ //
+ // label6
+ //
+ this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(402, 110);
+ this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(156, 18);
+ this.label6.TabIndex = 9;
+ this.label6.Text = "Touching bound color:";
+ //
+ // btnResinTrapColor
+ //
+ this.btnResinTrapColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnResinTrapColor.BackColor = System.Drawing.Color.White;
+ this.btnResinTrapColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnResinTrapColor.FlatAppearance.BorderSize = 2;
+ this.btnResinTrapColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnResinTrapColor.Location = new System.Drawing.Point(566, 63);
+ this.btnResinTrapColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnResinTrapColor.Name = "btnResinTrapColor";
+ this.btnResinTrapColor.Size = new System.Drawing.Size(32, 32);
+ this.btnResinTrapColor.TabIndex = 10;
+ this.btnResinTrapColor.UseVisualStyleBackColor = false;
+ this.btnResinTrapColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnIslandColor
+ //
+ this.btnIslandColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnIslandColor.BackColor = System.Drawing.Color.White;
+ this.btnIslandColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnIslandColor.FlatAppearance.BorderSize = 2;
+ this.btnIslandColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnIslandColor.Location = new System.Drawing.Point(566, 23);
+ this.btnIslandColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnIslandColor.Name = "btnIslandColor";
+ this.btnIslandColor.Size = new System.Drawing.Size(32, 32);
+ this.btnIslandColor.TabIndex = 11;
+ this.btnIslandColor.UseVisualStyleBackColor = false;
+ this.btnIslandColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnSave
+ //
+ this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSave.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnSave.Location = new System.Drawing.Point(290, 891);
+ this.btnSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Size = new System.Drawing.Size(150, 48);
+ this.btnSave.TabIndex = 12;
+ this.btnSave.Text = "&Save";
+ this.btnSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnSave.UseVisualStyleBackColor = true;
+ this.btnSave.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(448, 891);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 13;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ //
+ // groupGeneral
+ //
+ this.groupGeneral.Controls.Add(this.cbCheckForUpdatesOnStartup);
+ this.groupGeneral.Controls.Add(this.cbStartMaximized);
+ this.groupGeneral.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupGeneral.Location = new System.Drawing.Point(0, 0);
+ this.groupGeneral.Name = "groupGeneral";
+ this.groupGeneral.Size = new System.Drawing.Size(611, 88);
+ this.groupGeneral.TabIndex = 14;
+ this.groupGeneral.TabStop = false;
+ this.groupGeneral.Text = "General";
+ //
+ // cbCheckForUpdatesOnStartup
+ //
+ this.cbCheckForUpdatesOnStartup.AutoSize = true;
+ this.cbCheckForUpdatesOnStartup.Location = new System.Drawing.Point(6, 51);
+ this.cbCheckForUpdatesOnStartup.Name = "cbCheckForUpdatesOnStartup";
+ this.cbCheckForUpdatesOnStartup.Size = new System.Drawing.Size(218, 22);
+ this.cbCheckForUpdatesOnStartup.TabIndex = 7;
+ this.cbCheckForUpdatesOnStartup.Text = "Check for updates on startup";
+ this.cbCheckForUpdatesOnStartup.UseVisualStyleBackColor = true;
+ //
+ // cbStartMaximized
+ //
+ this.cbStartMaximized.AutoSize = true;
+ this.cbStartMaximized.Location = new System.Drawing.Point(6, 23);
+ this.cbStartMaximized.Name = "cbStartMaximized";
+ this.cbStartMaximized.Size = new System.Drawing.Size(133, 22);
+ this.cbStartMaximized.TabIndex = 6;
+ this.cbStartMaximized.Text = "Start maximized";
+ this.cbStartMaximized.UseVisualStyleBackColor = true;
+ //
+ // groupLayerPreview
+ //
+ this.groupLayerPreview.Controls.Add(this.cbZoomToFitPrintVolumeBounds);
+ this.groupLayerPreview.Controls.Add(this.cbOutlineHollowAreas);
+ this.groupLayerPreview.Controls.Add(this.label18);
+ this.groupLayerPreview.Controls.Add(this.nmOutlineHollowAreasLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label19);
+ this.groupLayerPreview.Controls.Add(this.btnOutlineHollowAreasColor);
+ this.groupLayerPreview.Controls.Add(this.cbOutlineLayerBounds);
+ this.groupLayerPreview.Controls.Add(this.label16);
+ this.groupLayerPreview.Controls.Add(this.nmOutlineLayerBoundsLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label17);
+ this.groupLayerPreview.Controls.Add(this.btnOutlineLayerBoundsColor);
+ this.groupLayerPreview.Controls.Add(this.cbOutlinePrintVolumeBounds);
+ this.groupLayerPreview.Controls.Add(this.label15);
+ this.groupLayerPreview.Controls.Add(this.nmOutlinePrintVolumeBoundsLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label14);
+ this.groupLayerPreview.Controls.Add(this.btnOutlinePrintVolumeBoundsColor);
+ this.groupLayerPreview.Controls.Add(this.cbLayerZoomToFit);
+ this.groupLayerPreview.Controls.Add(this.cbLayerDifferenceDefault);
+ this.groupLayerPreview.Controls.Add(this.cbLayerAutoRotateBestView);
+ this.groupLayerPreview.Controls.Add(this.label1);
+ this.groupLayerPreview.Controls.Add(this.btnPreviousNextLayerColor);
+ this.groupLayerPreview.Controls.Add(this.label2);
+ this.groupLayerPreview.Controls.Add(this.btnPreviousLayerColor);
+ this.groupLayerPreview.Controls.Add(this.btnIslandColor);
+ this.groupLayerPreview.Controls.Add(this.label3);
+ this.groupLayerPreview.Controls.Add(this.btnResinTrapColor);
+ this.groupLayerPreview.Controls.Add(this.btnNextLayerColor);
+ this.groupLayerPreview.Controls.Add(this.label6);
+ this.groupLayerPreview.Controls.Add(this.label4);
+ this.groupLayerPreview.Controls.Add(this.label5);
+ this.groupLayerPreview.Controls.Add(this.btnTouchingBoundsColor);
+ this.groupLayerPreview.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupLayerPreview.Location = new System.Drawing.Point(0, 88);
+ this.groupLayerPreview.Name = "groupLayerPreview";
+ this.groupLayerPreview.Size = new System.Drawing.Size(611, 348);
+ this.groupLayerPreview.TabIndex = 15;
+ this.groupLayerPreview.TabStop = false;
+ this.groupLayerPreview.Text = "Layer Preview";
+ //
+ // cbZoomToFitPrintVolumeBounds
+ //
+ this.cbZoomToFitPrintVolumeBounds.AutoSize = true;
+ this.cbZoomToFitPrintVolumeBounds.Location = new System.Drawing.Point(325, 292);
+ this.cbZoomToFitPrintVolumeBounds.Name = "cbZoomToFitPrintVolumeBounds";
+ this.cbZoomToFitPrintVolumeBounds.Size = new System.Drawing.Size(276, 22);
+ this.cbZoomToFitPrintVolumeBounds.TabIndex = 34;
+ this.cbZoomToFitPrintVolumeBounds.Text = "Zoom to print volume bounds instead ";
+ this.cbZoomToFitPrintVolumeBounds.UseVisualStyleBackColor = true;
+ //
+ // cbOutlineHollowAreas
+ //
+ this.cbOutlineHollowAreas.AutoSize = true;
+ this.cbOutlineHollowAreas.Location = new System.Drawing.Point(470, 228);
+ this.cbOutlineHollowAreas.Name = "cbOutlineHollowAreas";
+ this.cbOutlineHollowAreas.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlineHollowAreas.TabIndex = 33;
+ this.cbOutlineHollowAreas.Text = "Show by default";
+ this.cbOutlineHollowAreas.UseVisualStyleBackColor = true;
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Location = new System.Drawing.Point(319, 230);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(150, 18);
+ this.label18.TabIndex = 32;
+ this.label18.Text = "Line thickness (-1-50)";
+ //
+ // nmOutlineHollowAreasLineThickness
+ //
+ this.nmOutlineHollowAreasLineThickness.Location = new System.Drawing.Point(256, 227);
+ this.nmOutlineHollowAreasLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineHollowAreasLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ -2147483648});
+ this.nmOutlineHollowAreasLineThickness.Name = "nmOutlineHollowAreasLineThickness";
+ this.nmOutlineHollowAreasLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlineHollowAreasLineThickness.TabIndex = 31;
+ this.nmOutlineHollowAreasLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.Location = new System.Drawing.Point(7, 230);
+ this.label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(183, 18);
+ this.label19.TabIndex = 29;
+ this.label19.Text = "Outline Hollow areas color";
+ //
+ // btnOutlineHollowAreasColor
+ //
+ this.btnOutlineHollowAreasColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlineHollowAreasColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlineHollowAreasColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlineHollowAreasColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlineHollowAreasColor.Location = new System.Drawing.Point(217, 223);
+ this.btnOutlineHollowAreasColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlineHollowAreasColor.Name = "btnOutlineHollowAreasColor";
+ this.btnOutlineHollowAreasColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlineHollowAreasColor.TabIndex = 30;
+ this.btnOutlineHollowAreasColor.UseVisualStyleBackColor = false;
+ this.btnOutlineHollowAreasColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbOutlineLayerBounds
+ //
+ this.cbOutlineLayerBounds.AutoSize = true;
+ this.cbOutlineLayerBounds.Location = new System.Drawing.Point(470, 188);
+ this.cbOutlineLayerBounds.Name = "cbOutlineLayerBounds";
+ this.cbOutlineLayerBounds.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlineLayerBounds.TabIndex = 28;
+ this.cbOutlineLayerBounds.Text = "Show by default";
+ this.cbOutlineLayerBounds.UseVisualStyleBackColor = true;
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Location = new System.Drawing.Point(319, 190);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(145, 18);
+ this.label16.TabIndex = 27;
+ this.label16.Text = "Line thickness (1-50)";
+ //
+ // nmOutlineLayerBoundsLineThickness
+ //
+ this.nmOutlineLayerBoundsLineThickness.Location = new System.Drawing.Point(256, 187);
+ this.nmOutlineLayerBoundsLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineLayerBoundsLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineLayerBoundsLineThickness.Name = "nmOutlineLayerBoundsLineThickness";
+ this.nmOutlineLayerBoundsLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlineLayerBoundsLineThickness.TabIndex = 26;
+ this.nmOutlineLayerBoundsLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Location = new System.Drawing.Point(7, 190);
+ this.label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(185, 18);
+ this.label17.TabIndex = 24;
+ this.label17.Text = "Outline Layer bounds color";
+ //
+ // btnOutlineLayerBoundsColor
+ //
+ this.btnOutlineLayerBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlineLayerBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlineLayerBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlineLayerBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlineLayerBoundsColor.Location = new System.Drawing.Point(217, 183);
+ this.btnOutlineLayerBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlineLayerBoundsColor.Name = "btnOutlineLayerBoundsColor";
+ this.btnOutlineLayerBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlineLayerBoundsColor.TabIndex = 25;
+ this.btnOutlineLayerBoundsColor.UseVisualStyleBackColor = false;
+ this.btnOutlineLayerBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbOutlinePrintVolumeBounds
+ //
+ this.cbOutlinePrintVolumeBounds.AutoSize = true;
+ this.cbOutlinePrintVolumeBounds.Location = new System.Drawing.Point(470, 148);
+ this.cbOutlinePrintVolumeBounds.Name = "cbOutlinePrintVolumeBounds";
+ this.cbOutlinePrintVolumeBounds.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlinePrintVolumeBounds.TabIndex = 23;
+ this.cbOutlinePrintVolumeBounds.Text = "Show by default";
+ this.cbOutlinePrintVolumeBounds.UseVisualStyleBackColor = true;
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(319, 150);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(145, 18);
+ this.label15.TabIndex = 22;
+ this.label15.Text = "Line thickness (1-50)";
+ //
+ // nmOutlinePrintVolumeBoundsLineThickness
+ //
+ this.nmOutlinePrintVolumeBoundsLineThickness.Location = new System.Drawing.Point(256, 147);
+ this.nmOutlinePrintVolumeBoundsLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlinePrintVolumeBoundsLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmOutlinePrintVolumeBoundsLineThickness.Name = "nmOutlinePrintVolumeBoundsLineThickness";
+ this.nmOutlinePrintVolumeBoundsLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlinePrintVolumeBoundsLineThickness.TabIndex = 19;
+ this.nmOutlinePrintVolumeBoundsLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label14
+ //
+ this.label14.AutoSize = true;
+ this.label14.Location = new System.Drawing.Point(7, 150);
+ this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(181, 18);
+ this.label14.TabIndex = 16;
+ this.label14.Text = "Print volume bounds color";
+ //
+ // btnOutlinePrintVolumeBoundsColor
+ //
+ this.btnOutlinePrintVolumeBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlinePrintVolumeBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlinePrintVolumeBoundsColor.Location = new System.Drawing.Point(217, 143);
+ this.btnOutlinePrintVolumeBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlinePrintVolumeBoundsColor.Name = "btnOutlinePrintVolumeBoundsColor";
+ this.btnOutlinePrintVolumeBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlinePrintVolumeBoundsColor.TabIndex = 17;
+ this.btnOutlinePrintVolumeBoundsColor.UseVisualStyleBackColor = false;
+ this.btnOutlinePrintVolumeBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbLayerZoomToFit
+ //
+ this.cbLayerZoomToFit.AutoSize = true;
+ this.cbLayerZoomToFit.Location = new System.Drawing.Point(9, 292);
+ this.cbLayerZoomToFit.Name = "cbLayerZoomToFit";
+ this.cbLayerZoomToFit.Size = new System.Drawing.Size(313, 22);
+ this.cbLayerZoomToFit.TabIndex = 15;
+ this.cbLayerZoomToFit.Text = "Zoom to fit layer on load and window resize";
+ this.cbLayerZoomToFit.UseVisualStyleBackColor = true;
+ //
+ // cbLayerDifferenceDefault
+ //
+ this.cbLayerDifferenceDefault.AutoSize = true;
+ this.cbLayerDifferenceDefault.Location = new System.Drawing.Point(9, 320);
+ this.cbLayerDifferenceDefault.Name = "cbLayerDifferenceDefault";
+ this.cbLayerDifferenceDefault.Size = new System.Drawing.Size(234, 22);
+ this.cbLayerDifferenceDefault.TabIndex = 13;
+ this.cbLayerDifferenceDefault.Text = "Show layer difference by default";
+ this.cbLayerDifferenceDefault.UseVisualStyleBackColor = true;
+ //
+ // cbLayerAutoRotateBestView
+ //
+ this.cbLayerAutoRotateBestView.AutoSize = true;
+ this.cbLayerAutoRotateBestView.Location = new System.Drawing.Point(9, 264);
+ this.cbLayerAutoRotateBestView.Name = "cbLayerAutoRotateBestView";
+ this.cbLayerAutoRotateBestView.Size = new System.Drawing.Size(327, 22);
+ this.cbLayerAutoRotateBestView.TabIndex = 12;
+ this.cbLayerAutoRotateBestView.Text = "Auto rotate layer to best fit window on file load";
+ this.cbLayerAutoRotateBestView.UseVisualStyleBackColor = true;
+ //
+ // cbComputeIssuesOnLoad
+ //
+ this.cbComputeIssuesOnLoad.AutoSize = true;
+ this.cbComputeIssuesOnLoad.Location = new System.Drawing.Point(6, 23);
+ this.cbComputeIssuesOnLoad.Name = "cbComputeIssuesOnLoad";
+ this.cbComputeIssuesOnLoad.Size = new System.Drawing.Size(210, 22);
+ this.cbComputeIssuesOnLoad.TabIndex = 14;
+ this.cbComputeIssuesOnLoad.Text = "Compute issues on file load";
+ this.cbComputeIssuesOnLoad.UseVisualStyleBackColor = true;
+ //
+ // btnReset
+ //
+ this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnReset.Image = global::UVtools.GUI.Properties.Resources.Rotate_16x16;
+ this.btnReset.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnReset.Location = new System.Drawing.Point(13, 891);
+ this.btnReset.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnReset.Name = "btnReset";
+ this.btnReset.Size = new System.Drawing.Size(158, 48);
+ this.btnReset.TabIndex = 16;
+ this.btnReset.Text = "&Reset to defaults";
+ this.btnReset.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnReset.UseVisualStyleBackColor = true;
+ this.btnReset.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbComputeIslands
+ //
+ this.cbComputeIslands.AutoSize = true;
+ this.cbComputeIslands.Location = new System.Drawing.Point(244, 23);
+ this.cbComputeIslands.Name = "cbComputeIslands";
+ this.cbComputeIslands.Size = new System.Drawing.Size(138, 22);
+ this.cbComputeIslands.TabIndex = 16;
+ this.cbComputeIslands.Text = "Compute Islands";
+ this.cbComputeIslands.UseVisualStyleBackColor = true;
+ //
+ // cbComputeResinTraps
+ //
+ this.cbComputeResinTraps.AutoSize = true;
+ this.cbComputeResinTraps.Location = new System.Drawing.Point(411, 23);
+ this.cbComputeResinTraps.Name = "cbComputeResinTraps";
+ this.cbComputeResinTraps.Size = new System.Drawing.Size(172, 22);
+ this.cbComputeResinTraps.TabIndex = 17;
+ this.cbComputeResinTraps.Text = "Compute Resin Traps";
+ this.cbComputeResinTraps.UseVisualStyleBackColor = true;
+ //
+ // gbIssues
+ //
+ this.gbIssues.Controls.Add(this.groupBox3);
+ this.gbIssues.Controls.Add(this.groupBox2);
+ this.gbIssues.Controls.Add(this.groupBox1);
+ this.gbIssues.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbIssues.Location = new System.Drawing.Point(0, 436);
+ this.gbIssues.Name = "gbIssues";
+ this.gbIssues.Size = new System.Drawing.Size(611, 442);
+ this.gbIssues.TabIndex = 17;
+ this.gbIssues.TabStop = false;
+ this.gbIssues.Text = "Issues";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.nmResinTrapBinaryThreshold);
+ this.groupBox3.Controls.Add(this.label20);
+ this.groupBox3.Controls.Add(this.nmResinTrapMaximumPixelBrightnessToDrain);
+ this.groupBox3.Controls.Add(this.label13);
+ this.groupBox3.Controls.Add(this.nmResinTrapRequiredBlackPixelsToDrain);
+ this.groupBox3.Controls.Add(this.label12);
+ this.groupBox3.Controls.Add(this.nmResinTrapRequiredAreaToProcessCheck);
+ this.groupBox3.Controls.Add(this.label11);
+ this.groupBox3.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox3.Location = new System.Drawing.Point(3, 279);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(605, 152);
+ this.groupBox3.TabIndex = 24;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Resin Traps";
+ //
+ // nmResinTrapMaximumPixelBrightnessToDrain
+ //
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Location = new System.Drawing.Point(10, 113);
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Maximum = new decimal(new int[] {
+ 150,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Name = "nmResinTrapMaximumPixelBrightnessToDrain";
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapMaximumPixelBrightnessToDrain.TabIndex = 24;
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(73, 116);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(347, 18);
+ this.label13.TabIndex = 25;
+ this.label13.Text = "Maximum pixel brightness to be a drain pixel (0-150)";
+ //
+ // nmResinTrapRequiredBlackPixelsToDrain
+ //
+ this.nmResinTrapRequiredBlackPixelsToDrain.Location = new System.Drawing.Point(10, 83);
+ this.nmResinTrapRequiredBlackPixelsToDrain.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredBlackPixelsToDrain.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredBlackPixelsToDrain.Name = "nmResinTrapRequiredBlackPixelsToDrain";
+ this.nmResinTrapRequiredBlackPixelsToDrain.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapRequiredBlackPixelsToDrain.TabIndex = 22;
+ this.nmResinTrapRequiredBlackPixelsToDrain.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(73, 86);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(441, 18);
+ this.label12.TabIndex = 23;
+ this.label12.Text = "Number of drain pixels required to promote area as a drain (1-255)";
+ //
+ // nmResinTrapRequiredAreaToProcessCheck
+ //
+ this.nmResinTrapRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53);
+ this.nmResinTrapRequiredAreaToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredAreaToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredAreaToProcessCheck.Name = "nmResinTrapRequiredAreaToProcessCheck";
+ this.nmResinTrapRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapRequiredAreaToProcessCheck.TabIndex = 20;
+ this.nmResinTrapRequiredAreaToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(73, 56);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(504, 18);
+ this.label11.TabIndex = 21;
+ this.label11.Text = "Required pixel bound area (x*y) to process and consider a resin trap (1-255)";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.nmIslandBinaryThreshold);
+ this.groupBox2.Controls.Add(this.label21);
+ this.groupBox2.Controls.Add(this.label10);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToSupport);
+ this.groupBox2.Controls.Add(this.label9);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelsToSupport);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredAreaToProcessCheck);
+ this.groupBox2.Controls.Add(this.label7);
+ this.groupBox2.Controls.Add(this.label8);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToProcessCheck);
+ this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox2.Location = new System.Drawing.Point(3, 103);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(605, 176);
+ this.groupBox2.TabIndex = 23;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Islands";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(73, 146);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(507, 18);
+ this.label10.TabIndex = 25;
+ this.label10.Text = "Minimum pixel brightness bellow island to consider it as a safe pixel (50-255)";
+ //
+ // nmIslandRequiredPixelBrightnessToSupport
+ //
+ this.nmIslandRequiredPixelBrightnessToSupport.Location = new System.Drawing.Point(10, 143);
+ this.nmIslandRequiredPixelBrightnessToSupport.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToSupport.Minimum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToSupport.Name = "nmIslandRequiredPixelBrightnessToSupport";
+ this.nmIslandRequiredPixelBrightnessToSupport.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelBrightnessToSupport.TabIndex = 24;
+ this.nmIslandRequiredPixelBrightnessToSupport.Value = new decimal(new int[] {
+ 150,
+ 0,
+ 0,
+ 0});
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(73, 116);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(385, 18);
+ this.label9.TabIndex = 23;
+ this.label9.Text = "Required safe pixels bellow the island to demote it (1-255)";
+ //
+ // nmIslandRequiredPixelsToSupport
+ //
+ this.nmIslandRequiredPixelsToSupport.Location = new System.Drawing.Point(10, 113);
+ this.nmIslandRequiredPixelsToSupport.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelsToSupport.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelsToSupport.Name = "nmIslandRequiredPixelsToSupport";
+ this.nmIslandRequiredPixelsToSupport.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelsToSupport.TabIndex = 22;
+ this.nmIslandRequiredPixelsToSupport.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // nmIslandRequiredAreaToProcessCheck
+ //
+ this.nmIslandRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53);
+ this.nmIslandRequiredAreaToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredAreaToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredAreaToProcessCheck.Name = "nmIslandRequiredAreaToProcessCheck";
+ this.nmIslandRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredAreaToProcessCheck.TabIndex = 18;
+ this.nmIslandRequiredAreaToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(73, 56);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(481, 18);
+ this.label7.TabIndex = 19;
+ this.label7.Text = "Required pixel bound area (x*y) to process and consider a island (1-255)";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(73, 86);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(439, 18);
+ this.label8.TabIndex = 21;
+ this.label8.Text = "Minimum pixel brightness to consider that pixel on a island (1-255)";
+ //
+ // nmIslandRequiredPixelBrightnessToProcessCheck
+ //
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Location = new System.Drawing.Point(10, 83);
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Name = "nmIslandRequiredPixelBrightnessToProcessCheck";
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.TabIndex = 20;
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.cbAutoComputeIssuesClickOnTab);
+ this.groupBox1.Controls.Add(this.cbComputeIssuesOnLoad);
+ this.groupBox1.Controls.Add(this.cbComputeIslands);
+ this.groupBox1.Controls.Add(this.cbComputeResinTraps);
+ this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox1.Location = new System.Drawing.Point(3, 20);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(605, 83);
+ this.groupBox1.TabIndex = 22;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Commun";
+ //
+ // cbAutoComputeIssuesClickOnTab
+ //
+ this.cbAutoComputeIssuesClickOnTab.AutoSize = true;
+ this.cbAutoComputeIssuesClickOnTab.Location = new System.Drawing.Point(6, 51);
+ this.cbAutoComputeIssuesClickOnTab.Name = "cbAutoComputeIssuesClickOnTab";
+ this.cbAutoComputeIssuesClickOnTab.Size = new System.Drawing.Size(416, 22);
+ this.cbAutoComputeIssuesClickOnTab.TabIndex = 18;
+ this.cbAutoComputeIssuesClickOnTab.Text = "Auto compute issues when click Issues tab for the first time";
+ this.cbAutoComputeIssuesClickOnTab.UseVisualStyleBackColor = true;
+ //
+ // nmResinTrapBinaryThreshold
+ //
+ this.nmResinTrapBinaryThreshold.Location = new System.Drawing.Point(10, 23);
+ this.nmResinTrapBinaryThreshold.Maximum = new decimal(new int[] {
+ 254,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapBinaryThreshold.Name = "nmResinTrapBinaryThreshold";
+ this.nmResinTrapBinaryThreshold.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapBinaryThreshold.TabIndex = 26;
+ this.nmResinTrapBinaryThreshold.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.Location = new System.Drawing.Point(73, 26);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(512, 18);
+ this.label20.TabIndex = 27;
+ this.label20.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" +
+ "";
+ //
+ // nmIslandBinaryThreshold
+ //
+ this.nmIslandBinaryThreshold.Location = new System.Drawing.Point(10, 23);
+ this.nmIslandBinaryThreshold.Maximum = new decimal(new int[] {
+ 254,
+ 0,
+ 0,
+ 0});
+ this.nmIslandBinaryThreshold.Name = "nmIslandBinaryThreshold";
+ this.nmIslandBinaryThreshold.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandBinaryThreshold.TabIndex = 28;
+ this.nmIslandBinaryThreshold.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label21
+ //
+ this.label21.AutoSize = true;
+ this.label21.Location = new System.Drawing.Point(73, 26);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(512, 18);
+ this.label21.TabIndex = 29;
+ this.label21.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" +
+ "";
+ //
+ // FrmSettings
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(611, 953);
+ this.Controls.Add(this.gbIssues);
+ this.Controls.Add(this.btnReset);
+ this.Controls.Add(this.groupLayerPreview);
+ this.Controls.Add(this.groupGeneral);
+ this.Controls.Add(this.btnSave);
+ this.Controls.Add(this.btnCancel);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmSettings";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Settings";
+ this.groupGeneral.ResumeLayout(false);
+ this.groupGeneral.PerformLayout();
+ this.groupLayerPreview.ResumeLayout(false);
+ this.groupLayerPreview.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).EndInit();
+ this.gbIssues.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox3.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).EndInit();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button btnPreviousNextLayerColor;
+ private System.Windows.Forms.ColorDialog colorDialog;
+ private System.Windows.Forms.Button btnPreviousLayerColor;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button btnNextLayerColor;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button btnTouchingBoundsColor;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Button btnResinTrapColor;
+ private System.Windows.Forms.Button btnIslandColor;
+ private System.Windows.Forms.Button btnSave;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.GroupBox groupGeneral;
+ private System.Windows.Forms.CheckBox cbStartMaximized;
+ private System.Windows.Forms.CheckBox cbCheckForUpdatesOnStartup;
+ private System.Windows.Forms.GroupBox groupLayerPreview;
+ private System.Windows.Forms.CheckBox cbLayerAutoRotateBestView;
+ private System.Windows.Forms.Button btnReset;
+ private System.Windows.Forms.CheckBox cbLayerDifferenceDefault;
+ private System.Windows.Forms.CheckBox cbComputeIssuesOnLoad;
+ private System.Windows.Forms.CheckBox cbLayerZoomToFit;
+ private System.Windows.Forms.CheckBox cbComputeResinTraps;
+ private System.Windows.Forms.CheckBox cbComputeIslands;
+ private System.Windows.Forms.GroupBox gbIssues;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredAreaToProcessCheck;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToProcessCheck;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelsToSupport;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToSupport;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.NumericUpDown nmResinTrapRequiredAreaToProcessCheck;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.NumericUpDown nmResinTrapRequiredBlackPixelsToDrain;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.NumericUpDown nmResinTrapMaximumPixelBrightnessToDrain;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.CheckBox cbAutoComputeIssuesClickOnTab;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Button btnOutlinePrintVolumeBoundsColor;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.NumericUpDown nmOutlinePrintVolumeBoundsLineThickness;
+ private System.Windows.Forms.CheckBox cbOutlinePrintVolumeBounds;
+ private System.Windows.Forms.CheckBox cbOutlineLayerBounds;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.NumericUpDown nmOutlineLayerBoundsLineThickness;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Button btnOutlineLayerBoundsColor;
+ private System.Windows.Forms.CheckBox cbOutlineHollowAreas;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.NumericUpDown nmOutlineHollowAreasLineThickness;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Button btnOutlineHollowAreasColor;
+ private System.Windows.Forms.CheckBox cbZoomToFitPrintVolumeBounds;
+ private System.Windows.Forms.NumericUpDown nmResinTrapBinaryThreshold;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.NumericUpDown nmIslandBinaryThreshold;
+ private System.Windows.Forms.Label label21;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmSettings.cs b/UVtools.GUI/Forms/FrmSettings.cs
new file mode 100644
index 0000000..222b564
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.cs
@@ -0,0 +1,157 @@
+using System;
+using System.Windows.Forms;
+using UVtools.GUI.Properties;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmSettings : Form
+ {
+ public FrmSettings()
+ {
+ InitializeComponent();
+ Init();
+ }
+
+ public void Init()
+ {
+ try
+ {
+ cbCheckForUpdatesOnStartup.Checked = Settings.Default.CheckForUpdatesOnStartup;
+ cbStartMaximized.Checked = Settings.Default.StartMaximized;
+
+ btnPreviousNextLayerColor.BackColor = Settings.Default.PreviousNextLayerColor;
+ btnPreviousLayerColor.BackColor = Settings.Default.PreviousLayerColor;
+ btnNextLayerColor.BackColor = Settings.Default.NextLayerColor;
+ btnIslandColor.BackColor = Settings.Default.IslandColor;
+ btnResinTrapColor.BackColor = Settings.Default.ResinTrapColor;
+ btnTouchingBoundsColor.BackColor = Settings.Default.TouchingBoundsColor;
+
+ btnOutlinePrintVolumeBoundsColor.BackColor = Settings.Default.OutlinePrintVolumeBoundsColor;
+ btnOutlineLayerBoundsColor.BackColor = Settings.Default.OutlineLayerBoundsColor;
+ btnOutlineHollowAreasColor.BackColor = Settings.Default.OutlineHollowAreasColor;
+
+ nmOutlinePrintVolumeBoundsLineThickness.Value = Settings.Default.OutlinePrintVolumeBoundsLineThickness;
+ nmOutlineLayerBoundsLineThickness.Value = Settings.Default.OutlineLayerBoundsLineThickness;
+ nmOutlineHollowAreasLineThickness.Value = Settings.Default.OutlineHollowAreasLineThickness;
+
+ cbOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds;
+ cbOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds;
+ cbOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
+
+ cbLayerAutoRotateBestView.Checked = Settings.Default.LayerAutoRotateBestView;
+ cbLayerZoomToFit.Checked = Settings.Default.LayerZoomToFit;
+ cbZoomToFitPrintVolumeBounds.Checked = Settings.Default.ZoomToFitPrintVolumeBounds;
+ cbLayerDifferenceDefault.Checked = Settings.Default.LayerDifferenceDefault;
+ cbComputeIssuesOnLoad.Checked = Settings.Default.ComputeIssuesOnLoad;
+ cbComputeIslands.Checked = Settings.Default.ComputeIslands;
+ cbComputeResinTraps.Checked = Settings.Default.ComputeResinTraps;
+ cbAutoComputeIssuesClickOnTab.Checked = Settings.Default.AutoComputeIssuesClickOnTab;
+
+ nmIslandBinaryThreshold.Value = Settings.Default.IslandBinaryThreshold;
+ nmIslandRequiredAreaToProcessCheck.Value = Settings.Default.IslandRequiredAreaToProcessCheck;
+ nmIslandRequiredPixelBrightnessToProcessCheck.Value = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck;
+ nmIslandRequiredPixelsToSupport.Value = Settings.Default.IslandRequiredPixelsToSupport;
+ nmIslandRequiredPixelBrightnessToSupport.Value = Settings.Default.IslandRequiredPixelBrightnessToSupport;
+
+ nmResinTrapBinaryThreshold.Value = Settings.Default.ResinTrapBinaryThreshold;
+ nmResinTrapRequiredAreaToProcessCheck.Value = Settings.Default.ResinTrapRequiredAreaToProcessCheck;
+ nmResinTrapRequiredBlackPixelsToDrain.Value = Settings.Default.ResinTrapRequiredBlackPixelsToDrain;
+ nmResinTrapMaximumPixelBrightnessToDrain.Value = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Unable to use current settings, a reset will be performed.\n{ex.Message}",
+ "Unable to use current settings", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ Settings.Default.Reset();
+ Settings.Default.Save();
+ Init();
+ }
+ }
+
+ private void EventClick(object sender, EventArgs e)
+ {
+ if (
+ ReferenceEquals(sender, btnPreviousNextLayerColor) ||
+ ReferenceEquals(sender, btnPreviousLayerColor) ||
+ ReferenceEquals(sender, btnNextLayerColor) ||
+ ReferenceEquals(sender, btnIslandColor) ||
+ ReferenceEquals(sender, btnResinTrapColor) ||
+ ReferenceEquals(sender, btnTouchingBoundsColor) ||
+ ReferenceEquals(sender, btnOutlinePrintVolumeBoundsColor) ||
+ ReferenceEquals(sender, btnOutlineLayerBoundsColor) ||
+ ReferenceEquals(sender, btnOutlineHollowAreasColor)
+ )
+ {
+ Button btn = sender as Button;
+ colorDialog.Color = btn.BackColor;
+ if (colorDialog.ShowDialog() != DialogResult.OK) return;
+
+ btn.BackColor = colorDialog.Color;
+
+ return;
+
+ }
+
+ if (ReferenceEquals(sender, btnReset))
+ {
+ if (MessageBox.Show("Are you sure you want to reset the settings to the default values?",
+ "Reset settings?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) !=
+ DialogResult.Yes) return;
+
+ Settings.Default.Reset();
+ Init();
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnSave))
+ {
+ Settings.Default.CheckForUpdatesOnStartup = cbCheckForUpdatesOnStartup.Checked;
+ Settings.Default.StartMaximized = cbStartMaximized.Checked;
+
+ Settings.Default.PreviousNextLayerColor = btnPreviousNextLayerColor.BackColor;
+ Settings.Default.PreviousLayerColor = btnPreviousLayerColor.BackColor;
+ Settings.Default.NextLayerColor = btnNextLayerColor.BackColor;
+ Settings.Default.IslandColor = btnIslandColor.BackColor;
+ Settings.Default.ResinTrapColor = btnResinTrapColor.BackColor;
+ Settings.Default.TouchingBoundsColor = btnTouchingBoundsColor.BackColor;
+
+ Settings.Default.OutlinePrintVolumeBoundsColor = btnOutlinePrintVolumeBoundsColor.BackColor;
+ Settings.Default.OutlineLayerBoundsColor = btnOutlineLayerBoundsColor.BackColor;
+ Settings.Default.OutlineHollowAreasColor = btnOutlineHollowAreasColor.BackColor;
+
+ Settings.Default.OutlinePrintVolumeBoundsLineThickness = (byte) nmOutlinePrintVolumeBoundsLineThickness.Value;
+ Settings.Default.OutlineLayerBoundsLineThickness = (byte) nmOutlineLayerBoundsLineThickness.Value;
+ Settings.Default.OutlineHollowAreasLineThickness = (sbyte) nmOutlineHollowAreasLineThickness.Value;
+
+ Settings.Default.OutlinePrintVolumeBounds = cbOutlinePrintVolumeBounds.Checked;
+ Settings.Default.OutlineLayerBounds = cbOutlineLayerBounds.Checked;
+ Settings.Default.OutlineHollowAreas = cbOutlineHollowAreas.Checked;
+
+ Settings.Default.LayerAutoRotateBestView = cbLayerAutoRotateBestView.Checked;
+ Settings.Default.LayerZoomToFit = cbLayerZoomToFit.Checked;
+ Settings.Default.ZoomToFitPrintVolumeBounds = cbZoomToFitPrintVolumeBounds.Checked;
+ Settings.Default.LayerDifferenceDefault = cbLayerDifferenceDefault.Checked;
+ Settings.Default.ComputeIssuesOnLoad = cbComputeIssuesOnLoad.Checked;
+ Settings.Default.ComputeIslands = cbComputeIslands.Checked;
+ Settings.Default.ComputeResinTraps = cbComputeResinTraps.Checked;
+ Settings.Default.AutoComputeIssuesClickOnTab = cbAutoComputeIssuesClickOnTab.Checked;
+
+ Settings.Default.IslandBinaryThreshold = (byte)nmIslandBinaryThreshold.Value;
+ Settings.Default.IslandRequiredAreaToProcessCheck = (byte) nmIslandRequiredAreaToProcessCheck.Value;
+ Settings.Default.IslandRequiredPixelBrightnessToProcessCheck = (byte)nmIslandRequiredPixelBrightnessToProcessCheck.Value;
+ Settings.Default.IslandRequiredPixelsToSupport = (byte)nmIslandRequiredPixelsToSupport.Value;
+ Settings.Default.IslandRequiredPixelBrightnessToSupport = (byte)nmIslandRequiredPixelBrightnessToSupport.Value;
+
+ Settings.Default.ResinTrapBinaryThreshold = (byte) nmResinTrapBinaryThreshold.Value;
+ Settings.Default.ResinTrapRequiredAreaToProcessCheck = (byte)nmResinTrapRequiredAreaToProcessCheck.Value;
+ Settings.Default.ResinTrapRequiredBlackPixelsToDrain = (byte)nmResinTrapRequiredBlackPixelsToDrain.Value;
+ Settings.Default.ResinTrapMaximumPixelBrightnessToDrain = (byte)nmResinTrapMaximumPixelBrightnessToDrain.Value;
+
+ Settings.Default.Save();
+ DialogResult = DialogResult.OK;
+ return;
+ }
+ }
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmSettings.resx b/UVtools.GUI/Forms/FrmSettings.resx
new file mode 100644
index 0000000..ce1a023
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.resx
@@ -0,0 +1,2204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="colorDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ ////Af///xH///8v////UP///3H///+P////r////8f////c////7P////f////9///////////////9
+ ////9////+z////c////x////6////+P////cf///1D///8v////Ef///wH///8B////Af///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8B////Af///wr///8o////XP///5T////H////6f////b////+/////v////7/////
+ //////////////////////////////////////////////////////////////////////////7////+
+ /////v////b////p////x////5T///9c////KP///wr///8B////Af///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8C////Ef///0z///+W////0v////T////+
+ //////////7/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+//////////7////0
+ ////0v///5b///9M////Ef///wL///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8K
+ ////Uf///6X////o/////v////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v////7////o////pf///1H///8K
+ ////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Af///wP///8x////jf///+f////9/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+/////f///+f///+N////Mf///wP///8B////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9K////uP////T////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7////0////uP///0r///8K////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Af///wj///9V////xv////v////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////+////8b///9V
+ ////CP///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wP///9L////y/////3/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////3////L////S////wP///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///82
+ ////uP////v/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wH///8T////jv////H////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////8f///47///8T
+ ////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8C////Sf///9b////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///9b///9J////Av///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///5b////5////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///zT////R/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////7////R////NP///wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wX///9j////7P//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////s////Y////wX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////6
+ ////jv///wf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Ff///7b////+////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////tv///xX///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yD////F/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xf///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n
+ ////0v////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////0v///yf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Jv///9z////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7////7/P7/6+/9/9jg+//B0fn/
+ pMT4/5m99/+Yu/f/mr33/6XF9//C0vn/2OD7/+zv/f/7/P///v/////////+////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////3P///yb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yf////c
+ /////v//////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////8/P//
+ 4ej8/6vF9/97pfT/UYbw/yxy7v8dZ+3/HGft/xlq7f8ia+3/JWzt/yZs7f8lbO3/Imvt/xpq7f8cZ+3/
+ Hmft/y9z7v9RhvD/eqb0/67H+P/i6fz//P3/////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////3P///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////r7/v/T3/v/i6/1/0iD7/8obe3/I2vt/yJr7f8ka+3/I2vt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/yRr7f8ia+3/I2rt/yhu7f9LhPD/
+ j7D1/9bh+//6+/7/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////0v///yD///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////FP///8X////+
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7///H1/v+owvf/T4fw/yRs7f8ha+3/
+ JGvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNs7f8ia+3/J2zt/1OJ8P+rwvf/8/b+//7/////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xf///xT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///wf///+2/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////H0/f+SsvX/Onfu/yFq7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/yFq7f83eO7/l7b2//L1/f//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////tv///wf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////jv////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////X3/v+ivPb/NHTu/yRr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8la+3/
+ NXbu/6C99//4+f7/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Af///2P////6////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////7+///J2Pr/
+ TYXw/yZr7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/JWvt/1GH8P/N2/r//f7/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////6
+ ////Y////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///80////6///////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////3+P7/i6z1/ylt7f8ka+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/yxu7f+Or/X/9/n+////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////r////NP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///9H/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////4Oj8/1OH8P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9TiPD/
+ 5ev8////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///+W/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////8HT+f83du7/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f86d+7/x9f6////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////7///+W////AgAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////Sf////r/////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7+//+yx/j/K2/t/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJq6v8fY9v/GEyp/xZFmv8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yNr7f8wce7/tcr4//7+////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////r///9J////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////sML3/ypt7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+z/IWfk/xtUuv8SOHv/Ch9E/wMLGf8DCBL/
+ AgYN/xE2d/8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8nbu3/rcT3//7+////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////9b///8T
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////jv////7/////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////a4/v/OXju/yRr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFm4/8bVbz/
+ EzyG/wohSP8DCBL/AwkU/wkcP/8RN3n/GlK2/yFn5P8aUbP/AwgS/w8vaf8haOf/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8jbO3/r8X4//7+////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///47///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zb////x////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////a4/v/OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8gZuL/HFjD/xRAjv8LI0//BA0d/wQLGf8IGjn/EDNx/xlQsP8fY9r/IWnp/yJr7f8ia+3/
+ Imvt/yJr7f8bVLr/BA4e/w4rXv8hZ+T/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8rb+3/
+ vc/5////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////8f///zb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8D////uP//////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/DShZ/wYSJ/8DChX/BxYw/w8wav8YS6f/
+ Hl/T/yFp6f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/BhIn/wwkUP8gZuL/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8zc+7/0d77////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////uP///wP///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///0v////7////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/xlPsP8DCBL/BhIn/xxYw/8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8eXc7/BhMq/wofRf8gZN3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yNr7f9Cfe//8fT9////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////7////S////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8I////yv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/x1cy/8HFjL/BhQs/xtWv/8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtj/
+ BxYx/wgZOP8fYNX/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9olvL/+/z/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////K////CP///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///1X////9////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////Z4vv/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yBk3v8OK1//AwoX/xVDlf8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8iaur/
+ H2HX/xlNq/8QMm//Dy5m/yBl4P8ia+3/Imvt/yJr7f8fYtn/CR1A/wcVL/8eXtD/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNq7f+mwvf/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////3///9V////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8K////xv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8VQZD/
+ AwkU/w8vZ/8gZuL/Imrr/yBl4P8aUbT/ETV2/wkdQf8EDBr/AwsX/wsiSv8GEyn/CR5D/yBj3P8ia+3/
+ Imvt/yJr7f8gY9z/CyJL/wURJ/8dXMz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zR27v/h6vz/
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////8X///8K
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///0n////7////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8bVLr/AwoV/wcXMv8KIEb/AwoV/wMIE/8KHkP/
+ Ejl+/xpTt/8hZ+P/Imvt/x9h1/8HGDT/CBk4/x9g1f8ia+3/Imvt/yJr7f8gZuP/DCdW/wUOIP8cV8L/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2+c8//+/v//////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////+////0n///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8D////uP//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////b4/v/OHju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGbi/xtWv/8TPoj/
+ CyFK/wMKF/8DChX/CRw+/xE1dv8aUbX/IGbi/yJq6/8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3f8JHkL/
+ BhMr/x1czP8ia+3/Imvt/yJr7f8haej/Di1k/wQMG/8aUbT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ J23t/8nX+v//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zH////0////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////Y4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/xdKo/8FDyH/AwgS/wgYNv8QMm//GU6s/x9h1v8haen/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8LI07/BRAk/x1byP8ia+3/Imvt/yFo5v8eX9P/
+ CyRP/wMIE/8ZTq3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/VIzx//39////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////0////Mf///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////jf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////V4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Hl3P/wgaOf8FDiD/
+ G1W7/yJr7P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yBm4f8NKFj/BQ4g/xAzcf8MJlT/BxUv/wMLGP8CCBH/BREm/xQ9iP8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8eae3/ydj6////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///+N////AQAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////Y4vv/OXju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IWfk/w8vZ/8CBw//FD+M/yJq6v8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8iauz/IWnp/yJr7f8ia+3/Imvt/yJq6v8PLmX/AAEC/wofRf8WRJb/
+ G1a//yBj3P8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9jk/H//P3/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Uf////3/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////b5Pv/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imrr/xZFmP8ECxn/DChY/yBl3/8ia+3/Imvt/yJr7f8ia+3/Imrr/x5g1P8YTKj/DzBr/wcWMP8GEyn/
+ HFnF/yJr7f8ia+3/Imvt/yJq6v8RNXb/AwoW/xhLpv8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yRs7f/d5vz/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////f///1H///8AAAAAAAAAAAAAAAAAAAAAAP///wL///+l/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////f39/+bm5v/+/v7////////////X4fv/Onnu/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwf8HFzL/Bxcz/xxXwv8fY9v/
+ GU+v/xAzcv8JGzv/BAsZ/wQNHv8KH0b/FD6K/w0qXP8EDR7/G1W8/yJr7f8ia+3/Imvt/yFp6f8SOX//
+ AggR/xdInv8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGvt/4qt9f//////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////pf///wIAAAAA
+ AAAAAAAAAAD///8A////Ev///+j/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7+/v+rq6v/Ozs7/8zMzP//////
+ ///////////W4Pv/OXfu/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+z/IWfk/xlOrf8DChb/AgcQ/wMLGP8AAQH/CR1A/xM7hP8NK1//F0ed/yJr7f8cWMP/
+ EDFs/w8vaf8EDBr/GlCy/yJr7f8ia+3/Imvt/yJq6/8UP43/AgYO/xVCkv8ia+z/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/QX/v//f4/v//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////o////Ev///wAAAAAAAAAAAP///wD///9L/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////t7e3/zMzM/8zMzP/Pj4+/8jIyP/////////////////a4/v/OXju/yNs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6P8bVb3/EzuC/wogRv8DCBP/AwkT/wkdQf8RNXb/
+ GlGz/xdHnf8hZ+X/IGXg/xpTuP8dWsj/IGTe/x9i2P8YS6f/IGbh/xE0dP8DCRP/GEql/yJr7f8ia+3/
+ Imvt/yJr7f8WRpv/AggR/xM7hP8ia+z/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ y9v6////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///9L
+ ////AAAAAAAAAAAA////Af///5b////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////8/Pz/85OTn/MjIy/zIyMv8zMzP/
+ Pz8//8jIyP/////////////////b4/v/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ FUKT/wEECP8EDR3/Dy9n/wUQJP8dW8r/Imrq/w4uZf8WRpv/Imvt/xlPsP8MJFH/Imvs/yFo5/8HGDX/
+ HVzN/yJr7f8RNXb/FD6J/xM8hf8CCBH/FkWa/yFp6f8gZN7/HVvK/xhMp/8LIkv/AQIF/xM8hf8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+Or/X/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///5b///8BAAAAAAAAAAD///8K////0v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////s7Oz/R0dH/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8vLy//+/v7////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8hZuP/ETV1/wMIEv8TPIX/Hl7Q/x9h1v8aU7j/
+ IGPc/yBl4f8ZTav/IWbj/x9i2f8cV8L/Hl3O/x9h1v8fYtr/GlGz/yBk3v8gZeH/GU+u/xM9hv8CBw//
+ CBg1/wUPIf8DChf/BA4f/wkcPv8OLWT/GlK1/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ JGzt/1GI8P/+/v//////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////0v///woAAAAA////AP///yf////0////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////Pz8/21tbf8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+z/F0mh/wMKFf8MJVL/GEqk/xAxbf8iauz/IWfj/wsjTf8gZN3/Imvt/xM7gv8XSJ7/
+ Imvt/xxXv/8OLGH/Imvt/yFo5v8NKVr/HVzN/xZGm/8CBQr/DCRQ/x5dzv8haOX/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/K2/u/+/y/f//////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////0////J////wD///8B////XP////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////+qqqr/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/HVzL/wgaOP8FESX/
+ G1W9/xQ+iv8ZULH/Imvt/xxXwf8SOHz/Imvs/yFp6P8PL2f/H2HW/yJr7f8WRJf/GEul/yJr7f8eXtD/
+ EDJu/xhLpf8DChX/EDNy/yFq6v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fa+3/ydj6////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///9c////Af///wH///+U////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////5OTk/z8/P/8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////Z4vv/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGXg/w8uZv8DChf/DSlc/xxaxv8gZN//Hl/T/xhKpf8hZ+P/
+ IWfl/xZFmP8gZN7/IGXg/xpTt/8cV8H/IGXf/x9j3P8WRpz/IGbi/xlOrP8EDBv/Dy9n/yFn5P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f+eu/b//v//////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////5T///8B////Af///8f////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v91dXX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imrr/xVDlP8DChf/DCdX/wcVL/8fYtj/Imvt/xAzcv8VQZD/Imvt/xpStv8LIkv/Imvt/yFn5P8KHkT/
+ HFrI/yJr7f8SOoD/Ejl//xtWv/8EDBv/DSpc/yBm4v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/3ym9P//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xv///wH///8R////6f//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////zs7O/zExMf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwP8GEyv/BA0d/xtUuv8bVr//
+ H2Pc/yBm4v8aU7f/IGbi/x9g1f8dW8r/Hl/S/x5f0/8gZuH/GlO3/yBk3v8gZN7/GlO4/xtWvv8FESb/
+ CyJM/yFn5P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/WZHx//7+////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////p////Ef///y/////2
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v9kZGT/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b4/v/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yBk3f8NKFn/AQIE/wgbO/8iaur/IWjn/wsiTP8eXtD/Imvt/xM8hf8WRJb/
+ Imvt/x1ayP8MJ1X/HV3O/xlQsv8EDRz/CyNM/wcVL/8AAAH/DzBq/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNr7f9Lge///f7/////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////b///8v////UP////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////0dHR/y0tLf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/
+ ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8UPon/
+ AwoW/wsjTv8ZT6//Imnp/xxZxv8RNnn/GlO5/xVDlf8OLWT/CiBG/wURJf8ECxn/BA0c/wcXMv8MJ1f/
+ EzqC/xhLp/8fYdj/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zt47v/9/v//
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v///1D///9x
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////39/f9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUbT/BRAk/wYULf8LI0z/BQ8h/wEDBv8DCBP/
+ BhQs/wskUP8SOHz/F0mi/xxYw/8fY9v/Imrr/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/LnPt//z8////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////cf///4/////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////5OTk/zMzM/8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fYtn/DSpd/xAxbf8XR57/HFnE/yBl4P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8lcO3/
+ +fv+////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///+P
+ ////r///////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////+UlJT/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b5Pv/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVv7f/5+v7/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////6/////H////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////+fn5/1JSUv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ LHLt//v8////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////x////9z/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////X19f/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f84d+7//f7/////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////c////7P//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////5+fn/8uLi7/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8nJyf/////////////////a4/v/OXju/yRs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ I2vt/0h/7//9/v//////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////+z////3////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////+/v7/YWFh/zQ0NP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8jIyP/////////////////b5Pv/N3fu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/V43x//7+////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////9/////3/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////b29v87Ozv/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f90ovP/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////9////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////3d3d/y0tLf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yNs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JWvt/5m39v/+////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////+vr6//MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fa+3/wdT5////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////3/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////5GRkf8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ydu7f/q7v3/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////9////9///////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////eXl5/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ka+3/RoLv//39////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////f////s////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////7+/v9cXFz/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+BqPT/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////7P///9z/////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////f39/1JSUv8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/IWrt/8PU+f//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////c////x///////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////9/f3/SUlJ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/
+ ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f85ee7/8vX+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////8f///+v
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////39/f9FRUX/
+ MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/3ej8///////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////r////4/////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////f39/0VFRf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/1N77////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///+P
+ ////cf////7/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////9/f3/
+ SkpK/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b4/v/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/1eK8f/6+///////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///3H///9Q/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////39/f9UVFT/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/O3ju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/tcv4////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////UP///y/////2////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /v7+/15eXv8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/zY2Nv83Nzf/ODg4/zc3N/82Njb/
+ NDQ0/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/0OA7//7/P//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////b///8v////Ef///+n/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////f39//zExMf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9CQkL/
+ c3Nz/6Ojo//MzMz/5+fn//b29v/8/Pz/+Pj4/+vr6//V1dX/s7Oz/4aGhv9VVVX/NTU1/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf/////////////////Z4vv/OXju/yRs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ka+3/tsz5////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////6f///xH///8B////x/////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v+Wlpb/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zMzM/9YWFj/rKys/+vr6//7+/v/7+/v/9fX1/+7u7v/qqqq/6SkpP+oqKj/
+ tbW1/87Ozv/m5ub/+fn5//f39//T09P/f39//z8/P/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8fHx//////////////////b5Pv/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/1+P8f/7/P//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////G////Af///wH///+U////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////7a2tv8wMDD/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/q6ur//Pz8//y8vL/
+ u7u7/3Z2dv9KSkr/OTk5/zMzM/8yMjL/MjIy/zIyMv8yMjL/NjY2/0FBQf9fX1//mJiY/9zc3P/6+vr/
+ 29vb/3Z2dv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4fv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8scO3/1OD7////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////5T///8B////Af///1z////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////4eHh/ywsLP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/Z2dn/+Pj4//6+vr/srKy/1RUVP8zMzP/MjIy/zIyMv8yMjL/MzMz/z8/P/9ERET/
+ QEBA/zQ0NP8yMjL/MjIy/zIyMv8yMjL/Ozs7/3d3d//c3Nz/+vr6/6ysrP87Ozv/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imrt/4+x9f/+/v//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////XP///wH///8A////J/////T/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////5+fn/QEBA/zMzM/8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/4CAgP/4+Pj/4ODg/2dnZ/8yMjL/
+ MjIy/zIyMv8yMjL/Ozs7/4WFhf/Q0ND/9PT0//39/f/39/f/19fX/5SUlP9BQUH/MjIy/zIyMv8yMjL/
+ MjIy/zs7O/+fn5//+fn5/8vLy/9ERET/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b4/v/OXju/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9SifD/+Pr+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////T///8n////AAAAAAD///8K////0v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zMzM/+Hh4f/+Pj4/8vLy/9JSUn/MjIy/zIyMv8yMjL/MjIy/1NTU//S0tL/+/v7/9nZ2f+pqan/
+ lJSU/6SkpP/S0tL/+fn5/9/f3/9iYmL/MjIy/zIyMv8yMjL/MjIy/zQ0NP97e3v/9fX1/8nJyf9BQUH/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXfu/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/M3Tu/+Lp/P//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////0v///woAAAAAAAAAAP///wH///+W
+ /////v//////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////6ioqP8tLS3/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/cHBw//T09P/Nzc3/QUFB/zIyMv8yMjL/
+ MjIy/zIyMv9MTEz/39/f//Dw8P9+fn7/Ozs7/zIyMv8yMjL/MjIy/zg4OP9ubm7/5ubm/+zs7P9dXV3/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv94eHj/9fX1/66urv80NDT/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8vLy//+/v7////////////W4Pv/Onnu/yNr7f8ia+3/Imvt/ytu7f+6zvn/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///+W////AQAAAAAAAAAA////AP///0v////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////3t7e/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0dHR//o6Oj/39/f/0dHR/8yMjL/MjIy/zIyMv8yMjL/NDQ0/7y8vP/19fX/Z2dn/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/7Ozs/9TU1P86Ojr/MjIy/zIyMv8yMjL/MjIy/zIyMv+Xl5f/
+ +vr6/3BwcP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8vLy//////////////////X4fv/
+ OXfu/yRs7f8ja+3/orz3////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///0v///8AAAAAAAAAAAD///8A
+ ////Ev///+j/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////8/Pz/
+ WVlZ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/rq6u//f39/9nZ2f/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9dXV3/9/f3/6CgoP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/
+ +/v7/3d3d/8yMjL/MjIy/zIyMv8yMjL/MjIy/zw8PP/T09P/1tbW/zg4OP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/PT09/8jIyP/////////////////b5Pv/OXju/5Oy9f/9/f//////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////o////Ev///wAAAAAAAAAAAAAAAAD///8C////pf////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////+lpaX/LS0t/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0tLS//19fX/tbW1/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/5aWlv/19fX/V1dX/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/0VFRf/q6ur/srKy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/3p6ev/9/f3/YmJi/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP//////
+ ///////////n7f3/+/z/////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///6X///8CAAAAAAAAAAAAAAAA
+ AAAAAP///wD///9R/////f//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////+vr6/85OTn/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/h4eH//39/f9iYmL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/s7Oz/+bm5v8/Pz//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ NTU1/8zMzP/W1tb/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/Q0ND//Hx8f+bm5v/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////9////Uf///wAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7+/3Z2dv80NDT/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv+VlZX/+/v7/09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+3t7f/5OTk/z09Pf8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/x8fH/9nZ2f8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9CQkL/7+/v/6SkpP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Af///43////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////4eHh/ykpKf8yMjL/MjIy/zIyMv8yMjL/MjIy/2NjY//+/v7/hISE/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/5+fn//x8fH/TU1N/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/z8/P//j4+P/vb29/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4KCgv/9/f3/ZGRk/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx///////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////jf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Mf////T/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////cXFx/zExMf8yMjL/
+ MjIy/zIyMv8yMjL/OTk5/9vb2//W1tb/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/bGxs//r6+v+Li4v/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/b29v//r6+v+Hh4f/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9ERET/3t7e/9HR0f83Nzf/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////T///8x////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8D////uP//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////b29v/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/fn5+//v7+/+QkJD/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv85OTn/1NTU/+jo6P9LS0v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/z8/P//X19f/5+fn/0VFRf8yMjL/MjIy/zIyMv8yMjL/NDQ0/6urq//5+fn/aGho/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9J
+ ////+///////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////+Li4v/
+ MTEx/zIyMv8yMjL/MjIy/zIyMv82Njb/xMTE//X19f9sbGz/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/
+ 8vLy/9ra2v9WVlb/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/ysrK//n5+f95eXn/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv+NjY3/+vr6/52dnf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////v///9J////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////G////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////+/v7/9FRUX/MzMz/zIyMv8yMjL/MjIy/zIyMv9JSUn/
+ 2tra/+/v7/9qamr/MzMz/zIyMv8yMjL/MjIy/zMzM/9xcXH/7e3t//Pz8/+xsbH/d3d3/2NjY/9ycnL/
+ paWl/+3t7f/z8/P/hoaG/zQ0NP8yMjL/MjIy/zIyMv82Njb/jo6O//n5+f+2trb/Ojo6/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8fHx///////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////xv///wr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///1X////9////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////8HBwf8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv9VVVX/3t7e//Pz8/+Hh4f/ODg4/zIyMv8yMjL/
+ MjIy/zIyMv9SUlL/tLS0/+7u7v/7+/v//f39//z8/P/y8vL/wsLC/19fX/8zMzP/MjIy/zIyMv8yMjL/
+ QUFB/6qqqv/5+fn/tra2/z4+Pv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////3///9V////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////CP///8r/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////f39/4KCgv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9LS0v/z8/P//v7+//AwMD/WVlZ/zMzM/8yMjL/MjIy/zIyMv8zMzP/R0dH/2lpaf91dXX/
+ bW1t/0tLS/80NDT/MjIy/zIyMv8yMjL/NTU1/3Fxcf/a2tr/+vr6/56env84ODj/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////yv///wj///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////S/////v/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////+Pj4/1ZWVv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv86Ojr/mpqa//Ly8v/6+vr/
+ vr6+/3Nzc/9DQ0P/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/R0dH/4CAgP/R0dH/
+ /f39/9ra2v9tbW3/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////v///9L////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////uP//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////4uLi/0ZGRv8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/UlJS/6qqqv/r6+v/+/v7/+zs7P/IyMj/paWl/4eHh/93d3f/
+ cnJy/3Z2dv+Hh4f/p6en/8zMzP/w8PD/+fn5/9ra2v+Hh4f/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////uP///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///82////8f//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////y8vL/zs7O/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0hISP97e3v/tbW1/9/f3//z8/P/+fn5//z8/P/9/f3//Pz8//j4+P/x8fH/1tbW/6enp/9qamr/
+ PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8vLy//+/v7/////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////H///82////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///+O
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ xMTE/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NjY2/0ZGRv9ZWVn/
+ ZGRk/2hoaP9kZGT/WFhY/0JCQv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP//////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////jv///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////w8PD/zg4OP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8vLy//nJyc////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////9b///8T////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///0n////6////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////xsbG/z09Pf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/6Kiov/8/Pz/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////6////Sf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///5b////+////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////09PT/01NTf8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MzMz/zw8PP+zs7P//v7+////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///5b///8CAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///9H/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////7+/v/2ZmZv8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/9MTEz/1dXV////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////NP///+v/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ +/v7/6CgoP87Ozv/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8zMzP/
+ fHx8//Ly8v//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////6////zT///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Y/////r/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7+/9nZ2f9gYGD/MzMz/zMzM/8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/TU1N/7y8vP/8/Pz/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////r///9j////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E
+ ////jv////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////v7+/+ysrL/SEhI/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ODg4/5WVlf/x8fH/
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////tv////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////29vb/
+ paWl/0tLS/8tLS3/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zMzM/8wMDD/Ozs7/4eHh//s7Oz/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///7b///8H////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8U////xf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////9/f3/7e3t/9iYmL/MzMz/y8vL/8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/zIyMv8wMDD/T09P/6Ghof/u7u7//v7+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////F////FP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////v7+//c3Nz/mZmZ/1dXV/8zMzP/MDAw/zExMf8zMzP/MzMz/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8yMjL/MDAw/y8vL/9KSkr/
+ iIiI/87Ozv/4+Pj/////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////0v///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8n////3P////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /f39/+fn5/+0tLT/iIiI/1lZWf87Ozv/Jycn/yUlJf8pKSn/MjIy/zMzM/80NDT/MzMz/zIyMv8uLi7/
+ JSUl/yYmJv81NTX/UVFR/3x8fP+oqKj/3d3d//v7+///////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///9z///8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8m
+ ////3f////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////v7+//z8/P/u7u7/
+ 29vb/8bGxv+vr6//nZ2d/5iYmP+ampr/qKio/8HBwf/W1tb/6enp//n5+f////////////7+/v//////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7////c
+ ////Jv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n////0v////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////0v///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8g////xf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v///8X///8g
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8V////tv////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////7///+2////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////6////jv///wf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8F
+ ////Y////+z/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////7P///2P///8F////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////NP///9H////+////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///9H///80////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///5b////5////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///0n////W
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////W////Sf///wL///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///xP///+O////8f////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7////x
+ ////jv///xP///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wH///82////uP////v/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////S////8v////9
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////9////y////0v///8D
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8B////CP///1X////G////+/////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7////7////xv///1X///8I////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Af///wr///9K////uP////T////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////0////uP///0r///8K////Af///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8D////Mf///43////n
+ /////f////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v////3////n
+ ////jf///zH///8D////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9R////pf///+j////+/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+/////v///+j///+l////Uf///wr///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wH///8C////Ef///0z///+W////0v////T////+//////////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+//////////7////0////0v///5b///9M////Ef///wL///8B
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8K
+ ////KP///1z///+U////x////+n////2/////v////7////+////////////////////////////////
+ ///////////////////////////////////////////////+/////v////7////2////6f///8f///+U
+ ////XP///yj///8K////Af///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8B////Ef///y////9Q
+ ////cf///4////+v////x////9z////s////9/////3///////////////3////3////7P///9z////H
+ ////r////4////9x////UP///y////8R////Af///wH///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA
+ AAD///////////////AAAAAAD/////////////+AAAAAAAH////////////+AAAAAAAAf///////////
+ 8AAAAAAAAA///////////8AAAAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////
+ ////+AAAAAAAAAAAH/////////AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAA
+ Af///////wAAAAAAAAAAAAD///////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAA
+ AAAAAAAP/////+AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAA
+ AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB//
+ //gAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAA
+ AAAD///AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAA
+ AAAAAAAAAP/+AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/4AAAA
+ AAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP
+ 8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAA
+ AAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAA
+ AAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAB
+ gAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAA
+ AAAAA+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAA
+ AAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAA
+ AAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAD/
+ /wAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAA
+ AAAD///gAAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAf///4AAAAAAAA
+ AAAAAAAAH////AAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAA/////4AA
+ AAAAAAAAAAAAAf/////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAD///
+ ///4AAAAAAAAAAAAAB///////AAAAAAAAAAAAAA///////8AAAAAAAAAAAAA////////gAAAAAAAAAAA
+ Af///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////////4AAAAA
+ AAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////wAAAAAAAAD///////////
+ /gAAAAAAAH////////////+AAAAAAAH/////////////8AAAAAAP//////////////8AAAAA////////
+ KAAAAEAAAACAAAAAAQAgAAAAAAAAQAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o
+ ////z////6////+I////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///wP///8+////kf///9n////8////////////////////////////////
+ ///////////////////////////////////////////////8////2f///5H///8+////A////wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Ff///3j////c/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///9z///94////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////D///+J////FP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX///9u////7P//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////+z///9u
+ ////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yr////G
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////8b///8q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///2H////z////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////8////2H///8BAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Bf///5L////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////kv///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///63/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////+t////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f/////////////////////
+ //////////////////////////////////////////////////////f4/v/J2vr/nbz3/3+n9P9om/P/
+ X5Ty/2KW8v90ofP/jbH1/7LK+P/k6/z//v7/////////////////////////////////////////////
+ /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Bf///63/////
+ ///////////////////////////////////////////////////////////7/P//vNH5/2mZ8v8tcu7/
+ Imvt/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGzt/0iD8P+TtPb/5+79////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////rf///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///5L///////////////////////////////////////////////////////////39//+yyfj/
+ RYDv/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/ydu7f95o/T/5e39////////////////////////////////////////////////////////////
+ //////////////////////////////+S////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///2H////+////////////////////////////////////////////////
+ /////9/o/P9ZjfH/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/y9y7v+hvff//f7/////////////////////////////
+ /////////////////////////////////////////////////////v///2H///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////z////////////////////////////////
+ /////////////////////7bM+f8vcu7/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2WW8v/x9f7/
+ ///////////////////////////////////////////////////////////////////////////////z
+ ////KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX////G////////////////
+ /////////////////////////////////////6K99/8kbO3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8YS6b/DzFs/xM7gv8ia+z/
+ Imvt/yJr7f8ia+3/TIXw/+rw/f//////////////////////////////////////////////////////
+ /////////////////////////8b///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u
+ //////////////////////////////////////////////////////////+7z/n/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBl4P8ZTq7/ETV1/w0qXv8QMWz/
+ F0qj/yBk3f8WRpv/ETRz/yJq6/8ia+3/Imvt/yJr7f9Ig/D/7vP9////////////////////////////
+ ////////////////////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8U////7P//////////////////////////////////////////////////////////
+ /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xE2d/8LIUr/
+ Fked/x9g1f8ia+z/Imvt/yJr7f8ia+3/Imvt/xhMqf8PL2j/IWnp/yJr7f8ia+3/Imvt/1qO8f/8/P//
+ /////////////////////////////////////////////////////////////////////////+z///8U
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////if//////////////////////////////////////////
+ ////////////////////////////////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8hZ+T/Dy5n/xZElv8ia+z/Imvt/yJr7f8haOf/G1W9/x1ayP8ia+3/GlG0/w4rX/8haOb/
+ Imvt/yJr7f8ja+3/i6/1////////////////////////////////////////////////////////////
+ ////////////////////if///wAAAAAAAAAAAAAAAAAAAAAA////Ff////D/////////////////////
+ //////////////////////////////////////////////////////////+6zvn/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8VQpP/Di1k/xQ+if8OK2D/Di1k/xQ/jP8NKl7/
+ GlK1/yJr7f8bVr7/DSla/yBm4v8ia+3/Imvt/ydu7f/T4fv/////////////////////////////////
+ //////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA////AP///3j/////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////7rP+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xhKpf8OLWT/Ditf/xM8hf8cV8H/
+ Imrq/yJr7f8ia+3/IWnp/w8uZv8YTKn/Imvt/xxXwf8LIkz/IGTd/yJr7f8ia+3/Wo/x//7/////////
+ ////////////////////////////////////////////////////////////////////eP///wAAAAAA
+ AAAAAP///wP////c////////////////////////////////////////////////////////////////
+ ////////////////////////////////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUrb/
+ DCZU/x5g1P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8iaur/EDNy/woeQ/8PLmf/EjqA/x5g1P8ia+3/
+ Imvt/yFr7f/K2vr/////////////////////////////////////////////////////////////////
+ /////////9z///8DAAAAAAAAAAD///8+/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////+Pj4//////+6z/n/KW/t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/x9h1/8NKFn/GVCw/x9i2f8XSaH/EDFt/w0pW/8NKVr/IGXh/yJr7P8SOH3/
+ FUGR/yJr7f8ia+3/Imvt/yJr7f8ia+3/bJvz////////////////////////////////////////////
+ ///////////////////////////////+////PgAAAAD///8A////kf//////////////////////////
+ ////////////////////////////////////////////////////////////////7e3t/1NTU/+0tLT/
+ /////7rO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yBl4P8YTKj/EDJu/wgZN/8NKVr/F0mi/xdIn/8fYtn/
+ FkSX/wwmVf8fY9v/Imvt/xQ+iP8TPIX/Imvt/yJr7f8ia+3/Imvt/ypw7f/w9P7/////////////////
+ /////////////////////////////////////////////////////////5H///8A////A////9n/////
+ ////////////////////////////////////////////////////////////////////////////////
+ +vr6/2BgYP8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8SOHz/CiBH/xhLpf8bU7n/
+ HFnF/xlPr/8fYtn/GU6t/xtVvf8YS6f/CyRQ/xM9h/8PMGr/CRs8/xxZxf8ia+3/Imvt/yJr7f8ia+3/
+ t835///////////////////////////////////////////////////////////////////////////Z
+ ////A////yH////8////////////////////////////////////////////////////////////////
+ /////////////////////5CQkP8yMjL/MjIy/zIyMv81NTX/tLS0//////+6zvn/KW7t/yJr7f8ia+3/
+ Imvt/xZGnP8MJlX/GEyo/xpRtP8cV8L/G1W9/xtUuv8aUbT/GlK1/xhNqf8KH0X/HFjE/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/4Cp9P//////////////////////////////////////////////////////
+ /////////////////////P///yH///9X////////////////////////////////////////////////
+ /////////////////////////////////////9XV1f81NTX/MjIy/zIyMv8yMjL/MjIy/zY2Nv+0tLT/
+ /////7rO+f8pbu3/Imvt/yJr7f8ia+3/HVrI/wogR/8UP4v/Hl7P/xpRsv8cWsb/GlG0/xpQsv8dXMv/
+ F0qj/w0nV/8cWMT/Imvt/yJr7f8ia+3/Imvt/yJr7f9YjvH/////////////////////////////////
+ //////////////////////////////////////////////9X////iP//////////////////////////
+ //////////////////////////////////////////////////////////9lZWX/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////us/5/yhu7f8ia+3/Imvt/yJr7f8gZuL/Ditg/xAybv8hZ+T/
+ GU6t/xxZxP8dW8r/GU6t/x5dz/8RNnj/BhIo/x1byv8ia+3/Imvt/yJr7f8ia+3/Onrv//7/////////
+ ////////////////////////////////////////////////////////////////////iP///6//////
+ ///////////////////////////////////////////////////////////////////////////Ozs7/
+ MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv82Njb/tLS0//////+6zvn/KW7t/yJr7f8ia+3/
+ Imvt/yJr7P8VQZD/DCZT/xM9h/8MJVP/DSpd/w4sYv8RNXX/FkWY/xxXwf8haej/Imvt/yJr7f8ia+3/
+ Imvt/ytw7f/+/v//////////////////////////////////////////////////////////////////
+ /////////6/////P////////////////////////////////////////////////////////////////
+ ////////////////dnZ2/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/
+ /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/xxYxP8bVLn/IGXg/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8kbe3//P3/////////////////////////////////////////////
+ ///////////////////////////////P////6P//////////////////////////////////////////
+ ////////////////////////////////9PT0/zo6Ov8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////uc75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/KnDt//7+////////////////////////
+ ////////////////////////////////////////////////////6P////j/////////////////////
+ /////////////////////////////////////////////////////7+/v/8xMTH/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+7z/n/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/zp57v/+/v//
+ //////////////////////////////////////////////////////////////////////////j////+
+ //////////////////////////////////////////////////////////////////////////+Pj4//
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/
+ /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f9VjPH/////////////////////////////////////////////////////////////////
+ ///////////////+/////v//////////////////////////////////////////////////////////
+ ////////////////aWlp/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7Ozs///////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/fKf0////////////////////////////////////////////
+ /////////////////////////////////////v////j/////////////////////////////////////
+ /////////////////////////////////////09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1//////+5zvn/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/7HJ+P//////////////////////
+ //////////////////////////////////////////////////////////j////o////////////////
+ //////////////////////////////////////////////////////7+/v9AQED/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/
+ /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yhu7f/t8v3/
+ ///////////////////////////////////////////////////////////////////////////////o
+ ////z//////////////////////////////////////////////////////////////////////+/v7/
+ PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f9klvL/////////////////////////////////////////////////////////////////
+ ////////////////////z////6//////////////////////////////////////////////////////
+ /////////////////v7+/0FBQf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+6z/n/KW7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/wdT6////////////////////////////////////////////
+ /////////////////////////////////////////6////+I////////////////////////////////
+ //////////////////////////////////////////9QUFD/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/RkZG/3V1df+SkpL/mZmZ/4uLi/9oaGj/Ozs7/zIyMv8yMjL/MjIy/zU1Nf+0tLT/
+ /////7rO+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/UInw//7+////////////////////////
+ //////////////////////////////////////////////////////////////+I////V///////////
+ ////////////////////////////////////////////////////////////////bGxs/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9WVlb/urq6/8bGxv+SkpL/c3Nz/2xsbP97e3v/oKCg/8/Pz/+lpaX/
+ RERE/zIyMv8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8ia+3/JWzt/8va+v//////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////V////yH////8////////////////////////////////////////////////////////////////
+ /////5KSkv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/ycnJ/1paWv8yMjL/SUlJ/42Njf+enp7/
+ dHR0/zY2Nv80NDT/cHBw/9DQ0P9fX1//MjIy/zIyMv81NTX/tLS0//////+6zvn/KG7t/yJr7f8ia+3/
+ Imvt/3+n9P//////////////////////////////////////////////////////////////////////
+ /////////////////////P///yH///8D////2f//////////////////////////////////////////
+ ///////////////////////////ExMT/MTEx/zIyMv8yMjL/MjIy/zIyMv+Hh4f/tLS0/zg4OP8yMjL/
+ bGxs/8/Pz/98fHz/Z2dn/5ycnP/FxcX/PT09/zIyMv9FRUX/y8vL/1VVVf8yMjL/MjIy/zY2Nv+0tLT/
+ /////7rO+f8pb+3/Imvt/0+H8P/4+f7/////////////////////////////////////////////////
+ /////////////////////////////////////////9n///8D////AP///5H/////////////////////
+ ////////////////////////////////////////////////9vb2/zw8PP8yMjL/MjIy/zIyMv9WVlb/
+ ycnJ/zc3N/8yMjL/PT09/9LS0v8/Pz//MjIy/zIyMv8yMjL/fX19/6CgoP8yMjL/MjIy/05OTv/FxcX/
+ NDQ0/zIyMv8yMjL/NTU1/7S0tP//////us/5/0WA7//n7v3/////////////////////////////////
+ //////////////////////////////////////////////////////////////+R////AAAAAAD///8+
+ /////v////////////////////////////////////////////////////////////////////99fX3/
+ MjIy/zIyMv8yMjL/sbGx/2BgYP8yMjL/MjIy/2tra/+cnJz/MjIy/zIyMv8yMjL/MjIy/zc3N//Pz8//
+ MjIy/zIyMv8yMjL/q6ur/1hYWP8yMjL/MjIy/zIyMv81NTX/tLS0///////4+v7/////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////PgAAAAAAAAAA////A////9z/////////////////////////////////////////////////////
+ ////////////////1dXV/zAwMP8yMjL/MjIy/7y8vP9OTk7/MjIy/zIyMv9ubm7/mJiY/zIyMv8yMjL/
+ MjIy/zIyMv82Njb/0NDQ/zIyMv8yMjL/MjIy/6ysrP9bW1v/MjIy/zIyMv8yMjL/MjIy/zU1Nf+0tLT/
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////3P///wMAAAAAAAAAAP///wD///94////////////////////////////////
+ //////////////////////////////////////////9sbGz/MjIy/zIyMv9xcXH/qKio/zIyMv8yMjL/
+ QkJC/9DQ0P84ODj/MjIy/zIyMv8yMjL/bm5u/6urq/8yMjL/MjIy/1VVVf/ExMT/MzMz/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////////////////////////////////////////////////////
+ /////////////////////////////////////////3j///8AAAAAAAAAAAAAAAAA////Ff////D/////
+ ////////////////////////////////////////////////////////////////3t7e/zc3N/8yMjL/
+ MzMz/7e3t/9+fn7/MjIy/zIyMv9+fn7/xMTE/2NjY/9OTk7/g4OD/8/Pz/9ERET/MjIy/0pKSv/Ozs7/
+ T09P/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz////////////////////////////
+ //////////////////////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA
+ AAAAAP///wD///+J////////////////////////////////////////////////////////////////
+ //////////+cnJz/MjIy/zIyMv87Ozv/u7u7/5+fn/88PDz/MjIy/1tbW/+mpqb/t7e3/42Njf89PT3/
+ MzMz/29vb//Pz8//V1dX/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/
+ //////////////////////////////////////////////////////////////////////////////+J
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///+z/////////////////////////////////////
+ /////////////////////////////////f39/2xsbP8yMjL/MjIy/zQ0NP+EhIT/09PT/6enp/91dXX/
+ WFhY/1NTU/9kZGT/jo6O/8nJyf+np6f/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7Ozs///////////////////////////////////////////////////////
+ ///////////////s////FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u////////////////
+ ///////////////////////////////////////////////////////////y8vL/WVlZ/zIyMv8yMjL/
+ MjIy/zg4OP9lZWX/k5OT/62trf+xsbH/oaGh/3l5ef9CQkL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1////////////////////////////
+ ////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Bf///8b/////////////////////////////////////////////////////////////////////
+ //////Dw8P9bW1v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/5qamv//////
+ ////////////////////////////////////////////////////xv///wUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8q////8///////////////////////////////////////////
+ ////////////////////////////////9PT0/3V1df8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ OTk5/7Gxsf//////////////////////////////////////////////////////////8////yoAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///2H////+////////////////
+ ///////////////////////////////////////////////////////////+/v7/rKys/z4+Pv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/XFxc/9ra2v//////////////////////////////////////////////////////
+ /////v///2H///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B
+ ////kv//////////////////////////////////////////////////////////////////////////
+ ///////////r6+v/hYWF/zc3N/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9KSkr/rq6u//v7+///////////////////////////////////////
+ /////////////////////////5L///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wX///+t////////////////////////////////////////////////
+ ///////////////////////////////////////////r6+v/m5ub/1VVVf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8xMTH/ODg4/25ubv+6urr/+vr6////////////////////////////
+ /////////////////////////////////////////63///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f/////////////////////
+ ///////////////////////////////////////////////////////////////////////////+/v7/
+ 5ubm/7e3t/+Tk5P/fHx8/2xsbP9mZmb/cnJy/4ODg/+fn5//yMjI//X19f//////////////////////
+ /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K
+ ////rf//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////63///8K
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wX///+S/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///5L///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///2H////z////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////8////2H///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Kv///8b/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////xv///yr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8F////bv///+z/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////s////bv///wUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D/////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////D///+J////FP///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8V////eP///9z////+////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////3P///3j///8V
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////Pv///5H////Z/////P//////////
+ /////////////////////////////////////////////////////////////////////P///9n///+R
+ ////Pv///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o////z////6////+I
+ ////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///wAAD//////4AAAB///
+ //+AAAAB/////gAAAAB////8AAAAAD////AAAAAAD///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAA
+ AAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAA/gAAAAAAAAB+AAAAAAAAAH
+ wAAAAAAAAAPAAAAAAAAAA4AAAAAAAAABgAAAAAAAAAGAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAAD
+ 4AAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//gAAAAAAAH//AAAA
+ AAAA//+AAAAAAAH//8AAAAAAA///4AAAAAAH///wAAAAAA////wAAAAAP////gAAAAB/////gAAAAf//
+ ///gAAAH//////wAAD///ygAAAAwAAAAYAAAAAEAIAAAAAAAACQAAOoWAADqFgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Av///yD///9e////lP///77////e////9P////7////+////9P///97///++////lP///17///8g
+ ////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///xj///90////y/////v/////////////////////////////////////////////////////
+ ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8d////lv////P/////////////////////////////////////////////////////
+ ///////////////////////////////////////////////z////lv///x3///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Cv///33////0////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////T///99
+ ////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8u////zv//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////L///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v/////////////////////
+ //////////////////////////////////////z9///09/7/8PX+//f5/v/+/v//////////////////
+ ///////////////////////////////////////////////////////////////7////b////wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P//////////
+ /////////////////////////////////f3//87e+/+LsPX/WI7x/zd47/8pcO7/J2/t/y1y7v9Bf+//
+ aZry/6TA9//o7/3/////////////////////////////////////////////////////////////////
+ /////P///2////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////7
+ //////////////////////////////////////7+//+2zPn/TYbw/yNs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8qcO3/cp/z/97o/P//////////////////////////////////////
+ //////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Lv////L/////////////////////////////////////4+v9/16R8f8ja+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ylv7f+Vtvb/+vz/////////////
+ ///////////////////////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8K////zv/////////////////////////////////////K2vr/N3ju/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFo5v8bVb3/IWfk/yJr7f8ia+3/
+ ZJXy//L2/v//////////////////////////////////////////////////////////zv///woAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///99//////////////////////////////////////////+HrPX/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imrq/xxZxf8VQY//EzqB/xM9iP8YTar/
+ ETR0/yBl4f8ia+3/Imvt/1eN8f/2+P7/////////////////////////////////////////////////
+ /////////33///8AAAAAAAAAAAAAAAAAAAAAAP///x3////0////////////////////////////////
+ ///////////9/f//gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8haej/CyJM/xZHnf8gZd//
+ Imvt/yJr7f8ia+3/IGXf/xE0dP8fY9r/Imvt/yJr7f9tm/P//f3/////////////////////////////
+ //////////////////////////T///8dAAAAAAAAAAAAAAAA////AP///5b/////////////////////
+ /////////////////////////////////P3//4Co9P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ H2Pc/xE2eP8cWMT/HFnE/xVCk/8SOH3/GU+u/yFn4/8RNXb/HmDU/yJr7f8ja+3/p8P4////////////
+ //////////////////////////////////////////////+W////AAAAAAAAAAAA////GP////P/////
+ //////////////////////////////////////////////////////39//9/p/T/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8iaer/FUOV/xI5f/8RNHP/GE2q/x9j2/8ia+z/Fkac/xhKpP8haOX/EDRy/x1czf8ia+3/
+ NXfu/+7z/v/////////////////////////////////////////////////////z////GAAAAAD///8A
+ ////dP/////////////////////////////////////////////////////////////////////9/f//
+ gKj0/yNr7f8ia+3/Imvt/yJr7f8iauz/FEGP/xdIn/8ia+z/Imvt/yFp6P8dW8n/IWjm/xhLpv8LI07/
+ FUGQ/x1czP8ia+3/Imvt/5O19v//////////////////////////////////////////////////////
+ ////dP///wD///8C////y///////////////////////////////////////////////////////////
+ //////39/f+0tLT/+Pn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Imrq/xZElv8OLGL/ETZ4/w8vaP8TPIb/
+ EDRy/yBm4v8ZT6//FUKS/yJr7P8ia+3/Imvt/z187//8/f//////////////////////////////////
+ ////////////////////y////wL///8g////+///////////////////////////////////////////
+ /////////////////////5qamv8yMjL/gICA//n6+/9+p/T/Imvt/yJr7f8haej/CyRP/xI4e/8ZTav/
+ HVrH/x5dzv8bVbz/GlCy/w8wa/8XR53/DShZ/xlPrv8ia+3/Imvt/yJr7f/R3/v/////////////////
+ ////////////////////////////////////+////yD///9e////////////////////////////////
+ ////////////////////////////////y8vL/zU1Nf8yMjL/MjIy/39/f//5+vz/gKj0/yNr7f8ia+3/
+ H2LZ/xAxbP8WRZj/G1W8/xxYw/8aUbP/G1a+/xhNqv8PL2f/H2DV/yJr7f8ia+3/Imvt/yJr7f+au/f/
+ /////////////////////////////////////////////////////////17///+U////////////////
+ ///////////////////////////////////////////5+fn/VVVV/zIyMv8yMjL/MjIy/zIyMv+AgID/
+ +fn7/4Co9P8ia+3/Imvt/yJp6v8UPon/Ejh9/xxXwP8bVLv/HVrI/xtWvv8aUrX/Dy5n/x5e0f8ia+3/
+ Imvt/yJr7f91ovT//////////////////////////////////////////////////////////5T///++
+ //////////////////////////////////////////////////////////+zs7P/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/Imvt/yJr7f8ia+3/GU2r/xAzcf8TO4P/ETR0/xE1dP8SOX//
+ FD2I/x1ayP8ia+3/Imvt/yJr7f9ilPL/////////////////////////////////////////////////
+ /////////77////e//////////////////////////////////////////////////////////9cXFz/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/35+fv/6+vz/f6f0/yNr7f8ia+3/Imvt/x9h1v8dXMz/
+ Imnq/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9ZkPH/////////////////////////////////
+ /////////////////////////97////0////////////////////////////////////////////////
+ /////+Tk5P8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9klvL/////////////////
+ //////////////////////////////////////////T////+////////////////////////////////
+ /////////////////////7CwsP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ gICA//r7/P9+pvT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f97pvT/
+ //////////////////////////////////////////////////////////7////+////////////////
+ /////////////////////////////////////4uLi/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/35+fv/6+/z/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f+jwff///////////////////////////////////////////////////////////7////0
+ /////////////////////////////////////////////////////3R0dP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Cn9P8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNr7f/c5vz/////////////////////////////////////////////////
+ //////////T////e/////////////////////////////////////////////////////2xsbP8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/0qF8P/+/v//////////////////////////////////
+ /////////////////////////97///++////////////////////////////////////////////////
+ /////3Fxcf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/35+fv/6+vz/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/6fD+P//////////////////////
+ /////////////////////////////////////////77///+U////////////////////////////////
+ /////////////////////4WFhf8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf9zc3P/p6en/6urq/+qqqr/
+ qqqq/5mZmf9PT0//MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Q4Dv//f5/v//////
+ /////////////////////////////////////////////////////////5T///9e////////////////
+ /////////////////////////////////////6ioqP8yMjL/MjIy/zIyMv8yMjL/R0dH/7Kysv91dXX/
+ Pj4+/25ubv9/f3//SkpK/0lJSf+cnJz/ioqK/zMzM/8yMjL/gICA//n6/P9+p/T/Imvt/yJr7f8lbe3/
+ wdT6/////////////////////////////////////////////////////////////////////17///8g
+ ////+////////////////////////////////////////////////9ra2v8xMTH/MjIy/zIyMv9BQUH/
+ tLS0/0NDQ/85OTn/sLCw/3R0dP9eXl7/qKio/2dnZ/8yMjL/dXV1/4WFhf8yMjL/MjIy/39/f//5+vv/
+ gKj0/yNr7f+NsfX/////////////////////////////////////////////////////////////////
+ ////+////yD///8C////y/////////////////////////////////////////////////7+/v9PT0//
+ MjIy/zIyMv+cnJz/UVFR/zIyMv97e3v/aWlp/zIyMv8yMjL/NjY2/6+vr/8yMjL/MjIy/6Ojo/8+Pj7/
+ MjIy/zIyMv+AgID/+Pn7/7DJ+P/8/f//////////////////////////////////////////////////
+ ////////////////////y////wL///8A////dP//////////////////////////////////////////
+ //////////+goKD/MjIy/zIyMv+urq7/MzMz/zIyMv+RkZH/TU1N/zIyMv8yMjL/MjIy/6urq/8yMjL/
+ MjIy/4mJif9TU1P/MjIy/zIyMv8yMjL/gICA//z8/P//////////////////////////////////////
+ ////////////////////////////////////dP///wAAAAAA////GP////P/////////////////////
+ ///////////////////////////z8/P/RkZG/zIyMv+Dg4P/bGxs/zIyMv9dXV3/lJSU/zMzM/8yMjL/
+ Tk5O/6SkpP8yMjL/QkJC/62trf8zMzP/MjIy/zIyMv8yMjL/MjIy/39/f//7+/v/////////////////
+ ///////////////////////////////////////////////z////GAAAAAAAAAAA////AP///5b/////
+ ////////////////////////////////////////////////tLS0/zMzM/82Njb/p6en/2hoaP8zMzP/
+ fHx8/6ysrP+kpKT/pqam/0BAQP9LS0v/r6+v/0dHR/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/
+ +/v7//////////////////////////////////////////////////////////+W////AAAAAAAAAAAA
+ AAAAAP///x3////0/////////////////////////////////////////////////v7+/3x8fP8yMjL/
+ NjY2/46Ojv+srKz/dXV1/1ZWVv9UVFT/ZmZm/5ycnP+hoaH/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/gICA//v7+/////////////////////////////////////////////////T///8d
+ AAAAAAAAAAAAAAAAAAAAAP///wD///99////////////////////////////////////////////////
+ //////j4+P9nZ2f/MjIy/zIyMv87Ozv/a2tr/4uLi/+QkJD/eHh4/0VFRf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4WFhf//////////////////////////////////////
+ /////////33///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K////zv//////////////////////////
+ ///////////////////////////19fX/cnJy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/QUFB/8bGxv//////////////////////
+ ////////////////////zv///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Lv////L/////
+ ////////////////////////////////////////////////+/v7/6CgoP85OTn/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/4ODg////////////
+ ///////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///1b////7///////////////////////////////////////////////////////////j4+P/
+ fn5+/zk5Of8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/VVVV/7S0tP/9/f3/
+ //////////////////////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P//////////////////////////////////////////
+ /////////////////////+vr6/+qqqr/dHR0/01NTf87Ozv/NTU1/zg4OP9CQkL/YGBg/46Ojv/Ozs7/
+ /Pz8/////////////////////////////////////////////////P///2////8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v/////////////////////
+ //////////////////////////////////////////////////////7+/v/4+Pj/8fHx//T09P/8/Pz/
+ ///////////////////////////////////////////////////////////////7////b////wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////L///9W
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8u////zv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Cv///33////0////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////T///99////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8d////lv////P/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////z////lv///x3///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///xj///90////y/////v/////////////////////////////////////////////////////
+ ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///yD///9e////lP///77////e////9P////7////+
+ ////9P///97///++////lP///17///8g////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAf/8AAP/4AAAf/wAA/+AAAAf/AAD/gAAA
+ Af8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA
+ wAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA
+ AAEAAIAAAAAAAQAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA
+ /AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/4AAAAH/AAD/4AAAB/8AAP/4AAAf/wAA//4AAH//AAAoAAAA
+ IAAAAEAAAAABACAAAAAAAAAQAADqFgAA6hYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///xD///9b////nf///83////t/////f////3////t////zf///53///9b
+ ////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///yf///+f////9v//////////////////////////////////////////
+ ///////////////2////n////yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wv///+O////+v//////////////////////////////////////////
+ ////////////////////////////////////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8m////1P//////////////////////////////////////////
+ /////////////////////////////////////////////////////////9T///8mAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////M////+v////////////////////////////////v9P7/
+ x9j6/7HL+f+1zfn/z977//j6/v///////////////////////////////////////////////+v///8z
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////q//////////////////////7///+80fn/
+ WpDx/yVt7f8ia+3/Imvt/yJr7f8ia+3/LHHu/3Gf8//X4/z/////////////////////////////////
+ /////////+r///8mAAAAAAAAAAAAAAAAAAAAAAAAAAD///8L////1P/////////////////////t8v3/
+ YpXy/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVt7f+Kr/X/+/z/////////////
+ /////////////////////////9T///8LAAAAAAAAAAAAAAAA////AP///47/////////////////////
+ /////2ua8/8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtr/GU2r/xhKpf8WRZr/Hl3O/yJr7f9omfL/
+ +/z//////////////////////////////////////47///8AAAAAAAAAAAD///8n////+v//////////
+ ////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8ia+3/HV3N/xE2ef8haOf/Imrr/x9h2P8ZTq3/
+ HFrH/yJr7f+BqfT/////////////////////////////////////+v///ycAAAAA////AP///5//////
+ ////////////////////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8fY9v/FUGQ/xRAjf8YS6f/
+ GVCw/xlOrP8ZULH/G1a+/yNs7f/L2/v/////////////////////////////////////n////wD///8Q
+ ////9v//////////////////////////////////////////7PH8/0uG8P8ia+3/Imvt/yBl3/8WRJb/
+ H2LZ/xtUuv8XSqP/HVvK/xAybv8dXMv/Imvt/16S8v/////////////////////////////////////2
+ ////EP///1v//////////////////////////////////////////9LS0v9cXFz/2+Dr/0uG8P8ia+3/
+ HV3O/xI6gf8TO4T/GlCy/xpSt/8UPor/FkWa/xZHnf8ia+3/JGzt/+nw/f//////////////////////
+ //////////////9b////nf/////////////////////////////////////19fX/SkpK/zIyMv9UVFT/
+ 2+Dr/0uG8P8ia+3/GEyp/xQ/i/8cV8D/G1S6/xpSt/8TOoH/IWbj/yJr7f8ia+3/ts35////////////
+ /////////////////////////53////N/////////////////////////////////////5mZmf8yMjL/
+ MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/HFrH/xRAjf8VQpP/FECO/xVDlf8YS6f/Imvt/yJr7f+Zuvb/
+ ////////////////////////////////////zf///+3////////////////////////////////8/Pz/
+ RUVF/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/IWbj/yBk3f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/5K29v/////////////////////////////////////t/////f//////////////////////////
+ /////9PT0/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/o8H3//////////////////////////////////////3////9////////////////
+ ////////////////ra2t/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f/L3Pv//////////////////////////////////////f///+3/////
+ //////////////////////////+enp7/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/
+ 2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/NHfu//r8///////////////////////////////////////t
+ ////zf///////////////////////////////6Ojo/8yMjL/MjIy/zIyMv8yMjL/Nzc3/1tbW/9iYmL/
+ QkJC/zIyMv9UVFT/2+Dr/0uG8P8ia+3/Imvt/yJr7f+MsfX/////////////////////////////////
+ /////////83///+d////////////////////////////////v7+//zIyMv8yMjL/MjIy/3V1df+Dg4P/
+ d3d3/35+fv92dnb/ioqK/z09Pf9UVFT/2+Dr/0uG8P8ia+3/Onrv//L2/v//////////////////////
+ ////////////////////nf///1v////////////////////////////////u7u7/NDQ0/zIyMv92dnb/
+ VVVV/2tra/9vb2//Wlpa/4iIiP83Nzf/jY2N/zIyMv9UVFT/2+Dr/1KK8f/L2/v/////////////////
+ //////////////////////////////9b////EP////b///////////////////////////////9tbW3/
+ MjIy/4eHh/8yMjL/g4OD/zIyMv8yMjL/g4OD/zIyMv9vb2//RkZG/zIyMv9UVFT/6uvs////////////
+ ////////////////////////////////////9v///xD///8A////n///////////////////////////
+ /////9LS0v8zMzP/gYGB/0VFRf9xcXH/ZGRk/01NTf+Li4v/ODg4/42Njf8yMjL/MjIy/zIyMv9UVFT/
+ 7Ozs//////////////////////////////////////////+f////AAAAAAD///8n////+v//////////
+ /////////////////////46Ojv80NDT/hISE/3p6ev90dHT/f39//3Jycv+Kior/Ozs7/zIyMv8yMjL/
+ MjIy/zIyMv9UVFT/7Ozs////////////////////////////////+v///ycAAAAAAAAAAP///wD///+O
+ /////////////////////////////////Pz8/3Z2dv8yMjL/QEBA/2lpaf9ubm7/SEhI/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9ubm7///////////////////////////////+O////AAAAAAAAAAAA
+ AAAAAP///wv////U/////////////////////////////////Pz8/5SUlP81NTX/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/aGho/+vr6///////////////////////////1P///wsAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///yb////q/////////////////////////////////////9vb2/98fHz/
+ Ozs7/zIyMv8yMjL/MjIy/zIyMv8zMzP/Y2Nj/7y8vP/+/v7//////////////////////////+r///8m
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zP////r////////////////////////////////
+ ///////////5+fn/0tLS/7m5uf+2trb/yMjI/+/v7//////////////////////////////////////r
+ ////MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////U////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////1P///yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wv///+O
+ ////+v//////////////////////////////////////////////////////////////////////////
+ ////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8n////n/////b/////////////////////////////////////////////////////
+ ////9v///5////8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////EP///1v///+d////zf///+3////9/////f///+3////N
+ ////nf///1v///8Q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAf/+AAB/
+ /AAAP/gAAB/wAAAP4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAAD4AAAB/AAAA/4AAAf/AAAP/4AAH//gAH/
+ KAAAABAAAAAgAAAAAQAgAAAAAAAABAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y
+ ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr///+b
+ /////v////////////////////////////////////7///+b////CgAAAAAAAAAAAAAAAP///wr////C
+ ///////////F2Pr/f6n0/2qc8/+FrfX/0eD7/////////////////////8L///8KAAAAAP///wD///+b
+ //////////93o/T/Imvt/yJr7f8haej/HVvL/x9e0P+ErPX//v7/////////////////m////wD///8y
+ /////v//////////ydv7/yxy7v8ia+3/GU6s/xxXwf8aU7j/HVvJ/5u89/////////////////7///8y
+ ////mP////////////////T09P+brc3/LHLu/xlQsf8aULL/GU2r/xZGnP8yde7/+vv/////////////
+ ////mP///9r///////////////+CgoL/Ozs7/5Wmxv8qat3/GEyo/xhKpP8YTKj/Imvt/9Ph+///////
+ /////////9r////6///////////z8/P/Nzc3/zIyMv87Ozv/lafG/yxw6/8haen/Imvt/yJr7f/N3fv/
+ ///////////////6////+v//////////0tLS/zIyMv8yMjL/MjIy/zo6Ov+Vp8b/LHLu/yJr7f8mbu3/
+ 8fX+////////////////+v///9r//////////9jY2P8yMjL/Q0ND/2NjY/9mZmb/U1NT/5Wmxv8scu7/
+ d6P0/////////////////////9r///+Y///////////7+/v/QUFB/2FhYf9kZGT/ZmZm/1lZWf9AQED/
+ m6rH//L2/v////////////////////+Y////Mv////7//////////6SkpP9gYGD/cXFx/3Jycv9jY2P/
+ MjIy/zs7O//Ly8v////////////////+////Mv///wD///+b///////////+/v7/jo6O/0RERP9GRkb/
+ MjIy/zIyMv8yMjL/fX19////////////////m////wAAAAAA////Cv///8L////////////////V1dX/
+ jo6O/3V1df+Hh4f/x8fH////////////////wv///woAAAAAAAAAAAAAAAD///8K////m/////7/////
+ ///////////////////////////////+////m////woAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y
+ ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAADgBwAAwAMAAIABAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAMADAADgBwAA
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs
index f9513c9..f344d2d 100644
--- a/UVtools.GUI/FrmMain.Designer.cs
+++ b/UVtools.GUI/FrmMain.Designer.cs
@@ -42,6 +42,8 @@
this.menuFileExtract = new System.Windows.Forms.ToolStripMenuItem();
this.menuFileConvert = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.menuFileSettings = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator();
this.menuFileExit = new System.Windows.Forms.ToolStripMenuItem();
this.menuEdit = new System.Windows.Forms.ToolStripMenuItem();
this.menuMutate = new System.Windows.Forms.ToolStripMenuItem();
@@ -54,6 +56,7 @@
this.menuHelpAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this.menuHelpInstallPrinters = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuNewVersion = new System.Windows.Forms.ToolStripMenuItem();
this.statusBar = new System.Windows.Forms.StatusStrip();
this.mainTable = new System.Windows.Forms.TableLayoutPanel();
this.scCenter = new System.Windows.Forms.SplitContainer();
@@ -71,7 +74,11 @@
this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImageHighlightIssues = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
- this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripButton();
+ this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripSplitButton();
+ this.tsLayerImageLayerOutlinePrintVolumeBounds = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineLayerBounds = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineHollowAreas = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineEdgeDetection = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImagePixelEdit = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
@@ -116,8 +123,10 @@
this.tsIssueCount = new System.Windows.Forms.ToolStripLabel();
this.tsIssueNext = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
- this.tsIsuesRefresh = new System.Windows.Forms.ToolStripButton();
this.tsIssueRemove = new System.Windows.Forms.ToolStripButton();
+ this.tsIsuesRefresh = new System.Windows.Forms.ToolStripSplitButton();
+ this.tsIsuesRefreshIslands = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsIsuesRefreshResinTraps = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
this.tsIssuesRepair = new System.Windows.Forms.ToolStripButton();
this.imageList16x16 = new System.Windows.Forms.ImageList(this.components);
@@ -169,7 +178,8 @@
this.menuMutate,
this.menuTools,
this.viewToolStripMenuItem,
- this.helpToolStripMenuItem});
+ this.helpToolStripMenuItem,
+ this.menuNewVersion});
this.menu.Location = new System.Drawing.Point(0, 0);
this.menu.Name = "menu";
this.menu.Size = new System.Drawing.Size(1784, 24);
@@ -189,6 +199,8 @@
this.menuFileExtract,
this.menuFileConvert,
this.toolStripSeparator2,
+ this.menuFileSettings,
+ this.toolStripSeparator15,
this.menuFileExit});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
@@ -281,6 +293,20 @@
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(258, 6);
//
+ // menuFileSettings
+ //
+ this.menuFileSettings.Image = global::UVtools.GUI.Properties.Resources.settings_16x16;
+ this.menuFileSettings.Name = "menuFileSettings";
+ this.menuFileSettings.ShortcutKeys = System.Windows.Forms.Keys.F12;
+ this.menuFileSettings.Size = new System.Drawing.Size(261, 22);
+ this.menuFileSettings.Text = "&Settings";
+ this.menuFileSettings.Click += new System.EventHandler(this.EventClick);
+ //
+ // toolStripSeparator15
+ //
+ this.toolStripSeparator15.Name = "toolStripSeparator15";
+ this.toolStripSeparator15.Size = new System.Drawing.Size(258, 6);
+ //
// menuFileExit
//
this.menuFileExit.Image = global::UVtools.GUI.Properties.Resources.Exit_16x16;
@@ -384,6 +410,15 @@
this.menuHelpInstallPrinters.Text = "Install profiles into PrusaSlicer";
this.menuHelpInstallPrinters.Click += new System.EventHandler(this.EventClick);
//
+ // menuNewVersion
+ //
+ this.menuNewVersion.BackColor = System.Drawing.Color.Lime;
+ this.menuNewVersion.Name = "menuNewVersion";
+ this.menuNewVersion.Size = new System.Drawing.Size(147, 20);
+ this.menuNewVersion.Text = "New version is available!";
+ this.menuNewVersion.Visible = false;
+ this.menuNewVersion.Click += new System.EventHandler(this.EventClick);
+ //
// statusBar
//
this.statusBar.Location = new System.Drawing.Point(0, 789);
@@ -433,6 +468,7 @@
//
// pbLayer
//
+ this.pbLayer.AllowDoubleClick = true;
this.pbLayer.Dock = System.Windows.Forms.DockStyle.Fill;
this.pbLayer.GridScale = Cyotek.Windows.Forms.ImageBoxGridScale.Large;
this.pbLayer.Location = new System.Drawing.Point(0, 25);
@@ -442,6 +478,7 @@
this.pbLayer.Size = new System.Drawing.Size(1228, 705);
this.pbLayer.TabIndex = 7;
this.pbLayer.Zoomed += new System.EventHandler<Cyotek.Windows.Forms.ImageBoxZoomEventArgs>(this.pbLayer_Zoomed);
+ this.pbLayer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseDoubleClick);
this.pbLayer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseMove);
this.pbLayer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseUp);
//
@@ -581,14 +618,49 @@
//
// tsLayerImageLayerOutline
//
- this.tsLayerImageLayerOutline.CheckOnClick = true;
+ this.tsLayerImageLayerOutline.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsLayerImageLayerOutlinePrintVolumeBounds,
+ this.tsLayerImageLayerOutlineLayerBounds,
+ this.tsLayerImageLayerOutlineHollowAreas,
+ this.tsLayerImageLayerOutlineEdgeDetection});
this.tsLayerImageLayerOutline.Image = global::UVtools.GUI.Properties.Resources.Geometry_16x16;
this.tsLayerImageLayerOutline.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageLayerOutline.Name = "tsLayerImageLayerOutline";
- this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(66, 22);
+ this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(78, 22);
this.tsLayerImageLayerOutline.Text = "Outline";
- this.tsLayerImageLayerOutline.ToolTipText = "Show layer outlines only";
- this.tsLayerImageLayerOutline.Click += new System.EventHandler(this.EventClick);
+ this.tsLayerImageLayerOutline.ButtonClick += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlinePrintVolumeBounds
+ //
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.CheckOnClick = true;
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Name = "tsLayerImageLayerOutlinePrintVolumeBounds";
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Text = "Print Volume Bounds";
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineLayerBounds
+ //
+ this.tsLayerImageLayerOutlineLayerBounds.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineLayerBounds.Name = "tsLayerImageLayerOutlineLayerBounds";
+ this.tsLayerImageLayerOutlineLayerBounds.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineLayerBounds.Text = "Layer Bounds";
+ this.tsLayerImageLayerOutlineLayerBounds.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineHollowAreas
+ //
+ this.tsLayerImageLayerOutlineHollowAreas.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineHollowAreas.Name = "tsLayerImageLayerOutlineHollowAreas";
+ this.tsLayerImageLayerOutlineHollowAreas.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineHollowAreas.Text = "Hollow Areas";
+ this.tsLayerImageLayerOutlineHollowAreas.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineEdgeDetection
+ //
+ this.tsLayerImageLayerOutlineEdgeDetection.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineEdgeDetection.Name = "tsLayerImageLayerOutlineEdgeDetection";
+ this.tsLayerImageLayerOutlineEdgeDetection.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineEdgeDetection.Text = "&Edge Detection";
+ this.tsLayerImageLayerOutlineEdgeDetection.Click += new System.EventHandler(this.EventClick);
//
// toolStripSeparator9
//
@@ -975,8 +1047,8 @@
this.tsIssueCount,
this.tsIssueNext,
this.toolStripSeparator13,
- this.tsIsuesRefresh,
this.tsIssueRemove,
+ this.tsIsuesRefresh,
this.toolStripSeparator12,
this.tsIssuesRepair});
this.tsIssues.Location = new System.Drawing.Point(3, 3);
@@ -1021,18 +1093,6 @@
this.toolStripSeparator13.Name = "toolStripSeparator13";
this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25);
//
- // tsIsuesRefresh
- //
- this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
- this.tsIsuesRefresh.Enabled = false;
- this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16;
- this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.tsIsuesRefresh.Name = "tsIsuesRefresh";
- this.tsIsuesRefresh.Size = new System.Drawing.Size(61, 22);
- this.tsIsuesRefresh.Text = "Detect";
- this.tsIsuesRefresh.ToolTipText = "Compute Issues";
- this.tsIsuesRefresh.Click += new System.EventHandler(this.EventClick);
- //
// tsIssueRemove
//
this.tsIssueRemove.Enabled = false;
@@ -1046,6 +1106,38 @@
"tion, need reslice.";
this.tsIssueRemove.Click += new System.EventHandler(this.EventClick);
//
+ // tsIsuesRefresh
+ //
+ this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsIsuesRefresh.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsIsuesRefreshIslands,
+ this.tsIsuesRefreshResinTraps});
+ this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16;
+ this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tsIsuesRefresh.Name = "tsIsuesRefresh";
+ this.tsIsuesRefresh.Size = new System.Drawing.Size(73, 22);
+ this.tsIsuesRefresh.Text = "&Detect";
+ this.tsIsuesRefresh.ToolTipText = "Compute Issues";
+ this.tsIsuesRefresh.ButtonClick += new System.EventHandler(this.EventClick);
+ //
+ // tsIsuesRefreshIslands
+ //
+ this.tsIsuesRefreshIslands.Checked = true;
+ this.tsIsuesRefreshIslands.CheckOnClick = true;
+ this.tsIsuesRefreshIslands.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.tsIsuesRefreshIslands.Name = "tsIsuesRefreshIslands";
+ this.tsIsuesRefreshIslands.Size = new System.Drawing.Size(211, 22);
+ this.tsIsuesRefreshIslands.Text = "Islands && Touching Bonds";
+ //
+ // tsIsuesRefreshResinTraps
+ //
+ this.tsIsuesRefreshResinTraps.Checked = true;
+ this.tsIsuesRefreshResinTraps.CheckOnClick = true;
+ this.tsIsuesRefreshResinTraps.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.tsIsuesRefreshResinTraps.Name = "tsIsuesRefreshResinTraps";
+ this.tsIsuesRefreshResinTraps.Size = new System.Drawing.Size(211, 22);
+ this.tsIsuesRefreshResinTraps.Text = "Resin traps";
+ //
// toolStripSeparator12
//
this.toolStripSeparator12.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
@@ -1364,7 +1456,6 @@
private System.Windows.Forms.ToolStripLabel tsLayerImageZoom;
private System.Windows.Forms.ToolStripButton tsLayerImagePixelEdit;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
- private System.Windows.Forms.ToolStripButton tsLayerImageLayerOutline;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
private System.Windows.Forms.ToolStripMenuItem menuMutate;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
@@ -1378,7 +1469,6 @@
private System.Windows.Forms.ColumnHeader lvIssuesCount;
private System.Windows.Forms.ColumnHeader lvIssuesXY;
private System.Windows.Forms.ColumnHeader lvIssuesPixels;
- private System.Windows.Forms.ToolStripButton tsIsuesRefresh;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
private System.Windows.Forms.ToolStripLabel tsLayerImageMouseLocation;
private System.Windows.Forms.ColumnHeader lvIssuesLayerHeader;
@@ -1408,6 +1498,17 @@
private System.Windows.Forms.ToolStripSplitButton tsLayerImageExport;
private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportFile;
private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportClipboard;
+ private System.Windows.Forms.ToolStripMenuItem menuNewVersion;
+ private System.Windows.Forms.ToolStripMenuItem menuFileSettings;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator15;
+ private System.Windows.Forms.ToolStripSplitButton tsIsuesRefresh;
+ private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshIslands;
+ private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshResinTraps;
+ private System.Windows.Forms.ToolStripSplitButton tsLayerImageLayerOutline;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineEdgeDetection;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlinePrintVolumeBounds;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineLayerBounds;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineHollowAreas;
}
}
diff --git a/UVtools.GUI/FrmMain.cs b/UVtools.GUI/FrmMain.cs
index 6d74a8b..0633508 100644
--- a/UVtools.GUI/FrmMain.cs
+++ b/UVtools.GUI/FrmMain.cs
@@ -11,7 +11,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
-using System.Linq;
+using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@@ -23,6 +23,7 @@ using Emgu.CV.Util;
using UVtools.Core;
using UVtools.Core.Extensions;
using UVtools.GUI.Forms;
+using UVtools.GUI.Properties;
namespace UVtools.GUI
{
@@ -33,37 +34,43 @@ namespace UVtools.GUI
#region Properties
- public static readonly Dictionary<Mutation.Mutates, Mutation> Mutations =
- new Dictionary<Mutation.Mutates, Mutation>
+ public static readonly Dictionary<LayerManager.Mutate, Mutation> Mutations =
+ new Dictionary<LayerManager.Mutate, Mutation>
{
- {Mutation.Mutates.Resize, new Mutation(Mutation.Mutates.Resize,
+ {LayerManager.Mutate.Resize, new Mutation(LayerManager.Mutate.Resize,
"Resizes layer images in a X and/or Y factor, starting from 100% value\n" +
"NOTE 1: Build volume bounds are not validated after operation, please ensure scaling stays inside your limits.\n" +
"NOTE 2: X and Y are applied to original image, not to the rotated preview (If enabled)."
)},
- {Mutation.Mutates.Solidify, new Mutation(Mutation.Mutates.Solidify,
+ {LayerManager.Mutate.Flip, new Mutation(LayerManager.Mutate.Flip,
+ "Flips layer images vertically and/or horizontally"
+ )},
+ {LayerManager.Mutate.Rotate, new Mutation(LayerManager.Mutate.Rotate,
+ "Rotate layer images in a certain degrees"
+ )},
+ {LayerManager.Mutate.Solidify, new Mutation(LayerManager.Mutate.Solidify,
"Solidifies the selected layers, closes all inner holes.\n" +
"Warning: All surrounded holes are filled, no exceptions! Make sure you don't require any of holes in layer path.",
Properties.Resources.mutation_solidify
)},
- {Mutation.Mutates.Erode, new Mutation(Mutation.Mutates.Erode,
+ {LayerManager.Mutate.Erode, new Mutation(LayerManager.Mutate.Erode,
"The basic idea of erosion is just like soil erosion only, it erodes away the boundaries of foreground object (Always try to keep foreground in white). " +
"So what happends is that, all the pixels near boundary will be discarded depending upon the size of kernel. So the thickness or size of the foreground object decreases or simply white region decreases in the image. It is useful for removing small white noises, detach two connected objects, etc.",
Properties.Resources.mutation_erosion
)},
- {Mutation.Mutates.Dilate, new Mutation(Mutation.Mutates.Dilate,
+ {LayerManager.Mutate.Dilate, new Mutation(LayerManager.Mutate.Dilate,
"It is just opposite of erosion. Here, a pixel element is '1' if atleast one pixel under the kernel is '1'. So it increases the white region in the image or size of foreground object increases. Normally, in cases like noise removal, erosion is followed by dilation. Because, erosion removes white noises, but it also shrinks our object. So we dilate it. Since noise is gone, they won't come back, but our object area increases. It is also useful in joining broken parts of an object.",
Properties.Resources.mutation_dilation
)},
- {Mutation.Mutates.Opening, new Mutation(Mutation.Mutates.Opening,
+ {LayerManager.Mutate.Opening, new Mutation(LayerManager.Mutate.Opening,
"Opening is just another name of erosion followed by dilation. It is useful in removing noise.",
Properties.Resources.mutation_opening
)},
- {Mutation.Mutates.Closing, new Mutation(Mutation.Mutates.Closing,
+ {LayerManager.Mutate.Closing, new Mutation(LayerManager.Mutate.Closing,
"Closing is reverse of Opening, Dilation followed by Erosion. It is useful in closing small holes inside the foreground objects, or small black points on the object.",
Properties.Resources.mutation_closing
)},
- {Mutation.Mutates.Gradient, new Mutation(Mutation.Mutates.Gradient,
+ {LayerManager.Mutate.Gradient, new Mutation(LayerManager.Mutate.Gradient,
"It's the difference between dilation and erosion of an image.",
Properties.Resources.mutation_gradient
)},
@@ -79,16 +86,16 @@ namespace UVtools.GUI
"The Hit-or-Miss transformation is useful to find patterns in binary images. In particular, it finds those pixels whose neighbourhood matches the shape of a first structuring element B1 while not matching the shape of a second structuring element B2 at the same time.",
null
)},*/
- {Mutation.Mutates.PyrDownUp, new Mutation(Mutation.Mutates.PyrDownUp,
+ {LayerManager.Mutate.PyrDownUp, new Mutation(LayerManager.Mutate.PyrDownUp,
"Performs downsampling step of Gaussian pyramid decomposition.\n" +
"First it convolves image with the specified filter and then downsamples the image by rejecting even rows and columns.\n" +
"After performs up-sampling step of Gaussian pyramid decomposition\n"
)},
- {Mutation.Mutates.SmoothMedian, new Mutation(Mutation.Mutates.SmoothMedian,
+ {LayerManager.Mutate.SmoothMedian, new Mutation(LayerManager.Mutate.SmoothMedian,
"Each pixel becomes the median of its surrounding pixels. Also a good way to remove noise.\n" +
"Note: Iterations must be a odd number."
)},
- {Mutation.Mutates.SmoothGaussian, new Mutation(Mutation.Mutates.SmoothGaussian,
+ {LayerManager.Mutate.SmoothGaussian, new Mutation(LayerManager.Mutate.SmoothGaussian,
"Each pixel is a sum of fractions of each pixel in its neighborhood\n" +
"Very fast, but does not preserve sharp edges well.\n" +
"Note: Iterations must be a odd number."
@@ -108,7 +115,7 @@ namespace UVtools.GUI
public Mat ActualLayerImage { get; private set; }
- public Mat ActualLayerImageBgr { get; private set; }
+ public Mat ActualLayerImageBgr { get; private set; } = new Mat();
public Dictionary<uint, List<LayerIssue>> Issues { get; set; }
@@ -125,10 +132,24 @@ namespace UVtools.GUI
FrmLoading = new FrmLoading();
Program.SetAllControlsFontSize(Controls, 11);
Program.SetAllControlsFontSize(FrmLoading.Controls, 11);
-
+
+ if (Settings.Default.UpdateSettings)
+ {
+ Settings.Default.Upgrade();
+ Settings.Default.UpdateSettings = false;
+ Settings.Default.Save();
+ }
+
Clear();
- if (Width >= Screen.FromControl(this).WorkingArea.Width ||
+ tsLayerImageLayerDifference.Checked = Settings.Default.LayerDifferenceDefault;
+ tsIsuesRefreshIslands.Checked = Settings.Default.ComputeIslands;
+ tsIsuesRefreshResinTraps.Checked = Settings.Default.ComputeResinTraps;
+ tsLayerImageLayerOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds;
+ tsLayerImageLayerOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds;
+ tsLayerImageLayerOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
+
+ if (Settings.Default.StartMaximized || Width >= Screen.FromControl(this).WorkingArea.Width ||
Height >= Screen.FromControl(this).WorkingArea.Height)
{
WindowState = FormWindowState.Maximized;
@@ -138,7 +159,7 @@ namespace UVtools.GUI
DragEnter += (s, e) => { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; };
DragDrop += (s, e) => { ProcessFile((string[])e.Data.GetData(DataFormats.FileDrop)); };
- foreach (Mutation.Mutates mutate in (Mutation.Mutates[])Enum.GetValues(typeof(Mutation.Mutates)))
+ foreach (LayerManager.Mutate mutate in (LayerManager.Mutate[])Enum.GetValues(typeof(LayerManager.Mutate)))
{
if(!Mutations.ContainsKey(mutate)) continue;
var item = new ToolStripMenuItem(mutate.ToString())
@@ -155,6 +176,41 @@ namespace UVtools.GUI
var group = new ListViewGroup(issueType.ToString(), $"{issueType}s"){HeaderAlignment = HorizontalAlignment.Center};
lvIssues.Groups.Add(group);
}
+
+ if (Settings.Default.CheckForUpdatesOnStartup)
+ {
+ Task.Factory.StartNew(AppLoadTask);
+ }
+ }
+
+ private void AppLoadTask()
+ {
+ try
+ {
+ using (WebClient client = new WebClient())
+ {
+ string htmlCode = client.DownloadString($"{About.Website}/releases");
+ const string searchFor = "/releases/tag/";
+ var startIndex = htmlCode.IndexOf(searchFor, StringComparison.InvariantCultureIgnoreCase) + searchFor.Length;
+ var endIndex = htmlCode.IndexOf("\"", startIndex, StringComparison.InvariantCultureIgnoreCase);
+ var version = htmlCode.Substring(startIndex, endIndex- startIndex);
+ if (string.Compare(version, $"v{FrmAbout.AssemblyVersion}", StringComparison.OrdinalIgnoreCase) > 0)
+ {
+ Invoke((MethodInvoker)delegate
+ {
+ // Running on the UI thread
+ menuNewVersion.Text = $"New version {version} is available!";
+ menuNewVersion.Tag = $"{About.Website}/releases/tag/{version}";
+ menuNewVersion.Visible = true;
+ });
+ }
+ //Debug.WriteLine(version);
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine(e.Message);
+ }
}
#endregion
@@ -233,7 +289,7 @@ namespace UVtools.GUI
if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0)
{
- pbLayer.ZoomToFit();
+ ZoomToFit();
e.Handled = true;
return;
}
@@ -265,7 +321,11 @@ namespace UVtools.GUI
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
- pbLayer.ZoomToFit();
+ if (Settings.Default.LayerZoomToFit)
+ {
+ ZoomToFit();
+ }
+
lbLayerActual.Location = new Point(lbLayerActual.Location.X,
Math.Max(1,
Math.Min(tbLayer.Height - 40,
@@ -273,6 +333,7 @@ namespace UVtools.GUI
));
}
+
#endregion
#region Events
@@ -345,8 +406,10 @@ namespace UVtools.GUI
SlicerFile.Save();
result = true;
}
- catch (Exception)
+ catch (Exception ex)
{
+ MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
}
finally
{
@@ -389,8 +452,10 @@ namespace UVtools.GUI
SlicerFile.SaveAs(dialog.FileName);
result = true;
}
- catch (Exception)
+ catch (Exception ex)
{
+ MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
}
finally
{
@@ -433,6 +498,15 @@ namespace UVtools.GUI
return;
}
+ if (ReferenceEquals(sender, menuFileSettings))
+ {
+ using (FrmSettings frmSettings = new FrmSettings())
+ {
+ if (frmSettings.ShowDialog() != DialogResult.OK) return;
+ }
+ return;
+ }
+
if (ReferenceEquals(sender, menuFileExit))
{
if (menuFileSave.Enabled)
@@ -483,7 +557,7 @@ namespace UVtools.GUI
"Extraction completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(finalPath);
+ using (Process.Start(finalPath)){}
}
}
catch (Exception exception)
@@ -529,9 +603,9 @@ namespace UVtools.GUI
}
- if (item.Tag.GetType() == typeof(Mutation.Mutates))
+ if (item.Tag.GetType() == typeof(LayerManager.Mutate))
{
- Mutation.Mutates mutate = (Mutation.Mutates) item.Tag;
+ LayerManager.Mutate mutate = (LayerManager.Mutate) item.Tag;
MutateLayers(mutate);
return;
}
@@ -562,7 +636,7 @@ namespace UVtools.GUI
if (repairResinTraps && ReferenceEquals(Issues, null))
{
- ComputeIssues();
+ ComputeIssues(new IslandDetectionConfiguration {Enabled = false}); // Ignore islands as we dont require it
}
DisableGUI();
@@ -573,49 +647,7 @@ namespace UVtools.GUI
bool result = false;
try
{
-
- Parallel.For(layerStart, layerEnd + 1, layerIndex =>
- {
- Layer layer = SlicerFile[layerIndex];
- using (var image = layer.LayerMat)
- {
- if (repairResinTraps)
- {
- if (Issues.TryGetValue((uint) layerIndex, out var issues))
- {
- foreach (var issue in issues.Where(issue => issue.Type == LayerIssue.IssueType.ResinTrap))
- {
- CvInvoke.DrawContours(image,
- new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)),
- -1,
- new MCvScalar(255),
- -1);
- /*CvInvoke.DrawContours(image,
- new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)),
- -1,
- new MCvScalar(255),
- 2);*/
- }
- }
- }
-
- if (repairIslands)
- {
- Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), new Point(1, 1));
- if (closingIterations > 0)
- {
- CvInvoke.MorphologyEx(image, image, MorphOp.Close, kernel, new Point(-1, -1), (int) closingIterations, BorderType.Default, new MCvScalar());
- }
-
- if (openingIterations > 0)
- {
- CvInvoke.MorphologyEx(image, image, MorphOp.Open, kernel, new Point(-1, -1), (int)closingIterations, BorderType.Default, new MCvScalar());
- }
- }
-
- layer.LayerMat = image;
- }
- });
+ SlicerFile.LayerManager.RepairLayers(layerStart, layerEnd, closingIterations, openingIterations, repairIslands, repairResinTraps, Issues);
result = true;
}
catch (Exception ex)
@@ -638,7 +670,7 @@ namespace UVtools.GUI
ShowLayer();
- ComputeIssues();
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
menuFileSave.Enabled =
menuFileSaveAs.Enabled = true;
@@ -654,7 +686,7 @@ namespace UVtools.GUI
if (ReferenceEquals(sender, menuHelpWebsite))
{
- Process.Start(About.Website);
+ using (Process.Start(About.Website)){}
return;
}
@@ -665,7 +697,7 @@ namespace UVtools.GUI
"If you're happy to contribute for a better program and for my work i will appreciate the tip.\n" +
"A browser window will be open and forward to my paypal address after you click 'OK'.\nHappy Printing!",
"Donation", MessageBoxButtons.OK, MessageBoxIcon.Information);
- Process.Start(About.Donate);
+ using (Process.Start(About.Donate)){}
return;
}
@@ -684,7 +716,9 @@ namespace UVtools.GUI
switch (result)
{
case DialogResult.OK:
- Process.Start("https://www.prusa3d.com/prusaslicer/");
+ using (Process.Start("https://www.prusa3d.com/prusaslicer/"))
+ { }
+
return;
default:
return;
@@ -700,6 +734,12 @@ namespace UVtools.GUI
}
}
+ if (ReferenceEquals(sender, menuNewVersion))
+ {
+ using (Process.Start(menuNewVersion.Tag.ToString())) { }
+ return;
+ }
+
/************************
* Thumbnail Menu *
***********************/
@@ -818,7 +858,7 @@ namespace UVtools.GUI
"Properties save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(dialog.FileName);
+ using (Process.Start(dialog.FileName)){}
}
}
@@ -850,7 +890,7 @@ namespace UVtools.GUI
"GCode save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(dialog.FileName);
+ using (Process.Start(dialog.FileName)){}
}
}
@@ -938,9 +978,13 @@ namespace UVtools.GUI
}
else if (issue.Type == LayerIssue.IssueType.ResinTrap)
{
- var contours = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels));
- CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1);
- //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2);
+ using (var contours =
+ new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)))
+ {
+ CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1);
+ //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2);
+ }
+
edited = true;
}
@@ -1004,7 +1048,7 @@ namespace UVtools.GUI
if (MessageBox.Show("Are you sure you want to compute issues?", "Issues Compute",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return;
- ComputeIssues();
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
return;
}
@@ -1012,11 +1056,27 @@ namespace UVtools.GUI
/************************
* Layer Menu *
***********************/
- if (ReferenceEquals(sender, tsLayerImageRotate) || ReferenceEquals(sender, tsLayerImageLayerDifference) ||
+ if (ReferenceEquals(sender, tsLayerImageRotate) ||
+ ReferenceEquals(sender, tsLayerImageLayerDifference) ||
ReferenceEquals(sender, tsLayerImageHighlightIssues) ||
- ReferenceEquals(sender, tsLayerImageLayerOutline))
+ ReferenceEquals(sender, tsLayerImageLayerOutlinePrintVolumeBounds) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineLayerBounds) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineHollowAreas) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineEdgeDetection)
+
+ )
{
ShowLayer();
+ if (ReferenceEquals(sender, tsLayerImageRotate))
+ {
+ ZoomToFit();
+ }
+ return;
+ }
+
+ if (ReferenceEquals(sender, tsLayerImageLayerOutline))
+ {
+ tsLayerImageLayerOutline.ShowDropDown();
return;
}
@@ -1231,7 +1291,7 @@ namespace UVtools.GUI
if (issue.Type == LayerIssue.IssueType.TouchingBound)
{
- pbLayer.ZoomToFit();
+ ZoomToFit();
}
else if (issue.X >= 0 && issue.Y >= 0)
{
@@ -1448,7 +1508,10 @@ namespace UVtools.GUI
lbInitialLayer.Text = $"{SlicerFile.LayerHeight}mm\n0";
- tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width;
+ if (Settings.Default.LayerAutoRotateBestView)
+ {
+ tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width;
+ }
if (!ReferenceEquals(SlicerFile.ConvertToFormats, null))
{
@@ -1464,7 +1527,7 @@ namespace UVtools.GUI
new ToolStripMenuItem(fileFormat.GetType().Name.Replace("File", extensions))
{
Tag = fileFormat,
- Image = Properties.Resources.layers_16x16
+ Image = Resources.layers_16x16
};
menuItem.Click += ConvertToItemOnClick;
menuFileConvert.DropDownItems.Add(menuItem);
@@ -1542,16 +1605,24 @@ namespace UVtools.GUI
RefreshInfo();
- pbLayer.ZoomToFit();
+ if (Settings.Default.LayerZoomToFit)
+ {
+ ZoomToFit();
+ }
UpdateTitle();
+
+ if (Settings.Default.ComputeIssuesOnLoad)
+ {
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
+ }
}
void UpdateTitle()
{
- Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} Version: {FrmAbout.AssemblyVersion}";
+ Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} ({FrmLoading.StopWatch.ElapsedMilliseconds}ms) Version: {FrmAbout.AssemblyVersion}";
}
-
+
void RefreshInfo()
{
menuEdit.DropDownItems.Clear();
@@ -1686,65 +1757,22 @@ namespace UVtools.GUI
Stopwatch watch = Stopwatch.StartNew();
ActualLayerImage?.Dispose();
- ActualLayerImageBgr?.Dispose();
ActualLayerImage = SlicerFile[layerNum].LayerMat;
- ActualLayerImageBgr = new Mat();
+
CvInvoke.CvtColor(ActualLayerImage, ActualLayerImageBgr, ColorConversion.Gray2Bgr);
var imageSpan = ActualLayerImage.GetPixelSpan<byte>();
var imageBgrSpan = ActualLayerImageBgr.GetPixelSpan<byte>();
- if (tsLayerImageLayerOutline.Checked)
- {
-#if DEBUG
- using (Mat grayscale = new Mat())
- {
- CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary);
- using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
- {
- using (Mat hierarchy = new Mat())
- {
- CvInvoke.FindContours(grayscale, contours, hierarchy, RetrType.Ccomp,
- ChainApproxMethod.ChainApproxSimple);
- /*
- * hierarchy[i][0]: the index of the next contour of the same level
- * hierarchy[i][1]: the index of the previous contour of the same level
- * hierarchy[i][2]: the index of the first child
- * hierarchy[i][3]: the index of the parent
- */
- var arr = hierarchy.GetData();
- for (int i = 0; i < contours.Size; i++)
- {
- //if ((int)arr.GetValue(0, i, 2) == -1 && (int)arr.GetValue(0, i, 3) > -1) continue;
- /*Debug.WriteLine($"[0] {arr.GetValue(0, i, 0)}");
- Debug.WriteLine($"[1] {arr.GetValue(0, i, 1)}");
- Debug.WriteLine($"[2] {arr.GetValue(0, i, 2)}");
- Debug.WriteLine($"[3] {arr.GetValue(0, i, 3)}");*/
- //if ((int)arr.GetValue(0, i, 2) > -1 || (int)arr.GetValue(0, i, 3) > -1) continue;
- //if (((int)arr.GetValue(0, i, 2) > -1 && (int)arr.GetValue(0, i, 3) > -1)) continue;
-
- // if ((int) arr.GetValue(0, i, 3) >= 0) continue;
- if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1)
- continue;
- var r = CvInvoke.BoundingRectangle(contours[i]);
- CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 5);
- CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(125, 125, 125), -1);
-
- //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
- // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1);
- }
- }
- }
- }
-#else
+ if (tsLayerImageLayerOutlineEdgeDetection.Checked)
+ {
using (var grayscale = new Mat())
{
CvInvoke.Canny(ActualLayerImage, grayscale, 80, 40, 3, true);
CvInvoke.CvtColor(grayscale, ActualLayerImageBgr, ColorConversion.Gray2Bgr);
}
-#endif
}
else if (tsLayerImageLayerDifference.Checked)
{
@@ -1759,27 +1787,26 @@ namespace UVtools.GUI
for (int pixel = 0; pixel < imageSpan.Length; pixel++)
{
- if (imageSpan[pixel] == 0)
+ if (imageSpan[pixel] != 0) continue;
+ Color color = Color.Empty;
+ if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0)
{
- if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = 0; // B
- imageBgrSpan[pixel * 3 + 1] = 0; // G
- imageBgrSpan[pixel * 3 + 2] = 255; // R
- }
- else if (previousSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = previousSpan[pixel]; // B
- imageBgrSpan[pixel * 3 + 1] = 0; // G
- imageBgrSpan[pixel * 3 + 2] = previousSpan[pixel]; // R
- }
- else if (nextSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = nextSpan[pixel]; // B
- imageBgrSpan[pixel * 3 + 1] = nextSpan[pixel]; // G
- imageBgrSpan[pixel * 3 + 2] = 0; // R
- }
+ color = Settings.Default.PreviousNextLayerColor;
+ }
+ else if (previousSpan[pixel] > 0)
+ {
+ color = Settings.Default.PreviousLayerColor;
+ }
+ else if (nextSpan[pixel] > 0)
+ {
+ color = Settings.Default.NextLayerColor;
}
+
+ if (color.IsEmpty) continue;
+ var bgrPixel = pixel * 3;
+ imageBgrSpan[bgrPixel] = color.B; // B
+ imageBgrSpan[++bgrPixel] = color.G; // G
+ imageBgrSpan[++bgrPixel] = color.R; // R
}
}
}
@@ -1790,54 +1817,111 @@ namespace UVtools.GUI
!ReferenceEquals(Issues, null) &&
Issues.TryGetValue(ActualLayer, out var issues))
{
- byte brightness;
-
foreach (var issue in issues)
{
if (ReferenceEquals(issue, null)) continue; // Removed issue
if(!issue.HaveValidPoint) continue;
-
+ Color color = Settings.Default.ResinTrapColor;
+
if (issue.Type == LayerIssue.IssueType.ResinTrap)
{
- CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 180, 255), -1);
- //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1);
-
+ using (var vec = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)))
+ {
+ CvInvoke.DrawContours(ActualLayerImageBgr, vec, -1,
+ new MCvScalar(color.B, color.G, color.R), -1);
+ //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1);
+ }
+
continue;
}
foreach (var pixel in issue)
{
int pixelPos = ActualLayerImage.GetPixelPos(pixel);
+ byte brightness = imageSpan[pixelPos];
+ if (brightness == 0) continue;
+
int pixelBgrPos = pixelPos*ActualLayerImageBgr.NumberOfChannels;
+
+
switch (issue.Type)
{
- /*case LayerIssue.IssueType.ResinTrap:
- break;*/
case LayerIssue.IssueType.Island:
- brightness = imageSpan[pixelPos];
- if (brightness == 0) continue;
- // alpha, Color.Yellow
- brightness = Math.Max((byte)80, brightness);
- imageBgrSpan[pixelBgrPos] = 0; // B
- imageBgrSpan[pixelBgrPos + 1] = brightness; // G
- imageBgrSpan[pixelBgrPos + 2] = brightness; // R
+ color = Settings.Default.IslandColor;
break;
- default:
- brightness = imageSpan[pixelPos];
- if (brightness == 0) continue;
- // alpha, Color.Yellow
- brightness = Math.Max((byte)80, brightness);
- imageBgrSpan[pixelBgrPos] = 0; // B
- imageBgrSpan[pixelBgrPos + 1] = 0; // G
- imageBgrSpan[pixelBgrPos + 2] = brightness; // R
+ case LayerIssue.IssueType.TouchingBound:
+ color = Settings.Default.TouchingBoundsColor;
break;
}
-
+
+
+ var newColor = color.FactorColor(brightness, 80);
+
+ imageBgrSpan[pixelBgrPos] = newColor.B; // B
+ imageBgrSpan[pixelBgrPos + 1] = newColor.G; // G
+ imageBgrSpan[pixelBgrPos + 2] = newColor.R; // R
}
}
}
+ if (tsLayerImageLayerOutlinePrintVolumeBounds.Checked)
+ {
+ CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile.LayerManager.BoundingRectangle,
+ new MCvScalar(Settings.Default.OutlinePrintVolumeBoundsColor.B, Settings.Default.OutlinePrintVolumeBoundsColor.G, Settings.Default.OutlinePrintVolumeBoundsColor.R), Settings.Default.OutlinePrintVolumeBoundsLineThickness);
+ }
+
+ if (tsLayerImageLayerOutlineLayerBounds.Checked)
+ {
+ CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile[layerNum].BoundingRectangle,
+ new MCvScalar(Settings.Default.OutlineLayerBoundsColor.B, Settings.Default.OutlineLayerBoundsColor.G, Settings.Default.OutlineLayerBoundsColor.R), Settings.Default.OutlineLayerBoundsLineThickness);
+ }
+
+ if (tsLayerImageLayerOutlineHollowAreas.Checked)
+ {
+ using (Mat grayscale = new Mat())
+ {
+ //CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary);
+ using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
+ {
+ using (Mat hierarchy = new Mat())
+ {
+ CvInvoke.FindContours(ActualLayerImage, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
+
+ /*
+ * hierarchy[i][0]: the index of the next contour of the same level
+ * hierarchy[i][1]: the index of the previous contour of the same level
+ * hierarchy[i][2]: the index of the first child
+ * hierarchy[i][3]: the index of the parent
+ */
+ var arr = hierarchy.GetData();
+ for (int i = 0; i < contours.Size; i++)
+ {
+ if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
+ {
+ //var r = CvInvoke.BoundingRectangle(contours[i]);
+ //CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 2);
+ CvInvoke.DrawContours(ActualLayerImageBgr, contours, i,
+ new MCvScalar(Settings.Default.OutlineHollowAreasColor.B,
+ Settings.Default.OutlineHollowAreasColor.G, Settings.Default.OutlineHollowAreasColor.R),
+ Settings.Default.OutlineHollowAreasLineThickness);
+ }
+ /*else
+ {
+ CvInvoke.DrawContours(ActualLayerImageBgr, contours, i,
+ new MCvScalar(Settings.Default.ResinTrapColor.B,
+ Settings.Default.IslandColor.G, Settings.Default.IslandColor.R),
+ 2);
+ }*/
+
+ //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
+ // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1);
+ }
+ }
+ }
+ }
+ }
+
if (tsLayerImageRotate.Checked)
{
CvInvoke.Rotate(ActualLayerImageBgr, ActualLayerImageBgr, RotateFlags.Rotate90Clockwise);
@@ -1936,8 +2020,8 @@ namespace UVtools.GUI
{
if(ReferenceEquals(tabControlLeft.SelectedTab, tabPageIssues))
{
- if (!ReferenceEquals(tabPageIssues.Tag, null)) return;
- ComputeIssues();
+ if (!ReferenceEquals(tabPageIssues.Tag, null) || !Settings.Default.AutoComputeIssuesClickOnTab) return;
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
}
return;
}
@@ -2056,7 +2140,48 @@ namespace UVtools.GUI
return;
}
}
-#endregion
+
+ private void EventMouseDown(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ {
+ layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer);
+ layerScrollTimer.Start();
+ return;
+ }
+ }
+
+ private void EventMouseUp(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ {
+ layerScrollTimer.Stop();
+ return;
+ }
+ }
+
+ private void EventTimerTick(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, layerScrollTimer))
+ {
+ ShowLayer((bool)layerScrollTimer.Tag);
+ return;
+ }
+ }
+
+ private void EventMouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, pbLayer))
+ {
+ if ((e.Button & MouseButtons.Left) != 0)
+ {
+ ZoomToFit();
+ return;
+ }
+ return;
+ }
+ }
+ #endregion
@@ -2104,7 +2229,7 @@ namespace UVtools.GUI
- public void MutateLayers(Mutation.Mutates type)
+ public void MutateLayers(LayerManager.Mutate mutator)
{
uint layerStart;
uint layerEnd;
@@ -2115,10 +2240,10 @@ namespace UVtools.GUI
double x = 0;
double y = 0;
- switch (type)
+ switch (mutator)
{
- case Mutation.Mutates.Resize:
- using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[type]))
+ case LayerManager.Mutate.Resize:
+ using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[mutator]))
{
if (inputBox.ShowDialog() != DialogResult.OK) return;
layerStart = inputBox.LayerRangeStart;
@@ -2129,8 +2254,27 @@ namespace UVtools.GUI
}
break;
+ case LayerManager.Mutate.Flip:
+ using (FrmMutationOneComboBox inputBox = new FrmMutationOneComboBox(Mutations[mutator]))
+ {
+ if (inputBox.ShowDialog() != DialogResult.OK) return;
+ layerStart = inputBox.LayerRangeStart;
+ layerEnd = inputBox.LayerRangeEnd;
+ iterationsStart = (uint) inputBox.SelectedValue;
+ fade = inputBox.MakeCopy;
+ }
+ break;
+ case LayerManager.Mutate.Rotate:
+ using (FrmMutationOneNumericalInput inputBox = new FrmMutationOneNumericalInput(Mutations[mutator]))
+ {
+ if (inputBox.ShowDialog() != DialogResult.OK) return;
+ layerStart = inputBox.LayerRangeStart;
+ layerEnd = inputBox.LayerRangeEnd;
+ x = (double) inputBox.Value;
+ }
+ break;
default:
- using (FrmMutation inputBox = new FrmMutation(Mutations[type]))
+ using (FrmMutation inputBox = new FrmMutation(Mutations[mutator]))
{
if (inputBox.ShowDialog() != DialogResult.OK) return;
iterationsStart = inputBox.Iterations;
@@ -2146,34 +2290,53 @@ namespace UVtools.GUI
DisableGUI();
- FrmLoading.SetDescription($"Mutating - {type}");
+ FrmLoading.SetDescription($"Mutating - {mutator}");
Task<bool> task = Task<bool>.Factory.StartNew(() =>
{
bool result = false;
try
{
- switch (type)
+ switch (mutator)
{
- case Mutation.Mutates.Resize:
+ case LayerManager.Mutate.Resize:
SlicerFile.LayerManager.MutateResize(layerStart, layerEnd, x / 100.0, y / 100.0, fade);
break;
- case Mutation.Mutates.Solidify:
+ case LayerManager.Mutate.Flip:
+ FlipType flipType = FlipType.Horizontal;
+ switch (iterationsStart)
+ {
+ case 0:
+ flipType = FlipType.Horizontal;
+ break;
+ case 1:
+ flipType = FlipType.Vertical;
+ break;
+ case 2:
+ flipType = FlipType.Horizontal | FlipType.Vertical;
+ break;
+ }
+ SlicerFile.LayerManager.MutateFlip(layerStart, layerEnd, flipType, fade);
+ break;
+ case LayerManager.Mutate.Rotate:
+ SlicerFile.LayerManager.MutateRotate(layerStart, layerEnd, x);
+ break;
+ case LayerManager.Mutate.Solidify:
SlicerFile.LayerManager.MutateSolidify(layerStart, layerEnd);
break;
- case Mutation.Mutates.Erode:
+ case LayerManager.Mutate.Erode:
SlicerFile.LayerManager.MutateErode(layerStart, layerEnd, (int) iterationsStart, (int) iterationsEnd, fade);
break;
- case Mutation.Mutates.Dilate:
+ case LayerManager.Mutate.Dilate:
SlicerFile.LayerManager.MutateDilate(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Opening:
+ case LayerManager.Mutate.Opening:
SlicerFile.LayerManager.MutateOpen(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Closing:
+ case LayerManager.Mutate.Closing:
SlicerFile.LayerManager.MutateClose(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Gradient:
+ case LayerManager.Mutate.Gradient:
SlicerFile.LayerManager.MutateGradient(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
/*case Mutation.Mutates.TopHat:
@@ -2192,13 +2355,13 @@ namespace UVtools.GUI
CvInvoke.MorphologyEx(image, image, MorphOp.HitMiss, Program.KernelFindIsolated,
new Point(-1, -1), (int) iterations, BorderType.Default, new MCvScalar());
break;*/
- case Mutation.Mutates.PyrDownUp:
+ case LayerManager.Mutate.PyrDownUp:
SlicerFile.LayerManager.MutatePyrDownUp(layerStart, layerEnd);
break;
- case Mutation.Mutates.SmoothMedian:
+ case LayerManager.Mutate.SmoothMedian:
SlicerFile.LayerManager.MutateMedianBlur(layerStart, layerEnd, (int)iterationsStart);
break;
- case Mutation.Mutates.SmoothGaussian:
+ case LayerManager.Mutate.SmoothGaussian:
SlicerFile.LayerManager.MutateGaussianBlur(layerStart, layerEnd, new Size((int) iterationsStart, (int) iterationsStart));
break;
}
@@ -2252,7 +2415,7 @@ namespace UVtools.GUI
}
- private void ComputeIssues()
+ private void ComputeIssues(IslandDetectionConfiguration islandConfig = null, ResinTrapDetectionConfiguration resinTrapConfig = null)
{
tabPageIssues.Tag = true;
TotalIssues = 0;
@@ -2269,7 +2432,7 @@ namespace UVtools.GUI
bool result = false;
try
{
- var issues = SlicerFile.LayerManager.GetAllIssues();
+ var issues = SlicerFile.LayerManager.GetAllIssues(islandConfig, resinTrapConfig);
Issues = new Dictionary<uint, List<LayerIssue>>();
for (uint i = 0; i < SlicerFile.LayerCount; i++)
@@ -2337,32 +2500,53 @@ namespace UVtools.GUI
ShowLayer();
}
- private void EventMouseDown(object sender, MouseEventArgs e)
+ private void ZoomToFit()
{
- if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ if (ReferenceEquals(SlicerFile, null)) return;
+ if (Settings.Default.ZoomToFitPrintVolumeBounds)
{
- layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer);
- layerScrollTimer.Start();
- return;
+ if (!tsLayerImageRotate.Checked)
+ {
+ pbLayer.ZoomToRegion(SlicerFile.LayerManager.BoundingRectangle);
+ }
+ else
+ {
+ pbLayer.ZoomToRegion(ActualLayerImage.Height - 1 - SlicerFile.LayerManager.BoundingRectangle.Bottom,
+ SlicerFile.LayerManager.BoundingRectangle.X,
+ SlicerFile.LayerManager.BoundingRectangle.Height,
+ SlicerFile.LayerManager.BoundingRectangle.Width
+ );
+ }
+ }
+ else
+ {
+ pbLayer.ZoomToFit();
}
}
- private void EventMouseUp(object sender, MouseEventArgs e)
+ public IslandDetectionConfiguration GetIslandDetectionConfiguration()
{
- if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
- {
- layerScrollTimer.Stop();
- return;
- }
+ return new IslandDetectionConfiguration
+ {
+ Enabled = tsIsuesRefreshIslands.Checked,
+ BinaryThreshold = Settings.Default.IslandBinaryThreshold,
+ RequiredAreaToProcessCheck = Settings.Default.IslandRequiredAreaToProcessCheck,
+ RequiredPixelBrightnessToProcessCheck = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck,
+ RequiredPixelsToSupport = Settings.Default.IslandRequiredPixelsToSupport,
+ RequiredPixelBrightnessToSupport = Settings.Default.IslandRequiredPixelBrightnessToSupport
+ };
}
- private void EventTimerTick(object sender, EventArgs e)
+ public ResinTrapDetectionConfiguration GetResinTrapDetectionConfiguration()
{
- if (ReferenceEquals(sender, layerScrollTimer))
+ return new ResinTrapDetectionConfiguration
{
- ShowLayer((bool)layerScrollTimer.Tag);
- return;
- }
+ Enabled = tsIsuesRefreshResinTraps.Checked,
+ BinaryThreshold = Settings.Default.ResinTrapBinaryThreshold,
+ RequiredAreaToProcessCheck = Settings.Default.ResinTrapRequiredAreaToProcessCheck,
+ RequiredBlackPixelsToDrain = Settings.Default.ResinTrapRequiredBlackPixelsToDrain,
+ MaximumPixelBrightnessToDrain = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain
+ };
}
}
}
diff --git a/UVtools.GUI/FrmMain.resx b/UVtools.GUI/FrmMain.resx
index a2492a8..1eff9b4 100644
--- a/UVtools.GUI/FrmMain.resx
+++ b/UVtools.GUI/FrmMain.resx
@@ -145,68 +145,68 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA4
- DgAAAk1TRnQBSQFMAgEBBAEAAUABBAFAAQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAs
+ DgAAAk1TRnQBSQFMAgEBBAEAAbgBBAG4AQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AZgADUAGjA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAWwBcwH1
- AUgBgQGHAfcDQwF3A1sByAJCAW8B9QJYAV8B4wNKAYwDCgENBAADVQG0A1kBxwMvAUkDAAEBAxsBJgMc
- AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpMAADUgGpEAADJwE6
- AzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDJwE6FAADBQEHA0wBkgFWAlgBwQMVAR0DPQFp
- AQUByAHzAf8BEwGQAeYB/wIpAdwB/wIpAd0B/wJeAeMB/wI0Ad4B/wIpAd0B/wJYAVsBywMGAQgDAAH/
- AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFR
- BAADUgGpBAADUAGdA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1ABnQwAA1IBqRAAA04B+wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A04B+xQAATACMQFNAQYByQHzAf8BBgHJAfQB/wFZAWIBZAHr
- AVsCXgHZAQkBwAHxAf8BKgEyAd8B/wIsAeAB/wIsAeAB/wJlAekB/wI3AeIB/wIsAeAB/wIsAeAB/wNA
- AXEDUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEW
- CAADUgGpBAADUAGdA1MBqgNTAaoDHwEsHAADUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/xQAAwcBCgFWAWkBbwHyAQgBygH0Af8BCAHKAfQB/wEIAcoB9AH/ARQBoQHuAf8CLwHj
- Af8CLwHjAf8CLwHjAf8CqQHvAf8CNgHjAf8CLwHjAf8CLwHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANS
- AakwAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6
- AWIBXAJgAdQBCQHLAfUB/wEJAcsB9QH/AQkBywH1Af8BFwGgAfAB/wIyAeYB/wIyAeYB/wIyAeYB/wLC
- AfYB/wJKAegB/wIyAeYB/wIyAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3
- A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wwAAUsCTAGQAQoBywH2Af8BCgHLAfYB/wEKAcsB9gH/AQoBywH2Af8BKQGGAZwB+gND
- AXgDIgEyAksBmAH7AjUB6QH/AjUB6QH/As0B+AH/AlkB7QH/AjUB6QH/AjUB6QH/A1ABngMAAf4DAAH/
- A0MBdwMeASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANS
- AakDNAFVAzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wwAA1EBoAEMAcwB9wH/AQwBzAH3Af8BDAHMAfcB/wEMAcwB9wH/A0MBdwgAA0oBjQI4AewB/wI4
- AewB/wJUAe8B/wI8AewB/wI4AewB/wE0AUUB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0
- AVUDRgGAA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BfwGQAfgBDQHNAfcB/wENAc0B9wH/
- AxIBGAgAAwEBAgNGAX4CUgFnAfACOwHuAf8BOwE8Ae4B/wFAAU4BugH9AUUCRgF+AwMBBAMzAVMDPAFn
- AxQBHDgAA1IBqQM0AVUDNAFVAz8BbgMyAVAQAAMnATsDRAF8AzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJAAW8BPgF/AZAB+AEOAc4B+AH/AQ4BzgH4
- Af8DEgEYEAADFwEgARUBvAH3Af8BEgHEAfcB/wE6Aa4BvAH9AUUCRgF+AwMBBAMAAf4DAAH/A0MBdwMf
- ASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV
- AzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABEAHOAfgB/wEQAc8B+QH/ARABzwH5Af8BEAHP
- AfkB/wNDAXcQAANEAXoBEAHPAfkB/wEQAc8B+QH/ARABzwH5Af8BEAHOAfgB/wFSAlMBqANSAfQDAAH/
- Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMUARsEAANS
- AakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABEQHQAfoB/wERAdAB+gH/AREB0AH6
- Af8BEQHQAfoB/wEpAYYBnAH6A0MBeAMSARkDEwEaA0QBegEoAZEBnQH7AREB0AH6Af8BEQHQAfoB/wER
- AdAB+gH/AREB0AH6Af8DSgGMAwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMKAQ4EAAM5
- AV8DXAHOAygBPAQAAzQBVQM0AVUDUgGpEwAB/wOCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHf
- AxcBIAwAAxUBHQM9AWkDOgFiAVwCYAHUARIB0QH6Af8BEgHRAfoB/wESAdAB+gH/ARIBywHzAf8BEgHL
- AfMB/wESAdAB+gH/ARIB0QH6Af8BEgHRAfoB/wFdAmEB4gM6AWIDPQFpAxQBHANRAaIDVgG2AyoBQAQA
- AxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANSAakDNAFVAzQBVQMz
- AVMDUgGmA0oBjAcAAQEDRwGDCAADNAFVAzQBVQNSAakTAAH/A5kB/wOFAf8DAAH/AwAB/wMAAf8DAAH/
- A1wB3wMXASAYAAMHAQoBWAFpAW8B8gEUAdIB+wH/ARQB0gH7Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7
- Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7Af8BKwGSAZ0B+wMRARcLAAH/AwAB/wNDAXcDKQE+AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFRBAADUgGpAzQBVQM0AVUDEQEX
- A1ABngMkATYUAAM0AVUDNAFVA1IBqRAAA1AB+wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAcAAEw
- AjEBTQEVAdIB/AH/ARUB0gH8Af8BWQFjAWYB6wFbAl4B2QEVAdIB/AH/ARUB0gH8Af8BWwJhAeEBXQJh
- AeIBFQHSAfwB/wEVAdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEn
- AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMF
- AQcDTAGSAVYCWAHBAxUBHQM9AWkBFgHTAfwB/wEWAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEG
- TAADUAGjA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wA
- AxUBHQFCAW8BewH1AVEBhQGKAfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB
- FgAD/4EAAv8BgAEBAv8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEA
- AR8B/wG/Af0B4AEHBAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHB
- AeABBwEDAcACAAGAAUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEP
- AcABAwIAAYEB8QHgAR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVkBXgH1
+ AVECbQH3A0MBdwNbAcgCQgFaAfUCWAFfAeMDSgGMAwoBDQQAA1UBtANZAccDLwFJAwABAQMbASYDHAEn
+ AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqTAAA1IBqRAAAycBOgMw
+ AUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAycBOhQAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEA
+ AcgB8wH/AQQBkAHmAf8CGgHcAf8CGgHdAf8CTwHjAf8CJQHeAf8CGgHdAf8CWAFbAcsDBgEIAwAB/wMA
+ Af8DQwF3AykBPgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AzIBUQQA
+ A1IBqQQAA1ABnQNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNQAZ0MAANSAakQAANOAfsDAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wNOAfsUAAEwAjEBTQEAAckB8wH/AQAByQH0Af8BWQJgAesBWwJe
+ AdkBAAHAAfEB/wEbASMB3wH/Ah0B4AH/Ah0B4AH/AlYB6QH/AigB4gH/Ah0B4AH/Ah0B4AH/A0ABcQNR
+ AaIDVgG2AyoBQAQAAxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANS
+ AakEAANQAZ0DUwGqA1MBqgMfASwcAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/FAADBwEKAVkCZwHyAQABygH0Af8BAAHKAfQB/wEAAcoB9AH/AQUBoQHuAf8CIAHjAf8CIAHj
+ Af8CIAHjAf8CqQHvAf8CJwHjAf8CIAHjAf8CIAHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANSAakwAANS
+ AakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6AWIBXAJg
+ AdQBAAHLAfUB/wEAAcsB9QH/AQABywH1Af8BCAGgAfAB/wIjAeYB/wIjAeYB/wIjAeYB/wLCAfYB/wI7
+ AegB/wIjAeYB/wIjAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3A0MBdwND
+ AXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp
+ A1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wwAAUsCTAGQAQABywH2Af8BAAHLAfYB/wEAAcsB9gH/AQABywH2Af8BKQFyAXoB+gNDAXgDIgEy
+ AksBiAH7AiYB6QH/AiYB6QH/As0B+AH/AkoB7QH/AiYB6QH/AiYB6QH/A1ABngMAAf4DAAH/A0MBdwMe
+ ASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV
+ AzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwA
+ A1EBoAEAAcwB9wH/AQABzAH3Af8BAAHMAfcB/wEAAcwB9wH/A0MBdwgAA0oBjQIpAewB/wIpAewB/wJF
+ Ae8B/wItAewB/wIpAewB/wElATYB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0AVUDRgGA
+ A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHNAfcB/wEAAc0B9wH/AxIBGAgA
+ AwEBAgNGAX4CUgFdAfACLAHuAf8BLAEtAe4B/wJAAasB/QFFAkYBfgMDAQQDMwFTAzwBZwMUARw4AANS
+ AakDNAFVAzQBVQM/AW4DMgFQEAADJwE7A0QBfAM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHOAfgB/wEAAc4B+AH/AxIBGBAA
+ AxcBIAEGAbwB9wH/AQMBxAH3Af8BQAGoAa0B/QFFAkYBfgMDAQQDAAH+AwAB/wNDAXcDHwEsA1cBxQNZ
+ AccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNYAcYDJgE5BAADUgGpAzQBVQM0AVUDBQEH
+ A1UBtQMRARcDUgGpAykBPgQAA1ABnwMRARcDNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/DAADUQGgAQEBzgH4Af8BAQHPAfkB/wEBAc8B+QH/AQEBzwH5Af8DQwF3
+ EAADRAF6AQEBzwH5Af8BAQHPAfkB/wEBAc8B+QH/AQEBzgH4Af8BUgJTAagDUgH0AwAB/wM+AWwDDgET
+ A0IBdQNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDFAEbBAADUgGpAzQBVQM0
+ AVUEAAM8AWgDVgG+AyMBNANVAbUDEgEZA1EBoAQAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/A1wB3wwAAUsCTAGQAQIB0AH6Af8BAgHQAfoB/wECAdAB+gH/AQIB0AH6
+ Af8BKQFyAXoB+gNDAXgDEgEZAxMBGgNEAXoBKAGCAYsB+wECAdAB+gH/AQIB0AH6Af8BAgHQAfoB/wEC
+ AdAB+gH/A0oBjAMKAQ4DEQEXAwABATgAA1IBqQM0AVUDNAFVAwABAQMtAUYDCgEOBAADOQFfA1wBzgMo
+ ATwEAAM0AVUDNAFVA1IBqRMAAf8DggH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAMAAMV
+ AR0DPQFpAzoBYgFcAmAB1AEDAdEB+gH/AQMB0QH6Af8BAwHQAfoB/wEDAcsB8wH/AQMBywHzAf8BAwHQ
+ AfoB/wEDAdEB+gH/AQMB0QH6Af8BXQJhAeIDOgFiAz0BaQMUARwDUQGiA1YBtgMqAUAEAAMQARUDEQEX
+ AxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEWCAADUgGpAzQBVQM0AVUDMwFTA1IBpgNK
+ AYwHAAEBA0cBgwgAAzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/AwAB/wMAAf8DAAH/AwAB/wNcAd8DFwEg
+ GAADBwEKAVkCZwHyAQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/AQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/
+ AQUB0gH7Af8BBQHSAfsB/wErAYMBiwH7AxEBFwsAAf8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakDNAFVAzQBVQMRARcDUAGeAyQBNhQA
+ AzQBVQM0AVUDUgGpEAADUAH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfAxcBIBwAATACMQFNAQYB0gH8
+ Af8BBgHSAfwB/wFZAmAB6wFbAl4B2QEGAdIB/AH/AQYB0gH8Af8BWwJhAeEBXQJhAeIBBgHSAfwB/wEG
+ AdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEn
+ AxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNS
+ AakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMFAQcDTAGSAVYCWAHB
+ AxUBHQM9AWkBBwHTAfwB/wEHAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEGTAADUAGjA1IBqQNS
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVoBYgH1
+ AVEBbQF0AfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8BgAEB
+ Av8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEAAR8B/wG/Af0B4AEH
+ BAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHBAeABBwEDAcACAAGA
+ AUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEPAcABAwIAAYEB8QHg
+ AR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L
</value>
</data>
<metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
diff --git a/UVtools.GUI/Images/settings-16x16.png b/UVtools.GUI/Images/settings-16x16.png
new file mode 100644
index 0000000..83e560c
--- /dev/null
+++ b/UVtools.GUI/Images/settings-16x16.png
Binary files differ
diff --git a/UVtools.GUI/Mutation.cs b/UVtools.GUI/Mutation.cs
index 0ae56d7..e9ba085 100644
--- a/UVtools.GUI/Mutation.cs
+++ b/UVtools.GUI/Mutation.cs
@@ -6,35 +6,15 @@
* of this license document, but changing it is not allowed.
*/
using System.Drawing;
+using UVtools.Core;
namespace UVtools.GUI
{
public class Mutation
{
- #region Enum
- public enum Mutates : byte
- {
- Resize,
- Solidify,
- //LayerSmash,
- Erode,
- Dilate,
- Opening,
- Closing,
- Gradient,
- TopHat,
- BlackHat,
- HitMiss,
- PyrDownUp,
- SmoothMedian,
- SmoothGaussian,
-
- }
- #endregion
-
#region Properties
- public Mutates Mutate { get; }
+ public LayerManager.Mutate Mutate { get; }
public string Description { get; }
@@ -43,7 +23,7 @@ namespace UVtools.GUI
#region Constructor
- public Mutation(Mutates mutate, string description, Image image = null)
+ public Mutation(LayerManager.Mutate mutate, string description, Image image = null)
{
Mutate = mutate;
Description = description;
diff --git a/UVtools.GUI/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs
index d20e24b..67e7df1 100644
--- a/UVtools.GUI/Properties/Resources.Designer.cs
+++ b/UVtools.GUI/Properties/Resources.Designer.cs
@@ -563,6 +563,16 @@ namespace UVtools.GUI.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap settings_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("settings-16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap UVtools {
get {
object obj = ResourceManager.GetObject("UVtools", resourceCulture);
diff --git a/UVtools.GUI/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx
index a53bad9..00ef478 100644
--- a/UVtools.GUI/Properties/Resources.resx
+++ b/UVtools.GUI/Properties/Resources.resx
@@ -121,14 +121,17 @@
<data name="Error-128x128" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Error-128x128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-top-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-top-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="eye-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -163,9 +166,6 @@
<data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Wrench-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Wrench-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -178,8 +178,8 @@
<data name="arrow-up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-up.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Ok-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Ok-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -187,6 +187,9 @@
<data name="Button-Info-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Button-Info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Next-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Next-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -199,11 +202,14 @@
<data name="Open-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Open-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="File-Close-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\File-Close-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Cancel-32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Cancel-32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -211,20 +217,17 @@
<data name="eye-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Geometry-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\plus.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -247,23 +250,23 @@
<data name="checkbox-unmarked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\checkbox-unmarked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="delete-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\delete-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
- <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
- <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mutation_blackhat" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_blackhat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-down.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -274,7 +277,7 @@
<data name="island-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\island-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="settings-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\settings-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> \ No newline at end of file
diff --git a/UVtools.GUI/Properties/Settings.Designer.cs b/UVtools.GUI/Properties/Settings.Designer.cs
index c398559..6cc1d6a 100644
--- a/UVtools.GUI/Properties/Settings.Designer.cs
+++ b/UVtools.GUI/Properties/Settings.Designer.cs
@@ -22,5 +22,425 @@ namespace UVtools.GUI.Properties {
return defaultInstance;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Red")]
+ public global::System.Drawing.Color PreviousNextLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["PreviousNextLayerColor"]));
+ }
+ set {
+ this["PreviousNextLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Yellow")]
+ public global::System.Drawing.Color IslandColor {
+ get {
+ return ((global::System.Drawing.Color)(this["IslandColor"]));
+ }
+ set {
+ this["IslandColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Orange")]
+ public global::System.Drawing.Color ResinTrapColor {
+ get {
+ return ((global::System.Drawing.Color)(this["ResinTrapColor"]));
+ }
+ set {
+ this["ResinTrapColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Red")]
+ public global::System.Drawing.Color TouchingBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["TouchingBoundsColor"]));
+ }
+ set {
+ this["TouchingBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Magenta")]
+ public global::System.Drawing.Color PreviousLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["PreviousLayerColor"]));
+ }
+ set {
+ this["PreviousLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Cyan")]
+ public global::System.Drawing.Color NextLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["NextLayerColor"]));
+ }
+ set {
+ this["NextLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UpdateSettings {
+ get {
+ return ((bool)(this["UpdateSettings"]));
+ }
+ set {
+ this["UpdateSettings"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool StartMaximized {
+ get {
+ return ((bool)(this["StartMaximized"]));
+ }
+ set {
+ this["StartMaximized"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool CheckForUpdatesOnStartup {
+ get {
+ return ((bool)(this["CheckForUpdatesOnStartup"]));
+ }
+ set {
+ this["CheckForUpdatesOnStartup"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool LayerAutoRotateBestView {
+ get {
+ return ((bool)(this["LayerAutoRotateBestView"]));
+ }
+ set {
+ this["LayerAutoRotateBestView"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool LayerDifferenceDefault {
+ get {
+ return ((bool)(this["LayerDifferenceDefault"]));
+ }
+ set {
+ this["LayerDifferenceDefault"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool ComputeIssuesOnLoad {
+ get {
+ return ((bool)(this["ComputeIssuesOnLoad"]));
+ }
+ set {
+ this["ComputeIssuesOnLoad"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool LayerZoomToFit {
+ get {
+ return ((bool)(this["LayerZoomToFit"]));
+ }
+ set {
+ this["LayerZoomToFit"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ComputeIslands {
+ get {
+ return ((bool)(this["ComputeIslands"]));
+ }
+ set {
+ this["ComputeIslands"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ComputeResinTraps {
+ get {
+ return ((bool)(this["ComputeResinTraps"]));
+ }
+ set {
+ this["ComputeResinTraps"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public byte IslandRequiredAreaToProcessCheck {
+ get {
+ return ((byte)(this["IslandRequiredAreaToProcessCheck"]));
+ }
+ set {
+ this["IslandRequiredAreaToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public byte IslandRequiredPixelBrightnessToProcessCheck {
+ get {
+ return ((byte)(this["IslandRequiredPixelBrightnessToProcessCheck"]));
+ }
+ set {
+ this["IslandRequiredPixelBrightnessToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("10")]
+ public byte IslandRequiredPixelsToSupport {
+ get {
+ return ((byte)(this["IslandRequiredPixelsToSupport"]));
+ }
+ set {
+ this["IslandRequiredPixelsToSupport"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("150")]
+ public byte IslandRequiredPixelBrightnessToSupport {
+ get {
+ return ((byte)(this["IslandRequiredPixelBrightnessToSupport"]));
+ }
+ set {
+ this["IslandRequiredPixelBrightnessToSupport"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("17")]
+ public byte ResinTrapRequiredAreaToProcessCheck {
+ get {
+ return ((byte)(this["ResinTrapRequiredAreaToProcessCheck"]));
+ }
+ set {
+ this["ResinTrapRequiredAreaToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("10")]
+ public byte ResinTrapRequiredBlackPixelsToDrain {
+ get {
+ return ((byte)(this["ResinTrapRequiredBlackPixelsToDrain"]));
+ }
+ set {
+ this["ResinTrapRequiredBlackPixelsToDrain"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("30")]
+ public byte ResinTrapMaximumPixelBrightnessToDrain {
+ get {
+ return ((byte)(this["ResinTrapMaximumPixelBrightnessToDrain"]));
+ }
+ set {
+ this["ResinTrapMaximumPixelBrightnessToDrain"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool AutoComputeIssuesClickOnTab {
+ get {
+ return ((bool)(this["AutoComputeIssuesClickOnTab"]));
+ }
+ set {
+ this["AutoComputeIssuesClickOnTab"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Lime")]
+ public global::System.Drawing.Color OutlinePrintVolumeBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlinePrintVolumeBoundsColor"]));
+ }
+ set {
+ this["OutlinePrintVolumeBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public byte OutlinePrintVolumeBoundsLineThickness {
+ get {
+ return ((byte)(this["OutlinePrintVolumeBoundsLineThickness"]));
+ }
+ set {
+ this["OutlinePrintVolumeBoundsLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Lime")]
+ public global::System.Drawing.Color OutlineLayerBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlineLayerBoundsColor"]));
+ }
+ set {
+ this["OutlineLayerBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public byte OutlineLayerBoundsLineThickness {
+ get {
+ return ((byte)(this["OutlineLayerBoundsLineThickness"]));
+ }
+ set {
+ this["OutlineLayerBoundsLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Orange")]
+ public global::System.Drawing.Color OutlineHollowAreasColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlineHollowAreasColor"]));
+ }
+ set {
+ this["OutlineHollowAreasColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public sbyte OutlineHollowAreasLineThickness {
+ get {
+ return ((sbyte)(this["OutlineHollowAreasLineThickness"]));
+ }
+ set {
+ this["OutlineHollowAreasLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool OutlinePrintVolumeBounds {
+ get {
+ return ((bool)(this["OutlinePrintVolumeBounds"]));
+ }
+ set {
+ this["OutlinePrintVolumeBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OutlineLayerBounds {
+ get {
+ return ((bool)(this["OutlineLayerBounds"]));
+ }
+ set {
+ this["OutlineLayerBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OutlineHollowAreas {
+ get {
+ return ((bool)(this["OutlineHollowAreas"]));
+ }
+ set {
+ this["OutlineHollowAreas"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ZoomToFitPrintVolumeBounds {
+ get {
+ return ((bool)(this["ZoomToFitPrintVolumeBounds"]));
+ }
+ set {
+ this["ZoomToFitPrintVolumeBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("127")]
+ public byte ResinTrapBinaryThreshold {
+ get {
+ return ((byte)(this["ResinTrapBinaryThreshold"]));
+ }
+ set {
+ this["ResinTrapBinaryThreshold"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public byte IslandBinaryThreshold {
+ get {
+ return ((byte)(this["IslandBinaryThreshold"]));
+ }
+ set {
+ this["IslandBinaryThreshold"] = value;
+ }
+ }
}
}
diff --git a/UVtools.GUI/Properties/Settings.settings b/UVtools.GUI/Properties/Settings.settings
index 3964565..1a40bbb 100644
--- a/UVtools.GUI/Properties/Settings.settings
+++ b/UVtools.GUI/Properties/Settings.settings
@@ -1,7 +1,111 @@
<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
- <Profiles>
- <Profile Name="(Default)" />
- </Profiles>
- <Settings />
-</SettingsFile>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="UVtools.GUI.Properties" GeneratedClassName="Settings">
+ <Profiles />
+ <Settings>
+ <Setting Name="PreviousNextLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Red</Value>
+ </Setting>
+ <Setting Name="IslandColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Yellow</Value>
+ </Setting>
+ <Setting Name="ResinTrapColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Orange</Value>
+ </Setting>
+ <Setting Name="TouchingBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Red</Value>
+ </Setting>
+ <Setting Name="PreviousLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Magenta</Value>
+ </Setting>
+ <Setting Name="NextLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Cyan</Value>
+ </Setting>
+ <Setting Name="UpdateSettings" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="StartMaximized" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="CheckForUpdatesOnStartup" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="LayerAutoRotateBestView" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="LayerDifferenceDefault" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="ComputeIssuesOnLoad" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="LayerZoomToFit" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ComputeIslands" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ComputeResinTraps" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="IslandRequiredAreaToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">1</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelBrightnessToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">1</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelsToSupport" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">10</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelBrightnessToSupport" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">150</Value>
+ </Setting>
+ <Setting Name="ResinTrapRequiredAreaToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">17</Value>
+ </Setting>
+ <Setting Name="ResinTrapRequiredBlackPixelsToDrain" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">10</Value>
+ </Setting>
+ <Setting Name="ResinTrapMaximumPixelBrightnessToDrain" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">30</Value>
+ </Setting>
+ <Setting Name="AutoComputeIssuesClickOnTab" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Lime</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBoundsLineThickness" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Lime</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBoundsLineThickness" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreasColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Orange</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreasLineThickness" Type="System.SByte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreas" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="ZoomToFitPrintVolumeBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ResinTrapBinaryThreshold" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">127</Value>
+ </Setting>
+ <Setting Name="IslandBinaryThreshold" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ </Settings>
+</SettingsFile> \ No newline at end of file
diff --git a/UVtools.GUI/UVtools.GUI.csproj b/UVtools.GUI/UVtools.GUI.csproj
index cb1c952..66274c8 100644
--- a/UVtools.GUI/UVtools.GUI.csproj
+++ b/UVtools.GUI/UVtools.GUI.csproj
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -63,9 +62,6 @@
<Reference Include="ApplicationManagement">
<HintPath>Libraries\ApplicationManagement.dll</HintPath>
</Reference>
- <Reference Include="BinarySerializer, Version=8.5.1.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\BinarySerializer.8.5.1\lib\net46\BinarySerializer.dll</HintPath>
- </Reference>
<Reference Include="Cyotek.Windows.Forms.ImageBox, Version=1.2.0.0, Culture=neutral, PublicKeyToken=58daa28b0b2de221, processorArchitecture=MSIL">
<HintPath>..\packages\CyotekImageBox.1.3.0-Alpha1\lib\net20\Cyotek.Windows.Forms.ImageBox.dll</HintPath>
</Reference>
@@ -75,9 +71,6 @@
<Reference Include="Emgu.CV.Platform.NetStandard, Version=4.3.0.3890, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL">
<HintPath>..\packages\Emgu.CV.4.3.0.3890\lib\net461\Emgu.CV.Platform.NetStandard.dll</HintPath>
</Reference>
- <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
- <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
- </Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
@@ -94,16 +87,6 @@
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
- <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
- <Private>True</Private>
- <Private>True</Private>
- </Reference>
- <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
- <Private>True</Private>
- <Private>True</Private>
- </Reference>
<Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
@@ -126,7 +109,7 @@
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.5.20278.1\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+ <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.6.20305.6\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath>
@@ -149,6 +132,18 @@
<Compile Include="Forms\FrmInstallPEProfiles.Designer.cs">
<DependentUpon>FrmInstallPEProfiles.cs</DependentUpon>
</Compile>
+ <Compile Include="Forms\FrmMutationOneNumericalInput.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneNumericalInput.Designer.cs">
+ <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneComoboBox.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneComoboBox.Designer.cs">
+ <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon>
+ </Compile>
<Compile Include="Forms\FrmMutationResize.cs">
<SubType>Form</SubType>
</Compile>
@@ -185,6 +180,12 @@
<Compile Include="Forms\FrmLoading.Designer.cs">
<DependentUpon>FrmLoading.cs</DependentUpon>
</Compile>
+ <Compile Include="Forms\FrmSettings.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmSettings.Designer.cs">
+ <DependentUpon>FrmSettings.cs</DependentUpon>
+ </Compile>
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
@@ -201,6 +202,12 @@
<EmbeddedResource Include="Forms\FrmInstallPEProfiles.resx">
<DependentUpon>FrmInstallPEProfiles.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmMutationOneNumericalInput.resx">
+ <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmMutationOneComoboBox.resx">
+ <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="Forms\FrmMutationResize.resx">
<DependentUpon>FrmMutationResize.cs</DependentUpon>
</EmbeddedResource>
@@ -216,6 +223,9 @@
<EmbeddedResource Include="Forms\FrmLoading.resx">
<DependentUpon>FrmLoading.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmSettings.resx">
+ <DependentUpon>FrmSettings.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
@@ -263,6 +273,7 @@
<None Include="Images\checkbox-unmarked-16x16.png" />
<None Include="Images\file-image-16x16.png" />
<None Include="Images\clipboard-16x16.png" />
+ <None Include="Images\settings-16x16.png" />
<Content Include="UVtools.ico" />
<None Include="UVtools.png" />
<None Include="Images\Exit-16x16.png" />
@@ -337,14 +348,14 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer</PostBuildEvent>
+ <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer
+xcopy /d /y $(ProjectDir)..\UVtools.Cmd\$(OutDir)netcoreapp3.1\* $(ProjectDir)$(OutDir)</PostBuildEvent>
</PropertyGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets'))" />
- <Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props'))" />
</Target>
<Import Project="..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets" Condition="Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" />
</Project> \ No newline at end of file
diff --git a/UVtools.GUI/packages.config b/UVtools.GUI/packages.config
index cb19e0e..1289075 100644
--- a/UVtools.GUI/packages.config
+++ b/UVtools.GUI/packages.config
@@ -1,24 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="BinarySerializer" version="8.5.1" targetFramework="net48" />
<package id="CyotekImageBox" version="1.3.0-Alpha1" targetFramework="net48" />
<package id="Emgu.CV" version="4.3.0.3890" targetFramework="net48" />
<package id="Emgu.CV.runtime.windows" version="4.3.0.3890" targetFramework="net48" />
- <package id="Microsoft.Net.Compilers.Toolset" version="3.7.0-2.final" targetFramework="net48" developmentDependency="true" />
- <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
- <package id="System.Collections" version="4.3.0" targetFramework="net48" />
<package id="System.IO" version="4.3.0" targetFramework="net48" />
- <package id="System.Linq" version="4.3.0" targetFramework="net48" />
- <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Reflection" version="4.3.0" targetFramework="net48" />
- <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.TypeExtensions" version="4.7.0" targetFramework="net48" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime" version="4.3.1" targetFramework="net48" />
- <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.5.20278.1" targetFramework="net48" />
+ <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.6.20305.6" targetFramework="net48" />
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net48" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Threading" version="4.3.0" targetFramework="net48" />