diff --git a/FsConnector/ActionEvent.cs b/FsConnector/ActionEvent.cs new file mode 100644 index 0000000..afc8ed8 --- /dev/null +++ b/FsConnector/ActionEvent.cs @@ -0,0 +1,16 @@ +namespace MSFSPopoutPanelManager.FsConnector +{ + public enum ActionEvent + { + KEY_MASTER_BATTERY_SET, + KEY_ALTERNATOR_ON, + KEY_ALTERNATOR_OFF, + KEY_ALTERNATOR_SET, + + KEY_AVIONICS_MASTER_SET, + KEY_AVIONICS_MASTER_1_ON, + KEY_AVIONICS_MASTER_2_ON, + KEY_AVIONICS_MASTER_1_OFF, + KEY_AVIONICS_MASTER_2_OFF + } +} diff --git a/FsConnector/DataDefinition.cs b/FsConnector/DataDefinition.cs new file mode 100644 index 0000000..8ca0876 --- /dev/null +++ b/FsConnector/DataDefinition.cs @@ -0,0 +1,20 @@ +using Microsoft.FlightSimulator.SimConnect; +using System; +using System.Collections.Generic; + +namespace MSFSPopoutPanelManager.FsConnector +{ + public class DataDefinition + { + public static List<(string PropName, string SimConnectName, string SimConnectUnit, SIMCONNECT_DATATYPE SimConnectDataType, Type ObjectType)> GetDefinition() + { + var def = new List<(string, string, string, SIMCONNECT_DATATYPE, Type)> + { + ("Title", "Title", null, SIMCONNECT_DATATYPE.STRING256, typeof(string)), + ("ElectricalMasterBattery", "ELECTRICAL MASTER BATTERY", "Bool", SIMCONNECT_DATATYPE.FLOAT64, typeof(bool)) + }; + + return def; + } + } +} diff --git a/FsConnector/Enums.cs b/FsConnector/Enums.cs new file mode 100644 index 0000000..80607e9 --- /dev/null +++ b/FsConnector/Enums.cs @@ -0,0 +1,28 @@ + +namespace MSFSPopoutPanelManager.FsConnector +{ + public enum SimConnectDefinition + { + SimConnectDataStruct + } + + public enum NotificationGroup + { + GROUP0, + } + + public enum DataRequest + { + REQUEST_1 + } + + public enum SimConnectSystemEvent + { + FOURSECS, + SIMSTART, + SIMSTOP, + FLIGHTLOADED, + VIEW, + PAUSED + }; +} diff --git a/FsConnector/FsConnector.csproj b/FsConnector/FsConnector.csproj new file mode 100644 index 0000000..221ee28 --- /dev/null +++ b/FsConnector/FsConnector.csproj @@ -0,0 +1,34 @@ + + + + net5.0-windows + FsConnector + MSFS 2020 Popout Panel Manager FsConnector + MSFS 2020 Popout Panel Manager FsConnector + 3.2.0 + Stanley Kwok + Stanley Kwok + Stanley Kwok 2021 + https://github.com/hawkeye-stan/msfs-popout-panel-manager + MSFSPopoutPanelManager.FsConnector + x64;AnyCPU + + + + + + + + + Resources\Managed\Microsoft.FlightSimulator.SimConnect.dll + + + + + + PreserveNewest + SimConnect.dll + + + + diff --git a/FsConnector/Resources/Managed/Microsoft.FlightSimulator.SimConnect.dll b/FsConnector/Resources/Managed/Microsoft.FlightSimulator.SimConnect.dll new file mode 100644 index 0000000..09b2410 Binary files /dev/null and b/FsConnector/Resources/Managed/Microsoft.FlightSimulator.SimConnect.dll differ diff --git a/FsConnector/Resources/SimConnect.dll b/FsConnector/Resources/SimConnect.dll new file mode 100644 index 0000000..da40b73 Binary files /dev/null and b/FsConnector/Resources/SimConnect.dll differ diff --git a/FsConnector/SimConnectStruct.cs b/FsConnector/SimConnectStruct.cs new file mode 100644 index 0000000..fa5bc60 --- /dev/null +++ b/FsConnector/SimConnectStruct.cs @@ -0,0 +1,24 @@ + +using System.Runtime.InteropServices; + +namespace MSFSPopoutPanelManager.FsConnector +{ + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public class SimConnectStruct + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x100)] + public string Prop01; + + public double Prop02; + public double Prop03; + public double Prop04; + public double Prop05; + public double Prop06; + public double Prop07; + public double Prop08; + public double Prop09; + public double Prop10; + + // Add more as DataDefinition grows + } +} diff --git a/FsConnector/SimConnector.cs b/FsConnector/SimConnector.cs new file mode 100644 index 0000000..0f03cd3 --- /dev/null +++ b/FsConnector/SimConnector.cs @@ -0,0 +1,194 @@ +using Microsoft.FlightSimulator.SimConnect; +using MSFSPopoutPanelManager.Shared; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Dynamic; +using System.Runtime.InteropServices; + + +namespace MSFSPopoutPanelManager.FsConnector +{ + public class SimConnector + { + private const int MSFS_CONNECTION_RETRY_TIMEOUT = 1000; // timeout to retry connection to MSFS via Simconnect in milliseconds + private const int WM_USER_SIMCONNECT = 0x402; + private SimConnect _simConnect; + private System.Timers.Timer _timer; + + public event EventHandler> OnReceivedData; + public event EventHandler OnConnected; + public event EventHandler OnDisconnected; + public event EventHandler> OnReceiveSystemEvent; + + public dynamic SimData { get; set; } + + public void Start() + { + _timer = new System.Timers.Timer(); + _timer.Interval = MSFS_CONNECTION_RETRY_TIMEOUT; + _timer.Enabled = true; + _timer.Elapsed += (source, e) => + { + try + { + if (_simConnect == null) + { + _simConnect = new SimConnect("MSFS Pop Out Panel Manager", Process.GetCurrentProcess().MainWindowHandle, WM_USER_SIMCONNECT, null, 0); + + + _simConnect.OnRecvQuit += HandleOnRecvQuit; + _simConnect.OnRecvException += HandleOnRecvException; + _simConnect.OnRecvSimobjectDataBytype += HandleOnRecvSimobjectDataBytype; + _simConnect.OnRecvEvent += HandleOnReceiveEvent; + + _simConnect.SubscribeToSystemEvent(SimConnectSystemEvent.SIMSTART, "SimStart"); + _simConnect.SubscribeToSystemEvent(SimConnectSystemEvent.SIMSTOP, "SimStop"); + _simConnect.SubscribeToSystemEvent(SimConnectSystemEvent.VIEW, "View"); + + // Setup SimConnect data structure definition using SimConnectStruct and SimConnect data definitions + var definitions = DataDefinition.GetDefinition(); + foreach (var (PropName, SimConnectName, SimConnectUnit, SimConnectDataType, ObjectType) in definitions) + _simConnect.AddToDataDefinition(SimConnectDefinition.SimConnectDataStruct, SimConnectName, SimConnectUnit, SimConnectDataType, 0.0f, SimConnect.SIMCONNECT_UNUSED); + _simConnect.RegisterDataDefineStruct(SimConnectDefinition.SimConnectDataStruct); + + // Setup SimEvent mapping + foreach (var item in Enum.GetValues(typeof(ActionEvent))) + { + if (item.ToString().StartsWith("KEY_")) + _simConnect.MapClientEventToSimEvent((ActionEvent)item, item.ToString()[4..]); + } + + _timer.Enabled = false; + + System.Threading.Thread.Sleep(2000); + + Debug.WriteLine("SimConnect is connected"); + + OnConnected?.Invoke(this, null); + } + } + catch (COMException) + { + // handle SimConnect instantiation error when MSFS is not connected + } + }; + } + + public void Stop() + { + _timer.Enabled = false; + _simConnect = null; + } + + public void StopAndReconnect() + { + _simConnect = null; + _timer.Enabled = true; + } + + public void RequestData() + { + if (_simConnect != null) + try + { + _simConnect.RequestDataOnSimObjectType(DataRequest.REQUEST_1, SimConnectDefinition.SimConnectDataStruct, 0, SIMCONNECT_SIMOBJECT_TYPE.USER); + } + catch (Exception ex) + { + if (ex.Message != "0xC00000B0") + { + Debug.WriteLine($"SimConnect request data exception: {ex.Message}"); + StopAndReconnect(); + OnDisconnected?.Invoke(this, null); + } + } + } + + public void ReceiveMessage() + { + if (_simConnect != null) + try + { + _simConnect.ReceiveMessage(); + } + catch (Exception ex) + { + if (ex.Message != "0xC00000B0") + Debug.WriteLine($"SimConnect receive message exception: {ex.Message}"); + } + } + + public void TransmitActionEvent(ActionEvent eventID, uint data) + { + if (_simConnect != null) + { + try + { + _simConnect.TransmitClientEvent(0U, eventID, data, NotificationGroup.GROUP0, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY); + } + catch (Exception ex) + { + var eventName = eventID.ToString()[4..]; // trim out KEY_ prefix + Debug.WriteLine($"SimConnect transmit event exception: EventName: {eventName} - {ex.Message}"); + } + } + } + + private void HandleOnRecvQuit(SimConnect sender, SIMCONNECT_RECV data) + { + OnDisconnected?.Invoke(this, null); + + // Try to reconnect again + _timer.Enabled = true; + } + + private void HandleOnRecvException(SimConnect sender, SIMCONNECT_RECV_EXCEPTION data) + { + var exception = (SIMCONNECT_EXCEPTION)data.dwException; + + if (exception != SIMCONNECT_EXCEPTION.NAME_UNRECOGNIZED && exception != SIMCONNECT_EXCEPTION.EVENT_ID_DUPLICATE) + { + Debug.WriteLine($"MSFS Error - {exception}"); + } + } + + private void HandleOnRecvSimobjectDataBytype(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data) + { + if (data.dwRequestID == 0) + { + try + { + var simConnectStruct = (SimConnectStruct)data.dwData[0]; + var simConnectStructFields = typeof(SimConnectStruct).GetFields(); + var simData = new ExpandoObject(); + + var definition = DataDefinition.GetDefinition(); + int i = 0; + foreach (var item in definition) + { + simData.TryAdd(item.PropName, Convert.ChangeType(simConnectStructFields[i++].GetValue(simConnectStruct), item.ObjectType)); + } + SimData = simData; + + OnReceivedData?.Invoke(this, new EventArgs(simData)); + } + catch (Exception ex) + { + Debug.WriteLine($"SimConnect receive data exception: {ex.Message}"); + } + } + } + + private void HandleOnReceiveEvent(SimConnect sender, SIMCONNECT_RECV_EVENT data) + { + var systemEvent = ((SimConnectSystemEvent)data.uEventID); + + // Only look at VIEW for cockpit view during loading of flight (dwData = 2) + if (systemEvent == SimConnectSystemEvent.VIEW && data.dwData != 2) + return; + + OnReceiveSystemEvent?.Invoke(this, new EventArgs(systemEvent)); + } + } +} diff --git a/MSFSPopoutPanelManager.csproj b/MSFSPopoutPanelManager.csproj deleted file mode 100644 index 9e428b9..0000000 --- a/MSFSPopoutPanelManager.csproj +++ /dev/null @@ -1,87 +0,0 @@ - - - - WinExe - net5.0-windows - true - x64;AnyCPU - 3.1.0 - MSFSPopoutPanelManager - MSFSPopoutPanelManager - WindowManager.ico - Stanley Kwok - MSFS 2020 Popout Panel Manager - MSFS 2020 Popout Panel Manager - true - 3.1.0.0 - 3.1.0.0 - - - - - - Stanley Kwok 2021 - https://github.com/hawkeye-stan/msfs-popout-panel-manager - - - - false - embedded - true - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - Always - - - Always - - - Always - - - Always - - - - - - - Always - - - Always - - - - - Form - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - \ No newline at end of file diff --git a/MSFSPopoutPanelManager.sln b/MSFSPopoutPanelManager.sln index 443d5cf..7a15d11 100644 --- a/MSFSPopoutPanelManager.sln +++ b/MSFSPopoutPanelManager.sln @@ -1,9 +1,25 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31919.166 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32002.261 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSFSPopoutPanelManager", "MSFSPopoutPanelManager.csproj", "{1E89B7B3-DBD9-4644-A0EB-26924317DD83}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfApp", "WpfApp\WpfApp.csproj", "{54712A0A-B344-45E4-85C4-0A913305A0E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Model", "Model\Model.csproj", "{4A778C1A-3782-4312-842D-33AA58A9D6D4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{4BDDE1F9-FBDD-479A-B88E-B27D0513C046}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Provider", "Provider\Provider.csproj", "{933E7D03-883D-4970-9AD7-7A2B5D6C3671}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FsConnector", "FsConnector\FsConnector.csproj", "{023426F4-9FD2-4198-B9F4-83F0B55B88FC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{15FC98CD-0A69-437B-A5E5-67D025DB5CDC}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + LICENSE = LICENSE + README.md = README.md + VERSION.md = VERSION.md + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,10 +27,26 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1E89B7B3-DBD9-4644-A0EB-26924317DD83}.Debug|x64.ActiveCfg = Debug|x64 - {1E89B7B3-DBD9-4644-A0EB-26924317DD83}.Debug|x64.Build.0 = Debug|x64 - {1E89B7B3-DBD9-4644-A0EB-26924317DD83}.Release|x64.ActiveCfg = Release|x64 - {1E89B7B3-DBD9-4644-A0EB-26924317DD83}.Release|x64.Build.0 = Release|x64 + {54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|x64.ActiveCfg = Debug|x64 + {54712A0A-B344-45E4-85C4-0A913305A0E6}.Debug|x64.Build.0 = Debug|x64 + {54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|x64.ActiveCfg = Release|x64 + {54712A0A-B344-45E4-85C4-0A913305A0E6}.Release|x64.Build.0 = Release|x64 + {4A778C1A-3782-4312-842D-33AA58A9D6D4}.Debug|x64.ActiveCfg = Debug|x64 + {4A778C1A-3782-4312-842D-33AA58A9D6D4}.Debug|x64.Build.0 = Debug|x64 + {4A778C1A-3782-4312-842D-33AA58A9D6D4}.Release|x64.ActiveCfg = Release|x64 + {4A778C1A-3782-4312-842D-33AA58A9D6D4}.Release|x64.Build.0 = Release|x64 + {4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|x64.ActiveCfg = Debug|x64 + {4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Debug|x64.Build.0 = Debug|x64 + {4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|x64.ActiveCfg = Release|x64 + {4BDDE1F9-FBDD-479A-B88E-B27D0513C046}.Release|x64.Build.0 = Release|x64 + {933E7D03-883D-4970-9AD7-7A2B5D6C3671}.Debug|x64.ActiveCfg = Debug|x64 + {933E7D03-883D-4970-9AD7-7A2B5D6C3671}.Debug|x64.Build.0 = Debug|x64 + {933E7D03-883D-4970-9AD7-7A2B5D6C3671}.Release|x64.ActiveCfg = Release|x64 + {933E7D03-883D-4970-9AD7-7A2B5D6C3671}.Release|x64.Build.0 = Release|x64 + {023426F4-9FD2-4198-B9F4-83F0B55B88FC}.Debug|x64.ActiveCfg = Debug|x64 + {023426F4-9FD2-4198-B9F4-83F0B55B88FC}.Debug|x64.Build.0 = Debug|x64 + {023426F4-9FD2-4198-B9F4-83F0B55B88FC}.Release|x64.ActiveCfg = Release|x64 + {023426F4-9FD2-4198-B9F4-83F0B55B88FC}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Shared/Autostart.cs b/Model/AppAutoStart.cs similarity index 98% rename from Shared/Autostart.cs rename to Model/AppAutoStart.cs index 8352ca0..202255f 100644 --- a/Shared/Autostart.cs +++ b/Model/AppAutoStart.cs @@ -5,9 +5,9 @@ using System.Text; using System.Xml; using System.Xml.Serialization; -namespace MSFSPopoutPanelManager.Shared +namespace MSFSPopoutPanelManager.Model { - public class Autostart + public class AppAutoStart { public static void Activate() { diff --git a/Model/AppSetting.cs b/Model/AppSetting.cs new file mode 100644 index 0000000..719bf8a --- /dev/null +++ b/Model/AppSetting.cs @@ -0,0 +1,155 @@ +using MSFSPopoutPanelManager.Shared; +using Newtonsoft.Json; +using System; +using System.ComponentModel; +using System.IO; + +namespace MSFSPopoutPanelManager.Model +{ + public class AppSetting : INotifyPropertyChanged + { + private const string APP_SETTING_DATA_FILENAME = "appsettingdata.json"; + + private bool _saveEnabled; + + // Using PropertyChanged.Fody + public event PropertyChangedEventHandler PropertyChanged; + + public event EventHandler> AlwaysOnTopChanged; + public event EventHandler> AutoPopOutPanelsChanged; + + public AppSetting() + { + // Set defaults + MinimizeToTray = false; + AlwaysOnTop = true; + UseAutoPanning = true; + StartMinimized = false; + IncludeBuiltInPanel = false; + AutoPopOutPanels = false; + AutoPopOutPanelsWaitDelay = new AutoPopOutPanelsWaitDelay(); + } + + public void Load() + { + var appSetting = ReadAppSetting(); + this.MinimizeToTray = appSetting.MinimizeToTray; + this.AlwaysOnTop = appSetting.AlwaysOnTop; + this.UseAutoPanning = appSetting.UseAutoPanning; + this.StartMinimized = appSetting.StartMinimized; + this.IncludeBuiltInPanel = appSetting.IncludeBuiltInPanel; + this.AutoPopOutPanels = appSetting.AutoPopOutPanels; + this.AutoPopOutPanelsWaitDelay = appSetting.AutoPopOutPanelsWaitDelay; + + _saveEnabled = true; + } + + public void OnPropertyChanged(string propertyName, object before, object after) + { + // Automatic save data + if (_saveEnabled && propertyName != "AutoStart" && before != after) + WriteAppSetting(this); + + switch (propertyName) + { + case "AlwaysOnTop": + AlwaysOnTopChanged?.Invoke(this, new EventArgs((bool)after)); + break; + case "AutoPopOutPanels": + AutoPopOutPanelsChanged?.Invoke(this, new EventArgs((bool)after)); + break; + } + } + + //[OnDeserialized] + //private void OnDeserialized(StreamingContext context) + //{ + // // Allow save data + // _saveEnabled = true; + //} + + public bool MinimizeToTray { get; set; } + + public bool AlwaysOnTop { get; set; } + + public bool UseAutoPanning { get; set; } + + public bool StartMinimized { get; set; } + + public bool IncludeBuiltInPanel { get; set; } + + public bool AutoPopOutPanels { get; set; } + + public AutoPopOutPanelsWaitDelay AutoPopOutPanelsWaitDelay { get; set; } + + [JsonIgnore] + public bool AutoStart + { + get + { + return AppAutoStart.CheckIsAutoStart(); + } + set + { + if (value) + AppAutoStart.Activate(); + else + AppAutoStart.Deactivate(); + } + } + + public AppSetting ReadAppSetting() + { + try + { + using (StreamReader reader = new StreamReader(Path.Combine(FileIo.GetUserDataFilePath(), APP_SETTING_DATA_FILENAME))) + { + return JsonConvert.DeserializeObject(reader.ReadToEnd()); + } + } + catch (Exception ex) + { + // if file does not exist, write default data + var appSetting = new AppSetting(); + WriteAppSetting(appSetting); + return appSetting; + } + } + + public void WriteAppSetting(AppSetting appSetting) + { + try + { + var userProfilePath = FileIo.GetUserDataFilePath(); + if (!Directory.Exists(userProfilePath)) + Directory.CreateDirectory(userProfilePath); + + using (StreamWriter file = File.CreateText(Path.Combine(userProfilePath, APP_SETTING_DATA_FILENAME))) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Serialize(file, appSetting); + } + } + catch + { + Logger.LogStatus($"Unable to write app setting data file: {APP_SETTING_DATA_FILENAME}", StatusMessageType.Error); + } + } + } + + public class AutoPopOutPanelsWaitDelay + { + public AutoPopOutPanelsWaitDelay() + { + ReadyToFlyButton = 2; + InitialCockpitView = 2; + InstrumentationPowerOn = 2; + } + + public int ReadyToFlyButton { get; set; } + + public int InitialCockpitView { get; set; } + + public int InstrumentationPowerOn { get; set; } + } +} diff --git a/Model/FodyWeavers.xml b/Model/FodyWeavers.xml new file mode 100644 index 0000000..d5abfed --- /dev/null +++ b/Model/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Model/FodyWeavers.xsd b/Model/FodyWeavers.xsd new file mode 100644 index 0000000..69dbe48 --- /dev/null +++ b/Model/FodyWeavers.xsd @@ -0,0 +1,74 @@ + + + + + + + + + + + Used to control if the On_PropertyName_Changed feature is enabled. + + + + + Used to control if the Dependent properties feature is enabled. + + + + + Used to control if the IsChanged property feature is enabled. + + + + + Used to change the name of the method that fires the notify event. This is a string that accepts multiple values in a comma separated form. + + + + + Used to control if equality checks should be inserted. If false, equality checking will be disabled for the project. + + + + + Used to control if equality checks should use the Equals method resolved from the base class. + + + + + Used to control if equality checks should use the static Equals method resolved from the base class. + + + + + Used to turn off build warnings from this weaver. + + + + + Used to turn off build warnings about mismatched On_PropertyName_Changed methods. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/Model/Model.csproj b/Model/Model.csproj new file mode 100644 index 0000000..21a5390 --- /dev/null +++ b/Model/Model.csproj @@ -0,0 +1,30 @@ + + + + net5.0-windows + MSFSPopoutPanelManager.Model + Model + MSFS 2020 Popout Panel Manager Model + 3.2.0 + Stanley Kwok + Stanley Kwok + Stanley Kwok 2021 + MSFS 2020 Popout Panel Manager Model + https://github.com/hawkeye-stan/msfs-popout-panel-manager + x64;AnyCPU + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + diff --git a/Model/PanelConfig.cs b/Model/PanelConfig.cs new file mode 100644 index 0000000..36cd4a6 --- /dev/null +++ b/Model/PanelConfig.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using System; +using System.ComponentModel; + +namespace MSFSPopoutPanelManager.Model +{ + public class PanelConfig : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public int PanelIndex { get; set; } + + public string PanelName { get; set; } + + public PanelType PanelType { get; set; } + + public int Top { get; set; } + + public int Left { get; set; } + + public int Width { get; set; } + + public int Height { get; set; } + + public bool AlwaysOnTop { get; set; } + + public bool HideTitlebar { get; set; } + + [JsonIgnore] + public bool IsCustomPopout { get { return PanelType == PanelType.CustomPopout; } } + + [JsonIgnore] + public IntPtr PanelHandle { get; set; } + } +} diff --git a/Model/PanelConfigPropertyName.cs b/Model/PanelConfigPropertyName.cs new file mode 100644 index 0000000..68ed9c7 --- /dev/null +++ b/Model/PanelConfigPropertyName.cs @@ -0,0 +1,23 @@ +using System; + +namespace MSFSPopoutPanelManager.Model +{ + public enum PanelConfigPropertyName + { + PanelName, + Left, + Top, + Width, + Height, + AlwaysOnTop, + HideTitlebar, + Invalid + } + + public class PanelConfigItem + { + public int PanelIndex { get; set; } + + public PanelConfigPropertyName PanelConfigProperty { get; set; } + } +} diff --git a/Model/PanelSourceCoordinate.cs b/Model/PanelSourceCoordinate.cs new file mode 100644 index 0000000..2c47f1b --- /dev/null +++ b/Model/PanelSourceCoordinate.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; +using System; +using System.ComponentModel; + +namespace MSFSPopoutPanelManager.Model +{ + public class PanelSourceCoordinate : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public int PanelIndex { get; set; } + + public int X { get; set; } + + public int Y { get; set; } + + [JsonIgnore] + public IntPtr PanelHandle { get; set; } + } +} diff --git a/Shared/Enums.cs b/Model/PanelType.cs similarity index 76% rename from Shared/Enums.cs rename to Model/PanelType.cs index 0604703..067d473 100644 --- a/Shared/Enums.cs +++ b/Model/PanelType.cs @@ -1,4 +1,4 @@ -namespace MSFSPopoutPanelManager.Shared +namespace MSFSPopoutPanelManager.Model { public enum PanelType { diff --git a/Model/UserProfile.cs b/Model/UserProfile.cs new file mode 100644 index 0000000..31529ff --- /dev/null +++ b/Model/UserProfile.cs @@ -0,0 +1,50 @@ +using Newtonsoft.Json; +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace MSFSPopoutPanelManager.Model +{ + public class UserProfile : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public UserProfile() + { + PanelSourceCoordinates = new ObservableCollection(); + PanelConfigs = new ObservableCollection(); + IsLocked = false; + } + + public int ProfileId { get; set; } + + public string ProfileName { get; set; } + + public bool IsDefaultProfile { get; set; } + + public string BindingPlaneTitle { get; set; } + + public bool IsLocked { get; set; } + + public ObservableCollection PanelSourceCoordinates; + + public ObservableCollection PanelConfigs { get; set; } + + public bool PowerOnRequiredForColdStart { get; set; } + + public void Reset() + { + PanelSourceCoordinates.Clear(); + PanelConfigs.Clear(); + IsLocked = false; + } + + [JsonIgnore] + public bool IsActive { get; set; } + + [JsonIgnore] + public bool HasBindingPlaneTitle + { + get { return !string.IsNullOrEmpty(BindingPlaneTitle); } + } + } +} diff --git a/Program.cs b/Program.cs deleted file mode 100644 index 4879637..0000000 --- a/Program.cs +++ /dev/null @@ -1,83 +0,0 @@ -using log4net; -using log4net.Config; -using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UI; -using System; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager -{ - static class Program - { - private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - bool createNew; - using var mutex = new Mutex(true, typeof(Program).Namespace, out createNew); - - var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); - XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); - - if (createNew) - { - Application.SetHighDpiMode(HighDpiMode.SystemAware); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.ThreadException += new ThreadExceptionEventHandler(HandleThreadException); - Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledDomainException); - Application.Run(new StartupForm()); - } - else - { - var current = Process.GetCurrentProcess(); - - foreach (var process in Process.GetProcessesByName(current.ProcessName)) - { - if (process.Id == current.Id) continue; - PInvoke.SetForegroundWindow(process.MainWindowHandle); - break; - } - } - - void HandleThreadException(object sender, ThreadExceptionEventArgs e) - { - Log.Error(e.Exception.Message, e.Exception); - ShowExceptionForm(); - } - - void UnhandledDomainException(object sender, UnhandledExceptionEventArgs e) - { - var exception = (Exception)e.ExceptionObject; - Log.Error(exception.Message, exception); - - ShowExceptionForm(); - } - - void ShowExceptionForm() - { - var title = "Critical Error"; - var message = "Application has encountered a critical error and will be closed. Please see the file error.log for information."; - - using (var form = new ConfirmDialogForm(title, message, false) { StartPosition = FormStartPosition.CenterParent }) - { - var dialogResult = form.ShowDialog(); - - if (dialogResult == DialogResult.OK) - { - Application.Exit(); - } - } - } - } - } -} diff --git a/Provider/DiagnosticManager.cs b/Provider/DiagnosticManager.cs new file mode 100644 index 0000000..790b181 --- /dev/null +++ b/Provider/DiagnosticManager.cs @@ -0,0 +1,72 @@ +using MSFSPopoutPanelManager.Shared; +using System; +using System.Diagnostics; +using System.Timers; + +namespace MSFSPopoutPanelManager.Provider +{ + public class DiagnosticManager + { + public static event EventHandler> OnPollMsfsConnectionResult; + + public static string GetApplicationVersion() + { + var systemAssemblyVersion = System.Reflection.Assembly.GetEntryAssembly().GetName().Version; + var appVersion = $"{systemAssemblyVersion.Major}.{systemAssemblyVersion.Minor}.{systemAssemblyVersion.Build}"; + if (systemAssemblyVersion.Revision > 0) + appVersion += "." + systemAssemblyVersion.Revision; + + return appVersion; + } + + public static WindowProcess GetSimulatorProcess() + { + return GetProcess("FlightSimulator"); + } + + public static WindowProcess GetApplicationProcess() + { + return GetProcess("MSFSPopoutPanelManager"); + } + + public static void StartPollingMsfsConnection() + { + Timer timer = new Timer(); + timer.Interval = 2000; + timer.Elapsed += (sender, e) => + { + OnPollMsfsConnectionResult?.Invoke(null, new EventArgs(GetSimulatorProcess() != null)); + }; + timer.Enabled = true; + + } + + public static void OpenOnlineUserGuide() + { + Process.Start(new ProcessStartInfo("https://github.com/hawkeye-stan/msfs-popout-panel-manager#msfs-pop-out-panel-manager") { UseShellExecute = true }); + } + + public static void OpenOnlineLatestDownload() + { + Process.Start(new ProcessStartInfo("https://github.com/hawkeye-stan/msfs-popout-panel-manager/releases") { UseShellExecute = true }); + } + + private static WindowProcess GetProcess(string processName) + { + foreach (var process in Process.GetProcesses()) + { + if (process.ProcessName == processName) + { + return new WindowProcess() + { + ProcessId = process.Id, + ProcessName = process.ProcessName, + Handle = process.MainWindowHandle + }; + } + } + + return null; + } + } +} diff --git a/Provider/FileManager.cs b/Provider/FileManager.cs deleted file mode 100644 index 2893e0f..0000000 --- a/Provider/FileManager.cs +++ /dev/null @@ -1,93 +0,0 @@ -using MSFSPopoutPanelManager.Shared; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.Provider -{ - public class FileManager - { - private static string UserProfileDataPath; - private const string APP_SETTING_DATA_FILENAME = "appsettingdata.json"; - private const string USER_PROFILE_DATA_FILENAME = "userprofiledata.json"; - - static FileManager() - { - FileManager.UserProfileDataPath = Path.Combine(Application.StartupPath, "userdata"); - } - - public static List ReadUserProfileData() - { - try - { - using (StreamReader reader = new StreamReader(Path.Combine(UserProfileDataPath, USER_PROFILE_DATA_FILENAME))) - { - return JsonConvert.DeserializeObject>(reader.ReadToEnd()); - } - } - catch - { - return new List(); - } - } - - public static void WriteUserProfileData(List userProfileData) - { - try - { - if (!Directory.Exists(UserProfileDataPath)) - Directory.CreateDirectory(UserProfileDataPath); - - using (StreamWriter file = File.CreateText(Path.Combine(UserProfileDataPath, USER_PROFILE_DATA_FILENAME))) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Serialize(file, userProfileData); - } - } - catch - { - Logger.BackgroundStatus($"Unable to write user data file: {USER_PROFILE_DATA_FILENAME}", StatusMessageType.Error); - } - } - - public static AppSettingData ReadAppSettingData() - { - try - { - using (StreamReader reader = new StreamReader(Path.Combine(UserProfileDataPath, APP_SETTING_DATA_FILENAME))) - { - return JsonConvert.DeserializeObject(reader.ReadToEnd()); - } - } - catch (Exception ex) - { - // if file does not exist, write default data - var appSettings = new AppSettingData(); - WriteAppSettingData(appSettings); - - return appSettings; - } - } - - public static void WriteAppSettingData(AppSettingData appSettingData) - { - try - { - if (!Directory.Exists(UserProfileDataPath)) - Directory.CreateDirectory(UserProfileDataPath); - - using (StreamWriter file = File.CreateText(Path.Combine(UserProfileDataPath, APP_SETTING_DATA_FILENAME))) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Serialize(file, appSettingData); - } - } - catch - { - Logger.BackgroundStatus($"Unable to write app setting data file: {USER_PROFILE_DATA_FILENAME}", StatusMessageType.Error); - } - } - } -} diff --git a/Shared/ImageOperation.cs b/Provider/ImageOperation.cs similarity index 95% rename from Shared/ImageOperation.cs rename to Provider/ImageOperation.cs index cb4268b..4667972 100644 --- a/Shared/ImageOperation.cs +++ b/Provider/ImageOperation.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.Drawing.Imaging; using System.Threading; -namespace MSFSPopoutPanelManager.Shared +namespace MSFSPopoutPanelManager.Provider { public class ImageOperation { diff --git a/Provider/InputEmulationManager.cs b/Provider/InputEmulationManager.cs index 21d2684..9ba31b9 100644 --- a/Provider/InputEmulationManager.cs +++ b/Provider/InputEmulationManager.cs @@ -1,5 +1,6 @@ -using MSFSPopoutPanelManager.Shared; -using System; +using System; +using System.Diagnostics; +using System.Drawing; using System.Threading; namespace MSFSPopoutPanelManager.Provider @@ -17,14 +18,6 @@ namespace MSFSPopoutPanelManager.Provider const uint VK_SPACE = 0x20; const uint KEY_0 = 0x30; - public static void SendMouseToLocation(IntPtr hwnd, int x, int y) - { - // Move the cursor to the flight simulator screen then move the cursor into position - //PInvoke.SetCursorPos(0, 0); - PInvoke.SetFocus(hwnd); - PInvoke.SetCursorPos(x, y); - } - public static void LeftClick(int x, int y) { PInvoke.SetCursorPos(x, y); @@ -47,13 +40,10 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.keybd_event(Convert.ToByte(VK_RMENU), 0, KEYEVENTF_KEYUP, 0); } - public static void CenterView(IntPtr hwnd) + public static void CenterView(IntPtr hwnd, int x, int y) { PInvoke.SetForegroundWindow(hwnd); - Thread.Sleep(500); - - PInvoke.SetFocus(hwnd); - Thread.Sleep(300); + LeftClick(x, y); // First center view using Ctrl-Space PInvoke.keybd_event(Convert.ToByte(VK_LCONTROL), 0, KEYEVENTF_KEYDOWN, 0); @@ -80,7 +70,6 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.keybd_event(Convert.ToByte(KEY_0), 0, KEYEVENTF_KEYUP, 0); PInvoke.keybd_event(Convert.ToByte(VK_LMENU), 0, KEYEVENTF_KEYUP, 0); PInvoke.keybd_event(Convert.ToByte(VK_LCONTROL), 0, KEYEVENTF_KEYUP, 0); - } public static void LoadCustomViewZero(IntPtr hwnd) @@ -106,5 +95,48 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.keybd_event(Convert.ToByte(KEY_0), 0, KEYEVENTF_KEYUP, 0); PInvoke.keybd_event(Convert.ToByte(VK_LMENU), 0, KEYEVENTF_KEYUP, 0); } + + public static void LeftClickReadyToFly() + { + var simualatorProcess = DiagnosticManager.GetSimulatorProcess(); + if (simualatorProcess != null) + { + var hwnd = simualatorProcess.Handle; + + PInvoke.SetForegroundWindow(hwnd); + Thread.Sleep(500); + + Rectangle rectangle; + PInvoke.GetWindowRect(hwnd, out rectangle); + + Rectangle clientRectangle; + PInvoke.GetClientRect(hwnd, out clientRectangle); + + // For windows mode + // The "Ready to Fly" button is at about 93% width, 91.3% height at the lower right corner of game window + var x = Convert.ToInt32(rectangle.X + (clientRectangle.Width + 8) * 0.93); // with 8 pixel adjustment + var y = Convert.ToInt32(rectangle.Y + (clientRectangle.Height + 39) * 0.915); // with 39 pixel adjustment + + LeftClick(x, y); // set focus to game app + Thread.Sleep(250); + LeftClick(x, y); + Thread.Sleep(250); + + + Debug.WriteLine($"Windows Mode 'Ready to Fly' button coordinate: {x}, {y}"); + + // For full screen mode + x = Convert.ToInt32(rectangle.X + (clientRectangle.Width) * 0.93); + y = Convert.ToInt32(rectangle.Y + (clientRectangle.Height) * 0.915); + + LeftClick(x, y); // set focus to game app + Thread.Sleep(250); + LeftClick(x, y); + Thread.Sleep(250); + + Debug.WriteLine($"Full Screen Mode 'Ready to Fly' button coordinate: {x} , {y}"); + + } + } } } \ No newline at end of file diff --git a/Provider/InputHookManager.cs b/Provider/InputHookManager.cs new file mode 100644 index 0000000..c459700 --- /dev/null +++ b/Provider/InputHookManager.cs @@ -0,0 +1,73 @@ +using Gma.System.MouseKeyHook; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace MSFSPopoutPanelManager.Provider +{ + public class InputHookManager + { + private const string CTRL_KEY = "Control"; + private const string SHIFT_KEY = "Shift"; + + private static IKeyboardMouseEvents _mouseHook; + + public static bool SubscribeToPanelSelectionEvent { get; set; } + public static bool SubscribeToStartPopOutEvent { get; set; } + + public static event EventHandler OnPanelSelectionCompleted; + public static event EventHandler OnPanelSelectionAdded; + public static event EventHandler OnPanelSelectionRemoved; + public static event EventHandler OnStartPopout; + + public static void StartHook() + { + if (_mouseHook == null) + { + _mouseHook = Hook.GlobalEvents(); + + _mouseHook.OnCombination(new Dictionary + { + {Combination.FromString("Control+Alt+P"), () => { if(SubscribeToStartPopOutEvent) OnStartPopout?.Invoke(null, null); }} + }); + + _mouseHook.MouseDownExt += HandleMouseHookMouseDownExt; + } + } + + public static void EndHook() + { + if (_mouseHook == null) + { + _mouseHook.MouseDownExt -= HandleMouseHookMouseDownExt; + _mouseHook.Dispose(); + } + } + + private static void HandleMouseHookMouseDownExt(object sender, MouseEventExtArgs e) + { + if (_mouseHook == null || !SubscribeToPanelSelectionEvent) + return; + + if (e.Button == MouseButtons.Left) + { + var ctrlPressed = Control.ModifierKeys.ToString() == CTRL_KEY; + var shiftPressed = Control.ModifierKeys.ToString() == SHIFT_KEY; + + if (ctrlPressed) + { + OnPanelSelectionCompleted?.Invoke(null, null); + } + else if (shiftPressed) + { + OnPanelSelectionRemoved?.Invoke(null, null); + } + else if (!shiftPressed) + { + OnPanelSelectionAdded?.Invoke(null, new Point(e.X, e.Y)); + } + } + } + } +} diff --git a/Shared/PInvoke.cs b/Provider/PInvoke.cs similarity index 90% rename from Shared/PInvoke.cs rename to Provider/PInvoke.cs index 507f78e..9896187 100644 --- a/Shared/PInvoke.cs +++ b/Provider/PInvoke.cs @@ -3,13 +3,15 @@ using System.Drawing; using System.Runtime.InteropServices; using System.Text; -namespace MSFSPopoutPanelManager.Shared +namespace MSFSPopoutPanelManager.Provider { public static class PInvokeConstant { public const int SW_SHOWNORMAL = 1; public const int SW_SHOWMINIMIZED = 2; public const int SW_SHOWMAXIMIZED = 3; + public const int SW_SHOW = 5; + public const int SW_SHOWDEFAULT = 10; public const int SW_NORMAL = 1; public const int SW_MINIMIZE = 6; public const int SW_RESTORE = 9; @@ -33,12 +35,15 @@ namespace MSFSPopoutPanelManager.Shared public const uint WM_CLOSE = 0x0010; public const int WINEVENT_OUTOFCONTEXT = 0; } - + public class PInvoke { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); + [DllImport("user32")] + private static extern bool EnumChildWindows(IntPtr window, CallBack callback, IntPtr lParam); + [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int GetClassName(IntPtr hWnd, StringBuilder strPtrClassName, Int32 nMaxCount); @@ -97,11 +102,14 @@ namespace MSFSPopoutPanelManager.Shared [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); + [DllImport("USER32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll")] - public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, uint wFlags); + public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint wFlags); [DllImport("user32.dll")] public static extern bool SetWindowText(System.IntPtr hwnd, System.String lpString); diff --git a/Provider/PanelConfigurationManager.cs b/Provider/PanelConfigurationManager.cs new file mode 100644 index 0000000..edc9496 --- /dev/null +++ b/Provider/PanelConfigurationManager.cs @@ -0,0 +1,222 @@ +using MSFSPopoutPanelManager.Model; +using System; +using System.Diagnostics; +using System.Drawing; +using System.Linq; + +namespace MSFSPopoutPanelManager.Provider +{ + public class PanelConfigurationManager + { + private UserProfileManager _userProfileManager; + private IntPtr _winEventHook; + private static PInvoke.WinEventProc _winEvent; // keep this as static to prevent garbage collect or the app will crash + private Rectangle _lastWindowRectangle; + + public UserProfile UserProfile { get; set; } + + public bool AllowEdit { get; set; } + + public PanelConfigurationManager(UserProfileManager userProfileManager) + { + _userProfileManager = userProfileManager; + _winEvent = new PInvoke.WinEventProc(EventCallback); + AllowEdit = true; + } + + public void HookWinEvent() + { + // Setup panel config event hooks + _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, DiagnosticManager.GetApplicationProcess().Handle, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT); + } + + public void UnhookWinEvent() + { + // Unhook all Win API events + PInvoke.UnhookWinEvent(_winEventHook); + } + + public void LockPanelsUpdated() + { + UserProfile.IsLocked = !UserProfile.IsLocked; + _userProfileManager.WriteUserProfiles(); + } + + public void PanelConfigPropertyUpdated(PanelConfigItem panelConfigItem) + { + if (!AllowEdit || UserProfile.IsLocked) + return; + + var panelConfig = UserProfile.PanelConfigs.ToList().Find(p => p.PanelIndex == panelConfigItem.PanelIndex); + + if (panelConfig != null) + { + switch (panelConfigItem.PanelConfigProperty) + { + case PanelConfigPropertyName.PanelName: + var name = panelConfig.PanelName; + if (name.IndexOf("(Custom)") == -1) + name = name + " (Custom)"; + PInvoke.SetWindowText(panelConfig.PanelHandle, name); + break; + case PanelConfigPropertyName.Left: + case PanelConfigPropertyName.Top: + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height, true); + break; + case PanelConfigPropertyName.Width: + case PanelConfigPropertyName.Height: + int orignalLeft = panelConfig.Left; + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height, true); + MSFSBugPanelShiftWorkaround(panelConfig.PanelHandle, orignalLeft, panelConfig.Top, panelConfig.Width, panelConfig.Height); + break; + case PanelConfigPropertyName.AlwaysOnTop: + WindowManager.ApplyAlwaysOnTop(panelConfig.PanelHandle, panelConfig.AlwaysOnTop, new Rectangle(panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height)); + break; + case PanelConfigPropertyName.HideTitlebar: + WindowManager.ApplyHidePanelTitleBar(panelConfig.PanelHandle, panelConfig.HideTitlebar); + break; + } + + _userProfileManager.WriteUserProfiles(); + } + } + + public void PanelConfigIncreaseDecrease(PanelConfigItem panelConfigItem, int changeAmount) + { + if (!AllowEdit || UserProfile.IsLocked || UserProfile.PanelConfigs == null || UserProfile.PanelConfigs.Count == 0) + return; + + var index = UserProfile.PanelConfigs.ToList().FindIndex(p => p.PanelIndex == panelConfigItem.PanelIndex); + + if (index > -1) + { + var panelConfig = UserProfile.PanelConfigs[index]; + + int orignalLeft = panelConfig.Left; + + switch (panelConfigItem.PanelConfigProperty) + { + case PanelConfigPropertyName.Left: + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left + changeAmount, panelConfig.Top, panelConfig.Width, panelConfig.Height, false); + panelConfig.Left += changeAmount; + break; + case PanelConfigPropertyName.Top: + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top + changeAmount, panelConfig.Width, panelConfig.Height, false); + panelConfig.Top += changeAmount; + break; + case PanelConfigPropertyName.Width: + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width + changeAmount, panelConfig.Height, false); + MSFSBugPanelShiftWorkaround(panelConfig.PanelHandle, orignalLeft, panelConfig.Top, panelConfig.Width + changeAmount, panelConfig.Height); + panelConfig.Width += changeAmount; + break; + case PanelConfigPropertyName.Height: + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height + changeAmount, false); + MSFSBugPanelShiftWorkaround(panelConfig.PanelHandle, orignalLeft, panelConfig.Top, panelConfig.Width, panelConfig.Height + changeAmount); + panelConfig.Height += changeAmount; + break; + default: + return; + } + + _userProfileManager.WriteUserProfiles(); + } + } + + private void MSFSBugPanelShiftWorkaround(IntPtr handle, int originalLeft, int top, int width, int height) + { + // Fixed MSFS bug, create workaround where on 2nd or later instance of width adjustment, the panel shift to the left by itself + // Wait for system to catch up on panel coordinate that were just applied + System.Threading.Thread.Sleep(200); + + Rectangle rectangle; + PInvoke.GetWindowRect(handle, out rectangle); + + if (rectangle.Left != originalLeft) + PInvoke.MoveWindow(handle, originalLeft, top, width, height, false); + } + + private void EventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime) + { + PanelConfig panelConfig; + + // check by priority to minimize escaping constraint + if (hWnd == IntPtr.Zero + || idObject != 0 + || hWinEventHook != _winEventHook + || !AllowEdit + || !(iEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE || iEvent == PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND) + || UserProfile.PanelConfigs == null || UserProfile.PanelConfigs.Count == 0) + { + return; + } + + if(UserProfile.IsLocked) + { + panelConfig = UserProfile.PanelConfigs.FirstOrDefault(panel => panel.PanelHandle == hWnd); + + if (panelConfig != null && panelConfig.PanelType == PanelType.CustomPopout) + { + // Move window back to original location if user profile is locked + if (iEvent == PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND) + { + PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height, false); + return; + } + + if (iEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE) + { + // Detect if window is maximized, if so, save settings + WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); + wp.length = System.Runtime.InteropServices.Marshal.SizeOf(wp); + PInvoke.GetWindowPlacement(hWnd, ref wp); + if (wp.showCmd == PInvokeConstant.SW_SHOWMAXIMIZED || wp.showCmd == PInvokeConstant.SW_SHOWMINIMIZED || wp.showCmd == PInvokeConstant.SW_SHOWNORMAL) + { + PInvoke.ShowWindow(hWnd, PInvokeConstant.SW_RESTORE); + } + return; + } + } + + return; + } + + panelConfig = UserProfile.PanelConfigs.FirstOrDefault(panel => panel.PanelHandle == hWnd); + + if (panelConfig != null) + { + switch (iEvent) + { + case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE: + Rectangle winRectangle; + PInvoke.GetWindowRect(panelConfig.PanelHandle, out winRectangle); + + if (_lastWindowRectangle == winRectangle) // ignore duplicate callback messages + return; + + _lastWindowRectangle = winRectangle; + Rectangle clientRectangle; + PInvoke.GetClientRect(panelConfig.PanelHandle, out clientRectangle); + + panelConfig.Left = winRectangle.Left; + panelConfig.Top = winRectangle.Top; + panelConfig.Width = clientRectangle.Width + 16; + panelConfig.Height = clientRectangle.Height + 39; + + // Detect if window is maximized, if so, save settings + WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); + wp.length = System.Runtime.InteropServices.Marshal.SizeOf(wp); + PInvoke.GetWindowPlacement(hWnd, ref wp); + if (wp.showCmd == PInvokeConstant.SW_SHOWMAXIMIZED || wp.showCmd == PInvokeConstant.SW_SHOWMINIMIZED) + { + _userProfileManager.WriteUserProfiles(); + } + + break; + case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND: + _userProfileManager.WriteUserProfiles(); + break; + } + } + } + } +} diff --git a/Provider/PopoutSeparationManager.cs b/Provider/PanelPopoutManager.cs similarity index 72% rename from Provider/PopoutSeparationManager.cs rename to Provider/PanelPopoutManager.cs index 360bada..af18450 100644 --- a/Provider/PopoutSeparationManager.cs +++ b/Provider/PanelPopoutManager.cs @@ -1,33 +1,54 @@ -using MSFSPopoutPanelManager.Shared; +using MSFSPopoutPanelManager.Model; +using MSFSPopoutPanelManager.Shared; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Drawing; using System.Drawing.Imaging; +using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MSFSPopoutPanelManager.Provider { - public class PopoutSeparationManager + public class PanelPopOutManager { private const int RETRY_COUNT = 5; - private IntPtr _simulatorHandle; - private UserProfileData _profile; - private List _panels; - public PopoutSeparationManager(IntPtr simulatorHandle, UserProfileData profile) + private UserProfileManager _userProfileManager; + private SimConnectManager _simConnectManager; + private IntPtr _simulatorHandle; + private List _panels; + private int _currentPanelIndex; + + public event EventHandler OnPopOutStarted; + public event EventHandler> OnPopOutCompleted; + + public UserProfile UserProfile { get; set; } + + public AppSetting AppSetting { get; set; } + + public PanelPopOutManager(UserProfileManager userProfileManager, SimConnectManager simConnectManager) { - _simulatorHandle = simulatorHandle; - _profile = profile; - _panels = new List(); + _userProfileManager = userProfileManager; + _simConnectManager = simConnectManager; } - public bool StartPopout() + public void StartPopout() { + var simulatorProcess = DiagnosticManager.GetSimulatorProcess(); + + if(simulatorProcess != null) + _simulatorHandle = simulatorProcess.Handle; + + _panels = new List(); + + OnPopOutStarted?.Invoke(this, null); + // If enable, load the current viewport into custom view by Ctrl-Alt-0 - if (FileManager.ReadAppSettingData().UseAutoPanning) + if (AppSetting.UseAutoPanning) { - var simualatorProcess = WindowManager.GetSimulatorProcess(); + var simualatorProcess = DiagnosticManager.GetSimulatorProcess(); if (simualatorProcess != null) { InputEmulationManager.LoadCustomViewZero(simualatorProcess.Handle); @@ -41,54 +62,62 @@ namespace MSFSPopoutPanelManager.Provider }); popoutPanelTask.Wait(); - var popoutReslts = popoutPanelTask.Result; + var popoutResults = popoutPanelTask.Result; - if (popoutReslts != null) + if (popoutResults != null) { - if (_profile.PanelConfigs.Count > 0) + if (UserProfile.PanelConfigs.Count > 0) { - LoadAndApplyPanelConfigs(popoutReslts); - Logger.Status("Panels have been popped out succesfully. Previously saved panel settings have been applied.", StatusMessageType.Info); + LoadAndApplyPanelConfigs(popoutResults); + Logger.LogStatus("Panels have been popped out succesfully and saved panel settings have been applied.", StatusMessageType.Info); } else { - _profile.PanelConfigs = popoutReslts; - Logger.Status("Panels have been popped out succesfully.", StatusMessageType.Info); + UserProfile.PanelConfigs = new ObservableCollection(popoutResults); + Logger.LogStatus("Panels have been popped out succesfully.", StatusMessageType.Info); } - // Recenter the view port by Ctrl-Space - var simualatorProcess = WindowManager.GetSimulatorProcess(); - if (simualatorProcess != null) + // Recenter the view port by Ctrl-Space, needs to click on game window + var simualatorProcess = DiagnosticManager.GetSimulatorProcess(); + if (simualatorProcess != null && UserProfile.PanelSourceCoordinates.Count > 0) { - InputEmulationManager.CenterView(simualatorProcess.Handle); + InputEmulationManager.CenterView(simualatorProcess.Handle, UserProfile.PanelSourceCoordinates[0].X, UserProfile.PanelSourceCoordinates[0].Y); } - - return true; - } - return false; + _userProfileManager.WriteUserProfiles(); + + OnPopOutCompleted?.Invoke(this, new EventArgs(true)); + } + else + { + OnPopOutCompleted?.Invoke(this, new EventArgs(false)); + } } public List ExecutePopoutSeparation() { + _currentPanelIndex = 0; + _panels.Clear(); // Must close out all existing custom pop out panels PInvoke.EnumWindows(new PInvoke.CallBack(EnumCustomPopoutCallBack), 0); - if(_panels.Count > 0) + if (_panels.Count > 0) { - Logger.BackgroundStatus("Please close all existing panel pop outs before continuing.", StatusMessageType.Error); + Logger.LogStatus("Please close all existing panel pop outs before continuing.", StatusMessageType.Error); return null; } _panels.Clear(); - PInvoke.SetForegroundWindow(_simulatorHandle); + + if(_simulatorHandle != IntPtr.Zero) + PInvoke.SetForegroundWindow(_simulatorHandle); try { - for (var i = 0; i < _profile.PanelSourceCoordinates.Count; i++) + for (var i = 0; i < UserProfile.PanelSourceCoordinates.Count; i++) { - PopoutPanel(_profile.PanelSourceCoordinates[i].X, _profile.PanelSourceCoordinates[i].Y); + PopoutPanel(UserProfile.PanelSourceCoordinates[i].X, UserProfile.PanelSourceCoordinates[i].Y); if (i == 0) { @@ -109,14 +138,14 @@ namespace MSFSPopoutPanelManager.Provider } if (GetPopoutPanelCountByType(PanelType.CustomPopout) != i + 1) - throw new PopoutManagerException("Unable to pop out the first panel. Please align first panel's number circle and check if the first panel has already been popped out. Also please check for window obstruction. Process stopped."); + throw new PopoutManagerException("Unable to pop out the first panel. Please check the first panel's number circle is positioned inside the panel, check for panel obstruction, and check if panel can be popped out. Pop out process stopped."); } if (i >= 1) // only separate with 2 or more panels { int retry = 0; while (retry < RETRY_COUNT) { - SeparatePanel(i, _panels[0].PanelHandle); + SeparatePanel(i, _panels[0].PanelHandle); // The joined panel is always the first panel that got popped out PInvoke.EnumWindows(new PInvoke.CallBack(EnumCustomPopoutCallBack), i); if (GetPopoutPanelCountByType(PanelType.CustomPopout) != i + 1) @@ -134,42 +163,46 @@ namespace MSFSPopoutPanelManager.Provider } if (GetPopoutPanelCountByType(PanelType.CustomPopout) != i + 1) - throw new PopoutManagerException($"Unable to pop out panel number {i + 1}. Please align the panel's number circle and check if the panel has already been popped out. Also please check for window obstruction."); + throw new PopoutManagerException($"Unable to pop out panel number {i + 1}. Please check panel's number circle is positioned inside the panel, check for panel obstruction, and check if panel can be popped out. Pop out process stopped."); } } // Performance validation, make sure the number of pop out panels is equal to the number of selected panel - if (GetPopoutPanelCountByType(PanelType.CustomPopout) != _profile.PanelSourceCoordinates.Count) - throw new PopoutManagerException("Unable to pop out all panels. Please align all panel number circles with in-game panel locations. Also please check for window obstruction "); + if (GetPopoutPanelCountByType(PanelType.CustomPopout) != UserProfile.PanelSourceCoordinates.Count) + throw new PopoutManagerException("Unable to pop out all panels. Please align all panel number circles with in-game panel locations."); // Add the built-in pop outs (ie. ATC, VFR Map) to the panel list - PInvoke.EnumWindows(new PInvoke.CallBack(EnumBuiltinPopoutCallBack), _profile.PanelSourceCoordinates.Count + 1); + if(AppSetting.IncludeBuiltInPanel) + PInvoke.EnumWindows(new PInvoke.CallBack(EnumBuiltinPopoutCallBack), 0); // Add the MSFS Touch Panel (My other github project) windows to the panel list - PInvoke.EnumWindows(new PInvoke.CallBack(EnumMSFSTouchPanelPopoutCallBack), _profile.PanelSourceCoordinates.Count + 1); + PInvoke.EnumWindows(new PInvoke.CallBack(EnumMSFSTouchPanelPopoutCallBack), 0); if (_panels.Count == 0) - throw new PopoutManagerException("No panels have been found. Please select or open at least one in-game panel or MSFS Touch Panel App's panel."); + throw new PopoutManagerException("No panels have been found. Please select at least one in-game panel."); // Line up all the panels and fill in meta data for (var i = _panels.Count - 1; i >= 0; i--) { - var shift = _panels.Count - i - 1; - _panels[i].Top = shift * 30; - _panels[i].Left = shift * 30; - _panels[i].Width = 800; - _panels[i].Height = 600; + if (_panels[i].PanelType == PanelType.CustomPopout) + { + var shift = _panels.Count - i - 1; + _panels[i].Top = shift * 30; + _panels[i].Left = shift * 30; + _panels[i].Width = 800; + _panels[i].Height = 600; - PInvoke.MoveWindow(_panels[i].PanelHandle, _panels[i].Top, _panels[i].Left, _panels[i].Width, _panels[i].Height, true); - PInvoke.SetForegroundWindow(_panels[i].PanelHandle); - Thread.Sleep(200); + PInvoke.MoveWindow(_panels[i].PanelHandle, _panels[i].Top, _panels[i].Left, _panels[i].Width, _panels[i].Height, true); + PInvoke.SetForegroundWindow(_panels[i].PanelHandle); + Thread.Sleep(200); + } } return _panels; } - catch(PopoutManagerException ex) + catch (PopoutManagerException ex) { - Logger.BackgroundStatus(ex.Message, StatusMessageType.Error); + Logger.LogStatus(ex.Message, StatusMessageType.Error); return null; } catch @@ -185,28 +218,33 @@ namespace MSFSPopoutPanelManager.Provider { if (resultPanel.PanelType == PanelType.CustomPopout) { - index = _profile.PanelConfigs.FindIndex(x => x.PanelIndex == resultPanel.PanelIndex); + index = UserProfile.PanelConfigs.ToList().FindIndex(x => x.PanelIndex == resultPanel.PanelIndex); if (index > -1) - _profile.PanelConfigs[index].PanelHandle = resultPanel.PanelHandle; + UserProfile.PanelConfigs[index].PanelHandle = resultPanel.PanelHandle; } else { - index = _profile.PanelConfigs.FindIndex(x => x.PanelName == resultPanel.PanelName); + index = UserProfile.PanelConfigs.ToList().FindIndex(x => x.PanelName == resultPanel.PanelName); if (index > -1) - _profile.PanelConfigs[index].PanelHandle = resultPanel.PanelHandle; + UserProfile.PanelConfigs[index].PanelHandle = resultPanel.PanelHandle; else - _profile.PanelConfigs.Add(resultPanel); + UserProfile.PanelConfigs.Add(resultPanel); } }); - //_profile.PanelConfigs.RemoveAll(x => x.PanelHandle == IntPtr.Zero && x.PanelType == PanelType.BuiltInPopout); - _profile.PanelConfigs.RemoveAll(x => x.PanelHandle == IntPtr.Zero); - - //_profile.PanelSettings.ForEach(panel => - Parallel.ForEach(_profile.PanelConfigs, panel => + // Remove pop out that do not exist for this pop out iteration + foreach(var panelConfig in UserProfile.PanelConfigs.ToList()) { - if (panel != null && panel.Width != 0 && panel.Height != 0) + if(panelConfig.PanelHandle == IntPtr.Zero) + { + UserProfile.PanelConfigs.Remove(panelConfig); + } + } + + Parallel.ForEach(UserProfile.PanelConfigs, panel => + { + if (panel != null && panel.PanelHandle != IntPtr.Zero && panel.Width != 0 && panel.Height != 0) { // Apply panel name if (panel.PanelType == PanelType.CustomPopout) @@ -220,7 +258,9 @@ namespace MSFSPopoutPanelManager.Provider } // Apply locations - PInvoke.MoveWindow(panel.PanelHandle, panel.Left, panel.Top, panel.Width, panel.Height, true); + PInvoke.ShowWindow(panel.PanelHandle, PInvokeConstant.SW_RESTORE); + Thread.Sleep(250); + PInvoke.MoveWindow(panel.PanelHandle, panel.Left, panel.Top, panel.Width, panel.Height, false); Thread.Sleep(1000); // Apply always on top @@ -264,11 +304,14 @@ namespace MSFSPopoutPanelManager.Provider // MSFS draws popout panel differently at different time for same panel PInvoke.MoveWindow(hwnd, -8, 0, 800, 600, true); PInvoke.SetForegroundWindow(hwnd); - Thread.Sleep(250); + Thread.Sleep(500); // Find the magnifying glass coordinate var point = AnalyzeMergedWindows(hwnd); + if (point.Y <= 39) // false positive + return; + InputEmulationManager.LeftClick(point.X, point.Y); } @@ -276,11 +319,12 @@ namespace MSFSPopoutPanelManager.Provider { var panelInfo = GetPanelWindowInfo(hwnd); - if(panelInfo != null && panelInfo.PanelType == PanelType.CustomPopout) + if (panelInfo != null && panelInfo.PanelType == PanelType.CustomPopout) { if (!_panels.Exists(x => x.PanelHandle == hwnd)) { - panelInfo.PanelIndex = index + 1; // Panel index starts at 1 + Interlocked.Increment(ref _currentPanelIndex); + panelInfo.PanelIndex = _currentPanelIndex; // PanelIndex starts at 1 _panels.Add(panelInfo); } } @@ -296,7 +340,8 @@ namespace MSFSPopoutPanelManager.Provider { if (!_panels.Exists(x => x.PanelHandle == hwnd)) { - panelInfo.PanelIndex = index; + Interlocked.Increment(ref _currentPanelIndex); + panelInfo.PanelIndex = _currentPanelIndex; _panels.Add(panelInfo); } } @@ -312,7 +357,8 @@ namespace MSFSPopoutPanelManager.Provider { if (!_panels.Exists(x => x.PanelHandle == hwnd)) { - panelInfo.PanelIndex = index; + Interlocked.Increment(ref _currentPanelIndex); + panelInfo.PanelIndex = _currentPanelIndex; _panels.Add(panelInfo); } } @@ -369,7 +415,7 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.GetClientRect(hwnd, out rectangle); var panelMenubarTop = GetPanelMenubarTop(sourceImage, rectangle); - if (panelMenubarTop > sourceImage.Height) + if (panelMenubarTop > sourceImage.Height) return Point.Empty; var panelMenubarBottom = GetPanelMenubarBottom(sourceImage, rectangle); @@ -463,7 +509,7 @@ namespace MSFSPopoutPanelManager.Provider // found the top of menu bar menubarBottom = y + top; } - else if(menubarBottom > -1) /// it is no longer white in color, we hit menubar bottom + else if (menubarBottom > -1) /// it is no longer white in color, we hit menubar bottom { sourceImage.UnlockBits(stripData); return menubarBottom; diff --git a/Provider/PanelSelectionManager.cs b/Provider/PanelSelectionManager.cs index c23a9a4..6abf28d 100644 --- a/Provider/PanelSelectionManager.cs +++ b/Provider/PanelSelectionManager.cs @@ -1,108 +1,159 @@ -using Gma.System.MouseKeyHook; +using MSFSPopoutPanelManager.Model; using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UI; using System; using System.Collections.Generic; -using System.Threading; -using System.Windows.Forms; +using System.Drawing; +using System.Linq; namespace MSFSPopoutPanelManager.Provider { public class PanelSelectionManager { - private IKeyboardMouseEvents _mouseHook; + private UserProfileManager _userProfileManager; private int _panelIndex; - private Form _appForm; + private List _panelCoordinates; + private IntPtr _winEventHook; + private static PInvoke.WinEventProc _winEvent; // keep this as static to prevent garbage collect or the app will crash + private Rectangle _lastWindowRectangle; + private bool _isEditingPanelCoordinates; - public event EventHandler OnSelectionCompleted; + public event EventHandler OnPanelSelectionCompleted; + public event EventHandler> OnPanelLocationAdded; + public event EventHandler OnPanelLocationRemoved; + public event EventHandler OnAllPanelLocationsRemoved; - public List PanelCoordinates { get; set; } + public UserProfile UserProfile { get; set; } - public PanelSelectionManager(Form form) + public AppSetting AppSetting { get; set; } + + public PanelSelectionManager(UserProfileManager userProfileManager) { - PanelCoordinates = new List(); - _appForm = form; + _userProfileManager = userProfileManager; + + InputHookManager.OnPanelSelectionAdded += HandleOnPanelSelectionAdded; + InputHookManager.OnPanelSelectionRemoved += HandleOnPanelSelectionRemoved; + InputHookManager.OnPanelSelectionCompleted += HandleOnPanelSelectionCompleted; } public void Start() { - if (_mouseHook == null) - { - _mouseHook = Hook.GlobalEvents(); - _mouseHook.MouseDownExt += HandleMouseHookMouseDownExt; - } - _panelIndex = 1; - ShowPanelLocationOverlay(true); + _panelCoordinates = new List(); + ShowPanelLocationOverlay(_panelCoordinates, true); + InputHookManager.SubscribeToPanelSelectionEvent = true; } - public void Reset() - { - _panelIndex = 1; - ShowPanelLocationOverlay(false); - } - - public void ShowPanelLocationOverlay(bool show) + public void ShowPanelLocationOverlay(List panelCoordinates, bool show) { // close all overlays - for (int i = Application.OpenForms.Count - 1; i >= 0; i--) - { - if (Application.OpenForms[i].GetType() == typeof(PopoutCoorOverlayForm)) - Application.OpenForms[i].Close(); - } + OnAllPanelLocationsRemoved?.Invoke(this, null); - if (show && PanelCoordinates.Count > 0) + if (show && panelCoordinates.Count > 0) { - foreach (var coor in PanelCoordinates) - WindowManager.AddPanelLocationSelectionOverlay(coor.PanelIndex.ToString(), coor.X, coor.Y); + foreach (var coor in panelCoordinates) + { + var panelSourceCoordinate = new PanelSourceCoordinate() { PanelIndex = coor.PanelIndex, X = coor.X, Y = coor.Y }; + OnPanelLocationAdded?.Invoke(this, new EventArgs(panelSourceCoordinate)); + } } } - private void HandleMouseHookMouseDownExt(object sender, MouseEventExtArgs e) + private void HandleOnPanelSelectionAdded(object sender, System.Drawing.Point e) { - if (e.Button == MouseButtons.Left) + var newPanelCoordinates = new PanelSourceCoordinate() { PanelIndex = _panelIndex, X = e.X, Y = e.Y }; + _panelCoordinates.Add(newPanelCoordinates); + _panelIndex++; + + OnPanelLocationAdded?.Invoke(this, new EventArgs(newPanelCoordinates)); + } + + private void HandleOnPanelSelectionRemoved(object sender, EventArgs e) + { + if(_panelCoordinates.Count > 0) { - var ctrlPressed = Control.ModifierKeys.ToString() == "Control"; - var shiftPressed = Control.ModifierKeys.ToString() == "Shift"; + _panelCoordinates.RemoveAt(_panelCoordinates.Count - 1); + _panelIndex--; - if (ctrlPressed) + OnPanelLocationRemoved?.Invoke(this, null); + } + } + + private void HandleOnPanelSelectionCompleted(object sender, EventArgs e) + { + // If enable, save the current viewport into custom view by Ctrl-Alt-0 + if (AppSetting.UseAutoPanning) + { + var simualatorProcess = DiagnosticManager.GetSimulatorProcess(); + if (simualatorProcess != null) { - if (_mouseHook != null) - { - _mouseHook.MouseDownExt -= HandleMouseHookMouseDownExt; - _mouseHook.Dispose(); - _mouseHook = null; - } - - OnSelectionCompleted?.Invoke(this, null); + InputEmulationManager.SaveCustomViewZero(simualatorProcess.Handle); } - else if (shiftPressed && Application.OpenForms.Count >= 1) - { - if (Application.OpenForms[Application.OpenForms.Count - 1].GetType() == typeof(PopoutCoorOverlayForm)) - { - // Remove last drawn overlay - Application.OpenForms[Application.OpenForms.Count - 1].Close(); - PanelCoordinates.RemoveAt(PanelCoordinates.Count - 1); - _panelIndex--; - } - } - else if (!shiftPressed) - { - var minX = _appForm.Location.X; - var minY = _appForm.Location.Y; - var maxX = _appForm.Location.X + _appForm.Width; - var maxY = _appForm.Location.Y + _appForm.Height; + } - if (e.X < minX || e.X > maxX || e.Y < minY || e.Y > maxY) - { - var newPanelCoordinates = new PanelSourceCoordinate() { PanelIndex = _panelIndex, X = e.X, Y = e.Y }; - PanelCoordinates.Add(newPanelCoordinates); + // Assign and save panel coordinates to active profile + UserProfile.PanelSourceCoordinates.Clear(); + _panelCoordinates.ForEach(c => UserProfile.PanelSourceCoordinates.Add(c)); + UserProfile.PanelConfigs.Clear(); + UserProfile.IsLocked = false; - WindowManager.AddPanelLocationSelectionOverlay(_panelIndex.ToString(), e.X, e.Y); - _panelIndex++; - } + _userProfileManager.WriteUserProfiles(); + + InputHookManager.SubscribeToPanelSelectionEvent = false; + OnPanelSelectionCompleted?.Invoke(this, null); + } + + public void StartEditPanelLocations() + { + _winEvent = new PInvoke.WinEventProc(PanelLocationEditEventCallback); + _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, DiagnosticManager.GetApplicationProcess().Handle, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT); + _isEditingPanelCoordinates = true; + } + + public void EndEditPanelLocations() + { + PInvoke.UnhookWinEvent(_winEventHook); + _isEditingPanelCoordinates = false; + } + + private void PanelLocationEditEventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime) + { + // check by priority to minimize escaping constraint + if (hWnd == IntPtr.Zero + || idObject != 0 + || hWinEventHook != _winEventHook + || !_isEditingPanelCoordinates + || !(iEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE || iEvent == PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND) + || UserProfile.PanelSourceCoordinates == null || UserProfile.PanelSourceCoordinates.Count == 0) + { + return; + } + + var panelSourceCoordinate = UserProfile.PanelSourceCoordinates.FirstOrDefault(panel => panel.PanelHandle == hWnd); + + if (panelSourceCoordinate != null) + { + switch (iEvent) + { + case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE: + Rectangle winRectangle; + PInvoke.GetWindowRect(panelSourceCoordinate.PanelHandle, out winRectangle); + + if (_lastWindowRectangle == winRectangle) // ignore duplicate callback messages + return; + + _lastWindowRectangle = winRectangle; + Rectangle clientRectangle; + PInvoke.GetClientRect(panelSourceCoordinate.PanelHandle, out clientRectangle); + + panelSourceCoordinate.X = winRectangle.Left; + panelSourceCoordinate.Y = winRectangle.Top; + + break; + case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND: + _userProfileManager.WriteUserProfiles(); + break; } } } } -} \ No newline at end of file +} diff --git a/Provider/Provider.csproj b/Provider/Provider.csproj new file mode 100644 index 0000000..a214021 --- /dev/null +++ b/Provider/Provider.csproj @@ -0,0 +1,47 @@ + + + + Library + net5.0-windows + true + MSFSPopoutPanelManager.Provider + MSFS 2020 Popout Panel Manager Provider + MSFS 2020 Popout Panel Manager Provider + 3.2.0 + Stanley Kwok + Stanley Kwok 2021 + https://github.com/hawkeye-stan/msfs-popout-panel-manager + true + + + AnyCPU;x64 + + + + true + + + + true + + + + true + + + + true + + + + + + + + + + + + + + diff --git a/Provider/SimConnectManager.cs b/Provider/SimConnectManager.cs new file mode 100644 index 0000000..3ae3b6b --- /dev/null +++ b/Provider/SimConnectManager.cs @@ -0,0 +1,131 @@ +using MSFSPopoutPanelManager.FsConnector; +using MSFSPopoutPanelManager.Shared; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Threading; +using System.Timers; + +namespace MSFSPopoutPanelManager.Provider +{ + public class SimConnectManager + { + private const int MSFS_DATA_REFRESH_TIMEOUT = 1000; + + private SimConnector _simConnector; + private dynamic _simData; + + private System.Timers.Timer _requestDataTimer; + private SimConnectSystemEvent _lastSystemEvent; + private bool _isPowerOnForPopOut; + + public event EventHandler OnConnected; + public event EventHandler OnDisconnected; + public event EventHandler> OnSimConnectDataRefreshed; + public event EventHandler OnFlightStarted; + public event EventHandler OnFlightStopped; + + public bool IsSimConnectStarted { get; set; } + + public SimConnectManager() + { + _simConnector = new SimConnector(); + _simConnector.OnConnected += (sender, e) => { OnConnected?.Invoke(this, null); }; + _simConnector.OnDisconnected += (sender, e) => { OnDisconnected?.Invoke(this, null); }; + _simConnector.OnReceivedData += HandleDataReceived; + _simConnector.OnReceiveSystemEvent += HandleReceiveSystemEvent; + _simConnector.OnConnected += (sender, e) => + { + _requestDataTimer = new System.Timers.Timer(); + _requestDataTimer.Interval = MSFS_DATA_REFRESH_TIMEOUT; + _requestDataTimer.Enabled = true; + _requestDataTimer.Elapsed += HandleDataRequested; + _requestDataTimer.Elapsed += HandleMessageReceived; + }; + + _simConnector.Start(); + } + + public void Stop() + { + _simConnector.Stop(); + } + + public void Restart() + { + _simConnector.StopAndReconnect(); + } + + public void TurnOnPower(bool isRequiredForColdStart) + { + if (isRequiredForColdStart && _simData != null && !_simData.ElectricalMasterBattery) + { + _isPowerOnForPopOut = true; + _simConnector.TransmitActionEvent(ActionEvent.KEY_MASTER_BATTERY_SET, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_ALTERNATOR_SET, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_1_ON, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_2_ON, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_SET, 1); + } + } + + public void TurnOffpower() + { + if(_isPowerOnForPopOut) + { + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_1_OFF, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_2_OFF, 1); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_AVIONICS_MASTER_SET, 0); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_ALTERNATOR_SET, 0); + Thread.Sleep(100); + _simConnector.TransmitActionEvent(ActionEvent.KEY_MASTER_BATTERY_SET, 0); + + _isPowerOnForPopOut = false; + } + } + + private void HandleDataRequested(object sender, ElapsedEventArgs e) + { + try + { + _simConnector.RequestData(); + } + catch { } + } + + private void HandleMessageReceived(object sender, ElapsedEventArgs e) + { + try + { + _simConnector.ReceiveMessage(); + } + catch { } + } + + public void HandleDataReceived(object sender, EventArgs e) + { + _simData = e.Value; + OnSimConnectDataRefreshed?.Invoke(this, new EventArgs(e.Value)); + } + + private void HandleReceiveSystemEvent(object sender, EventArgs e) + { + // to detect flight start at the "Ready to Fly" screen, it has a SIMSTART follows by a VIEW event + if(_lastSystemEvent == SimConnectSystemEvent.SIMSTART && e.Value == SimConnectSystemEvent.VIEW) + OnFlightStarted?.Invoke(this, null); + + if (e.Value == SimConnectSystemEvent.SIMSTOP) + OnFlightStopped?.Invoke(this, null); + + Debug.WriteLine($"SimConnectSystemEvent Received: {e.Value.ToString()}"); + _lastSystemEvent = e.Value; + } + } +} diff --git a/Provider/UserProfileManager.cs b/Provider/UserProfileManager.cs new file mode 100644 index 0000000..4b17809 --- /dev/null +++ b/Provider/UserProfileManager.cs @@ -0,0 +1,168 @@ +using MSFSPopoutPanelManager.Model; +using MSFSPopoutPanelManager.Shared; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.IO; +using System.Linq; + +namespace MSFSPopoutPanelManager.Provider +{ + public class UserProfileManager + { + private const string USER_PROFILE_DATA_FILENAME = "userprofiledata.json"; + + public ObservableCollection UserProfiles { get; set; } + + public int AddUserProfile(string newProfileName) + { + return AddProfile(new UserProfile(), newProfileName); + } + + public int AddUserProfileByCopyingProfile(string newProfileName, int copyProfileId) + { + if (UserProfiles == null) + throw new Exception("User Profiles is null."); + + var matchedProfile = UserProfiles.FirstOrDefault(p => p.ProfileId == copyProfileId); + + var copiedProfile = matchedProfile.Copy(); // Using Shared/ObjectExtensions.cs extension method + copiedProfile.IsDefaultProfile = false; + copiedProfile.BindingPlaneTitle = null; + + return AddProfile(copiedProfile, newProfileName); + } + + public bool DeleteUserProfile(int profileId) + { + if (UserProfiles == null) + throw new Exception("User Profiles is null."); + + if (profileId == -1) + return false; + + var profileToRemove = UserProfiles.First(x => x.ProfileId == profileId); + UserProfiles.Remove(profileToRemove); + WriteUserProfiles(); + + Logger.LogStatus($"Profile '{profileToRemove.ProfileName}' has been deleted successfully.", StatusMessageType.Info); + + return true; + } + + public bool SetDefaultUserProfile(int profileId) + { + if (UserProfiles == null) + throw new Exception("User Profiles is null."); + + if (profileId == -1) + return false; + + var profile = UserProfiles.First(x => x.ProfileId == profileId); + + profile.IsDefaultProfile = true; + foreach (var p in UserProfiles) + { + if (p.ProfileId != profileId) + p.IsDefaultProfile = false; + } + + WriteUserProfiles(); + + Logger.LogStatus($"Profile '{profile.ProfileName}' has been set as default.", StatusMessageType.Info); + + return true; + } + + public UserProfile GetDefaultProfile() + { + return UserProfiles.ToList().Find(x => x.IsDefaultProfile); + } + + public void AddProfileBinding(string planeTitle, int activeProfileId) + { + var bindedProfile = UserProfiles.FirstOrDefault(p => p.BindingPlaneTitle == planeTitle); + if (bindedProfile != null) + { + Logger.LogStatus($"Unable to add binding to the profile because '{planeTitle}' was already bound to profile '{bindedProfile.ProfileName}'.", StatusMessageType.Error); + return; + } + + UserProfiles.First(p => p.ProfileId == activeProfileId).BindingPlaneTitle = planeTitle; + WriteUserProfiles(); + Logger.LogStatus($"Binding for the profile has been added successfully.", StatusMessageType.Info); + } + + public void DeleteProfileBinding(int activeProfileId) + { + UserProfiles.First(p => p.ProfileId == activeProfileId).BindingPlaneTitle = null; + WriteUserProfiles(); + Logger.LogStatus($"Binding for the profile has been deleted successfully.", StatusMessageType.Info); + } + + public void ReadUserProfiles() + { + try + { + using (StreamReader reader = new StreamReader(Path.Combine(FileIo.GetUserDataFilePath(), USER_PROFILE_DATA_FILENAME))) + { + UserProfiles = new ObservableCollection(JsonConvert.DeserializeObject>(reader.ReadToEnd())); + } + } + catch + { + UserProfiles = new ObservableCollection(new List()); + } + } + + public void WriteUserProfiles() + { + Debug.WriteLine("saving profile...."); + + if (UserProfiles == null) + throw new Exception("User Profiles is null."); + + try + { + var userProfilePath = FileIo.GetUserDataFilePath(); + + if (!Directory.Exists(userProfilePath)) + Directory.CreateDirectory(userProfilePath); + + using (StreamWriter file = File.CreateText(Path.Combine(userProfilePath, USER_PROFILE_DATA_FILENAME))) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Serialize(file, UserProfiles); + } + } + catch + { + Logger.LogStatus($"Unable to write user data file: {USER_PROFILE_DATA_FILENAME}", StatusMessageType.Error); + } + } + + private int AddProfile(UserProfile userProfile, string newProfileName) + { + if (UserProfiles == null) + throw new Exception("User Profiles is null."); + + var newPlaneProfile = userProfile; + var newProfileId = UserProfiles.Count > 0 ? UserProfiles.Max(x => x.ProfileId) + 1 : 1; + + newPlaneProfile.ProfileName = newProfileName; + newPlaneProfile.ProfileId = newProfileId; + + var tmpList = UserProfiles.ToList(); + tmpList.Add(newPlaneProfile); + var index = tmpList.OrderBy(x => x.ProfileName).ToList().FindIndex(x => x.ProfileId == newProfileId); + UserProfiles.Insert(index, newPlaneProfile); + WriteUserProfiles(); + + Logger.LogStatus($"Profile '{newPlaneProfile.ProfileName}' has been added successfully.", StatusMessageType.Info); + + return newProfileId; + } + } +} diff --git a/Provider/WindowManager.cs b/Provider/WindowManager.cs index 45f5860..5ff3b3e 100644 --- a/Provider/WindowManager.cs +++ b/Provider/WindowManager.cs @@ -1,23 +1,12 @@ using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UI; using System; -using System.Diagnostics; using System.Drawing; -using System.Windows.Forms; +using System.Runtime.InteropServices; namespace MSFSPopoutPanelManager.Provider { public class WindowManager { - public static void AddPanelLocationSelectionOverlay(string text, int x, int y) - { - PopoutCoorOverlayForm frm = new PopoutCoorOverlayForm(); - frm.Location = new Point(x - frm.Width / 2, y - frm.Height / 2); - frm.StartPosition = FormStartPosition.Manual; - ((Label)frm.Controls.Find("lblPanelIndex", true)[0]).Text = text; - frm.Show(); - } - public static void ApplyHidePanelTitleBar(IntPtr handle, bool hideTitleBar) { var currentStyle = PInvoke.GetWindowLong(handle, PInvokeConstant.GWL_STYLE).ToInt64(); @@ -31,9 +20,20 @@ namespace MSFSPopoutPanelManager.Provider public static void ApplyAlwaysOnTop(IntPtr handle, bool alwaysOnTop, Rectangle panelRectangle) { if (alwaysOnTop) - PInvoke.SetWindowPos(handle, PInvokeConstant.HWND_TOPMOST, panelRectangle.Left, panelRectangle.Top, panelRectangle.Width, panelRectangle.Height, PInvokeConstant.SWP_ALWAYS_ON_TOP); + PInvoke.SetWindowPos(handle, new IntPtr(PInvokeConstant.HWND_TOPMOST), panelRectangle.Left, panelRectangle.Top, panelRectangle.Width, panelRectangle.Height, PInvokeConstant.SWP_ALWAYS_ON_TOP); else - PInvoke.SetWindowPos(handle, PInvokeConstant.HWND_NOTOPMOST, panelRectangle.Left, panelRectangle.Top, panelRectangle.Width, panelRectangle.Height, 0); + PInvoke.SetWindowPos(handle, new IntPtr(PInvokeConstant.HWND_NOTOPMOST), panelRectangle.Left, panelRectangle.Top, panelRectangle.Width, panelRectangle.Height, 0); + } + + public static void ApplyAlwaysOnTop(IntPtr handle, bool alwaysOnTop) + { + Rectangle rect; + PInvoke.GetWindowRect(handle, out rect); + + Rectangle clientRectangle; + PInvoke.GetClientRect(handle, out clientRectangle); + + ApplyAlwaysOnTop(handle, alwaysOnTop, new Rectangle(rect.X, rect.Y, clientRectangle.Width, clientRectangle.Height)); } public static void CloseWindow(IntPtr handle) @@ -48,32 +48,15 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.MoveWindow(handle, x, y, rectangle.Width, rectangle.Height, false); } - public static WindowProcess GetSimulatorProcess() + public static void MinimizeWindow(IntPtr handle) { - return GetProcess("FlightSimulator"); + PInvoke.ShowWindow(handle, PInvokeConstant.SW_MINIMIZE); } - public static WindowProcess GetApplicationProcess() + public static void BringWindowToForeground(IntPtr handle) { - return GetProcess("MSFSPopoutPanelManager"); - } - - private static WindowProcess GetProcess(string processName) - { - foreach (var process in Process.GetProcesses()) - { - if (process.ProcessName == processName) - { - return new WindowProcess() - { - ProcessId = process.Id, - ProcessName = process.ProcessName, - Handle = process.MainWindowHandle - }; - } - } - - return null; + PInvoke.ShowWindowAsync(new HandleRef(null, handle), PInvokeConstant.SW_RESTORE); + PInvoke.SetForegroundWindow(handle); } public static void CloseAllCustomPopoutPanels() @@ -81,6 +64,34 @@ namespace MSFSPopoutPanelManager.Provider PInvoke.EnumWindows(new PInvoke.CallBack(EnumAllCustomPopoutPanels), 1); } + public static void MinimizeAllPopoutPanels(bool active) + { + if (active) + { + PInvoke.EnumWindows(new PInvoke.CallBack(EnumToMinimizePopoutPanels), 0); + } + else + { + PInvoke.EnumWindows(new PInvoke.CallBack(EnumToMinimizePopoutPanels), 1); + } + } + + private static bool EnumToMinimizePopoutPanels(IntPtr hwnd, int index) + { + var className = PInvoke.GetClassName(hwnd); + var caption = PInvoke.GetWindowText(hwnd); + + if (className == "AceApp" && caption.IndexOf("Microsoft Flight Simulator") == -1) // MSFS windows designation + { + if (index == 0) + PInvoke.ShowWindow(hwnd, PInvokeConstant.SW_MINIMIZE); + else + PInvoke.ShowWindow(hwnd, PInvokeConstant.SW_RESTORE); + } + + return true; + } + private static bool EnumAllCustomPopoutPanels(IntPtr hwnd, int index) { var className = PInvoke.GetClassName(hwnd); @@ -90,7 +101,7 @@ namespace MSFSPopoutPanelManager.Provider { WindowManager.CloseWindow(hwnd); } - else if (className == "AceApp") // for builtin pop out (ATC, VFR Map, ect) + else if (className == "AceApp" && caption.IndexOf("Microsoft Flight Simulator") == -1) // for builtin pop out (ATC, VFR Map, ect) { WindowManager.MoveWindow(hwnd, 0, 0); } diff --git a/Shared/WindowProcess.cs b/Provider/WindowProcess.cs similarity index 82% rename from Shared/WindowProcess.cs rename to Provider/WindowProcess.cs index 9817b2a..a0308a9 100644 --- a/Shared/WindowProcess.cs +++ b/Provider/WindowProcess.cs @@ -1,6 +1,6 @@ using System; -namespace MSFSPopoutPanelManager +namespace MSFSPopoutPanelManager.Provider { public class WindowProcess { diff --git a/README.md b/README.md index 99b3ad2..219761b 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,55 @@ MSFS Pop Out Panel Manager is an application for MSFS 2020 which helps pop out, [FlightSimulator.com forum thread regarding this project](https://forums.flightsimulator.com/t/msfs-pop-out-panel-manager-automatically-pop-out-and-save-panel-position/460613) -### IMPORTANT! Version 3.0 file format is not compatible with previous version user profile data format since additional information has been added and updated to support new features. Please continue to use version 2.2 of the application if it works for you and you do not need the new features. If you're technical, please see User Profile Data Files below to do a manual data transfer. +## Version 3.2 NEW FEATURES! +* Added per monitor DPI-awareness support. The application should run and display correctly when using combination of mixed monitor (with high-DPI and low-DPI) resolutions and scaling. +* Added system tray icon access. Application can start minimize or minimize to system tray. System tray icon features a context menu to allow quick access to application functions. +* Added user requested feature to provide keyboard shortcut (Ctrl-Alt-P) to start panel pop out with either an active profile or a default profile selected. +* New copy profile feature. You can reuse your defined panel settings for another plane or plane/livery combination. This is a feature to solve the problem when the final panel placements are the same but the in-game panel locations are different. This also allows using a defined profile for different liveries for the same plane for Auto Pop Out. (See Auto Pop Out Panel experiment feature). +* Added quick panel location selection adjustment feature. You can now adjust panel locations without redoing the entire profile. Just click "Show/Edit Panel Location Overlay" checkbox, you can now drag and move the panel selection number circle. When you're done with the placement, the new location will automatically save for the profile. +* Added Save Auto Panning Camera Angle function if you need to adjust the in-game camera angle during panel selection. +* New logo icon for the app. +* New dark theme for the entire UI. +* Technical Note - Application is ported and rewritten with .NET WPF framework instead of WinForms and SimConnect is added to the app for Auto Pop Out feature and for future functionality expansions. -## Version 3.0 NEW FEATURES! +** Beta feature - Auto Pop Out Panels** -* Provided 2X pop out and panel separation performance. -* Display resolution independent. Tested on 1080p/1440p/4k display. -* New Cold Start feature. Panels can be popped out and recalled later even when they're not turned on. -* New Auto Panning feature remembers the cockpit camera angle when you first define the pop out panels. You can now pan, zoom in, and zoom out to identify offscreen panels and the camera angle will be saved and reused. This feature requires the use of Ctrl-Alt-0 and Alt-0 keyboard binding to save custom camera view per plane configuration. If the keyboard binding is currently being used. The auto-panning feature will overwrite the saved camera view if enabled. -* New fine-grain control in positioning panels down to pixel level. -* New user-friendly features such as Always on Top, real time readout as you position panels, a more intuitive user interface and status messages. -* New auto save feature. All profile and panel changes get save automatically. -* Technical: Rewritten code base to improve code structure and performance. +When a profile is defined, final panel placements are set, and bound to a plane type + livery combination. The application will automatically pop out all panels if a matched profile is detected when a flight starts. + +[Online Video - feature in action](https://vimeo.com/674073559) - In the video, after clicking flight restart, the app did all the clicking by itself. + +**How it works and how to use:** + +The app will try to find a matching profile with the title of the plane (per livery). It will then automatically detect when a flight is starting and then click the "Ready to Fly" button. It will then power on instrumentation for cold start (if necessary), and pop out all panels. This feature allows panels to be popped out without the need of user interaction. If profiles are set and bound, you can auto-start the app minimized in system and as you start your flight, panels will automatically pop out for you. + +* First make sure in File->Preferences, "Auto Pop Out Panels" option is turned on. + +* For existing profile to use Auto Pop Out feature, just click "Add Binding" and bind the profile to the active plane in the game. + +* Since Auto Pop Out need to match plane title to work, a profile must be bound to a plane to use the Auto Pop Out feature. You can continue to manually click start the pop out for unbound profile. Or better yet, use the new keyboard shortcut (Ctrl-Alt-P) to manually start the pop out process. + +* During my testing, instrumentations only need to be powered on for Auto Pop Out to work for G1000/G1000 NXi plane during cold start. (There seems to be a bug in the game that you can't do Alt-Right click to pop out cold start panel for this particular plane variant). For other plane instrumentations I've tested (G3000, CJ4, Aerosoft CRJ 550/700, FBW A32NX), panels can be popped out without powering on. So please make sure the checkbox "Power on required to pop out panels on cold start" is checked for G1000 related profiles. + +* If you want to fly the same plane with different livery, the plane title will be different for each livery. You can see the current in-game active plane + livery title by hovering your mouse over the connection icon in the upper right corner of the app. In order to use Auto Pop Out feature in this scenario, first defined the initial profile for a plane + livery combination. After you're satisfy the profile is working, switch the plane livery and create a new profile by copying the initial profile and bound it to the plane again (with the new livery selected). You should notice the binding name will be different even though all the panel settings are the same. Repeat this for as many liveries for the plane as needed. + +* If after binding the livery and Auto Pop Out did not work (which means the app cannot find a match), please hover your mouse over the connecting icon in the app to see the current plane title reported by the game is the same as what you've bound to the profile. Sometimes, SimConnect does not update the plane title until the flight actually starts. So if you've done the binding before the flight start, sometime it will not work. Just just "Replace binding" again and confirm the plane title. + +* **TIPS:** One of the trick to force SimConnect to update the plane title after selecting a new livery is when you've selected a plane and livery in the World Map, click the "Go Back" button at the lower left of your screen. + +* **TIPS:** For technical user, there are parts in this feature that uses a timer when waiting to execute certain steps in the Auto Pop Out process. An example is how long to wait for the "Ready to Fly" button to appear because auto-clicking it. Depending on the speed of your machine, you can adjust the wait timer to speed up or slow down the auto pop out process. Please see the section "User Profile Data Files" in the documentation for instruction to edit appSettings.json file. + +
+ +## Application Features + +* Display resolution independent. Supports 1080p/1440p/4k display. +* Support multiple user defined profiles to save panel locations to be recalled later. +* Intuitive user interface to defined location of panels to be popped out. +* Cold Start feature. Panels can be popped out and recalled later even when they're not powered on. +* Auto Panning feature remembers the cockpit camera angle when you first define the pop out panels. You can now pan, zoom in, and zoom out to identify offscreen panels and the camera angle will be saved and reused. This feature requires the use of Ctrl-Alt-0 and Alt-0 keyboard binding to save custom camera view per plane configuration. If the keyboard binding is currently being used. The auto-panning feature will overwrite the saved camera view if enabled. +* Fine-grain control in positioning panels down to pixel level. +* User-friendly features such as application Always on Top and Auto Start as MSFS starts. +* Auto save feature. All profile and panel changes get save automatically. ## History: Pop Out Panel Positioning Annoyance @@ -31,45 +68,47 @@ With v3.0, redesign from the ground up about how to pop out and separate the pan ## How to Use? [Here](images/doc/userguide.mp4) or [Online](https://vimeo.com/668430955) is a video of how the app works. - 1. Start the application **MSFSPopoutPanelManager.exe** and it will automatically connect when MSFS starts. You maybe prompt to download .NET framework 5.0. Please see the screenshot below to download and install x64 desktop version of the framework. + 1. Start the application **MSFSPopoutPanelManager.exe** and it will automatically connect when MSFS/SimConnect starts. You maybe prompt to download .NET framework 5.0. Please see the screenshot below to download and install x64 desktop version of the framework.

- 2. First create a new plane profile (for example A32NX by FlybyWire) + 2. First start the game and start a flight. Then, in the app, create a new profile (for example: Cessna 172 G1000)

- +

- 3. Once the game has started and you're at the beginning of flight, please click "Start Panel Selection" to define where the pop out panels will be using LEFT CLICK. Use CTRL-LEFT CLICK when done to complete the selection. + 3. If you want to associate the profile to the current plane to use the Auto Pop Out feature, click "Add Binding". + +

+ +

+ + 3. Now you're ready to select the panels you want to pop out. Please click "Start Panel Selection" to define where the pop out panels will be using LEFT CLICK. Use CTRL-LEFT CLICK when done to complete the selection. You can also move the number circles at this point to do final adjustment.

- +

- 4. Now, click "Start Pop Out". At this point, please be patient. The application will start popping out and separating panels one by one and you will see a lot of movement on the screen. If something goes wrong, just follow the instruction in the status message and try again. + 4. Now, click "Start Pop Out". At this point, please be patient. The application will start popping out and separating panels one by one and you will see a lot of movements on screen. If something goes wrong, just follow the instruction in the status message and try again. 5. Once the process is done, you will see a list of panels line up in the upper left corner of the screen. All the panels are given a default name. You can name them anything you want if desire.

- +

- 6. Now, start the panel configuration by dragging the pop out panels into their final position. You can also type value directly into the data grid to move and resize a panel. The +/- pixel buttons by the lower left corner of the grid allow you to change panel position at the chosen increment/decrement by selecting the datagrid cell (X-Pos, Y-Pos, Width, Height). You can also select "Always on Top" and "Hide Titlebar" if desire. Once all the panels are at their final position, just click "Lock Panel" to prevent further panel changes. + 6. Now, start the panel configuration by dragging the pop out panels into their final position (to your main monitor or other monitors). You can also type value directly into the data grid to move and resize a panel. The +/- pixel buttons by the lower left corner of the grid allow you to change panel position at the chosen increment/decrement by selecting the datagrid cell (X-Pos, Y-Pos, Width, Height). You can also select "Always on Top" and "Hide Titlebar" if desire. Once all the panels are at their final position, just click "Lock Panel" to prevent further panel changes.

- +

-

- -

+7. To test if everything is working. Once the profile is saved, please click "Restart" in the File menu. This will close all pop outs, except the built-in ones from the game main menu bar, and you're back to the start of the application. Now click "Start Pop Out" and see the magic happens! - 7. To test if everything is working. Once the profile is saved, please click "Restart" in the File menu. This will close all pop out, except the built-in ones from the game main menu bar, and you're back to the start of the application. Now click "Start Pop Out" and see the magic happens! - -8. With auto panning feature enabled, you do not have to line up the circles that identified the panels in order for the panels to be popped out. But if you would like to do it manually without auto-panning, on next start of the flight, just line up the panels before clicking "Start Pop Out". +8. With auto panning feature enabled, you do not have to line up the circles that identified the panels in order for the panels to be popped out. But if you would like to do it manually without auto-panning, on next start of the flight, just line up the panels before clicking "Start Pop Out" if needed.

@@ -87,25 +126,31 @@ The user plane profile data and application settings data are stored as JSON fil * userdata/userprofiledata.json * userdata/appsettingdata.json -Note for technical user. If you would like to transfer existing profile data into v3.0 file format, you can first create a new profile in v3.0 of the app with the same panels and save it. Then you can open previous version of the configuration in config/userdata.json. You can match the old JSON attribute of "PanelDestinationList" of (Top, Left, Width, Height) for each panel and transfer it over to the new file JSON attribute of "PanelConfigs". Please edit at your own risk. +**Note for technical user**. If you would like to shorten or extend the wait time for each step during Auto Pop Out, Panel, you can edit the following JSON element in appsettingdata.json file. The wait time is in seconds. If you don't see this JSON element, just update any File->Preferences setting and it will trigger this JSON element to be saved into the file. + +"AutoPopOutPanelsWaitDelay": { + "ReadyToFlyButton": 3, + "InitialCockpitView": 3, + "InstrumentationPowerOn": 2 +} ## Current Known Issue * Sometimes when using the auto-panning feature, the keyboard combination of Ctrl-Alt-0 and Alt-0 do not work to save and load panel panning coordinates. First try to restart the flightsim and it usually fixes the problem. Otherwise, the only way to fix this is to redo the profile if you want the auto-panning feature since the camera angle is only being saved during the initial creation of the profile. The is another MSFS bug. -* If running the game in windows mode on your non-primary monitor in a multi-monitor setup with different display resolution, panel identification and separation may not work correctly. + * Current application package size is bigger than previous version of the application because it is not a single EXE file package. With added feature of exception logging and stack trace to support user feedback and troubleshooting, a Single EXE package in .NET 5.0 as well as .NET 6.0 has a bug that stack trace information is not complete. Hopefully, Microsoft will be fixing this problem. ## Common Problem Resolution -* Unable to pop out panels when creating a profile for the first time with error such as "Unable to pop out panel #X". If the panel is not being obstructed, by changing the sequence of the pop out when defining the profile may help solve the issue. Currently there are some panels in certain plane configuration that does not follow predefined MSFS pop out rule. +* Unable to pop out panels when creating a profile for the first time with error such as "Unable to pop out panel #X". If the panel is not being obstructed by another window, by changing the sequence of the pop out when defining the profile may help solve the issue. Currently there are some panels in certain plane configuration that does not follow predefined MSFS pop out rule. -* Unable to pop out panels on subsequent flight. Please follow status message instruction. Also, if using auto-panning, Ctrl-Alt-0 may not have been saved correctly during profile creation. You will be able to fix this by manually line up the panel circles identifier and do a force save view by pressing Ctrl-Alt-0. +* Unable to pop out panels on subsequent flight. Please follow status message instruction. Also, if using auto-panning, Ctrl-Alt-0 may not have been saved correctly during profile creation. You can trigger a force camera angle save by clicking the "Save Auto Panning Camera" button for the profile. * Unable to pop out ALL panels. This may indicate a potential miscount of selected panels (circles) and the number of actual panels that got popped out. You may have duplicate panels in your selection or panels that cannot be popped out. -* If you encounter application crashes or unknown error, please help attach the file **error.log** in the application folder and open a ticket issue in the github repo for this project. This is going to help me troubleshoot the issue and provide hotfixes. +* If you encounter application crashes or unknown error, please help my continuing development effort by attaching the file **error.log** in the application folder and open an issue ticket in github repo for this project. This is going to help me troubleshoot the issue and provide hotfixes. ## Author @@ -115,13 +160,15 @@ Stanley Kwok I welcome feedback to help improve the accuracy and usefulness of this application. You are welcome to take a copy of this code to further enhance it and use within your own project. But please abide by licensing terms and keep it open source:) ## Credits -[Tesseract](https://github.com/charlesw/tesseract/) by Charles Weld - .NET wrapper for Tesseract OCR package. For version 1.x of application. - [AForge.NET](http://www.aforgenet.com/framework/) Image recognition library. For version 2.x of the application. -[DarkUI](http://www.darkui.com/) by Robin Perria - [MouseKeyHook](https://github.com/gmamaladze/globalmousekeyhook) by George Mamaladze [Fody](https://github.com/Fody/Fody) .NET assemblies weaver by Fody +[MahApps.Metro Dark Theme](https://github.com/MahApps/MahApps.Metro) by Jan Karger, Dennis Daume, Brendan Forster, Paul Jenkins, Jake Ginnivan, Alex Mitchell + +[Hardcodet NotifyIcon](https://github.com/hardcodet/wpf-notifyicon) by Philipp Sumi, Robin Krom, Jan Karger + +[WPF CalcBinding](https://github.com/Alex141/CalcBinding) by Alexander Zinchenko + diff --git a/Shared/AppSettingData.cs b/Shared/AppSettingData.cs deleted file mode 100644 index f277c4e..0000000 --- a/Shared/AppSettingData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Newtonsoft.Json; - -namespace MSFSPopoutPanelManager.Shared -{ - public class AppSettingData - { - public AppSettingData() - { - // Set defaults - MinimizeToTray = false; - AlwaysOnTop = true; - UseAutoPanning = true; - } - - public bool MinimizeToTray { get; set; } - - public bool AlwaysOnTop { get; set; } - - public bool UseAutoPanning { get; set; } - - [JsonIgnore] - public bool AutoStart { get; set; } - } -} diff --git a/Shared/BoolToVisibilityConverter.cs b/Shared/BoolToVisibilityConverter.cs new file mode 100644 index 0000000..01c94c0 --- /dev/null +++ b/Shared/BoolToVisibilityConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace MSFSPopoutPanelManager.Shared +{ + [ValueConversion(typeof(bool), typeof(Visibility))] + public sealed class BoolToVisibilityConverter : IValueConverter + { + public Visibility TrueValue { get; set; } + public Visibility FalseValue { get; set; } + + public BoolToVisibilityConverter() + { + // set defaults + TrueValue = Visibility.Visible; + FalseValue = Visibility.Collapsed; + } + + public object Convert(object value, Type targetType, + object parameter, CultureInfo culture) + { + if (!(value is bool)) + return null; + return (bool)value ? TrueValue : FalseValue; + } + + public object ConvertBack(object value, Type targetType, + object parameter, CultureInfo culture) + { + if (Equals(value, TrueValue)) + return true; + if (Equals(value, FalseValue)) + return false; + return null; + } + } +} diff --git a/Shared/DataStore.cs b/Shared/DataStore.cs deleted file mode 100644 index 412f90f..0000000 --- a/Shared/DataStore.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Linq; -using System.ComponentModel; - -namespace MSFSPopoutPanelManager.Shared -{ - public class DataStore : INotifyPropertyChanged - { - private int _activeProfileId; - - public event PropertyChangedEventHandler PropertyChanged; - - public DataStore() - { - _activeProfileId = -1; - ActiveUserProfile = null; - ActiveProfilePanelCoordinates = new BindingList(); - PanelConfigs = new BindingList(); - - } - - public BindingList UserProfiles { get; set; } - - public BindingList ActiveProfilePanelCoordinates { get; set; } - - public BindingList PanelConfigs { get; set; } - - public UserProfileData ActiveUserProfile { get; set; } - - public int ActiveUserProfileId - { - get - { - return _activeProfileId; - } - set - { - _activeProfileId = value; - - if(value == -1) - { - ActiveUserProfile = null; - ActiveProfilePanelCoordinates.Clear(); - } - else - { - ActiveUserProfile = UserProfiles.ToList().Find(x => x.ProfileId == value); - ActiveProfilePanelCoordinates.Clear(); - ActiveUserProfile.PanelSourceCoordinates.ForEach(c => ActiveProfilePanelCoordinates.Add(c)); - } - } - } - } -} diff --git a/Shared/FileIO.cs b/Shared/FileIO.cs new file mode 100644 index 0000000..9e724fd --- /dev/null +++ b/Shared/FileIO.cs @@ -0,0 +1,13 @@ +using System.IO; + +namespace MSFSPopoutPanelManager.Shared +{ + public class FileIo + { + public static string GetUserDataFilePath() + { + var startupPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + return Path.Combine(startupPath, "userdata"); + } + } +} diff --git a/Shared/Logger.cs b/Shared/Logger.cs index 2179313..744068f 100644 --- a/Shared/Logger.cs +++ b/Shared/Logger.cs @@ -5,9 +5,8 @@ namespace MSFSPopoutPanelManager.Shared public class Logger { public static event EventHandler> OnStatusLogged; - public static event EventHandler> OnBackgroundStatusLogged; - public static void Status(string message, StatusMessageType MessageType) + public static void LogStatus(string message, StatusMessageType MessageType) { var statusMessage = new StatusMessage() { Message = message, MessageType = MessageType }; OnStatusLogged?.Invoke(null, new EventArgs(statusMessage)); @@ -15,18 +14,7 @@ namespace MSFSPopoutPanelManager.Shared public static void ClearStatus() { - Status(String.Empty, StatusMessageType.Info); - } - - public static void BackgroundStatus(string message, StatusMessageType MessageType) - { - var statusMessage = new StatusMessage() { Message = message, MessageType = MessageType }; - OnBackgroundStatusLogged?.Invoke(null, new EventArgs(statusMessage)); - } - - public static void ClearBackgroundStatus() - { - BackgroundStatus(String.Empty, StatusMessageType.Info); + LogStatus(String.Empty, StatusMessageType.Info); } } @@ -43,7 +31,7 @@ namespace MSFSPopoutPanelManager.Shared Error } - public class PopoutManagerException : Exception + public class PopoutManagerException : Exception { public PopoutManagerException(string message) : base(message) { } } diff --git a/Shared/ObjectExtension.cs b/Shared/ObjectExtension.cs new file mode 100644 index 0000000..9e1b316 --- /dev/null +++ b/Shared/ObjectExtension.cs @@ -0,0 +1,131 @@ +using MSFSPopoutPanelManager.Shared.ArrayExtensions; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace MSFSPopoutPanelManager.Shared +{ + public static class ObjectExtensions + { + private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + + public static bool IsPrimitive(this Type type) + { + if (type == typeof(String)) return true; + return (type.IsValueType & type.IsPrimitive); + } + + public static Object Copy(this Object originalObject) + { + return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); + } + private static Object InternalCopy(Object originalObject, IDictionary visited) + { + if (originalObject == null) return null; + var typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) return originalObject; + if (visited.ContainsKey(originalObject)) return visited[originalObject]; + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; + var cloneObject = CloneMethod.Invoke(originalObject, null); + if (typeToReflect.IsArray) + { + var arrayType = typeToReflect.GetElementType(); + if (IsPrimitive(arrayType) == false) + { + Array clonedArray = (Array)cloneObject; + clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); + } + + } + visited.Add(originalObject, cloneObject); + CopyFields(originalObject, visited, cloneObject, typeToReflect); + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); + return cloneObject; + } + + private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + { + if (typeToReflect.BaseType != null) + { + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + } + } + + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) + { + foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + { + if (filter != null && filter(fieldInfo) == false) continue; + if (IsPrimitive(fieldInfo.FieldType)) continue; + var originalFieldValue = fieldInfo.GetValue(originalObject); + var clonedFieldValue = InternalCopy(originalFieldValue, visited); + fieldInfo.SetValue(cloneObject, clonedFieldValue); + } + } + public static T Copy(this T original) + { + return (T)Copy((Object)original); + } + } + + public class ReferenceEqualityComparer : EqualityComparer + { + public override bool Equals(object x, object y) + { + return ReferenceEquals(x, y); + } + public override int GetHashCode(object obj) + { + if (obj == null) return 0; + return obj.GetHashCode(); + } + } + + namespace ArrayExtensions + { + public static class ArrayExtensions + { + public static void ForEach(this Array array, Action action) + { + if (array.LongLength == 0) return; + ArrayTraverse walker = new ArrayTraverse(array); + do action(array, walker.Position); + while (walker.Step()); + } + } + + internal class ArrayTraverse + { + public int[] Position; + private int[] maxLengths; + + public ArrayTraverse(Array array) + { + maxLengths = new int[array.Rank]; + for (int i = 0; i < array.Rank; ++i) + { + maxLengths[i] = array.GetLength(i) - 1; + } + Position = new int[array.Rank]; + } + + public bool Step() + { + for (int i = 0; i < Position.Length; ++i) + { + if (Position[i] < maxLengths[i]) + { + Position[i]++; + for (int j = 0; j < i; j++) + { + Position[j] = 0; + } + return true; + } + } + return false; + } + } + } +} diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj new file mode 100644 index 0000000..f7c688b --- /dev/null +++ b/Shared/Shared.csproj @@ -0,0 +1,21 @@ + + + + net5.0-windows + MSFSPopoutPanelManager.Shared + MSFS 2020 Popout Panel Manager Shared + MSFS 2020 Popout Panel Manager Shared + Stanley Kwok + Stanley Kwok + Stanley Kwok 2021 + https://github.com/hawkeye-stan/msfs-popout-panel-manager + 3.2.0 + AnyCPU;x64 + true + + + + + + + diff --git a/Shared/UserProfileData.cs b/Shared/UserProfileData.cs deleted file mode 100644 index 528f79c..0000000 --- a/Shared/UserProfileData.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; - -namespace MSFSPopoutPanelManager.Shared -{ - public class UserProfileData - { - public UserProfileData() - { - PanelSourceCoordinates = new List(); - PanelConfigs = new List(); - IsLocked = false; - } - - public int ProfileId { get; set; } - - public string ProfileName { get; set; } - - public bool IsDefaultProfile { get; set; } - - public bool IsLocked { get; set; } - - public List PanelSourceCoordinates; - - public List PanelConfigs { get; set; } - - public void Reset() - { - PanelSourceCoordinates.Clear(); - PanelConfigs.Clear(); - IsLocked = false; - } - } - - public class PanelSourceCoordinate - { - public int PanelIndex { get; set; } - - public int X { get; set; } - - public int Y { get; set; } - } - - public class PanelConfig - { - public int PanelIndex { get; set; } - - public string PanelName { get; set; } - - public PanelType PanelType { get; set; } - - public int Top { get; set; } - - public int Left { get; set; } - - public int Width { get; set; } - - public int Height { get; set; } - - public bool AlwaysOnTop { get; set; } - - public bool HideTitlebar { get; set; } - - [JsonIgnore] - public IntPtr PanelHandle { get; set; } - } -} diff --git a/UI/AddProfileForm.Designer.cs b/UI/AddProfileForm.Designer.cs deleted file mode 100644 index ee8410d..0000000 --- a/UI/AddProfileForm.Designer.cs +++ /dev/null @@ -1,120 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class AddProfileForm - { - /// - /// 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() - { - this.darkLabel2 = new DarkUI.Controls.DarkLabel(); - this.textBoxProfileName = new DarkUI.Controls.DarkTextBox(); - this.buttonOK = new System.Windows.Forms.Button(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // darkLabel2 - // - this.darkLabel2.AutoSize = true; - this.darkLabel2.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.darkLabel2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.darkLabel2.Location = new System.Drawing.Point(33, 37); - this.darkLabel2.Name = "darkLabel2"; - this.darkLabel2.Size = new System.Drawing.Size(96, 20); - this.darkLabel2.TabIndex = 2; - this.darkLabel2.Text = "Profile Name"; - // - // textBoxProfileName - // - this.textBoxProfileName.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(69)))), ((int)(((byte)(73)))), ((int)(((byte)(74))))); - this.textBoxProfileName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.textBoxProfileName.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.textBoxProfileName.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.textBoxProfileName.Location = new System.Drawing.Point(177, 35); - this.textBoxProfileName.MaxLength = 50; - this.textBoxProfileName.Name = "textBoxProfileName"; - this.textBoxProfileName.Size = new System.Drawing.Size(356, 27); - this.textBoxProfileName.TabIndex = 3; - this.textBoxProfileName.TextChanged += new System.EventHandler(this.textBoxProfileName_TextChanged); - this.textBoxProfileName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBoxProfileName_KeyPress); - // - // buttonOK - // - this.buttonOK.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonOK.Enabled = false; - this.buttonOK.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonOK.ForeColor = System.Drawing.Color.White; - this.buttonOK.Location = new System.Drawing.Point(268, 119); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(118, 35); - this.buttonOK.TabIndex = 22; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = false; - this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // - // buttonCancel - // - this.buttonCancel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonCancel.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonCancel.ForeColor = System.Drawing.Color.White; - this.buttonCancel.Location = new System.Drawing.Point(410, 119); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(118, 35); - this.buttonCancel.TabIndex = 23; - this.buttonCancel.Text = "Cancel"; - this.buttonCancel.UseVisualStyleBackColor = false; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // AddProfileForm - // - this.AcceptButton = this.buttonOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonCancel; - this.ClientSize = new System.Drawing.Size(562, 173); - this.ControlBox = false; - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.textBoxProfileName); - this.Controls.Add(this.darkLabel2); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AddProfileForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Add Profile"; - this.TopMost = true; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - private DarkUI.Controls.DarkLabel darkLabel2; - private DarkUI.Controls.DarkTextBox textBoxProfileName; - private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.Button buttonCancel; - } -} \ No newline at end of file diff --git a/UI/AddProfileForm.cs b/UI/AddProfileForm.cs deleted file mode 100644 index 369800a..0000000 --- a/UI/AddProfileForm.cs +++ /dev/null @@ -1,42 +0,0 @@ -using DarkUI.Forms; -using MSFSPopoutPanelManager.UIController; -using System; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class AddProfileForm : DarkForm - { - public AddProfileForm() - { - InitializeComponent(); - } - - public string ProfileName { get { return textBoxProfileName.Text.Trim(); } } - - private void textBoxProfileName_KeyPress(object sender, KeyPressEventArgs e) - { - e.Handled = !(Char.IsLetterOrDigit(e.KeyChar) || - Char.IsPunctuation(e.KeyChar) || - e.KeyChar == (char)Keys.Space || - e.KeyChar == (char)Keys.Back); - } - - private void textBoxProfileName_TextChanged(object sender, EventArgs e) - { - buttonOK.Enabled = textBoxProfileName.Text.Trim().Length > 0; - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - - private void buttonOK_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - Close(); - } - } -} \ No newline at end of file diff --git a/UI/AddProfileForm.resx b/UI/AddProfileForm.resx deleted file mode 100644 index f298a7b..0000000 --- a/UI/AddProfileForm.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - \ No newline at end of file diff --git a/UI/ConfirmDialogForm.Designer.cs b/UI/ConfirmDialogForm.Designer.cs deleted file mode 100644 index e8bf432..0000000 --- a/UI/ConfirmDialogForm.Designer.cs +++ /dev/null @@ -1,119 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class ConfirmDialogForm - { - /// - /// 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() - { - this.buttonYes = new System.Windows.Forms.Button(); - this.buttonNo = new System.Windows.Forms.Button(); - this.labelMessage = new DarkUI.Controls.DarkLabel(); - this.buttonOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // buttonYes - // - this.buttonYes.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonYes.DialogResult = System.Windows.Forms.DialogResult.Yes; - this.buttonYes.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonYes.ForeColor = System.Drawing.Color.White; - this.buttonYes.Location = new System.Drawing.Point(268, 93); - this.buttonYes.Name = "buttonYes"; - this.buttonYes.Size = new System.Drawing.Size(118, 35); - this.buttonYes.TabIndex = 22; - this.buttonYes.Text = "Yes"; - this.buttonYes.UseVisualStyleBackColor = false; - this.buttonYes.Click += new System.EventHandler(this.buttonYes_Click); - // - // buttonNo - // - this.buttonNo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonNo.DialogResult = System.Windows.Forms.DialogResult.No; - this.buttonNo.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonNo.ForeColor = System.Drawing.Color.White; - this.buttonNo.Location = new System.Drawing.Point(410, 93); - this.buttonNo.Name = "buttonNo"; - this.buttonNo.Size = new System.Drawing.Size(118, 35); - this.buttonNo.TabIndex = 23; - this.buttonNo.Text = "No"; - this.buttonNo.UseVisualStyleBackColor = false; - this.buttonNo.Click += new System.EventHandler(this.buttonNo_Click); - // - // labelMessage - // - this.labelMessage.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.labelMessage.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.labelMessage.Location = new System.Drawing.Point(34, 25); - this.labelMessage.Name = "labelMessage"; - this.labelMessage.Size = new System.Drawing.Size(494, 65); - this.labelMessage.TabIndex = 2; - this.labelMessage.Text = "Message"; - // - // buttonOK - // - this.buttonOK.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; - this.buttonOK.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonOK.ForeColor = System.Drawing.Color.White; - this.buttonOK.Location = new System.Drawing.Point(410, 93); - this.buttonOK.Name = "buttonOK"; - this.buttonOK.Size = new System.Drawing.Size(118, 35); - this.buttonOK.TabIndex = 20; - this.buttonOK.Text = "OK"; - this.buttonOK.UseVisualStyleBackColor = false; - this.buttonOK.Visible = false; - // - // ConfirmDialogForm - // - this.AcceptButton = this.buttonYes; - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonNo; - this.ClientSize = new System.Drawing.Size(562, 140); - this.ControlBox = false; - this.Controls.Add(this.buttonOK); - this.Controls.Add(this.buttonNo); - this.Controls.Add(this.buttonYes); - this.Controls.Add(this.labelMessage); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "ConfirmDialogForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Title"; - this.TopMost = true; - this.ResumeLayout(false); - - } - - #endregion - private System.Windows.Forms.Button buttonYes; - private System.Windows.Forms.Button buttonNo; - private DarkUI.Controls.DarkLabel labelMessage; - private System.Windows.Forms.Button buttonOK; - } -} \ No newline at end of file diff --git a/UI/ConfirmDialogForm.cs b/UI/ConfirmDialogForm.cs deleted file mode 100644 index 5f9afde..0000000 --- a/UI/ConfirmDialogForm.cs +++ /dev/null @@ -1,30 +0,0 @@ -using DarkUI.Forms; -using System; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class ConfirmDialogForm : DarkForm - { - public ConfirmDialogForm(string title, string Message, bool cancellable = true) - { - InitializeComponent(); - Text = title; - labelMessage.Text = Message; - - buttonYes.Visible = cancellable; - buttonNo.Visible = cancellable; - buttonOK.Visible = !cancellable; - } - - private void buttonYes_Click(object sender, EventArgs e) - { - Close(); - } - - private void buttonNo_Click(object sender, EventArgs e) - { - Close(); - } - } -} \ No newline at end of file diff --git a/UI/ConfirmDialogForm.resx b/UI/ConfirmDialogForm.resx deleted file mode 100644 index f298a7b..0000000 --- a/UI/ConfirmDialogForm.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - \ No newline at end of file diff --git a/UI/PopoutCoorOverlayForm.Designer.cs b/UI/PopoutCoorOverlayForm.Designer.cs deleted file mode 100644 index 0f8e65a..0000000 --- a/UI/PopoutCoorOverlayForm.Designer.cs +++ /dev/null @@ -1,78 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class PopoutCoorOverlayForm - { - /// - /// 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(PopoutCoorOverlayForm)); - this.lblPanelIndex = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // lblPanelIndex - // - this.lblPanelIndex.BackColor = System.Drawing.Color.Transparent; - this.lblPanelIndex.CausesValidation = false; - this.lblPanelIndex.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.lblPanelIndex.ForeColor = System.Drawing.Color.WhiteSmoke; - this.lblPanelIndex.Image = ((System.Drawing.Image)(resources.GetObject("lblPanelIndex.Image"))); - this.lblPanelIndex.Location = new System.Drawing.Point(0, 0); - this.lblPanelIndex.Margin = new System.Windows.Forms.Padding(0); - this.lblPanelIndex.Name = "lblPanelIndex"; - this.lblPanelIndex.Size = new System.Drawing.Size(55, 46); - this.lblPanelIndex.TabIndex = 0; - this.lblPanelIndex.Text = "1"; - this.lblPanelIndex.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // PopoutCoorOverlayForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CausesValidation = false; - this.ClientSize = new System.Drawing.Size(55, 46); - this.ControlBox = false; - this.Controls.Add(this.lblPanelIndex); - this.DoubleBuffered = true; - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PopoutCoorOverlayForm"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.Text = "PopoutCoorOverlay"; - this.TopMost = true; - this.TransparencyKey = System.Drawing.SystemColors.Control; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Label lblPanelIndex; - } -} \ No newline at end of file diff --git a/UI/PopoutCoorOverlayForm.cs b/UI/PopoutCoorOverlayForm.cs deleted file mode 100644 index c8ee971..0000000 --- a/UI/PopoutCoorOverlayForm.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class PopoutCoorOverlayForm : Form - { - public PopoutCoorOverlayForm() - { - InitializeComponent(); - } - } -} diff --git a/UI/PopoutCoorOverlayForm.resx b/UI/PopoutCoorOverlayForm.resx deleted file mode 100644 index 56e31b5..0000000 --- a/UI/PopoutCoorOverlayForm.resx +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - iVBORw0KGgoAAAANSUhEUgAAAD4AAAAsCAYAAAA93wvUAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EAAACxABrSO9dQAAAyRJREFUaEPl2s2uDEEYxvFDsLD0sRNrzo5EENyGzy0W3ABXwA0I1iQsbIRICDfB - mgVnhWPnOzKefzJvclJ5+nRXdfX00G/ySyZvvVNVx4zuqqlemc1mk2STU2CTU2CTFWyVo3JNHslrWZcf - c7wmRxs11PIe19cgbLKHfXJD3ktu8B7eSx+u76psssBuuSU/JeKt3JYLclio2THHa3K0UfNOIuiDvqhx - Y1Vhk5lOyych/shDOS6utskWOSkPhD4I+jwjrr43m+xom/BpRbySVXG1OeiDviIYg7FcbTGb7GCnPBHi - u1wVV9fHFaFvgrEY09UVsckW/Os/FuKzcEV2dTXQN2MQjFntk7fJFneE+CgHxNXUxBiMRTC2q8lmk5vg - YkN8kyE/6RRjfRXinLiaLDbZgNtLXL0vi6sZEmMSLH72iqvpzCYbxBX8hbj2RYirfe+vvE0a++WX/JaD - 89wYGJs5MBfm5Go6sUmDpSRxT1z7It0Xgjm59k5sMsHm4YMQJ8TVLNIpIZhT8cbGJhNcUQnW0ywtXc0i - MYdY2xffWWwycV2IavfQCmItwZbWtbeyyQR7ZoKdlGsfA3MhmJtrb2WTiTdCHBLXPgbmQjA3197KJhOx - Vh50f5yJuRDMzbW3sslE/LjADwiufQzMhWBurr2VTSYm+4cv41d9lxCDftUne3Gb7O0sFjDszlz7GGKn - OOgC5pgQk1uyLtsmhTkQg29SsEzbUn57JwbfloJjHe6Zy/BDBAcOzKXXUZNNNuBYh3gurn0RXgrR+0Jr - kw1YwMRi5pK4miExJsEcei+mbHITZ4Xgp96xfl4+L64mi022GPNA4a64mmw22YINwsYjpCPi6mqg7/jv - xZjVNko22QEHeM+E4GDvori6PuiTExviqYx+aBi2S3ztCa64NY6JuWXF1ZtgDMZytcVsMhMXvI0PBrDA - KHkwgBVZ+mBAlXMyxyYL7BHurfGjBRGPgnAVZhvJLYhPDrwmRxs16aMg5OjTjVWFTfbAauqmrElu8B7e - +089/JNi88C9ly0te2Ye7foinHmB1/G4FzXUFm84Stjk/2+28hdDyseyXx6hNQAAAABJRU5ErkJggg== - - - \ No newline at end of file diff --git a/UI/StartupForm.Designer.cs b/UI/StartupForm.Designer.cs deleted file mode 100644 index f5b4284..0000000 --- a/UI/StartupForm.Designer.cs +++ /dev/null @@ -1,354 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class StartupForm - { - /// - /// 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() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StartupForm)); - this.panelSteps = new System.Windows.Forms.Panel(); - this.labelMsfsConnection = new System.Windows.Forms.Label(); - this.panelStatus = new System.Windows.Forms.Panel(); - this.darkLabel3 = new DarkUI.Controls.DarkLabel(); - this.txtBoxStatus = new DarkUI.Controls.DarkTextBox(); - this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); - this.lblVersion = new DarkUI.Controls.DarkLabel(); - this.darkMenuStrip1 = new DarkUI.Controls.DarkMenuStrip(); - this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_restart = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_alwaysOnTop = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_autoPanning = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_autoStart = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_minimizeToSystemTray = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.menuItem_exit = new System.Windows.Forms.ToolStripMenuItem(); - this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_minimizeAllPanels = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_help = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_userGuide = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItem_downloadLatestRelease = new System.Windows.Forms.ToolStripMenuItem(); - this.panelStatus.SuspendLayout(); - this.darkMenuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // panelSteps - // - this.panelSteps.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(61)))), ((int)(((byte)(101)))), ((int)(((byte)(171))))); - this.panelSteps.Location = new System.Drawing.Point(0, 30); - this.panelSteps.Name = "panelSteps"; - this.panelSteps.Size = new System.Drawing.Size(915, 405); - this.panelSteps.TabIndex = 0; - // - // labelMsfsConnection - // - this.labelMsfsConnection.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelMsfsConnection.AutoSize = true; - this.labelMsfsConnection.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.labelMsfsConnection.ForeColor = System.Drawing.Color.Red; - this.labelMsfsConnection.Location = new System.Drawing.Point(763, 511); - this.labelMsfsConnection.Name = "labelMsfsConnection"; - this.labelMsfsConnection.RightToLeft = System.Windows.Forms.RightToLeft.Yes; - this.labelMsfsConnection.Size = new System.Drawing.Size(33, 20); - this.labelMsfsConnection.TabIndex = 10; - this.labelMsfsConnection.Text = " "; - this.labelMsfsConnection.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // panelStatus - // - this.panelStatus.Controls.Add(this.darkLabel3); - this.panelStatus.Controls.Add(this.txtBoxStatus); - this.panelStatus.Location = new System.Drawing.Point(0, 435); - this.panelStatus.Name = "panelStatus"; - this.panelStatus.Size = new System.Drawing.Size(915, 74); - this.panelStatus.TabIndex = 20; - // - // darkLabel3 - // - this.darkLabel3.AutoSize = true; - this.darkLabel3.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.darkLabel3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.darkLabel3.Location = new System.Drawing.Point(12, 16); - this.darkLabel3.Name = "darkLabel3"; - this.darkLabel3.Size = new System.Drawing.Size(49, 20); - this.darkLabel3.TabIndex = 24; - this.darkLabel3.Text = "Status"; - // - // txtBoxStatus - // - this.txtBoxStatus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(69)))), ((int)(((byte)(73)))), ((int)(((byte)(74))))); - this.txtBoxStatus.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.txtBoxStatus.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.txtBoxStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.txtBoxStatus.Location = new System.Drawing.Point(67, 16); - this.txtBoxStatus.Multiline = true; - this.txtBoxStatus.Name = "txtBoxStatus"; - this.txtBoxStatus.ReadOnly = true; - this.txtBoxStatus.Size = new System.Drawing.Size(835, 46); - this.txtBoxStatus.TabIndex = 23; - // - // notifyIcon1 - // - this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); - this.notifyIcon1.Text = "MSFS 2020 Pop Out Panel Manager"; - this.notifyIcon1.Visible = true; - this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); - // - // lblVersion - // - this.lblVersion.AutoSize = true; - this.lblVersion.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.lblVersion.Location = new System.Drawing.Point(423, 520); - this.lblVersion.Name = "lblVersion"; - this.lblVersion.Size = new System.Drawing.Size(48, 15); - this.lblVersion.TabIndex = 24; - this.lblVersion.Text = "Version "; - // - // darkMenuStrip1 - // - this.darkMenuStrip1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.darkMenuStrip1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.darkMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.fileToolStripMenuItem, - this.viewToolStripMenuItem, - this.menuItem_help}); - this.darkMenuStrip1.Location = new System.Drawing.Point(0, 0); - this.darkMenuStrip1.Name = "darkMenuStrip1"; - this.darkMenuStrip1.Padding = new System.Windows.Forms.Padding(3, 2, 0, 2); - this.darkMenuStrip1.Size = new System.Drawing.Size(914, 28); - this.darkMenuStrip1.TabIndex = 29; - this.darkMenuStrip1.Text = "darkMenuStrip1"; - // - // fileToolStripMenuItem - // - this.fileToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItem_restart, - this.toolStripSeparator1, - this.preferencesToolStripMenuItem, - this.toolStripSeparator2, - this.menuItem_exit}); - this.fileToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(44, 24); - this.fileToolStripMenuItem.Text = "File"; - // - // menuItem_restart - // - this.menuItem_restart.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_restart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_restart.Name = "menuItem_restart"; - this.menuItem_restart.Size = new System.Drawing.Size(154, 24); - this.menuItem_restart.Text = "Restart"; - // - // toolStripSeparator1 - // - this.toolStripSeparator1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.toolStripSeparator1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.toolStripSeparator1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(151, 6); - // - // preferencesToolStripMenuItem - // - this.preferencesToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.preferencesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItem_alwaysOnTop, - this.menuItem_autoPanning, - this.menuItem_autoStart, - this.menuItem_minimizeToSystemTray}); - this.preferencesToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; - this.preferencesToolStripMenuItem.Size = new System.Drawing.Size(154, 24); - this.preferencesToolStripMenuItem.Text = "Preferences"; - // - // menuItem_alwaysOnTop - // - this.menuItem_alwaysOnTop.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_alwaysOnTop.CheckOnClick = true; - this.menuItem_alwaysOnTop.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_alwaysOnTop.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; - this.menuItem_alwaysOnTop.Name = "menuItem_alwaysOnTop"; - this.menuItem_alwaysOnTop.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.T))); - this.menuItem_alwaysOnTop.Size = new System.Drawing.Size(256, 24); - this.menuItem_alwaysOnTop.Text = "Always on Top "; - this.menuItem_alwaysOnTop.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; - // - // menuItem_autoPanning - // - this.menuItem_autoPanning.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_autoPanning.CheckOnClick = true; - this.menuItem_autoPanning.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_autoPanning.Name = "menuItem_autoPanning"; - this.menuItem_autoPanning.Size = new System.Drawing.Size(256, 24); - this.menuItem_autoPanning.Text = "Auto Panning"; - // - // menuItem_autoStart - // - this.menuItem_autoStart.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_autoStart.CheckOnClick = true; - this.menuItem_autoStart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_autoStart.Name = "menuItem_autoStart"; - this.menuItem_autoStart.Size = new System.Drawing.Size(256, 24); - this.menuItem_autoStart.Text = "Auto Start"; - // - // menuItem_minimizeToSystemTray - // - this.menuItem_minimizeToSystemTray.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_minimizeToSystemTray.CheckOnClick = true; - this.menuItem_minimizeToSystemTray.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_minimizeToSystemTray.Name = "menuItem_minimizeToSystemTray"; - this.menuItem_minimizeToSystemTray.Size = new System.Drawing.Size(256, 24); - this.menuItem_minimizeToSystemTray.Text = "Minimize to Tray"; - // - // toolStripSeparator2 - // - this.toolStripSeparator2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.toolStripSeparator2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.toolStripSeparator2.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(151, 6); - // - // menuItem_exit - // - this.menuItem_exit.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_exit.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_exit.Name = "menuItem_exit"; - this.menuItem_exit.Size = new System.Drawing.Size(154, 24); - this.menuItem_exit.Text = "Exit"; - // - // viewToolStripMenuItem - // - this.viewToolStripMenuItem.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItem_minimizeAllPanels}); - this.viewToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.viewToolStripMenuItem.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; - this.viewToolStripMenuItem.Size = new System.Drawing.Size(122, 24); - this.viewToolStripMenuItem.Text = "View"; - // - // menuItem_minimizeAllPanels - // - this.menuItem_minimizeAllPanels.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_minimizeAllPanels.CheckOnClick = true; - this.menuItem_minimizeAllPanels.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_minimizeAllPanels.Name = "menuItem_minimizeAllPanels"; - this.menuItem_minimizeAllPanels.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.M))); - this.menuItem_minimizeAllPanels.Size = new System.Drawing.Size(281, 24); - this.menuItem_minimizeAllPanels.Text = "Minimize All Panels "; - // - // menuItem_help - // - this.menuItem_help.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_help.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItem_userGuide, - this.menuItem_downloadLatestRelease}); - this.menuItem_help.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.menuItem_help.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_help.Name = "menuItem_help"; - this.menuItem_help.Size = new System.Drawing.Size(53, 24); - this.menuItem_help.Text = "Help"; - // - // menuItem_userGuide - // - this.menuItem_userGuide.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_userGuide.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.menuItem_userGuide.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_userGuide.Name = "menuItem_userGuide"; - this.menuItem_userGuide.Size = new System.Drawing.Size(245, 24); - this.menuItem_userGuide.Text = "User Guide"; - this.menuItem_userGuide.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; - // - // menuItem_downloadLatestRelease - // - this.menuItem_downloadLatestRelease.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(63)))), ((int)(((byte)(65))))); - this.menuItem_downloadLatestRelease.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(220)))), ((int)(((byte)(220))))); - this.menuItem_downloadLatestRelease.Name = "menuItem_downloadLatestRelease"; - this.menuItem_downloadLatestRelease.Size = new System.Drawing.Size(245, 24); - this.menuItem_downloadLatestRelease.Text = "Download Latest Release"; - // - // StartupForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(914, 540); - this.Controls.Add(this.lblVersion); - this.Controls.Add(this.labelMsfsConnection); - this.Controls.Add(this.panelStatus); - this.Controls.Add(this.panelSteps); - this.Controls.Add(this.darkMenuStrip1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MainMenuStrip = this.darkMenuStrip1; - this.MaximizeBox = false; - this.Name = "StartupForm"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.Text = "MSFS Pop Out Panel Manager"; - this.Load += new System.EventHandler(this.StartupForm_Load); - this.Resize += new System.EventHandler(this.StartupForm_Resize); - this.panelStatus.ResumeLayout(false); - this.panelStatus.PerformLayout(); - this.darkMenuStrip1.ResumeLayout(false); - this.darkMenuStrip1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Panel panelSteps; - private System.Windows.Forms.Label labelMsfsConnection; - private System.Windows.Forms.Panel panelStatus; - private System.Windows.Forms.NotifyIcon notifyIcon1; - private DarkUI.Controls.DarkTextBox txtBoxStatus; - private DarkUI.Controls.DarkLabel lblVersion; - private DarkUI.Controls.DarkLabel darkLabel3; - private DarkUI.Controls.DarkMenuStrip darkMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem menuItem_exit; - private System.Windows.Forms.ToolStripMenuItem menuItem_autoStart; - private System.Windows.Forms.ToolStripMenuItem menuItem_alwaysOnTop; - private System.Windows.Forms.ToolStripMenuItem menuItem_autoPanning; - private System.Windows.Forms.ToolStripMenuItem menuItem_minimizeToSystemTray; - private System.Windows.Forms.ToolStripMenuItem menuItem_help; - private System.Windows.Forms.ToolStripMenuItem menuItem_userGuide; - private System.Windows.Forms.ToolStripMenuItem menuItem_downloadLatestRelease; - private System.Windows.Forms.ToolStripMenuItem menuItem_restart; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem menuItem_minimizeAllPanels; - } -} \ No newline at end of file diff --git a/UI/StartupForm.cs b/UI/StartupForm.cs deleted file mode 100644 index d9ecbb6..0000000 --- a/UI/StartupForm.cs +++ /dev/null @@ -1,213 +0,0 @@ -using DarkUI.Forms; -using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UIController; -using System; -using System.Diagnostics; -using System.Drawing; -using System.Threading; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class StartupForm : DarkForm, IApplicationView - { - private Color ERROR_MESSAGE_COLOR = Color.FromArgb(1, 255, 71, 71); - private Color SUCCESS_MESSAGE_COLOR = Color.LightGreen; - private Color INFO_MESSAGE_COLOR = Color.White; - - private SynchronizationContext _syncRoot; - private UserControlPanelSelection _ucPanelSelection; - private UserControlPanelConfiguration _ucPanelConfiguration; - - private ApplicationController _controller; - - public StartupForm() - { - InitializeComponent(); - - _ucPanelSelection = new UserControlPanelSelection(); - _ucPanelConfiguration = new UserControlPanelConfiguration(); - panelSteps.Controls.Add(_ucPanelSelection); - panelSteps.Controls.Add(_ucPanelConfiguration); - - _syncRoot = SynchronizationContext.Current; - - // Set version number - lblVersion.Text += $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Major}.{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Minor}.{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build}"; - - Logger.OnStatusLogged += Logger_OnStatusLogged; - Logger.OnBackgroundStatusLogged += Logger_OnBackgroundStatusLogged; - - _controller = new ApplicationController(this); - _controller.OnSimConnectionChanged += HandleSimConnectionChanged; - _controller.OnPanelSelectionActivated += HandleShowPanelSelection; - _controller.OnPanelConfigurationActivated += HandleShowPanelConfiguration; - _controller.Initialize(); - _ucPanelSelection.Initialize(_controller.PanelSelectionController); - _ucPanelConfiguration.Initialize(_controller.PanelConfigurationController); - - menuItem_restart.Click += HandleMenuClicked; - menuItem_exit.Click += HandleMenuClicked; - menuItem_alwaysOnTop.Click += HandleMenuClicked; - menuItem_autoPanning.Click += HandleMenuClicked; - menuItem_autoStart.Click += HandleMenuClicked; - menuItem_minimizeToSystemTray.Click += HandleMenuClicked; - menuItem_minimizeAllPanels.Click += HandleMenuClicked; - menuItem_userGuide.Click += HandleMenuClicked; - menuItem_downloadLatestRelease.Click += HandleMenuClicked; - } - - #region Implement view interface - - public Form Form { get => this; } - - public IPanelSelectionView PanelSelection { get => _ucPanelSelection; } - - public IPanelConfigurationView PanelConfiguration { get => _ucPanelConfiguration; } - - public bool MinimizeToTray { get => menuItem_minimizeToSystemTray.Checked; set => menuItem_minimizeToSystemTray.Checked = value; } - - public bool AlwaysOnTop { get => menuItem_alwaysOnTop.Checked; set => menuItem_alwaysOnTop.Checked = value; } - - public bool AutoStart { get => menuItem_autoStart.Checked; set => menuItem_autoStart.Checked = value; } - - public bool AutoPanning { get => menuItem_autoPanning.Checked; set => menuItem_autoPanning.Checked = value; } - - #endregion - - private void StartupForm_Load(object sender, EventArgs e) - { - notifyIcon1.BalloonTipText = "Application Minimized"; - notifyIcon1.BalloonTipTitle = "MSFS 2020 Pop Out Panel Manager"; - } - - private void StartupForm_Resize(object sender, EventArgs e) - { - if (WindowState == FormWindowState.Minimized) - { - if (menuItem_minimizeToSystemTray.Checked) - { - ShowInTaskbar = false; - notifyIcon1.Visible = true; - notifyIcon1.ShowBalloonTip(1000); - } - } - } - - private void notifyIcon1_DoubleClick(object sender, EventArgs e) - { - ShowInTaskbar = true; - notifyIcon1.Visible = false; - WindowState = FormWindowState.Normal; - } - - private void HandleSimConnectionChanged(object sender, EventArgs e) - { - _syncRoot.Post((arg) => - { - var connected = Convert.ToBoolean(arg); - if (connected) - { - labelMsfsConnection.ForeColor = SUCCESS_MESSAGE_COLOR; - labelMsfsConnection.Text = "MSFS Connected"; - } - else - { - labelMsfsConnection.ForeColor = ERROR_MESSAGE_COLOR; - labelMsfsConnection.Text = "MSFS Disconnected"; - } - }, e.Value); - } - - private void Logger_OnStatusLogged(object sender, EventArgs e) - { - if (e != null) - { - txtBoxStatus.ForeColor = e.Value.MessageType == StatusMessageType.Info ? INFO_MESSAGE_COLOR : ERROR_MESSAGE_COLOR; - txtBoxStatus.Text = e.Value.Message; - this.ActiveControl = this.panelStatus; - } - - if (e.Value.MessageType == StatusMessageType.Error) - PInvoke.SetForegroundWindow(Handle); - } - - private void Logger_OnBackgroundStatusLogged(object sender, EventArgs e) - { - _syncRoot.Post((arg) => - { - var statusMessage = arg as StatusMessage; - if (statusMessage != null) - { - txtBoxStatus.ForeColor = statusMessage.MessageType == StatusMessageType.Info ? INFO_MESSAGE_COLOR : ERROR_MESSAGE_COLOR; - txtBoxStatus.Text = statusMessage.Message; - this.ActiveControl = this.panelStatus; - } - - if (e.Value.MessageType == StatusMessageType.Error) - PInvoke.SetForegroundWindow(Handle); - }, e.Value); - } - - private void HandleMenuClicked(object sender, EventArgs e) - { - var itemName = ((ToolStripMenuItem)sender).Name; - - switch (itemName) - { - case nameof(menuItem_restart): - _controller.Restart(); - break; - case nameof(menuItem_exit): - Application.Exit(); - break; - case nameof(menuItem_alwaysOnTop): - _controller.SetAlwaysOnTop(menuItem_alwaysOnTop.Checked); - break; - case nameof(menuItem_autoPanning): - _controller.SetAutoPanning(menuItem_autoPanning.Checked); - break; - case nameof(menuItem_autoStart): - _controller.SetAutoStart(menuItem_autoStart.Checked); - break; - case nameof(menuItem_minimizeToSystemTray): - _controller.SetMinimizeToTray(menuItem_minimizeToSystemTray.Checked); - break; - case nameof(menuItem_minimizeAllPanels): - _controller.MinimizeAllPanels(menuItem_minimizeAllPanels.Checked); - break; - case nameof(menuItem_userGuide): - Process.Start(new ProcessStartInfo("https://github.com/hawkeye-stan/msfs-popout-panel-manager#msfs-pop-out-panel-manager") { UseShellExecute = true }); - return; - case nameof(menuItem_downloadLatestRelease): - Process.Start(new ProcessStartInfo("https://github.com/hawkeye-stan/msfs-popout-panel-manager/releases") { UseShellExecute = true }); - return; - } - } - - private void HandleShowPanelSelection(object sender, EventArgs e) - { - if (_ucPanelSelection != null && _ucPanelConfiguration != null) - { - _ucPanelSelection.Visible = true; - _ucPanelConfiguration.Visible = false; - - menuItem_restart.Enabled = false; - menuItem_minimizeAllPanels.Checked = false; - menuItem_minimizeAllPanels.Enabled = false; - } - } - - private void HandleShowPanelConfiguration(object sender, EventArgs e) - { - if (_ucPanelSelection != null && _ucPanelConfiguration != null) - { - _ucPanelSelection.Visible = false; - _ucPanelConfiguration.Visible = true; - - menuItem_restart.Enabled = true; - menuItem_minimizeAllPanels.Enabled = true; - } - } - } -} \ No newline at end of file diff --git a/UI/StartupForm.resx b/UI/StartupForm.resx deleted file mode 100644 index 532f7aa..0000000 --- a/UI/StartupForm.resx +++ /dev/null @@ -1,2331 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - - - - - AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAHudAAB7nQAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrAOvr6wDr6+sA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADr6+sA5+fnAOjo - 6ADq6uoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj4+MA6+vrAO3t - 7QDt7e0A6+vrA+vr6wTr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sE6+vrAevr6wDr6+sA6+vrAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr6wDr6+sA6+vrAOvr6wLs7OwA7OzsAOvr6wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrAOvr - 6wDr6+sC6+vrAevr6wDr6+sA7u7uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu7u4A6urqAPT0 - 9ADq6uoC6urqAOvr60Lr6+uZ6+vrquvr66jr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+uk6+vrZuvr6wnr6+sA6+vrAezs7ADs7OwAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrq6gDr6+sA6+vrAuvr6wDr6+uD6+vr/+vr6/7r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/3r6+v/6+vrxevr6w/r6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr - 6wPr6+sA6+vrROvr6//r6+v86+vr++vr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86urq/Orq6vzq6ur86urq/Orq6vzq6ur86urq/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr++vr6/jr6+v/6+vrkevr6wDr6+sD7e3tAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA6+vrBOvr6wDr6+uW6+vr/+vr6/vr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/t7u7/7u7v/+7u - 7//u7u//7u7v/+7u7//u7u//6+vr/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/evr6//r6+ve6+vrB+vr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66rr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/s7O3/7u/w/+Hg3f/d29f/3dzY/93c2P/d3Nj/3dzX/9/e2//t7e7/7e3u/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+3r6+sQ6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqOvr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+np6P+wq5n/k4xx/5KL - cf+Si3H/kotx/5KLcf+Si3H/kotx/6iijv/j4+H/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xDr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/6enp/+rq - 6v/r6+v/6+vr/+rq6f/x8fP/vLmr/4d/Yf+Rim//kYpv/5GKbv+Rim7/kYpu/5GKbv+Si3D/h4Bi/6+r - mf/w8PL/6urq/+vr6//r6+v/6urq/+np6f/q6en/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEOvr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//q6ur/7Ozs//Hy8//y8vX/7+/w/+rq6v/r6+v/6urq/+/v8P+noo7/jYZq/5KM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+PiGz/nZeA/+np6f/s7Oz/6+vr/+rq6v/u7u//8vL0//Hy - 9P/s7e3/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp/+3u7v/p6en/xsS4/7y4 - qv/Y1tD/8PDy/+rq6v/q6ur/7u7v/6eijv+MhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46H - a/+dl4D/6Ojn/+zs7P/p6en/8PDy/93c2P++uq3/wr+z/+Xl4//v7/D/6unp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/u7u//5+fm/6Sfiv+JgmT/i4Nm/46Ha//GxLn/8vL0/+no6P/x8fP/qaSQ/4yF - aP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/56Ygf/s7Oz/6urp//Hy8//S0Mj/kotx/4qD - Zv+KgmX/nJV+/+Df2//v8PH/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/7u7v/+fn5v+inYf/i4Rn/5OM - cv+TjHL/kYpv/4yFaP/Gw7j/8vP1/+Pj4P+gmoT/jodr/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GL - cP+PiG3/mZJ5/9va1f/z9Pb/0c/H/5CJbv+PiGz/k4xy/5OMcv+NhWn/mZN7/+Df3P/v8PH/6enp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6f/q6un/6urp/+rq6f/q6un/6urp/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//o5+b/op2H/4uEZ/+TjHL/kYpv/5GKb/+Si3D/kIlu/5CJbv+sqJX/lpB2/4+I - bP+RinD/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+QiW3/k4xy/62olf+UjnT/j4ds/5KL - cP+Rim//kYpv/5OMcf+Nhmr/mpN7/+Df3P/v8PH/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v8PH/8fHz//Hx - 8//x8fP/8fHz//Hx8//x8fP/7u/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/t7e3/5+fl/6Odh/+LhGf/k4xx/5GK - b/+Rim//kYpv/5GKb/+RinD/kYpv/4yEaP+QiW3/kYpw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+QiW7/jIRo/5CJbv+Si3D/kYpv/5GKb/+Rim//kYpv/5OMcf+Nhmr/mZN6/+Df - 2//u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//s7Oz/7e3u/9XTzf/KyL7/y8m//8vJv//Lyb//y8m//8vIv//b2dT/7+/w/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vq/+3u7v+qpZH/ioJl/5OMcv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/5GK - cP+Rim//kYpv/5KLcP+Si3H/koxx/5KMcf+SjHH/kotx/5KLcP+Rim//kYpv/5GKb/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5OMcf+MhWj/n5mC/+np6P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+zt7f+yrpz/i4Rn/4yF - aP+MhWj/jIRo/4yEaP+MhWj/jIVo/46Gav/CvrL/7/Dx/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7/D/3NrW/5CJbv+Si3D/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/j4ds/4yEaP+Kg2b/ioNm/4qD - Zv+LhGf/jodr/5GLcP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5OM - cf+MhWj/0c/H//Dx8v/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/w8PL/0M7G/4qCZf+Si3H/kotx/5KLcf+Si3H/kotx/5KLcf+TjHH/kIht/5GK - b//g39z/7u7u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//f3tr/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - cP+Si3D/jIVp/42Faf+clX7/rqmX/7u3qf/AvbD/vbmr/7Gsm/+fmYL/jodr/4yEaP+Si3D/kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/4yFaP/U0sv/8PDx/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/q6ur/7Ozt/+vr6//q6ur/6+vr/+vr6//r6+v/6unp//Hy9P/DwLT/i4Rn/5OM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/9XTzP/w8PH/6urq/+vr6//r6+v/6+vr/+rq - 6f/s7Oz/7Ozs/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+/v8f+1saH/iYJk/5OM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/kIlu/4yFaP+oo4//0c/H/+jo5//w8PL/8fL0//Ly - 9P/x8vT/8PHy/+rq6v/W1c7/rqqX/46Gav+PiGz/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5OM - cv+Kg2b/qaSR/+zs7f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7e3t/+/v8f/m5uT/6+vs/+/w - 8f/q6un/6+vr/+vr6//q6en/8fL0/8TBtf+LhGf/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+Oh2v/1dTN//Dw8f/q6ur/6+vr/+vr6//q6ur/8PDy/+np6P/n5+b/8PDy/+vr6//q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vs/+3t7v+vq5n/ioJl/5KLcP+Rim//kYpv/5GKb/+Rim//kotw/4+H - bP+TjHH/yca8/+/v8P/w8fL/7Ozs/+rq6v/q6en/6enp/+rp6f/q6un/6+vr/+/w8f/x8fP/0tDI/5iS - ef+Nhmr/kotx/5GKb/+Rim//kYpv/5GKb/+Si3H/i4Nm/6Wfiv/o6Of/7e3t/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urp/+7u7//m5uT/r6qY/5iReP+gmoT/0tDI//Hx8//p6en/6+vr/+np6P/w8PL/w8C0/4uE - Z/+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46Ha//U08z/7+/w/+rq6v/r6+v/6urq//Dw - 8v/Fwrf/m5V9/5mTev+6tqj/7e3t/+zs7P/q6ur/6+vr/+vr6//r6+v/6+vr/+vq6v/q6un/6+vr/+3t - 7v+xrZv/joZq/5KLcP+Rim//kYpv/5KLcP+PiGz/lo91/9nY0v/y8/X/6urq/+rq6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+rp6f/x8vP/4uHf/52XgP+Nhmr/kotx/5GKb/+Rim//kotw/46H - a/+noY3/6Ojn/+3t7f/p6en/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/u7u//5+bl/6Gchv+JgmT/kIlu/42F - af+Oh2v/zszD//Ly9P/p6ej/7Ozs//j5/P/Gw7j/i4Nm/5KMcf+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jYZq/9rZ1P/09ff/6eno/+rq6f/x8vT/v7uu/4qDZv+Oh2v/kIht/4mBZP+vq5n/7u7v/+zs - 7P/q6ur/6+vr/+vr6v/q6ur/7e7u/+7v8P/s7O3/9fX4/8rHvv+LhGf/kotx/5GKb/+Rim//kYpv/5CJ - bv/W1M7/8vL0/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np - 6P/w8PH/4N/c/5aPdv+PiG3/kotw/5GKb/+SjHH/i4Nm/7y4qv/19vn/7Ozs/+7v8P/u7u//6+vr/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6un/7u7v/+bm5f+hm4X/jIRo/5OMcv+Rim//koxx/5CJbv+Ph2z/zsvD//P09//h4N3/xMG1/5+Z - g/+PiGz/kYtw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+PiGz/sa2b/9rY0//u7u//8vP1/766 - rf+Lg2f/kotw/5KLcP+Si3D/k4xy/4qDZv+vq5n/7u7v/+zs7P/q6un/7Ozt/+7v8P/h4N3/3dvX/93c - 2P/e3dr/oJuE/42Gav+Si3D/kYpv/5KLcf+Lg2f/v7yu//Lz9f/p6ej/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6P/y8vT/zMrA/4yFaP+Si3D/kYpv/5GK - cP+PiGz/mJF4/9nY0v/e3dn/3dvX/9/e2//t7e7/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//m5uX/oZuF/4yEaP+TjHH/kYpv/5GK - b/+Rim//kotw/4+Ibf+TjHL/sKya/5aPdf+KgmX/jodr/5GKcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKcP+MhWj/jodr/62olf+3s6T/jIVp/5GKcP+Rim//kYpv/5GKb/+Rim//k4xx/4qD - Zv+vq5n/7e3u/+3t7f/o6Of/sKuZ/5OMcf+Si3H/kotx/5KLcP+QiW7/kYpv/5GKb/+Si3D/jods/5yW - fv/p6ej/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/u7u//pqGM/42Faf+Si3D/kYpv/5GKb/+QiW7/kYpv/5OMcf+Si3H/kotx/6ii - jv/j4+H/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6v/s7O3/5+fm/6Kchv+MhGf/k4xx/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GKb/+LhGf/kIlt/5OM - cf+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+Rim//jIVo/4yE - aP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xx/4qCZf+vq5n/8/T2/7y4qv+Hf2H/kYpv/5GK - b/+Rim7/kYpv/5GKb/+Rim//kYpv/5KMcf+Lg2b/vruu//Hy9P/p6en/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6unp//Hx8//Lyb//jIRo/5KL - cf+Rim//kYpv/5GKb/+Rim//kYlu/5GKbv+Si3D/h4Bi/6+rmf/w8PL/6urq/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp//Hx8/+6tqf/iYFk/5ONcv+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+RinD/kYpv/5GKb/+Si3D/kotx/5KLcf+RinD/kYpv/5GK - b/+Si3D/kotx/5KLcf+RinD/kYpv/5GKb/+Si3D/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//k4xx/4mBZP/Rzsf/rKiV/4yEaP+SjHH/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5CI - bf/Z2NL/7+/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6ur/7e3u/+Pi3/+Wj3X/kIlt/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+PiGz/nZeA/+np6f/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7/Dx/6ijj/+Nhmr/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/kotx/4+HbP+Lg2f/i4Rn/4+HbP+Ri3D/kYpv/46Ha/+LhGf/i4Rn/5CIbf+Si3H/kYtw/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+TjHH/ioNm/767rf+uqpj/i4Nm/5KL - cP+Rim//kYpv/5GKb/+Rim//kYpv/5GLcP+PiGz/mZN6/+bm5f/s7O3/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt/6Od - iP+Nhmr/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46Ha/+dl4D/6eno/+zs7P/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/x8fP/vrut/4iBY/+TjHL/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/46Ha/+MhGj/nJV+/7Wxof/KyL7/19XP/9zb - 1v/b2tX/1dPM/8bEuf+wq5n/l5B3/4uDZv+PiG3/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5KLcf+Kg2X/1NLL/6ynlf+LhGf/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46G - av+hm4X/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/v8PH/rKeU/4yEaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jodr/52XgP/p6ej/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+zs7P/q6ur/qaOQ/4uDZv+TjHH/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpw/5KL - cP+LhGf/npiB/8vIv//o6Of/8fHz//Hx8//v8PH/7u/w/+7v8P/w8PH/8fLz//Dx8v/k5OL/wr6y/5eQ - d/+MhGj/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/ioJl/7i0pP/y8/X/p6GN/4yF - aP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jYZq/6Kdh//s7Oz/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8v+tqJb/jIRo/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Oh2v/nZeA/+np6P/s7Oz/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+3t7f/r6+r/qKOO/4uD - Zv+Si3H/kYpv/5GKb/+Rim//kYpv/5KLcP+Rim//jYVp/7i0pf/q6ur/8fLz/+zs7P/q6un/6urp/+rq - 6v/q6ur/6urq/+rq6v/q6un/6urp/+3t7f/y8vT/5OPh/6ynlP+LhGf/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/4qCZf+3s6P/7+/w/+/v8P+noo7/jIVo/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+Oh2v/nZeA/+np6P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/6eijv+MhWn/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kotw/46Ha/+dl4D/6eno/+zs7P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+3t7f/r6+v/qaSQ/42Gav+Si3D/kYpv/5GKb/+Rim//kYpv/46H - a//Ixbr/8vP1/+zs7P/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+np - 6f/t7e7/8PDx/7i0pf+LhGf/kotx/5GKb/+Rim//kYpv/5GLcP+PiGz/uLSl//Dw8f/q6ur/7u7v/6ei - jf+NhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5CJbv+UjXP/4N/c/+3u7v/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs - 7P/o6Of/nJV+/4+HbP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/j4ds/52XgP/o6Oj/7Ozs/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Dx - 8v+xrZv/jIRo/5KLcf+Rim//kYpv/5KLcP+MhWj/xsO4//Pz9v/p6en/6+rq/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/r6+r/8fLz/7SwoP+LhGf/koxx/5GK - b/+Rim//kIlu/5SNc//k4+H/7u7v/+np6P/w8fL/rqmW/4qDZv+UjXP/kotx/5KMcf+SjHH/kYpv/5GK - b/+Rim//kotx/4yEaP/MysD/8fHz/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7+/x/9jW0P+PiGz/kYpw/5GKb/+Rim//kYpv/5KL - cf+SjHH/kotx/5SNc/+MhWn/opyG/+3t7f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/q6un/6urq/+np6P/u7u//2djS/4+HbP+Rim//kYpv/5GKb/+Si3H/i4Rn/7Ou - nf/x8vT/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/r6+z/7Ozs/6Kdh/+Nhmr/kotw/5GKb/+Si3H/i4Nm/725q//w8fL/6Ofm/+7u - 7//X1c//kYpv/4mBZP+Lg2f/i4Nm/4uDZv+QiW7/kYpv/5GKb/+Si3H/jIVo/6umkv/v8PH/6urp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np - 6f/x8vT/t7Ok/4uDZ/+Si3H/kYpv/5GKb/+Rim//i4Rn/4qDZv+Lg2f/ioNm/42Gav/Ny8L/8PDx/+rq - 6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/8fHz//Dw8v/w8PH/7+/w//b2 - +f+3s6P/i4Nm/5KMcf+Rim//kYtw/4+Ibf+YkXj/5eXj/+3t7f/q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rp6f/w8PH/19XP/4+I - bP+Rim//kYpv/5KLcP+Oh2v/m5V9/+vr7P/x8fP/7+/w//P09//i4d7/wr+y/7m1pv+6tqf/ubWm/5WO - df+QiW3/kYpv/5GKb/+RinD/j4ds/9bUzv/w8PL/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/+Df3P+UjXP/kIlu/5GKb/+Rim//kYpu/5GK - cP+2saH/u7eo/7m2pv+7t6n/19XP/+/v8P/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/7Ozs/+vr6//EwLX/rqmX/66pl/+uqZf/rqqY/5aQdv+QiW3/kYpv/5GKb/+SjHH/i4Nm/7+8 - r//y8vT/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8PL/raiV/4yEaP+Si3H/kYpv/5GKb/+QiW7/qKOP/6+r - mf+uqZf/raiW/7Kunf/U0sv/9PX4//Dw8v/19vn/uLSk/4uEZ/+Si3H/kYpv/5KLcP+Nhmr/oJqE/+vr - 6//s7O3/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq - 6v/w8PH/q6aT/4yFaP+Si3H/kYpv/5KLcP+MhWj/rKeU//Pz9f/x8fP/8fLz//Ly9P/v7/D/6urq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/v7/D/tbGg/4d/Yv+MhWn/jIRo/4yE - aP+MhGf/kIlu/5GKb/+Rim//kYpv/5CJbv+TjHL/4N/b/+7u7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp//Dx - 8v/Qzsb/jIVp/5KLcP+Rim//kYpv/5GKb/+NhWn/i4Rn/4yEaP+MhWj/i4Nn/4iAYv/Fwrf/7e3t//Hy - 8//Ixbv/jIVo/5KLcf+Rim//kYpv/5KLcf+LhGf/r6qY/+/v8P/t7e3/6enp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rp6f/r6+v/8vL0/7q2qP+LhGf/kotx/5GKb/+Rim//kotx/4uE - Z/+7uKn/8vP1/+jo5//q6en/6unp/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7e3u/+Li3/+TjXL/kYpv/5OMcf+Si3H/kotx/5KLcf+Rim//kYpv/5GKb/+Si3D/jYVp/6ah - jP/u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+r/7O3t/+Xl4/+YkXj/j4ht/5GKcP+Rim//kYpv/5KL - cP+Si3H/kotx/5KLcf+TjXL/joZq/5+ag//y8/X/0c/H/5KLcP+QiW7/kYpv/5GKb/+Rim//kYpv/5KL - cf+LhGf/raiV/+jo5//x8fP/6+vr/+np6f/q6ur/6urq/+vq6v/q6ur/6urq/+rp6f/q6ur/8PDy/+3t - 7f+3s6P/jIRo/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/46Ha//Gw7j/8fL0/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//3dzY/5OMcv+Rim7/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5KMcf+Lg2b/uLSl//Hy8//q6en/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7u7v/6ehjf+MhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Nhmr/opyH/9HO - x/+Rim//j4hs/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+MhGj/nJZ+/87Mw//s7Oz/8fL0//Dw - 8f/u7u//7e3u/+7u7//v8PH/8fL0/+7u7//V083/o52I/4uEZ/+Si3D/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/4yFaP/Ixbr/8PDy/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//e3dn/k4xx/5CJbv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/4uD - Z//EwbX/8fL0/+rp6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8fL/sa2c/4uEZ/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpw/4+IbP+clX3/mZJ5/46Ha/+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5KLcf+Oh2v/jIVp/6Gbhf+/vK7/1NPM/9/e2v/i4t//4N/b/9bVz//DwLT/pqGM/46H - a/+Nhmr/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/kIlu/5GLcP/f3tv/7u7v/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/97d2f+TjHH/kIlu/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/jIRo/8nGu//x8fP/6urp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urp//Hx8/+2sqL/i4Nn/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cf+Si3D/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/jYZq/4uD - Zv+Oh2v/k4xy/5WPdf+UjXP/j4ds/4uDZv+NhWn/kotw/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+TjHH/jIVo/87Lwv/x8fP/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/u7u//3t3Z/5OMcf+QiW7/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cf+LhGf/xsO4//Hy8//q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/8PHz/7Ovn/+LhGf/kotx/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+PiGz/m5R8/5eQd/+Ph2z/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/koxx/5KLcP+QiW7/kIlt/5CJbv+RinD/koxx/5KL - cP+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GJbv+QiW7/3dzY/+7u - 7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//e3dn/k4xy/5CJ - bv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/4uDZv+9uav/8fL0/+rp6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/v7/H/qqWS/4yFaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/42G - av+jnYf/zcrB/4+IbP+QiW7/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GKb/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/kYpv/5KLcP+Rim//kYpv/5GK - b/+Rim//kYpv/5GKcP+Si3D/i4Nn/8PAtP/w8PL/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//q6ur/7u7v/9/e2/+SjHH/kotw/5KLcP+RinD/kYpw/5GKcP+Rim//kYpv/5GK - b/+Si3H/jIRo/6ynlP/v8PH/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+no6P+cln7/jodr/5KL - cP+Rim//kYpv/5GKb/+Ri3D/kYpw/5GKcP+Si3H/j4hs/52XgP/x8fP/zcvC/46Ha/+QiW7/kotw/5GK - b/+Rim//kYpv/5KLcP+Oh2v/kYpv/4uEZ/+QiG3/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kIlu/4uEZ/+QiW7/jodr/5KLcP+Rim//kYpv/5GKb/+RinD/kotw/4uEZ//BvrH/8fHz/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt/6Wf - iv+IgGP/kIlu/4+Ibf+PiGz/j4ht/5GKb/+Rim//kYpv/5GKcP+PiG3/mJJ5/+Xl4//s7O3/6+vq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/v7/H/2NbQ/4+IbP+Rim//kYpv/5GKb/+Rim//kIlu/4+IbP+PiG3/j4ht/5CJ - bv+Hf2H/trKj/+/v8P/x8fP/zcrB/46Ha/+QiW7/koxx/5GKcP+TjHL/i4Nm/6ahjP/e3dn/wb6x/5aQ - dv+QiW3/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKbv+TjHL/uLSl/97d2v+xrZv/ioJl/5OM - cv+Si3D/kotw/5KLcP+LhGf/wb6x//Hy9P/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//4N/c/6mkkP+Yknn/mJJ5/5iSef+XkXj/kYpv/5GK - b/+Rim//kYpv/5KLcf+MhGf/y8i///Hx8//q6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Hy9P+4tKT/i4Nm/5KM - cf+Rim//kYpv/5CJbv+VjnT/mZJ6/5iSef+Yknn/mZJ6/7Ovnv/o6Of/7Ozs/+np6P/y8vT/zcvC/46H - a/+Nhmn/kIlt/4mBZP+ln4r/6Ojn/+/v8f/09fj/qaOP/4yFaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jodr/56Ygf/u7u//8PDy/+3t7v+wq5n/iYFk/4+Ibf+Oh2v/i4Nm/8G+sf/x8vT/6urp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/u7u7/7u7v/+bm5P/m5eT/5ubk/+bm5f+hm4X/joZq/5KLcP+Rim//kotw/42Gav+inIf/7O3t/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/t7e7/4uLf/5WPdf+QiW3/kYpw/5GKb/+Rim//kIht/9TTzP/p6en/5eXj/+bl - 5P/n5+b/7/Dx/+zs7f/r6+r/6+vr/+np6f/x8fP/0c/H/6CahP+Zk3r/sq6d/+jo5//t7u7/6ejo/+3u - 7v+noo7/jIVp/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Oh2v/nZeA/+jn5v/q6ur/7Ozs/+3t - 7f+6t6j/mpR7/52XgP/Ixbv/8PHy/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/q6ur/7Ozt/+zs7f/r6+v/8/P2/7+7 - rv+KgmX/k4xx/5GKb/+Rim//kotx/4uEZ//Ewbb/8vP1/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Hy9P+yrpz/i4Rn/5KL - cf+Rim//kotw/42Gaf+hm4X/7e3u/+zs7f/s7O3/7O3t/+zs7P/q6ur/6+vq/+vr6//r6+v/6+vr/+rq - 6f/v8PH/7Ozs/+fn5v/w8PH/7Ozt/+rq6v/q6ur/7u/w/6eijf+NhWn/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kotw/4+HbP+dl4D/6Ojn/+zs7P/q6ur/6+vr//Dw8v/o6Of/6urq//Dw8v/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/t7e7/4ODc/5aQdv+QiW3/kYpw/5GKb/+Rim//kIlu/5KL - cP/Z2NL/8fHz/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+np6P/z8/b/yca8/4yFaf+Si3D/kYpv/5GKb/+Si3D/jIVp/8rIvv/w8PL/6enp/+vr - 6//r6+r/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/r6+v/7Ozs/+rq6v/r6+r/6+vr/+rq - 6f/w8fL/rqmW/4qDZv+UjXP/kotx/5KMcf+SjHH/koxx/5KMcf+UjXP/jIVp/6Kchv/t7e3/6+vr/+vr - 6//r6+v/6urp/+zs7P/r6+v/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/y8vT/qqWS/4yFaP+Si3D/kYpv/5GKb/+Si3D/jodr/5iReP/d3Nj/8fL0/+np6f/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/q6un/8/P2/8/Nxf+QiW3/kYlu/5GK - cP+Rim//kYpv/5KLcP+Oh2v/y8m///Lz9f/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+/v8P/Y1tD/kotw/4qCZf+Lg2f/i4Nm/4uD - Zv+Lg2b/i4Nn/4qDZv+Nhmr/zcvC//Dw8f/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/8fLz/767rf+Ph2z/kotw/5GKb/+Rim//kYpv/5GK - b/+Si3H/jodr/5aPdf/S0Mj/8vL0/+3t7v/q6en/6urp/+rq6v/r6+v/6+vr/+vr6//r6+v/6urq/+rq - 6f/q6un/7+/w//Dw8v/Fwrf/j4ht/5CJbv+Si3D/kYpv/5GKb/+Rim//kYpv/5CJbv+PiGz/zsvD//Ly - 9P/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+/v8P/c29f/vbmr/7m2pv+6tqf/uran/7q2p/+5tqf/u7ep/9fVz//v7/D/6urq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8f+/u67/i4Nn/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/j4ht/46Ha/+1saH/4eHe//Hx - 8//w8fL/7e7u/+zs7P/r6+v/6+vr/+zs7P/u7u//8fHz/+/w8f/a2dT/q6aS/4yEaP+Rim//kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/5CJbv+Ph2z/zszD//Dw8v/q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//y8vT/8fLz//Hy - 9P/x8vT/8fL0//Hy8//y8vT/7+/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8PL/zMrA/4qDZv+Si3D/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Si3D/kYpw/4uEZ/+UjnT/sq6d/8/Nxf/h4N3/6ejo/+vr6//r6+v/6Ofm/97d - 2f/Kx73/q6aT/5CJbv+MhWj/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5CJ - bf+Rim//3NrW/+7u7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+np6f/q6en/6unp/+rp6f/q6en/6urp/+np6f/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8v+qpZL/jIVp/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/5CJ - bv+LhGf/jIVp/5SNc/+dln//opyG/6Gbhf+blX3/kotw/4uEZ/+MhWj/kYpv/5KLcf+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xy/4qDZv+9uaz/8vL0/+np6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/8fHz/7Csmv+Kg2b/k4xy/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+Si3D/kIlu/46Ha/+Nhmr/joZq/4+I - bP+Rim7/kotx/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+TjHL/iYJl/8PAtP/x8vT/6unp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/u7u//29rV/5OMcf+PiGz/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/5KLcP+Si3D/kotw/5GKb/+Rim//kYpv/5GKb/+Si3D/kotx/5GK - b/+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xx/4yFaP+emIH/5ubl/+zs7f/r6+r/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8fL/1tTO/5KLcP+PiGz/kotx/5GK - b/+Rim//kYpv/5GKb/+Si3D/jodr/4yFaf+NhWn/kotw/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/4+IbP+LhGf/kotw/46Ha/+Si3D/kYpv/5GKb/+Rim//kYpv/5OM - cf+NhWn/nJZ+/+Lh3//u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+np6f/x8fP/1tTO/5KLcP+PiGz/kotx/5GKb/+RinD/kotx/4qDZf+5tab/z83E/6Od - h/+Oh2v/jYZq/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Ohmr/mZN6/726 - rP/g4Nz/qaSQ/4qDZv+TjHL/kYpv/5GKb/+TjHL/jYVp/5yWfv/i4t//7+/w/+rq6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6f/x8fP/1tTO/5KL - cP+Ohmr/k4xx/5GKb/+KgmX/uLOk//Dw8v/x8fP/7Ozs/9nY0/+rppP/joZq/5KLcP+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Si3D/jodr/8G9sf/p6en/8PDy/+/w8f/q6ur/qKOP/4qCZf+Si3H/k4xx/4uE - Z/+cln7/4uLf/+/v8P/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6f/x8fP/1tTO/5mSev+MhWn/j4hs/7q2qP/v8PH/6+vr/+np - 6f/p6en/9vf6/8fEuv+Kg2b/koxx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Ohmr/2djT//Hy - 8//p6Oj/6unp/+3t7v/q6ur/raiV/42Gav+NhWn/opyG/+Lh3//v7/D/6enp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6f/v8PH/5uXk/9LQyP/c29b/7/Dx/+vr6//r6+r/6+vr/+np6f/w8fL/w8C0/4uEZ/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/46Ha//V08z/7+/x/+rq6v/r6+v/6urq/+zs7f/t7e7/19bQ/9TS - y//q6ur/7u7v/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/s7O3/8PHy/+7v8P/q6ur/6+vr/+vr - 6//r6+v/6unp//Hy9P/DwLT/i4Rn/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/9XT - zP/w8PH/6urq/+vr6//r6+v/6+rq/+vr6v/v8PH/8PDy/+vr6//q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/q6un/6urq/+vr6//r6+v/6+vr/+vr6//q6un/8fHz/8nGvP+KgmX/lI1z/5KL - cf+Si3H/kotx/5KLcf+Si3H/koxx/5KLcf+Oh2v/2tnU/+/v8P/q6ur/6+vr/+vr6//r6+v/6+vr/+rq - 6v/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/s7O3/5ubk/56Ygf+IgWP/jIVo/4uEZ/+LhGf/i4Rn/4uEZ/+MhWj/h4Bi/62o - lv/t7e7/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//4+Lg/7u4 - qf+wrJr/sa2b/7Gsm/+xrJv/sa2b/7Gsm//Cv7P/6enp/+zs7f/r6+r/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/t7e7/8fL0//Dx8v/w8fL/8PHy//Dx8v/w8PL/8PHy//Hy - 8//s7Oz/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/q6en/6urp/+rq6f/q6un/6urp/+rq6f/q6un/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOrq6gPq6uoA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt7e0A7OzsA+zs - 7ADs7Oyp7Ozs/+zs7Pzs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+z/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/r6ur/6urq/+rq6v/q6ur/6urq/+rq - 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urp/+rq6f/q6un/6urp/+rq - 6f/q6un/6urp/+rq6f/q6un/6urp/+rp6f/q6en/6unp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6eno/+np6P/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/unp6f/p6enu6enpEenp6QDp6ekBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6ADn5+YD5+fmAOjo56nn5+f/6Ojn/Ono6P/o6Oj/6ejo/+np - 6f/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t - 7f/u7u7/7u7u/+7u7v/u7u//7+/w/+/v7//v7/D/8PDx//Dw8f/w8PH/8PHy//Hx8v/w8fL/8PHy//Hx - 8v/x8fL/8fHy//Hx8v/x8fL/8fHy//Hx8v/x8fL/8fLz//Hy8//x8vP/8vLz//Hy8//y8vP/8vLz//Ly - 8//y8vP/8vLz//Ly9P/y8vP/8vL0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Pz9P/z8/T/8/P0//Pz - 9f/z8/X/8/P1//P09f/z9PX/8/T1//P09f/z9PX/8/T1//P09f/09Pb/9PT2//T09v/09Pb/9PT2//T0 - 9v/09fb/9PX2//T09v/09Pb/9PT2//T09v/09Pb/9PT2//T09v/09Pb/9PT2//T09v/z9PX/8/T1//P0 - 9f/z9PX/8/T1//P09f/z9PX/8/T1//P09f/z8/X/8/P1//Pz9f/z8/X/8/P1//Pz9f/z8/X/8/P0//Pz - 9P/z8/T+8vP0//Lz9O7y8/QR8vP0APLz9AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJSFAHJs - VwN0bloAiINxtYB7aP+BfGr8gn1r/4J9a/+CfWv/hH9t/4R/bf+Ef23/hYBu/4WAb/+FgG//hoFw/4eC - cf+HgnH/h4Jx/4mEc/+JhHP/iYRz/4qFdP+KhXX/ioV0/4uGdv+Mh3f/jId2/4yId/+NiXn/jYh4/46J - ef+Pinr/j4p6/4+Kev+QjHz/kIx8/5CMfP+QjHz/kYx9/5KOf/+Sjn//ko5//5SQgf+UkIH/lJCB/5WR - g/+WkoT/lpKD/5eThP+YlIb/mJSG/5mUhv+aloj/mpaI/5qWiP+cmIr/nJiL/5yYi/+dmoz/npuN/56a - jf+fm47/oJ2Q/6Ccj/+gnZD/op+S/6Kfkv+in5L/pKCU/6Shlf+koZT/paKW/6ajl/+mo5f/p6OY/6il - mf+opZn/qKWa/6qnnP+qp5z/qqec/6yonv+sqZ7/rKme/62qoP+uq6H/sK2j/7Cto/+wraP/sa+l/7Kv - pv+yr6X/s7Cm/7SxqP+0saj/tLKo/7azqv+2s6r/trOq/7i1rP+4ta3/uLWs/7m3rv+6uK//urev/7u4 - sP+8urL/vLmx/7y6sv++vLT/vry0/768tP/Avbb/wL62/8C+tv7Bv7j/wsC57sK/uBHCwLkAwsC5AQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNiHgAWFE4A1xVPAB3cV23bWdR/25nUvxtZ1H/bWdR/21n - Uf9tZ1H/bWdR/21nUf9tZlH/bWZR/21mUf9sZlD/bGZQ/2xmUP9sZlD/bGZQ/2xmUP9sZlD/bGVP/2xl - T/9sZU//a2VP/2tlT/9rZU//a2VP/2tlT/9rZU//a2VP/2tkTv9rZE7/a2RO/2pkTv9qZE7/amRO/2pk - Tv9qZE7/amRO/2pkTv9qZE7/amRO/2pkTv9qZE7/amRN/2pkTf9qZE3/amNN/2pjTf9qY03/amNN/2pj - Tf9qY03/amNN/2ljTf9pY03/aWNN/2ljTf9pY0z/aWNM/2ljTP9pY0z/aWNM/2ljTP9pYkz/aWJM/2li - TP9pYkz/aWJM/2liTP9pYkz/aWJM/2liTP9oYkz/aGJL/2hiS/9oYkv/aGJL/2hiS/9oYkv/aGJL/2hi - S/9oYkv/aGFL/2hhS/9oYkv/aGJL/2hiS/9oYkv/aGJL/2hiS/9oYkz/aWJM/2liTP9pYkz/aWJM/2li - TP9pYkz/aWNM/2ljTP9pY0z/aWNM/2ljTf9pY03/aWNN/2pjTf9qY03/amNN/2pjTf9qY03/amNN/2pk - Tf9qZE3/amRN/mpkTv9qZE7uamROEWpkTgBqZE4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+L - ewBeWD8DYVtDAHt1Yrdxa1b/cmxX/HJsV/9ybFf/cmxX/3JsV/9ybFf/cmxX/3JsV/9ybFf/cmxX/3Js - V/9ybFf/cmxX/3JsV/9ybFf/cmxX/3JsV/9ybFf/cm1Y/3NtWf90blr/dG5a/3RuWv90blr/dG5a/3Nu - Wv9zbVj/cmxY/3JsWP9ybFj/cm1Y/3JtWP9ybVj/cm1Y/3JtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVn/c25a/3Nv - Wv9zb1r/c29a/3NvWv9zblr/c25Z/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVn/c21Z/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Z/3RuWf90bln/dW9Z/3VvWf91b1n/dW9Z/3RuWf9zbVn/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj+cm1Y/3JtWO5ybVgRcm1YAHJt - WAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cmxX/3Jt - Wf9walX/bWZP/2tjS/9rY0r/a2NK/2tjSv9rY0r/bWVN/3BpVP9ybVj/cmxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xbVj/cWxX/3BoU/9vZE//b2NN/29jTf9vY07/b2NN/29kT/9wZ1L/cWtW/3Ft - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9xa1b/bWdU/2pkUv9pY1H/aWRR/2lj - Uf9pZFH/a2VS/25pVP9ybFf/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9vaFH/a2NK/3NtWf+Cgnj/kpiY/5ylq/+gqrP/nqeu/5Wb - nf+HiID/dnFf/2tkS/9tZk//cmxY/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cWtW/29kT/9wZlH/dHdj/3qO - e/9/n43/gqiX/4Kpl/+AoY//e5F+/3Z8aP9waFP/b2NO/3FqVf9xbVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Nt - V/9walX/aWRS/3BqVf+De2D/mZBt/6iedv+vpHr/raN5/6Sac/+Simn/fHVc/2tmU/9rZVL/cmxW/3Js - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFr - VgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9xa1b/a2NK/3t4 - af+fqbD/vM/p/8jg///M5f//zeb//83m///N5v//zeb//8ri//+/1PH/prK//4KCeP9sZEz/cGlT/3Jt - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cW1Y/3BmUf9waVT/e5B9/4i/rv+P2cr/kuPU/5Ll1v+S5df/kuXX/5Ll1/+S49X/kNzN/4nE - tP9+mYf/cm1Y/29kT/9xbVj/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/amRS/3ZvWf+imXL/zMCL/+HTl//o2pv/6tyc/+rb - nP/q3Jz/6tub/+fZmv/dz5T/wLWE/5OKaf9taFT/bWdU/3NtV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFj/b2hS/3BqVP+bpKr/xNv4/83m///K4f//x97+/8bc/f/G3Pz/xtz8/8bc - /P/G3Pz/xt3+/8ng///N5v//yeD+/6eywP92cV//bWZO/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FsV/9vY07/d4Ju/4nFtf+S5NX/kuPU/5De - z/+Q3M3/kNvM/4/bzP+P28z/j9vM/5Dczf+Q3c7/keLT/5Ll1v+Mzr7/eo16/29kT/9xa1b/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFb/cWtW/2tl - Uv+YkG3/1smQ/+rcnP/n2Jr/4tSX/+HTlv/g0pb/4NKW/+DSlv/g0pb/4dOW/+PVmP/p2pv/6Nma/8a6 - h/+DfGD/amRS/3NsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFr - VhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3Fr - Vvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cm1Y/25nUP93c2L/s8PY/87n - ///I3/7/xdz8/8bd/v/H3v//x97//8fe///H3v//x97//8fe///H3v//x93+/8bc/P/H3f3/zef//77S - 6/+BgHb/bGRM/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xbFf/b2RP/36ah/+R39D/kuPU/5DbzP+Q3Mz/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3M3/j9vM/5Hh0v+S49X/gqmX/3BnUv9xa1b/cWxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxW/3BqVf9vaVX/tap9/+nbm//l15n/4NKW/+HTlv/i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DTlv/g05b/6Nqb/+HTl/+Yj23/amRS/3JsV/9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JsWP9vaFH/eHRk/7vO5f/N5v//xdv8/8fe/v/H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///F3Pz/yuL//8Xc9/+Dg3v/bGVN/3JtWf9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cW1Y/29kTv+AoY//kuXX/5Ddzv+Q28z/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Dczf+T59j/hLKg/3Bm - Uf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/b2lV/7+0 - g//s3Z3/4NKW/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//g0pb/49WY/+nam/+elXD/amRS/3NtV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3Fr - Vu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3Bq - Vf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1f/cWpV/3FrV/+2x9r/zOX//8Xb - /P/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///G3P3/yuL//8LX8P96d2n/bmhR/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Ft - WP9vZE7/fJSB/5Lk1v+Q3M3/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/4/bzP+T59j/gaaU/29kTv9xbVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxX/2tlUv+0qn3/7N2c/9/Slv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//h05b/4tSX/+fZmv+RiWj/a2VS/3Nt - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9rY0v/oauy/87n///F2/z/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3Pz/zOX//7HB0f9uZ1H/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cGhS/3V5Zf+P2sv/kN7P/5Dczf+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dc - zf+R4tP/eYh0/29lUP9xbFj/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9qZVL/l45s/+nb - m//g0pb/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//h05b/5deZ/9nMkv95clr/b2lV/3JsVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFr - Vv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0 - YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFj/bmZP/4B/dP/I3/z/x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///G3P3/zeb//5CUkf9sZEz/cm1Y/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fs - V/9vZU//hrem/5Ll1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzM/5Hi0/+KyLf/cWpV/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cGpV/3RuWP/Ux4//5deZ/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//g0pb/6tyc/7Oo - fP9qZFL/c21X/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZEz/qLS//83m///G3P3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd/v/K4///t8nd/3Bq - Vf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cGZR/3eAbP+Q3s//kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kNvM/5Lk1f97kH3/b2RP/3FtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9pZFL/n5Zx/+rb - nP/g0pb/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//j1Zf/39GV/353Xf9uaFT/cmxW/3FrVv9xa1b/cWtW/3Fr - Vv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2Ba - QgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/b2lT/3h1ZP/C1/L/yOD//8fe - /v/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8bd/v/K4v//hYZ9/21lTv9ybFj/cWtW/3FrVv9xa1b/cWtW/3Ft - WP9vY07/gqmX/5Ll1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q28z/kuTV/4e7qv9vZVD/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxW/25oVP/JvYj/59ma/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DS - lv/q25z/pJpz/2lkUf9zbVf/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZEz/jJCL/8zk///G3f3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//xtz8/83m - //+ep6z/a2NK/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FqVf+KyLj/keLT/5Dczf+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Dczf+R39D/jtXF/3NzX/9waVT/cWxX/3FrVv9xa1b/cWtW/3JsVv9uaFT/gHhe/9/S - lf/j1Zf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4dOW/+jZmv/EuIb/bWdT/3JsV/9xa1b/cWtW/3Fr - Vv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1W - PgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cm1Z/2tjSv+eqK//zeb//8bc - /P/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///G3f3/zOT//6++z/9tZk7/cmxY/3FrVv9xa1b/cWtW/3Fs - V/9waFP/dHdi/4/Yyf+Q3s//kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dczf+R4NH/eIVx/3Bm - UP9xbFf/cWtW/3FrVv9xa1b/cmxX/2plUv+Ti2r/6Nma/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//h05f/5daY/9fKkf92cFn/cGpV/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFj/bGVN/6m2xf/M5f//xtz9/8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd - /v/K4v//uMvi/3FrV/9xa1b/cWtW/3FrVv9xa1b/cWxX/3BmUf93gm7/kN/Q/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kNzM/5Lj1f98k4D/b2RP/3FtWP9xa1b/cWtW/3FrVv9zbVf/aWRR/6KZ - cv/p25v/4NKW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//j1Zf/39KV/4B5X/9uaFT/cmxW/3Fr - Vv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+K - egBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9tZU7/rr3O/8zl - ///G3f3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//xt3+/8nh//+80Or/dG9b/3BqVf9xa1f/cWtW/3Fr - Vv9xbFf/b2VQ/3mHdP+R4tP/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q28z/kuTW/36Z - hv9vY07/cW1Y/3FrVv9xa1b/cWtW/3NtV/9pY1H/qJ52/+rcnP/g0pb/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/hX5i/21nU/9ybFf/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFr - VgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxY/21lTf+tu8v/zOX//8bd/f/H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///G3f7/yuL//7vO6P9zblr/cGpV/3FrVv9xa1b/cWtW/3FsV/9vZVD/eIZy/5Hh0v+Q3M3/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5DbzP+S5NX/fZeE/29kTv9xbVj/cWtW/3FrVv9xa1b/c21X/2lj - Uf+mnXX/6tuc/+DSlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+HTl/+EfWH/bWdU/3Js - V/9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybVj/bGRL/6Wx - u//N5v//xtz9/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd/f/L4///tcbb/29pU/9xa1f/cWtW/3Fr - Vv9xa1b/cWxX/3BnUv92fmr/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Lj - 1P96jXr/b2RP/3FsWP9xa1b/cWtW/3FrVv9zbVf/amRS/5yTb//p25v/4NOW/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//j1Zj/3c+U/3x1XP9uaVT/cmxW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFr - VgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9rY0r/l56f/83m///G3P3/x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//xtz9/8zl//+otcH/bGRM/3JtWP9xa1b/cWtW/3FrVv9xa1b/cWpU/3JwXP+N0sP/keDR/5Dc - zf+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/3Z9af9wZ1L/cWxX/3FrVv9xa1b/cWtW/3Js - V/9sZlP/i4Nl/+XXmf/h05f/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4dOW/+bYmf/Qw43/cmxW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cmxY/21m - T/+Dg3n/yeD//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///G3P3/zeb//5OZmP9rY0v/cm1Z/3Fr - Vv9xa1b/cWtW/3FrVv9xbFf/b2VQ/4e7q/+S49X/kNzM/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Hh - 0v+Ly7v/cWxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3BqVf93cFn/18qR/+TWmP/h05f/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//g0pb/6dub/7esfv9qZFL/c2xX/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFr - VhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3Fr - Vvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv+4yuD/yuL//8bd/v/H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97+/8jf///E2vb/e3ho/29oUv9ybFf/cWtW/3FrVv9xa1b/cWtW/3FtWP9vY07/fZaE/5Lk - 1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+P28z/kuXX/4Kpl/9vY07/cW1Y/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/c2xX/2pkUv+4rX//6dub/+DSlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+HTlv/o2Zr/kopp/2tl - Uv9ybFf/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9ybVn/a2NL/5acnf/N5v//xdz8/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3P3/zeb//6ezvv9sZEz/cm1Y/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FqVf9ycFv/jdHC/5Hg0f+Q3M3/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3M3/dnxo/3BnUv9xbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/bGZT/4mCZP/l15n/4dOX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//h05b/5tiZ/8/DjP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3Fr - Vu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3Bq - Vf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrV/9walX/c21a/7vO4//K4v//xt39/8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x93+/8ff///G3Pj/fXtu/25nUP9ybFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cW1Y/29j - Tv9+m4j/kubX/4/bzP+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+P28v/kubX/4Otm/9vZE7/cW1Y/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFf/a2VT/7yxgf/q25z/4NKW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DSlv/p25v/l45r/2pl - Uv9zbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZU3/iImD/8vj///H3f3/x93+/8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3Pz/zuf//5ifof9rY0v/cm1Z/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3BoU/+IwLD/kuTW/4/ay/+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/j9vM/5Hi - 0/+Mz7//cnBb/3FpVP9xbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsVv9uaFT/e3Vc/9vN - k//l15n/4NOW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//f0pX/69yc/72xgv9sZlP/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFr - Vv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0 - YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9rY0v/mJ+j/87n - ///G3fz/xt3+/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v7/xdz7/87o//+ptcL/bWZP/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xbFf/cGhT/3N0X/+N0cH/kuPU/4/ay/+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/4/bzP+R4NH/kNzM/3eBbf9wZlD/cWxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9rZVL/joZn/+XWmP/k1pj/4NKW/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/39KV/+nbm//Pw4z/dW9Y/29p - Vf9ybFb/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9sZEz/m6Op/83l///I4P7/xdz8/8fe/v/H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//xtz9/8fe/f/O6P//qrfF/3BpU/9walX/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbVj/cGZR/3V5Zf+Mz8D/kuXW/4/b - zP+Q3M3/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dczf+P28z/kuPU/4/Z - yv94hnL/b2RP/3JtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Nt - V/9qZFL/k4pq/+LUl//n2Jr/4NKW/+HTl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4dOW/+DSlv/r3Jz/z8KM/3pzW/9taFT/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2Ba - QgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Js - V/9sZEv/j5OR/8PZ9f/N5v//yN/+/8bc/f/G3f3/xt3+/8fe/v/H3v7/x97+/8fd/v/G3f3/xtz8/8fe - /v/M5f//yeD9/5ykq/9uZ1D/cGpV/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xbVj/cGZR/3NyXv+HvKv/kuXW/5Hh0v+Q3M3/kNvM/5Dczf+Q3M3/kN3O/5Dd - zv+Q3c7/kNzN/5DbzP+Q28z/keDR/5Lm1/+KyLf/dnxo/29lT/9ybVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9qZVL/h4Bj/9HEjf/r3Jz/5NaY/+DS - lv/g05b/4dOX/+LUl//i1Jf/4tSX/+HTl//h05b/4NKW/+HTlv/n2Jr/6dqb/7uwgf90blj/bWhU/3Ns - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9sZEv/enZn/6axvv/F2/n/zeb//8zk - ///J4f//yN///8jf///I3///yeH//8vk///N5v//yOD+/6++0f+Cgnf/a2NL/3FrV/9ybFf/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbVj/cGlT/3Bn - Uf98k4D/i8u7/5Hj1P+S5db/keHT/5Hf0P+Q3s//kN7P/5Df0P+R4dL/kuTW/5Lk1f+N0cL/f5+N/3Fr - Vv9wZ1H/cW1Y/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3NtV/9sZlP/c21X/6iedv/ZzJL/6dub/+nam//m15n/5NWY/+PVmP/j1Zj/5NaY/+fY - mv/q25v/59ia/83Bi/+VjGv/a2ZT/29qVf9ybFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1W - PgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWf9vaFL/bGRL/3x5a/+XnqH/r73P/73R6//D2fj/xdv7/8Ta+f+/0+//s8PX/56n - r/+BgXb/bWZP/21mT/9ybVn/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cWxX/29kTv9xbFf/eox5/4Svnv+KyLj/jtXG/4/a - y/+P2sv/jtbH/4vLu/+FtaT/fJOA/3JwW/9vY07/cWtW/3FsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsV/9walb/aWRR/3hx - Wv+bkm7/vLGB/9LFjv/czpT/39GV/9/Rlf/ZzJL/zL+K/7OpfP+Ph2f/cGpV/2plUv9ybFf/cmxW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsV/9ybVj/b2hR/2tj - Sv9tZk//dG9b/3p3Z/99e23/e3hp/3VwXv9vaFH/a2NK/21mT/9ybFj/cmxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cW1Y/3FrVv9vZU//b2NO/3FqVf9zc1//dXll/3V6Zv9zdGD/cWxX/29kT/9vZE7/cWpV/3Ft - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9zbVf/b2lV/2pkUv9rZVL/c2xX/3t0XP+AeV//f3he/3hy - Wv9walX/aWRS/2tlU/9xa1b/c2xX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+K - egBdVz4DYFpCAHp0YbZwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/cm1Z/3JsWP9walT/b2hS/25nUf9vaFL/cGpU/3Fs - V/9ybVn/cmxY/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FsWP9xbVj/cWtW/3Bp - VP9waFP/cGhS/3BpVP9xa1b/cWxY/3FtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9ya1b/c21X/3JsV/9walb/b2lV/25oVP9uaFT/b2lV/3FrVv9zbVf/cmxX/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5ybFcQcmxXAHFr - VgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjop5AF1WPgNgWkIAenVht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrV/9ybFf/cmxX/3JsV/9xa1f/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWxX/3FsV/9xbFf/cWxX/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFb/cmxW/3Js - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv5xa1b/cWtW7m5oUhBuaFIAb2lUAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACVkYMAXVU9A19YQAB7dWKvcGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVf9zbVntiINyEYaB - cAB+eGUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCtogB2cFwEdnBcAH13ZHFxa1b/cWtW+HFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b5cGpV/3hzX8AhGAAABAAAAZmVhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIiDcgGinpAApaGUC3hyXs1xa1X/cGpV/XFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nBqVf90b1r7g35sP396 - aAB9eGUD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACin5IAAAAAAIeCcQGWkoIAjYh4Fnp1 - YaB1b1vrcWtW73FrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5zbVnveHJexoR/bT1pY00Ac21YAk1IKQCZlIUAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACDfmsAgHpoAIWAbwFeV0IBAAAAAJuXiQxxa1YRcWtWEHFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFybFcQbmhSEYiDchDc29gC////AH96 - ZwJrZlAAbGZQAKGcjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGekAB8d2MAf3pnAIR/ - bQJrZU8D7fHwAP///wBKQCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABuZ1AAbWdQAGNdRwJ6dWIDVE40AEU/IgCXkoQAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaimQCUkYEAraygAKmnmwCFgG8BcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAW9pVAF9eGUBmJSFAJiU - hQCPi3sAoZyPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////AAAAAAAAAAAA - AAAAAAP/9AAAAAAAAAAAAAAAAAABf+l/////////////////9L/iAAAAAAAAAAAAAAAAAAFf5AAAAAAA - AAAAAAAAAAAAv+gAAAAAAAAAAAAAAAAAAJ/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAn+gAAAAAAAAAAAAAAAAA - AL/kAAAAAAAAAAAAAAAAAAFf6QAAAAAAAAAAAAAAAAACv/Sf////////////////6T/6AAAAAAAAAAAA - AAAAAAL///////////////////////////////////////////////////////////////////////// - //////////////////////////////////8= - - - - 141, 17 - - - - AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAHudAAB7nQAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrAOvr6wDr6+sA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs - 7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADs7OwA7OzsAOzs7ADr6+sA5+fnAOjo - 6ADq6uoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADj4+MA6+vrAO3t - 7QDt7e0A6+vrA+vr6wTr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr - 6wPr6+sD6+vrA+vr6wPr6+sD6+vrA+vr6wPr6+sE6+vrAevr6wDr6+sA6+vrAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr6wDr6+sA6+vrAOvr6wLs7OwA7OzsAOvr6wAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrAOvr - 6wDr6+sC6+vrAevr6wDr6+sA7u7uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu7u4A6urqAPT0 - 9ADq6uoC6urqAOvr60Lr6+uZ6+vrquvr66jr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+up6+vrqevr - 66nr6+up6+vrqevr66nr6+up6+vrqevr66nr6+uk6+vrZuvr6wnr6+sA6+vrAezs7ADs7OwAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrq6gDr6+sA6+vrAuvr6wDr6+uD6+vr/+vr6/7r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/3r6+v/6+vrxevr6w/r6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr - 6wPr6+sA6+vrROvr6//r6+v86+vr++vr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86urq/Orq6vzq6ur86urq/Orq6vzq6ur86urq/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr - 6/zr6+v86+vr/Ovr6/zr6+v86+vr/Ovr6/zr6+v86+vr++vr6/jr6+v/6+vrkevr6wDr6+sD7e3tAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA6+vrBOvr6wDr6+uW6+vr/+vr6/vr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/t7u7/7u7v/+7u - 7//u7u//7u7v/+7u7//u7u//6+vr/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/evr6//r6+ve6+vrB+vr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66rr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/s7O3/7u/w/+Hg3f/d29f/3dzY/93c2P/d3Nj/3dzX/9/e2//t7e7/7e3u/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+3r6+sQ6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqOvr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+np6P+wq5n/k4xx/5KL - cf+Si3H/kotx/5KLcf+Si3H/kotx/6iijv/j4+H/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xDr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/6enp/+rq - 6v/r6+v/6+vr/+rq6f/x8fP/vLmr/4d/Yf+Rim//kYpv/5GKbv+Rim7/kYpu/5GKbv+Si3D/h4Bi/6+r - mf/w8PL/6urq/+vr6//r6+v/6urq/+np6f/q6en/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEOvr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//q6ur/7Ozs//Hy8//y8vX/7+/w/+rq6v/r6+v/6urq/+/v8P+noo7/jYZq/5KM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+PiGz/nZeA/+np6f/s7Oz/6+vr/+rq6v/u7u//8vL0//Hy - 9P/s7e3/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp/+3u7v/p6en/xsS4/7y4 - qv/Y1tD/8PDy/+rq6v/q6ur/7u7v/6eijv+MhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46H - a/+dl4D/6Ojn/+zs7P/p6en/8PDy/93c2P++uq3/wr+z/+Xl4//v7/D/6unp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/u7u//5+fm/6Sfiv+JgmT/i4Nm/46Ha//GxLn/8vL0/+no6P/x8fP/qaSQ/4yF - aP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/56Ygf/s7Oz/6urp//Hy8//S0Mj/kotx/4qD - Zv+KgmX/nJV+/+Df2//v8PH/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/7u7v/+fn5v+inYf/i4Rn/5OM - cv+TjHL/kYpv/4yFaP/Gw7j/8vP1/+Pj4P+gmoT/jodr/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GL - cP+PiG3/mZJ5/9va1f/z9Pb/0c/H/5CJbv+PiGz/k4xy/5OMcv+NhWn/mZN7/+Df3P/v8PH/6enp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6f/q6un/6urp/+rq6f/q6un/6urp/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//o5+b/op2H/4uEZ/+TjHL/kYpv/5GKb/+Si3D/kIlu/5CJbv+sqJX/lpB2/4+I - bP+RinD/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+QiW3/k4xy/62olf+UjnT/j4ds/5KL - cP+Rim//kYpv/5OMcf+Nhmr/mpN7/+Df3P/v8PH/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v8PH/8fHz//Hx - 8//x8fP/8fHz//Hx8//x8fP/7u/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/t7e3/5+fl/6Odh/+LhGf/k4xx/5GK - b/+Rim//kYpv/5GKb/+RinD/kYpv/4yEaP+QiW3/kYpw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+QiW7/jIRo/5CJbv+Si3D/kYpv/5GKb/+Rim//kYpv/5OMcf+Nhmr/mZN6/+Df - 2//u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//s7Oz/7e3u/9XTzf/KyL7/y8m//8vJv//Lyb//y8m//8vIv//b2dT/7+/w/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vq/+3u7v+qpZH/ioJl/5OMcv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/5GK - cP+Rim//kYpv/5KLcP+Si3H/koxx/5KMcf+SjHH/kotx/5KLcP+Rim//kYpv/5GKb/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5OMcf+MhWj/n5mC/+np6P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+zt7f+yrpz/i4Rn/4yF - aP+MhWj/jIRo/4yEaP+MhWj/jIVo/46Gav/CvrL/7/Dx/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7/D/3NrW/5CJbv+Si3D/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/j4ds/4yEaP+Kg2b/ioNm/4qD - Zv+LhGf/jodr/5GLcP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5OM - cf+MhWj/0c/H//Dx8v/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/w8PL/0M7G/4qCZf+Si3H/kotx/5KLcf+Si3H/kotx/5KLcf+TjHH/kIht/5GK - b//g39z/7u7u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//f3tr/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - cP+Si3D/jIVp/42Faf+clX7/rqmX/7u3qf/AvbD/vbmr/7Gsm/+fmYL/jodr/4yEaP+Si3D/kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/4yFaP/U0sv/8PDx/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/q6ur/7Ozt/+vr6//q6ur/6+vr/+vr6//r6+v/6unp//Hy9P/DwLT/i4Rn/5OM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/9XTzP/w8PH/6urq/+vr6//r6+v/6+vr/+rq - 6f/s7Oz/7Ozs/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+/v8f+1saH/iYJk/5OM - cf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/kIlu/4yFaP+oo4//0c/H/+jo5//w8PL/8fL0//Ly - 9P/x8vT/8PHy/+rq6v/W1c7/rqqX/46Gav+PiGz/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5OM - cv+Kg2b/qaSR/+zs7f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7e3t/+/v8f/m5uT/6+vs/+/w - 8f/q6un/6+vr/+vr6//q6en/8fL0/8TBtf+LhGf/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+Oh2v/1dTN//Dw8f/q6ur/6+vr/+vr6//q6ur/8PDy/+np6P/n5+b/8PDy/+vr6//q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vs/+3t7v+vq5n/ioJl/5KLcP+Rim//kYpv/5GKb/+Rim//kotw/4+H - bP+TjHH/yca8/+/v8P/w8fL/7Ozs/+rq6v/q6en/6enp/+rp6f/q6un/6+vr/+/w8f/x8fP/0tDI/5iS - ef+Nhmr/kotx/5GKb/+Rim//kYpv/5GKb/+Si3H/i4Nm/6Wfiv/o6Of/7e3t/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urp/+7u7//m5uT/r6qY/5iReP+gmoT/0tDI//Hx8//p6en/6+vr/+np6P/w8PL/w8C0/4uE - Z/+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46Ha//U08z/7+/w/+rq6v/r6+v/6urq//Dw - 8v/Fwrf/m5V9/5mTev+6tqj/7e3t/+zs7P/q6ur/6+vr/+vr6//r6+v/6+vr/+vq6v/q6un/6+vr/+3t - 7v+xrZv/joZq/5KLcP+Rim//kYpv/5KLcP+PiGz/lo91/9nY0v/y8/X/6urq/+rq6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+rp6f/x8vP/4uHf/52XgP+Nhmr/kotx/5GKb/+Rim//kotw/46H - a/+noY3/6Ojn/+3t7f/p6en/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/u7u//5+bl/6Gchv+JgmT/kIlu/42F - af+Oh2v/zszD//Ly9P/p6ej/7Ozs//j5/P/Gw7j/i4Nm/5KMcf+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jYZq/9rZ1P/09ff/6eno/+rq6f/x8vT/v7uu/4qDZv+Oh2v/kIht/4mBZP+vq5n/7u7v/+zs - 7P/q6ur/6+vr/+vr6v/q6ur/7e7u/+7v8P/s7O3/9fX4/8rHvv+LhGf/kotx/5GKb/+Rim//kYpv/5CJ - bv/W1M7/8vL0/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np - 6P/w8PH/4N/c/5aPdv+PiG3/kotw/5GKb/+SjHH/i4Nm/7y4qv/19vn/7Ozs/+7v8P/u7u//6+vr/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6un/7u7v/+bm5f+hm4X/jIRo/5OMcv+Rim//koxx/5CJbv+Ph2z/zsvD//P09//h4N3/xMG1/5+Z - g/+PiGz/kYtw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+PiGz/sa2b/9rY0//u7u//8vP1/766 - rf+Lg2f/kotw/5KLcP+Si3D/k4xy/4qDZv+vq5n/7u7v/+zs7P/q6un/7Ozt/+7v8P/h4N3/3dvX/93c - 2P/e3dr/oJuE/42Gav+Si3D/kYpv/5KLcf+Lg2f/v7yu//Lz9f/p6ej/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6P/y8vT/zMrA/4yFaP+Si3D/kYpv/5GK - cP+PiGz/mJF4/9nY0v/e3dn/3dvX/9/e2//t7e7/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//m5uX/oZuF/4yEaP+TjHH/kYpv/5GK - b/+Rim//kotw/4+Ibf+TjHL/sKya/5aPdf+KgmX/jodr/5GKcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKcP+MhWj/jodr/62olf+3s6T/jIVp/5GKcP+Rim//kYpv/5GKb/+Rim//k4xx/4qD - Zv+vq5n/7e3u/+3t7f/o6Of/sKuZ/5OMcf+Si3H/kotx/5KLcP+QiW7/kYpv/5GKb/+Si3D/jods/5yW - fv/p6ej/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/u7u//pqGM/42Faf+Si3D/kYpv/5GKb/+QiW7/kYpv/5OMcf+Si3H/kotx/6ii - jv/j4+H/7e3u/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6v/s7O3/5+fm/6Kchv+MhGf/k4xx/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GKb/+LhGf/kIlt/5OM - cf+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+Rim//jIVo/4yE - aP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xx/4qCZf+vq5n/8/T2/7y4qv+Hf2H/kYpv/5GK - b/+Rim7/kYpv/5GKb/+Rim//kYpv/5KMcf+Lg2b/vruu//Hy9P/p6en/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6unp//Hx8//Lyb//jIRo/5KL - cf+Rim//kYpv/5GKb/+Rim//kYlu/5GKbv+Si3D/h4Bi/6+rmf/w8PL/6urq/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp//Hx8/+6tqf/iYFk/5ONcv+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+RinD/kYpv/5GKb/+Si3D/kotx/5KLcf+RinD/kYpv/5GK - b/+Si3D/kotx/5KLcf+RinD/kYpv/5GKb/+Si3D/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//k4xx/4mBZP/Rzsf/rKiV/4yEaP+SjHH/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5CI - bf/Z2NL/7+/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6ur/7e3u/+Pi3/+Wj3X/kIlt/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+PiGz/nZeA/+np6f/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7/Dx/6ijj/+Nhmr/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/kotx/4+HbP+Lg2f/i4Rn/4+HbP+Ri3D/kYpv/46Ha/+LhGf/i4Rn/5CIbf+Si3H/kYtw/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+TjHH/ioNm/767rf+uqpj/i4Nm/5KL - cP+Rim//kYpv/5GKb/+Rim//kYpv/5GLcP+PiGz/mZN6/+bm5f/s7O3/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt/6Od - iP+Nhmr/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46Ha/+dl4D/6eno/+zs7P/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/x8fP/vrut/4iBY/+TjHL/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/46Ha/+MhGj/nJV+/7Wxof/KyL7/19XP/9zb - 1v/b2tX/1dPM/8bEuf+wq5n/l5B3/4uDZv+PiG3/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5KLcf+Kg2X/1NLL/6ynlf+LhGf/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/46G - av+hm4X/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/v8PH/rKeU/4yEaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jodr/52XgP/p6ej/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+zs7P/q6ur/qaOQ/4uDZv+TjHH/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpw/5KL - cP+LhGf/npiB/8vIv//o6Of/8fHz//Hx8//v8PH/7u/w/+7v8P/w8PH/8fLz//Dx8v/k5OL/wr6y/5eQ - d/+MhGj/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/ioJl/7i0pP/y8/X/p6GN/4yF - aP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jYZq/6Kdh//s7Oz/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8v+tqJb/jIRo/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Oh2v/nZeA/+np6P/s7Oz/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+3t7f/r6+r/qKOO/4uD - Zv+Si3H/kYpv/5GKb/+Rim//kYpv/5KLcP+Rim//jYVp/7i0pf/q6ur/8fLz/+zs7P/q6un/6urp/+rq - 6v/q6ur/6urq/+rq6v/q6un/6urp/+3t7f/y8vT/5OPh/6ynlP+LhGf/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/4qCZf+3s6P/7+/w/+/v8P+noo7/jIVo/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cP+Oh2v/nZeA/+np6P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/6eijv+MhWn/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kotw/46Ha/+dl4D/6eno/+zs7P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+3t7f/r6+v/qaSQ/42Gav+Si3D/kYpv/5GKb/+Rim//kYpv/46H - a//Ixbr/8vP1/+zs7P/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+np - 6f/t7e7/8PDx/7i0pf+LhGf/kotx/5GKb/+Rim//kYpv/5GLcP+PiGz/uLSl//Dw8f/q6ur/7u7v/6ei - jf+NhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5CJbv+UjXP/4N/c/+3u7v/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs - 7P/o6Of/nJV+/4+HbP+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/j4ds/52XgP/o6Oj/7Ozs/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Dx - 8v+xrZv/jIRo/5KLcf+Rim//kYpv/5KLcP+MhWj/xsO4//Pz9v/p6en/6+rq/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/r6+r/8fLz/7SwoP+LhGf/koxx/5GK - b/+Rim//kIlu/5SNc//k4+H/7u7v/+np6P/w8fL/rqmW/4qDZv+UjXP/kotx/5KMcf+SjHH/kYpv/5GK - b/+Rim//kotx/4yEaP/MysD/8fHz/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7+/x/9jW0P+PiGz/kYpw/5GKb/+Rim//kYpv/5KL - cf+SjHH/kotx/5SNc/+MhWn/opyG/+3t7f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6f/q6un/6urq/+np6P/u7u//2djS/4+HbP+Rim//kYpv/5GKb/+Si3H/i4Rn/7Ou - nf/x8vT/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/r6+z/7Ozs/6Kdh/+Nhmr/kotw/5GKb/+Si3H/i4Nm/725q//w8fL/6Ofm/+7u - 7//X1c//kYpv/4mBZP+Lg2f/i4Nm/4uDZv+QiW7/kYpv/5GKb/+Si3H/jIVo/6umkv/v8PH/6urp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np - 6f/x8vT/t7Ok/4uDZ/+Si3H/kYpv/5GKb/+Rim//i4Rn/4qDZv+Lg2f/ioNm/42Gav/Ny8L/8PDx/+rq - 6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/8fHz//Dw8v/w8PH/7+/w//b2 - +f+3s6P/i4Nm/5KMcf+Rim//kYtw/4+Ibf+YkXj/5eXj/+3t7f/q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rp6f/w8PH/19XP/4+I - bP+Rim//kYpv/5KLcP+Oh2v/m5V9/+vr7P/x8fP/7+/w//P09//i4d7/wr+y/7m1pv+6tqf/ubWm/5WO - df+QiW3/kYpv/5GKb/+RinD/j4ds/9bUzv/w8PL/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/+Df3P+UjXP/kIlu/5GKb/+Rim//kYpu/5GK - cP+2saH/u7eo/7m2pv+7t6n/19XP/+/v8P/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/7Ozs/+vr6//EwLX/rqmX/66pl/+uqZf/rqqY/5aQdv+QiW3/kYpv/5GKb/+SjHH/i4Nm/7+8 - r//y8vT/6enp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8PL/raiV/4yEaP+Si3H/kYpv/5GKb/+QiW7/qKOP/6+r - mf+uqZf/raiW/7Kunf/U0sv/9PX4//Dw8v/19vn/uLSk/4uEZ/+Si3H/kYpv/5KLcP+Nhmr/oJqE/+vr - 6//s7O3/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq - 6v/w8PH/q6aT/4yFaP+Si3H/kYpv/5KLcP+MhWj/rKeU//Pz9f/x8fP/8fLz//Ly9P/v7/D/6urq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/v7/D/tbGg/4d/Yv+MhWn/jIRo/4yE - aP+MhGf/kIlu/5GKb/+Rim//kYpv/5CJbv+TjHL/4N/b/+7u7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urp//Dx - 8v/Qzsb/jIVp/5KLcP+Rim//kYpv/5GKb/+NhWn/i4Rn/4yEaP+MhWj/i4Nn/4iAYv/Fwrf/7e3t//Hy - 8//Ixbv/jIVo/5KLcf+Rim//kYpv/5KLcf+LhGf/r6qY/+/v8P/t7e3/6enp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rp6f/r6+v/8vL0/7q2qP+LhGf/kotx/5GKb/+Rim//kotx/4uE - Z/+7uKn/8vP1/+jo5//q6en/6unp/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7e3u/+Li3/+TjXL/kYpv/5OMcf+Si3H/kotx/5KLcf+Rim//kYpv/5GKb/+Si3D/jYVp/6ah - jP/u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+r/7O3t/+Xl4/+YkXj/j4ht/5GKcP+Rim//kYpv/5KL - cP+Si3H/kotx/5KLcf+TjXL/joZq/5+ag//y8/X/0c/H/5KLcP+QiW7/kYpv/5GKb/+Rim//kYpv/5KL - cf+LhGf/raiV/+jo5//x8fP/6+vr/+np6f/q6ur/6urq/+vq6v/q6ur/6urq/+rp6f/q6ur/8PDy/+3t - 7f+3s6P/jIRo/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/46Ha//Gw7j/8fL0/+rq6v/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//3dzY/5OMcv+Rim7/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5KMcf+Lg2b/uLSl//Hy8//q6en/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//q6ur/7u7v/6ehjf+MhWn/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Nhmr/opyH/9HO - x/+Rim//j4hs/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+MhGj/nJZ+/87Mw//s7Oz/8fL0//Dw - 8f/u7u//7e3u/+7u7//v8PH/8fL0/+7u7//V083/o52I/4uEZ/+Si3D/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/4yFaP/Ixbr/8PDy/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+7u7//e3dn/k4xx/5CJbv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/4uD - Z//EwbX/8fL0/+rp6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8fL/sa2c/4uEZ/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpw/4+IbP+clX3/mZJ5/46Ha/+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5KLcf+Oh2v/jIVp/6Gbhf+/vK7/1NPM/9/e2v/i4t//4N/b/9bVz//DwLT/pqGM/46H - a/+Nhmr/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/kIlu/5GLcP/f3tv/7u7v/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/7u7v/97d2f+TjHH/kIlu/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/jIRo/8nGu//x8fP/6urp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urp//Hx8/+2sqL/i4Nn/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cf+Si3D/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/jYZq/4uD - Zv+Oh2v/k4xy/5WPdf+UjXP/j4ds/4uDZv+NhWn/kotw/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+TjHH/jIVo/87Lwv/x8fP/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/u7u//3t3Z/5OMcf+QiW7/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KL - cf+LhGf/xsO4//Hy8//q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/8PHz/7Ovn/+LhGf/kotx/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+PiGz/m5R8/5eQd/+Ph2z/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/koxx/5KLcP+QiW7/kIlt/5CJbv+RinD/koxx/5KL - cP+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GJbv+QiW7/3dzY/+7u - 7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//e3dn/k4xy/5CJ - bv+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//koxx/4uDZv+9uav/8fL0/+rp6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/v7/H/qqWS/4yFaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/42G - av+jnYf/zcrB/4+IbP+QiW7/kotw/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5GKb/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/kYpv/5KLcP+Rim//kYpv/5GK - b/+Rim//kYpv/5GKcP+Si3D/i4Nn/8PAtP/w8PL/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//q6ur/7u7v/9/e2/+SjHH/kotw/5KLcP+RinD/kYpw/5GKcP+Rim//kYpv/5GK - b/+Si3H/jIRo/6ynlP/v8PH/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+no6P+cln7/jodr/5KL - cP+Rim//kYpv/5GKb/+Ri3D/kYpw/5GKcP+Si3H/j4hs/52XgP/x8fP/zcvC/46Ha/+QiW7/kotw/5GK - b/+Rim//kYpv/5KLcP+Oh2v/kYpv/4uEZ/+QiG3/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kIlu/4uEZ/+QiW7/jodr/5KLcP+Rim//kYpv/5GKb/+RinD/kotw/4uEZ//BvrH/8fHz/+rq - 6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozt/6Wf - iv+IgGP/kIlu/4+Ibf+PiGz/j4ht/5GKb/+Rim//kYpv/5GKcP+PiG3/mJJ5/+Xl4//s7O3/6+vq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/v7/H/2NbQ/4+IbP+Rim//kYpv/5GKb/+Rim//kIlu/4+IbP+PiG3/j4ht/5CJ - bv+Hf2H/trKj/+/v8P/x8fP/zcrB/46Ha/+QiW7/koxx/5GKcP+TjHL/i4Nm/6ahjP/e3dn/wb6x/5aQ - dv+QiW3/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKbv+TjHL/uLSl/97d2v+xrZv/ioJl/5OM - cv+Si3D/kotw/5KLcP+LhGf/wb6x//Hy9P/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//4N/c/6mkkP+Yknn/mJJ5/5iSef+XkXj/kYpv/5GK - b/+Rim//kYpv/5KLcf+MhGf/y8i///Hx8//q6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Hy9P+4tKT/i4Nm/5KM - cf+Rim//kYpv/5CJbv+VjnT/mZJ6/5iSef+Yknn/mZJ6/7Ovnv/o6Of/7Ozs/+np6P/y8vT/zcvC/46H - a/+Nhmn/kIlt/4mBZP+ln4r/6Ojn/+/v8f/09fj/qaOP/4yFaP+Si3H/kYpv/5GKb/+Rim//kYpv/5GK - b/+Si3D/jodr/56Ygf/u7u//8PDy/+3t7v+wq5n/iYFk/4+Ibf+Oh2v/i4Nm/8G+sf/x8vT/6urp/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/u7u7/7u7v/+bm5P/m5eT/5ubk/+bm5f+hm4X/joZq/5KLcP+Rim//kotw/42Gav+inIf/7O3t/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+rq6v/t7e7/4uLf/5WPdf+QiW3/kYpw/5GKb/+Rim//kIht/9TTzP/p6en/5eXj/+bl - 5P/n5+b/7/Dx/+zs7f/r6+r/6+vr/+np6f/x8fP/0c/H/6CahP+Zk3r/sq6d/+jo5//t7u7/6ejo/+3u - 7v+noo7/jIVp/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Oh2v/nZeA/+jn5v/q6ur/7Ozs/+3t - 7f+6t6j/mpR7/52XgP/Ixbv/8PHy/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/q6ur/7Ozt/+zs7f/r6+v/8/P2/7+7 - rv+KgmX/k4xx/5GKb/+Rim//kotx/4uEZ//Ewbb/8vP1/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6enp//Hy9P+yrpz/i4Rn/5KL - cf+Rim//kotw/42Gaf+hm4X/7e3u/+zs7f/s7O3/7O3t/+zs7P/q6ur/6+vq/+vr6//r6+v/6+vr/+rq - 6f/v8PH/7Ozs/+fn5v/w8PH/7Ozt/+rq6v/q6ur/7u/w/6eijf+NhWn/kotw/5GKb/+Rim//kYpv/5GK - b/+Rim//kotw/4+HbP+dl4D/6Ojn/+zs7P/q6ur/6+vr//Dw8v/o6Of/6urq//Dw8v/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/t7e7/4ODc/5aQdv+QiW3/kYpw/5GKb/+Rim//kIlu/5KL - cP/Z2NL/8fHz/+np6P/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+np6P/z8/b/yca8/4yFaf+Si3D/kYpv/5GKb/+Si3D/jIVp/8rIvv/w8PL/6enp/+vr - 6//r6+r/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/r6+v/7Ozs/+rq6v/r6+r/6+vr/+rq - 6f/w8fL/rqmW/4qDZv+UjXP/kotx/5KMcf+SjHH/koxx/5KMcf+UjXP/jIVp/6Kchv/t7e3/6+vr/+vr - 6//r6+v/6urp/+zs7P/r6+v/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/y8vT/qqWS/4yFaP+Si3D/kYpv/5GKb/+Si3D/jodr/5iReP/d3Nj/8fL0/+np6f/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/q6un/8/P2/8/Nxf+QiW3/kYlu/5GK - cP+Rim//kYpv/5KLcP+Oh2v/y8m///Lz9f/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+/v8P/Y1tD/kotw/4qCZf+Lg2f/i4Nm/4uD - Zv+Lg2b/i4Nn/4qDZv+Nhmr/zcvC//Dw8f/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/8fLz/767rf+Ph2z/kotw/5GKb/+Rim//kYpv/5GK - b/+Si3H/jodr/5aPdf/S0Mj/8vL0/+3t7v/q6en/6urp/+rq6v/r6+v/6+vr/+vr6//r6+v/6urq/+rq - 6f/q6un/7+/w//Dw8v/Fwrf/j4ht/5CJbv+Si3D/kYpv/5GKb/+Rim//kYpv/5CJbv+PiGz/zsvD//Ly - 9P/q6un/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6urq/+/v8P/c29f/vbmr/7m2pv+6tqf/uran/7q2p/+5tqf/u7ep/9fVz//v7/D/6urq/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8f+/u67/i4Nn/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3H/j4ht/46Ha/+1saH/4eHe//Hx - 8//w8fL/7e7u/+zs7P/r6+v/6+vr/+zs7P/u7u//8fHz/+/w8f/a2dT/q6aS/4yEaP+Rim//kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/5CJbv+Ph2z/zszD//Dw8v/q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+7u7//y8vT/8fLz//Hy - 9P/x8vT/8fL0//Hy8//y8vT/7+/w/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8PL/zMrA/4qDZv+Si3D/kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Si3D/kYpw/4uEZ/+UjnT/sq6d/8/Nxf/h4N3/6ejo/+vr6//r6+v/6Ofm/97d - 2f/Kx73/q6aT/5CJbv+MhWj/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotw/5CJ - bf+Rim//3NrW/+7u7//q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6urq/+np6f/q6en/6unp/+rp6f/q6en/6urp/+np6f/q6ur/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq//Dw - 8v+qpZL/jIVp/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kotx/5CJ - bv+LhGf/jIVp/5SNc/+dln//opyG/6Gbhf+blX3/kotw/4uEZ/+MhWj/kYpv/5KLcf+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xy/4qDZv+9uaz/8vL0/+np6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6un/8fHz/7Csmv+Kg2b/k4xy/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcf+Si3D/kIlu/46Ha/+Nhmr/joZq/4+I - bP+Rim7/kotx/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+TjHL/iYJl/8PAtP/x8vT/6unp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/u7u//29rV/5OMcf+PiGz/kotx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Si3D/kotw/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/5KLcP+Si3D/kotw/5GKb/+Rim//kYpv/5GKb/+Si3D/kotx/5GK - b/+Si3D/kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//k4xx/4yFaP+emIH/5ubl/+zs7f/r6+r/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6f/w8fL/1tTO/5KLcP+PiGz/kotx/5GK - b/+Rim//kYpv/5GKb/+Si3D/jodr/4yFaf+NhWn/kotw/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/4+IbP+LhGf/kotw/46Ha/+Si3D/kYpv/5GKb/+Rim//kYpv/5OM - cf+NhWn/nJZ+/+Lh3//u7u//6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+np6f/x8fP/1tTO/5KLcP+PiGz/kotx/5GKb/+RinD/kotx/4qDZf+5tab/z83E/6Od - h/+Oh2v/jYZq/5KLcP+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Ohmr/mZN6/726 - rP/g4Nz/qaSQ/4qDZv+TjHL/kYpv/5GKb/+TjHL/jYVp/5yWfv/i4t//7+/w/+rq6f/r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6f/x8fP/1tTO/5KL - cP+Ohmr/k4xx/5GKb/+KgmX/uLOk//Dw8v/x8fP/7Ozs/9nY0/+rppP/joZq/5KLcP+Rim//kYpv/5GK - b/+Rim//kYpv/5GKb/+Si3D/jodr/8G9sf/p6en/8PDy/+/w8f/q6ur/qKOP/4qCZf+Si3H/k4xx/4uE - Z/+cln7/4uLf/+/v8P/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+np6f/x8fP/1tTO/5mSev+MhWn/j4hs/7q2qP/v8PH/6+vr/+np - 6f/p6en/9vf6/8fEuv+Kg2b/koxx/5GKb/+Rim//kYpv/5GKb/+Rim//kYpv/5KLcP+Ohmr/2djT//Hy - 8//p6Oj/6unp/+3t7v/q6ur/raiV/42Gav+NhWn/opyG/+Lh3//v7/D/6enp/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6f/v8PH/5uXk/9LQyP/c29b/7/Dx/+vr6//r6+r/6+vr/+np6f/w8fL/w8C0/4uEZ/+Si3H/kYpv/5GK - b/+Rim//kYpv/5GKb/+Rim//kotw/46Ha//V08z/7+/x/+rq6v/r6+v/6urq/+zs7f/t7e7/19bQ/9TS - y//q6ur/7u7v/+rq6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/s7O3/8PHy/+7v8P/q6ur/6+vr/+vr - 6//r6+v/6unp//Hy9P/DwLT/i4Rn/5KLcf+Rim//kYpv/5GKb/+Rim//kYpv/5GKb/+Si3D/jodr/9XT - zP/w8PH/6urq/+vr6//r6+v/6+rq/+vr6v/v8PH/8PDy/+vr6//q6ur/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/q6un/6urq/+vr6//r6+v/6+vr/+vr6//q6un/8fHz/8nGvP+KgmX/lI1z/5KL - cf+Si3H/kotx/5KLcf+Si3H/koxx/5KLcf+Oh2v/2tnU/+/v8P/q6ur/6+vr/+vr6//r6+v/6+vr/+rq - 6v/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr - 6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6v/s7O3/5ubk/56Ygf+IgWP/jIVo/4uEZ/+LhGf/i4Rn/4uEZ/+MhWj/h4Bi/62o - lv/t7e7/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/u7u//4+Lg/7u4 - qf+wrJr/sa2b/7Gsm/+xrJv/sa2b/7Gsm//Cv7P/6enp/+zs7f/r6+r/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr - 6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/t7e7/8fL0//Dx8v/w8fL/8PHy//Dx8v/w8PL/8PHy//Hy - 8//s7Oz/6+vq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq - 6v/q6en/6urp/+rq6f/q6un/6urp/+rq6f/q6un/6urp/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs - 7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr - 6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr - 6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr - 6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr - 6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr - 6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsAOvr6wPr6+sA6+vrqevr - 6//r6+v86+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADs7OwA6+vrA+vr6wDr6+up6+vr/+vr6/zr6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/uvr - 6//r6+vu6+vrEevr6wDr6+sBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7ADr6+sD6+vrAOvr - 66nr6+v/6+vr/Ovr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v+6+vr/+vr6+7r6+sR6+vrAOvr6wEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA7OzsAOrq6gPq6uoA6+vrqevr6//r6+v86+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr - 6/7r6+v/6+vr7uvr6xHr6+sA6+vrAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADt7e0A7OzsA+zs - 7ADs7Oyp7Ozs/+zs7Pzs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+z/6+vr/+vr6//r6+v/6+vr/+vr - 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vq/+rq6v/r6ur/6urq/+rq6v/q6ur/6urq/+rq - 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urp/+rq6f/q6un/6urp/+rq - 6f/q6un/6urp/+rq6f/q6un/6urp/+rp6f/q6en/6unp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6eno/+np6P/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np - 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/unp6f/p6enu6enpEenp6QDp6ekBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6ADn5+YD5+fmAOjo56nn5+f/6Ojn/Ono6P/o6Oj/6ejo/+np - 6f/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t - 7f/u7u7/7u7u/+7u7v/u7u//7+/w/+/v7//v7/D/8PDx//Dw8f/w8PH/8PHy//Hx8v/w8fL/8PHy//Hx - 8v/x8fL/8fHy//Hx8v/x8fL/8fHy//Hx8v/x8fL/8fLz//Hy8//x8vP/8vLz//Hy8//y8vP/8vLz//Ly - 8//y8vP/8vLz//Ly9P/y8vP/8vL0//Lz9P/y8/T/8vP0//Lz9P/y8/T/8vP0//Pz9P/z8/T/8/P0//Pz - 9f/z8/X/8/P1//P09f/z9PX/8/T1//P09f/z9PX/8/T1//P09f/09Pb/9PT2//T09v/09Pb/9PT2//T0 - 9v/09fb/9PX2//T09v/09Pb/9PT2//T09v/09Pb/9PT2//T09v/09Pb/9PT2//T09v/z9PX/8/T1//P0 - 9f/z9PX/8/T1//P09f/z9PX/8/T1//P09f/z8/X/8/P1//Pz9f/z8/X/8/P1//Pz9f/z8/X/8/P0//Pz - 9P/z8/T+8vP0//Lz9O7y8/QR8vP0APLz9AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJSFAHJs - VwN0bloAiINxtYB7aP+BfGr8gn1r/4J9a/+CfWv/hH9t/4R/bf+Ef23/hYBu/4WAb/+FgG//hoFw/4eC - cf+HgnH/h4Jx/4mEc/+JhHP/iYRz/4qFdP+KhXX/ioV0/4uGdv+Mh3f/jId2/4yId/+NiXn/jYh4/46J - ef+Pinr/j4p6/4+Kev+QjHz/kIx8/5CMfP+QjHz/kYx9/5KOf/+Sjn//ko5//5SQgf+UkIH/lJCB/5WR - g/+WkoT/lpKD/5eThP+YlIb/mJSG/5mUhv+aloj/mpaI/5qWiP+cmIr/nJiL/5yYi/+dmoz/npuN/56a - jf+fm47/oJ2Q/6Ccj/+gnZD/op+S/6Kfkv+in5L/pKCU/6Shlf+koZT/paKW/6ajl/+mo5f/p6OY/6il - mf+opZn/qKWa/6qnnP+qp5z/qqec/6yonv+sqZ7/rKme/62qoP+uq6H/sK2j/7Cto/+wraP/sa+l/7Kv - pv+yr6X/s7Cm/7SxqP+0saj/tLKo/7azqv+2s6r/trOq/7i1rP+4ta3/uLWs/7m3rv+6uK//urev/7u4 - sP+8urL/vLmx/7y6sv++vLT/vry0/768tP/Avbb/wL62/8C+tv7Bv7j/wsC57sK/uBHCwLkAwsC5AQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNiHgAWFE4A1xVPAB3cV23bWdR/25nUvxtZ1H/bWdR/21n - Uf9tZ1H/bWdR/21nUf9tZlH/bWZR/21mUf9sZlD/bGZQ/2xmUP9sZlD/bGZQ/2xmUP9sZlD/bGVP/2xl - T/9sZU//a2VP/2tlT/9rZU//a2VP/2tlT/9rZU//a2VP/2tkTv9rZE7/a2RO/2pkTv9qZE7/amRO/2pk - Tv9qZE7/amRO/2pkTv9qZE7/amRO/2pkTv9qZE7/amRN/2pkTf9qZE3/amNN/2pjTf9qY03/amNN/2pj - Tf9qY03/amNN/2ljTf9pY03/aWNN/2ljTf9pY0z/aWNM/2ljTP9pY0z/aWNM/2ljTP9pYkz/aWJM/2li - TP9pYkz/aWJM/2liTP9pYkz/aWJM/2liTP9oYkz/aGJL/2hiS/9oYkv/aGJL/2hiS/9oYkv/aGJL/2hi - S/9oYkv/aGFL/2hhS/9oYkv/aGJL/2hiS/9oYkv/aGJL/2hiS/9oYkz/aWJM/2liTP9pYkz/aWJM/2li - TP9pYkz/aWNM/2ljTP9pY0z/aWNM/2ljTf9pY03/aWNN/2pjTf9qY03/amNN/2pjTf9qY03/amNN/2pk - Tf9qZE3/amRN/mpkTv9qZE7uamROEWpkTgBqZE4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+L - ewBeWD8DYVtDAHt1Yrdxa1b/cmxX/HJsV/9ybFf/cmxX/3JsV/9ybFf/cmxX/3JsV/9ybFf/cmxX/3Js - V/9ybFf/cmxX/3JsV/9ybFf/cmxX/3JsV/9ybFf/cm1Y/3NtWf90blr/dG5a/3RuWv90blr/dG5a/3Nu - Wv9zbVj/cmxY/3JsWP9ybFj/cm1Y/3JtWP9ybVj/cm1Y/3JtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVn/c25a/3Nv - Wv9zb1r/c29a/3NvWv9zblr/c25Z/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVn/c21Z/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Z/3RuWf90bln/dW9Z/3VvWf91b1n/dW9Z/3RuWf9zbVn/c21Y/3NtWP9zbVj/c21Y/3Nt - WP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj/c21Y/3NtWP9zbVj+cm1Y/3JtWO5ybVgRcm1YAHJt - WAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cmxX/3Jt - Wf9walX/bWZP/2tjS/9rY0r/a2NK/2tjSv9rY0r/bWVN/3BpVP9ybVj/cmxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xbVj/cWxX/3BoU/9vZE//b2NN/29jTf9vY07/b2NN/29kT/9wZ1L/cWtW/3Ft - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9xa1b/bWdU/2pkUv9pY1H/aWRR/2lj - Uf9pZFH/a2VS/25pVP9ybFf/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9vaFH/a2NK/3NtWf+Cgnj/kpiY/5ylq/+gqrP/nqeu/5Wb - nf+HiID/dnFf/2tkS/9tZk//cmxY/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cWtW/29kT/9wZlH/dHdj/3qO - e/9/n43/gqiX/4Kpl/+AoY//e5F+/3Z8aP9waFP/b2NO/3FqVf9xbVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Nt - V/9walX/aWRS/3BqVf+De2D/mZBt/6iedv+vpHr/raN5/6Sac/+Simn/fHVc/2tmU/9rZVL/cmxW/3Js - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFr - VgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9xa1b/a2NK/3t4 - af+fqbD/vM/p/8jg///M5f//zeb//83m///N5v//zeb//8ri//+/1PH/prK//4KCeP9sZEz/cGlT/3Jt - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cW1Y/3BmUf9waVT/e5B9/4i/rv+P2cr/kuPU/5Ll1v+S5df/kuXX/5Ll1/+S49X/kNzN/4nE - tP9+mYf/cm1Y/29kT/9xbVj/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/amRS/3ZvWf+imXL/zMCL/+HTl//o2pv/6tyc/+rb - nP/q3Jz/6tub/+fZmv/dz5T/wLWE/5OKaf9taFT/bWdU/3NtV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFj/b2hS/3BqVP+bpKr/xNv4/83m///K4f//x97+/8bc/f/G3Pz/xtz8/8bc - /P/G3Pz/xt3+/8ng///N5v//yeD+/6eywP92cV//bWZO/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FsV/9vY07/d4Ju/4nFtf+S5NX/kuPU/5De - z/+Q3M3/kNvM/4/bzP+P28z/j9vM/5Dczf+Q3c7/keLT/5Ll1v+Mzr7/eo16/29kT/9xa1b/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFb/cWtW/2tl - Uv+YkG3/1smQ/+rcnP/n2Jr/4tSX/+HTlv/g0pb/4NKW/+DSlv/g0pb/4dOW/+PVmP/p2pv/6Nma/8a6 - h/+DfGD/amRS/3NsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFr - VhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3Fr - Vvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cm1Y/25nUP93c2L/s8PY/87n - ///I3/7/xdz8/8bd/v/H3v//x97//8fe///H3v//x97//8fe///H3v//x93+/8bc/P/H3f3/zef//77S - 6/+BgHb/bGRM/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xbFf/b2RP/36ah/+R39D/kuPU/5DbzP+Q3Mz/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3M3/j9vM/5Hh0v+S49X/gqmX/3BnUv9xa1b/cWxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxW/3BqVf9vaVX/tap9/+nbm//l15n/4NKW/+HTlv/i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DTlv/g05b/6Nqb/+HTl/+Yj23/amRS/3JsV/9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JsWP9vaFH/eHRk/7vO5f/N5v//xdv8/8fe/v/H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///F3Pz/yuL//8Xc9/+Dg3v/bGVN/3JtWf9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cW1Y/29kTv+AoY//kuXX/5Ddzv+Q28z/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Dczf+T59j/hLKg/3Bm - Uf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/b2lV/7+0 - g//s3Z3/4NKW/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//g0pb/49WY/+nam/+elXD/amRS/3NtV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3Fr - Vu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3Bq - Vf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1f/cWpV/3FrV/+2x9r/zOX//8Xb - /P/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///G3P3/yuL//8LX8P96d2n/bmhR/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Ft - WP9vZE7/fJSB/5Lk1v+Q3M3/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/4/bzP+T59j/gaaU/29kTv9xbVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxX/2tlUv+0qn3/7N2c/9/Slv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//h05b/4tSX/+fZmv+RiWj/a2VS/3Nt - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9rY0v/oauy/87n///F2/z/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3Pz/zOX//7HB0f9uZ1H/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cGhS/3V5Zf+P2sv/kN7P/5Dczf+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dc - zf+R4tP/eYh0/29lUP9xbFj/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9qZVL/l45s/+nb - m//g0pb/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//h05b/5deZ/9nMkv95clr/b2lV/3JsVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFr - Vv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0 - YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFj/bmZP/4B/dP/I3/z/x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///G3P3/zeb//5CUkf9sZEz/cm1Y/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fs - V/9vZU//hrem/5Ll1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzM/5Hi0/+KyLf/cWpV/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cGpV/3RuWP/Ux4//5deZ/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//g0pb/6tyc/7Oo - fP9qZFL/c21X/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZEz/qLS//83m///G3P3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd/v/K4///t8nd/3Bq - Vf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cGZR/3eAbP+Q3s//kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kNvM/5Lk1f97kH3/b2RP/3FtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9pZFL/n5Zx/+rb - nP/g0pb/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//j1Zf/39GV/353Xf9uaFT/cmxW/3FrVv9xa1b/cWtW/3Fr - Vv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2Ba - QgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/b2lT/3h1ZP/C1/L/yOD//8fe - /v/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8bd/v/K4v//hYZ9/21lTv9ybFj/cWtW/3FrVv9xa1b/cWtW/3Ft - WP9vY07/gqmX/5Ll1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q28z/kuTV/4e7qv9vZVD/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxW/25oVP/JvYj/59ma/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DS - lv/q25z/pJpz/2lkUf9zbVf/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZEz/jJCL/8zk///G3f3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//xtz8/83m - //+ep6z/a2NK/3JtWf9xa1b/cWtW/3FrVv9xa1b/cWtW/3FqVf+KyLj/keLT/5Dczf+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Dczf+R39D/jtXF/3NzX/9waVT/cWxX/3FrVv9xa1b/cWtW/3JsVv9uaFT/gHhe/9/S - lf/j1Zf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4dOW/+jZmv/EuIb/bWdT/3JsV/9xa1b/cWtW/3Fr - Vv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1W - PgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cm1Z/2tjSv+eqK//zeb//8bc - /P/H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///G3f3/zOT//6++z/9tZk7/cmxY/3FrVv9xa1b/cWtW/3Fs - V/9waFP/dHdi/4/Yyf+Q3s//kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dczf+R4NH/eIVx/3Bm - UP9xbFf/cWtW/3FrVv9xa1b/cmxX/2plUv+Ti2r/6Nma/+HTlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//h05f/5daY/9fKkf92cFn/cGpV/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFj/bGVN/6m2xf/M5f//xtz9/8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd - /v/K4v//uMvi/3FrV/9xa1b/cWtW/3FrVv9xa1b/cWxX/3BmUf93gm7/kN/Q/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kNzM/5Lj1f98k4D/b2RP/3FtWP9xa1b/cWtW/3FrVv9zbVf/aWRR/6KZ - cv/p25v/4NKW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//j1Zf/39KV/4B5X/9uaFT/cmxW/3Fr - Vv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+K - egBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9tZU7/rr3O/8zl - ///G3f3/x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//xt3+/8nh//+80Or/dG9b/3BqVf9xa1f/cWtW/3Fr - Vv9xbFf/b2VQ/3mHdP+R4tP/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q28z/kuTW/36Z - hv9vY07/cW1Y/3FrVv9xa1b/cWtW/3NtV/9pY1H/qJ52/+rcnP/g0pb/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/hX5i/21nU/9ybFf/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFr - VgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cmxY/21lTf+tu8v/zOX//8bd/f/H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///G3f7/yuL//7vO6P9zblr/cGpV/3FrVv9xa1b/cWtW/3FsV/9vZVD/eIZy/5Hh0v+Q3M3/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5DbzP+S5NX/fZeE/29kTv9xbVj/cWtW/3FrVv9xa1b/c21X/2lj - Uf+mnXX/6tuc/+DSlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+HTl/+EfWH/bWdU/3Js - V/9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybVj/bGRL/6Wx - u//N5v//xtz9/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8bd/f/L4///tcbb/29pU/9xa1f/cWtW/3Fr - Vv9xa1b/cWxX/3BnUv92fmr/kNzN/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Lj - 1P96jXr/b2RP/3FsWP9xa1b/cWtW/3FrVv9zbVf/amRS/5yTb//p25v/4NOW/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//j1Zj/3c+U/3x1XP9uaVT/cmxW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFr - VgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9rY0r/l56f/83m///G3P3/x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//xtz9/8zl//+otcH/bGRM/3JtWP9xa1b/cWtW/3FrVv9xa1b/cWpU/3JwXP+N0sP/keDR/5Dc - zf+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/3Z9af9wZ1L/cWxX/3FrVv9xa1b/cWtW/3Js - V/9sZlP/i4Nl/+XXmf/h05f/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4dOW/+bYmf/Qw43/cmxW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cmxY/21m - T/+Dg3n/yeD//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///G3P3/zeb//5OZmP9rY0v/cm1Z/3Fr - Vv9xa1b/cWtW/3FrVv9xbFf/b2VQ/4e7q/+S49X/kNzM/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kNzN/5Hh - 0v+Ly7v/cWxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3BqVf93cFn/18qR/+TWmP/h05f/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//g0pb/6dub/7esfv9qZFL/c2xX/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFr - VhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3Fr - Vvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv+4yuD/yuL//8bd/v/H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97+/8jf///E2vb/e3ho/29oUv9ybFf/cWtW/3FrVv9xa1b/cWtW/3FtWP9vY07/fZaE/5Lk - 1v+P28z/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+P28z/kuXX/4Kpl/9vY07/cW1Y/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/c2xX/2pkUv+4rX//6dub/+DSlv/i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+HTlv/o2Zr/kopp/2tl - Uv9ybFf/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9ybVn/a2NL/5acnf/N5v//xdz8/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3P3/zeb//6ezvv9sZEz/cm1Y/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FqVf9ycFv/jdHC/5Hg0f+Q3M3/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3M3/dnxo/3BnUv9xbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/bGZT/4mCZP/l15n/4dOX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//h05b/5tiZ/8/DjP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3Fr - Vu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3Bq - Vf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrV/9walX/c21a/7vO4//K4v//xt39/8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x93+/8ff///G3Pj/fXtu/25nUP9ybFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cW1Y/29j - Tv9+m4j/kubX/4/bzP+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+P28v/kubX/4Otm/9vZE7/cW1Y/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9ybFf/a2VT/7yxgf/q25z/4NKW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+DSlv/p25v/l45r/2pl - Uv9zbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWP9sZU3/iImD/8vj///H3f3/x93+/8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///F3Pz/zuf//5ifof9rY0v/cm1Z/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3BoU/+IwLD/kuTW/4/ay/+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/j9vM/5Hi - 0/+Mz7//cnBb/3FpVP9xbFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsVv9uaFT/e3Vc/9vN - k//l15n/4NOW/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//f0pX/69yc/72xgv9sZlP/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFr - Vv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0 - YbdwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JtWf9rY0v/mJ+j/87n - ///G3fz/xt3+/8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe///H3v//x97//8fe - ///H3v7/xdz7/87o//+ptcL/bWZP/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xbFf/cGhT/3N0X/+N0cH/kuPU/4/ay/+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dd - zv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/4/bzP+R4NH/kNzM/3eBbf9wZlD/cWxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9rZVL/joZn/+XWmP/k1pj/4NKW/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/39KV/+nbm//Pw4z/dW9Y/29p - Vf9ybFb/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1WPgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9sZEz/m6Op/83l///I4P7/xdz8/8fe/v/H3v//x97//8fe - ///H3v//x97//8fe///H3v//x97//8fe///H3v//xtz9/8fe/f/O6P//qrfF/3BpU/9walX/cWxX/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbVj/cGZR/3V5Zf+Mz8D/kuXW/4/b - zP+Q3M3/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Ddzv+Q3c7/kN3O/5Dczf+P28z/kuPU/4/Z - yv94hnL/b2RP/3JtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Nt - V/9qZFL/k4pq/+LUl//n2Jr/4NKW/+HTl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LUl//i1Jf/4tSX/+LU - l//i1Jf/4dOW/+DSlv/r3Jz/z8KM/3pzW/9taFT/cmxX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2Ba - QgB6dGG3cGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Js - V/9sZEv/j5OR/8PZ9f/N5v//yN/+/8bc/f/G3f3/xt3+/8fe/v/H3v7/x97+/8fd/v/G3f3/xtz8/8fe - /v/M5f//yeD9/5ykq/9uZ1D/cGpV/3JsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xbVj/cGZR/3NyXv+HvKv/kuXW/5Hh0v+Q3M3/kNvM/5Dczf+Q3M3/kN3O/5Dd - zv+Q3c7/kNzN/5DbzP+Q28z/keDR/5Lm1/+KyLf/dnxo/29lT/9ybVj/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3NtV/9qZVL/h4Bj/9HEjf/r3Jz/5NaY/+DS - lv/g05b/4dOX/+LUl//i1Jf/4tSX/+HTl//h05b/4NKW/+HTlv/n2Jr/6dqb/7uwgf90blj/bWhU/3Ns - V/9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+KegBdVj4DYFpCAHp0YbdwalX/cWtW/HFrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsWP9sZEv/enZn/6axvv/F2/n/zeb//8zk - ///J4f//yN///8jf///I3///yeH//8vk///N5v//yOD+/6++0f+Cgnf/a2NL/3FrV/9ybFf/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbVj/cGlT/3Bn - Uf98k4D/i8u7/5Hj1P+S5db/keHT/5Hf0P+Q3s//kN7P/5Df0P+R4dL/kuTW/5Lk1f+N0cL/f5+N/3Fr - Vv9wZ1H/cW1Y/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3NtV/9sZlP/c21X/6iedv/ZzJL/6dub/+nam//m15n/5NWY/+PVmP/j1Zj/5NaY/+fY - mv/q25v/59ia/83Bi/+VjGv/a2ZT/29qVf9ybFf/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b+cWtW/3FrVu5xa1YRcWtWAHFrVgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4p6AF1W - PgNgWkIAenRht3BqVf9xa1b8cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3JtWf9vaFL/bGRL/3x5a/+XnqH/r73P/73R6//D2fj/xdv7/8Ta+f+/0+//s8PX/56n - r/+BgXb/bWZP/21mT/9ybVn/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xbFf/cWxX/29kTv9xbFf/eox5/4Svnv+KyLj/jtXG/4/a - y/+P2sv/jtbH/4vLu/+FtaT/fJOA/3JwW/9vY07/cWtW/3FsV/9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsV/9walb/aWRR/3hx - Wv+bkm7/vLGB/9LFjv/czpT/39GV/9/Rlf/ZzJL/zL+K/7OpfP+Ph2f/cGpV/2plUv9ybFf/cmxW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv5xa1b/cWtW7nFrVhFxa1YAcWtWAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPinoAXVY+A2BaQgB6dGG3cGpV/3FrVvxxa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3JsV/9ybVj/b2hR/2tj - Sv9tZk//dG9b/3p3Z/99e23/e3hp/3VwXv9vaFH/a2NK/21mT/9ybFj/cmxY/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cW1Y/3FrVv9vZU//b2NO/3FqVf9zc1//dXll/3V6Zv9zdGD/cWxX/29kT/9vZE7/cWpV/3Ft - WP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9zbVf/b2lV/2pkUv9rZVL/c2xX/3t0XP+AeV//f3he/3hy - Wv9walX/aWRS/2tlU/9xa1b/c2xX/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/nFrVv9xa1bucWtWEXFrVgBxa1YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+K - egBdVz4DYFpCAHp0YbZwalX/cWtW/HFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFf/cm1Z/3JsWP9walT/b2hS/25nUf9vaFL/cGpU/3Fs - V/9ybVn/cmxY/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FsWP9xbVj/cWtW/3Bp - VP9waFP/cGhS/3BpVP9xa1b/cWxY/3FtWP9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9ya1b/c21X/3JsV/9walb/b2lV/25oVP9uaFT/b2lV/3FrVv9zbVf/cmxX/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b+cWtW/3FrVu5ybFcQcmxXAHFr - VgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjop5AF1WPgNgWkIAenVht3BqVf9xa1b8cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrV/9ybFf/cmxX/3JsV/9xa1f/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWxX/3FsV/9xbFf/cWxX/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9ybFb/cmxW/3Js - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv5xa1b/cWtW7m5oUhBuaFIAb2lUAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACVkYMAXVU9A19YQAB7dWKvcGpV/3FrVvxxa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nFrVf9zbVntiINyEYaB - cAB+eGUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCtogB2cFwEdnBcAH13ZHFxa1b/cWtW+HFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFrVv5xa1b+cWtW/nFr - Vv5xa1b+cWtW/nFrVv5xa1b5cGpV/3hzX8AhGAAABAAAAZmVhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAIiDcgGinpAApaGUC3hyXs1xa1X/cGpV/XFrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3Fr - Vv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/3FrVv9xa1b/cWtW/nBqVf90b1r7g35sP396 - aAB9eGUD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACin5IAAAAAAIeCcQGWkoIAjYh4Fnp1 - YaB1b1vrcWtW73FrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFrVu5xa1bucWtW7nFr - Vu5xa1bucWtW7nFrVu5zbVnveHJexoR/bT1pY00Ac21YAk1IKQCZlIUAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAACDfmsAgHpoAIWAbwFeV0IBAAAAAJuXiQxxa1YRcWtWEHFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFr - VhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFxa1YRcWtWEXFrVhFybFcQbmhSEYiDchDc29gC////AH96 - ZwJrZlAAbGZQAKGcjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGekAB8d2MAf3pnAIR/ - bQJrZU8D7fHwAP///wBKQCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABuZ1AAbWdQAGNdRwJ6dWIDVE40AEU/IgCXkoQAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaimQCUkYEAraygAKmnmwCFgG8BcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFr - VgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAXFrVgFxa1YBcWtWAW9pVAF9eGUBmJSFAJiU - hQCPi3sAoZyPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////AAAAAAAAAAAA - AAAAAAP/9AAAAAAAAAAAAAAAAAABf+l/////////////////9L/iAAAAAAAAAAAAAAAAAAFf5AAAAAAA - AAAAAAAAAAAAv+gAAAAAAAAAAAAAAAAAAJ/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAA - AF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAA - AAAAAABfyAAAAAAAAAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAA - AAAAAAAAAAAAX8gAAAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAX8gA - AAAAAAAAAAAAAAAAAF/IAAAAAAAAAAAAAAAAAABfyAAAAAAAAAAAAAAAAAAAn+gAAAAAAAAAAAAAAAAA - AL/kAAAAAAAAAAAAAAAAAAFf6QAAAAAAAAAAAAAAAAACv/Sf////////////////6T/6AAAAAAAAAAAA - AAAAAAL///////////////////////////////////////////////////////////////////////// - //////////////////////////////////8= - - - \ No newline at end of file diff --git a/UI/UserControlPanelConfiguration.Designer.cs b/UI/UserControlPanelConfiguration.Designer.cs deleted file mode 100644 index d66e83e..0000000 --- a/UI/UserControlPanelConfiguration.Designer.cs +++ /dev/null @@ -1,334 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class UserControlPanelConfiguration - { - /// - /// 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 Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle19 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle20 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle(); - this.panel1 = new System.Windows.Forms.Panel(); - this.dataGridViewPanels = new System.Windows.Forms.DataGridView(); - this.PanelName = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Left = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Top = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Width = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Height = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.AlwaysOnTop = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.HideTitlebar = new System.Windows.Forms.DataGridViewCheckBoxColumn(); - this.label2 = new System.Windows.Forms.Label(); - this.buttonPixelLargeMinus = new System.Windows.Forms.Button(); - this.buttonPixelMinusSmall = new System.Windows.Forms.Button(); - this.buttonPixelPlusSmall = new System.Windows.Forms.Button(); - this.buttonPixelPlusLarge = new System.Windows.Forms.Button(); - this.buttonLockPanel = new System.Windows.Forms.Button(); - this.toolTipLargeMinus = new System.Windows.Forms.ToolTip(this.components); - this.toolTipSmallMinus = new System.Windows.Forms.ToolTip(this.components); - this.toolTipSmallPlus = new System.Windows.Forms.ToolTip(this.components); - this.toolTipLargePlus = new System.Windows.Forms.ToolTip(this.components); - this.panel1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridViewPanels)).BeginInit(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.Controls.Add(this.dataGridViewPanels); - this.panel1.Controls.Add(this.label2); - this.panel1.ForeColor = System.Drawing.Color.White; - this.panel1.Location = new System.Drawing.Point(0, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(915, 348); - this.panel1.TabIndex = 1; - // - // dataGridViewPanels - // - this.dataGridViewPanels.AllowUserToAddRows = false; - this.dataGridViewPanels.AllowUserToDeleteRows = false; - this.dataGridViewPanels.AllowUserToResizeColumns = false; - this.dataGridViewPanels.AllowUserToResizeRows = false; - dataGridViewCellStyle11.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle11.ForeColor = System.Drawing.Color.Black; - dataGridViewCellStyle11.Padding = new System.Windows.Forms.Padding(3); - this.dataGridViewPanels.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle11; - this.dataGridViewPanels.CausesValidation = false; - dataGridViewCellStyle12.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle12.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle12.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle12.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle12.Padding = new System.Windows.Forms.Padding(10, 3, 3, 3); - dataGridViewCellStyle12.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle12.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle12.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridViewPanels.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle12; - this.dataGridViewPanels.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridViewPanels.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.PanelName, - this.Left, - this.Top, - this.Width, - this.Height, - this.AlwaysOnTop, - this.HideTitlebar}); - dataGridViewCellStyle18.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle18.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle18.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle18.ForeColor = System.Drawing.Color.White; - dataGridViewCellStyle18.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle18.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle18.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewPanels.DefaultCellStyle = dataGridViewCellStyle18; - this.dataGridViewPanels.Location = new System.Drawing.Point(20, 35); - this.dataGridViewPanels.MultiSelect = false; - this.dataGridViewPanels.Name = "dataGridViewPanels"; - dataGridViewCellStyle19.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle19.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle19.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle19.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle19.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle19.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridViewPanels.RowHeadersDefaultCellStyle = dataGridViewCellStyle19; - this.dataGridViewPanels.RowHeadersVisible = false; - dataGridViewCellStyle20.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle20.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle20.Padding = new System.Windows.Forms.Padding(3); - this.dataGridViewPanels.RowsDefaultCellStyle = dataGridViewCellStyle20; - this.dataGridViewPanels.RowTemplate.Height = 25; - this.dataGridViewPanels.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.dataGridViewPanels.ShowCellErrors = false; - this.dataGridViewPanels.ShowCellToolTips = false; - this.dataGridViewPanels.ShowEditingIcon = false; - this.dataGridViewPanels.ShowRowErrors = false; - this.dataGridViewPanels.Size = new System.Drawing.Size(874, 310); - this.dataGridViewPanels.TabIndex = 8; - // - // PanelName - // - this.PanelName.DataPropertyName = "PanelName"; - dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - this.PanelName.DefaultCellStyle = dataGridViewCellStyle13; - this.PanelName.FillWeight = 80F; - this.PanelName.HeaderText = "Panel Name"; - this.PanelName.Name = "PanelName"; - this.PanelName.Width = 300; - // - // Left - // - this.Left.DataPropertyName = "Left"; - dataGridViewCellStyle14.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - this.Left.DefaultCellStyle = dataGridViewCellStyle14; - this.Left.FillWeight = 80F; - this.Left.HeaderText = "X Pos"; - this.Left.MaxInputLength = 6; - this.Left.Name = "Left"; - this.Left.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.Left.Width = 95; - // - // Top - // - this.Top.DataPropertyName = "Top"; - dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - this.Top.DefaultCellStyle = dataGridViewCellStyle15; - this.Top.FillWeight = 80F; - this.Top.HeaderText = "Y Pos"; - this.Top.MaxInputLength = 6; - this.Top.Name = "Top"; - this.Top.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.Top.Width = 95; - // - // Width - // - this.Width.DataPropertyName = "Width"; - dataGridViewCellStyle16.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - this.Width.DefaultCellStyle = dataGridViewCellStyle16; - this.Width.FillWeight = 80F; - this.Width.HeaderText = "Width"; - this.Width.MaxInputLength = 6; - this.Width.Name = "Width"; - this.Width.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.Width.Width = 95; - // - // Height - // - this.Height.DataPropertyName = "Height"; - dataGridViewCellStyle17.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - this.Height.DefaultCellStyle = dataGridViewCellStyle17; - this.Height.FillWeight = 80F; - this.Height.HeaderText = "Height"; - this.Height.MaxInputLength = 6; - this.Height.Name = "Height"; - this.Height.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.Height.Width = 95; - // - // AlwaysOnTop - // - this.AlwaysOnTop.DataPropertyName = "AlwaysOnTop"; - this.AlwaysOnTop.FalseValue = "false"; - this.AlwaysOnTop.FillWeight = 80F; - this.AlwaysOnTop.HeaderText = "Always on Top"; - this.AlwaysOnTop.Name = "AlwaysOnTop"; - this.AlwaysOnTop.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.AlwaysOnTop.TrueValue = "true"; - this.AlwaysOnTop.Width = 95; - // - // HideTitlebar - // - this.HideTitlebar.DataPropertyName = "HideTitlebar"; - this.HideTitlebar.FalseValue = "false"; - this.HideTitlebar.FillWeight = 80F; - this.HideTitlebar.HeaderText = "Hide Titlebar"; - this.HideTitlebar.Name = "HideTitlebar"; - this.HideTitlebar.Resizable = System.Windows.Forms.DataGridViewTriState.False; - this.HideTitlebar.TrueValue = "true"; - this.HideTitlebar.Width = 95; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label2.ForeColor = System.Drawing.Color.White; - this.label2.Location = new System.Drawing.Point(19, 9); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(192, 20); - this.label2.TabIndex = 7; - this.label2.Text = "Panel locations and settings"; - // - // buttonPixelLargeMinus - // - this.buttonPixelLargeMinus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonPixelLargeMinus.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonPixelLargeMinus.ForeColor = System.Drawing.Color.White; - this.buttonPixelLargeMinus.Location = new System.Drawing.Point(20, 354); - this.buttonPixelLargeMinus.Name = "buttonPixelLargeMinus"; - this.buttonPixelLargeMinus.Size = new System.Drawing.Size(69, 35); - this.buttonPixelLargeMinus.TabIndex = 24; - this.buttonPixelLargeMinus.Text = "-10 px"; - this.toolTipLargeMinus.SetToolTip(this.buttonPixelLargeMinus, "Ctrl -"); - this.buttonPixelLargeMinus.UseVisualStyleBackColor = false; - // - // buttonPixelMinusSmall - // - this.buttonPixelMinusSmall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonPixelMinusSmall.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonPixelMinusSmall.ForeColor = System.Drawing.Color.White; - this.buttonPixelMinusSmall.Location = new System.Drawing.Point(95, 354); - this.buttonPixelMinusSmall.Name = "buttonPixelMinusSmall"; - this.buttonPixelMinusSmall.Size = new System.Drawing.Size(69, 35); - this.buttonPixelMinusSmall.TabIndex = 25; - this.buttonPixelMinusSmall.Text = "-1 px"; - this.toolTipSmallMinus.SetToolTip(this.buttonPixelMinusSmall, "Ctrl ["); - this.buttonPixelMinusSmall.UseVisualStyleBackColor = false; - // - // buttonPixelPlusSmall - // - this.buttonPixelPlusSmall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonPixelPlusSmall.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonPixelPlusSmall.ForeColor = System.Drawing.Color.White; - this.buttonPixelPlusSmall.Location = new System.Drawing.Point(170, 354); - this.buttonPixelPlusSmall.Name = "buttonPixelPlusSmall"; - this.buttonPixelPlusSmall.Size = new System.Drawing.Size(69, 35); - this.buttonPixelPlusSmall.TabIndex = 26; - this.buttonPixelPlusSmall.Text = "+1 px"; - this.toolTipSmallPlus.SetToolTip(this.buttonPixelPlusSmall, "Ctrl ]"); - this.buttonPixelPlusSmall.UseVisualStyleBackColor = false; - // - // buttonPixelPlusLarge - // - this.buttonPixelPlusLarge.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonPixelPlusLarge.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonPixelPlusLarge.ForeColor = System.Drawing.Color.White; - this.buttonPixelPlusLarge.Location = new System.Drawing.Point(245, 354); - this.buttonPixelPlusLarge.Name = "buttonPixelPlusLarge"; - this.buttonPixelPlusLarge.Size = new System.Drawing.Size(69, 35); - this.buttonPixelPlusLarge.TabIndex = 27; - this.buttonPixelPlusLarge.Text = "+10 px"; - this.toolTipLargePlus.SetToolTip(this.buttonPixelPlusLarge, "Ctrl +"); - this.buttonPixelPlusLarge.UseVisualStyleBackColor = false; - // - // buttonLockPanel - // - this.buttonLockPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonLockPanel.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonLockPanel.ForeColor = System.Drawing.Color.White; - this.buttonLockPanel.Location = new System.Drawing.Point(772, 354); - this.buttonLockPanel.Name = "buttonLockPanel"; - this.buttonLockPanel.Size = new System.Drawing.Size(122, 35); - this.buttonLockPanel.TabIndex = 28; - this.buttonLockPanel.Text = "Lock Panels"; - this.buttonLockPanel.UseVisualStyleBackColor = false; - // - // UserControlPanelConfiguration - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.Transparent; - this.Controls.Add(this.buttonLockPanel); - this.Controls.Add(this.buttonPixelPlusLarge); - this.Controls.Add(this.buttonPixelPlusSmall); - this.Controls.Add(this.buttonPixelMinusSmall); - this.Controls.Add(this.buttonPixelLargeMinus); - this.Controls.Add(this.panel1); - this.Name = "UserControlPanelConfiguration"; - this.Size = new System.Drawing.Size(915, 405); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridViewPanels)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.DataGridView dataGridViewPanels; - private System.Windows.Forms.Button buttonPixelLargeMinus; - private System.Windows.Forms.Button buttonPixelMinusSmall; - private System.Windows.Forms.Button buttonPixelPlusSmall; - private System.Windows.Forms.Button buttonPixelPlusLarge; - private System.Windows.Forms.DataGridViewTextBoxColumn PanelName; - private System.Windows.Forms.DataGridViewTextBoxColumn Left; - private System.Windows.Forms.DataGridViewTextBoxColumn Top; - private System.Windows.Forms.DataGridViewTextBoxColumn Width; - private System.Windows.Forms.DataGridViewTextBoxColumn Height; - private System.Windows.Forms.DataGridViewCheckBoxColumn AlwaysOnTop; - private System.Windows.Forms.DataGridViewCheckBoxColumn HideTitlebar; - private System.Windows.Forms.Button buttonLockPanel; - private System.Windows.Forms.ToolTip toolTipLargeMinus; - private System.Windows.Forms.ToolTip toolTipSmallMinus; - private System.Windows.Forms.ToolTip toolTipSmallPlus; - private System.Windows.Forms.ToolTip toolTipLargePlus; - } -} diff --git a/UI/UserControlPanelConfiguration.cs b/UI/UserControlPanelConfiguration.cs deleted file mode 100644 index 3ffc18e..0000000 --- a/UI/UserControlPanelConfiguration.cs +++ /dev/null @@ -1,187 +0,0 @@ -using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UIController; -using System; -using System.Drawing; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class UserControlPanelConfiguration : UserControl, IPanelConfigurationView - { - private PanelConfigurationController _controller; - - public bool IsPanelLocked { set => SetProfileLockButtonText(_controller.DataStore.ActiveUserProfile.IsLocked); } - - public bool IsPanelChangeDisabled { set => this.Enabled = !value; } - - public UserControlPanelConfiguration() - { - InitializeComponent(); - } - - public void Initialize(PanelConfigurationController controller) - { - _controller = controller; - - _controller.RefreshDataUI += (source, e) => dataGridViewPanels.Refresh(); - _controller.HightlightSelectedPanel += HandleHighlightSelectedPanel; - - dataGridViewPanels.AutoGenerateColumns = false; - dataGridViewPanels.AutoSize = false; - dataGridViewPanels.DataSource = _controller.DataStore.PanelConfigs; - dataGridViewPanels.CellValidating += HandleCellValidating; - dataGridViewPanels.CellEndEdit += HandleCellValueChanged; - dataGridViewPanels.CellContentClick += HandleCellContentChanged; // for checkbox columns - dataGridViewPanels.CellFormatting += HandleCellFormatting; - - buttonPixelPlusLarge.Click += (source, e) => HandleCellValueIncrDecr(10); - buttonPixelPlusSmall.Click += (source, e) => HandleCellValueIncrDecr(1); - buttonPixelLargeMinus.Click += (source, e) => HandleCellValueIncrDecr(-10); - buttonPixelMinusSmall.Click += (source, e) => HandleCellValueIncrDecr(-1); - - buttonLockPanel.Click += HandleLockPanelChanged; - } - - private void HandleCellFormatting(object sender, DataGridViewCellFormattingEventArgs e) - { - if (e.ColumnIndex >= 0 && e.RowIndex >= 0) - { - var column = (PanelConfigDataColumn)Enum.Parse(typeof(PanelConfigDataColumn), dataGridViewPanels.Columns[e.ColumnIndex].Name); - - var dgv = sender as DataGridView; - var data = dgv.Rows[e.RowIndex].DataBoundItem as PanelConfig; - - if (column == PanelConfigDataColumn.PanelName || column == PanelConfigDataColumn.HideTitlebar) - { - if(data.PanelType == PanelType.BuiltInPopout) - dgv[e.ColumnIndex, e.RowIndex].ReadOnly = true; - } - } - } - - private void HandleCellValueIncrDecr(int changedAmount) - { - var activeCell = dataGridViewPanels.CurrentCell; - - if (activeCell != null) - { - var rowIndex = dataGridViewPanels.CurrentCell.RowIndex; - var column = (PanelConfigDataColumn)Enum.Parse(typeof(PanelConfigDataColumn), dataGridViewPanels.Columns[dataGridViewPanels.CurrentCell.ColumnIndex].Name); - _controller.CellValueIncrDecr(rowIndex, column, changedAmount); - } - } - - private void HandleCellValueChanged(object sender, DataGridViewCellEventArgs e) - { - if (e.ColumnIndex >= 0 && e.ColumnIndex <= 4 && e.RowIndex >= 0) - { - dataGridViewPanels.EndEdit(); - var column = (PanelConfigDataColumn)Enum.Parse(typeof(PanelConfigDataColumn), dataGridViewPanels.Columns[e.ColumnIndex].Name); - _controller.CellValueChanged(e.RowIndex, column, dataGridViewPanels[e.ColumnIndex, e.RowIndex].EditedFormattedValue); - } - } - - private void HandleCellContentChanged(object sender, DataGridViewCellEventArgs e) - { - if ((e.ColumnIndex == 5 || e.ColumnIndex == 6) && e.RowIndex >= 0) - { - var column = (PanelConfigDataColumn)Enum.Parse(typeof(PanelConfigDataColumn), dataGridViewPanels.Columns[e.ColumnIndex].Name); - _controller.CellValueChanged(e.RowIndex, column, dataGridViewPanels[e.ColumnIndex, e.RowIndex].EditedFormattedValue); - } - } - - private void HandleCellValidating(object sender, DataGridViewCellValidatingEventArgs e) - { - if (e.ColumnIndex >= 0 && e.RowIndex >= 0) - { - var column = (PanelConfigDataColumn)Enum.Parse(typeof(PanelConfigDataColumn), dataGridViewPanels.Columns[e.ColumnIndex].Name); - - // Allow cell edit for only specific data type in each column - switch (column) - { - case PanelConfigDataColumn.PanelName: - if (!(e.FormattedValue is String)) - e.Cancel = true; - break; - case PanelConfigDataColumn.Left: - case PanelConfigDataColumn.Top: - case PanelConfigDataColumn.Width: - case PanelConfigDataColumn.Height: - // must be numbers - int i; - bool result = int.TryParse(Convert.ToString(e.FormattedValue), out i); - - if (!result) - e.Cancel = true; - break; - default: - return; - } - } - } - - private void HandleHighlightSelectedPanel(object sender, EventArgs e) - { - dataGridViewPanels.ClearSelection(); - dataGridViewPanels.Rows[e.Value].Selected = true; - } - - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - if (!_controller.DataStore.ActiveUserProfile.IsLocked) - { - if (keyData == (Keys.Oemplus | Keys.Control) || keyData == (Keys.Add | Keys.Control)) - { - HandleCellValueIncrDecr(10); - } - else if (keyData == (Keys.OemMinus | Keys.Control) || keyData == (Keys.Subtract | Keys.Control)) - { - HandleCellValueIncrDecr(-10); - } - else if (keyData == (Keys.OemCloseBrackets | Keys.Control)) - { - HandleCellValueIncrDecr(1); - } - else if (keyData == (Keys.OemOpenBrackets | Keys.Control)) - { - HandleCellValueIncrDecr(-1); - } - } - - return base.ProcessCmdKey(ref msg, keyData); - } - - private void HandleLockPanelChanged(object sender, EventArgs e) - { - if (!_controller.DataStore.ActiveUserProfile.IsLocked) - { - _controller.LockPanelChanged(true); - } - else - { - var title = "Confirm Unlock Panels"; - var message = "Are you sure you want to unlock all panels to make changes?"; - - using (var form = new ConfirmDialogForm(title, message) { StartPosition = FormStartPosition.CenterParent }) - { - if (form.ShowDialog() == DialogResult.Yes) - { - _controller.LockPanelChanged(false); - } - } - } - } - - private void SetProfileLockButtonText(bool isLocked) - { - buttonLockPanel.Text = isLocked ? "Unlock Panels" : "Lock Panels"; - buttonLockPanel.BackColor = isLocked ? Color.Red : Color.FromArgb(17, 158, 218); - - dataGridViewPanels.ReadOnly = isLocked; - buttonPixelLargeMinus.Enabled = !isLocked; - buttonPixelMinusSmall.Enabled = !isLocked; - buttonPixelPlusLarge.Enabled = !isLocked; - buttonPixelPlusSmall.Enabled = !isLocked; - } - } -} diff --git a/UI/UserControlPanelConfiguration.resx b/UI/UserControlPanelConfiguration.resx deleted file mode 100644 index e10dca5..0000000 --- a/UI/UserControlPanelConfiguration.resx +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - 17, 17 - - - 187, 17 - - - 292, 17 - - - 397, 17 - - - 17, 17 - - - 187, 17 - - - 292, 17 - - - 397, 17 - - \ No newline at end of file diff --git a/UI/UserControlPanelSelection.Designer.cs b/UI/UserControlPanelSelection.Designer.cs deleted file mode 100644 index 98637a8..0000000 --- a/UI/UserControlPanelSelection.Designer.cs +++ /dev/null @@ -1,410 +0,0 @@ - -namespace MSFSPopoutPanelManager.UI -{ - partial class UserControlPanelSelection - { - /// - /// 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 Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); - this.dataGridViewPanelCoor = new System.Windows.Forms.DataGridView(); - this.PanelIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.X = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Y = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.panel1 = new System.Windows.Forms.Panel(); - this.buttonDeleteProfile = new System.Windows.Forms.Button(); - this.buttonAddProfile = new System.Windows.Forms.Button(); - this.buttonSetDefault = new System.Windows.Forms.Button(); - this.label2 = new System.Windows.Forms.Label(); - this.comboBoxProfile = new System.Windows.Forms.ComboBox(); - this.panel2 = new System.Windows.Forms.Panel(); - this.label1 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.buttonStartPanelSelection = new System.Windows.Forms.Button(); - this.label3 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.panel4 = new System.Windows.Forms.Panel(); - this.checkBoxShowPanelLocation = new System.Windows.Forms.CheckBox(); - this.buttonStartPopOut = new System.Windows.Forms.Button(); - this.panel3 = new System.Windows.Forms.Panel(); - this.label7 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridViewPanelCoor)).BeginInit(); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.panel4.SuspendLayout(); - this.panel3.SuspendLayout(); - this.SuspendLayout(); - // - // dataGridViewPanelCoor - // - this.dataGridViewPanelCoor.AllowUserToAddRows = false; - this.dataGridViewPanelCoor.AllowUserToDeleteRows = false; - this.dataGridViewPanelCoor.AllowUserToResizeColumns = false; - this.dataGridViewPanelCoor.AllowUserToResizeRows = false; - dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle9.ForeColor = System.Drawing.Color.Black; - this.dataGridViewPanelCoor.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle9; - this.dataGridViewPanelCoor.CausesValidation = false; - dataGridViewCellStyle10.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle10.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle10.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle10.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle10.Padding = new System.Windows.Forms.Padding(18, 3, 3, 3); - dataGridViewCellStyle10.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle10.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewPanelCoor.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle10; - this.dataGridViewPanelCoor.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridViewPanelCoor.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.PanelIndex, - this.X, - this.Y}); - dataGridViewCellStyle14.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle14.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle14.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle14.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle14.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle14.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle14.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewPanelCoor.DefaultCellStyle = dataGridViewCellStyle14; - this.dataGridViewPanelCoor.Location = new System.Drawing.Point(18, 42); - this.dataGridViewPanelCoor.MultiSelect = false; - this.dataGridViewPanelCoor.Name = "dataGridViewPanelCoor"; - this.dataGridViewPanelCoor.ReadOnly = true; - dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle15.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle15.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - dataGridViewCellStyle15.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle15.Padding = new System.Windows.Forms.Padding(3); - dataGridViewCellStyle15.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle15.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle15.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridViewPanelCoor.RowHeadersDefaultCellStyle = dataGridViewCellStyle15; - this.dataGridViewPanelCoor.RowHeadersVisible = false; - dataGridViewCellStyle16.Padding = new System.Windows.Forms.Padding(3); - this.dataGridViewPanelCoor.RowsDefaultCellStyle = dataGridViewCellStyle16; - this.dataGridViewPanelCoor.RowTemplate.Height = 25; - this.dataGridViewPanelCoor.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.dataGridViewPanelCoor.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect; - this.dataGridViewPanelCoor.ShowCellErrors = false; - this.dataGridViewPanelCoor.ShowCellToolTips = false; - this.dataGridViewPanelCoor.ShowEditingIcon = false; - this.dataGridViewPanelCoor.ShowRowErrors = false; - this.dataGridViewPanelCoor.Size = new System.Drawing.Size(303, 286); - this.dataGridViewPanelCoor.TabIndex = 18; - // - // PanelIndex - // - this.PanelIndex.DataPropertyName = "PanelIndex"; - dataGridViewCellStyle11.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle11.ForeColor = System.Drawing.Color.Black; - this.PanelIndex.DefaultCellStyle = dataGridViewCellStyle11; - this.PanelIndex.HeaderText = "Panel"; - this.PanelIndex.Name = "PanelIndex"; - this.PanelIndex.ReadOnly = true; - // - // X - // - this.X.DataPropertyName = "X"; - dataGridViewCellStyle12.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle12.ForeColor = System.Drawing.Color.Black; - this.X.DefaultCellStyle = dataGridViewCellStyle12; - this.X.HeaderText = "X-Pos"; - this.X.Name = "X"; - this.X.ReadOnly = true; - // - // Y - // - this.Y.DataPropertyName = "Y"; - dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; - dataGridViewCellStyle13.ForeColor = System.Drawing.Color.Black; - this.Y.DefaultCellStyle = dataGridViewCellStyle13; - this.Y.HeaderText = "Y-Pos"; - this.Y.Name = "Y"; - this.Y.ReadOnly = true; - // - // panel1 - // - this.panel1.Controls.Add(this.buttonDeleteProfile); - this.panel1.Controls.Add(this.buttonAddProfile); - this.panel1.Controls.Add(this.buttonSetDefault); - this.panel1.Controls.Add(this.label2); - this.panel1.Controls.Add(this.comboBoxProfile); - this.panel1.ForeColor = System.Drawing.Color.White; - this.panel1.Location = new System.Drawing.Point(0, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(579, 118); - this.panel1.TabIndex = 0; - // - // buttonDeleteProfile - // - this.buttonDeleteProfile.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonDeleteProfile.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonDeleteProfile.ForeColor = System.Drawing.Color.White; - this.buttonDeleteProfile.Location = new System.Drawing.Point(167, 75); - this.buttonDeleteProfile.Name = "buttonDeleteProfile"; - this.buttonDeleteProfile.Size = new System.Drawing.Size(118, 35); - this.buttonDeleteProfile.TabIndex = 21; - this.buttonDeleteProfile.Text = "Delete Profile"; - this.buttonDeleteProfile.UseVisualStyleBackColor = false; - // - // buttonAddProfile - // - this.buttonAddProfile.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonAddProfile.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonAddProfile.ForeColor = System.Drawing.Color.White; - this.buttonAddProfile.Location = new System.Drawing.Point(35, 75); - this.buttonAddProfile.Name = "buttonAddProfile"; - this.buttonAddProfile.Size = new System.Drawing.Size(115, 35); - this.buttonAddProfile.TabIndex = 20; - this.buttonAddProfile.Text = "Add Profile"; - this.buttonAddProfile.UseVisualStyleBackColor = false; - // - // buttonSetDefault - // - this.buttonSetDefault.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonSetDefault.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonSetDefault.ForeColor = System.Drawing.Color.White; - this.buttonSetDefault.Location = new System.Drawing.Point(300, 75); - this.buttonSetDefault.Name = "buttonSetDefault"; - this.buttonSetDefault.Size = new System.Drawing.Size(107, 35); - this.buttonSetDefault.TabIndex = 19; - this.buttonSetDefault.Text = "Set Default"; - this.buttonSetDefault.UseVisualStyleBackColor = false; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label2.ForeColor = System.Drawing.Color.White; - this.label2.Location = new System.Drawing.Point(20, 10); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(315, 20); - this.label2.TabIndex = 7; - this.label2.Text = "1. Please select a profile you would like to use."; - // - // comboBoxProfile - // - this.comboBoxProfile.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxProfile.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.comboBoxProfile.ForeColor = System.Drawing.Color.Black; - this.comboBoxProfile.FormattingEnabled = true; - this.comboBoxProfile.Location = new System.Drawing.Point(35, 41); - this.comboBoxProfile.Name = "comboBoxProfile"; - this.comboBoxProfile.Size = new System.Drawing.Size(445, 28); - this.comboBoxProfile.TabIndex = 5; - // - // panel2 - // - this.panel2.Controls.Add(this.label1); - this.panel2.Controls.Add(this.label5); - this.panel2.Controls.Add(this.label4); - this.panel2.Controls.Add(this.buttonStartPanelSelection); - this.panel2.Controls.Add(this.label3); - this.panel2.Location = new System.Drawing.Point(0, 117); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(579, 172); - this.panel2.TabIndex = 8; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label1.ForeColor = System.Drawing.Color.White; - this.label1.Location = new System.Drawing.Point(35, 37); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(213, 20); - this.label1.TabIndex = 12; - this.label1.Text = "LEFT CLICK to add a new panel"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label5.ForeColor = System.Drawing.Color.White; - this.label5.Location = new System.Drawing.Point(35, 97); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(523, 20); - this.label5.TabIndex = 11; - this.label5.Text = "CTRL + LEFT CLICK when all panels have been selected or to cancel selections."; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label4.ForeColor = System.Drawing.Color.White; - this.label4.Location = new System.Drawing.Point(35, 66); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(418, 20); - this.label4.TabIndex = 10; - this.label4.Text = "SHIFT + LEFT CLICK to remove the most recently added panel."; - // - // buttonStartPanelSelection - // - this.buttonStartPanelSelection.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonStartPanelSelection.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonStartPanelSelection.ForeColor = System.Drawing.Color.White; - this.buttonStartPanelSelection.Location = new System.Drawing.Point(32, 127); - this.buttonStartPanelSelection.Name = "buttonStartPanelSelection"; - this.buttonStartPanelSelection.Size = new System.Drawing.Size(170, 35); - this.buttonStartPanelSelection.TabIndex = 9; - this.buttonStartPanelSelection.Text = "Start Panel Selection"; - this.buttonStartPanelSelection.UseVisualStyleBackColor = false; - // - // label3 - // - this.label3.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label3.ForeColor = System.Drawing.Color.White; - this.label3.Location = new System.Drawing.Point(20, 4); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(551, 27); - this.label3.TabIndex = 7; - this.label3.Text = "2. Identify pop out panel locations in the game by clicking on them."; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label6.ForeColor = System.Drawing.Color.White; - this.label6.Location = new System.Drawing.Point(113, 10); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(111, 20); - this.label6.TabIndex = 11; - this.label6.Text = "Panel Locations"; - // - // panel4 - // - this.panel4.Controls.Add(this.dataGridViewPanelCoor); - this.panel4.Controls.Add(this.checkBoxShowPanelLocation); - this.panel4.Controls.Add(this.label6); - this.panel4.Location = new System.Drawing.Point(577, 0); - this.panel4.Name = "panel4"; - this.panel4.Size = new System.Drawing.Size(338, 403); - this.panel4.TabIndex = 13; - // - // checkBoxShowPanelLocation - // - this.checkBoxShowPanelLocation.AutoSize = true; - this.checkBoxShowPanelLocation.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.checkBoxShowPanelLocation.ForeColor = System.Drawing.Color.White; - this.checkBoxShowPanelLocation.Location = new System.Drawing.Point(67, 342); - this.checkBoxShowPanelLocation.Name = "checkBoxShowPanelLocation"; - this.checkBoxShowPanelLocation.Size = new System.Drawing.Size(213, 24); - this.checkBoxShowPanelLocation.TabIndex = 17; - this.checkBoxShowPanelLocation.Text = "Show Panel Location Ovelay"; - this.checkBoxShowPanelLocation.UseVisualStyleBackColor = true; - // - // buttonStartPopOut - // - this.buttonStartPopOut.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(158)))), ((int)(((byte)(218))))); - this.buttonStartPopOut.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonStartPopOut.ForeColor = System.Drawing.Color.White; - this.buttonStartPopOut.Location = new System.Drawing.Point(32, 41); - this.buttonStartPopOut.Name = "buttonStartPopOut"; - this.buttonStartPopOut.Size = new System.Drawing.Size(118, 35); - this.buttonStartPopOut.TabIndex = 18; - this.buttonStartPopOut.Text = "Start Pop Out"; - this.buttonStartPopOut.UseVisualStyleBackColor = false; - // - // panel3 - // - this.panel3.Controls.Add(this.buttonStartPopOut); - this.panel3.Controls.Add(this.label7); - this.panel3.ForeColor = System.Drawing.Color.White; - this.panel3.Location = new System.Drawing.Point(0, 290); - this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(579, 113); - this.panel3.TabIndex = 14; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.label7.ForeColor = System.Drawing.Color.White; - this.label7.Location = new System.Drawing.Point(20, 10); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(323, 20); - this.label7.TabIndex = 7; - this.label7.Text = "3. Start the pop out process for selected panels."; - // - // UserControlPanelSelection - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.Transparent; - this.Controls.Add(this.panel3); - this.Controls.Add(this.panel4); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Name = "UserControlPanelSelection"; - this.Size = new System.Drawing.Size(915, 405); - ((System.ComponentModel.ISupportInitialize)(this.dataGridViewPanelCoor)).EndInit(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.panel4.ResumeLayout(false); - this.panel4.PerformLayout(); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.ComboBox comboBoxProfile; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Button buttonStartPanelSelection; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.CheckBox checkBoxShowPanelLocation; - private System.Windows.Forms.Button buttonStartPopOut; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Button buttonSetDefault; - private System.Windows.Forms.Button buttonAddProfile; - private System.Windows.Forms.Button buttonDeleteProfile; - private System.Windows.Forms.DataGridView dataGridViewPanelCoor; - private System.Windows.Forms.DataGridViewTextBoxColumn PanelIndex; - private System.Windows.Forms.DataGridViewTextBoxColumn X; - private System.Windows.Forms.DataGridViewTextBoxColumn Y; - } -} diff --git a/UI/UserControlPanelSelection.cs b/UI/UserControlPanelSelection.cs deleted file mode 100644 index 2cf63b8..0000000 --- a/UI/UserControlPanelSelection.cs +++ /dev/null @@ -1,166 +0,0 @@ -using MSFSPopoutPanelManager.Shared; -using MSFSPopoutPanelManager.UIController; -using System; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UI -{ - public partial class UserControlPanelSelection : UserControl, IPanelSelectionView - { - private PanelSelectionController _controller; - - #region Implement view interface - - public Form Form { get => ParentForm; } - - public bool ShowPanelLocationOverlay { get => checkBoxShowPanelLocation.Checked; set => checkBoxShowPanelLocation.Checked = value; } - - #endregion - - public UserControlPanelSelection() - { - InitializeComponent(); - } - - public void Initialize(PanelSelectionController controller) - { - _controller = controller; - _controller.OnUIStateChanged += HandleOnUIStateChanged; - _controller.Initialize(); - - // Set bindings - comboBoxProfile.DisplayMember = "ProfileName"; - comboBoxProfile.ValueMember = "ProfileId"; - comboBoxProfile.DataSource = _controller.DataStore.UserProfiles; - comboBoxProfile.DataBindings.Add("SelectedValue", _controller.DataStore, "ActiveUserProfileId"); - - comboBoxProfile.SelectedValue = -1; // forced a default - comboBoxProfile.SelectedIndexChanged += HandleProfileChanged; - - buttonAddProfile.Click += HandleAddProfile; - buttonDeleteProfile.Click += HandleDeleteProfile; - buttonSetDefault.Click += (source, e) => _controller.SetDefaultProfile(); - buttonStartPanelSelection.Click += HandleStartPanelSelection; - buttonStartPopOut.Click += (source, e) => _controller.StartPopOut(); - - dataGridViewPanelCoor.AutoGenerateColumns = false; - dataGridViewPanelCoor.AutoSize = false; - dataGridViewPanelCoor.DataSource = _controller.DataStore.ActiveProfilePanelCoordinates; - - checkBoxShowPanelLocation.CheckedChanged += (source, e) => _controller.SetPanelLocationOverlayChanged(); - } - - - private void HandleProfileChanged(object sender, EventArgs e) - { - if(Convert.ToInt32(comboBoxProfile.SelectedValue) > 0) - _controller.ProfileChanged(Convert.ToInt32(comboBoxProfile.SelectedValue)); - } - - private void HandleAddProfile(object sender, EventArgs e) - { - using (var form = new AddProfileForm { StartPosition = FormStartPosition.CenterParent }) - { - var dialogResult = form.ShowDialog(); - - if (dialogResult == DialogResult.OK) - { - _controller.AddProfile(form.ProfileName); - } - } - } - - private void HandleDeleteProfile(object sender, EventArgs e) - { - var title = "Confirm Delete"; - var message = "Are you sure you want to delete the selected profile?"; - - using (var form = new ConfirmDialogForm(title, message) { StartPosition = FormStartPosition.CenterParent }) - { - if (form.ShowDialog() == DialogResult.Yes) - _controller.DeleteProfile(); - } - } - - private void HandleStartPanelSelection(object sender, EventArgs e) - { - if (!_controller.HasExistingPanelCoordinates) - { - _controller.StartPanelSelection(); - } - else - { - var title = "Confirm Overwrite"; - var message = "WARNING! Are you sure you want to overwrite existing saved panel locations and ALL settings for this profile?"; - - using (var form = new ConfirmDialogForm(title, message) { StartPosition = FormStartPosition.CenterParent }) - { - if (form.ShowDialog() == DialogResult.Yes) - _controller.StartPanelSelection(); - } - } - } - - private void HandleOnUIStateChanged(object sender, EventArgs e) - { - switch (e.Value) - { - case PanelSelectionUIState.NoProfileSelected: - comboBoxProfile.Enabled = true; - buttonAddProfile.Enabled = true; - buttonDeleteProfile.Enabled = false; - buttonSetDefault.Enabled = false; - buttonStartPanelSelection.Enabled = false; - checkBoxShowPanelLocation.Enabled = false; - buttonStartPopOut.Enabled = false; - break; - case PanelSelectionUIState.ProfileSelected: - comboBoxProfile.Enabled = true; - buttonAddProfile.Enabled = true; - buttonDeleteProfile.Enabled = true; - buttonSetDefault.Enabled = true; - buttonStartPanelSelection.Enabled = true; - checkBoxShowPanelLocation.Enabled = true; - buttonStartPopOut.Enabled = false; - break; - case PanelSelectionUIState.PanelSelectionStarted: - comboBoxProfile.Enabled = true; - buttonAddProfile.Enabled = false; - buttonDeleteProfile.Enabled = false; - buttonSetDefault.Enabled = false; - buttonStartPanelSelection.Enabled = false; - checkBoxShowPanelLocation.Enabled = false; - buttonStartPopOut.Enabled = false; - break; - case PanelSelectionUIState.PanelSelectionCompletedValid: - comboBoxProfile.Enabled = true; - buttonAddProfile.Enabled = true; - buttonDeleteProfile.Enabled = true; - buttonSetDefault.Enabled = true; - buttonStartPanelSelection.Enabled = true; - checkBoxShowPanelLocation.Enabled = true; - buttonStartPopOut.Enabled = true; - buttonStartPopOut.Focus(); - break; - case PanelSelectionUIState.PanelSelectionCompletedInvalid: - comboBoxProfile.Enabled = true; - buttonAddProfile.Enabled = true; - buttonDeleteProfile.Enabled = true; - buttonSetDefault.Enabled = true; - buttonStartPanelSelection.Enabled = true; - checkBoxShowPanelLocation.Enabled = true; - buttonStartPopOut.Enabled = false; - break; - case PanelSelectionUIState.PopoutStarted: - comboBoxProfile.Enabled = false; - buttonAddProfile.Enabled = false; - buttonDeleteProfile.Enabled = false; - buttonSetDefault.Enabled = false; - buttonStartPanelSelection.Enabled = false; - checkBoxShowPanelLocation.Enabled = false; - buttonStartPopOut.Enabled = false; - break; - } - } - } -} diff --git a/UI/UserControlPanelSelection.resx b/UI/UserControlPanelSelection.resx deleted file mode 100644 index be4289f..0000000 --- a/UI/UserControlPanelSelection.resx +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - True - - - True - - - True - - \ No newline at end of file diff --git a/UIController/ApplicationController.cs b/UIController/ApplicationController.cs deleted file mode 100644 index 20ccaf3..0000000 --- a/UIController/ApplicationController.cs +++ /dev/null @@ -1,140 +0,0 @@ - -using MSFSPopoutPanelManager.Provider; -using MSFSPopoutPanelManager.Shared; -using System; - -namespace MSFSPopoutPanelManager.UIController -{ - public class ApplicationController - { - private const int MSFS_CONNECTION_CHECK_INTERVAL = 3000; - private System.Timers.Timer _timer; - private IApplicationView _view; - private AppSettingData _appSettings; - - protected DataStore UserProfileDataStore { get; set; } - - public ApplicationController(IApplicationView view) - { - _view = view; - UserProfileDataStore = new DataStore(); - } - - public PanelSelectionController PanelSelectionController { get; set; } - - public PanelConfigurationController PanelConfigurationController { get; set; } - - public event EventHandler> OnSimConnectionChanged; - - public event EventHandler OnPanelSelectionActivated; - - public event EventHandler OnPanelConfigurationActivated; - - public void Initialize() - { - PanelSelectionController = new PanelSelectionController(_view.PanelSelection, UserProfileDataStore); - PanelConfigurationController = new PanelConfigurationController(_view.PanelConfiguration, UserProfileDataStore); - - PanelSelectionController.OnPopOutCompleted += (source, e) => - { - PanelConfigurationController.Initialize(); - OnPanelConfigurationActivated?.Invoke(this, null); - }; - - OnPanelSelectionActivated?.Invoke(this, null); - CheckSimulatorStarted(); - - _appSettings = FileManager.ReadAppSettingData(); - _view.AlwaysOnTop = _appSettings.AlwaysOnTop; - _view.AutoPanning = _appSettings.UseAutoPanning; - _view.AutoStart = Autostart.CheckIsAutoStart(); - _view.MinimizeToTray = _appSettings.MinimizeToTray; - - if (_view.AlwaysOnTop) - _view.Form.TopMost = true; - } - - private void CheckSimulatorStarted() - { - OnSimConnectionChanged?.Invoke(this, new EventArgs(false)); - - // Autoconnect to flight simulator - _timer = new System.Timers.Timer(); - _timer.Interval = MSFS_CONNECTION_CHECK_INTERVAL; - _timer.Enabled = true; - _timer.Elapsed += (source, e) => - { - var simulatorProcess = WindowManager.GetSimulatorProcess(); - OnSimConnectionChanged?.Invoke(this, new EventArgs(simulatorProcess != null)); - }; - } - - public void Restart() - { - PanelConfigurationController.UnhookWinEvent(); - - // Try to close all Cutome Panel window - UserProfileDataStore.ActiveUserProfile.PanelConfigs.FindAll(p => p.PanelType == PanelType.CustomPopout).ForEach(panel => WindowManager.CloseWindow(panel.PanelHandle)); - - OnPanelSelectionActivated?.Invoke(this, null); - Logger.ClearStatus(); - } - - public void SetMinimizeToTray(bool value) { - _appSettings.MinimizeToTray = value; - FileManager.WriteAppSettingData(_appSettings); - } - - public void SetAlwaysOnTop(bool value) - { - _appSettings.AlwaysOnTop = value; - FileManager.WriteAppSettingData(_appSettings); - - WindowManager.ApplyAlwaysOnTop(_view.Form.Handle, value, _view.Form.Bounds); - } - - public void SetAutoStart(bool value) - { - if (value) - Autostart.Activate(); - else - Autostart.Deactivate(); - } - - public void SetAutoPanning(bool value) - { - _appSettings.UseAutoPanning = value; - FileManager.WriteAppSettingData(_appSettings); - } - - public void MinimizeAllPanels(bool isMinimized) - { - if (isMinimized) - { - PanelConfigurationController.DisablePanelChanges(true); - PInvoke.EnumWindows(new PInvoke.CallBack(EnumAllPanels), 0); - } - else - { - PanelConfigurationController.DisablePanelChanges(false); - PInvoke.EnumWindows(new PInvoke.CallBack(EnumAllPanels), 1); - } - } - - public bool EnumAllPanels(IntPtr hwnd, int index) - { - var className = PInvoke.GetClassName(hwnd); - var caption = PInvoke.GetWindowText(hwnd); - - if (className == "AceApp" && caption.IndexOf("Microsoft Flight Simulator") == -1) // MSFS windows designation - { - if(index == 0) - PInvoke.ShowWindow(hwnd, PInvokeConstant.SW_MINIMIZE); - else - PInvoke.ShowWindow(hwnd, PInvokeConstant.SW_RESTORE); - } - - return true; - } - } -} diff --git a/UIController/IApplicationView.cs b/UIController/IApplicationView.cs deleted file mode 100644 index 9203a5a..0000000 --- a/UIController/IApplicationView.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UIController -{ - public interface IApplicationView - { - public Form Form { get; } - - public IPanelSelectionView PanelSelection { get; } - - public IPanelConfigurationView PanelConfiguration { get; } - - public bool MinimizeToTray { get; set; } - - public bool AlwaysOnTop { get; set; } - - public bool AutoStart { get; set; } - - public bool AutoPanning { get; set; } - } -} diff --git a/UIController/IPanelConfigurationView.cs b/UIController/IPanelConfigurationView.cs deleted file mode 100644 index 5c0e7ed..0000000 --- a/UIController/IPanelConfigurationView.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MSFSPopoutPanelManager.UIController -{ - public interface IPanelConfigurationView - { - public bool IsPanelLocked { set; } - - public bool IsPanelChangeDisabled { set; } - } -} diff --git a/UIController/IPanelSelectionView.cs b/UIController/IPanelSelectionView.cs deleted file mode 100644 index d8e3c61..0000000 --- a/UIController/IPanelSelectionView.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UIController -{ - public interface IPanelSelectionView - { - public Form Form { get; } - - public bool ShowPanelLocationOverlay { get; set; } - } -} diff --git a/UIController/PanelConfigurationController.cs b/UIController/PanelConfigurationController.cs deleted file mode 100644 index 8985280..0000000 --- a/UIController/PanelConfigurationController.cs +++ /dev/null @@ -1,252 +0,0 @@ -using MSFSPopoutPanelManager.Provider; -using MSFSPopoutPanelManager.Shared; -using System; -using System.Drawing; -using System.Linq; - -namespace MSFSPopoutPanelManager.UIController -{ - public class PanelConfigurationController - { - private IPanelConfigurationView _view; - private bool _isDisablePanelChanges; - - private static PInvoke.WinEventProc _winEvent; // keep this as static to prevent garbage collect or the app will crash - private IntPtr _winEventHook; - - public PanelConfigurationController(IPanelConfigurationView view, DataStore dataStore) - { - _view = view; - DataStore = dataStore; - _winEvent = new PInvoke.WinEventProc(EventCallback); - } - - public DataStore DataStore { get; set; } - - public void Initialize() - { - // Populate panel data - DataStore.PanelConfigs.Clear(); - DataStore.ActiveUserProfile.PanelConfigs.ForEach(p => DataStore.PanelConfigs.Add(p)); - - // Setup panel config event hooks - _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, WindowManager.GetApplicationProcess().Handle, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT); - - _view.IsPanelLocked = DataStore.ActiveUserProfile.IsLocked; - - _isDisablePanelChanges = false; - _view.IsPanelChangeDisabled = false; - } - - public event EventHandler RefreshDataUI; - public event EventHandler> HightlightSelectedPanel; - - public void UnhookWinEvent() - { - // Unhook all Win API events - PInvoke.UnhookWinEvent(_winEventHook); - } - - public void LockPanelChanged(bool isLocked) - { - DataStore.ActiveUserProfile.IsLocked = isLocked; - SaveSettings(); - - _view.IsPanelLocked = isLocked; - } - - public void DisablePanelChanges(bool isDisabled) - { - _isDisablePanelChanges = isDisabled; - _view.IsPanelChangeDisabled = isDisabled; - } - - public void CellValueChanged(int rowIndex, PanelConfigDataColumn column, object newCellValue) - { - if (_isDisablePanelChanges || DataStore.ActiveUserProfile.IsLocked || DataStore.PanelConfigs == null || DataStore.PanelConfigs.Count == 0) - return; - - int orignalLeft = DataStore.PanelConfigs[rowIndex].Left; - - if (rowIndex != -1) - { - switch (column) - { - case PanelConfigDataColumn.PanelName: - var name = DataStore.PanelConfigs[rowIndex].PanelName; - if (name.IndexOf("(Custom)") == -1) - name = name + " (Custom)"; - - PInvoke.SetWindowText(DataStore.PanelConfigs[rowIndex].PanelHandle, name); - break; - case PanelConfigDataColumn.Left: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, true); - break; - case PanelConfigDataColumn.Top: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, true); - break; - case PanelConfigDataColumn.Width: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, true); - MSFSBugPanelShiftWorkaround(DataStore.PanelConfigs[rowIndex].PanelHandle, orignalLeft, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height); - break; - case PanelConfigDataColumn.Height: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, true); - MSFSBugPanelShiftWorkaround(DataStore.PanelConfigs[rowIndex].PanelHandle, orignalLeft, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height); - break; - case PanelConfigDataColumn.AlwaysOnTop: - DataStore.PanelConfigs[rowIndex].AlwaysOnTop = Convert.ToBoolean(newCellValue); - WindowManager.ApplyAlwaysOnTop(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].AlwaysOnTop, new Rectangle(DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height)); - break; - case PanelConfigDataColumn.HideTitlebar: - DataStore.PanelConfigs[rowIndex].HideTitlebar = Convert.ToBoolean(newCellValue); - WindowManager.ApplyHidePanelTitleBar(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].HideTitlebar); - break; - default: - return; - } - - SaveSettings(); - } - } - - public void CellValueIncrDecr(int rowIndex, PanelConfigDataColumn column, int changeAmount) - { - if (_isDisablePanelChanges || DataStore.ActiveUserProfile.IsLocked || DataStore.PanelConfigs == null || DataStore.PanelConfigs.Count == 0) - return; - - int orignalLeft = DataStore.PanelConfigs[rowIndex].Left; - - if (rowIndex != -1) - { - switch (column) - { - case PanelConfigDataColumn.Left: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left + changeAmount, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, false); - DataStore.PanelConfigs[rowIndex].Left = DataStore.PanelConfigs[rowIndex].Left + changeAmount; - break; - case PanelConfigDataColumn.Top: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top + changeAmount, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height, false); - DataStore.PanelConfigs[rowIndex].Top = DataStore.PanelConfigs[rowIndex].Top + changeAmount; - break; - case PanelConfigDataColumn.Width: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width + changeAmount, DataStore.PanelConfigs[rowIndex].Height, false); - MSFSBugPanelShiftWorkaround(DataStore.PanelConfigs[rowIndex].PanelHandle, orignalLeft, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width + changeAmount, DataStore.PanelConfigs[rowIndex].Height); - DataStore.PanelConfigs[rowIndex].Width = DataStore.PanelConfigs[rowIndex].Width + changeAmount; - break; - case PanelConfigDataColumn.Height: - PInvoke.MoveWindow(DataStore.PanelConfigs[rowIndex].PanelHandle, DataStore.PanelConfigs[rowIndex].Left, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height + changeAmount, false); - MSFSBugPanelShiftWorkaround(DataStore.PanelConfigs[rowIndex].PanelHandle, orignalLeft, DataStore.PanelConfigs[rowIndex].Top, DataStore.PanelConfigs[rowIndex].Width, DataStore.PanelConfigs[rowIndex].Height + changeAmount); - DataStore.PanelConfigs[rowIndex].Height = DataStore.PanelConfigs[rowIndex].Height + changeAmount; - break; - default: - return; - } - - SaveSettings(); - } - } - - private void MSFSBugPanelShiftWorkaround(IntPtr handle, int originalLeft, int top, int width, int height) - { - // Fixed MSFS bug, create workaround where on 2nd or later instance of width adjustment, the panel shift to the left by itself - // Wait for system to catch up on panel coordinate that were just applied - System.Threading.Thread.Sleep(200); - - Rectangle rectangle; - PInvoke.GetWindowRect(handle, out rectangle); - - if (rectangle.Left != originalLeft) - PInvoke.MoveWindow(handle, originalLeft, top, width, height, false); - } - - private Rectangle _lastWindowRectangle; - private int count = 1; - - private void EventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime) - { - // check by priority to minimize escaping constraint - if (hWnd == IntPtr.Zero - || idObject != 0 - || hWinEventHook != _winEventHook - || !(iEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE || iEvent == PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND) - || _isDisablePanelChanges - || DataStore.PanelConfigs == null || DataStore.PanelConfigs.Count == 0) - { - return; - } - - var panelConfig = DataStore.PanelConfigs.FirstOrDefault(panel => panel.PanelHandle == hWnd); - - if (panelConfig != null) - { - switch (iEvent) - { - case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE: - Rectangle winRectangle; - PInvoke.GetWindowRect(panelConfig.PanelHandle, out winRectangle); - - if (_lastWindowRectangle == winRectangle) // ignore duplicate callback messages - return; - - _lastWindowRectangle = winRectangle; - Rectangle clientRectangle; - PInvoke.GetClientRect(panelConfig.PanelHandle, out clientRectangle); - - if (!DataStore.ActiveUserProfile.IsLocked) - { - panelConfig.Left = winRectangle.Left; - panelConfig.Top = winRectangle.Top; - panelConfig.Width = clientRectangle.Width + 16; - panelConfig.Height = clientRectangle.Height + 39; - - var rowIndex = DataStore.PanelConfigs.IndexOf(panelConfig); - HightlightSelectedPanel?.Invoke(this, new EventArgs(rowIndex)); - } - - // Detect if window is maximized, if so, save settings - WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); - wp.length = System.Runtime.InteropServices.Marshal.SizeOf(wp); - PInvoke.GetWindowPlacement(hWnd, ref wp); - if (wp.showCmd == PInvokeConstant.SW_SHOWMAXIMIZED || wp.showCmd == PInvokeConstant.SW_SHOWMINIMIZED) - { - if (DataStore.ActiveUserProfile.IsLocked && panelConfig.PanelType == PanelType.CustomPopout) - PInvoke.ShowWindow(hWnd, PInvokeConstant.SW_RESTORE); - else - SaveSettings(); - } - - break; - case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND: - if(DataStore.ActiveUserProfile.IsLocked && panelConfig.PanelType == PanelType.CustomPopout) - PInvoke.MoveWindow(panelConfig.PanelHandle, panelConfig.Left, panelConfig.Top, panelConfig.Width, panelConfig.Height, false); - else - SaveSettings(); - break; - } - - RefreshDataUI?.Invoke(this, null); - } - } - private void SaveSettings() - { - var profile = DataStore.ActiveUserProfile; - profile.PanelConfigs = DataStore.PanelConfigs.ToList(); - - var allProfiles = FileManager.ReadUserProfileData(); - var index = allProfiles.FindIndex(x => x.ProfileId == profile.ProfileId); - allProfiles[index] = profile; - FileManager.WriteUserProfileData(allProfiles); - } - } - - public enum PanelConfigDataColumn - { - PanelName, - Left, - Top, - Width, - Height, - AlwaysOnTop, - HideTitlebar - } -} diff --git a/UIController/PanelSelectionController.cs b/UIController/PanelSelectionController.cs deleted file mode 100644 index 4460b11..0000000 --- a/UIController/PanelSelectionController.cs +++ /dev/null @@ -1,251 +0,0 @@ -using MSFSPopoutPanelManager.Provider; -using MSFSPopoutPanelManager.Shared; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Threading; -using System.Windows.Forms; - -namespace MSFSPopoutPanelManager.UIController -{ - public class PanelSelectionController - { - private PanelSelectionManager _panelSelectionManager; - private IPanelSelectionView _view; - - public PanelSelectionController(IPanelSelectionView view, DataStore dataStore) - { - _view = view; - DataStore = dataStore; - - _panelSelectionManager = new PanelSelectionManager(_view.Form); - _panelSelectionManager.OnSelectionCompleted += HandleOnPanelSelectionCompleted; - } - - public DataStore DataStore { get; set; } - - public event EventHandler> OnUIStateChanged; - - public event EventHandler OnPopOutCompleted; - - public void Initialize() - { - _view.ShowPanelLocationOverlay = false; - - DataStore.UserProfiles = new BindingList(FileManager.ReadUserProfileData().OrderBy(x => x.ProfileName).ToList()); - DataStore.ActiveProfilePanelCoordinates = new BindingList(DataStore.ActiveUserProfile == null ? new List() : DataStore.ActiveUserProfile.PanelSourceCoordinates); - - var defaultProfile = FileManager.ReadUserProfileData().Find(x => x.IsDefaultProfile); - - if(defaultProfile == null) - { - DataStore.ActiveUserProfileId= -1; - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.NoProfileSelected)); - } - else - { - DataStore.ActiveUserProfileId = defaultProfile.ProfileId; - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.ProfileSelected)); - } - } - - public void AddProfile(string profileName) - { - var newProfileId = DataStore.UserProfiles.Count > 0 ? DataStore.UserProfiles.Max(x => x.ProfileId) + 1 : 1; - var newPlaneProfile = new UserProfileData() { ProfileId = newProfileId, ProfileName = profileName }; - - var tmpList = DataStore.UserProfiles.ToList(); - tmpList.Add(newPlaneProfile); - var index = tmpList.OrderBy(x => x.ProfileName).ToList().FindIndex(x => x.ProfileId == newProfileId); - DataStore.UserProfiles.Insert(index, newPlaneProfile); - FileManager.WriteUserProfileData(DataStore.UserProfiles.ToList()); // save the backing list data - - DataStore.ActiveUserProfileId = newProfileId; - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.ProfileSelected)); - Logger.Status($"Profile '{newPlaneProfile.ProfileName}' has been added successfully.", StatusMessageType.Info); - } - - public void DeleteProfile() - { - if (DataStore.ActiveUserProfileId != -1) - { - var profileToRemove = DataStore.UserProfiles.First(x => x.ProfileId == DataStore.ActiveUserProfileId); - DataStore.UserProfiles.Remove(profileToRemove); - FileManager.WriteUserProfileData(DataStore.UserProfiles.ToList()); - - _panelSelectionManager.Reset(); - DataStore.ActiveUserProfileId= -1; - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.NoProfileSelected)); - - Logger.Status($"Profile '{profileToRemove.ProfileName}' has been deleted successfully.", StatusMessageType.Info); - } - } - - public void SetDefaultProfile() - { - if (DataStore.ActiveUserProfileId== -1) - return; - - var profile = DataStore.UserProfiles.First(x => x.ProfileId == DataStore.ActiveUserProfileId); - - profile.IsDefaultProfile = true; - foreach (var p in DataStore.UserProfiles) - { - if (p.ProfileId != DataStore.ActiveUserProfileId) - p.IsDefaultProfile = false; - } - FileManager.WriteUserProfileData(DataStore.UserProfiles.ToList()); - - Logger.Status($"Profile '{profile.ProfileName}' has been set as default.", StatusMessageType.Info); - } - - public void ProfileChanged(int profileId) - { - Logger.ClearStatus(); - - if (profileId == -1) - { - DataStore.ActiveUserProfileId= -1; - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.NoProfileSelected)); - } - else - { - DataStore.ActiveUserProfileId = profileId; - _panelSelectionManager.Reset(); - _view.ShowPanelLocationOverlay = false; - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PanelSelectionCompletedValid)); - } - } - - public bool HasExistingPanelCoordinates - { - get - { - return DataStore.ActiveUserProfile != null && DataStore.ActiveUserProfile.PanelSourceCoordinates.Count > 0; - } - } - - public void StartPanelSelection() - { - DataStore.ActiveUserProfile.Reset(); - - _panelSelectionManager.PanelCoordinates = DataStore.ActiveUserProfile.PanelSourceCoordinates; - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PanelSelectionStarted)); - - // Temporary minimize the app during panel selection - if (_view.Form != null) - _view.Form.WindowState = FormWindowState.Minimized; - - // Set MSFS to foreground for panel selection - var simulatorProcess = WindowManager.GetSimulatorProcess(); - if (simulatorProcess != null) - PInvoke.SetForegroundWindow(simulatorProcess.Handle); - - _panelSelectionManager.Start(); - - Logger.Status("Panels selection has started.", StatusMessageType.Info); - } - - private void HandleOnPanelSelectionCompleted(object sender, EventArgs e) - { - // If enable, save the current viewport into custom view by Ctrl-Alt-0 - if (FileManager.ReadAppSettingData().UseAutoPanning) - { - var simualatorProcess = WindowManager.GetSimulatorProcess(); - if (simualatorProcess != null) - { - InputEmulationManager.SaveCustomViewZero(simualatorProcess.Handle); - } - } - - if (_view.Form != null) - _view.Form.WindowState = FormWindowState.Normal; - - PInvoke.SetForegroundWindow(_view.Form.Handle); - - DataStore.ActiveProfilePanelCoordinates.Clear(); - DataStore.ActiveUserProfile.PanelSourceCoordinates.ForEach(c => DataStore.ActiveProfilePanelCoordinates.Add(c)); - - FileManager.WriteUserProfileData(DataStore.UserProfiles.ToList()); - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PanelSelectionCompletedValid)); - - _view.ShowPanelLocationOverlay = true; - - if (DataStore.ActiveUserProfile.PanelSourceCoordinates.Count > 0) - Logger.Status("Panels selection is completed. Please click 'Start Pop Out' to start popping out these panels.", StatusMessageType.Info); - else - Logger.Status("Panels selection is completed. No panel has been selected.", StatusMessageType.Info); - } - - public void SetPanelLocationOverlayChanged() - { - _panelSelectionManager.PanelCoordinates = DataStore.ActiveProfilePanelCoordinates.ToList(); - _panelSelectionManager.ShowPanelLocationOverlay(_view.ShowPanelLocationOverlay); - } - - public void StartPopOut() - { - if (WindowManager.GetApplicationProcess() == null) - return; - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PopoutStarted)); - Logger.Status("Panel pop out and separation in progress. Please wait......", StatusMessageType.Info); - - WindowManager.CloseAllCustomPopoutPanels(); - - Thread.Sleep(1000); // allow time for the mouse to be stopped moving by the user - - _panelSelectionManager.ShowPanelLocationOverlay(false); - _view.ShowPanelLocationOverlay = false; - - var simulatorProcess = WindowManager.GetSimulatorProcess(); - if(simulatorProcess == null) - { - Logger.Status("MSFS has not been started. Please try again at a later time.", StatusMessageType.Error); - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PanelSelectionCompletedValid)); - return; - } - - PopoutSeparationManager popoutSeparationManager = new PopoutSeparationManager(simulatorProcess.Handle, DataStore.ActiveUserProfile); - - // Temporary make app go to background before pop out process - WindowManager.ApplyAlwaysOnTop(_view.Form.Handle, false, _view.Form.Bounds); - - var result = popoutSeparationManager.StartPopout(); - - WindowManager.ApplyAlwaysOnTop(_view.Form.Handle, true, _view.Form.Bounds); - - if (result) - { - OnPopOutCompleted?.Invoke(this, null); - - // Save data - FileManager.WriteUserProfileData(DataStore.UserProfiles.ToList()); - - PInvoke.SetForegroundWindow(_view.Form.Handle); - } - else - { - _panelSelectionManager.ShowPanelLocationOverlay(true); - _view.ShowPanelLocationOverlay = true; - } - - OnUIStateChanged?.Invoke(this, new EventArgs(PanelSelectionUIState.PanelSelectionCompletedValid)); - } - } - - public enum PanelSelectionUIState - { - NoProfileSelected, - ProfileSelected, - PanelSelectionStarted, - PanelSelectionCompletedValid, - PanelSelectionCompletedInvalid, - PopoutStarted, - } -} diff --git a/VERSION.md b/VERSION.md index 83c0a06..8d2dd1a 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1,15 +1,28 @@ # Version History
-## Version 3.1.0 -* Updated UI to use menu bar to control most application settings. -* Added long awaited auto save feature. Application no longer requires user to manually save profile after each panel change. All panel adjustments are automatically save. -* Added panel lock feature to complement autosave feature. When panels are lock and are being moved or resize, their new location information will not get save. Also, for instrumentation pop out panels, when panels are locked, any accidental movement of the panels will return them to previously saved locations. For built-in panels such as ATC, VFR Map, etc, they can still be moved but their saved location will not get change. -* Added keyboard shortcuts for commonly used function. The buttons for -10px, -1px, +1px, and +10px now has keyboard shortcut of 'Ctrl -', 'Ctrl [', 'Ctrl ]', and 'Ctrl +' respectively. -* Added miminize all panels feature. This allows user to temporary see what is behind all open pop out panels. (This is an user requested feature with Github ticket #6). -* Various smaller bug fixes and usability enhancements. - +## Version 3.2.0 (Beta) +* Added per monitor DPI-awareness support. The application should run and display correctly when using combination of mixed monitor (with high-DPI and low-DPI) resolutions and scaling. +* Added system tray icon access. Application can start minimize or minimize to system tray. System tray icon features a context menu to allow quick access to application functions. +* Added user requested feature to provide keyboard shortcut (Ctrl-Alt-P) to start panel pop out with either an active profile or a default profile selected. +* New copy profile feature. You can reuse your defined panel settings for another plane or plane/livery combination. +* Added quick panel location selection adjustment feature. You can now adjust panel locations without redoing the entire profile. +* Added Save Auto Panning Camera Angle function if you need to adjust the in-game camera angle during panel selection. +* New logo icon for the app. +* New dark theme for the entire UI. +* Technical Note - Application is ported and rewritten with .NET WPF framework instead of WinForms. +## +## Version 3.1.0.2 (Hotfix) +* Change application DPI mode to use DPIPerMonitor and added DPI aware setting to application to fix user configuration of using a 4K high DPI monitor (with windows scaling of greater than 100%) in conjunction of one or more lower DPI monitors such as 1440P or 1080P. With this configuration, the application rendering, panel selection and pop out panel adjustments and do not work correctly. + +## Version 3.1.0 +* Updated and streamlined UI to have a menu bar to control most application settings. +* Added long awaited auto save feature. Application no longer requires user to manually save profile after each panel change. All panel adjustments are saved automatically. +* Added panel lock feature to complement autosave feature. When panels are locked and are being moved or resized, their new location information will not get save. Also, for instrumentation pop out panels, when panels are locked, any accidental movement of the panels will return them to previously saved locations. For built-in panels such as ATC, VFR Map, etc, they can still be moved but their saved location will not get change. +* Added keyboard shortcuts for commonly use function. The buttons for -10px, -1px, +1px, and +10px now has keyboard shortcut of ‘Ctrl -’, ‘Ctrl [’, ‘Ctrl ]’, and ‘Ctrl +’ respectively. +* Added minimize all panels feature. This allows user to temporary see what is behind all open pop out panels. (This is a user requested feature with Github ticket [#6](https://github.com/hawkeye-stan/msfs-popout-panel-manager/issues/6)). +* Various small bug fixes and usability enhancements. ## Version 3.0.1 * Added workaround for MSFS pop out panel adjustment bug when using the position data grid to adjust width and height will work as expected. diff --git a/WindowManager.ico b/WindowManager.ico deleted file mode 100644 index 6966f96..0000000 Binary files a/WindowManager.ico and /dev/null differ diff --git a/WpfApp/AddProfileDialog.xaml b/WpfApp/AddProfileDialog.xaml new file mode 100644 index 0000000..4b02569 --- /dev/null +++ b/WpfApp/AddProfileDialog.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/WpfApp/AddProfileDialog.xaml.cs b/WpfApp/AddProfileDialog.xaml.cs new file mode 100644 index 0000000..3ef880e --- /dev/null +++ b/WpfApp/AddProfileDialog.xaml.cs @@ -0,0 +1,69 @@ +using MahApps.Metro.Controls; +using MSFSPopoutPanelManager.Model; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows; +using System.Windows.Input; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for AddProfileDialog.xaml + /// + public partial class AddProfileDialog : MetroWindow + { + public List UserProfiles { get; set; } + + public int SelectedCopyProfileId { get; set; } + + public AddProfileDialog(ObservableCollection userProfiles) + { + InitializeComponent(); + + UserProfiles = userProfiles.ToList(); + UserProfiles.Insert(0, new UserProfile() { ProfileId = -1 }); + this.DataContext = this; + + SelectedCopyProfileId = -1; + btnDialogOk.IsEnabled = false; + } + + private void btnDialogOk_Click(object sender, RoutedEventArgs e) + { + this.DialogResult = true; + } + + public string ProfileName + { + get { return txtProfileName.Text; } + } + + private void Window_ContentRendered(object sender, EventArgs e) + { + txtProfileName.Focus(); + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + bool isNumber = e.Key >= Key.D0 && e.Key <= Key.D9 || e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9; + bool isLetter = e.Key >= Key.A && e.Key <= Key.Z || (e.Key >= Key.A && e.Key <= Key.Z && e.KeyboardDevice.Modifiers == ModifierKeys.Shift); + bool isCtrlA = e.Key == Key.A && e.KeyboardDevice.Modifiers == ModifierKeys.Control; + bool isCtrlV = e.Key == Key.V && e.KeyboardDevice.Modifiers == ModifierKeys.Control; + bool isBack = e.Key == Key.Back; + bool isLeftOrRight = e.Key == Key.Left || e.Key == Key.Right; + bool isEnterOrCancel = e.Key == Key.Enter || e.Key == Key.Escape; + + if (isNumber || isLetter || isCtrlA || isCtrlV || isBack || isLeftOrRight || isEnterOrCancel) + e.Handled = false; + else + e.Handled = true; + } + + private void txtProfileName_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) + { + btnDialogOk.IsEnabled = txtProfileName.Text.Length > 0; + } + } +} diff --git a/WpfApp/App.xaml b/WpfApp/App.xaml new file mode 100644 index 0000000..7759ffd --- /dev/null +++ b/WpfApp/App.xaml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/WpfApp/App.xaml.cs b/WpfApp/App.xaml.cs new file mode 100644 index 0000000..bc8756e --- /dev/null +++ b/WpfApp/App.xaml.cs @@ -0,0 +1,143 @@ +using log4net; +using log4net.Config; +using MSFSPopoutPanelManager.Provider; +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + private static Mutex _mutex = null; + private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected override void OnStartup(StartupEventArgs e) + { + // Setup log4Net + var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); + XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); + + // Override default WPF System DPI Awareness to Per Monitor Awareness + // For this to work make sure [assembly:dpiawareness] + DpiAwareness.Enable(Log); + + const string appName = "MSFS PopOut Panel Manager"; + bool createdNew; + + _mutex = new Mutex(true, appName, out createdNew); + + if (!createdNew) + { + //app is already running! Exiting the application + Application.Current.Shutdown(); + } + else + { + // Setup all unhandle exception handlers + Dispatcher.UnhandledException += HandleDispatcherException; + TaskScheduler.UnobservedTaskException += HandleTaskSchedulerUnobservedTaskException; + AppDomain.CurrentDomain.UnhandledException += HandledDomainException; + } + + base.OnStartup(e); + } + + private void HandleTaskSchedulerUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) + { + Log.Error(e.Exception.Message, e.Exception); + ShowExceptionDialog(); + } + + private void HandleDispatcherException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + e.Handled = true; + Log.Error(e.Exception.Message, e.Exception); + ShowExceptionDialog(); + } + + private void HandledDomainException(object sender, UnhandledExceptionEventArgs e) + { + var exception = (Exception)e.ExceptionObject; + Log.Error(exception.Message, exception); + ShowExceptionDialog(); + } + + private void ShowExceptionDialog() + { + var messageBoxTitle = "MSFS Pop Out Panel Manager - Critical Error!"; + var messageBoxMessage = "Application has encountered a critical error and will be closed.\nPlease see the file 'error.log' for information."; + var messageBoxButtons = MessageBoxButton.OK; + + // Let the user decide if the app should die or not (if applicable). + if (MessageBox.Show(messageBoxMessage, messageBoxTitle, messageBoxButtons) == MessageBoxResult.OK) + { + Application.Current.Shutdown(); + } + } + } + + + public enum PROCESS_DPI_AWARENESS + { + Process_DPI_Unaware = 0, + Process_System_DPI_Aware = 1, + Process_Per_Monitor_DPI_Aware = 2 + } + + public enum DPI_AWARENESS_CONTEXT + { + DPI_AWARENESS_CONTEXT_UNAWARE = 16, + DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 17, + DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 18, + DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 34 + } + + public static class DpiAwareness + { + public static void Enable(ILog log4net) + { + // Windows 8.1 added support for per monitor DPI + if (Environment.OSVersion.Version >= new Version(6, 3, 0)) + { + // Windows 10 creators update added support for per monitor v2 + if (Environment.OSVersion.Version >= new Version(10, 0, 15063)) + { + SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + else + { + SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_Per_Monitor_DPI_Aware); + } + } + else + { + SetProcessDPIAware(); + } + + var process = DiagnosticManager.GetApplicationProcess(); + PROCESS_DPI_AWARENESS outValue; + GetProcessDpiAwareness(process.Handle, out outValue); + log4net.Info($"DPI Awareness is set to: {outValue}"); + } + + [DllImport("User32.dll")] + internal static extern bool SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT dpiFlag); + + [DllImport("SHCore.dll")] + internal static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness); + + [DllImport("User32.dll")] + internal static extern bool SetProcessDPIAware(); + + [DllImport("SHCore.dll", SetLastError = true)] + internal static extern void GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS awareness); + } +} diff --git a/WpfApp/ApplicationWindow.xaml b/WpfApp/ApplicationWindow.xaml new file mode 100644 index 0000000..7c02f71 --- /dev/null +++ b/WpfApp/ApplicationWindow.xaml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WpfApp/ApplicationWindow.xaml.cs b/WpfApp/ApplicationWindow.xaml.cs new file mode 100644 index 0000000..7f98051 --- /dev/null +++ b/WpfApp/ApplicationWindow.xaml.cs @@ -0,0 +1,103 @@ +using Hardcodet.Wpf.TaskbarNotification; +using MahApps.Metro.Controls; +using MSFSPopoutPanelManager.Provider; +using MSFSPopoutPanelManager.Shared; +using MSFSPopoutPanelManager.WpfApp.ViewModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Interop; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for ApplicationWindow.xaml + /// + public partial class ApplicationWindow : MetroWindow + { + private ApplicationViewModel _viewModel; + + // This command has to be here since it doesn't work in view model, window StateChanged never gets fire + public DelegateCommand RestoreWindowCommand => new DelegateCommand((o) => { this.WindowState = WindowState.Normal; }, (o) => { return true; }); + + public ApplicationWindow() + { + InitializeComponent(); + + _viewModel = new ApplicationViewModel(); + _viewModel.ShowContextMenuBalloonTip += HandleShowContextMenuBalloonTip; + this.DataContext = _viewModel; + + UserControlPanelSelection userControlPanelSelection = new UserControlPanelSelection(_viewModel.PanelSelectionViewModel); + UserControlPanelConfiguration userControlPanelConfiguration = new UserControlPanelConfiguration(_viewModel.PanelConfigurationViewModel); + + Binding panelSelectionVisibilityBinding = new Binding() + { + Source = this.DataContext, + Path = new PropertyPath("IsShownPanelSelectionScreen"), + UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, + Converter = new BoolToVisibilityConverter() + }; + BindingOperations.SetBinding(userControlPanelSelection, UserControl.VisibilityProperty, panelSelectionVisibilityBinding); + + Binding panelConfigurationVisibilityBinding = new Binding() + { + Source = this.DataContext, + Path = new PropertyPath("IsShownPanelConfigurationScreen"), + UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, + Converter = new BoolToVisibilityConverter() + }; + BindingOperations.SetBinding(userControlPanelConfiguration, UserControl.VisibilityProperty, panelConfigurationVisibilityBinding); + + panelSteps.Children.Add(userControlPanelSelection); + panelSteps.Children.Add(userControlPanelConfiguration); + + notifyIcon.DoubleClickCommand = RestoreWindowCommand; + } + + private void HandleShowContextMenuBalloonTip(object sender, EventArgs e) + { + if (e.Value.MessageType == StatusMessageType.Error) + { + notifyIcon.ShowBalloonTip("MSFS Pop Out Panel Manager Error", e.Value.Message, BalloonIcon.Error); + } + } + + private void Window_StateChanged(object sender, System.EventArgs e) + { + switch (this.WindowState) + { + case WindowState.Maximized: + this.ShowInTaskbar = true; + break; + case WindowState.Minimized: + if (_viewModel.DataStore.AppSetting.MinimizeToTray) + { + notifyIcon.Visibility = Visibility.Visible; + this.ShowInTaskbar = false; + } + break; + case WindowState.Normal: + notifyIcon.Visibility = Visibility.Hidden; + this.ShowInTaskbar = true; + + // Fix always on top status once app is minimize and then restore + if (_viewModel.DataStore.AppSetting.AlwaysOnTop) + WindowManager.ApplyAlwaysOnTop(_viewModel.DataStore.ApplicationHandle, true); + break; + } + } + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + _viewModel.DataStore.ApplicationHandle = new WindowInteropHelper(Window.GetWindow(this)).Handle; + _viewModel.DataStore.ApplicationWindow = this; + _viewModel.Initialize(); + } + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + _viewModel.ExitCommand.Execute(null); + } + } +} diff --git a/WpfApp/AssemblyInfo.cs b/WpfApp/AssemblyInfo.cs new file mode 100644 index 0000000..de57ee8 --- /dev/null +++ b/WpfApp/AssemblyInfo.cs @@ -0,0 +1,12 @@ +using System.Windows; +using System.Windows.Media; + +[assembly: DisableDpiAwareness] +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/WpfApp/ConfirmationDialog.xaml b/WpfApp/ConfirmationDialog.xaml new file mode 100644 index 0000000..ef6ee70 --- /dev/null +++ b/WpfApp/ConfirmationDialog.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/WpfApp/ConfirmationDialog.xaml.cs b/WpfApp/ConfirmationDialog.xaml.cs new file mode 100644 index 0000000..04a2005 --- /dev/null +++ b/WpfApp/ConfirmationDialog.xaml.cs @@ -0,0 +1,35 @@ +using MahApps.Metro.Controls; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for ConfirmationDialog.xaml + /// + public partial class ConfirmationDialog : MetroWindow + { + public ConfirmationDialog(string title, string message) + { + InitializeComponent(); + this.Title = title; + this.txtMessage.Text = message; + } + + private void btnDialogYes_Click(object sender, RoutedEventArgs e) + { + this.DialogResult = true; + } + } +} diff --git a/WpfApp/FodyWeavers.xml b/WpfApp/FodyWeavers.xml new file mode 100644 index 0000000..d5abfed --- /dev/null +++ b/WpfApp/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/WpfApp/FodyWeavers.xsd b/WpfApp/FodyWeavers.xsd new file mode 100644 index 0000000..69dbe48 --- /dev/null +++ b/WpfApp/FodyWeavers.xsd @@ -0,0 +1,74 @@ + + + + + + + + + + + Used to control if the On_PropertyName_Changed feature is enabled. + + + + + Used to control if the Dependent properties feature is enabled. + + + + + Used to control if the IsChanged property feature is enabled. + + + + + Used to change the name of the method that fires the notify event. This is a string that accepts multiple values in a comma separated form. + + + + + Used to control if equality checks should be inserted. If false, equality checking will be disabled for the project. + + + + + Used to control if equality checks should use the Equals method resolved from the base class. + + + + + Used to control if equality checks should use the static Equals method resolved from the base class. + + + + + Used to turn off build warnings from this weaver. + + + + + Used to turn off build warnings about mismatched On_PropertyName_Changed methods. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/WpfApp/OnScreenMessageDialog.xaml b/WpfApp/OnScreenMessageDialog.xaml new file mode 100644 index 0000000..e0bfa0d --- /dev/null +++ b/WpfApp/OnScreenMessageDialog.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + diff --git a/WpfApp/OnScreenMessageDialog.xaml.cs b/WpfApp/OnScreenMessageDialog.xaml.cs new file mode 100644 index 0000000..33883a0 --- /dev/null +++ b/WpfApp/OnScreenMessageDialog.xaml.cs @@ -0,0 +1,71 @@ +using MahApps.Metro.Controls; +using MSFSPopoutPanelManager.Provider; +using System; +using System.Diagnostics; +using System.Drawing; +using System.Windows; +using System.Windows.Interop; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for OnScreenMessageDialog.xaml + /// + public partial class OnScreenMessageDialog : MetroWindow + { + public MessageIcon MessageIcon { get; set; } + + public OnScreenMessageDialog(string message) : this(message, MessageIcon.Info, 2) { } + + public OnScreenMessageDialog(string message, MessageIcon messageIcon) : this(message, messageIcon, 2) { } + + public OnScreenMessageDialog(string message, int duration) : this(message, MessageIcon.Info, duration) { } + + public OnScreenMessageDialog(string message, MessageIcon messageIcon, int duration) + { + InitializeComponent(); + this.DataContext = this; + this.Topmost = true; + this.txtMessage.Text = message; + MessageIcon = messageIcon; + + this.Loaded += (sender, e) => + { + var dialogHandle = new WindowInteropHelper(Window.GetWindow(this)).Handle; + var simulatorProcessHandle = DiagnosticManager.GetSimulatorProcess().Handle; + + Rectangle rectangle; + PInvoke.GetWindowRect(DiagnosticManager.GetSimulatorProcess().Handle, out rectangle); + Rectangle clientRectangle; + PInvoke.GetClientRect(DiagnosticManager.GetSimulatorProcess().Handle, out clientRectangle); + + var x = Convert.ToInt32(rectangle.X + clientRectangle.Width / 2 - this.Width / 2); + var y = Convert.ToInt32(rectangle.Y + clientRectangle.Height / 2 - this.Height / 2); + + Debug.WriteLine($"Game Location: X:{rectangle.X} Y:{rectangle.Y}"); + Debug.WriteLine($"Game Rectangle: Width:{clientRectangle.Width} Height:{clientRectangle.Height}"); + Debug.WriteLine($"Message Dialog Location: X:{x} Y:{y}"); + + PInvoke.MoveWindow(dialogHandle, x, y, Convert.ToInt32(this.Width), Convert.ToInt32(this.Height), false); + }; + + System.Timers.Timer timer = new System.Timers.Timer(); + timer.Elapsed += (sender, e) => + { + Application.Current.Dispatcher.Invoke(() => + { + this.Close(); timer.Enabled = false; + }); + }; + timer.Interval = duration * 1000; + timer.Enabled = true; + } + } + + public enum MessageIcon + { + Info, + Success, + Failed + } +} diff --git a/WpfApp/PanelCoorOverlay.xaml b/WpfApp/PanelCoorOverlay.xaml new file mode 100644 index 0000000..47e30e9 --- /dev/null +++ b/WpfApp/PanelCoorOverlay.xaml @@ -0,0 +1,22 @@ + + + + diff --git a/WpfApp/PanelCoorOverlay.xaml.cs b/WpfApp/PanelCoorOverlay.xaml.cs new file mode 100644 index 0000000..a743030 --- /dev/null +++ b/WpfApp/PanelCoorOverlay.xaml.cs @@ -0,0 +1,31 @@ +using System; +using System.Windows; +using System.Windows.Interop; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for PanelCoorOverlay.xaml + /// + public partial class PanelCoorOverlay : Window + { + public bool IsEditingPanelLocation { get; set; } + + public IntPtr WindowHandle { get; set; } + + public PanelCoorOverlay(int panelIndex) + { + InitializeComponent(); + this.lblPanelIndex.Content = panelIndex; + IsEditingPanelLocation = false; + } + + private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) + { + if (IsEditingPanelLocation && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) + { + this.DragMove(); + } + } + } +} diff --git a/WpfApp/Resources/check.png b/WpfApp/Resources/check.png new file mode 100644 index 0000000..da0f33e Binary files /dev/null and b/WpfApp/Resources/check.png differ diff --git a/WpfApp/Resources/cross.png b/WpfApp/Resources/cross.png new file mode 100644 index 0000000..5498347 Binary files /dev/null and b/WpfApp/Resources/cross.png differ diff --git a/WpfApp/Resources/info.png b/WpfApp/Resources/info.png new file mode 100644 index 0000000..bad5858 Binary files /dev/null and b/WpfApp/Resources/info.png differ diff --git a/WpfApp/Resources/msfsconnected.png b/WpfApp/Resources/msfsconnected.png new file mode 100644 index 0000000..244b022 Binary files /dev/null and b/WpfApp/Resources/msfsconnected.png differ diff --git a/WpfApp/Resources/msfsdisconnected.png b/WpfApp/Resources/msfsdisconnected.png new file mode 100644 index 0000000..54ac58a Binary files /dev/null and b/WpfApp/Resources/msfsdisconnected.png differ diff --git a/images/transparent.png b/WpfApp/Resources/transparent.png similarity index 100% rename from images/transparent.png rename to WpfApp/Resources/transparent.png diff --git a/WpfApp/UserControlPanelConfiguration.xaml b/WpfApp/UserControlPanelConfiguration.xaml new file mode 100644 index 0000000..5b1322a --- /dev/null +++ b/WpfApp/UserControlPanelConfiguration.xaml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WpfApp/UserControlPanelConfiguration.xaml.cs b/WpfApp/UserControlPanelConfiguration.xaml.cs new file mode 100644 index 0000000..bd6ceab --- /dev/null +++ b/WpfApp/UserControlPanelConfiguration.xaml.cs @@ -0,0 +1,94 @@ +using MSFSPopoutPanelManager.Model; +using MSFSPopoutPanelManager.WpfApp.ViewModel; +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Media; + +namespace MSFSPopoutPanelManager.WpfApp +{ + /// + /// Interaction logic for UserControlPanelConfiguration.xaml + /// + public partial class UserControlPanelConfiguration : UserControl + { + private PanelConfigurationViewModel _panelConfigurationViewModel; + + public UserControlPanelConfiguration(PanelConfigurationViewModel panelConfigurationViewModel) + { + InitializeComponent(); + _panelConfigurationViewModel = panelConfigurationViewModel; + this.DataContext = _panelConfigurationViewModel; + } + + private void GridData_SourceUpdated(object sender, DataTransferEventArgs e) + { + var container = VisualTreeHelper.GetParent((Control) sender) as ContentPresenter; + var panelConfig = container.Content as PanelConfig; + var propertyName = (PanelConfigPropertyName) Enum.Parse(typeof(PanelConfigPropertyName), ((Control)sender).Name); + + var panelConfigItem = new PanelConfigItem() { PanelIndex = panelConfig.PanelIndex, PanelConfigProperty = propertyName }; + _panelConfigurationViewModel.PanelConfigUpdatedCommand.Execute(panelConfigItem); + } + + private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (sender.GetType() == typeof(DataGridCell)) + { + var cell = sender as DataGridCell; + var panelConfig = cell.DataContext as PanelConfig; + + PanelConfigPropertyName selectedProperty = PanelConfigPropertyName.Invalid; + + switch(cell.Column.Header) + { + case "Panel Name": + selectedProperty = PanelConfigPropertyName.PanelName; + break; + case "X-Pos": + selectedProperty = PanelConfigPropertyName.Left; + break; + case "Y-Pos": + selectedProperty = PanelConfigPropertyName.Top; + break; + case "Width": + selectedProperty = PanelConfigPropertyName.Width; + break; + case "Height": + selectedProperty = PanelConfigPropertyName.Height; + break; + case "Always on Top": + selectedProperty = PanelConfigPropertyName.AlwaysOnTop; + break; + case "Hide Titlebar": + selectedProperty = PanelConfigPropertyName.HideTitlebar; + break; + } + + _panelConfigurationViewModel.SelectedPanelConfigItem = new PanelConfigItem() { PanelIndex = panelConfig.PanelIndex, PanelConfigProperty = selectedProperty }; + } + } + + private void LockPanels_Click(object sender, RoutedEventArgs e) + { + if(_panelConfigurationViewModel.DataStore.ActiveUserProfile.IsLocked) + { + ConfirmationDialog dialog = new ConfirmationDialog("Confirm Unlock Panels", "Are you sure you want to unlock all panels to make changes?"); + dialog.Owner = Application.Current.MainWindow; + dialog.Topmost = true; + dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner; + + if ((bool)dialog.ShowDialog()) + { + _panelConfigurationViewModel.LockPanelsCommand.Execute(null); + } + } + else + { + _panelConfigurationViewModel.LockPanelsCommand.Execute(null); + } + } + } +} diff --git a/WpfApp/UserControlPanelSelection.xaml b/WpfApp/UserControlPanelSelection.xaml new file mode 100644 index 0000000..e9bd2e6 --- /dev/null +++ b/WpfApp/UserControlPanelSelection.xaml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + +