diff --git a/Forms/YtdForm.Designer.cs b/Forms/YtdForm.Designer.cs index 6e9dc23..737e01b 100644 --- a/Forms/YtdForm.Designer.cs +++ b/Forms/YtdForm.Designer.cs @@ -31,6 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YtdForm)); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.FileMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FileSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem(); this.EditMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ViewMenu = new System.Windows.Forms.ToolStripMenuItem(); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); @@ -47,13 +48,21 @@ this.SelTextureNameTextBox = new System.Windows.Forms.TextBox(); this.TextureTabControl = new System.Windows.Forms.TabControl(); this.TextureTabPage = new System.Windows.Forms.TabPage(); + this.label1 = new System.Windows.Forms.Label(); + this.SelTextureZoomCombo = new System.Windows.Forms.ComboBox(); + this.SelTexturePanel = new System.Windows.Forms.Panel(); + this.SelTexturePictureBox = new System.Windows.Forms.PictureBox(); this.SelTextureMipLabel = new System.Windows.Forms.Label(); this.SelTextureDimensionsLabel = new System.Windows.Forms.Label(); this.SelTextureMipTrackBar = new System.Windows.Forms.TrackBar(); this.label4 = new System.Windows.Forms.Label(); - this.SelTexturePictureBox = new System.Windows.Forms.PictureBox(); this.DetailsTabPage = new System.Windows.Forms.TabPage(); this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix(); + this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); + this.FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolbarSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolbarSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); this.toolStrip1.SuspendLayout(); this.MainToolbar.SuspendLayout(); @@ -63,8 +72,9 @@ this.MainSplitContainer.SuspendLayout(); this.TextureTabControl.SuspendLayout(); this.TextureTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).BeginInit(); + this.SelTexturePanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.SelTexturePictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).BeginInit(); this.DetailsTabPage.SuspendLayout(); this.SuspendLayout(); // @@ -82,11 +92,23 @@ // // FileMenu // - this.FileMenu.Enabled = false; + this.FileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FileSaveAsMenu, + this.FileSaveAllMenu}); this.FileMenu.Name = "FileMenu"; this.FileMenu.Size = new System.Drawing.Size(37, 20); this.FileMenu.Text = "File"; // + // FileSaveAllMenu + // + this.FileSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAllMenu.Image"))); + this.FileSaveAllMenu.Name = "FileSaveAllMenu"; + this.FileSaveAllMenu.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.FileSaveAllMenu.Size = new System.Drawing.Size(196, 22); + this.FileSaveAllMenu.Text = "Save All..."; + this.FileSaveAllMenu.Click += new System.EventHandler(this.FileSaveAllMenu_Click); + // // EditMenu // this.EditMenu.Enabled = false; @@ -136,12 +158,15 @@ // SaveButton // this.SaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.SaveButton.Enabled = false; + this.SaveButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ToolbarSaveAsMenu, + this.ToolbarSaveAllMenu}); this.SaveButton.Image = ((System.Drawing.Image)(resources.GetObject("SaveButton.Image"))); this.SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta; this.SaveButton.Name = "SaveButton"; this.SaveButton.Size = new System.Drawing.Size(32, 22); this.SaveButton.Text = "Save YTD..."; + this.SaveButton.ButtonClick += new System.EventHandler(this.SaveButton_ButtonClick); // // MainToolbar // @@ -241,11 +266,13 @@ // // TextureTabPage // + this.TextureTabPage.Controls.Add(this.label1); + this.TextureTabPage.Controls.Add(this.SelTextureZoomCombo); + this.TextureTabPage.Controls.Add(this.SelTexturePanel); this.TextureTabPage.Controls.Add(this.SelTextureMipLabel); this.TextureTabPage.Controls.Add(this.SelTextureDimensionsLabel); this.TextureTabPage.Controls.Add(this.SelTextureMipTrackBar); this.TextureTabPage.Controls.Add(this.label4); - this.TextureTabPage.Controls.Add(this.SelTexturePictureBox); this.TextureTabPage.Location = new System.Drawing.Point(4, 22); this.TextureTabPage.Name = "TextureTabPage"; this.TextureTabPage.Padding = new System.Windows.Forms.Padding(3); @@ -254,6 +281,57 @@ this.TextureTabPage.Text = "Texture"; this.TextureTabPage.UseVisualStyleBackColor = true; // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(452, 426); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(37, 13); + this.label1.TabIndex = 54; + this.label1.Text = "Zoom:"; + // + // SelTextureZoomCombo + // + this.SelTextureZoomCombo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.SelTextureZoomCombo.FormattingEnabled = true; + this.SelTextureZoomCombo.Items.AddRange(new object[] { + "Fill", + "100%", + "200%"}); + this.SelTextureZoomCombo.Location = new System.Drawing.Point(495, 423); + this.SelTextureZoomCombo.Name = "SelTextureZoomCombo"; + this.SelTextureZoomCombo.Size = new System.Drawing.Size(69, 21); + this.SelTextureZoomCombo.TabIndex = 53; + this.SelTextureZoomCombo.Text = "Fill"; + this.SelTextureZoomCombo.TextChanged += new System.EventHandler(this.SelTextureZoomCombo_TextChanged); + // + // SelTexturePanel + // + this.SelTexturePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SelTexturePanel.AutoScroll = true; + this.SelTexturePanel.BackColor = System.Drawing.Color.DarkGray; + this.SelTexturePanel.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("SelTexturePanel.BackgroundImage"))); + this.SelTexturePanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.SelTexturePanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.SelTexturePanel.Controls.Add(this.SelTexturePictureBox); + this.SelTexturePanel.Location = new System.Drawing.Point(6, 6); + this.SelTexturePanel.Name = "SelTexturePanel"; + this.SelTexturePanel.Size = new System.Drawing.Size(559, 408); + this.SelTexturePanel.TabIndex = 52; + // + // SelTexturePictureBox + // + this.SelTexturePictureBox.BackColor = System.Drawing.Color.Transparent; + this.SelTexturePictureBox.Location = new System.Drawing.Point(0, 0); + this.SelTexturePictureBox.Name = "SelTexturePictureBox"; + this.SelTexturePictureBox.Size = new System.Drawing.Size(133, 96); + this.SelTexturePictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.SelTexturePictureBox.TabIndex = 45; + this.SelTexturePictureBox.TabStop = false; + // // SelTextureMipLabel // this.SelTextureMipLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -298,20 +376,6 @@ this.label4.TabIndex = 47; this.label4.Text = "Mip:"; // - // SelTexturePictureBox - // - this.SelTexturePictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SelTexturePictureBox.BackColor = System.Drawing.Color.DarkGray; - this.SelTexturePictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.SelTexturePictureBox.Location = new System.Drawing.Point(6, 6); - this.SelTexturePictureBox.Name = "SelTexturePictureBox"; - this.SelTexturePictureBox.Size = new System.Drawing.Size(558, 408); - this.SelTexturePictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.SelTexturePictureBox.TabIndex = 45; - this.SelTexturePictureBox.TabStop = false; - // // DetailsTabPage // this.DetailsTabPage.Controls.Add(this.DetailsPropertyGrid); @@ -334,6 +398,35 @@ this.DetailsPropertyGrid.Size = new System.Drawing.Size(558, 445); this.DetailsPropertyGrid.TabIndex = 0; // + // SaveFileDialog + // + this.SaveFileDialog.Filter = "DDS files|*.dds|All files|*.*"; + // + // FileSaveAsMenu + // + this.FileSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAsMenu.Image"))); + this.FileSaveAsMenu.Name = "FileSaveAsMenu"; + this.FileSaveAsMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.FileSaveAsMenu.Size = new System.Drawing.Size(196, 22); + this.FileSaveAsMenu.Text = "Save As..."; + this.FileSaveAsMenu.Click += new System.EventHandler(this.FileSaveAsMenu_Click); + // + // ToolbarSaveAsMenu + // + this.ToolbarSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAsMenu.Image"))); + this.ToolbarSaveAsMenu.Name = "ToolbarSaveAsMenu"; + this.ToolbarSaveAsMenu.Size = new System.Drawing.Size(152, 22); + this.ToolbarSaveAsMenu.Text = "Save as..."; + this.ToolbarSaveAsMenu.Click += new System.EventHandler(this.ToolbarSaveAsMenu_Click); + // + // ToolbarSaveAllMenu + // + this.ToolbarSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAllMenu.Image"))); + this.ToolbarSaveAllMenu.Name = "ToolbarSaveAllMenu"; + this.ToolbarSaveAllMenu.Size = new System.Drawing.Size(152, 22); + this.ToolbarSaveAllMenu.Text = "Save All..."; + this.ToolbarSaveAllMenu.Click += new System.EventHandler(this.ToolbarSaveAllMenu_Click); + // // YtdForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -361,8 +454,10 @@ this.TextureTabControl.ResumeLayout(false); this.TextureTabPage.ResumeLayout(false); this.TextureTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).EndInit(); + this.SelTexturePanel.ResumeLayout(false); + this.SelTexturePanel.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.SelTexturePictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).EndInit(); this.DetailsTabPage.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -396,5 +491,14 @@ private System.Windows.Forms.ListView TexturesListView; private System.Windows.Forms.ColumnHeader TextureNameColumnHeader; private System.Windows.Forms.ColumnHeader TextureSizeColumnHeader; + private System.Windows.Forms.Panel SelTexturePanel; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox SelTextureZoomCombo; + private System.Windows.Forms.ToolStripMenuItem FileSaveAllMenu; + private System.Windows.Forms.SaveFileDialog SaveFileDialog; + private System.Windows.Forms.FolderBrowserDialog FolderBrowserDialog; + private System.Windows.Forms.ToolStripMenuItem FileSaveAsMenu; + private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAsMenu; + private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAllMenu; } } \ No newline at end of file diff --git a/Forms/YtdForm.cs b/Forms/YtdForm.cs index 2f1f9c8..dad6088 100644 --- a/Forms/YtdForm.cs +++ b/Forms/YtdForm.cs @@ -6,6 +6,7 @@ using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; +using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; @@ -19,6 +20,9 @@ namespace CodeWalker.Forms private string fileName; private YtdFile Ytd { get; set; } private TextureDictionary TexDict { get; set; } + private Texture CurrentTexture = null; + private float CurrentZoom = 0.0f; //1.0 = 100%, 0.0 = stretch + public YtdForm() { @@ -90,6 +94,9 @@ namespace CodeWalker.Forms private void ShowTextureMip(Texture tex, int mip, bool mipchange) { + CurrentTexture = tex; + UpdateSaveAs(); + if (tex == null) { SelTexturePictureBox.Image = null; @@ -157,6 +164,7 @@ namespace CodeWalker.Forms SelTexturePictureBox.Image = null; } + UpdateZoom(); } @@ -171,6 +179,92 @@ namespace CodeWalker.Forms StatusLabel.Text = text; } + private void UpdateZoom() + { + //update the image controls for the current zoom level + + var img = SelTexturePictureBox.Image; + + if (CurrentZoom <= 0.0f) + { + //stretch image to fit the area available. + SelTexturePanel.AutoScroll = false; + SelTexturePictureBox.SizeMode = PictureBoxSizeMode.Zoom; + SelTexturePictureBox.Width = SelTexturePanel.Width - 2; + SelTexturePictureBox.Height = SelTexturePanel.Height - 2; + SelTexturePictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + } + else + { + //zoom to the given pixel ratio... + var w = (int)(img.Width * CurrentZoom); + var h = (int)(img.Height * CurrentZoom); + SelTexturePictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Left; + SelTexturePictureBox.SizeMode = PictureBoxSizeMode.StretchImage; + SelTexturePictureBox.Width = w; + SelTexturePictureBox.Height = h; + SelTexturePanel.AutoScroll = true; + } + + } + + + + + + private void UpdateSaveAs() + { + if (CurrentTexture == null) + { + FileSaveAsMenu.Text = "Save As..."; + ToolbarSaveAsMenu.Text = "Save As..."; + FileSaveAsMenu.Enabled = false; + ToolbarSaveAsMenu.Enabled = false; + } + else + { + string fname = CurrentTexture.Name + ".dds"; + string sas = "Save " + fname + " As..."; + FileSaveAsMenu.Text = sas; + ToolbarSaveAsMenu.Text = sas; + FileSaveAsMenu.Enabled = true; + ToolbarSaveAsMenu.Enabled = true; + } + } + + + private void SaveAs() + { + if (CurrentTexture == null) return; + string fname = CurrentTexture.Name + ".dds"; + SaveFileDialog.FileName = fname; + if (SaveFileDialog.ShowDialog() != DialogResult.OK) return; + string fpath = SaveFileDialog.FileName; + byte[] dds = DDSIO.GetDDSFile(CurrentTexture); + File.WriteAllBytes(fpath, dds); + } + + private void SaveAll() + { + if (TexDict?.Textures?.data_items == null) return; + if (FolderBrowserDialog.ShowDialog() != DialogResult.OK) return; + var folder = FolderBrowserDialog.SelectedPath; + foreach (var tex in TexDict.Textures.data_items) + { + byte[] dds = DDSIO.GetDDSFile(tex); + string bpath = folder + "\\" + tex.Name; + string fpath = bpath + ".dds"; + int c = 1; + while (File.Exists(fpath)) + { + fpath = bpath + "_Copy" + c.ToString() + ".dds"; + c++; + } + File.WriteAllBytes(fpath, dds); + } + } + + private void TexturesListView_SelectedIndexChanged(object sender, EventArgs e) { @@ -192,5 +286,47 @@ namespace CodeWalker.Forms SelTextureMipLabel.Text = SelTextureMipTrackBar.Value.ToString(); ShowTextureMip(tex, SelTextureMipTrackBar.Value, true); } + + private void SelTextureZoomCombo_TextChanged(object sender, EventArgs e) + { + string s = SelTextureZoomCombo.Text; + if (s.EndsWith("%")) s = s.Substring(0, s.Length - 1); + + float f; + if (!float.TryParse(s, out f)) + { + CurrentZoom = 0.0f; + } + else + { + CurrentZoom = Math.Min(Math.Max(f, 0.0f), 5000.0f) * 0.01f; + } + UpdateZoom(); + } + + private void FileSaveAllMenu_Click(object sender, EventArgs e) + { + SaveAll(); + } + + private void FileSaveAsMenu_Click(object sender, EventArgs e) + { + SaveAs(); + } + + private void SaveButton_ButtonClick(object sender, EventArgs e) + { + SaveAs(); + } + + private void ToolbarSaveAsMenu_Click(object sender, EventArgs e) + { + SaveAs(); + } + + private void ToolbarSaveAllMenu_Click(object sender, EventArgs e) + { + SaveAll(); + } } } diff --git a/Forms/YtdForm.resx b/Forms/YtdForm.resx index 5539127..091414c 100644 --- a/Forms/YtdForm.resx +++ b/Forms/YtdForm.resx @@ -120,10 +120,26 @@ 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w + /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk + Zj6kOg+KMcbGmUtDdyJaSzwBpkqkPmYm6EUAHamP6QUW3wjwWKSUph8VdNxj4VCeZCnA9CSmoBdp0WL/ + WFZ+wSPYQeqvhHADNufwigti+3EAAAAASUVORK5CYII= + + 132, 17 - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -143,6 +159,22 @@ ajugDypMiBJQluU3f2DiZ+YmT3eANWIyIyKgFsv/AOs2k4wSgIXneRBFEaRpyhew10ZbwNb3fU1oYrPe qAF5no/CMNSEJsbjiRqAty9JEk1ownEcNaA6BeK6riY2cdgf+SwC2Gf8BEGgCU2slis+iwB2mQZ4Ak3h K0QAIeQTi/cp4B9tCZE2c6oRhQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w + /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk + Zj6kOg+KMcbGmUtDdyJaSzwBpkqkPmYm6EUAHamP6QUW3wjwWKSUph8VdNxj4VCeZCnA9CSmoBdp0WL/ + WFZ+wSPYQeqvhHADNufwigti+3EAAAAASUVORK5CYII= @@ -156,6 +188,36 @@ 237, 17 + + + iVBORw0KGgoAAAANSUhEUgAAAAEAAAQACAIAAACvZKRoAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQUSURBVFhHlYvZVipJEEXj/xcIoqLgBI6IIyoO4IB4 + HQAVEdTf6XMiMqsSuui7+mGvvU9klfz+/soPoGN+7PZDrH9ws2+50bjrt7TrH36Lf8x/4dvzLd96g7HZ + 32zdwU07vE9hNIJHMtL+lhFQ6w3ozazf8XvdCQzjHgYejob6pj0cgrCn8SVf9NeXoe3u8BduhHff0xjQ + A8fXQPcATXgbDHAD+uY6iU/6022YW2F/fhp8G7geo+9A9z+lr+5LPwTvfbzx7t8+/JvfH/7+oW903/cH + nMD7xztAv5vf39k0thJ2wFvYb/IGv/HmeOMtkZ65BxNu7TfpoXtowpvvXrcnXQd3t9fFrWu3sNUJdMwd + uNPpqHnT7nbQvHXkVf0qnVfbnddXu9G8qf+DF/PL64u8vADvRJ7l2ffzs22YhD3GU9hP8JM8wYTNm9/k + j/qPswf7z995jPwoj49TaNNtuC1t7Da6PdkBDw7thwfg7w/S5obtHtMirZZ1i7ulO3IS9/dyr7TMLeIa + 3Pn3u7jv2Hd32A72BLfet8bd7a1repwb+uYGBjfWt/ANb2M0x2k2pancSHNsGw3SoBvSbDR009oB1wGN + 69DXcn0dcqW+Uq4U2+gr22rHpXIpV5cErR5v2nNxMb4vucHFxYW+mT11dZ2u09ZKfYLzupzD53C9fo4G + 546wyRl9JmeTnMWcRj6Vs1P2qWs4gRpd866pa9xobr15TgKfnMgJTGo19gTHvo/lGD7m1hs3OA45chzL + ETnyHCVySA4PIx+xD9nuTg5iHxwcAPjwINjT2d/fl4P9ce+7e0h1vwpXpVrFrtLW5mT2qnuyt0fQak/F + XNmTCtBdialMsluR3couDNTcAHsqO+ad3R1jZwc7bmU7Zht7W3sb7WDzTe3Zku0tY2tr2+GbJptRbzq2 + NuFN3AG96fZGtDdkc8PtDbR720AbbFBml90tdhku0+VJSlGXSMlchsulku2oY9bXnUvr2uvavHMns0bW + 1mR9jbY2wgarDvTq2qqsuq2tO2TFWLG9Qit2415Br+AbNVlekWXX9DK2Nr287G7wGEVZLloXHXovFqWI + u+GbDigUpVAsSAEu0p6CB++ul7yXvJekgFYX2Ev4Jr55FiMWZWkRt0UYvYheZAN94zdskHeOyJM8Oi95 + dB6d1zb4xn/8jlgIvLCgLJB80BHzDtvzDu153AP8ppOYm5+T+Tkaew7tbgr2VHIkF9xyksPO4U7zzfe/ + mDVmCTbJ5WaD+6ySc1b4XbhDsrOSnbhls1nAO53FN+bJjskYmaxkMhlA2z3jv9G7f0vqcWYiZpTMDO5g + ZsZa39D/j7Sk02lrOA1z+5va7TS/1e/jb5JJqVNwKoUNtHnndvdU8E0qxXdzmh3ZvXlSqX8AvThRdO5j + +6sAAAAASUVORK5CYII= + + + + 358, 17 + + + 489, 17 + AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA