diff --git a/BizHawk.MultiClient/Config.cs b/BizHawk.MultiClient/Config.cs index ef8b105724..a55c3b2044 100644 --- a/BizHawk.MultiClient/Config.cs +++ b/BizHawk.MultiClient/Config.cs @@ -369,13 +369,15 @@ namespace BizHawk.MultiClient public int CheatsNameWidth = -1; public int CheatsAddressWidth = -1; public int CheatsValueWidth = -1; + public int CheatsCompareWidth = -1; public int CheatsDomainWidth = -1; public int CheatsOnWidth = -1; public int CheatsNameIndex = 0; public int CheatsAddressIndex = 1; public int CheatsValueIndex = 2; - public int CheatsDomainIndex = 3; + public int CheatsCompareIndex = 3; public int CheatsOnIndex = 4; + public int CheatsDomainIndex = 5; // TAStudio Dialog public bool TAStudioSaveWindowPosition = true; diff --git a/BizHawk.MultiClient/tools/CheatList.cs b/BizHawk.MultiClient/tools/CheatList.cs index a9429b1f4a..0acdab648f 100644 --- a/BizHawk.MultiClient/tools/CheatList.cs +++ b/BizHawk.MultiClient/tools/CheatList.cs @@ -45,30 +45,47 @@ namespace BizHawk.MultiClient temp = s.Substring(0, 2); c.value = byte.Parse(temp, NumberStyles.HexNumber); + bool comparefailed = false; //adelikat: This is a hack for 1.0.6 to support .cht files made in previous versions before the compare value was implemented y = s.IndexOf('\t') + 1; - s = s.Substring(y, s.Length - y); //Memory Domain + s = s.Substring(y, s.Length - y); //Compare temp = s.Substring(0, s.IndexOf('\t')); - c.domain = SetDomain(temp); + try + { + if (temp == "N") + { + c.compare = null; + } + else + { + c.compare = byte.Parse(temp, NumberStyles.HexNumber); + } + } + catch + { + comparefailed = true; + c.domain = SetDomain(temp); + } + + if (!comparefailed) + { + y = s.IndexOf('\t') + 1; + s = s.Substring(y, s.Length - y); //Memory Domain + temp = s.Substring(0, s.IndexOf('\t')); + c.domain = SetDomain(temp); + } y = s.IndexOf('\t') + 1; s = s.Substring(y, s.Length - y); //Enabled y = int.Parse(s[0].ToString()); - //try - //{ - if (y == 0) - { - c.Disable(); - } - else - { - c.Enable(); - } - //} - //catch - //{ - // NotSupportedError(); - //} + if (y == 0) + { + c.Disable(); + } + else + { + c.Enable(); + } y = s.IndexOf('\t') + 1; s = s.Substring(y, s.Length - y); //Name @@ -200,11 +217,27 @@ namespace BizHawk.MultiClient { str += FormatAddress(cheatList[x].address) + "\t"; str += String.Format("{0:X2}", cheatList[x].value) + "\t"; - str += cheatList[x].domain.Name + "\t"; - if (cheatList[x].IsEnabled()) - str += "1\t"; + + if (cheatList[x].compare == null) + { + str += "N\t"; + } else + { + str += String.Format("{0:X2}", cheatList[x].compare) + "\t"; + } + + str += cheatList[x].domain.Name + "\t"; + + if (cheatList[x].IsEnabled()) + { + str += "1\t"; + } + else + { str += "0\t"; + } + str += cheatList[x].name + "\n"; } @@ -258,10 +291,12 @@ namespace BizHawk.MultiClient public bool AttemptLoadCheatFile() { string CheatFile = MakeDefaultFilename(); - var file = new FileInfo(CheatFile); + if (file.Exists == false) + { return false; + } else { LoadCheatFile(CheatFile, false); @@ -298,6 +333,10 @@ namespace BizHawk.MultiClient public void Add(Cheat c) { + if (c == null) + { + return; + } cheatList.Add(c); Global.MainForm.UpdateCheatStatus(); } @@ -316,8 +355,12 @@ namespace BizHawk.MultiClient public bool HasActiveCheat() { for (int x = 0; x < cheatList.Count; x++) + { if (cheatList[x].IsEnabled()) + { return true; + } + } return false; } } diff --git a/BizHawk.MultiClient/tools/Cheats.Designer.cs b/BizHawk.MultiClient/tools/Cheats.Designer.cs index 46b5d4723d..13863c5833 100644 --- a/BizHawk.MultiClient/tools/Cheats.Designer.cs +++ b/BizHawk.MultiClient/tools/Cheats.Designer.cs @@ -98,6 +98,7 @@ this.toggleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeSelectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.disableAllCheatsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.Compare = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.CheatsMenu.SuspendLayout(); this.toolStrip1.SuspendLayout(); this.AddCheatGroup.SuspendLayout(); @@ -112,7 +113,7 @@ this.optionsToolStripMenuItem}); this.CheatsMenu.Location = new System.Drawing.Point(0, 0); this.CheatsMenu.Name = "CheatsMenu"; - this.CheatsMenu.Size = new System.Drawing.Size(509, 24); + this.CheatsMenu.Size = new System.Drawing.Size(587, 24); this.CheatsMenu.TabIndex = 1; this.CheatsMenu.Text = "menuStrip1"; // @@ -128,7 +129,7 @@ this.toolStripSeparator1, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fileToolStripMenuItem.Text = "&File"; this.fileToolStripMenuItem.DropDownOpened += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpened); // @@ -137,7 +138,7 @@ this.newToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.NewFile; this.newToolStripMenuItem.Name = "newToolStripMenuItem"; this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.newToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.newToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.newToolStripMenuItem.Text = "&New"; this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); // @@ -146,7 +147,7 @@ this.openToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.OpenFile; this.openToolStripMenuItem.Name = "openToolStripMenuItem"; this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.openToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.openToolStripMenuItem.Text = "&Open..."; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // @@ -155,23 +156,23 @@ this.saveToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.SaveAs; this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.saveToolStripMenuItem.Text = "&Save"; this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); // // saveAsToolStripMenuItem // this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; - this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.S))); - this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.saveAsToolStripMenuItem.Text = "Save &As..."; this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); // // appendFileToolStripMenuItem // this.appendFileToolStripMenuItem.Name = "appendFileToolStripMenuItem"; - this.appendFileToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.appendFileToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.appendFileToolStripMenuItem.Text = "Append File"; this.appendFileToolStripMenuItem.Click += new System.EventHandler(this.appendFileToolStripMenuItem_Click); // @@ -183,37 +184,37 @@ this.clearToolStripMenuItem}); this.recentToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.Recent; this.recentToolStripMenuItem.Name = "recentToolStripMenuItem"; - this.recentToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.recentToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.recentToolStripMenuItem.Text = "Recent"; this.recentToolStripMenuItem.DropDownOpened += new System.EventHandler(this.recentToolStripMenuItem_DropDownOpened); // // noneToolStripMenuItem // this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; - this.noneToolStripMenuItem.Size = new System.Drawing.Size(110, 22); + this.noneToolStripMenuItem.Size = new System.Drawing.Size(103, 22); this.noneToolStripMenuItem.Text = "None"; // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(107, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(100, 6); // // clearToolStripMenuItem // this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; - this.clearToolStripMenuItem.Size = new System.Drawing.Size(110, 22); + this.clearToolStripMenuItem.Size = new System.Drawing.Size(103, 22); this.clearToolStripMenuItem.Text = "Clear"; // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(201, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6); // // exitToolStripMenuItem // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.exitToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.exitToolStripMenuItem.Text = "E&xit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // @@ -231,7 +232,7 @@ this.toolStripSeparator6, this.disableAllCheatsToolStripMenuItem}); this.cheatsToolStripMenuItem.Name = "cheatsToolStripMenuItem"; - this.cheatsToolStripMenuItem.Size = new System.Drawing.Size(53, 20); + this.cheatsToolStripMenuItem.Size = new System.Drawing.Size(55, 20); this.cheatsToolStripMenuItem.Text = "&Cheats"; this.cheatsToolStripMenuItem.DropDownOpened += new System.EventHandler(this.cheatsToolStripMenuItem_DropDownOpened); // @@ -239,7 +240,7 @@ // this.addCheatToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.Freeze; this.addCheatToolStripMenuItem.Name = "addCheatToolStripMenuItem"; - this.addCheatToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.addCheatToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.addCheatToolStripMenuItem.Text = "&Add Cheat"; this.addCheatToolStripMenuItem.Click += new System.EventHandler(this.addCheatToolStripMenuItem_Click); // @@ -248,7 +249,7 @@ this.removeCheatToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.Delete; this.removeCheatToolStripMenuItem.Name = "removeCheatToolStripMenuItem"; this.removeCheatToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R))); - this.removeCheatToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.removeCheatToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.removeCheatToolStripMenuItem.Text = "&Remove Cheat"; this.removeCheatToolStripMenuItem.Click += new System.EventHandler(this.removeCheatToolStripMenuItem_Click); // @@ -257,7 +258,7 @@ this.duplicateToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.Duplicate; this.duplicateToolStripMenuItem.Name = "duplicateToolStripMenuItem"; this.duplicateToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); - this.duplicateToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.duplicateToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.duplicateToolStripMenuItem.Text = "&Duplicate"; this.duplicateToolStripMenuItem.Click += new System.EventHandler(this.duplicateToolStripMenuItem_Click); // @@ -266,21 +267,21 @@ this.insertSeparatorToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.InsertSeparator; this.insertSeparatorToolStripMenuItem.Name = "insertSeparatorToolStripMenuItem"; this.insertSeparatorToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.insertSeparatorToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.insertSeparatorToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.insertSeparatorToolStripMenuItem.Text = "Insert Separator"; this.insertSeparatorToolStripMenuItem.Click += new System.EventHandler(this.insertSeparatorToolStripMenuItem_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(198, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(190, 6); // // moveUpToolStripMenuItem // this.moveUpToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.MoveUp; this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem"; this.moveUpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.U))); - this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.moveUpToolStripMenuItem.Text = "Move &Up"; this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click); // @@ -289,7 +290,7 @@ this.moveDownToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.MoveDown; this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem"; this.moveDownToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); - this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.moveDownToolStripMenuItem.Text = "Move &Down"; this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click); // @@ -297,20 +298,20 @@ // this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; this.selectAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.selectAllToolStripMenuItem.Text = "Select &All"; this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); // // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(198, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(190, 6); // // disableAllCheatsToolStripMenuItem // this.disableAllCheatsToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.Stop; this.disableAllCheatsToolStripMenuItem.Name = "disableAllCheatsToolStripMenuItem"; - this.disableAllCheatsToolStripMenuItem.Size = new System.Drawing.Size(201, 22); + this.disableAllCheatsToolStripMenuItem.Size = new System.Drawing.Size(193, 22); this.disableAllCheatsToolStripMenuItem.Text = "Disable all Cheats"; this.disableAllCheatsToolStripMenuItem.Click += new System.EventHandler(this.disableAllCheatsToolStripMenuItem_Click); // @@ -325,54 +326,54 @@ this.toolStripSeparator5, this.restoreWindowSizeToolStripMenuItem}); this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; - this.optionsToolStripMenuItem.Size = new System.Drawing.Size(56, 20); + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20); this.optionsToolStripMenuItem.Text = "&Options"; this.optionsToolStripMenuItem.DropDownOpened += new System.EventHandler(this.optionsToolStripMenuItem_DropDownOpened); // // LoadCheatFileByGameToolStripMenuItem // this.LoadCheatFileByGameToolStripMenuItem.Name = "LoadCheatFileByGameToolStripMenuItem"; - this.LoadCheatFileByGameToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.LoadCheatFileByGameToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.LoadCheatFileByGameToolStripMenuItem.Text = "Load Cheat File by Game"; this.LoadCheatFileByGameToolStripMenuItem.Click += new System.EventHandler(this.LoadCheatFileByGameToolStripMenuItem_Click); // // saveCheatsOnCloseToolStripMenuItem // this.saveCheatsOnCloseToolStripMenuItem.Name = "saveCheatsOnCloseToolStripMenuItem"; - this.saveCheatsOnCloseToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.saveCheatsOnCloseToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.saveCheatsOnCloseToolStripMenuItem.Text = "Save Cheats on Close"; this.saveCheatsOnCloseToolStripMenuItem.Click += new System.EventHandler(this.saveCheatsOnCloseToolStripMenuItem_Click); // // CheatsOnOffLoadToolStripMenuItem // this.CheatsOnOffLoadToolStripMenuItem.Name = "CheatsOnOffLoadToolStripMenuItem"; - this.CheatsOnOffLoadToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.CheatsOnOffLoadToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.CheatsOnOffLoadToolStripMenuItem.Text = "Disable Cheats on Load"; this.CheatsOnOffLoadToolStripMenuItem.Click += new System.EventHandler(this.CheatsOnOffLoadToolStripMenuItem_Click); // // autoloadDialogToolStripMenuItem // this.autoloadDialogToolStripMenuItem.Name = "autoloadDialogToolStripMenuItem"; - this.autoloadDialogToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.autoloadDialogToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.autoloadDialogToolStripMenuItem.Text = "Auto-load Dialog"; this.autoloadDialogToolStripMenuItem.Click += new System.EventHandler(this.autoloadDialogToolStripMenuItem_Click); // // saveWindowPositionToolStripMenuItem // this.saveWindowPositionToolStripMenuItem.Name = "saveWindowPositionToolStripMenuItem"; - this.saveWindowPositionToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.saveWindowPositionToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.saveWindowPositionToolStripMenuItem.Text = "Save Window Position"; this.saveWindowPositionToolStripMenuItem.Click += new System.EventHandler(this.saveWindowPositionToolStripMenuItem_Click); // // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(201, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(202, 6); // // restoreWindowSizeToolStripMenuItem // this.restoreWindowSizeToolStripMenuItem.Name = "restoreWindowSizeToolStripMenuItem"; - this.restoreWindowSizeToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.restoreWindowSizeToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.restoreWindowSizeToolStripMenuItem.Text = "Restore Default Settings"; this.restoreWindowSizeToolStripMenuItem.Click += new System.EventHandler(this.restoreWindowSizeToolStripMenuItem_Click); // @@ -392,7 +393,7 @@ this.toolStripButtonMoveDown}); this.toolStrip1.Location = new System.Drawing.Point(0, 24); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(509, 25); + this.toolStrip1.Size = new System.Drawing.Size(587, 25); this.toolStrip1.TabIndex = 2; this.toolStrip1.Text = "toolStrip1"; // @@ -498,8 +499,8 @@ // // AddCheatGroup // - this.AddCheatGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); + this.AddCheatGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); this.AddCheatGroup.Controls.Add(this.EditButton); this.AddCheatGroup.Controls.Add(this.label6); this.AddCheatGroup.Controls.Add(this.DomainComboBox); @@ -512,7 +513,7 @@ this.AddCheatGroup.Controls.Add(this.label3); this.AddCheatGroup.Controls.Add(this.label2); this.AddCheatGroup.Controls.Add(this.label1); - this.AddCheatGroup.Location = new System.Drawing.Point(327, 72); + this.AddCheatGroup.Location = new System.Drawing.Point(405, 72); this.AddCheatGroup.Name = "AddCheatGroup"; this.AddCheatGroup.Size = new System.Drawing.Size(170, 245); this.AddCheatGroup.TabIndex = 4; @@ -647,16 +648,17 @@ // CheatListView // this.CheatListView.AllowColumnReorder = true; - this.CheatListView.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.CheatListView.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.CheatListView.AutoArrange = false; this.CheatListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.CheatName, this.Address, this.Value, - this.Domain, - this.On}); + this.Compare, + this.On, + this.Domain}); this.CheatListView.ContextMenuStrip = this.contextMenuStrip1; this.CheatListView.FullRowSelect = true; this.CheatListView.GridLines = true; @@ -666,7 +668,7 @@ this.CheatListView.Location = new System.Drawing.Point(12, 72); this.CheatListView.Name = "CheatListView"; this.CheatListView.selectedItem = -1; - this.CheatListView.Size = new System.Drawing.Size(298, 236); + this.CheatListView.Size = new System.Drawing.Size(376, 236); this.CheatListView.TabIndex = 0; this.CheatListView.UseCompatibleStateImageBehavior = false; this.CheatListView.View = System.Windows.Forms.View.Details; @@ -735,12 +737,16 @@ this.disableAllCheatsToolStripMenuItem1.Text = "Disable All Cheats"; this.disableAllCheatsToolStripMenuItem1.Click += new System.EventHandler(this.disableAllCheatsToolStripMenuItem1_Click); // + // Compare + // + this.Compare.Text = "Compare"; + // // Cheats // this.AllowDrop = true; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(509, 328); + this.ClientSize = new System.Drawing.Size(587, 328); this.Controls.Add(this.NumCheatsLabel); this.Controls.Add(this.AddCheatGroup); this.Controls.Add(this.MessageLabel); @@ -837,5 +843,6 @@ private System.Windows.Forms.ToolStripMenuItem autoloadDialogToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveCheatsOnCloseToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ColumnHeader Compare; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/tools/Cheats.cs b/BizHawk.MultiClient/tools/Cheats.cs index 78f6255603..3fb8f5770d 100644 --- a/BizHawk.MultiClient/tools/Cheats.cs +++ b/BizHawk.MultiClient/tools/Cheats.cs @@ -13,11 +13,12 @@ namespace BizHawk.MultiClient { public partial class Cheats : Form { - int defaultWidth; //For saving the default size of the dialog, so the user can restore if desired + int defaultWidth; //For saving the default size of the dialog, so the user can restore if desired int defaultHeight; int defaultNameWidth; int defaultAddressWidth; int defaultValueWidth; + int defaultCompareWidth; int defaultDomainWidth; int defaultOnWidth; @@ -61,39 +62,56 @@ namespace BizHawk.MultiClient private void CheatListView_QueryItemBkColor(int index, int column, ref Color color) { if (Global.CheatList.Cheat(index).address < 0) + { color = Color.DarkGray; - else if (!Global.CheatList.Cheat(index).IsEnabled()) + } + else if (Global.CheatList.Cheat(index).IsEnabled()) + { + color = Color.LightCyan; + } + else + { color = this.BackColor; + } } private void CheatListView_QueryItemText(int index, int column, out string text) { text = ""; - if (Global.CheatList.Cheat(index).address == -1) + if (Global.CheatList.Cheat(index).address == -1) //Separator + { return; - - if (column == 0) //Name + } + else if (column == 0) //Name { text = Global.CheatList.Cheat(index).name; } - if (column == 1) //Address + else if (column == 1) //Address { text = Global.CheatList.FormatAddress(Global.CheatList.Cheat(index).address); } - if (column == 2) //Value + else if (column == 2) //Value { text = String.Format("{0:X2}", Global.CheatList.Cheat(index).value); } - if (column == 3) //Domain + else if (column == 3) //Compare + { + text = String.Format("{0:X2}", Global.CheatList.Cheat(index).compare); + } + else if (column == 5) //Domain { text = Global.CheatList.Cheat(index).domain.Name; } - if (column == 4) //Enabled + else if (column == 4) //Enabled { if (Global.CheatList.Cheat(index).IsEnabled()) + { text = "*"; + } else + { text = ""; + } } } @@ -141,6 +159,10 @@ namespace BizHawk.MultiClient public void AddCheat(Cheat c) { + if (c == null) + { + return; + } Changes(); Global.CheatList.Add(c); Global.OSD.AddMessage("Cheat added."); @@ -223,11 +245,14 @@ namespace BizHawk.MultiClient defaultNameWidth = CheatListView.Columns[Global.Config.CheatsNameIndex].Width; defaultAddressWidth = CheatListView.Columns[Global.Config.CheatsAddressIndex].Width; defaultValueWidth = CheatListView.Columns[Global.Config.CheatsValueIndex].Width; - defaultDomainWidth = CheatListView.Columns[Global.Config.CheatsDomainIndex].Width; + defaultCompareWidth = CheatListView.Columns[Global.Config.CheatsCompareIndex].Width; defaultOnWidth = CheatListView.Columns[Global.Config.CheatsOnIndex].Width; + defaultDomainWidth = CheatListView.Columns[Global.Config.CheatsDomainIndex].Width; if (Global.Config.CheatsSaveWindowPosition && Global.Config.CheatsWndx >= 0 && Global.Config.CheatsWndy >= 0) + { Location = new Point(Global.Config.CheatsWndx, Global.Config.CheatsWndy); + } if (Global.Config.CheatsWidth >= 0 && Global.Config.CheatsHeight >= 0) { @@ -235,15 +260,29 @@ namespace BizHawk.MultiClient } if (Global.Config.CheatsNameWidth > 0) + { CheatListView.Columns[Global.Config.CheatsNameIndex].Width = Global.Config.CheatsNameWidth; + } if (Global.Config.CheatsAddressWidth > 0) + { CheatListView.Columns[Global.Config.CheatsAddressIndex].Width = Global.Config.CheatsAddressWidth; + } if (Global.Config.CheatsValueWidth > 0) + { CheatListView.Columns[Global.Config.CheatsValueIndex].Width = Global.Config.CheatsValueWidth; + } + if (Global.Config.CheatsCompareWidth > 0) + { + CheatListView.Columns[Global.Config.CheatsValueIndex].Width = Global.Config.CheatsCompareWidth; + } if (Global.Config.CheatsDomainWidth > 0) + { CheatListView.Columns[Global.Config.CheatsDomainIndex].Width = Global.Config.CheatsDomainWidth; + } if (Global.Config.CheatsOnWidth > 0) + { CheatListView.Columns[Global.Config.CheatsOnIndex].Width = Global.Config.CheatsOnWidth; + } } public void SaveConfigSettings() @@ -257,8 +296,9 @@ namespace BizHawk.MultiClient Global.Config.CheatsNameWidth = CheatListView.Columns[Global.Config.CheatsNameIndex].Width; Global.Config.CheatsAddressWidth = CheatListView.Columns[Global.Config.CheatsAddressIndex].Width; Global.Config.CheatsValueWidth = CheatListView.Columns[Global.Config.CheatsValueIndex].Width; - Global.Config.CheatsDomainWidth = CheatListView.Columns[Global.Config.CheatsDomainIndex].Width; + Global.Config.CheatsCompareWidth = CheatListView.Columns[Global.Config.CheatsCompareIndex].Width; Global.Config.CheatsOnWidth = CheatListView.Columns[Global.Config.CheatsOnIndex].Width; + Global.Config.CheatsDomainWidth = CheatListView.Columns[Global.Config.CheatsDomainIndex].Width; } public void DisplayCheatsList() @@ -455,7 +495,9 @@ namespace BizHawk.MultiClient private void Save() { if (string.Compare(Global.CheatList.currentCheatFile, "") == 0) + { Global.CheatList.currentCheatFile = Global.CheatList.MakeDefaultFilename(); + } Global.CheatList.SaveCheatFile(Global.CheatList.currentCheatFile); MessageLabel.Text = Path.GetFileName(Global.CheatList.currentCheatFile) + " saved."; @@ -559,20 +601,26 @@ namespace BizHawk.MultiClient private Cheat MakeCheat() { + if (String.IsNullOrWhiteSpace(AddressBox.Text) || String.IsNullOrWhiteSpace(ValueBox.Text)) + { + return null; + } + Cheat c = new Cheat(); c.name = NameBox.Text; - c.address = int.Parse(AddressBox.Text, NumberStyles.HexNumber); //TODO: validation - c.value = (byte)(int.Parse(ValueBox.Text, NumberStyles.HexNumber)); - c.domain = Global.Emulator.MemoryDomains[DomainComboBox.SelectedIndex]; + try { + c.address = int.Parse(AddressBox.Text, NumberStyles.HexNumber); + c.value = (byte)(int.Parse(ValueBox.Text, NumberStyles.HexNumber)); c.Enable(); } catch { - Global.CheatList.NotSupportedError(); + return null; } + c.domain = Global.Emulator.MemoryDomains[DomainComboBox.SelectedIndex]; return c; } @@ -792,14 +840,16 @@ namespace BizHawk.MultiClient Global.Config.CheatsNameIndex = 0; Global.Config.CheatsAddressIndex = 1; Global.Config.CheatsValueIndex = 2; - Global.Config.CheatsDomainIndex = 3; + Global.Config.CheatsCompareIndex = 3; Global.Config.CheatsOnIndex = 4; + Global.Config.CheatsDomainIndex = 5; ColumnPositionSet(); CheatListView.Columns[0].Width = defaultNameWidth; CheatListView.Columns[1].Width = defaultAddressWidth; CheatListView.Columns[2].Width = defaultValueWidth; - CheatListView.Columns[3].Width = defaultDomainWidth; + CheatListView.Columns[3].Width = defaultCompareWidth; CheatListView.Columns[4].Width = defaultOnWidth; + CheatListView.Columns[5].Width = defaultDomainWidth; } @@ -915,8 +965,13 @@ namespace BizHawk.MultiClient Global.Config.CheatsNameIndex += changeIndex; if (Global.Config.CheatsAddressIndex >= lowIndex && Global.Config.CheatsAddressIndex <= highIndex) Global.Config.CheatsAddressIndex += changeIndex; + if (Global.Config.CheatsValueIndex >= lowIndex && Global.Config.CheatsValueIndex <= highIndex) Global.Config.CheatsValueIndex += changeIndex; + + if (Global.Config.CheatsCompareIndex >= lowIndex && Global.Config.CheatsCompareIndex <= highIndex) + Global.Config.CheatsCompareIndex += changeIndex; + if (Global.Config.CheatsDomainIndex >= lowIndex && Global.Config.CheatsDomainIndex <= highIndex) Global.Config.CheatsDomainIndex += changeIndex; if (Global.Config.CheatsOnIndex >= lowIndex && Global.Config.CheatsOnIndex <= highIndex) @@ -928,10 +983,13 @@ namespace BizHawk.MultiClient Global.Config.CheatsAddressIndex = e.NewDisplayIndex; else if (header.Text == "Value") Global.Config.CheatsValueIndex = e.NewDisplayIndex; - else if (header.Text == "Domain") - Global.Config.CheatsDomainIndex = e.NewDisplayIndex; + else if (header.Text == "Compare") + Global.Config.CheatsCompareIndex = e.NewDisplayIndex; else if (header.Text == "On") Global.Config.CheatsOnIndex = e.NewDisplayIndex; + else if (header.Text == "Domain") + Global.Config.CheatsDomainIndex = e.NewDisplayIndex; + } private void ColumnPositionSet() @@ -939,7 +997,9 @@ namespace BizHawk.MultiClient List columnHeaders = new List(); int i = 0; for (i = 0; i < CheatListView.Columns.Count; i++) + { columnHeaders.Add(CheatListView.Columns[i]); + } CheatListView.Columns.Clear(); @@ -953,6 +1013,8 @@ namespace BizHawk.MultiClient column = "Address"; else if (Global.Config.CheatsValueIndex == i) column = "Value"; + else if (Global.Config.CheatsCompareIndex == i) + column = "Compare"; else if (Global.Config.CheatsDomainIndex == i) column = "Domain"; else if (Global.Config.CheatsOnIndex == i) diff --git a/BizHawk.MultiClient/tools/Cheats.resx b/BizHawk.MultiClient/tools/Cheats.resx index 38bf6ec04d..b5f752713c 100644 --- a/BizHawk.MultiClient/tools/Cheats.resx +++ b/BizHawk.MultiClient/tools/Cheats.resx @@ -127,60 +127,58 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq - wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm - u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l - 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT - PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy - KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEPSURBVDhPrdPZasJAFAZgX8q+Q32N9o2kXkjphQsigoJC + ixa1VAWXiohG7IakbmjcNcYl5i8TCQSdGXPhgcPczHwz5xzGZrtWRN+bOM1wqo5gvAJfrIBy4w/cu8hh + VjyG3nDjuOcjkbTABB58cSRy9SMiiPSXhF6rTMDpedEPG0ktJfD8wQT26gEEMSAq4I3mqYCmaZCVHQZj + WQfst3f0Ep7CGSqw3amYzBWI/TkfcAdTZ4B60LCQt+hJK3yJEz7g8ifOAGWzhzRdo9WdofYt8QFSnzlI + 42bLDdqDBZqtMUpC3zpgbtxPe4rq5xDZSsc6YG6c8DtCodZDsihaA4x5s1bmGI0Zkw2X8lofWHf+AdjM + 9sNc+xBlAAAAAElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I - k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC - TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p - AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 - BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr - UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG - CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 - F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS - rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt - NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp - 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W - AAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPlZNdSNNRGMb/F110ZZEVhVBgeeHNICiiuggp + olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdPKMgr7kApFItTUkWZqVhSVYmao5Nev/xyoQ4k88Nyc + 8z6/93nP4QjCfy6lwc4ltZVso4P/tMyXRcmMHqZ0EeY6jZQVInzuf0e1Tb9Ina3P/tkpLD6XkNg8BJe5 + u93C+HDVrP4M2ZkcMOOw5tLZ9nxJyJE4HSExBoKkBQhVpTrGhso9zNPfiph0JlB+U01ZcRbmwnRMeWlc + 08opUCV6QissGsZ+WOY6z4hmuuXglC6pRYBbJSp+fzXNxnaZ66o1s3rkyKHWruJuWRYOcwZ2kxKr8TI3 + DCkU6+QYNUnuNGWmLEY+5uOK3degoKZcx3SfEvozPfVB3OtNhi4ZvI2nrTIc23U9gtmYwa8eNXzScq8i + l6bHWnfRwhHeREJzGFONgYw/CeB9qQSZNNR9FyUGBT87lfQ3plJj1zLTq4COGDegLVo0HmeqKZjx+gOM + PNzDYPU2lLF+4jhyN6BIl8pgexK3bRpaXopJuhJEwGloiWDmVSgTLw4xWreXoZrtfK/wp/nKak4E+s6/ + hDFHTkd9GndsOdCTBq1i3NdHmWgIYvRpAMO1OxlwSPhi2YpT641CuoWzsSfnAfnZiVRZ1Tjvx9GsF+bU + pF1BvWolD9JXUZmyDnOiD1cvbCZiYXfXCPrMi+gVZ8hOiiL53DHORwdzKnw/hw/uYt9uCTskfvj7+rBp + 41rWr/Fig7fX8j/Tsn/fcgx/ARfG3ml6M3rzAAAAAElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L - k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz - V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc - KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa - huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth - LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK - lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl - cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN - e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 - 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH - Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIsSURBVDhPrZPdS5NxFMf3L3TfTdBFtzU1hmuxGjzlHMqq + YVgRvT2RL+XSZZqoWJlGLV8gW+HSScvpJJxU+AamSI2hTCVLM1e0xKGm2EQw+PY7v+j5tTIvoh+cy8/n + POec76NS/Y/37GkUVL72ZbR5l/DYvYDGhgjuO2ZQW/MJ9tsh3CifQmnJBAoLXiMvdxQXzgeh9Cawtweo + qV7FRm9ldQ3GtF4cTnvCSxF4Wxe5oLLiy195giMLK9htfg61WoblkEcI3I/muaC05PO6gp/w+/Ai4kw+ + FFyexgFzkxA462e54JLt3R+CX+GRyQi2SV5Yc8aRmuIUgrq7YS7IzhqNEfwODwbD2Kx3Q5YDMJkcQlBd + 9ZEL5DMBRbAe3OP/gE2JDThy9AWSkmqF4GblNLq7wE4JHD/5CpZjA3zbtDCamT6bOv+A+3DQ0glJsgvB + 1bJJdPjAMgA0ub6xu39F+fU5vlRaGM2cmRFU4OTUdhgMFUJwpXAcnmbgoXONBScKY3pOTJlP2JB+roh3 + Tk5h8H4P9PoyIbDljTEYqLoT5Z1JwEKCOK2EobezGJuag5x7DXuNbRzW7nFBpysSAoql4x6UzyYBwWfz + b+FNaB6hmSVcLLYjXu9icCPidz2ANjFfCDIzhtncy3zmrQYPtuyQ0NLRD1/XILr7/Bh4OYR9JgvUunok + MHi7pg4ajVUIKNOnT/XzeFLCKCR0ZzoVbZsWRjNTVyqCdyZkxwr+9a/+Dk60OMVjMFpXAAAAAElFTkSu + QmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP - klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU - 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc - GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 - DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI - Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy - IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 - 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx - z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt - AAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHiSURBVDhPpZPRT5JRGMb9U0rHnHXtH9BaWa0222pe1EVb + 2briQq+6atlsyzVstIkhzcLSAfahtJbS0mESaQaJlIGTzBkslPEpiSDor+87LAnawM13e+7O+3uf55z3 + VFUdtBwT31AljQeELCNe+hwfCC//Yl9stbm0zMMerrc9J7i4XBliHwsU9ed2dunqf4PTHeBSS2dliGXU + JwDOEEifwR+WeWh+jTQpY5tIYHUleDKaQD8UFwquZIpd9Tk8ew4y2znkjTSRWFIASqt9YJX6Zje+hfUC + xGRziXO97m10IzK3pZ+0Pg3T/3btP0CLMYZjSuZo0zCf5uN5iEHJq+beTGVZTaRYiqzzNbyG6VVUADqk + nJBfmXpFF+VI00vqLgxS2/gsD1DzbqWze5O1phA3DF94YF0qciD/zrKwsoV7bgOjNIPm3OMCQE6mmf8e + wxeM4PH/YPzjIm29+ee9NZBEa4hy+X6I83dmhYzSNJoz3QVA/emrlKpVPysAWSVeLJFlLrzJmFfG/i7O + o0EPNQ368jtyrX1KAP6d/NdBt+091Sd05QEXb7pIZXYwDXnpsc9gfDEtJqvNBsskh4/fKw9o0DqV27YK + 1Taa0ZztoeZUF9UnO5XmDg4du1t5zff1mQ566A8dAOcMIXbZrQAAAABJRU5ErkJggg==