Add popup box viewer

Allows for dragging between boxes
Pop up via shift-click Box tab

Click the swap arrows to flip Main/Viewer current box

Fixes swallowed exception: DragDrop a slot (filename), start another
within 500ms before deletion thread deletes original dragdrop file;
since filenames are the same the file for the active dragdrop will no
longer exist resulting in an exception. Solved by tracking the current
path of a dragdrop operation.

Had to refactor the draginfo into its own class to 'cleanly' communicate
between forms.
This commit is contained in:
Kaphotics 2016-08-25 18:50:51 -07:00
parent c34c4901ea
commit 4ea349df11
9 changed files with 1310 additions and 71 deletions

View file

@ -17,7 +17,7 @@ namespace PKHeX
{
#region Initialize Form
new Thread(() => new SplashScreen().ShowDialog()).Start();
slotPkmSource = SAV.BlankPKM.EncryptedPartyData;
DragInfo.slotPkmSource = SAV.BlankPKM.EncryptedPartyData;
InitializeComponent();
CB_ExtraBytes.SelectedIndex = 0;
SaveFile.SetUpdateDex = Menu_ModifyDex.Checked;
@ -774,6 +774,11 @@ namespace PKHeX
}
Menu_ExportSAV.Enabled = B_VerifyCHK.Enabled = SAV.Exportable;
// Close subforms that are save dependent
Type[] f = { typeof(SAV_BoxViewer), typeof(f2_Text) };
foreach (var form in Application.OpenForms.Cast<Form>().Where(form => f.Contains(form.GetType())).ToArray())
form.Close();
setBoxNames(); // Display the Box Names
if (SAV.HasBox)
{
@ -2402,7 +2407,7 @@ namespace PKHeX
invalid:
{ SystemSounds.Exclamation.Play(); return false; }
}
private static string[] verifyPKMtoSAV(PKM pk)
public static string[] verifyPKMtoSAV(PKM pk)
{
// Check if PKM properties are outside of the valid range
List<string> errata = new List<string>();
@ -2454,6 +2459,8 @@ namespace PKHeX
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
openQuick(files[0]);
e.Effect = DragDropEffects.Copy;
Cursor = DefaultCursor;
}
// Decrypted Export
private void dragout_MouseDown(object sender, MouseEventArgs e)
@ -2476,12 +2483,12 @@ namespace PKHeX
{
File.WriteAllBytes(newfile, dragdata);
PictureBox pb = (PictureBox)sender;
Cursor.Current = new Cursor(((Bitmap)pb.Image).GetHicon());
Cursor = DragInfo.Cursor = new Cursor(((Bitmap)pb.Image).GetHicon());
DoDragDrop(new DataObject(DataFormats.FileDrop, new[] { newfile }), DragDropEffects.Move);
}
catch (Exception x)
{ Util.Error("Drag & Drop Error", x.ToString()); }
Cursor.Current = DefaultCursor;
Cursor = DragInfo.Cursor = DefaultCursor;
File.Delete(newfile);
}
private void dragout_DragOver(object sender, DragEventArgs e)
@ -2502,6 +2509,8 @@ namespace PKHeX
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
openQuick(files[0]);
e.Effect = DragDropEffects.Copy;
Cursor = DefaultCursor;
}
#endregion
@ -2617,6 +2626,20 @@ namespace PKHeX
setPKXBoxes();
Util.Alert("Current Box sorted!");
}
else if (ModifierKeys == Keys.Shift)
{
var z = Application.OpenForms.Cast<Form>().FirstOrDefault(form => form.GetType() == typeof(SAV_BoxViewer)) as SAV_BoxViewer;
if (z != null)
{ Util.CenterToForm(z, this); z.BringToFront(); return; }
new SAV_BoxViewer(this).Show();
}
}
public int swapBoxesViewer(int viewBox)
{
int mainBox = CB_BoxSelect.SelectedIndex;
CB_BoxSelect.SelectedIndex = viewBox;
return mainBox;
}
private void clickSlot(object sender, EventArgs e)
@ -2980,8 +3003,8 @@ namespace PKHeX
catch
{
CB_BoxSelect.Items.Clear();
for (int i = 0; i < SAV.BoxCount; i++)
CB_BoxSelect.Items.Add("BOX " + (i+1));
for (int i = 1; i <= SAV.BoxCount; i++)
CB_BoxSelect.Items.Add($"BOX {i}");
}
if (selectedbox < CB_BoxSelect.Items.Count)
CB_BoxSelect.SelectedIndex = selectedbox; // restore selected box
@ -2992,7 +3015,7 @@ namespace PKHeX
pk = pk ?? preparePKM(false); // don't perform control loss click
if (pb == dragout) mnuLQR.Enabled = pk.Species != 0; // Species
pb.Image = pk.Sprite;
pb.Image = pk.Species != 0 ? pk.Sprite : null;
if (pb.BackColor == Color.Red)
pb.BackColor = Color.Transparent;
}
@ -3312,7 +3335,7 @@ namespace PKHeX
// Drag and drop related functions
private void pbBoxSlot_MouseClick(object sender, MouseEventArgs e)
{
if (slotDragDropInProgress)
if (DragInfo.slotDragDropInProgress)
return;
clickSlot(sender, e);
@ -3320,23 +3343,23 @@ namespace PKHeX
private void pbBoxSlot_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
slotLeftMouseIsDown = false;
DragInfo.slotLeftMouseIsDown = false;
if (e.Button == MouseButtons.Right)
slotRightMouseIsDown = false;
DragInfo.slotRightMouseIsDown = false;
}
private void pbBoxSlot_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
slotLeftMouseIsDown = true;
DragInfo.slotLeftMouseIsDown = true;
if (e.Button == MouseButtons.Right)
slotRightMouseIsDown = true;
DragInfo.slotRightMouseIsDown = true;
}
private void pbBoxSlot_MouseMove(object sender, MouseEventArgs e)
{
if (slotDragDropInProgress)
if (DragInfo.slotDragDropInProgress)
return;
if (slotLeftMouseIsDown)
if (DragInfo.slotLeftMouseIsDown)
{
// The goal is to create a temporary PKX file for the underlying Pokemon
// and use that file to perform a drag drop operation.
@ -3347,17 +3370,18 @@ namespace PKHeX
return;
// Set flag to prevent re-entering.
slotDragDropInProgress = true;
DragInfo.slotDragDropInProgress = true;
slotSourceSlotNumber = getSlot(pb);
int offset = getPKXOffset(slotSourceSlotNumber);
DragInfo.slotSourceSlotNumber = getSlot(pb);
int offset = getPKXOffset(DragInfo.slotSourceSlotNumber);
// Prepare Data
slotPkmSource = SAV.getData(offset, SAV.SIZE_STORED);
slotSourceOffset = offset;
DragInfo.slotPkmSource = SAV.getData(offset, SAV.SIZE_STORED);
DragInfo.slotSourceOffset = offset;
DragInfo.slotSourceBoxNumber = CB_BoxSelect.SelectedIndex;
// Make a new file name based off the PID
byte[] dragdata = SAV.decryptPKM(slotPkmSource);
byte[] dragdata = SAV.decryptPKM(DragInfo.slotPkmSource);
Array.Resize(ref dragdata, SAV.SIZE_STORED);
PKM pkx = SAV.getPKM(dragdata);
string filename = pkx.FileName;
@ -3368,43 +3392,51 @@ namespace PKHeX
{
File.WriteAllBytes(newfile, dragdata);
var img = (Bitmap)pb.Image;
Cursor.Current = new Cursor(img.GetHicon());
DragInfo.Cursor = Cursor.Current = new Cursor(img.GetHicon());
pb.Image = null;
pb.BackColor = Color.FromArgb(100, 200, 200, 200);
pb.BackgroundImage = Properties.Resources.slotDrag;
// Thread Blocks on DoDragDrop
DragInfo.CurrentPath = newfile;
DragDropEffects result = pb.DoDragDrop(new DataObject(DataFormats.FileDrop, new[] { newfile }), DragDropEffects.Move);
if (result != DragDropEffects.Link) // not dropped to another box slot, restore img
pb.Image = img;
else // refresh image
getQuickFiller(pb, SAV.getStoredSlot(DragInfo.slotSourceOffset));
pb.BackgroundImage = null;
if (DragInfo.slotDestinationBoxNumber == DragInfo.slotSourceBoxNumber)
SlotPictureBoxes[DragInfo.slotDestinationSlotNumber].Image = img;
if (result == DragDropEffects.Copy) // viewed in tabs, apply 'view' highlight
getSlotColor(slotSourceSlotNumber, Properties.Resources.slotView);
pb.BackColor = Color.Transparent;
getSlotColor(DragInfo.slotSourceSlotNumber, Properties.Resources.slotView);
}
catch (Exception x)
{
Util.Error("Drag & Drop Error:", x.ToString());
}
slotSourceOffset = 0;
Cursor.Current = DefaultCursor;
DragInfo.Reset();
Cursor = DefaultCursor;
// Browser apps need time to load data since the file isn't moved to a location on the user's local storage.
// Tested 10ms -> too quick, 100ms was fine. 500ms should be safe?
new Thread(() =>
{
Thread.Sleep(500);
if (File.Exists(newfile))
if (File.Exists(newfile) && DragInfo.CurrentPath == null)
File.Delete(newfile);
}).Start();
}
}
private void pbBoxSlot_DragDrop(object sender, DragEventArgs e)
{
int slotDestinationSlotNumber = getSlot(sender);
int slotDestinationOffset = getPKXOffset(slotDestinationSlotNumber);
DragInfo.slotDestinationSlotNumber = getSlot(sender);
DragInfo.slotDestinationOffset = getPKXOffset(DragInfo.slotDestinationSlotNumber);
DragInfo.slotDestinationBoxNumber = CB_BoxSelect.SelectedIndex;
// Check for In-Dropped files (PKX,SAV,ETC)
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (Directory.Exists(files[0])) { loadBoxesFromDB(files[0]); return; }
if (slotSourceOffset == 0)
if (DragInfo.slotSourceOffset < 0) // file
{
if (files.Length <= 0)
return;
@ -3430,48 +3462,45 @@ namespace PKHeX
{ Console.WriteLine(c); Console.WriteLine(concat); return; }
}
SAV.setStoredSlot(pk, slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[slotDestinationSlotNumber], pk);
getSlotColor(slotDestinationSlotNumber, Properties.Resources.slotSet);
SAV.setStoredSlot(pk, DragInfo.slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[DragInfo.slotDestinationSlotNumber], pk);
getSlotColor(DragInfo.slotDestinationSlotNumber, Properties.Resources.slotSet);
Console.WriteLine(c);
}
else
{
PKM pkz = SAV.getStoredSlot(slotSourceOffset);
if (ModifierKeys == Keys.Alt && slotDestinationSlotNumber > -1) // overwrite delete old slot
PKM pkz = SAV.getStoredSlot(DragInfo.slotSourceOffset);
if (ModifierKeys == Keys.Alt && DragInfo.slotDestinationSlotNumber > -1) // overwrite delete old slot
{
// Clear from slot
getQuickFiller(SlotPictureBoxes[slotSourceSlotNumber], SAV.BlankPKM); // picturebox
SAV.setStoredSlot(SAV.BlankPKM, slotSourceOffset); // savefile
// Clear from slot
if (DragInfo.SameBox)
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], SAV.BlankPKM); // picturebox
SAV.setStoredSlot(SAV.BlankPKM, DragInfo.slotSourceOffset);
}
else if (ModifierKeys != Keys.Control && slotDestinationSlotNumber > -1)
else if (ModifierKeys != Keys.Control && DragInfo.slotDestinationSlotNumber > -1)
{
if (((PictureBox)sender).Image != null)
{
// Load data from destination
PKM pk = SAV.getStoredSlot(slotDestinationOffset);
// Load data from destination
PKM pk = ((PictureBox) sender).Image != null
? SAV.getStoredSlot(DragInfo.slotDestinationOffset)
: SAV.BlankPKM;
// Set destination pokemon image to source picture box
getQuickFiller(SlotPictureBoxes[slotSourceSlotNumber], pk);
// Set destination pokemon image to source picture box
if (DragInfo.SameBox)
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], pk);
// Set destination pokemon data to source slot
SAV.setStoredSlot(pk, slotSourceOffset);
}
else
{
// Set blank to source slot
SAV.setStoredSlot(SAV.BlankPKM, slotSourceOffset);
SlotPictureBoxes[slotSourceSlotNumber].Image = null;
}
// Set destination pokemon data to source slot
SAV.setStoredSlot(pk, DragInfo.slotSourceOffset);
}
else
getQuickFiller(SlotPictureBoxes[slotSourceSlotNumber], pkz);
else if (DragInfo.SameBox)
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], pkz);
// Copy from temp to destination slot.
SAV.setStoredSlot(pkz, slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[slotDestinationSlotNumber], pkz);
SAV.setStoredSlot(pkz, DragInfo.slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[DragInfo.slotDestinationSlotNumber], pkz);
e.Effect = DragDropEffects.Link;
slotSourceOffset = 0; // Clear offset value
Cursor = DefaultCursor;
}
}
private void pbBoxSlot_DragEnter(object sender, DragEventArgs e)
@ -3480,23 +3509,57 @@ namespace PKHeX
e.Effect = DragDropEffects.Copy;
else if (e.Data != null) // within
e.Effect = DragDropEffects.Move;
if (DragInfo.slotDragDropInProgress)
Cursor = DragInfo.Cursor;
}
private void pbBoxSlot_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
if (e.Action == DragAction.Cancel || e.Action == DragAction.Drop)
{
slotLeftMouseIsDown = false;
slotRightMouseIsDown = false;
slotDragDropInProgress = false;
DragInfo.slotLeftMouseIsDown = false;
DragInfo.slotRightMouseIsDown = false;
DragInfo.slotDragDropInProgress = false;
}
}
public static class DragInfo
{
public static bool slotLeftMouseIsDown;
public static bool slotRightMouseIsDown;
public static bool slotDragDropInProgress;
public static byte[] slotPkmSource;
public static byte[] slotPkmDestination;
public static int slotSourceOffset = -1;
public static int slotSourceSlotNumber = -1;
public static int slotSourceBoxNumber = -1;
public static int slotDestinationOffset = -1;
public static int slotDestinationSlotNumber = -1;
public static int slotDestinationBoxNumber = -1;
public static Cursor Cursor;
public static string CurrentPath;
public static bool SameBox => slotSourceBoxNumber > -1 && slotSourceBoxNumber == slotDestinationBoxNumber;
public static void Reset()
{
slotLeftMouseIsDown = false;
slotRightMouseIsDown = false;
slotDragDropInProgress = false;
slotPkmSource = null;
slotSourceOffset = slotSourceSlotNumber = slotSourceBoxNumber = -1;
slotPkmDestination = null;
slotDestinationOffset = slotSourceBoxNumber = slotDestinationBoxNumber = -1;
Cursor = null;
CurrentPath = null;
}
}
private static bool slotLeftMouseIsDown = false;
private static bool slotRightMouseIsDown = false;
private static bool slotDragDropInProgress = false;
private byte[] slotPkmSource;
private int slotSourceOffset;
private int slotSourceSlotNumber = -1;
#endregion
}
}

View file

@ -189,6 +189,12 @@
<Compile Include="Subforms\Save Editors\Gen6\SAV_PokeBlockORAS.Designer.cs">
<DependentUpon>SAV_PokeBlockORAS.cs</DependentUpon>
</Compile>
<Compile Include="Subforms\Save Editors\SAV_BoxViewer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Subforms\Save Editors\SAV_BoxViewer.Designer.cs">
<DependentUpon>SAV_BoxViewer.cs</DependentUpon>
</Compile>
<Compile Include="Subforms\SAV_Database.cs">
<SubType>Form</SubType>
</Compile>
@ -338,6 +344,9 @@
<EmbeddedResource Include="Subforms\Save Editors\Gen6\SAV_PokeBlockORAS.resx">
<DependentUpon>SAV_PokeBlockORAS.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Subforms\Save Editors\SAV_BoxViewer.resx">
<DependentUpon>SAV_BoxViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Subforms\SAV_Database.resx">
<DependentUpon>SAV_Database.cs</DependentUpon>
</EmbeddedResource>
@ -2704,7 +2713,12 @@
<None Include="Resources\img\ribbons\artist.png" />
<None Include="Resources\img\ribbons\alert.png" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<None Include="Resources\img\box\slotDrag.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\img\box\swapBox.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -16670,6 +16670,16 @@ namespace PKHeX.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap slotDrag {
get {
object obj = ResourceManager.GetObject("slotDrag", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -18429,6 +18439,16 @@ namespace PKHeX.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap swapBox {
get {
object obj = ResourceManager.GetObject("swapBox", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized string similar to -
///Duftnote
@ -22883,8 +22903,8 @@ namespace PKHeX.Properties {
///
///Blanca
///Negra
///Blanca2
///Negra2
///Blanca 2
///Negra 2
///X
///Y
///Zafiro Alfa

View file

@ -6385,4 +6385,10 @@
<data name="item_tm" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\img\item\item_tm.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="slotDrag" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\img\box\slotDrag.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="swapBox" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\img\box\swapBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

View file

@ -0,0 +1,603 @@
namespace PKHeX
{
partial class SAV_BoxViewer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SAV_BoxViewer));
this.PAN_Box = new System.Windows.Forms.Panel();
this.bpkx30 = new System.Windows.Forms.PictureBox();
this.bpkx29 = new System.Windows.Forms.PictureBox();
this.bpkx28 = new System.Windows.Forms.PictureBox();
this.bpkx27 = new System.Windows.Forms.PictureBox();
this.bpkx26 = new System.Windows.Forms.PictureBox();
this.bpkx25 = new System.Windows.Forms.PictureBox();
this.bpkx24 = new System.Windows.Forms.PictureBox();
this.bpkx23 = new System.Windows.Forms.PictureBox();
this.bpkx22 = new System.Windows.Forms.PictureBox();
this.bpkx21 = new System.Windows.Forms.PictureBox();
this.bpkx20 = new System.Windows.Forms.PictureBox();
this.bpkx19 = new System.Windows.Forms.PictureBox();
this.bpkx18 = new System.Windows.Forms.PictureBox();
this.bpkx17 = new System.Windows.Forms.PictureBox();
this.bpkx16 = new System.Windows.Forms.PictureBox();
this.bpkx15 = new System.Windows.Forms.PictureBox();
this.bpkx14 = new System.Windows.Forms.PictureBox();
this.bpkx13 = new System.Windows.Forms.PictureBox();
this.bpkx12 = new System.Windows.Forms.PictureBox();
this.bpkx11 = new System.Windows.Forms.PictureBox();
this.bpkx10 = new System.Windows.Forms.PictureBox();
this.bpkx9 = new System.Windows.Forms.PictureBox();
this.bpkx8 = new System.Windows.Forms.PictureBox();
this.bpkx7 = new System.Windows.Forms.PictureBox();
this.bpkx6 = new System.Windows.Forms.PictureBox();
this.bpkx5 = new System.Windows.Forms.PictureBox();
this.bpkx4 = new System.Windows.Forms.PictureBox();
this.bpkx3 = new System.Windows.Forms.PictureBox();
this.bpkx2 = new System.Windows.Forms.PictureBox();
this.bpkx1 = new System.Windows.Forms.PictureBox();
this.B_BoxRight = new System.Windows.Forms.Button();
this.B_BoxLeft = new System.Windows.Forms.Button();
this.CB_BoxSelect = new System.Windows.Forms.ComboBox();
this.PB_BoxSwap = new System.Windows.Forms.PictureBox();
this.PAN_Box.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bpkx30)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx29)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx28)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx27)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx26)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx25)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx24)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx23)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx22)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx21)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx20)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx19)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx18)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx17)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx16)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx15)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx14)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx13)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx12)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx11)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx10)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx9)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx8)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx7)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx5)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PB_BoxSwap)).BeginInit();
this.SuspendLayout();
//
// PAN_Box
//
this.PAN_Box.BackgroundImage = global::PKHeX.Properties.Resources.box_wp16xy;
this.PAN_Box.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.PAN_Box.Controls.Add(this.bpkx30);
this.PAN_Box.Controls.Add(this.bpkx29);
this.PAN_Box.Controls.Add(this.bpkx28);
this.PAN_Box.Controls.Add(this.bpkx27);
this.PAN_Box.Controls.Add(this.bpkx26);
this.PAN_Box.Controls.Add(this.bpkx25);
this.PAN_Box.Controls.Add(this.bpkx24);
this.PAN_Box.Controls.Add(this.bpkx23);
this.PAN_Box.Controls.Add(this.bpkx22);
this.PAN_Box.Controls.Add(this.bpkx21);
this.PAN_Box.Controls.Add(this.bpkx20);
this.PAN_Box.Controls.Add(this.bpkx19);
this.PAN_Box.Controls.Add(this.bpkx18);
this.PAN_Box.Controls.Add(this.bpkx17);
this.PAN_Box.Controls.Add(this.bpkx16);
this.PAN_Box.Controls.Add(this.bpkx15);
this.PAN_Box.Controls.Add(this.bpkx14);
this.PAN_Box.Controls.Add(this.bpkx13);
this.PAN_Box.Controls.Add(this.bpkx12);
this.PAN_Box.Controls.Add(this.bpkx11);
this.PAN_Box.Controls.Add(this.bpkx10);
this.PAN_Box.Controls.Add(this.bpkx9);
this.PAN_Box.Controls.Add(this.bpkx8);
this.PAN_Box.Controls.Add(this.bpkx7);
this.PAN_Box.Controls.Add(this.bpkx6);
this.PAN_Box.Controls.Add(this.bpkx5);
this.PAN_Box.Controls.Add(this.bpkx4);
this.PAN_Box.Controls.Add(this.bpkx3);
this.PAN_Box.Controls.Add(this.bpkx2);
this.PAN_Box.Controls.Add(this.bpkx1);
this.PAN_Box.Location = new System.Drawing.Point(17, 37);
this.PAN_Box.Name = "PAN_Box";
this.PAN_Box.Size = new System.Drawing.Size(251, 160);
this.PAN_Box.TabIndex = 66;
//
// bpkx30
//
this.bpkx30.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx30.Location = new System.Drawing.Point(207, 126);
this.bpkx30.Name = "bpkx30";
this.bpkx30.Size = new System.Drawing.Size(42, 32);
this.bpkx30.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx30.TabIndex = 59;
this.bpkx30.TabStop = false;
//
// bpkx29
//
this.bpkx29.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx29.Location = new System.Drawing.Point(166, 126);
this.bpkx29.Name = "bpkx29";
this.bpkx29.Size = new System.Drawing.Size(42, 32);
this.bpkx29.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx29.TabIndex = 58;
this.bpkx29.TabStop = false;
//
// bpkx28
//
this.bpkx28.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx28.Location = new System.Drawing.Point(125, 126);
this.bpkx28.Name = "bpkx28";
this.bpkx28.Size = new System.Drawing.Size(42, 32);
this.bpkx28.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx28.TabIndex = 57;
this.bpkx28.TabStop = false;
//
// bpkx27
//
this.bpkx27.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx27.Location = new System.Drawing.Point(84, 126);
this.bpkx27.Name = "bpkx27";
this.bpkx27.Size = new System.Drawing.Size(42, 32);
this.bpkx27.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx27.TabIndex = 56;
this.bpkx27.TabStop = false;
//
// bpkx26
//
this.bpkx26.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx26.Location = new System.Drawing.Point(43, 126);
this.bpkx26.Name = "bpkx26";
this.bpkx26.Size = new System.Drawing.Size(42, 32);
this.bpkx26.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx26.TabIndex = 55;
this.bpkx26.TabStop = false;
//
// bpkx25
//
this.bpkx25.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx25.Location = new System.Drawing.Point(2, 126);
this.bpkx25.Name = "bpkx25";
this.bpkx25.Size = new System.Drawing.Size(42, 32);
this.bpkx25.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx25.TabIndex = 54;
this.bpkx25.TabStop = false;
//
// bpkx24
//
this.bpkx24.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx24.Location = new System.Drawing.Point(207, 95);
this.bpkx24.Name = "bpkx24";
this.bpkx24.Size = new System.Drawing.Size(42, 32);
this.bpkx24.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx24.TabIndex = 53;
this.bpkx24.TabStop = false;
//
// bpkx23
//
this.bpkx23.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx23.Location = new System.Drawing.Point(166, 95);
this.bpkx23.Name = "bpkx23";
this.bpkx23.Size = new System.Drawing.Size(42, 32);
this.bpkx23.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx23.TabIndex = 52;
this.bpkx23.TabStop = false;
//
// bpkx22
//
this.bpkx22.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx22.Location = new System.Drawing.Point(125, 95);
this.bpkx22.Name = "bpkx22";
this.bpkx22.Size = new System.Drawing.Size(42, 32);
this.bpkx22.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx22.TabIndex = 51;
this.bpkx22.TabStop = false;
//
// bpkx21
//
this.bpkx21.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx21.Location = new System.Drawing.Point(84, 95);
this.bpkx21.Name = "bpkx21";
this.bpkx21.Size = new System.Drawing.Size(42, 32);
this.bpkx21.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx21.TabIndex = 50;
this.bpkx21.TabStop = false;
//
// bpkx20
//
this.bpkx20.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx20.Location = new System.Drawing.Point(43, 95);
this.bpkx20.Name = "bpkx20";
this.bpkx20.Size = new System.Drawing.Size(42, 32);
this.bpkx20.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx20.TabIndex = 49;
this.bpkx20.TabStop = false;
//
// bpkx19
//
this.bpkx19.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx19.Location = new System.Drawing.Point(2, 95);
this.bpkx19.Name = "bpkx19";
this.bpkx19.Size = new System.Drawing.Size(42, 32);
this.bpkx19.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx19.TabIndex = 48;
this.bpkx19.TabStop = false;
//
// bpkx18
//
this.bpkx18.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx18.Location = new System.Drawing.Point(207, 64);
this.bpkx18.Name = "bpkx18";
this.bpkx18.Size = new System.Drawing.Size(42, 32);
this.bpkx18.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx18.TabIndex = 47;
this.bpkx18.TabStop = false;
//
// bpkx17
//
this.bpkx17.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx17.Location = new System.Drawing.Point(166, 64);
this.bpkx17.Name = "bpkx17";
this.bpkx17.Size = new System.Drawing.Size(42, 32);
this.bpkx17.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx17.TabIndex = 46;
this.bpkx17.TabStop = false;
//
// bpkx16
//
this.bpkx16.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx16.Location = new System.Drawing.Point(125, 64);
this.bpkx16.Name = "bpkx16";
this.bpkx16.Size = new System.Drawing.Size(42, 32);
this.bpkx16.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx16.TabIndex = 45;
this.bpkx16.TabStop = false;
//
// bpkx15
//
this.bpkx15.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx15.Location = new System.Drawing.Point(84, 64);
this.bpkx15.Name = "bpkx15";
this.bpkx15.Size = new System.Drawing.Size(42, 32);
this.bpkx15.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx15.TabIndex = 44;
this.bpkx15.TabStop = false;
//
// bpkx14
//
this.bpkx14.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx14.Location = new System.Drawing.Point(43, 64);
this.bpkx14.Name = "bpkx14";
this.bpkx14.Size = new System.Drawing.Size(42, 32);
this.bpkx14.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx14.TabIndex = 43;
this.bpkx14.TabStop = false;
//
// bpkx13
//
this.bpkx13.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx13.Location = new System.Drawing.Point(2, 64);
this.bpkx13.Name = "bpkx13";
this.bpkx13.Size = new System.Drawing.Size(42, 32);
this.bpkx13.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx13.TabIndex = 42;
this.bpkx13.TabStop = false;
//
// bpkx12
//
this.bpkx12.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx12.Location = new System.Drawing.Point(207, 33);
this.bpkx12.Name = "bpkx12";
this.bpkx12.Size = new System.Drawing.Size(42, 32);
this.bpkx12.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx12.TabIndex = 41;
this.bpkx12.TabStop = false;
//
// bpkx11
//
this.bpkx11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx11.Location = new System.Drawing.Point(166, 33);
this.bpkx11.Name = "bpkx11";
this.bpkx11.Size = new System.Drawing.Size(42, 32);
this.bpkx11.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx11.TabIndex = 40;
this.bpkx11.TabStop = false;
//
// bpkx10
//
this.bpkx10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx10.Location = new System.Drawing.Point(125, 33);
this.bpkx10.Name = "bpkx10";
this.bpkx10.Size = new System.Drawing.Size(42, 32);
this.bpkx10.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx10.TabIndex = 39;
this.bpkx10.TabStop = false;
//
// bpkx9
//
this.bpkx9.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx9.Location = new System.Drawing.Point(84, 33);
this.bpkx9.Name = "bpkx9";
this.bpkx9.Size = new System.Drawing.Size(42, 32);
this.bpkx9.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx9.TabIndex = 38;
this.bpkx9.TabStop = false;
//
// bpkx8
//
this.bpkx8.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx8.Location = new System.Drawing.Point(43, 33);
this.bpkx8.Name = "bpkx8";
this.bpkx8.Size = new System.Drawing.Size(42, 32);
this.bpkx8.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx8.TabIndex = 37;
this.bpkx8.TabStop = false;
//
// bpkx7
//
this.bpkx7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx7.Location = new System.Drawing.Point(2, 33);
this.bpkx7.Name = "bpkx7";
this.bpkx7.Size = new System.Drawing.Size(42, 32);
this.bpkx7.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx7.TabIndex = 36;
this.bpkx7.TabStop = false;
//
// bpkx6
//
this.bpkx6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx6.Location = new System.Drawing.Point(207, 2);
this.bpkx6.Name = "bpkx6";
this.bpkx6.Size = new System.Drawing.Size(42, 32);
this.bpkx6.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx6.TabIndex = 35;
this.bpkx6.TabStop = false;
//
// bpkx5
//
this.bpkx5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx5.Location = new System.Drawing.Point(166, 2);
this.bpkx5.Name = "bpkx5";
this.bpkx5.Size = new System.Drawing.Size(42, 32);
this.bpkx5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx5.TabIndex = 34;
this.bpkx5.TabStop = false;
//
// bpkx4
//
this.bpkx4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx4.Location = new System.Drawing.Point(125, 2);
this.bpkx4.Name = "bpkx4";
this.bpkx4.Size = new System.Drawing.Size(42, 32);
this.bpkx4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx4.TabIndex = 33;
this.bpkx4.TabStop = false;
//
// bpkx3
//
this.bpkx3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx3.Location = new System.Drawing.Point(84, 2);
this.bpkx3.Name = "bpkx3";
this.bpkx3.Size = new System.Drawing.Size(42, 32);
this.bpkx3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx3.TabIndex = 32;
this.bpkx3.TabStop = false;
//
// bpkx2
//
this.bpkx2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx2.Location = new System.Drawing.Point(43, 2);
this.bpkx2.Name = "bpkx2";
this.bpkx2.Size = new System.Drawing.Size(42, 32);
this.bpkx2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx2.TabIndex = 31;
this.bpkx2.TabStop = false;
//
// bpkx1
//
this.bpkx1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.bpkx1.Location = new System.Drawing.Point(2, 2);
this.bpkx1.Name = "bpkx1";
this.bpkx1.Size = new System.Drawing.Size(42, 32);
this.bpkx1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.bpkx1.TabIndex = 30;
this.bpkx1.TabStop = false;
//
// B_BoxRight
//
this.B_BoxRight.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.B_BoxRight.Location = new System.Drawing.Point(210, 11);
this.B_BoxRight.Name = "B_BoxRight";
this.B_BoxRight.Size = new System.Drawing.Size(27, 23);
this.B_BoxRight.TabIndex = 65;
this.B_BoxRight.Text = ">>";
this.B_BoxRight.UseVisualStyleBackColor = true;
this.B_BoxRight.Click += new System.EventHandler(this.clickBoxRight);
//
// B_BoxLeft
//
this.B_BoxLeft.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.B_BoxLeft.Location = new System.Drawing.Point(48, 11);
this.B_BoxLeft.Name = "B_BoxLeft";
this.B_BoxLeft.Size = new System.Drawing.Size(27, 23);
this.B_BoxLeft.TabIndex = 64;
this.B_BoxLeft.Text = "<<";
this.B_BoxLeft.UseVisualStyleBackColor = true;
this.B_BoxLeft.Click += new System.EventHandler(this.clickBoxLeft);
//
// CB_BoxSelect
//
this.CB_BoxSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CB_BoxSelect.FormattingEnabled = true;
this.CB_BoxSelect.Items.AddRange(new object[] {
"Box 1",
"Box 2",
"Box 3",
"Box 4",
"Box 5",
"Box 6",
"Box 7",
"Box 8",
"Box 9",
"Box 10",
"Box 11",
"Box 12",
"Box 13",
"Box 14",
"Box 15",
"Box 16",
"Box 17",
"Box 18",
"Box 19",
"Box 20",
"Box 21",
"Box 22",
"Box 23",
"Box 24",
"Box 25",
"Box 26",
"Box 27",
"Box 28",
"Box 29",
"Box 30",
"Box 31"});
this.CB_BoxSelect.Location = new System.Drawing.Point(79, 12);
this.CB_BoxSelect.Name = "CB_BoxSelect";
this.CB_BoxSelect.Size = new System.Drawing.Size(127, 21);
this.CB_BoxSelect.TabIndex = 63;
this.CB_BoxSelect.SelectedIndexChanged += new System.EventHandler(this.CB_BoxSelect_SelectedIndexChanged);
//
// PB_BoxSwap
//
this.PB_BoxSwap.Image = global::PKHeX.Properties.Resources.swapBox;
this.PB_BoxSwap.Location = new System.Drawing.Point(0, 0);
this.PB_BoxSwap.Name = "PB_BoxSwap";
this.PB_BoxSwap.Size = new System.Drawing.Size(24, 24);
this.PB_BoxSwap.TabIndex = 67;
this.PB_BoxSwap.TabStop = false;
this.PB_BoxSwap.Click += new System.EventHandler(this.PB_BoxSwap_Click);
//
// SAV_BoxViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 211);
this.Controls.Add(this.PB_BoxSwap);
this.Controls.Add(this.B_BoxRight);
this.Controls.Add(this.B_BoxLeft);
this.Controls.Add(this.CB_BoxSelect);
this.Controls.Add(this.PAN_Box);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "SAV_BoxViewer";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Box Viewer";
this.PAN_Box.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.bpkx30)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx29)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx28)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx27)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx26)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx25)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx24)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx23)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx22)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx21)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx20)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx19)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx18)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx17)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx16)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx15)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx14)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx13)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx12)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx11)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx10)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx9)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx8)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx7)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx6)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx5)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bpkx1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PB_BoxSwap)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel PAN_Box;
private System.Windows.Forms.PictureBox bpkx30;
private System.Windows.Forms.PictureBox bpkx29;
private System.Windows.Forms.PictureBox bpkx28;
private System.Windows.Forms.PictureBox bpkx27;
private System.Windows.Forms.PictureBox bpkx26;
private System.Windows.Forms.PictureBox bpkx25;
private System.Windows.Forms.PictureBox bpkx24;
private System.Windows.Forms.PictureBox bpkx23;
private System.Windows.Forms.PictureBox bpkx22;
private System.Windows.Forms.PictureBox bpkx21;
private System.Windows.Forms.PictureBox bpkx20;
private System.Windows.Forms.PictureBox bpkx19;
private System.Windows.Forms.PictureBox bpkx18;
private System.Windows.Forms.PictureBox bpkx17;
private System.Windows.Forms.PictureBox bpkx16;
private System.Windows.Forms.PictureBox bpkx15;
private System.Windows.Forms.PictureBox bpkx14;
private System.Windows.Forms.PictureBox bpkx13;
private System.Windows.Forms.PictureBox bpkx12;
private System.Windows.Forms.PictureBox bpkx11;
private System.Windows.Forms.PictureBox bpkx10;
private System.Windows.Forms.PictureBox bpkx9;
private System.Windows.Forms.PictureBox bpkx8;
private System.Windows.Forms.PictureBox bpkx7;
private System.Windows.Forms.PictureBox bpkx6;
private System.Windows.Forms.PictureBox bpkx5;
private System.Windows.Forms.PictureBox bpkx4;
private System.Windows.Forms.PictureBox bpkx3;
private System.Windows.Forms.PictureBox bpkx2;
private System.Windows.Forms.PictureBox bpkx1;
private System.Windows.Forms.Button B_BoxRight;
private System.Windows.Forms.Button B_BoxLeft;
private System.Windows.Forms.ComboBox CB_BoxSelect;
private System.Windows.Forms.PictureBox PB_BoxSwap;
}
}

View file

@ -0,0 +1,314 @@
using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using static PKHeX.Main;
namespace PKHeX
{
public partial class SAV_BoxViewer : Form
{
public SAV_BoxViewer(Main p)
{
InitializeComponent();
parent = p;
CenterToParent();
AllowDrop = true;
DragEnter += tabMain_DragEnter;
DragDrop += (sender, e) =>
{
Cursor = DefaultCursor;
System.Media.SystemSounds.Asterisk.Play();
};
SlotPictureBoxes = new[] {
bpkx1, bpkx2, bpkx3, bpkx4, bpkx5, bpkx6,
bpkx7, bpkx8, bpkx9, bpkx10,bpkx11,bpkx12,
bpkx13,bpkx14,bpkx15,bpkx16,bpkx17,bpkx18,
bpkx19,bpkx20,bpkx21,bpkx22,bpkx23,bpkx24,
bpkx25,bpkx26,bpkx27,bpkx28,bpkx29,bpkx30,
};
foreach (PictureBox pb in SlotPictureBoxes)
{
pb.AllowDrop = true;
pb.GiveFeedback += (sender, e) => { e.UseDefaultCursors = false; };
pb.MouseUp += pbBoxSlot_MouseUp;
pb.MouseDown += pbBoxSlot_MouseDown;
pb.MouseMove += pbBoxSlot_MouseMove;
pb.DragDrop += pbBoxSlot_DragDrop;
pb.DragEnter += pbBoxSlot_DragEnter;
pb.QueryContinueDrag += pbBoxSlot_QueryContinueDrag;
}
try
{
CB_BoxSelect.Items.Clear();
for (int i = 0; i < SAV.BoxCount; i++)
CB_BoxSelect.Items.Add(SAV.getBoxName(i));
}
catch
{
CB_BoxSelect.Items.Clear();
for (int i = 1; i <= SAV.BoxCount; i++)
CB_BoxSelect.Items.Add($"BOX {i}");
}
CB_BoxSelect.SelectedIndex = 0;
}
private readonly Main parent;
private readonly PictureBox[] SlotPictureBoxes;
private void CB_BoxSelect_SelectedIndexChanged(object sender, EventArgs e)
{
setPKXBoxes();
}
private void clickBoxRight(object sender, EventArgs e)
{
CB_BoxSelect.SelectedIndex = (CB_BoxSelect.SelectedIndex + 1) % SAV.BoxCount;
}
private void clickBoxLeft(object sender, EventArgs e)
{
CB_BoxSelect.SelectedIndex = (CB_BoxSelect.SelectedIndex + SAV.BoxCount - 1) % SAV.BoxCount;
}
private void PB_BoxSwap_Click(object sender, EventArgs e)
{
CB_BoxSelect.SelectedIndex = parent.swapBoxesViewer(CB_BoxSelect.SelectedIndex);
}
// Copied Methods from Main.cs (slightly modified)
private int getPKXOffset(int slot)
{
return SAV.getBoxOffset(CB_BoxSelect.SelectedIndex) + slot * SAV.SIZE_STORED;
}
private void setPKXBoxes()
{
int boxoffset = SAV.getBoxOffset(CB_BoxSelect.SelectedIndex);
int boxbgval = SAV.getBoxWallpaper(CB_BoxSelect.SelectedIndex);
PAN_Box.BackgroundImage = BoxWallpaper.getWallpaper(SAV, boxbgval);
for (int i = 0; i < SlotPictureBoxes.Length; i++)
getSlotFiller(boxoffset + SAV.SIZE_STORED*i, SlotPictureBoxes[i]);
}
private void getSlotFiller(int offset, PictureBox pb)
{
if (SAV.getData(offset, SAV.SIZE_STORED).SequenceEqual(new byte[SAV.SIZE_STORED]))
{
// 00s present in slot.
pb.Image = null;
pb.BackColor = Color.Transparent;
return;
}
PKM p = SAV.getStoredSlot(offset);
if (p.Sanity != 0 || !p.ChecksumValid) // Invalid
{
// Bad Egg present in slot.
pb.Image = null;
pb.BackColor = Color.Red;
return;
}
// Something stored in slot. Only display if species is valid.
pb.Image = p.Species == 0 ? null : p.Sprite;
pb.BackColor = Color.Transparent;
}
private void getQuickFiller(PictureBox pb, PKM pk)
{
pb.Image = pk.Species == 0 ? null : pk.Sprite;
if (pb.BackColor == Color.Red)
pb.BackColor = Color.Transparent;
}
private int getSlot(object sender)
{
sender = ((sender as ToolStripItem)?.Owner as ContextMenuStrip)?.SourceControl ?? sender as PictureBox;
return Array.IndexOf(SlotPictureBoxes, sender);
}
// Drag and drop related functions
private void pbBoxSlot_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
DragInfo.slotLeftMouseIsDown = false;
if (e.Button == MouseButtons.Right)
DragInfo.slotRightMouseIsDown = false;
}
private void pbBoxSlot_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
DragInfo.slotLeftMouseIsDown = true;
if (e.Button == MouseButtons.Right)
DragInfo.slotRightMouseIsDown = true;
}
private void pbBoxSlot_MouseMove(object sender, MouseEventArgs e)
{
if (DragInfo.slotDragDropInProgress)
return;
if (DragInfo.slotLeftMouseIsDown)
{
// The goal is to create a temporary PKX file for the underlying Pokemon
// and use that file to perform a drag drop operation.
// Abort if there is no Pokemon in the given slot.
PictureBox pb = (PictureBox)sender;
if (pb.Image == null)
return;
// Set flag to prevent re-entering.
DragInfo.slotDragDropInProgress = true;
DragInfo.slotSourceSlotNumber = getSlot(pb);
int offset = getPKXOffset(DragInfo.slotSourceSlotNumber);
// Prepare Data
DragInfo.slotPkmSource = SAV.getData(offset, SAV.SIZE_STORED);
DragInfo.slotSourceOffset = offset;
DragInfo.slotSourceBoxNumber = CB_BoxSelect.SelectedIndex;
// Make a new file name based off the PID
byte[] dragdata = SAV.decryptPKM(DragInfo.slotPkmSource);
Array.Resize(ref dragdata, SAV.SIZE_STORED);
PKM pkx = SAV.getPKM(dragdata);
string filename = pkx.FileName;
// Make File
string newfile = Path.Combine(Path.GetTempPath(), Util.CleanFileName(filename));
try
{
File.WriteAllBytes(newfile, dragdata);
var img = (Bitmap)pb.Image;
DragInfo.Cursor = Cursor.Current = new Cursor(img.GetHicon());
pb.Image = null;
pb.BackgroundImage = Properties.Resources.slotDrag;
// Thread Blocks on DoDragDrop
DragInfo.CurrentPath = newfile;
DragDropEffects result = pb.DoDragDrop(new DataObject(DataFormats.FileDrop, new[] { newfile }), DragDropEffects.Move);
if (result != DragDropEffects.Link) // not dropped to another box slot, restore img
pb.Image = img;
else // refresh image
getQuickFiller(pb, SAV.getStoredSlot(DragInfo.slotSourceOffset));
pb.BackgroundImage = null;
if (DragInfo.slotDestinationBoxNumber == DragInfo.slotSourceBoxNumber)
SlotPictureBoxes[DragInfo.slotDestinationSlotNumber].Image = img;
}
catch (Exception x)
{
Util.Error("Drag & Drop Error:", x.ToString());
}
DragInfo.Reset();
Cursor = DefaultCursor;
// Browser apps need time to load data since the file isn't moved to a location on the user's local storage.
// Tested 10ms -> too quick, 100ms was fine. 500ms should be safe?
new Thread(() =>
{
Thread.Sleep(500);
if (File.Exists(newfile) && DragInfo.CurrentPath == null)
File.Delete(newfile);
}).Start();
}
}
private void pbBoxSlot_DragDrop(object sender, DragEventArgs e)
{
DragInfo.slotDestinationSlotNumber = getSlot(sender);
DragInfo.slotDestinationOffset = getPKXOffset(DragInfo.slotDestinationSlotNumber);
DragInfo.slotDestinationBoxNumber = CB_BoxSelect.SelectedIndex;
// Check for In-Dropped files (PKX,SAV,ETC)
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (Directory.Exists(files[0])) { return; }
if (DragInfo.slotSourceOffset < 0) // file
{
if (files.Length <= 0)
return;
string file = files[0];
FileInfo fi = new FileInfo(file);
if (!PKX.getIsPKM(fi.Length) && !MysteryGift.getIsMysteryGift(fi.Length))
{ return; }
byte[] data = File.ReadAllBytes(file);
MysteryGift mg = MysteryGift.getMysteryGift(data, fi.Extension);
PKM temp = mg != null ? mg.convertToPKM(SAV) : PKMConverter.getPKMfromBytes(data);
string c;
PKM pk = PKMConverter.convertToFormat(temp, SAV.Generation, out c);
if (pk == null)
{ Util.Error(c); Console.WriteLine(c); return; }
string[] errata = verifyPKMtoSAV(pk);
if (errata.Length > 0)
{
string concat = string.Join(Environment.NewLine, errata);
if (DialogResult.Yes != Util.Prompt(MessageBoxButtons.YesNo, concat, "Continue?"))
{ Console.WriteLine(c); Console.WriteLine(concat); return; }
}
SAV.setStoredSlot(pk, DragInfo.slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[DragInfo.slotDestinationSlotNumber], pk);
Console.WriteLine(c);
}
else
{
PKM pkz = SAV.getStoredSlot(DragInfo.slotSourceOffset);
if (ModifierKeys == Keys.Alt && DragInfo.slotDestinationSlotNumber > -1) // overwrite
{
// Clear from slot
if (DragInfo.SameBox)
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], SAV.BlankPKM); // picturebox
SAV.setStoredSlot(SAV.BlankPKM, DragInfo.slotSourceOffset);
}
else if (ModifierKeys != Keys.Control && DragInfo.slotDestinationSlotNumber > -1) // move
{
// Load data from destination
PKM pk = ((PictureBox)sender).Image != null
? SAV.getStoredSlot(DragInfo.slotDestinationOffset)
: SAV.BlankPKM;
// Set destination pokemon image to source picture box
if (DragInfo.SameBox)
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], pk);
// Set destination pokemon data to source slot
SAV.setStoredSlot(pk, DragInfo.slotSourceOffset);
}
else if (DragInfo.SameBox) // clone
getQuickFiller(SlotPictureBoxes[DragInfo.slotSourceSlotNumber], pkz);
// Copy from temp to destination slot.
SAV.setStoredSlot(pkz, DragInfo.slotDestinationOffset);
getQuickFiller(SlotPictureBoxes[DragInfo.slotDestinationSlotNumber], pkz);
e.Effect = DragDropEffects.Link;
Cursor = DefaultCursor;
}
}
private void pbBoxSlot_DragEnter(object sender, DragEventArgs e)
{
if (e.AllowedEffect == (DragDropEffects.Copy | DragDropEffects.Link)) // external file
e.Effect = DragDropEffects.Copy;
else if (e.Data != null) // within
e.Effect = DragDropEffects.Move;
if (DragInfo.slotDragDropInProgress)
Cursor = DragInfo.Cursor;
}
private void pbBoxSlot_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
if (e.Action == DragAction.Cancel || e.Action == DragAction.Drop)
{
DragInfo.slotLeftMouseIsDown = false;
DragInfo.slotRightMouseIsDown = false;
DragInfo.slotDragDropInProgress = false;
}
}
private void tabMain_DragEnter(object sender, DragEventArgs e)
{
if (e.AllowedEffect == (DragDropEffects.Copy | DragDropEffects.Link)) // external file
e.Effect = DragDropEffects.Copy;
else if (e.Data != null) // within
e.Effect = DragDropEffects.Move;
}
}
}

View file

@ -0,0 +1,219 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="PB_BoxSwap.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAE
AAAAAAAAAAAAAAAAAAAAAAAAIyMjAQAAAAALCwsPJiYmJysrKycqKionKSkpJykpKScpKSknKioqJyoq
KicrKysnJycnJw0ODQ8AAAAAJiYmAQAAAABpaWlHq6ur17+/v+6+vr7svr6+7b6+vu2+vr7tvr6+7b6+
vu2+vr7tvr6+7L+/v+6rq6vXampqSAAAAAAoKSgXvr++3eLi4v/g4OD94eHh/+Hh4f/i4uL/4uLi/+Li
4v/i4uL/4eHh/+Dh4P/g4OD94uLi/7+/v90sLCwXfn5+PNna2frg4OD/39/f/uHh4f7h4eH+39/f/uDg
4P7g4OD+39/f/uHh4f7h4OH+39/f/t/g3//a2tr6g4ODPoOCgz7X19f64+Pj/+Li4v7k5OT/4+Tj//Ly
8v/19fX/9PT0//T09P/k5OT/5OTk/+Pj4/7j4+P/19jX+4qLikCDhIM+2tra++Xl5f/k5eT+5OTk//Lz
8v+urq7/RUVF/z4+Pv+Zmpn/8fHx/+Xm5f/k5eT+5eXl/9ra2vyLi4tAhYWFPuXm5vvx8vP/7+/w/v//
//+sra3/AgIC/15eXv9tbG3/BQUF/4yMjP//////7+/w/vHy8//l5ub8jY2NQC4uLD5LS0f7UFBL/09P
Sv5YWVP/FBUS/29wcP///////////5SUlP8PDw//U1NO/1BQS/5PT0r/S0tH/DIyMEAAAAs+AAAM+wAA
Dv8AAA/+AwMS/wAAAP+UlJX///////////+3t7n/AAAA/wAAD/8BAQ/+AAAO/wAADPwCAg5ABARSPgoK
k/sNDab/DQ2o/hAQvP8CAmj/IiIW/7Kzrv/Cw8D/NDQm/wAATf8QELz/DQ2q/gwMp/8LC5T8Dg5bQAUF
Xj4KCpz7DQ2u/w0NsP4NDbX/Dw+//wUFYf8CAhL/AwMP/wMDTf8ODrj/Dg64/w0NsP4MDK7/Cwud/A8P
aEEGBmU9DAyl+w4Otf8ODrf+Dw+6/xAQvv8TE8v/EhK+/xAQvP8TE8v/EBDA/w8Puf8PD7f+Dg61/w0N
pvsREW9ACAhtQA8PsfsTE77/ExO//xQUwP8UFML/FBTD/xUVyP8WFsn/FRXE/xQUw/8UFMH/ExO//xMT
vv8QELL7ERF3QxkZdCgXF771ExPH/xUVyPwVFcn9FhbL/RcXzP0XF8z9FxfM/RcXy/0XF8v9FhbJ/RUV
yPwTE8f/Fxe+9RkZdykAAAAAIyOtghsbx/8ZGcj+GRnJ/xoayf8aGsn/GhrK/xoayv8aGsn/GhrJ/xkZ
yf8ZGcj+GxvH/yMjrYQAAAAAAADHAQAAAAAzM51FLCyscCoqrGwqKqxtKSmsbSoqrG0qKqxtKSmsbSoq
rG0qKqxsLCyscDMznUUAAAAAAAAAAP//AADAAwAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
AACAAQAAgAEAAIABAACAAQAAgAEAAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrCR0dHSMWFhY3GBgYORgYGDkYGBg5GBgYORgY
GDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5FxcXNx4e
HiQuLi4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIARYWFis7OzuVkJCQ2ampqeqqqqrsqqqq7Kqq
quyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqq
quypqanqkZGR2j09PZcXFxcsUFBQAQAAAAAAAAAAAAAAAAAAAAASEhIuhISEytvb2/7W1tb/19fX/9jY
2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY
2P/Y2Nj/2NjY/9fX1//W1tb/29vb/oeHh8sTExMvAAAAAAAAAAAAAAAAPDw8DGtra6zZ2dn/2dnZ/9ra
2v/b29v/29vb/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc
3P/c3Nz/3Nzc/9vb2//b29v/29vb/9ra2v/Z2dn/2dnZ/21tba5DQ0MNAAAAAAAAAAAiIiIx1NXU9tna
2f/c3Nz/3d3d/93e3f/e3t7/3t7e/9/f3//f39//39/f/9/g3//g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg
4P/g4OD/39/f/9/f3//f39//3t/e/97e3v/d3t3/3d3d/9zc3P/Z2tn/1dXV9icnJzMAAAAAAAAAAFhZ
WFzf4N//3Nzc/97e3v/f39//39/f/9/g3//g4OD/4ODg/+Hh4f/h4eH/4eHh/+Li4v/i4uL/4uLi/+Li
4v/i4uL/4uLi/+Hi4f/h4eH/4eHh/+Dg4P/g4OD/3+Df/9/f3//f39//3t7e/9zc3P/f39//XV1dXQAA
AAAAAAAAZmZmZdvc2//e3t7/3+Df/+Dg4P/g4eD/4eHh/+Hi4f/i4uL/4uPi/+Pj4//j4+P/5OTk/+Tk
5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/f4N//3t7e/9vb
2/9wcHBoAAAAAAAAAABoaGhl3d3d/9/f3//h4eH/4eLh/+Li4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl
5f/l5uX/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh
4f/f39//3N3c/3Nzc2kAAAAAAAAAAGhoaGXe3t7/4ODg/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm
5v/m5+b/5+fn/+fn5//n6Of/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pk
4//j4+P/4uLi/+Dg4P/e3t7/c3NzaQAAAAAAAAAAaGhoZd/g3//i4uL/5OTk/+Tl5P/l5eX/5ebl/+bn
5v/n5+f/5+jn/+jp6P/p6en/7Ozs/8LCwv+Tk5P/ioqK/66urv/o6ej/6enp/+jp6P/o6Oj/5+jn/+bn
5v/m5ub/5ebl/+Tl5P/k5OT/4uLi/9/g3/9zdHNpAAAAAAAAAABoaWhl4eLh/+Pk4//m5ub/5ubm/+fn
5//n6Of/6Ojo/+np6f/p6un/6urq/8bGxv8yMjL/AAAA/wAAAP8AAAD/AAAA/xMTE/+ZmZn/7Ozs/+rq
6v/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/k5OT/4eHh/3R0dGkAAAAAAAAAAGhpaGXj4+P/5eXl/+fn
5//n6Of/6Ojo/+np6f/q6ur/6urq/+vr6//Dw8P/DAwM/wAAAP8AAAD/Gxsb/ygoKP8BAQH/AAAA/wAA
AP+FhYX/7O3s/+rr6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+Xl5f/i4+L/dHR0aQAAAAAAAAAAYWFhZeTl
5P/m5+b/6Ono/+np6f/p6un/6uvq/+vr6//s7Oz/7e7t/ycnJ/8AAAD/Ghoa/7S0tP/m5ub/5OTk/9HR
0f9GRkb/AAAA/wICAv/IyMj/7Ozs/+vs6//q6+r/6urq/+nq6f/o6ej/5+fn/+Tk5P9sbGxpAAAAAAAA
AAA9Pj1lj4+P/5OTk/+VlZX/lpaW/5eXl/+YmJj/mZmZ/5qamv92dnb/AAAA/wEBAf+/wL//3Nzc/+Tk
5P/l5eX/3d3d/+Li4v8mJib/AAAA/0ZGRv+ampr/mZmZ/5iYmP+Xl5f/lpaW/5WVlf+Tk5P/j4+P/0ZG
RmoAAAAAAAAAAAwMDGUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Nzc3/+fn
5//q6ur/7O3s/+zt7P/v7+//39/f/4WFhf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/EBAQagAAAAAAAAAAAwMHZQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP9NTU3/5ufm//Lz8v/z9PP/8/Tz//X19f/l5eX/nZ2d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8GBgpqAAAAAAAAAAAAABZlAQEk/wEBJ/8CAin/AgIq/wICKv8CAiv/AgIs/wIC
LP8BAR3/AAAA/xwcHP/w8PD/6+zr//r6+v/6+vr/9PT0/+vr6/9lZWX/AAAA/wAAD/8CAi3/AgIs/wIC
K/8CAir/AgIq/wICKf8BASf/AQEl/wUFG2oAAAAAAAAAAAICQGUGBpL/Bwec/wgIo/8JCaf/CQmq/wkJ
rf8JCa//Cgqz/wkJqP8AAAL/AAAA/4CAgP/y8/L/6+zr/+3t7f/u7u7/xMTE/wcHB/8AAAD/BgZz/woK
s/8JCbD/CQmt/wkJqv8JCaj/CAik/wcHnf8HB5P/Dg5MagAAAAAAAAAAAwNHZQgIk/8JCZ3/Cgqj/wsL
p/8LC6n/Cwus/wsLr/8MDLL/DAy2/wYGW/8AAAD/AAAA/1JSUv+sraz/tra2/3h4eP8KCgr/AAAA/wIC
Iv8MDLb/DAyy/wsLsP8LC63/Cwuq/wsLp/8KCqT/CQmd/wgIk/8PD1VrAAAAAAAAAAAEBE1lCQmY/woK
ov8LC6j/DAyr/wwMrf8MDLD/DAyy/w0Ntf8NDbf/Dg67/wUFSv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8CAiH/DQ2q/w0NuP8NDbX/DQ2z/wwMsP8MDK7/DAyr/wsLqP8KCqL/CQmZ/xAQWmsAAAAAAAAAAAQE
UGUKCp7/Cwum/wwMrP8NDa//DQ2w/w0Ns/8ODrX/Dg63/w4Ouf8ODrv/Dw/A/wwMiv8FBTj/AAAG/wAA
AP8DAyb/CQls/w8Pu/8PD7z/Dg66/w4OuP8ODrX/DQ2z/w0Nsf8NDa//DAys/wsLp/8KCp7/ERFeawAA
AAAAAAAABQVTZQsLpP8MDKv/DQ2w/w4Os/8ODrT/Dg62/w8PuP8PD7r/Dw+8/w8Pvf8QEL//EBDA/xER
w/8SEsn/ERHJ/xERxf8QEMD/EBC//w8Pvv8PD7z/Dw+6/w8PuP8ODrf/Dg61/w4Os/8NDbH/DAyr/wsL
pP8SEmFrAAAAAAAAAAAGBlZlDAyq/w4OsP8PD7X/Dw+3/w8PuP8QELr/EBC7/xAQvf8REb7/ERHA/xER
wf8REcL/EhLC/xISw/8SEsP/EhLC/xERwv8REcH/ERHA/xERvv8QEL3/EBC7/xAQuv8QELj/Dw+3/w8P
tf8ODrD/DAyq/xMTZWsAAAAAAAAAAAcHWmUODrD/EBC2/xERuv8REbz/ERG9/xISvv8SEr//EhLA/xMT
wf8TE8P/ExPD/xMTxP8TE8X/FBTF/xQUxf8UFMX/ExPE/xMTxP8TE8P/ExPC/xISwf8SEr//EhK+/xER
vf8REbz/ERG6/xAQtv8ODrD/FBRpawAAAAAAAAAACAhcYxAQtf8SErv/ExO+/xQUwP8UFMD/FBTB/xUV
wv8VFcP/FRXE/xUVxf8WFsb/FhbG/xYWx/8WFsf/FhbH/xYWx/8WFsf/FhbG/xYWxf8VFcT/FRXD/xUV
wv8UFMH/FBTB/xQUwP8TE77/EhK7/xAQtf8TE2hoAAAAAAAAAAAQEFNUFRXC/xMTv/8UFMP/FRXE/xUV
xP8VFcX/FRXG/xYWx/8WFsf/FhbI/xYWyf8XF8n/FxfK/xcXyv8XF8r/FxfK/xcXyf8XF8n/FhbI/xYW
yP8WFsf/FhbG/xUVxf8VFcT/FRXE/xQUw/8TE7//FRXB/xAQV1UAAAAAAAAAAA0NPxkjI8byFBTD/xUV
x/8WFsj/FxfJ/xcXyf8XF8r/FxfK/xcXy/8YGMz/GBjM/xgYzP8YGM3/GBjN/xgYzf8YGM3/GBjM/xgY
zP8YGMz/GBjL/xcXy/8XF8r/FxfJ/xcXyf8WFsj/FRXH/xQUw/8jI8f0Dg5GGwAAAAAAAAAAFhZxAiUl
eIUZGcr/FBTI/xUVyv8WFsv/FhbM/xYWzP8WFsz/FhbN/xcXzf8XF83/FxfN/xcXzv8XF87/FxfO/xcX
zv8XF87/FxfN/xcXzf8WFs3/FhbM/xYWzP8WFsz/FhbL/xUVyv8UFMj/GBjJ/yYmeogWFnYCAAAAAAAA
AAAAAAAAGBh1BzMzk50kJNP+FxfK/xgYzP8YGMz/GBjN/xgYzf8YGM3/GBjN/xgYzf8ZGc7/GRnO/xkZ
zv8ZGc7/GRnO/xkZzv8YGM3/GBjN/xgYzf8YGM3/GBjN/xgYzP8YGMz/FxfK/yMj0v4zM5WfFBRkBwAA
AAAAAAAAAAAAAAAAAAAAAAAAHBx7Ay0tdkg3N5emMTGpxSwsp8gsLKfILCynyCwsp8gsLKfILCynyCws
p8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyDExqcU2NpenLi54Shsb
ewMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////8AAAD+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAAD4AAAB/gAAB//////
</value>
</data>
</root>