From 1440c67b781c174e97643970221a47cd019329ed Mon Sep 17 00:00:00 2001 From: Asval Date: Sat, 3 Aug 2019 01:21:29 +0200 Subject: [PATCH] added challenges theme creator --- FModel/App.config | 15 +- FModel/FModel.csproj | 5 +- FModel/Forms/Settings.Designer.cs | 128 +++++++++-- FModel/Forms/Settings.cs | 198 +++++++++++++++++- FModel/MainWindow.cs | 2 +- .../ChallengeGenerator/BundleDesign.cs | 81 ++++++- FModel/Methods/Utilities/Utilities.cs | 7 + FModel/Properties/Resources.Designer.cs | 10 + FModel/Properties/Resources.resx | 3 + FModel/Properties/Settings.Designer.cs | 60 ++++-- FModel/Properties/Settings.settings | 15 +- FModel/Resources/cTemplate.png | Bin 0 -> 19568 bytes 12 files changed, 479 insertions(+), 45 deletions(-) create mode 100644 FModel/Resources/cTemplate.png diff --git a/FModel/App.config b/FModel/App.config index 3ad2bd6d..20575ad8 100644 --- a/FModel/App.config +++ b/FModel/App.config @@ -61,9 +61,6 @@ English - - False - @@ -91,6 +88,18 @@ + + False + + + + + + 1 + + + 50,50,50 + diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 63ff9fd5..6c8eee6e 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -252,6 +252,7 @@ + @@ -280,10 +281,6 @@ - - - - diff --git a/FModel/Forms/Settings.Designer.cs b/FModel/Forms/Settings.Designer.cs index 4468494c..4e7936a6 100644 --- a/FModel/Forms/Settings.Designer.cs +++ b/FModel/Forms/Settings.Designer.cs @@ -57,7 +57,14 @@ namespace FModel.Forms this.textBox3 = new System.Windows.Forms.TextBox(); this.label4 = new System.Windows.Forms.Label(); this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.button4 = new System.Windows.Forms.Button(); this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.label6 = new System.Windows.Forms.Label(); + this.trackBar3 = new System.Windows.Forms.TrackBar(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.textBox6 = new System.Windows.Forms.TextBox(); this.label12 = new System.Windows.Forms.Label(); this.groupBox3.SuspendLayout(); @@ -69,6 +76,8 @@ namespace FModel.Forms this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.imgsPerRow)).BeginInit(); this.groupBox6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // // groupBox3 @@ -140,9 +149,9 @@ namespace FModel.Forms // // OKButton // - this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.OKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.OKButton.Location = new System.Drawing.Point(475, 434); + this.OKButton.Location = new System.Drawing.Point(475, 546); this.OKButton.Name = "OKButton"; this.OKButton.Size = new System.Drawing.Size(97, 21); this.OKButton.TabIndex = 15; @@ -301,7 +310,7 @@ namespace FModel.Forms // // wPictureBox // - this.wPictureBox.Image = global::FModel.Properties.Resources.wTemplate; + this.wPictureBox.Image = global::FModel.Properties.Resources.wTemplatev1; this.wPictureBox.Location = new System.Drawing.Point(389, 19); this.wPictureBox.Name = "wPictureBox"; this.wPictureBox.Size = new System.Drawing.Size(165, 165); @@ -311,12 +320,13 @@ namespace FModel.Forms // // groupBox1 // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.groupBox1.Controls.Add(this.checkBoxSaveAsMergeImages); this.groupBox1.Controls.Add(this.imgsPerRow); this.groupBox1.Controls.Add(this.label5); this.groupBox1.Controls.Add(this.textBox3); this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Location = new System.Drawing.Point(12, 375); + this.groupBox1.Location = new System.Drawing.Point(12, 487); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(560, 49); this.groupBox1.TabIndex = 17; @@ -377,32 +387,114 @@ namespace FModel.Forms // // groupBox6 // + this.groupBox6.Controls.Add(this.button3); + this.groupBox6.Controls.Add(this.button2); + this.groupBox6.Controls.Add(this.label7); + this.groupBox6.Controls.Add(this.button4); this.groupBox6.Controls.Add(this.checkBox2); + this.groupBox6.Controls.Add(this.label6); + this.groupBox6.Controls.Add(this.trackBar3); + this.groupBox6.Controls.Add(this.pictureBox1); this.groupBox6.Controls.Add(this.textBox6); this.groupBox6.Controls.Add(this.label12); this.groupBox6.Location = new System.Drawing.Point(12, 323); this.groupBox6.Name = "groupBox6"; - this.groupBox6.Size = new System.Drawing.Size(560, 46); + this.groupBox6.Size = new System.Drawing.Size(560, 158); this.groupBox6.TabIndex = 19; this.groupBox6.TabStop = false; - this.groupBox6.Text = "Challenges"; + this.groupBox6.Text = "Challenges Theme"; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(102, 129); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(94, 23); + this.button3.TabIndex = 26; + this.button3.Text = "Choose Banner"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.Button3_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(199, 129); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(93, 23); + this.button2.TabIndex = 11; + this.button2.Text = "Open Image"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.Button2_Click); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.ForeColor = System.Drawing.Color.Red; + this.label7.Location = new System.Drawing.Point(89, 113); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(117, 13); + this.label7.TabIndex = 33; + this.label7.Text = "Banner Size: 1024x256"; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(6, 129); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(93, 23); + this.button4.TabIndex = 31; + this.button4.Text = "Pick Color"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.Button4_Click); // // checkBox2 // this.checkBox2.AutoSize = true; - this.checkBox2.Location = new System.Drawing.Point(448, 21); + this.checkBox2.Location = new System.Drawing.Point(6, 52); this.checkBox2.Name = "checkBox2"; - this.checkBox2.Size = new System.Drawing.Size(105, 17); - this.checkBox2.TabIndex = 27; - this.checkBox2.Text = "Draw Reward ID"; + this.checkBox2.Size = new System.Drawing.Size(97, 17); + this.checkBox2.TabIndex = 30; + this.checkBox2.Text = "Custom Theme"; this.checkBox2.UseVisualStyleBackColor = true; + this.checkBox2.CheckedChanged += new System.EventHandler(this.CheckBox2_CheckedChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 82); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(46, 13); + this.label6.TabIndex = 28; + this.label6.Text = "Opacity:"; + // + // trackBar3 + // + this.trackBar3.Location = new System.Drawing.Point(58, 82); + this.trackBar3.Maximum = 1000; + this.trackBar3.Minimum = 1; + this.trackBar3.Name = "trackBar3"; + this.trackBar3.Size = new System.Drawing.Size(234, 45); + this.trackBar3.TabIndex = 27; + this.trackBar3.TickFrequency = 25; + this.trackBar3.TickStyle = System.Windows.Forms.TickStyle.None; + this.trackBar3.Value = 1; + this.trackBar3.ValueChanged += new System.EventHandler(this.TrackBar3_ValueChanged); + // + // pictureBox1 + // + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBox1.Image = global::FModel.Properties.Resources.cTemplate; + this.pictureBox1.Location = new System.Drawing.Point(298, 45); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(256, 107); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 10; + this.pictureBox1.TabStop = false; // // textBox6 // this.textBox6.Location = new System.Drawing.Point(74, 19); this.textBox6.Name = "textBox6"; - this.textBox6.Size = new System.Drawing.Size(359, 20); + this.textBox6.Size = new System.Drawing.Size(480, 20); this.textBox6.TabIndex = 8; + this.textBox6.TextChanged += new System.EventHandler(this.TextBox6_TextChanged); // // label12 // @@ -417,7 +509,7 @@ namespace FModel.Forms // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(584, 467); + this.ClientSize = new System.Drawing.Size(584, 579); this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox4); @@ -431,6 +523,7 @@ namespace FModel.Forms this.Name = "Settings"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "FModel Settings"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Settings_FormClosing); this.groupBox3.ResumeLayout(false); this.groupBox3.PerformLayout(); this.groupBox2.ResumeLayout(false); @@ -445,6 +538,8 @@ namespace FModel.Forms ((System.ComponentModel.ISupportInitialize)(this.imgsPerRow)).EndInit(); this.groupBox6.ResumeLayout(false); this.groupBox6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); } @@ -476,11 +571,18 @@ namespace FModel.Forms private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.Label label10; private System.Windows.Forms.GroupBox groupBox6; - private System.Windows.Forms.CheckBox checkBox2; private System.Windows.Forms.TextBox textBox6; private System.Windows.Forms.Label label12; private System.Windows.Forms.CheckBox checkBox_tryToOpen; private System.Windows.Forms.CheckBox checkBoxSaveAsMergeImages; private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TrackBar trackBar3; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Label label7; } } diff --git a/FModel/Forms/Settings.cs b/FModel/Forms/Settings.cs index 9ef46f11..e4b04d95 100644 --- a/FModel/Forms/Settings.cs +++ b/FModel/Forms/Settings.cs @@ -1,16 +1,22 @@ using System; using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; using System.IO; using System.Windows.Forms; using FModel.Properties; namespace FModel.Forms { + //refactor asap public partial class Settings : Form { private static string _paKsPathBefore; private static string _outputPathBefore; private static string _oldLanguage; + private static Color headerColor; + private static Bitmap bmp; + private static Graphics g; public Settings() { @@ -25,7 +31,6 @@ namespace FModel.Forms checkBox1.Checked = Properties.Settings.Default.rarityNew; textBox6.Text = Properties.Settings.Default.challengesWatermark; - checkBox2.Checked = Properties.Settings.Default.challengesDebug; if (string.IsNullOrWhiteSpace(textBox6.Text)) { textBox6.Text = "{Bundle_Name} Generated using FModel & JohnWickParse - {Date}"; @@ -50,6 +55,16 @@ namespace FModel.Forms trackBar1.Value = Properties.Settings.Default.wOpacity; trackBar2.Value = Properties.Settings.Default.wSize; + button3.Enabled = Properties.Settings.Default.isChallengesTheme; + button4.Enabled = Properties.Settings.Default.isChallengesTheme; + checkBox2.Checked = Properties.Settings.Default.isChallengesTheme; + trackBar3.Enabled = Properties.Settings.Default.isChallengesTheme; + trackBar3.Value = Properties.Settings.Default.challengesOpacity; + string[] colorParts = Properties.Settings.Default.challengesColors.Split(','); + headerColor = Color.FromArgb(255, Int32.Parse(colorParts[0]), Int32.Parse(colorParts[1]), Int32.Parse(colorParts[2])); + if (File.Exists(Properties.Settings.Default.challengesBannerFileName)) { drawChallengeTemplate(headerColor, true); } + else { pictureBox1.Image = Resources.cTemplate; } + //FEATURED checkBox8.Checked = Properties.Settings.Default.loadFeaturedImage; if (File.Exists(Properties.Settings.Default.wFilename)) @@ -101,8 +116,10 @@ namespace FModel.Forms MessageBox.Show(@"Please, restart FModel to apply your new output path", @"FModel Output Path Changed", MessageBoxButtons.OK, MessageBoxIcon.Information); } - Properties.Settings.Default.challengesDebug = checkBox2.Checked; Properties.Settings.Default.challengesWatermark = textBox6.Text; + Properties.Settings.Default.isChallengesTheme = checkBox2.Checked; + Properties.Settings.Default.challengesOpacity = trackBar3.Value; + Properties.Settings.Default.challengesColors = headerColor.R + "," + headerColor.G + "," + headerColor.B; Properties.Settings.Default.tryToOpenAssets = checkBox_tryToOpen.Checked; @@ -129,6 +146,7 @@ namespace FModel.Forms } Properties.Settings.Default.Save(); //SAVE + bmp.Dispose(); Close(); } @@ -256,5 +274,181 @@ namespace FModel.Forms wPictureBox.Image = bmp; } } + + private void Button2_Click(object sender, EventArgs e) + { + if (pictureBox1.Image != null) + { + var newForm = new Form(); + + PictureBox pb = new PictureBox(); + pb.Dock = DockStyle.Fill; + pb.Image = pictureBox1.Image; + pb.SizeMode = PictureBoxSizeMode.Zoom; + + newForm.Size = pictureBox1.Image.Size; + newForm.Icon = Resources.FModel; + newForm.Text = ThePak.CurrentUsedItem; + newForm.StartPosition = FormStartPosition.CenterScreen; + newForm.Controls.Add(pb); + newForm.Show(); + } + } + + private void CheckBox2_CheckedChanged(object sender, EventArgs e) + { + button3.Enabled = checkBox2.Checked; + button4.Enabled = checkBox2.Checked; + trackBar3.Enabled = checkBox2.Checked; + + if (!checkBox2.Checked) + { + pictureBox1.Image = Resources.cTemplate; + } + else { drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); } + } + + private void Button4_Click(object sender, EventArgs e) + { + ColorDialog MyDialog = new ColorDialog(); + MyDialog.FullOpen = true; + MyDialog.AnyColor = true; + + if (MyDialog.ShowDialog() == DialogResult.OK) + { + headerColor = MyDialog.Color; + drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + } + MyDialog.Dispose(); + } + + private void drawChallengeTemplate(Color headerColor, bool isBanner = false) + { + bmp = new Bitmap(1024, 410); + g = Graphics.FromImage(bmp); + g.TextRenderingHint = TextRenderingHint.AntiAlias; + g.SmoothingMode = SmoothingMode.HighQuality; + + #region header + if (isBanner) + { + if (File.Exists(Properties.Settings.Default.challengesBannerFileName)) + { + g.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, bmp.Width, 256)); + + Image banner = Image.FromFile(Properties.Settings.Default.challengesBannerFileName); + var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)trackBar3.Value / 1000); + g.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0); + } + } + else + { + g.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, bmp.Width, 256)); + } + + GraphicsPath gp = new GraphicsPath(); + gp.StartFigure(); + gp.AddLine(0, 256, bmp.Width, 256); + gp.AddLine(bmp.Width, 256, bmp.Width, 241); + gp.AddLine(bmp.Width, 241, bmp.Width / 2 + 25, 236); + gp.AddLine(bmp.Width / 2 + 25, 236, bmp.Width / 2 + 35, 249); + gp.AddLine(bmp.Width / 2 + 35, 249, 0, 241); + gp.CloseFigure(); + g.FillPath(new SolidBrush(ControlPaint.Light(headerColor)), gp); + + GraphicsPath p = new GraphicsPath(); + Pen myPen = new Pen(ControlPaint.Light(headerColor, (float)0.2), 3); + myPen.LineJoin = LineJoin.Round; //needed to avoid spikes + p.AddString( + "{LAST FOLDER HERE}", + Properties.Settings.Default.IconLanguage == "Japanese" ? FontUtilities.pfc.Families[2] : FontUtilities.pfc.Families[1], + (int)FontStyle.Regular, 30, + new Point(30, 70), + FontUtilities.leftString + ); + g.DrawPath(myPen, p); + g.FillPath(new SolidBrush(ControlPaint.Dark(headerColor, (float)0.05)), p); + + g.DrawString("{BUNDLE DISPLAY NAME HERE}", new Font(Properties.Settings.Default.IconLanguage == "Japanese" ? FontUtilities.pfc.Families[2] : FontUtilities.pfc.Families[1], 40), new SolidBrush(Color.White), new Point(25, 105)); + + g.FillRectangle(new SolidBrush(ControlPaint.Dark(headerColor, (float)0.1)), new Rectangle(0, 256, bmp.Width, bmp.Height)); + #endregion + + #region quest background + int theY = 290; + g.FillRectangle(new SolidBrush(Color.FromArgb(50, headerColor.R, headerColor.G, headerColor.B)), new Rectangle(25, theY, bmp.Width - 50, 70)); + + gp = new GraphicsPath(); + gp.StartFigure(); + gp.AddLine(32, theY + 5, 29, theY + 67); + gp.AddLine(29, theY + 67, bmp.Width - 160, theY + 62); + gp.AddLine(bmp.Width - 160, theY + 62, bmp.Width - 150, theY + 4); + gp.CloseFigure(); + g.FillPath(new SolidBrush(Color.FromArgb(50, headerColor.R, headerColor.G, headerColor.B)), gp); + + g.FillRectangle(new SolidBrush(headerColor), new Rectangle(60, theY + 47, 500, 7)); + + gp = new GraphicsPath(); + gp.StartFigure(); + gp.AddLine(39, theY + 35, 45, theY + 32); + gp.AddLine(45, theY + 32, 48, theY + 37); + gp.AddLine(48, theY + 37, 42, theY + 40); + gp.CloseFigure(); + g.FillPath(new SolidBrush(headerColor), gp); + #endregion + + #region watermark + string text = textBox6.Text; + if (string.IsNullOrWhiteSpace(text)) + { + text = "{Bundle_Name} Generated using FModel & JohnWickParse - {Date}"; + } + + if (text.Contains("{Bundle_Name}")) + { + text = text.Replace("{Bundle_Name}", "{BUNDLE DISPLAY NAME HERE}"); + } + if (text.Contains("{Date}")) + { + text = text.Replace("{Date}", DateTime.Now.ToString("dd/MM/yyyy")); + } + + g.DrawString(text, new Font(FontUtilities.pfc.Families[0], 15), new SolidBrush(Color.FromArgb(150, 255, 255, 255)), new Point(bmp.Width - 10, 210), FontUtilities.rightString); + #endregion + + pictureBox1.Image = bmp; + } + + private void Button3_Click(object sender, EventArgs e) + { + OpenFileDialog theDialog = new OpenFileDialog(); + theDialog.Title = @"Choose your banner"; + theDialog.Multiselect = false; + theDialog.Filter = @"PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|DDS Files (*.dds)|*.dds|All Files (*.*)|*.*"; + + if (theDialog.ShowDialog() == DialogResult.OK) + { + Properties.Settings.Default.challengesBannerFileName = theDialog.FileName; + Properties.Settings.Default.Save(); + + drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + } + } + + private void TrackBar3_ValueChanged(object sender, EventArgs e) + { + drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + pictureBox1.Refresh(); + } + + private void TextBox6_TextChanged(object sender, EventArgs e) + { + drawChallengeTemplate(headerColor, File.Exists(Properties.Settings.Default.challengesBannerFileName)); + } + + private void Settings_FormClosing(object sender, FormClosingEventArgs e) + { + bmp.Dispose(); + } } } diff --git a/FModel/MainWindow.cs b/FModel/MainWindow.cs index d3352089..bf9ab6a8 100644 --- a/FModel/MainWindow.cs +++ b/FModel/MainWindow.cs @@ -165,13 +165,13 @@ namespace FModel } await Task.Run(() => { + FontUtilities.SetFont(); Utilities.SetOutputFolder(); FillWithPaKs(); AddToUI.checkAndAddDynamicKeys(); Utilities.colorMyPaks(loadOneToolStripMenuItem); Utilities.SetFolderPermission(App.DefaultOutputPath); Utilities.CreateDefaultFolders(); - FontUtilities.SetFont(); }); MyScintilla.SetScintillaStyle(scintilla1); diff --git a/FModel/Methods/IconGenerator/ChallengeGenerator/BundleDesign.cs b/FModel/Methods/IconGenerator/ChallengeGenerator/BundleDesign.cs index a190fb87..ee5fb8ec 100644 --- a/FModel/Methods/IconGenerator/ChallengeGenerator/BundleDesign.cs +++ b/FModel/Methods/IconGenerator/ChallengeGenerator/BundleDesign.cs @@ -14,7 +14,7 @@ namespace FModel public static int theY { get; set; } public static Graphics toDrawOn { get; set; } public static JToken myItem { get; set; } - public static Color headerColor { get; set; } + private static Color headerColor { get; set; } /// /// get a random color in case DisplayStyle doesn't exist in drawBackground() @@ -52,7 +52,15 @@ namespace FModel JToken displayStyle = myBundle["DisplayStyle"]; if (displayStyle != null) { - headerColor = BundleInfos.getSecondaryColor(myBundle); + if (Settings.Default.isChallengesTheme) + { + string[] colorParts = Settings.Default.challengesColors.Split(','); + headerColor = Color.FromArgb(255, Int32.Parse(colorParts[0]), Int32.Parse(colorParts[1]), Int32.Parse(colorParts[2])); + } + else + { + headerColor = BundleInfos.getSecondaryColor(myBundle); + } JToken customBackground = displayStyle["CustomBackground"]; JToken displayImage = displayStyle["DisplayImage"]; @@ -70,8 +78,22 @@ namespace FModel { challengeIcon = new Bitmap(bmpTemp); } - toDrawOn.DrawImage(challengeIcon, new Point(0, 0)); - toDrawOn.FillRectangle(new SolidBrush(Color.FromArgb(175, headerColor.R, headerColor.G, headerColor.B)), new Rectangle(0, 0, myBitmap.Width, 256)); + + toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); + if (Settings.Default.isChallengesTheme) + { + if (File.Exists(Settings.Default.challengesBannerFileName)) + { + Image banner = Image.FromFile(Settings.Default.challengesBannerFileName); + var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)Settings.Default.challengesOpacity / 1000); + toDrawOn.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0); + } + } + else + { + var opacityImage = ImageUtilities.SetImageOpacity(challengeIcon, (float)0.3); + toDrawOn.DrawImage(opacityImage, new Point(0, 0)); + } } } } @@ -88,14 +110,59 @@ namespace FModel { challengeIcon = new Bitmap(bmpTemp); } + toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); + if (Settings.Default.isChallengesTheme) + { + if (File.Exists(Settings.Default.challengesBannerFileName)) + { + Image banner = Image.FromFile(Settings.Default.challengesBannerFileName); + var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)Settings.Default.challengesOpacity / 1000); + toDrawOn.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0); + } + } + toDrawOn.DrawImage(ImageUtilities.ResizeImage(challengeIcon, 256, 256), new Point(0, 0)); } } - else { toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); } + else + { + toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); + if (Settings.Default.isChallengesTheme) + { + if (File.Exists(Settings.Default.challengesBannerFileName)) + { + Image banner = Image.FromFile(Settings.Default.challengesBannerFileName); + var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)Settings.Default.challengesOpacity / 1000); + toDrawOn.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0); + } + } + } + } + } + else + { + if (Settings.Default.isChallengesTheme) + { + string[] colorParts = Settings.Default.challengesColors.Split(','); + headerColor = Color.FromArgb(255, Int32.Parse(colorParts[0]), Int32.Parse(colorParts[1]), Int32.Parse(colorParts[2])); + } + else + { + headerColor = getRandomColor(); + } + + toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); + if (Settings.Default.isChallengesTheme) + { + if (File.Exists(Settings.Default.challengesBannerFileName)) + { + Image banner = Image.FromFile(Settings.Default.challengesBannerFileName); + var opacityImage = ImageUtilities.SetImageOpacity(banner, (float)Settings.Default.challengesOpacity / 1000); + toDrawOn.DrawImage(ImageUtilities.ResizeImage(opacityImage, 1024, 256), 0, 0); + } } } - else { headerColor = getRandomColor(); toDrawOn.FillRectangle(new SolidBrush(headerColor), new Rectangle(0, 0, myBitmap.Width, 256)); } GraphicsPath gp = new GraphicsPath(); gp.StartFigure(); @@ -160,7 +227,7 @@ namespace FModel JToken bundleCompletionRewards = myBundle["BundleCompletionRewards"]; if (bundleCompletionRewards != null) { - theY += 50; + theY += 35; JArray bundleCompletionRewardsArray = bundleCompletionRewards.Value(); foreach (JToken token in bundleCompletionRewardsArray) { diff --git a/FModel/Methods/Utilities/Utilities.cs b/FModel/Methods/Utilities/Utilities.cs index 3823c5f0..b497db34 100644 --- a/FModel/Methods/Utilities/Utilities.cs +++ b/FModel/Methods/Utilities/Utilities.cs @@ -187,6 +187,13 @@ namespace FModel Properties.Settings.Default.UMFilename = string.Empty; Properties.Settings.Default.UMWatermark = false; } + + if (!string.IsNullOrEmpty(Properties.Settings.Default.challengesBannerFileName) && + !File.Exists(Properties.Settings.Default.challengesBannerFileName)) + { + Properties.Settings.Default.challengesBannerFileName = string.Empty; + Properties.Settings.Default.isChallengesTheme = false; + } } } } diff --git a/FModel/Properties/Resources.Designer.cs b/FModel/Properties/Resources.Designer.cs index a6fbb18e..e13cb1e2 100644 --- a/FModel/Properties/Resources.Designer.cs +++ b/FModel/Properties/Resources.Designer.cs @@ -140,6 +140,16 @@ namespace FModel.Properties { } } + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cTemplate { + get { + object obj = ResourceManager.GetObject("cTemplate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Recherche une ressource localisée de type System.Drawing.Bitmap. /// diff --git a/FModel/Properties/Resources.resx b/FModel/Properties/Resources.resx index 52e40683..80241dbf 100644 --- a/FModel/Properties/Resources.resx +++ b/FModel/Properties/Resources.resx @@ -241,4 +241,7 @@ ..\Resources\wTemplatev1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\cTemplate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/FModel/Properties/Settings.Designer.cs b/FModel/Properties/Settings.Designer.cs index 1cd67d1a..ac5da8e8 100644 --- a/FModel/Properties/Settings.Designer.cs +++ b/FModel/Properties/Settings.Designer.cs @@ -227,18 +227,6 @@ namespace FModel.Properties { } } - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool challengesDebug { - get { - return ((bool)(this["challengesDebug"])); - } - set { - this["challengesDebug"] = value; - } - } - [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] @@ -346,5 +334,53 @@ namespace FModel.Properties { this["UMParameters"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool isChallengesTheme { + get { + return ((bool)(this["isChallengesTheme"])); + } + set { + this["isChallengesTheme"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string challengesBannerFileName { + get { + return ((string)(this["challengesBannerFileName"])); + } + set { + this["challengesBannerFileName"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public int challengesOpacity { + get { + return ((int)(this["challengesOpacity"])); + } + set { + this["challengesOpacity"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("50,50,50")] + public string challengesColors { + get { + return ((string)(this["challengesColors"])); + } + set { + this["challengesColors"] = value; + } + } } } diff --git a/FModel/Properties/Settings.settings b/FModel/Properties/Settings.settings index 81518611..fd53e25b 100644 --- a/FModel/Properties/Settings.settings +++ b/FModel/Properties/Settings.settings @@ -53,9 +53,6 @@ English - - False - @@ -83,5 +80,17 @@ + + False + + + + + + 1 + + + 50,50,50 + \ No newline at end of file diff --git a/FModel/Resources/cTemplate.png b/FModel/Resources/cTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..d769ac3054b9be0cd34550e42920a17aaaba1149 GIT binary patch literal 19568 zcmeFZdsI?+8z{Urtube&#%5B>)VDM%OEb$f6>Kiyr83P>@`4j8rJ|$e4F$|*-exA1 zylbX3V`g4S$-96}4V0RsiG-*)k)oiI7eGPaY@2!C^L^|4>-=%n`p#O1wG`Ow{oBv| z_IsZF%Z2l>&$jN`3IM=o9`4`z0)P(qQS0s}o58o-w{}_^-x7RbUjvN;CbQrd9rWpQ zrvadesK5TbF8E#V2X{mQ0DS&z<4=nj`zQAu5%@k#Hq(|;VU{Or@ihfRWlKBZ|PZ)|%#5So2F zX1D#oO#k}l-G2u9adomBvUtp_OoNs@K%3;E_kFQj5yZE4e+M2nw0e$EkP&uL1&eYsfD zkajN5h1;6GcpJIiId#qYX4ELZH7)cN>%&-iTY5) zNhP$Z4|wD~DSL3*K#OaG$_;Np8dJRSOZiBz!+vRN1V*$8bJs1;vlaob#7_#bbY&M^ z86~*GAt{EdCt{1Sb?WYcR^#HzIJ0nSbfBtY?JW}`TTs$9O1=a=>Urfp1LG$MxPdFi zykR1CBZ@Mp3_+g77r%!P-t8c*j;h1DmqHj#iZZM{Eip!_g63g|gb3t5%!5Xli?J5) zgT5Z{_O0tO^mJgqcKIV6H}#(4OXkPxP9}ToxJTq&|LQE7y0wUm*`fEdb&uCkmq4L= zCUY)U5)~p;Z7@!D?c`H}tZ9qT{=}I?m@Ao?NE3I_#H!}bGLkbVwLJ8CP;$YK?uy(V zsMa+_Vbi?^=U!~F_PC8lrl(()_nv~SYBbMmKJ7^0JZvNoaZ+_I&A2$rJ6jVy?!!>| z?)LcgL8HZm2m#2Q=#LULO~`C@(LJhv{aulcTjpvv;fNz^oL67$cKpWW%qLu|eN9?b z_8?U+Bl2Y4rzH*cwTnL^w%^OJ?-S)p?e#KNSD8>XP2*I=@&pP@DoyIBLEk1ii<(Q)%5G3@{#Mepx>YN|5qk{?>TlXNR#dKuUsRiopJI*kbO!a(EZ z;aul#Jx6G*j@yEIposOp^3$(=gzVGWE)DzI#a`=9!d~SNop-;Rq2o5pJaeTry&#UY zcE`#u;urEG2oVM1Ww7D1SnhyD&p`Ra)_VgMz|zkt6RgT1oQjKnwd3r=Z3w8|jkr|p z$2vR;=FI@C5O^Vc#|)np`+O)5wd0MK0WXa9=vGPpyg>w4`Q;7$=5Jnq?8iv$vWTa& z?!13Kr*h{H4McMv<-klVv9&CL5dd`S{KNMfgNI*u+$lA$&g=!rGq&gaQfLri=lx46 z51p*O-xs1;nG-rU*H*t)d_l4LL{!G}QkD*HNKUXAobl%d44vm>oDoa zZekq6R=nS?a5*6eiYlF|Nif+2WE7ig0lT|SY8};obV%!txt(Spb5O?%;V@E)i8w7f z>?kJK{E$>krzU3kvt-Uszj{Q}iX1;NFZphv zNT_lTq!6_VTn-^gQ;iw)Q5;;`Tv;?_dHS#V@)yb)v;#ahoMOH@sFzWBzoibFGxDl= zP8p4WXy?WmF&B;XGGeM&9SP9DqPUk!S<>iKe@qw@%@6;=$(t@uqsvvD#REq`VE&`2=(_8MbC~WAxz$2%!ZIITa=CMSwd2eOkJ2 z2f!`%Vzvb7KO|N#9?>dP_8EF=Tgx*!H2>eaMub`Xxz7nwCr~qek!r&65o_U2pvT@F zlnc{x;8E8q0&QtDua~j)F2fDV1MT9DE!V8HLM?YMN#?v3Iy;qj6W=TZx&!ZRRy@s+ z-)M*Kf0|e^^a3SOl@xmkhb?DejEL6yt`=6J917l}+1rV{giY$V1b__UuR1{V97voo zDr;$L?T+{L`+*#_PN?o21#9q}Bb=k0e~?oNorUKecQ<>p;I$u!m>+Jg#AVIBiRNLq z{+?$nw*Zdqx7J!Z^7Ojp)#hyiBSzF&U>GeG^Feh#^*PKe_zoEGLk?{iI+zvkJO6tY zy-qJf=RSqm0bTsXyF1oalhfCXGXM~fUYK@HW~<_W+rj`XOxs+{Dhh|@Fb*|Gk1#J6 zVc(Fv^fI!LMSCm(19vm2?TzRTnPrB(@iPlM#-cT-WA7_JnT^d!bS;g4m_3IcXc*;l zJ62wTzEI5AFP`f5cIL`v(hiE0)}SxWDBi!J|KVyYckiRcZdN3g+0C-8_xx!(N3||w zj<}mwa0H#j7VTai90Q9ooN)J!cuf|`mZ_U;OMwzg$KNxVT&9W0YrCx_;2X>M;5%d~ z2}j6qK}BvY1_uSrGu{COm5KSlU1~9Ah{<&X4fciPg|1462!7xNz5FbUy4(^t)b!f2 zG(SNz6Tor0C>~&J0wxg~wz{ofqvNU7tPf z@TWgmnpWfj?&XM)J(kv@+dI&F5aIL zwGQ1nYT$V34k+VKuWFBX^TWrv;{vZk_wOF*d!way3WOjJ(YHtYOtLmKq&0IcEeO2ZV<0d3%egy>@v_6 zz?mA2uPX(hL+-{s=^kz$Zu*t04l6(G1^u5M8azuhkgD6Qhh-#2G%w68tent0L~M25 zIw~5RpJV!Hn>U}A#f{1H!V&0JjOgq*PE}uaKR)QB*7BgC;Rs3v!)XP#H-xYgk5pR?M#)eokssyzXq zVj~=ufvyG@;o7$>Db?wjTez-0{lp%$*2F@VsWUXsA@82Mrr8V>mPbiwF>3`_c|@$N zZ#y;ZldOqCqQzOw6F!6-ZCO@Y-U;KIko|GjZT|EE)t@=&bbXo(48sDOp4liRPp3pBR-xy{or;Qcga^cXq*hGvOu&d*Zubl44)DUU-{68YKvSyY)-Qu;1HkH| zkKU*da6ejMe*Eb`)AvnQU>&qB@J}4A6`as7p>)e?h#s;N%r=b&HLrTJ z%^uQ|ld|vkV@%ljtrz`Ab{B`&$D8=?06hGv_!J5D=O_7#V&yjAgYSk~$U(L6v(u0F z%q;gZIBaS3D|gBF^pugwnar28^SaF)Z%9+pFEVxF5bB?7)Bh67_K7(TmGvapGo>O} z{j1xE(=mwFh1vz3idlkz;Tk1jHdb4_Vx>CQb5|C`}C%=>#UF9Mec5Yt=; zx~r)%{dj17^?;BY^mCzYkq(fu|DRY$3#DC&xW7Z%p0I5RrssDN_JF1{T&WWtcW|a( zHhVF1qBbF@LZ1JrksOSliEN?`&jK)Mn;n{t=3f~J@%Vw1#8i2jyU0#xyk9#;?Gpv~ zk(MQg?++*wT^O`*X#SjIZJXC_u4FObJJG9CD4u1XO?KbaqLLXfB!`|cmh39?nP9c| zi-`4an3fU3vj%zyhq7%x{MkEAW%Jhmgdz)I3FMJM|NDi7!*3T;g^7AU?|2a6<tRnY5&WQQCRHYvdcI!~WzmVHYLg`^4L5gD@;Iex`i*B#c z0z%C|XJfZ)1^}{u{qH)|gnp&rYgByAW|C%ISS{8D?n$R?32Wp2w57sif{H^>eYT`7 zrma-XCOvlE;Qu}$0nb%0Lp94?UQKD9*7PxuKvvayh^E}I911BdN zE}bp7D{WR+2@oiJ%>Z7Dgo7k#kx)qCQ%efQf6TYpmeOhZeU-~GyOeX&D=o)(ja^kP z30bgf;-X{fpk9_}_)^Rf>Hr#X5EtT#{S^zzW6a2!wMOPl9WobqcUtwbTWvmmFF~lmSgiD2|(q}#z%mGcHjgd%u z+Q)GBr3k}Zy(E9n;2#@gHOL?T^enYJ*ckjiN4fIz?P{+ZD8xa5kx7U2Yg#e8wG;NF z>{O%WS$J=X$v(s1i3cdCR0&OJQsZPt!I}=VQl~3O`V__9r!OLnnF%e>VutudZ`@to zaccoI=8Y>V%PWu6R?t*Ysq?DknCY!FSxa$<@YleBvce(4P6(E7dI?#`Wj$n*_7r<+ zQn9TTYkcLVu8-lqvxWsxlRzF2X>Z+U4PoffN4FodrOZ%#)%(oW*c}|xsXd#RuppO9 z9R)f82L%CU9Vd;>Aux4m-*z3;>#?!a+5p-tb%CY*95$~U9B=-I+UsX);%8Bx8dn$k zLiKy?<%v?qY-P)_GdR^Ch2a?EDraD0jtCahhJ(b3jRBZ8d2-bX=_leu8;s5ATcso< zLV^#egtOdZ>cjsI-tdv2iECRwM%FK3cP*p6=x)K(`!!NjRhHowb>W|OlC$}52lm-i zV4XTkkOvb@$Q>ulXEp@mi+OmdE;qcYe9>_No4oue>xN>V99N_h;JS@D4f{vhhxjF;k!e1oDPU>+_N?Y$2*X!l*xcTWBSF1ag1 zeyCH`N&S@tLv4t8-l|g>+t)tczfaLU3U6!PhW3Icvz{dM zIiON3iB`jR@N!>h<6R{eCQKjta)4n3Eo$_-0ImtV7OKhm-~BJH|;!<8?wZt zxQLjnDU2z z54y!0z2L@=HzbcB3zt7s9CL<@iv-LTbuWIv;A-7Ke|8+dv5*!cpR)^br89@})8*^^ zC8{9ow>4`i49{6ZO3miotpj9NKwWZ+t!|cn16KipO!QGb$>=vv)&HD;G7V#NAYR-S*TbBB~ zrq<-9eHAH<;~86>CNm;e@KLh~@6TR|Jd86fD9m%9%;&~UkOL0N`ZqX5ryx*e=%D zqLn20i1)0J<2lPjRb|uEku_G|EtJb)jpbx(;ZO^##h>voXVEk5#QwH`8hWukbM8PW z?jtIc_=X&dd~zY=OnBAGn(Tn}R7EP@Yj^S3F|t1~`Be>CHTQF2LUIzmC#Us1ur6&& z?^8}fZm5eP(i$>VBiGE+soSzTY2#7FxR;RiWrCU|QL4Q)Q}k{n4~$@{#S{Ca>OO+P zn|~BunI(x%gJ7K?6uJMnvM;?Vi~iVuVHm`@o-nm{Zxw&dIc<=)X(6g=7J;6@VzIC;7y=55UxY<%zmO*l^04cVt@a>YDLgAbOs5s(C5Z;ip@Lno|}b9bwt>} zm}R%Dd>_a37Cl0GuWo2ZCMRcc(9tC=OLFiM)8{^6KIOs6a%X)(lD#GXBh&p15RALu} zKBGM;?OiOT(nS-{l%+^ z0WPqVR|u)5a$DsA+*=b1BH=S8tpbCV>g8{h!G&+R%S~iDHsq4|V*TyaD6NoDYHKWK zps!HEcqB-i&si?{^i)*hSXxb&gv0nPhdskZrGpm4`H;2XgqY{)w2PcpUof%YX)KSe zs$U2k2|S1^V<)sLa9+FXV$N-Un$vm?NLRlhK|b}?%cSgWv9^(Kgzv$XVu9&^W|7HxCK7 zwwqr2$Rc5Uuj_nJnod{oVx@6#j=#dhsdy>&NZ{;6D83F?i-9w1MaaYkzQ@(zK(yrn zx-9I1C9<(lO_|K~34yF!v1<3Aa6aap9U3=@sN+^E}tq97K-MI)WURk47Y_YC&6) zmpF9GtBNSiEhJf5D;?{USy9Sk)`j;1I`W~dh8)k44s;giiq=Yr=%8KlLew#@^YsPy zc5o%7O|(naRc6(N$7E=bdA#1$hoDGK`+Cj`BX?71XEaxbuTBXkdRbfE-q3N&x79db zmSq8o!3b3aj`_6meNAST*U2>P-x!4)s|{3t)v@F(Jh(J#=rq31%arqKypkdn{{DMx zKF1nlXZ&Aw*4D|qnAt#nM9WH7skPERhnLHSm=&^<&Y*2K`-6BYQj=QC15*7G4|Aul znr07}((MhW&?97pe^BRgpryFso;PZ|lI{GmxHsi&Y!eue=c$prq@>2~=SJiLomom= z5;5l-BW)aS0s1P&LdN zqM1D|!|VW%YpYE9zb?%8F~ej3rF91)g9!B%5n|Ujt5q3h-)W0{x zuiTdTSkhmkG4%zDnUPcPPFBSxC%M$Vk72Z6Vm~4oiY z;hFJ4s-ME?a>x~sl|KA8>cQr@<=)hj11)SYTtwmO;GR$-+!IMiEc2@3w45S~$4)ID zf5Uai>783GVpo5GEoE@5@FXSPr?&dFws5Lu?fF|-bBG` zlGHlPRNU<6sYUE^X{P}HMBVONYTj_?ujTvhQ1lbw4!BKc@=vm{rVEeV!ymd!wvMri{M- z_}%5#Aen|_o?X_c>oxbdZTsZ+HgQ_Zr4maS}( zTEOEn-6jgwOGCj^U>Yx7n(Iutu4vpR^RK%I0`tc|T3VTt-DcHuFj1Y3=Si>QLA#cR zDoSpYmgOo;p9>Ixu^|JXn zbx`MaFqH3HKb%vu9r_}eOslLk2 zp(O3`CiP%1X;ZgfL}EoEYph+CfO3$rOa*M`KZ+|doK7V#ue=0z#S`Wyj*Ya5jKkMc zQ(|Wm8?s_OwKZ&_rfS9N2At=32nO})6S0~PQBM7b6wY9kS9I_zcjVUBU8Z;T_mCRi zTp9|kQm@#HA7*ox2Dy_d@K^(F&PeI3w|16Z#*8?L+E8d$gX*MYJ)2W`!830c1ephI zRSO2gyAK3|-ij^yE|njXcsAx>+e$+$Wwec=Oql<=9*kEXt>DY!`XKd1ra|M*aCr{v zu-@aLYDi<9;c|;w^j*4HbyVZ{xj7XT4j(8@gZw*gHl-p?(nR-*KxsB&JzKcQ%u5uq zHp7^EI~K@Lz+Ee|1o#a+K~oYwC!u2M`>9Wwmh6v)x4O=`Y2TmiW3rmfECHLE`_A5* zR^$nCr#^-=H_Ks3y<>~Op?F2c z`1Ul;?>^lSWtN<8x4~iVNe4);8O7+L|WoPt4QC5|N70DmSIo(^T z@_2cwMQvG!gB+qF(e-oRXQMbf^i`@yn247*MkCH17{2&rmk31> z&Hcoyx;<6cDay1$sMt^^KSNV%DbeuDy3+yl?Oh}1M{wUh{uttjO3JyUg1E7qe-xpq zdD}rSr4jsjNwErvuivX`5AVl*Xzi5Lg`YiIAMzY|R~bAlYl%(IDV3_*i&$5m)3IUWwCJ-y(AFhe-M={f zv~@Be2O5F#S5cmyky-ZTTPI5OE7-ShZT&Y~ zyJj)-N_bg;y7wJTS9u&0iae5=Px#8V9uQ~;W;=YlpCzQ(rt#6pM z62ahi@$c=Pe3?s+;zJGEbUv*!vki#D#Dqa( zXHlM_1q>A=$CKQ=M1O+KgOxRkZ{)Z=&*F5MI(b&$n1gny%u*o^)+vkRW|wl*o-ZSJ zb7}IE(3?YiFYm7=mj0~xuV;V^;k`kH34&=0?Jk&FI-Uo24|AljZ9`0&G&Hr3reTm&uU{qx)AVM!o90!OW8ZD z4NKdCJ`6jof#o2DzhqeW`-9ewRx>s!ipU=Dj729BKp#2PuYRy{d&w)tX*2QhhIHU% zgqC}lY9iaS#(4pqNuOYdXyk(aTeWTVIhUZ-HXZWaYv}N^mrb1V!#td}M#q388MdQN z&Hkn+y|@ufTi-)+9>BP6+RQ?CK1+t|HSFpQL~`gHJA;6VH8}npm$$O?m0c&yDkg z->jfu$S#P-qS3KO-@Yyl?dWaS*xE7B(+ZJO!4MB|uw|hX!@#Bfh%SJz{CNT6ZT8F9 zs{V=}uq&*b7%<>H{F|QhsDsv>(55Xne2`xn3Yt6XT=m1E%D`P=_fQwS9`famEv|Y; z^{?b_H)_*7+5rgi4eSDAM_P4yV3G+H^0V_`s@-clxA-nRysXpx^4eIGCp|yW%U5uj zG$5-k#{cUH_C_$TzSaN687F%NXDlseEb^nEv++5GchJnpsud|~y`vKh@%grebHc-` zL>Tfp^mjT6L46I~9mEo~gDGRjj{LK8@khxqYwm3byS5WMm)!Spj|fn3~?>3-qzz+Zf7yA1yL`jmFf2$Je(Z2L#!JPfIs+s9OWeO0R6 z)rxS12vAkl%y5&N`|5Bh@5|X>qFQj7kQmLpJxW2f_+r1FK6~GfSHGaFe=uLMy$s>{ zP&Gyk3(u)IQYRFaF5=z`HK?h3b&0Hrr)Gp08mQ?5zg;G@tSn!x$`X$Erl+hlWfu++ z-*_4`*K?Ig5g}xYvqZ?|$G#CSZ$`lxSEOiz^cgTw{dSu{W##}PG!Xgxxl~zA^(xpXAIUj=j0giA1(Ebup;U{5}YrNme7wKRNd4MqZ;mk2>To4%;= zpttu9sxrerk|mhXZQXq8^NyarPWwwjk<(D0PcS;Ht1v!EW%0{EYkp#+imh{D9EaTV zQSJRaNXNVzb=6b-cIS{eemK@4Dyz8OG(Rvi&kH_{Zb+NkIJr;Jt5)yCD~C=6Ry-0c_pNrA1-*y(0oi>7qRLWph-x z%gIpxKr6stU25L6@PwuPVrw+mwR5Q5gimI@U}e7RhSE4U*S-20ErAH++vFNsjsYN0 z7}JOCJ-gakamOE0WE4#*RGQN#()-nm37UlkjY#(ySlwLvDL7fUV|zo$QJGuB)cHTT z@iJ|DkSO-aCKna7`jF6S!Zk1iM(UP@PqhbGCw||B%?Ub$I!d{cXx6+C`9tBdq$25E zzu~2D6&p3dYAS?Cr7Y}oyK|{w!IWeAkO;V>k+`f5v1Yb{_G8($YKw>M2}YeTvVndo z8M_x`)^ucq2PLg+`Sgp{jlHLJ~CXHL?K%B%P2&C&aus4S#Ij#2&QNL7~H-c$4WPlb7S zjsorauH@l^#=?Y7Xlwek&8jGsq9}N66fhAL&QB{t=as5fX~RZnUZJlTJy!S1$F>Cz z=IiZ5>9{X;BWsq3JzvsR985c6t%V+*<@t4VCWCJ$FN*uL*Hgnx*p$=)HfTg>;fn7! znVLZ_(~E+)!in0ejhTboe68?$VYIe+qtvnw&C8D94Xi*aFv<~~9?y8;jJ|$yUR(*4 z9(iJW31&C3J;k{1@O@m^>%^!Yml(=rg>IincQn$e(+K-KuBOxMi^CJ~gR+?f@qyJq zjIam;?<=_%aB%h;{&W`1RXCMT#X$q z+~!`3FX+^sr;DWxmk(0O*5UWsK#O0vY*#h#lKtaw$#HsH7U}|A0d;15593(@?+)nQ z38ie&ZX+~UxH*lFL#m*df=p5l+thtDetCY==6 zO9Vy7u6ovrLQv5;fc=(t;&V%B|43hnyfs2RC#o_4C|%QwKi@7sWNj#vr++y)^ZP!y z3^g`gM8EnNdn2hKsLNjQv%pss;tI1V473?FO^gZNsz$Yx$92K>^l{(T7kCMmPY@j+ z9;}I~>d$%FAb?Ohq1I5;K!DSh2ux!EKHa}}A7eF_`Tm8cvG92$9V}geb*v#}r>`O| z8@9j`u^!;hH{x$hbBPCn4+)G43TgfLkUw%ZHezkTj@msL>+iDhiyuHBbttOa&5a$F zdUx<4k*IKJgvXt%zLp`|0J!aIo5Dh9xa_~6LN?bejNdXTLwq=K8G~+}r!tohI5qhW zNw}@nrg3L4!l8HVoj?o)a-6rn_qApl&I)vR=5Hx6tJOSS5Ev^L420Q`!D1(Ra+9!w9n|p z(Z%}J_BRN{w~GoVoyGM!{r0ngjOu;`R+jT;gBHp%6wb6()#?v>*<^n&bvBIPj8NeU zqk7M>wt}E1X1XKxb@QNg(YcDw_eE%CYVJM~>_D6poIFJ#R-SrjZBrPRV^Uh)#t}7w z8?~n`!St~HBu_o4ps{k6Jzp0tzU;JhV$`6M8nYQm0|5tHBvtr|@rzg-tJ$}rBi4z- zSibU*WWA<|ticTN?UBcwigw*xnTj@MZcDNRyFip+KsZ%#dpOPFjt9ZOV(O3k@2Q17 ze}yD+_CAekDcA3OLIRE`$2Nf-CaT`0sMFXYtJGWvY+3AgP%9hVE?6_)_!)O`4?6{H zb*>y%59DAbZXYILx++b`kTWp2!Jaz3Y|ioGT0j1w!F(su^7}7vxc5fT-ue|1DR<4D zC#%o;UiInSBZMb~d8#r@+Q>dRW@o>=+AQxet0Psy;)r6)d21T(J3V04e`AXdoNd7W zMmo~5y@ag`bRW@sVOD+*nb_K{&LC{yllFWa8n~{#8CXbc?SB8}(1*Jld#I*%n&p|< zQm_*S7!yaY9e_^jl7HFQ{{3QEGsgrrn#t124|X8z>NX`=Y^*Z8&O#;DeFwIFwR0k0 z78~IG_!j|k?#3m#%TRA^i)Z*1;e?1+YPL8(4D?LI2gfzM@BH?|Hl#PWAGa|R6^l?I zp1FK)Bo!XjRUftb-_>yQzqz01|1Pi5%4mBB!@q}3sD^A+LrMa=kN@l3GnRUeg&$9A ziAAozGo&x5&^5B&=yG)0OI5I)X+Es0O%2N~2F0a+eM<(%(r`@!&J`V%`V*x7Z!i_} z*2uNqw2h7=*I;!t#cmB8KItOXL)&_da+DWN{{_zA@zdv3u+4wg)a4*wDg`C9_Z@8B z5rSGsfCMLBlG!Wo#F?;e4+qbOm7D%-^+lc>3&u#DWW2Nv*>;{08zgj(g{qfqHA_(* z^-spxr`8Avh{9D z#W2hp`lkr5!WNG#7_l z#=jhlBSQv?zS~1wTrFJbYD@U{e<|?vjE%a|MwU?RNS08&uyrD441iHf0{QqxdY<|Jr4djvVF zoGV#zJ4#kU8aC%wuIy8l9G*MYt11sLhk_~1Bb!_Bh#TKci@>{qi?9lf|V+b2_ zK_9u}A3Q?@`@xM=jn}jbww^MWv2b_K;7E=MbI|<8iv2TUIZ)k(kX+iHkHt=woT^iq z-XC_L#^Mm8T|3V*4_~NDs`aj^mP3a^iln%HSxdL5SBa>w6D6(?4TD5!QcEd&4{x+F zOBz8E1-#c>f?;^X*jeQ$hd9A$BnGof1wK4^f`yoak4VkrLP8LbsIG+~BA6}iQ8wDL z#7)_b361aDUk&7j#1;vu*z%?l5WBiq*K2o@L>jI`UvtQC#|SY&5vU<6mSU+Ko|m%5 zUIP!trDBl6NGk28|Hww&mMzkdZHKUTN-|vf(q1RLGMfC3Y~Pm#Jv39ITg_Il;w>J} zK81UmTHLQud1hR~B%$t)NEGl%o>`%({I8*sFrH~aVhf$4fPm9<$tXAH%?xVJVq%SY zC7dE)OPgxvo1rbiW@Yt+=|r>JaT?FjT3W&7B6XNat?h{l4kInX1-29dwW>9fc23l3 z&}A!CA^yIVnd+4$GE#bpFMd0`G)fC0_ECZf<8ph3I!yVbRQ{$qI?ejO+}gHTL^Zu? z*)C4D+;KE)99wSwfS=p1QHr-75G9I4TBw#lvUO-32hkP_-OSUAUpgg`haP^4m%v8d z$5n}(P2`xQ>f@)cAfe(FNH!`jF^y+@bE{}?B55|w@59MmH@hb^ahf_lb$%U+LXatB zRZ741Gnxbe)r_QFqu82pNYqCBG{3tM=gC)es@|fhjU%&)5-F}CTYeTgeeI+~YWHfX z+n-z+Yjy(S!+a=ic?QrCbCq+}#?uwekGpN_N;}g`zW2Vd99Om)9yEtMdk4qnK^Kcc2 z6@-2Tq>*q=_nqbG_j5MM+iaqOuwZ94$Q*j>5dm#PgEA?LQ*p&jITm}c7eXW~g|Fh2 zQ?bJ79!ILVj5d)V%BjfNgb6X~B9AS8gkeJb463boOPy_l%E7j5uG82KC#Ml9UgVKh zxNf8j(vTPDa3Y-Je~s6PkagI$?MoV))8B4;Yha#5PP-6?NfntW2X9vCM7TbF*$PuN z%0((0EnGwLgVu80uLm0ZNU$=5cPcXK#( zI&P)96(5msK{BLhGRlPV2o*r4bdQ*^TU!RIAQ9yYGeNVwDq8o+kutd`aky0lwp{Pk zNW{e20sOta(o1`MUN-nLn+M7R&H-Qx_u>Dj2`6RI%(eZTd2Sb3Z|h#Ir$+yQyoHC9 zcX7a4o#YX}@c0XQYA^;iewtSB$)i&gd`R^I)|SWCSl_ATu+LB%la%5RPC#-9QmkxO z_qU%X6cFZ6Mb+7~Zc!;t=YA_0C&5w$v>a4!+#I;KT+4CdAG&sjkY*-sOroB5Mj<_= zzl|6x+v6Lvu*l|+39(SL8u!bSa@DLLS9ZveI6*FbQmXDRy5x$Zoq;mbNY<%ul=-Jb z8nAj8a4Gm>D|bHuNTG_prfXNZPhOH(Ju=?(hn?GoJfVUrI@54p6%314D#=h;wRRqM z4|o4*Z+hR|o`|zy!{V*i&$Pshf(=X+UmMA5Y*`9{5y-yRg{>P30%?T45xbYUI+nX? zy%yJprj50&RBrhtvAZ)4dC@=HLv;5DnS&Tn=1xgFb1qT`KthQ}(kKtk^CL{?E3>01 zMCo@5xcC7-m2CBIUlupAij0f5!>dq~$f~6U0_}W{dY5V@GH5yn0 z6k<@0!FJ)gM%%D^TFAl33Cq`_8xxNE!MzRC(9PN>Cup=0d7P@$)Fg-D<|39)g^z?t zyt4@>_nR`N1OY2L&kpn{7bPlp=bG50Ii`a$DVQCH=|(FYxYbxXNnfRL0zX%Vz>Jx- z91>__iu{pc>7ycf(~R;mD(?D3(5~B2|20-HLnZ3Moyp3DClQDd;?{VB_HQ%0Ojm}R zvEz~_(;9XN+duh8+WkBYN4)jdq4Oi;#G&eLzL;2lG1)E(A*xO4q6Ihj6BA+Eu2*Ug z&hZ`hqs)t2qf$k^bkKv+hvi&_J!+2+>W#91!zR&ULeL1=Z(Arn(kumy?KG5)^5Lyu zl}mHWZ^C;aq%v?sEG-ut zh%D6rz~gQI=r*9-m<9Y_KjiXen|g8^O$kQPtH+V6e;7WT*9H>)zEw&qf32LKDhDUY z(Xk^N^XpXpE%aJ8e>FRqzTQV)_oKXjxzBRY-dP58L;iD(nc_DytbAjd|IOqs`1|!z zOK;O_MUJTtNNc5}(*541Q_J9R!gaM)*56|D!NA~tzqa$_e2L|G(^(FFp7Zc!K5XqL zRHnHd@JHg9bHkk zu~4@+(4VwWrFuzPe|a4kSZ&}d8fMQ|EZ(NC-hN}jL{Rk2QZN?aNJoL~?Y=$r+(dAU zIi0*;tLLO*oUa zJ!OkOvs_)@v5u(LS(^3ZFXI?dYpo$5aFrhtpz?$_q-CHd0TjU9(w|x8;c8Z%3HlZI zw>BO0wvVh)ki7}5;6nR0>IbipO|7a%Ujqx`!fsU|{+f@WJFG zUo_8TA30*dG$yX*yAfA;eIJ>9+9Ed4Ab8DSlDno4xKw-;KlDioh%9}{nttru^?Qpy z({J939VY3rW6#m9CMDGa8O;2TqV~8Ax_T2@vfpXo1$qtbkz>Dp%?(H~{zpvz*QZ?g zD+I#wNexs_J43ZD(R?sd^T8)Mn5}}3I?33^KZ)xDJ3Te)8tSHv$;}`G@IUZa3w$mL z0KCo6*?5a~0}BQK-~i50gRk8i6P`fEXYLzsJ)6NI0|10>`aj|_+dN=(Bvu6nA)d@c zxTxH1i-1*GtR`s#g|GiVNKU?5%aN>pK6#$f@#ihfZ5_As3q;%;s;8W`>`dR0l0hV_ z3xE%~`8sb|JHedBhO)yHTn8-YD04T6^7f8S5B?*09P)_|UR|+*fX^HNUu7Oy$8VRf zKE~t%AAa%z4`|M7hkF10Q!elp9DxGq8j-FwS@HM9_P5JcKX`0h8EvsRcsS>&dN%;!+&3Q>TLz%a6(%YYHficb&67b@stMe>)CRqA;Z0o)8Q*_u)`=%`$ ztj##Ls@+4yeb58UHrCpxL8awyobvWZI`A0O=l{nk8DZ@aRuB-T7z<#-NP@Ti1=0T; z@;7vo`oQ1VX4nGYWYC5zKs3aUIDoS8QC8me91gi+YnHBUj=XN?ytV<-U;2QaUdAR+ zyZNp-aCB?3Ar~;W05+3WpIc4frtL|o9|^L$eN`X$QKyGq)1#q~RCAnkz8uHD9t=X) z_S_IK088lc#e`4SyTIpbNJ?Y2fQAF^4r~Vxe|&Dlcr{ctd+mc6q9`$f2g25^YXCe4 zDN|CuUO6^J($)NV5d^p=a7rHlA26cXPm-H$(s<)U7Z<=v7Z7{b7I@$ete2^S0c`>Z z<2V1(a?1s-E88=R-^2^8uB#{aJaR$4vo+LL-9 zpC;!)=1z1z{|1%yd}0IUVULO+WwukxUEO1aoQ+l_S7BIzZz1xUfR-T&iOO; zG`(m`1?aE=hZ7rz5pK)7vY+-xvB|~2+rBN}(<*G=asT|h$E!^DIC;>hzZ*`;m_8w* zg9wLg(gPqy8((+bEagP*eBFHpHvux133;pIrhOA}VR