From 9384c9c2d01f322bfc029dbdd7d531fb258ef824 Mon Sep 17 00:00:00 2001 From: Serraniel Date: Sun, 16 Apr 2017 22:46:29 +0200 Subject: [PATCH] Some basic stuff --- .../Classes/Settings.cs | 41 ++ Discord Media Loader.Application/Core.cs | 190 +++++++- .../DML.Application.csproj | 14 + .../Dialogs/LoginDialog.Designer.cs | 258 +++++++++++ .../Dialogs/LoginDialog.cs | 61 +++ .../Dialogs/LoginDialog.resx | 413 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 4 +- .../packages.config | 1 + .../Discord Media Loader.csproj | 12 + Discord Media Loader/Program.cs | 9 +- .../Properties/AssemblyInfo.cs | 4 +- Discord Media Loader/packages.config | 1 + 12 files changed, 994 insertions(+), 14 deletions(-) create mode 100644 Discord Media Loader.Application/Classes/Settings.cs create mode 100644 Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs create mode 100644 Discord Media Loader.Application/Dialogs/LoginDialog.cs create mode 100644 Discord Media Loader.Application/Dialogs/LoginDialog.resx diff --git a/Discord Media Loader.Application/Classes/Settings.cs b/Discord Media Loader.Application/Classes/Settings.cs new file mode 100644 index 0000000..45de616 --- /dev/null +++ b/Discord Media Loader.Application/Classes/Settings.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SweetLib.Utils.Logger; +using static SweetLib.Utils.Logger.Logger; + +namespace DML.Application.Classes +{ + internal class Settings + { + public int Id { get; } = 1; // using always unique ID + public string Email { get; set; } + public string Password { get; set; } + public string LoginToken { get; set; } + public bool UseUserData { get; set; } = false; + public bool SavePassword { get; set; } = false; + public LogLevel ApplicactionLogLevel { get; set; } = LogLevel.Info | LogLevel.Warn | LogLevel.Error; + + internal void Store() + { + Trace("Getting settings collection..."); + var settingsDB = Core.Database.GetCollection("settings"); + + Debug("Storing settings to database..."); + + if (settingsDB.Exists(_setting => _setting.Id == Id)) + { + Trace("Updating existing value..."); + settingsDB.Update(this); + } + else + { + Trace("Adding new value..."); + settingsDB.Insert(this); + } + } + } +} diff --git a/Discord Media Loader.Application/Core.cs b/Discord Media Loader.Application/Core.cs index 6a984cf..7451bf7 100644 --- a/Discord Media Loader.Application/Core.cs +++ b/Discord Media Loader.Application/Core.cs @@ -1,14 +1,194 @@ -using Discord; +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime; +using System.Runtime.Remoting.Channels; +using System.Threading.Tasks; +using System.Windows.Forms; +using Discord; +using Discord.Net; +using DML.Application.Classes; +using DML.Application.Dialogs; +using LiteDB; +using SweetLib.Utils.Logger; +using SweetLib.Utils.Logger.Memory; +using static SweetLib.Utils.Logger.Logger; namespace DML.Application { - public class Core + public static class Core { - internal static DiscordClient Client; + internal static DiscordClient Client { get; set; } + internal static LiteDatabase Database { get; set; } + internal static Settings Settings { get; set; } - public static void Run() + internal static string DataDirectory + => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Serraniel\Discord Media Loader"); + + public static async Task Run(string[] paramStrings) { - System.Windows.Forms.Application.Run(new MainForm()); + try + { + Info("Starting up Discord Media Loader application..."); + var useTrace = false; +#if DEBUG + //temporary add debug log level if debugging... + GlobalLogLevel |= LogLevel.Debug; + Debug("Running in debug configuartion. Added log level debug."); +#endif + + Debug($"Parameters: {string.Join(", ", paramStrings)}"); + if (paramStrings.Contains("--trace") || paramStrings.Contains("-t")) + { + useTrace = true; + GlobalLogLevel |= LogLevel.Trace; + Trace("Trace parameter found. Added log level trace."); + } + + Debug($"Application data folder: {DataDirectory}"); + + Trace("Checking application data folder..."); + if (!Directory.Exists(DataDirectory)) + { + Debug("Creating application data folder..."); + Directory.CreateDirectory(DataDirectory); + Trace("Creating application data folder."); + } + + Trace("Initializing profile optimizations..."); + ProfileOptimization.SetProfileRoot(System.Windows.Forms.Application.UserAppDataPath); + ProfileOptimization.StartProfile("profile.opt"); + Trace("Finished initializing profile optimizations."); + + Trace("Trying to identify log memory..."); + var logMemory = DefaultLogMemory as ArchivableConsoleLogMemory; + if (logMemory != null) + { + var logFolder = Path.Combine(DataDirectory, "logs"); + if (!Directory.Exists(logFolder)) + { + Debug("Creating log folder..."); + Directory.CreateDirectory(logFolder); + Trace("Created log folder."); + } + + + var logFile = Path.Combine(logFolder, + $"{DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.SortableDateTimePattern).Replace(':', '-')}.log.zip"); + + Trace($"Setting log file: {logFile}"); + logMemory.AutoArchiveOnDispose = true; + logMemory.ArchiveFile = logFile; + } + + Debug("Loading database..."); + Database = new LiteDatabase(Path.Combine(DataDirectory, "config.db")); + Database.Log.Logging += (message) => Trace($"LiteDB: {message}"); + + Debug("Loading settings collection out of database..."); + var settingsDB = Database.GetCollection("settings"); + if (settingsDB.Count() > 1) + { + Warn("Found more than one setting. Loading first one..."); + } + Settings = settingsDB.FindAll().FirstOrDefault(); + if (Settings == null) + { + Warn("Settings not found. Creating new one. This is normal on first start up..."); + Settings = new Settings(); + Settings.Store(); + } + + Info("Loaded settings."); + Debug( + $"Settings: Email: {Settings.Email}, password: {(string.IsNullOrEmpty(Settings.Password) ? "not set" : "is set")}, use username: {Settings.UseUserData}, loginToken: {Settings.LoginToken}"); + + Trace("Updating log level..."); + GlobalLogLevel = Settings.ApplicactionLogLevel; +#if DEBUG + //temporary add debug log level if debugging... + GlobalLogLevel |= LogLevel.Debug; + Debug("Running in debug configuartion. Added log level debug."); +#endif + if (useTrace) + { + GlobalLogLevel |= LogLevel.Trace; + Trace("Creating application data folder."); + } + + Debug("Creating discord client..."); + Client = new DiscordClient(); + Client.Log.Message += (sender, message) => + { + var logMessage = $"DiscordClient: {message.Message}"; + switch (message.Severity) + { + case LogSeverity.Verbose: + Trace(logMessage); + break; + case LogSeverity.Debug: + Trace(logMessage); + break; + case LogSeverity.Info: + Info(logMessage); + break; + case LogSeverity.Warning: + Warn(logMessage); + break; + case LogSeverity.Error: + Error(logMessage); + break; + } + }; + + + Info("Trying to log into discord..."); + var abort = false; + + while (Client.State != ConnectionState.Connected && !abort) + { + Trace("Entering login loop."); + + try + { + if (!string.IsNullOrEmpty(Settings.LoginToken)) + { + Debug("Trying to login with last known token..."); + await Client.Connect(Settings.LoginToken, TokenType.User); + } + + if (Client.State != ConnectionState.Connected && Settings.UseUserData && + !string.IsNullOrEmpty(Settings.Email) && + !string.IsNullOrEmpty(Settings.Password)) + { + Settings.LoginToken = string.Empty; + + Debug("Trying to login with email and password..."); + await Client.Connect(Settings.Email, Settings.Password); + } + } + catch (HttpException) + { + Warn("Login seems to have failed or gone wrong."); + } + + if (Client.State != ConnectionState.Connected) + { + Settings.Password = string.Empty; + Debug("Showing dialog for username and password..."); + var loginDlg = new LoginDialog(); + loginDlg.ShowDialog(); + Trace("Dialog closed."); + } + } + + System.Windows.Forms.Application.Run(new MainForm()); + } + catch (Exception ex) + { + Error($"{ex.Message} occured at: {ex.StackTrace}"); + } } } } diff --git a/Discord Media Loader.Application/DML.Application.csproj b/Discord Media Loader.Application/DML.Application.csproj index 19c9ac3..6c87c1a 100644 --- a/Discord Media Loader.Application/DML.Application.csproj +++ b/Discord Media Loader.Application/DML.Application.csproj @@ -34,6 +34,10 @@ ..\packages\Discord.Net.0.9.6\lib\net45\Discord.Net.dll True + + ..\packages\LiteDB.3.1.0\lib\net35\LiteDB.dll + True + ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll True @@ -74,7 +78,14 @@ + + + Form + + + LoginDialog.cs + Form @@ -84,6 +95,9 @@ + + LoginDialog.cs + MainForm.cs diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs b/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs new file mode 100644 index 0000000..fd09c4b --- /dev/null +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.Designer.cs @@ -0,0 +1,258 @@ +namespace DML.Application.Dialogs +{ + partial class LoginDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginDialog)); + this.pnlButtons = new System.Windows.Forms.Panel(); + this.tbcLoginMethods = new System.Windows.Forms.TabControl(); + this.tpgToken = new System.Windows.Forms.TabPage(); + this.tpgUserdata = new System.Windows.Forms.TabPage(); + this.lbToken = new System.Windows.Forms.Label(); + this.edToken = new System.Windows.Forms.TextBox(); + this.lbHowToToken = new System.Windows.Forms.Label(); + this.edEmail = new System.Windows.Forms.TextBox(); + this.edPassword = new System.Windows.Forms.TextBox(); + this.lbEmail = new System.Windows.Forms.Label(); + this.lbPassword = new System.Windows.Forms.Label(); + this.cbUseUserdata = new System.Windows.Forms.CheckBox(); + this.cbSavePassword = new System.Windows.Forms.CheckBox(); + this.lbUserdataHints = new System.Windows.Forms.Label(); + this.btnOk = new System.Windows.Forms.Button(); + this.btnAbort = new System.Windows.Forms.Button(); + this.pnlButtons.SuspendLayout(); + this.tbcLoginMethods.SuspendLayout(); + this.tpgToken.SuspendLayout(); + this.tpgUserdata.SuspendLayout(); + this.SuspendLayout(); + // + // pnlButtons + // + this.pnlButtons.BackColor = System.Drawing.SystemColors.ButtonShadow; + this.pnlButtons.Controls.Add(this.btnAbort); + this.pnlButtons.Controls.Add(this.btnOk); + this.pnlButtons.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pnlButtons.Location = new System.Drawing.Point(0, 168); + this.pnlButtons.Name = "pnlButtons"; + this.pnlButtons.Size = new System.Drawing.Size(426, 51); + this.pnlButtons.TabIndex = 0; + // + // tbcLoginMethods + // + this.tbcLoginMethods.Controls.Add(this.tpgToken); + this.tbcLoginMethods.Controls.Add(this.tpgUserdata); + this.tbcLoginMethods.Dock = System.Windows.Forms.DockStyle.Fill; + this.tbcLoginMethods.Location = new System.Drawing.Point(0, 0); + this.tbcLoginMethods.Name = "tbcLoginMethods"; + this.tbcLoginMethods.SelectedIndex = 0; + this.tbcLoginMethods.Size = new System.Drawing.Size(426, 168); + this.tbcLoginMethods.TabIndex = 1; + // + // tpgToken + // + this.tpgToken.Controls.Add(this.lbHowToToken); + this.tpgToken.Controls.Add(this.edToken); + this.tpgToken.Controls.Add(this.lbToken); + this.tpgToken.Location = new System.Drawing.Point(4, 22); + this.tpgToken.Name = "tpgToken"; + this.tpgToken.Padding = new System.Windows.Forms.Padding(3); + this.tpgToken.Size = new System.Drawing.Size(418, 142); + this.tpgToken.TabIndex = 0; + this.tpgToken.Text = "Token"; + this.tpgToken.UseVisualStyleBackColor = true; + // + // tpgUserdata + // + this.tpgUserdata.Controls.Add(this.lbUserdataHints); + this.tpgUserdata.Controls.Add(this.cbSavePassword); + this.tpgUserdata.Controls.Add(this.cbUseUserdata); + this.tpgUserdata.Controls.Add(this.lbPassword); + this.tpgUserdata.Controls.Add(this.lbEmail); + this.tpgUserdata.Controls.Add(this.edPassword); + this.tpgUserdata.Controls.Add(this.edEmail); + this.tpgUserdata.Location = new System.Drawing.Point(4, 22); + this.tpgUserdata.Name = "tpgUserdata"; + this.tpgUserdata.Padding = new System.Windows.Forms.Padding(3); + this.tpgUserdata.Size = new System.Drawing.Size(418, 142); + this.tpgUserdata.TabIndex = 1; + this.tpgUserdata.Text = "Userdata"; + this.tpgUserdata.UseVisualStyleBackColor = true; + // + // lbToken + // + this.lbToken.AutoSize = true; + this.lbToken.Location = new System.Drawing.Point(3, 9); + this.lbToken.Name = "lbToken"; + this.lbToken.Size = new System.Drawing.Size(66, 13); + this.lbToken.TabIndex = 0; + this.lbToken.Text = "Login token:"; + // + // edToken + // + this.edToken.Location = new System.Drawing.Point(75, 6); + this.edToken.Name = "edToken"; + this.edToken.Size = new System.Drawing.Size(335, 20); + this.edToken.TabIndex = 1; + // + // lbHowToToken + // + this.lbHowToToken.Location = new System.Drawing.Point(3, 52); + this.lbHowToToken.Name = "lbHowToToken"; + this.lbHowToToken.Size = new System.Drawing.Size(412, 87); + this.lbHowToToken.TabIndex = 2; + this.lbHowToToken.Text = resources.GetString("lbHowToToken.Text"); + // + // edEmail + // + this.edEmail.Location = new System.Drawing.Point(47, 6); + this.edEmail.Name = "edEmail"; + this.edEmail.Size = new System.Drawing.Size(133, 20); + this.edEmail.TabIndex = 0; + // + // edPassword + // + this.edPassword.Location = new System.Drawing.Point(279, 6); + this.edPassword.Name = "edPassword"; + this.edPassword.PasswordChar = '•'; + this.edPassword.Size = new System.Drawing.Size(133, 20); + this.edPassword.TabIndex = 1; + // + // lbEmail + // + this.lbEmail.AutoSize = true; + this.lbEmail.Location = new System.Drawing.Point(6, 9); + this.lbEmail.Name = "lbEmail"; + this.lbEmail.Size = new System.Drawing.Size(35, 13); + this.lbEmail.TabIndex = 2; + this.lbEmail.Text = "Email:"; + // + // lbPassword + // + this.lbPassword.AutoSize = true; + this.lbPassword.Location = new System.Drawing.Point(217, 9); + this.lbPassword.Name = "lbPassword"; + this.lbPassword.Size = new System.Drawing.Size(56, 13); + this.lbPassword.TabIndex = 3; + this.lbPassword.Text = "Password:"; + // + // cbUseUserdata + // + this.cbUseUserdata.AutoSize = true; + this.cbUseUserdata.Location = new System.Drawing.Point(6, 32); + this.cbUseUserdata.Name = "cbUseUserdata"; + this.cbUseUserdata.Size = new System.Drawing.Size(139, 17); + this.cbUseUserdata.TabIndex = 4; + this.cbUseUserdata.Text = "Use login with user data"; + this.cbUseUserdata.UseVisualStyleBackColor = true; + // + // cbSavePassword + // + this.cbSavePassword.AutoSize = true; + this.cbSavePassword.Location = new System.Drawing.Point(313, 32); + this.cbSavePassword.Name = "cbSavePassword"; + this.cbSavePassword.Size = new System.Drawing.Size(99, 17); + this.cbSavePassword.TabIndex = 5; + this.cbSavePassword.Text = "Save password"; + this.cbSavePassword.UseVisualStyleBackColor = true; + // + // lbUserdataHints + // + this.lbUserdataHints.Location = new System.Drawing.Point(3, 52); + this.lbUserdataHints.Name = "lbUserdataHints"; + this.lbUserdataHints.Size = new System.Drawing.Size(412, 87); + this.lbUserdataHints.TabIndex = 6; + this.lbUserdataHints.Text = "Login with email and password is not recommended. If you use two factor authentic" + + "ation this can cause a ban of your discord account.\r\n\r\nFor safety reasons we rec" + + "ommend to login with login token."; + // + // btnOk + // + this.btnOk.Location = new System.Drawing.Point(267, 16); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(75, 23); + this.btnOk.TabIndex = 0; + this.btnOk.Text = "&Ok"; + this.btnOk.UseVisualStyleBackColor = true; + this.btnOk.Click += new System.EventHandler(this.btnOk_Click); + // + // btnAbort + // + this.btnAbort.Location = new System.Drawing.Point(348, 16); + this.btnAbort.Name = "btnAbort"; + this.btnAbort.Size = new System.Drawing.Size(75, 23); + this.btnAbort.TabIndex = 1; + this.btnAbort.Text = "&Abort"; + this.btnAbort.UseVisualStyleBackColor = true; + this.btnAbort.Click += new System.EventHandler(this.btnAbort_Click); + // + // LoginDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(426, 219); + this.Controls.Add(this.tbcLoginMethods); + this.Controls.Add(this.pnlButtons); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "LoginDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "LoginForm"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoginDialog_FormClosing); + this.Shown += new System.EventHandler(this.LoginDialog_Shown); + this.pnlButtons.ResumeLayout(false); + this.tbcLoginMethods.ResumeLayout(false); + this.tpgToken.ResumeLayout(false); + this.tpgToken.PerformLayout(); + this.tpgUserdata.ResumeLayout(false); + this.tpgUserdata.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel pnlButtons; + private System.Windows.Forms.TabControl tbcLoginMethods; + private System.Windows.Forms.TabPage tpgToken; + private System.Windows.Forms.Label lbHowToToken; + private System.Windows.Forms.TextBox edToken; + private System.Windows.Forms.Label lbToken; + private System.Windows.Forms.TabPage tpgUserdata; + private System.Windows.Forms.Button btnAbort; + private System.Windows.Forms.Button btnOk; + private System.Windows.Forms.Label lbUserdataHints; + private System.Windows.Forms.CheckBox cbSavePassword; + private System.Windows.Forms.CheckBox cbUseUserdata; + private System.Windows.Forms.Label lbPassword; + private System.Windows.Forms.Label lbEmail; + private System.Windows.Forms.TextBox edPassword; + private System.Windows.Forms.TextBox edEmail; + } +} \ No newline at end of file diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.cs b/Discord Media Loader.Application/Dialogs/LoginDialog.cs new file mode 100644 index 0000000..6163db7 --- /dev/null +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static SweetLib.Utils.Logger.Logger; + +namespace DML.Application.Dialogs +{ + public partial class LoginDialog : Form + { + public LoginDialog() + { + InitializeComponent(); + } + + private void LoginDialog_Shown(object sender, EventArgs e) + { + Trace("Login dialog shown."); + edToken.Text = Core.Settings.LoginToken; + edEmail.Text = Core.Settings.Email; + edPassword.Text = Core.Settings.Password; + cbUseUserdata.Checked = Core.Settings.UseUserData; + cbSavePassword.Checked = Core.Settings.SavePassword; + + tbcLoginMethods.SelectedTab = Core.Settings.UseUserData ? tpgUserdata : tpgToken; + } + + private void LoginDialog_FormClosing(object sender, FormClosingEventArgs e) + { + Trace($"Closing login dialog. Result: {DialogResult}"); + if (DialogResult != DialogResult.OK) + return; + + Debug("Adjusting login settings..."); + Core.Settings.LoginToken = edToken.Text; + Core.Settings.Email = edEmail.Text; + Core.Settings.Password = edPassword.Text; + Core.Settings.UseUserData = cbUseUserdata.Checked; + Core.Settings.SavePassword = cbSavePassword.Checked; + + Core.Settings.Store(); + } + + private void btnOk_Click(object sender, EventArgs e) + { + Trace("btnOk pressed."); + DialogResult = DialogResult.OK; + } + + private void btnAbort_Click(object sender, EventArgs e) + { + Trace("btnAbort pressed."); + DialogResult = DialogResult.Abort; + } + } +} diff --git a/Discord Media Loader.Application/Dialogs/LoginDialog.resx b/Discord Media Loader.Application/Dialogs/LoginDialog.resx new file mode 100644 index 0000000..0ffe195 --- /dev/null +++ b/Discord Media Loader.Application/Dialogs/LoginDialog.resx @@ -0,0 +1,413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + To find your login token please start Discord and press Ctrl + Shift + I shortcut. A browser inspector will open. +Navigate into the "Application" tab and select "Local Storage" / "https://discordapp.com". If the right site keeps blank use "Session Storage" instead. +Look for the token key and copy its value without the quotation marks. + + + + + AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8b////VP///3////+m////zP// + /+T////1//////////r////u////3f///8z///+m////f////1T///8b////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////M////5D////b//////// + //////////////////////////////////////////////////////////////////////////////// + /9v///+Q////M////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///w3///90////1v// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////W////dP///w3///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A2K4AANiuAADYrgAA2K4AANiuAADfswAA////EP// + /4D////t////////////////////////////////////////////////9/zq/7XiQ/+340n/w+ho/9Pu + kf/m9b//+Pzt///////////////////////////////////////////////////////////t////gf// + /xCa2AAAmtgAAJrYAACa2AAAmtgAAJrYAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ANiuAADYrgAA2K4AANiu + AAD///8B////Yf///+v//////////////////////////////////////////////////////////+z4 + z/+a2AD/mtgA/5rYAP+a2AD/mtgA/6TcGf+65VL/3fKo//n98P////////////////////////////// + ///////////////////////r////Yf///wGa2AAAmtgAAJrYAACa2AAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wDYrgAA2K4AANiuAAD///8k////xP////////////////////////////////////////////////// + ///////////////////h87P/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+n3SD/zOt+//X7 + 5v/////////////////////////////////////////////////////E////I5rYAACa2AAAmtgAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A2K4AANiuAAD///9V////8f////////////////////////////////// + ////////////////////////////////////////0+6Q/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+k3Bn/0e2K//v+9v////////////////////////////////////////////// + //H///9VmtgAAJrYAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wH///+M//////////////////////// + /////////////////////////////////////////////////////////////8bpbv+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+u4DP/5/bD//////////////////// + /////////////////////////////////4z///8B////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wb///+l//////// + //////////////////////////////////////////////////////////////////////////////// + //+55E//mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5zZ + Bv/P7Ib/////////////////////////////////////////////////////pf///wb///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wb///+3//////////////////////////////////////////////////////////////////////// + ///////////////////+//3/rd8x/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/7zlV//5/fH///////////////////////////////////////// + //////+3////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wH///+k//////////////////////////////////////////////////////// + ////////////////////////////////////////+f3v/6PcF/+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/seE7//X75v////////////// + /////////////////////////////////6T///8B////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///+K//////////////////////////////////////// + /////////////////////////////////////////////////////////////+751f+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+s3y7/9Pvi////////////////////////////////////////////////i////wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///9V//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///s+M//rd8w/6XcHf+c2Qb/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/6zfLv/1++f///////////////////////////////////////// + //////9V////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8j////8P// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////v/6/fL/8PnZ/97yrP/E6Gv/qd4l/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/suE8//v99P////////////// + ////////////////////////////8P///yP///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8B////xP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////v9 + 9f/e8qz/s+JA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP/A51/////////////////////////////////////////////////E////Af///wD///8A////AP// + /wD///8A////AP///wD///8A////Yf////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////f867/rN8t/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/9jwnP////////////////////////////////////////////// + /2H///8A////AP///wD///8A////AP///wD///8A////EP///+r///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////r98//I6nX/mtgA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+h2xL/8/rh//////////////////// + ///////////////////////q////Ev///wD///8A////AP///wD///8A////AP///3////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////9/yrf+h2xL/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/8Dn + X////////////////////////////////////////////////4D///8A////AP///wD///8A////AP// + /w3////u//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////7PjQ/6reKP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+c2QX/7vjT///////////////////////////////////////////u////Df// + /wD///8A////AP///wD///90//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////0++L/qd4n/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/8PoaP////////////////////////////// + /////////////////3T///8A////AP///wD///8B////2/////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+360P+k4g3/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP+j2xb/+Pzu//// + ///////////////////////////////////////b////Af///wD///8A////O/////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////wNCY/53dAP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+a2AD/mtgA/9/zr////////////////////////////////////////////////zv///8A////AP// + /5D///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////f39/+Puin/n+AA/5rY + AP+a2AD/mtgA/5rYAP+a2AD/mtgA/5rYAP/F6W3///////////////////////////////////////// + //////+Q////AP///wD////Y//////////////////////////////////////////////////////// + /////////////////////////////+3t7f+3t7f/jIyM/3Nzc/9oaGj/a2tr/35+fv+dnZ3/xsbG//Hx + 8f////////////////////////////////////////////////////////////////////////////// + ////////iZNy/5zbAP+b2QD/mtgA/5rYAP+a2AD/mtgA/5rYAP+a2AD/s+JA//////////////////// + ////////////////////////////2f///wD///8d//////////////////////////////////////// + ////////////////////////////////////////9fTx/46Pk/9BQUH/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/y4uLv9ERET/fn5+/8rKyv////////////////////////////////////////////// + /////////////////////////////4iHjP98qA3/n+AA/5rYAP+a2AD/mtgA/5rYAP+a2AD/mtgA/6ne + J/////////////////////////////////////////////////////8e////Vv////////////////// + ////////////////////////////////////////////////////////+fDL/45/Qv8kJjH/Li4u/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Xl5e/7e3t//+/v7///////// + //////////////////////////////////////////////////9vbXX/T2Ig/57fAP+a2QD/mtgA/5rY + AP+a2AD/mtgA/5rYAP+l3Bz/////////////////////////////////////////////////////Vv// + /4T/////////////////////////////////////////////////////////////////////8+ax/+O5 + D/92ZBv/JCYx/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/YGBg/8jIyP/////////////////////////////////////////////////09PT/QkJE/zEz + Lf+Mwgb/nd0A/5rYAP+a2AD/mtgA/5rYAP+a2AD/pdwb//////////////////////////////////// + /////////////////4T///+t//////////////////////////////////////////////////////// + ////////8+ez/9mwB//htQD/dWMb/yQnMf8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/dHR0/97e3v////////////////////////////// + ////////r6+v/y4uLv8nIzH/bZET/6HiAP+a2AD/mtgA/5rYAP+a2AD/mtgA/6neJv////////////// + //////////////////////////////////////+t////zP////////////////////////////////// + ////////////////////////+PHS/9qyDv/YrgD/4rUA/3lmGf8kJjH/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Ozs7/1ZWVv90dHT/jo6O/5mZmf/Hx8f//v7+//// + ////////////////////////7+/v/0dHR/8uLi7/KCUw/1BkH/+f4AD/mtgA/5rYAP+a2AD/mtgA/5rY + AP+z4T7/////////////////////////////////////////////////////zP///+X///////////// + /////////////////////////////////////////v35/+C/N//YrgD/2K4A/+O2AP+Dbhf/IyYx/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/1VVVf+QkJD/xsbG/+rq6v////////////// + ////////////////////////////////////////+vr6/2tra/8uLi7/Li4u/yspL/86Qij/ltEC/5va + AP+a2AD/mtgA/5rYAP+a2AD/x+ly//////////////////////////////////////////////////// + /+D////y//////////////////////////////////////////////////////Dfm//YrgD/2K4A/9iu + AP/itQD/k3oT/yUnMf8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/cHBw/8bGxv/8/Pz///////// + ////////////////////////////////////////////////////////7+/v/3BwcP8uLi7/Li4u/y4u + Lv8tLC7/Ly8u/4e7CP+e3gD/mtgA/5rYAP+a2AD/mtgA/+X1vf////////////////////////////// + ///////////////////////s//////////////////////////////////////////////////////79 + +f/euyr/2K4A/9iuAP/YrgD/4LQA/6iKDf8oKTD/Li4u/y4uLv8uLi7/Li4u/y4uLv9QUFD/xMTE//// + ////////////////////////////////////////////////////////////////////////w8PD/1BQ + UP8uLi7/Li4u/y4uLv8uLi7/Li4u/yknMP95pA7/n+EA/5rYAP+a2AD/mtgA/6neJ//8/vj///////// + ////////////////////////////////////////////+f////////////////////////////////// + ///////////////////168D/2K4A/9iuAP/YrgD/2K4A/92yAP+/mwf/MTAt/ywtLv8uLi7/Li4u/y4u + Lv9wcHD/8PDw//////////////////////////////////////////////////////////////////r6 + +v/ExMT/bm5u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8oJDH/a44U/6HiAP+a2AD/mtgA/5rY + AP/W75j///////////////////////////////////////////////////////////n////y//////// + ////////////////////////////////////////6tR3/9iuAP/YrgD/2K4A/9iuAP/arwD/06oB/0VA + J/8pKi//Li4u/y4uLv9ra2v/+vr6//////////////////////////////////////////////////39 + /f/n5+f/wsLC/4yMjP9SUlL/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/JyMx/2F+ + GP+h4wD/mtgA/5rYAP+v4DX//P74//////////////////////////////////////////////////// + ///////s////5f///////////////////////////////////////////////+LDQv/YrgD/2K4A/9iu + AP/YrgD/2K4A/+C0AP9oWh7/JCcx/y4uLv9GRkb/7u7u/////////////////////////////v7+/8fH + x/+VlZX/iYmJ/3BwcP9TU1P/OTk5/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/ygkMf9bdRv/oOEA/5rYAP+g2g7/7fjR//////////////////////////////////// + ////////////////////////////4P///8z///////////////////////////////////////////// + ///euyj/2K4A/9iuAP/YrgD/2K4A/9iuAP/itQD/ln0S/yQnMf8uLi7/ra2t//////////////////// + ///////////////////i4uL/e3t7/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8oJDH/WXEc/6DhAP+d2Qf/4fOy//////////////////// + /////////////////////////////////////////////////8z///+t//////////////////////// + ////////////////////////3Lcc/9iuAP/YrgD/2K4A/9iuAP/YrgD/3LEA/8agBf82NCz/Pj9C//T0 + 9P/////////////////////////////////////////////////Ozs7/ZmZm/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/KCQx/1pzHP+m4w//4POx//// + //////////////////////////////////////////////////////////////////////+t////hP// + /////////////////////////////////////////////9y3Hf/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/gtAD/Z1ke/2lrcv////////////////////////////////////////////////////////////// + //++vr7/ZGRk/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/y4uLv8uLi7/Li4u/ygk + Mf93i0X/7PnL//////////////////////////////////////////////////////////////////// + ////////////hP///1T////////////////////////////////////////////////euyr/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/4LQA/66OC/+Dg4b///////////////////////////////////////// + ///////////////////////////////////Pz8//hISE/0hISP8uLi7/Li4u/y4uLv8uLi7/Li4u/y4u + Lv8uLi7/Li4u/0JCQv+RkJX/9PXy//////////////////////////////////////////////////// + /////////////////////////////////1b///8c//////////////////////////////////////// + ////////48RG/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9mvAP/dsgD/kopq//////////////////// + ///////////////////////////////////////////////////////////////////09PT/y8vL/6Ki + ov+Dg4P/cXFx/21tbf94eHj/kJCQ/7q6uv/v7+////////////////////////////////////////// + //////////////////////////////////////////////////////8d////AP///9f///////////// + /////////////////////////////+rTdP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/4LQA/72f + Iv/09PT///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////Y////AP// + /wD///+P///////////////////////////////////////////06Lb/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/esgD/zsKO//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////kP///wD///8A////Ov///////////////////////////////////////////fvx/9y2 + Gv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+G3Cf/578j///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////zr///8A////AP///wH////a//////////////////////// + ///////////////////p0nD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/3bgh//r0 + 3P////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////9v///8B////AP///wD///8A////dP// + ////////////////////////////////////////+fPZ/9mxCP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/duCH/9+7I//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////90////AP// + /wD///8A////AP///wz////t///////////////////////////////////////////oz2n/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9qyDf/x4qT///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////t////Df///wD///8A////AP///wD///8A////f/////////////////////////////////// + ////////+/fm/9u1Fv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+nQ + bP/8+u7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////f////wD///8A////AP///wD///8A////AP///xD////q//////// + ///////////////////////////////////x4qX/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/3ron//Hipf///v3///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////6v///xD///8A////AP///wD///8A////AP// + /wD///8A////YP///////////////////////////////////////////////+jPaf/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/4cA5//HipP/9+/H///////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////2H///8A////AP// + /wD///8A////AP///wD///8A////AP///wH////D//////////////////////////////////////// + ///+/fj/4sRE/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/3bgf/+fNY//x4qX/+PHT//367//+/vv////+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /8P///8B////AP///wD///8A////AP///wD///8A////AP///wD///8A////Iv////D///////////// + //////////////////////////////z57f/gvzX/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9ivA//cthj/37wr//fuyv////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////D///8i////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///9U////////////////////////////////////////////////+/jo/+C/Nf/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/48NH///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////9V////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///4j///////////////////////////////////////////// + ///8+ev/4sND/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/btBP//Pns//////////////////////////////////////////////////// + //////////////////////////////////////////////////////+J////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8B////pP////////////////// + //////////////////////////////789v/nzGD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/37wt///+/P////////////////////////////// + //////////////////////////////////////////////////////////////////////+k////Af// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wb///+3/////////////////////////////////////////////////////+7bj//asQr/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/+PGSv////////////// + //////////////////////////////////////////////////////////////////////////////// + //////+3////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////Bv///6X///////////////////////////////////////////// + ////////9+7K/+HBO//YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/oz2n///////////////////////////////////////////////////////////////////////// + //////////////////////+l////Bv///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8B////jP////////////////// + ///////////////////////////////////+/fr/7t2T/924Hv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iu + AP/YrgD/2K4A/9iuAP/YrgD/7dqL//////////////////////////////////////////////////// + //////////////////////////////////////+M////Af///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A2K4AANiu + AAD///9V////8f/////////////////////////////////////////////////////8+ev/7dmH/966 + Jv/YrgD/2K4A/9iuAP/YrgD/2K4A/9iuAP/YrgD/2K4A//Plrv////////////////////////////// + //////////////////////////////////////////////////H///9VmtgAAJrYAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////ANiuAADYrgAA2K4AAP///yT////E//////////////////////////////////////// + ///////////////////9/PT/8+av/+bLWv/duB7/2K4A/9iuAP/YrgD/2K4A/9iuAP/37sv///////// + /////////////////////////////////////////////////////////////////8T///8jmtgAAJrY + AACa2AAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wDYrgAA2K4AANiuAADYrgAA////Af///2D////r//////// + /////////////////////////////////////////////////////////fvx//btxv/v3pf/6dJw/+TH + T//jxEX/+/jo////////////////////////////////////////////////////////////////6/// + /2D///8BmtgAAJrYAACa2AAAmtgAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////EP///3/////t//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////t////f////xD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////Df///3T////V//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////9X///90////Df///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /zP///+N////1/////////////////////////////////////////////////////////////////// + ///////////////////////X////jf///zP///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8b////VP///33///+l////y////+P////y//////// + ///////y////4////8v///+l////ff///1T///8b////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////4Af///////wAAD//////8AAAD/////+AAAAB/////wAAAAD////8AAAAAD////gAAAAA + H///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAAAAAA//4AAAAAAAB//gAAAAAAAH/8AAAAAAAAP/gA + AAAAAAAf+AAAAAAAAB/wAAAAAAAAD/AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB8AAAAAAAAADwAAAAAAA + AAOAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABwAAAAAAAAAPAAAAAAAAAA+AA + AAAAAAAH4AAAAAAAAAfwAAAAAAAAD/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//gAAAAAA + AH/+AAAAAAAAf/8AAAAAAAD//4AAAAAAAf//wAAAAAAD///gAAAAAAf///gAAAAAH////AAAAAA///// + AAAAAP/////AAAAD//////AAAA///////AAAP///////4Af///8= + + + \ No newline at end of file diff --git a/Discord Media Loader.Application/Properties/AssemblyInfo.cs b/Discord Media Loader.Application/Properties/AssemblyInfo.cs index 74d6d60..8e9e460 100644 --- a/Discord Media Loader.Application/Properties/AssemblyInfo.cs +++ b/Discord Media Loader.Application/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.2.102.0")] -[assembly: AssemblyFileVersion("0.2.102.0")] +[assembly: AssemblyVersion("0.2.116.0")] +[assembly: AssemblyFileVersion("0.2.116.0")] diff --git a/Discord Media Loader.Application/packages.config b/Discord Media Loader.Application/packages.config index 23d4c16..b07ac08 100644 --- a/Discord Media Loader.Application/packages.config +++ b/Discord Media Loader.Application/packages.config @@ -1,6 +1,7 @@  + diff --git a/Discord Media Loader/Discord Media Loader.csproj b/Discord Media Loader/Discord Media Loader.csproj index 7158979..7f71c90 100644 --- a/Discord Media Loader/Discord Media Loader.csproj +++ b/Discord Media Loader/Discord Media Loader.csproj @@ -40,6 +40,18 @@ + + ..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.dll + True + + + ..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Concurrent.dll + True + + + ..\packages\Nito.AsyncEx.3.0.1\lib\net45\Nito.AsyncEx.Enlightenment.dll + True + ..\packages\Octokit.0.24.1-alpha0001\lib\net45\Octokit.dll True diff --git a/Discord Media Loader/Program.cs b/Discord Media Loader/Program.cs index 111fa44..613769a 100644 --- a/Discord Media Loader/Program.cs +++ b/Discord Media Loader/Program.cs @@ -6,24 +6,23 @@ using System.Threading.Tasks; using System.Windows.Forms; using Discord_Media_Loader.Helper; using DML.Application; +using Nito.AsyncEx; namespace Discord_Media_Loader { static class Program { [STAThread] - static void Main() + static void Main(string[] paramStrings) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - ProfileOptimization.SetProfileRoot(Application.UserAppDataPath); - ProfileOptimization.StartProfile("profile.opt"); - var splashScreen = new FrmSplash(); splashScreen.ShowDialog(); - Core.Run(); + AsyncContext.Run(() => Core.Run(paramStrings)); + Console.WriteLine("Ende"); } } } diff --git a/Discord Media Loader/Properties/AssemblyInfo.cs b/Discord Media Loader/Properties/AssemblyInfo.cs index 4514eef..4a9b613 100644 --- a/Discord Media Loader/Properties/AssemblyInfo.cs +++ b/Discord Media Loader/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.99.28.0")] -[assembly: AssemblyFileVersion("0.99.28.0")] +[assembly: AssemblyVersion("0.99.44.0")] +[assembly: AssemblyFileVersion("0.99.44.0")] diff --git a/Discord Media Loader/packages.config b/Discord Media Loader/packages.config index 59c9621..4832885 100644 --- a/Discord Media Loader/packages.config +++ b/Discord Media Loader/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file