From c9bf7918e67220c8ff2f62f28e70f0a4ab95ab28 Mon Sep 17 00:00:00 2001 From: Chaniru Rajapakse Date: Mon, 20 Jun 2022 09:39:10 +0530 Subject: [PATCH] version 0.4.3 beta --- ClientHandler/App.xaml | 14 + ClientHandler/App.xaml.cs | 17 + ClientHandler/AppServiceHandler.cs | 49 ++ ClientHandler/AssemblyInfo.cs | 10 + ClientHandler/ClientHandler.csproj | 21 + ClientHandler/MainWindow.xaml | 33 + ClientHandler/MainWindow.xaml.cs | 65 ++ ClientHandler/Program.cs | 163 +++++ ClientHandler/icon.ico | Bin 0 -> 165662 bytes ClientLauncher/AppServiceConnectionHelper.cs | 38 ++ ClientLauncher/ClientLauncher.csproj | 13 +- ClientLauncher/Program.cs | 123 ---- ClientLauncher/icon.ico | Bin 0 -> 165662 bytes Package/Package.appxmanifest | 9 +- Package/Package.wapproj | 2 +- SDLauncher UWP.sln | 46 +- SDLauncher UWP/App.xaml | 1 + SDLauncher UWP/App.xaml.cs | 30 + .../Converters/ListToBulletsConverter.cs | 23 + .../DataTemplates/ServerTemplate.cs | 10 +- SDLauncher UWP/Dialogs/MessageBoxEx.xaml | 2 + SDLauncher UWP/Dialogs/MessageBoxEx.xaml.cs | 60 +- .../Dialogs/ServerChooserDialog.xaml | 5 +- .../Dialogs/StoreItemInstallDialog.xaml | 38 ++ .../Dialogs/StoreItemInstallDialog.xaml.cs | 45 ++ SDLauncher UWP/Helpers/AppServiceHandler.cs | 38 ++ SDLauncher UWP/Helpers/Labrinth.cs | 250 +++++++ SDLauncher UWP/Helpers/ModManager.cs | 646 ++++++++++++++++++ SDLauncher UWP/Helpers/OptiFine.cs | 3 + SDLauncher UWP/Helpers/SDLauncher.cs | 237 ++++++- SDLauncher UWP/Helpers/ServerStatusInfo.cs | 12 +- SDLauncher UWP/Helpers/SettingsDataManager.cs | 11 +- SDLauncher UWP/Package.appxmanifest | 2 +- SDLauncher UWP/Resources/AcrylicButton.xaml | 9 +- SDLauncher UWP/SDLauncher UWP.csproj | 57 +- .../UserControls/StoreItemsCollection.xaml | 115 ++++ .../UserControls/StoreItemsCollection.xaml.cs | 86 +++ SDLauncher UWP/UserControls/TaskListView.xaml | 62 ++ .../UserControls/TaskListView.xaml.cs | 131 ++++ SDLauncher UWP/Views/BaseLauncherPage.xaml | 57 +- SDLauncher UWP/Views/BaseLauncherPage.xaml.cs | 160 +++-- .../{CursedForgePage.xaml => ChangeLogs.xaml} | 8 +- SDLauncher UWP/Views/ChangeLogs.xaml.cs | 58 ++ SDLauncher UWP/Views/CursedForgePage.xaml.cs | 30 - SDLauncher UWP/Views/MainPage.xaml | 18 +- SDLauncher UWP/Views/MainPage.xaml.cs | 13 +- SDLauncher UWP/Views/SettingsPage.xaml | 17 +- SDLauncher UWP/Views/SettingsPage.xaml.cs | 13 +- SDLauncher UWP/Views/StorePage.xaml | 60 ++ SDLauncher UWP/Views/StorePage.xaml.cs | 165 +++++ SDLauncher UWP/vars.cs | 4 +- 51 files changed, 2797 insertions(+), 282 deletions(-) create mode 100644 ClientHandler/App.xaml create mode 100644 ClientHandler/App.xaml.cs create mode 100644 ClientHandler/AppServiceHandler.cs create mode 100644 ClientHandler/AssemblyInfo.cs create mode 100644 ClientHandler/ClientHandler.csproj create mode 100644 ClientHandler/MainWindow.xaml create mode 100644 ClientHandler/MainWindow.xaml.cs create mode 100644 ClientHandler/Program.cs create mode 100644 ClientHandler/icon.ico create mode 100644 ClientLauncher/AppServiceConnectionHelper.cs create mode 100644 ClientLauncher/icon.ico create mode 100644 SDLauncher UWP/Converters/ListToBulletsConverter.cs create mode 100644 SDLauncher UWP/Dialogs/StoreItemInstallDialog.xaml create mode 100644 SDLauncher UWP/Dialogs/StoreItemInstallDialog.xaml.cs create mode 100644 SDLauncher UWP/Helpers/AppServiceHandler.cs create mode 100644 SDLauncher UWP/Helpers/Labrinth.cs create mode 100644 SDLauncher UWP/Helpers/ModManager.cs create mode 100644 SDLauncher UWP/UserControls/StoreItemsCollection.xaml create mode 100644 SDLauncher UWP/UserControls/StoreItemsCollection.xaml.cs create mode 100644 SDLauncher UWP/UserControls/TaskListView.xaml create mode 100644 SDLauncher UWP/UserControls/TaskListView.xaml.cs rename SDLauncher UWP/Views/{CursedForgePage.xaml => ChangeLogs.xaml} (61%) create mode 100644 SDLauncher UWP/Views/ChangeLogs.xaml.cs delete mode 100644 SDLauncher UWP/Views/CursedForgePage.xaml.cs create mode 100644 SDLauncher UWP/Views/StorePage.xaml create mode 100644 SDLauncher UWP/Views/StorePage.xaml.cs diff --git a/ClientHandler/App.xaml b/ClientHandler/App.xaml new file mode 100644 index 00000000..16d29895 --- /dev/null +++ b/ClientHandler/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/ClientHandler/App.xaml.cs b/ClientHandler/App.xaml.cs new file mode 100644 index 00000000..0b6df05b --- /dev/null +++ b/ClientHandler/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace ClientHandler +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/ClientHandler/AppServiceHandler.cs b/ClientHandler/AppServiceHandler.cs new file mode 100644 index 00000000..ea6bb149 --- /dev/null +++ b/ClientHandler/AppServiceHandler.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.ApplicationModel; +using Windows.ApplicationModel.AppService; +using Windows.Foundation.Collections; +#pragma warning disable CS8602 // Dereference of a possibly null reference. + +namespace ClientHandler +{ + public class AppServiceHandler + { + public static AppServiceConnection? Connection { get; set; } + public static async void InitializeAppServiceConnection() + { + Connection = new AppServiceConnection(); + Connection.AppServiceName = "SDL Logging System"; + Connection.PackageFamilyName = Package.Current.Id.FamilyName; + Connection.RequestReceived += Connection_RequestReceived; ; + Connection.ServiceClosed += Connection_ServiceClosed; ; + + AppServiceConnectionStatus status = await Connection.OpenAsync(); + if (status != AppServiceConnectionStatus.Success) + { + } + } + + public static void Connection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args) + { + } + + public static void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) + { + foreach (var item in args.Request.Message) + { + if(item.Key == "Command") + { + if(item.Value.ToString() == "KillMC") + { + Program.ProcessUtil.Process.Kill(); + } + } + } + + } + } +} diff --git a/ClientHandler/AssemblyInfo.cs b/ClientHandler/AssemblyInfo.cs new file mode 100644 index 00000000..8b5504ec --- /dev/null +++ b/ClientHandler/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[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/ClientHandler/ClientHandler.csproj b/ClientHandler/ClientHandler.csproj new file mode 100644 index 00000000..9de167e4 --- /dev/null +++ b/ClientHandler/ClientHandler.csproj @@ -0,0 +1,21 @@ + + + + WinExe + net6.0-windows10.0.22000.0 + enable + true + 10.0.18362.0 + icon.ico + ClientHandler.Program + + + + + + + + + + + diff --git a/ClientHandler/MainWindow.xaml b/ClientHandler/MainWindow.xaml new file mode 100644 index 00000000..7eab9948 --- /dev/null +++ b/ClientHandler/MainWindow.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ClientHandler/MainWindow.xaml.cs b/ClientHandler/MainWindow.xaml.cs new file mode 100644 index 00000000..6c850838 --- /dev/null +++ b/ClientHandler/MainWindow.xaml.cs @@ -0,0 +1,65 @@ +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.Navigation; +using System.Windows.Shapes; +using Windows.ApplicationModel; +using Windows.ApplicationModel.AppService; +using Wpf.Ui.Controls; +#pragma warning disable CS8602 // Dereference of a possibly null reference. +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. +namespace ClientHandler +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : UiWindow + { + public MainWindow() + { + InitializeComponent(); + Program.ProcessUtil.OutputReceived += ProcessUtil_OutputReceived; + Program.ProcessUtil.Exited += ProcessUtil_Exited; + Program.ProcessUtil.StartWithEvents(); + } + + private void ProcessUtil_Exited(object? sender, EventArgs e) + { + Application.Current.Shutdown(); + } + + + private void ProcessUtil_OutputReceived(object? sender, string e) + { + var x = new Windows.Foundation.Collections.ValueSet(); + x.Add("Log", e); + try + { + _ = AppServiceHandler.Connection.SendMessageAsync(x); + } + catch { } + this.Dispatcher.Invoke(delegate + { + txtLogs.AppendText(e); + }); + } + + private void btnKillGame_Click(object sender, RoutedEventArgs e) + { + Program.ProcessUtil.Process.Kill(); + } + + private void btnSaveLogs_Click(object sender, RoutedEventArgs e) + { + } + } +} diff --git a/ClientHandler/Program.cs b/ClientHandler/Program.cs new file mode 100644 index 00000000..5f0e241e --- /dev/null +++ b/ClientHandler/Program.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; + +#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type. +#pragma warning disable CS8603 // Possible null reference return. +namespace ClientHandler +{ + class Program + { + public static ProcessUtil? ProcessUtil { get; set; } + static void Main(string[] args) + { + var l = GetEnviromentVar("LocalAppData"); + var path = Path.Combine(l, @"Packages\SeaDevs.Launcher.UWP_0dk3ndwmrga1t\LocalState"); + string arguements = ""; + string fileName = ""; + string workdir = ""; + string logs = ""; + using (StreamReader sr = File.OpenText(Path.Combine(path, "StartInfo.xml"))) + { + var s = sr.BaseStream; + + XmlReaderSettings settings = new XmlReaderSettings(); + settings.Async = true; + using (XmlReader reader = XmlReader.Create(s, settings)) + { + reader.Read(); + reader.ReadStartElement("Process"); + reader.ReadToFollowing("StartInfo"); + arguements = reader.GetAttribute("Arguments"); + fileName = reader.GetAttribute("FileName"); + logs = reader.GetAttribute("GameLogs"); + workdir = reader.GetAttribute("WorkingDirectory"); + reader.Close(); + } + try + { + s.Close(); + sr.Close(); + } + catch + { + + } + } + + if (args.Length > 2) + { + if (args[2] == "/admin") + { + string appPath = + Path.Combine(AppDomain.CurrentDomain.BaseDirectory + + @"\ClientHandler.exe"); + + ProcessStartInfo Restartinfo = new ProcessStartInfo(); + Restartinfo.Verb = "runas"; + if (logs != "True") + { + Restartinfo.WindowStyle = ProcessWindowStyle.Hidden; + Restartinfo.CreateNoWindow = true; + } + Restartinfo.UseShellExecute = true; + Restartinfo.FileName = appPath; + try + { + Process.Start(Restartinfo); + } + catch + { + Console.WriteLine("User Cancelled the request..."); + Console.ReadLine(); + } + return; + } + } + //Console.WriteLine(arguements); + //Console.WriteLine(fileName); + //Console.WriteLine(workdir); + var info = new ProcessStartInfo { FileName = fileName, Arguments = arguements, WorkingDirectory = workdir }; + if (logs == "True") + { + ProcessUtil = new ProcessUtil(new Process { StartInfo = info }); + // create a thread + Thread newWindowThread = new Thread(new ThreadStart(() => + { + var app = new App(); + app.InitializeComponent(); + app.Dispatcher.Invoke(delegate + { + app.Run(); + }); + })); + + // set the apartment state + newWindowThread.SetApartmentState(ApartmentState.STA); + + + // start the thread + newWindowThread.Start(); + } + else + { + Process.Start(info); + } + } + static string GetEnviromentVar(string variableName) + { + return Environment.GetEnvironmentVariable(variableName); + } + } + public class StartApp + { + public StartApp() + { + } + } + public class ProcessUtil + { + public event EventHandler? OutputReceived; + public event EventHandler? Exited; + + public Process Process { get; private set; } + + public ProcessUtil(Process process) + { + this.Process = process; + } + + public void StartWithEvents() + { + Process.StartInfo.CreateNoWindow = true; + Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + Process.StartInfo.UseShellExecute = false; + Process.StartInfo.RedirectStandardError = true; + Process.StartInfo.RedirectStandardOutput = true; + Process.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8; + Process.StartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8; + Process.EnableRaisingEvents = true; + Process.ErrorDataReceived += (s, e) => OutputReceived?.Invoke(this, e.Data ?? ""); + Process.OutputDataReceived += (s, e) => OutputReceived?.Invoke(this, e.Data ?? ""); + Process.Exited += (s, e) => Exited?.Invoke(this, new EventArgs()); + + Process.Start(); + Process.BeginErrorReadLine(); + Process.BeginOutputReadLine(); + } + + public Task WaitForExitTaskAsync() + { + return Task.Run(() => + { + Process.WaitForExit(); + }); + } + } +} diff --git a/ClientHandler/icon.ico b/ClientHandler/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..67d0cc8c2d5172a5d8cead62e9d69a228fe59d5b GIT binary patch literal 165662 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 ServiceClosed { get; private set; } + //private async void InitializeAppServiceConnection() + //{ + // Connection = new AppServiceConnection(); + // Connection.AppServiceName = "SampleInteropService"; + // Connection.PackageFamilyName = Package.Current.Id.FamilyName; + // Connection.RequestReceived += Connection_RequestReceived; + // Connection.ServiceClosed += Connection_ServiceClosed; + + // AppServiceConnectionStatus status = await Connection.OpenAsync(); + // if (status != AppServiceConnectionStatus.Success) + // { + // // something went wrong ... + // MessageBox.Show(status.ToString()); + // this.IsEnabled = false; + // } + //} + //private void ServiceClosed(AppServiceConnection connection, AppServiceClosedEventArgs args) + //{ + + //} + //public AppServiceConnectionHelper() + //{ + // InitializeAppServiceConnection(); + //} + } +} diff --git a/ClientLauncher/ClientLauncher.csproj b/ClientLauncher/ClientLauncher.csproj index 41f1d5ad..3e99f556 100644 --- a/ClientLauncher/ClientLauncher.csproj +++ b/ClientLauncher/ClientLauncher.csproj @@ -1,8 +1,15 @@ - + - Exe - net6.0 + WinExe + net6.0-windows + True + ClientLauncher.Program + icon.ico + + + + diff --git a/ClientLauncher/Program.cs b/ClientLauncher/Program.cs index 59ff33c8..f471e132 100644 --- a/ClientLauncher/Program.cs +++ b/ClientLauncher/Program.cs @@ -8,128 +8,5 @@ namespace ClientLauncher { class Program { - static void Main(string[] args) - { - Console.Title = "SDLauncher Loging System"; - var l = GetEnviromentVar("LocalAppData"); - var path = Path.Combine(l, @"Packages\SeaDevs.Launcher.UWP_0dk3ndwmrga1t\LocalState"); - string arguements = ""; - string fileName = ""; - string workdir = ""; - string logs = ""; - using (StreamReader sr = File.OpenText(Path.Combine(path, "StartInfo.xml"))) - { - var s = sr.BaseStream; - - XmlReaderSettings settings = new XmlReaderSettings(); - settings.Async = true; - using (XmlReader reader = XmlReader.Create(s, settings)) - { - reader.Read(); - reader.ReadStartElement("Process"); - reader.ReadToFollowing("StartInfo"); - arguements = reader.GetAttribute("Arguments"); - fileName = reader.GetAttribute("FileName"); - logs = reader.GetAttribute("GameLogs"); - workdir = reader.GetAttribute("WorkingDirectory"); - reader.Close(); - } - try - { - s.Close(); - sr.Close(); - } - catch - { - - } - } - - if (args.Length > 2) - { - if (args[2] == "/admin") - { - string appPath = - Path.Combine(AppDomain.CurrentDomain.BaseDirectory + - @"\ClientLauncher.exe"); - - ProcessStartInfo Restartinfo = new ProcessStartInfo(); - Restartinfo.Verb = "runas"; - if(logs != "True") - { - Restartinfo.WindowStyle = ProcessWindowStyle.Hidden; - Restartinfo.CreateNoWindow = true; - } - Restartinfo.UseShellExecute = true; - Restartinfo.FileName = appPath; - try - { - Process.Start(Restartinfo); - } - catch - { - Console.WriteLine("User Cancelled the request..."); - Console.ReadLine(); - } - return; - } - } - //Console.WriteLine(arguements); - //Console.WriteLine(fileName); - //Console.WriteLine(workdir); - var info = new ProcessStartInfo { FileName = fileName, Arguments = arguements, WorkingDirectory = workdir }; - var proc = new Process { StartInfo = info }; - var processUtil = new ProcessUtil(proc); - processUtil.OutputReceived += (s, e) => Console.WriteLine(e); - processUtil.StartWithEvents(); - proc.WaitForExit(); - if (logs == "True") - { - Console.ReadLine(); - } - } - static string GetEnviromentVar(string variableName) - { - return Environment.GetEnvironmentVariable(variableName); - } - } - public class ProcessUtil - { - public event EventHandler? OutputReceived; - public event EventHandler? Exited; - - public Process Process { get; private set; } - - public ProcessUtil(Process process) - { - this.Process = process; - } - - public void StartWithEvents() - { - Process.StartInfo.CreateNoWindow = true; - Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - Process.StartInfo.UseShellExecute = false; - Process.StartInfo.RedirectStandardError = true; - Process.StartInfo.RedirectStandardOutput = true; - Process.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8; - Process.StartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8; - Process.EnableRaisingEvents = true; - Process.ErrorDataReceived += (s, e) => OutputReceived?.Invoke(this, e.Data ?? ""); - Process.OutputDataReceived += (s, e) => OutputReceived?.Invoke(this, e.Data ?? ""); - Process.Exited += (s, e) => Exited?.Invoke(this, new EventArgs()); - - Process.Start(); - Process.BeginErrorReadLine(); - Process.BeginOutputReadLine(); - } - - public Task WaitForExitTaskAsync() - { - return Task.Run(() => - { - Process.WaitForExit(); - }); - } } } diff --git a/ClientLauncher/icon.ico b/ClientLauncher/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..67d0cc8c2d5172a5d8cead62e9d69a228fe59d5b GIT binary patch literal 165662 zcmeF42Y^-8wf;>svE?OsH9arM%Rh-yhv|(ebPy56-l&3z4W##uVvQOLSkP$HSV8PD z28|-UcY8q;=`aj4%=&-7b?zQ6;|y&u&gdQ8>~q^W`|Pv6z53cm9PusvH*@9@`uA5y z95epgNBqwbM;!47HNADjjo*si*WnRIT>0%I{`2@Fy!q?IKZzMg%s^rW5;KsPfy4|X zW*{*Gi5W=DKw<_GGmw~p#0(^6ATa}p8A!}PVg?d3keGqQ3?ybCF$0MiNX$TD1`;!n zn1RF$BxWEn1Bn?(%s^rW5;KsPfy4|XW*{*GU&|Tz-A{jf)Ss@I@V{l7H~wH?ub#hB z|Kq!^zxMx5`00-oU7Gky%)mEy20EQ{=FdL=_=8TitLRCy()nA~eLU56@0w?2rT^Ty z{?oA&1`n+B%OCt(0w>>G68Xm6`A?2J=BSq0nLk?e`fI0|mHl&f@y?~{x7hB|E$WNa zima?`tJ{aJ zf7hl>x7n^;E3IVLXW|z-N_LmoZXse<>2B}!(n1qHz=)L=6&I`DE}VQMIqbz(o}OCJ z=y$(Srd#4KF$1-G1|$<5bxL8AU%t0=>3O2>c~-pZJ<+=J3mC;NwVeXUF5%#v4?eML zZ@ks!FJ57rx9_rDdVe?I(Pt$)_02LXvC@)tI?rXQJ`lCA%ax#rQ^%=zsl|V!QU1NtRXE%2IQh zc^f$5YJ2;G^~UF5r$h~$_}}i*P2xT8mlkb%vE=g&BS-eR>cn6D@ZZ1lO`PY%J=e|| zxMkvm3@a|4E;(woXnLz!39JBIK-w zZEeC$lkELN5ORX4O=y=|u<#v9ji!4(ZNXu_+4KkWp zcGLFOFuRqd6|}RAChe_$RZ+1#3(bcWsY;1l-Q<{kcf&gJKn@KsV=T%?!6pLG4Q z-LEd0HLHDxmMwquU*9=0!B4*K1XoM$@7Lcy{@cw`l76<}wO1~%(&9N*R`L*qRK3-=d#!a;R=4~uJx6sn^#4pmCSXQ&s?1Yp;Yna|^bjKGM32p24?Ruq`yGtd%?Or2(GVS@t9&22fob=zn{=xSXHsM-AM_;#L z{_n9zeY?R=e|+3uZn-H}n3!f|$Wqb`q(q}EK)>(`7WfTCyX>}m@3+D>?W}Q&Hda49 z+p-IqTWaHzoM)uwpKM8uqt+lt@5M0EAg8r8YTVjV^ID0Q6pF{Rv~w=(Z2x%u4L?7I zEx!hrL_sOrEwGe*CcnudF_-)9zvYkVssHzz?|t3oK5;)adj@{;z2m++pjXfO8#ive zuB@zVrHJ!$*=V;p&k&gwiClN8-=R02cy5NB*|Dd~N{z%Hl7)$SS*MFU6mGMc;mbz#o|w&I=lt%&QXffL$}T_xx`J9G#?Sz5GZ;|*7j8h+w0|MLgm zuGzDi7+r0jfgc@z^mk5c-t=c{SFh}@7?1^`!F44iB^$s6tw_cu*S$rrZ-4li^|*Y1 z6}0YPNm)(BDC#u4cd(4cO>Fel z*V`u>x7c=R?AVIoB%8Nx)4$G8gp;y$rQ5gsecNZB3>$JquRr|gn1mm`w$ouv9Dl># z{_6M_pLi@^I>s~Z<0~uMQYs&Jz{WN)4XNO^aqCXI<<2RRpITa4Zga;5Iz)0#wEhQv zk=Eq2{o(^mfDd}G0=8%z*UxNWIZcJRtOA$WCQW(JKH0D}PKVzuRYX9=4{v4LZ0F7u z!t`tJELza+l&1MV`SG#eP1w3>BB9l?G5zL0e|Y4r*NjUl-MVRl2yTgJZG&2|Vn3W$ z>_nDQ!%y+_bAPjwPCeUFM6#Y9=B42@}fC+d=zz8xI zxXCCGeuP2%CK>rHtnKON*?kW^X4_>bbN`~42>zA`#bwgrcW+RW4qy7>oL63MnOnc^ z_kVi)vEQv_k0deN8ZZMtIsQ9Gbv>)Yuh+f3>QWKdB4J`(*{2zyz;p zeBWg+oi|0k5?bBVJjYA6Y+Ywv(9Qn->P*M4k5*&cRYd5c#=YC)A2-U8vP3wU_R!=z zvwruJA04R}n1rpX2GCtiAHu&MdBnH!QyTto_A4(n6)s*>dryn-df@`~*Yyl!eB`Om zrIC-i`j6H~wx#sOEu3HA=gVt(s{8vg3)?v^z($~H_yKwZ^j;M%!u#L?90b0>Z}|+2 zpr=W44YFHTVo zO3H74^xxn8-~aewLXWTMMEVttFZK7o{^6f*za`U(wmv9atdUP)eM#|7#hpibFZwTj zj7_rFKJfTd*;`K*jTSnuK$b#=LeHRwXW-j#+ii@VIflOB9ngNjK~;VDe!vLd<99U2 zN{-H<)-X$clNg`LYI2HW(rp5gyK)q_(s%GEkMDBdy`WKoFzCDl4XR|bUVJWovhb64 z-yJowZ{NCK(ex)STSI5y7e6@mxIvfoth4>ok4Fg?E7aseC~;h%e?wQBrDR|<{rjwW zcJf&l%J+?I(^@jk$=-8Zk>;UqXgkm~G|X}Q`&D6s_xUZ~4LISwz(f3ZIVTGn(%Eyx zi-eP;Y}v+yMXm!cAx;I^D>J{9+Y4^GWwL!L9o}th+*s_dtW*w^GTmO8eY$)5_J6E< z=bhf?wrls(|2g*Pglf5r1i zT%%^pz|W33^4rP3`q}Z*9{G#nYfI$EC|xT8!B6R$@rLbo>pc%zZp%}& zHY?Vnxnv~i-t{EA1V49W{g;gm&R>p;fDigOjJR(x2RlJ4OD_;VaeG0&>n5$+pJOl2 zc*C~pMp*;!-C(RP06DJ7acR@r-9){-?FpdRt#QMlvxTqOUrcvdtDqZ_d^0 za#{>AQ&sn03SNYVMwMcNaY#Nx??J!MmR=-Yf^I?_Bv?W2O3KW)^EzK_^Ovr%9bzG< zB`$lxRCKH+r_Qc*vQ4~aMMY2EKJn_bddh*6O*ny*FO5RKniK!;55IrhdF|T%-@3O} z_m^E$zOoXD!vw402lc8ppj*3KCttfxRN$E!;kf&Yf0xveijz>Uyu+j_^as&RSRg>x%SU z83y+CUd7)Z>}%}0wD{jeF~DFq!Utn*BzqS2_PU zaYs2X!6Xb{l}=W=duQ=ynm^W+Mei(Me!+RCob=28KK45a9sY0=?Z4oBKmWJmy^g`; z8*j|e^L$-Ecu#QHxtl+5A>EWXLe|QS%4fan{zt5!rDPA~W4P@{YizI|)lE~rQq$Aj zj><7>b$Wq(92ID@;_H23gU>2{|6pGSd{l)I_y#yZ#)6l4JaBBx;Dh*ja!*(X&`sRd zCI4d6lTNd{9(dHY$e_JNwrs>L=Oa;Hx?{^`&1Kn#n#I=^zCNQ}(~Okw|NP&MOW@>R zK-Y)k62wgO?$)L5=Cx~Y&~tsata#VQdbA!Z1s+@<)f?EQUYoVh&b;s<%V~0w=kWy} z2J0;L($u_DWGBUrDmqKoI@`FNa+=!v@qy6uzA$nizu(t)QbpG^w=Jtj{&N{n7>LIO z$AO119`1{K%5Hk9c!=~6`D^l8p6=lCz#S59f1`_p$8%dQ}=i7#LBSDloCa-T_>Y}YA`o9P}E*QFTY zj@^3L;^iwMeMEB?abO*|WGX*V>CSg_yg;#=cTS!-p+Wth{OG7(9{rsJPQC;hKa^7{ zR_a@ge)p?m|9aoud14cDWu$~(kbbedNcsh~{vBHSwyAwCa9n@K6vcQ%aZG`ZzllA# zso3J@ff$xd@t9;`i(Ib0!>+XjE7#gq&FMz1I*pILjvP4f z{|@C@CVq4HXW-`XBa>{$mbmfe%!mHN2-C3TGM^0Wm zEqoJ?_k|7SgFJX*VUWQxWS5|a*NnMtl6|~!xBE;SBVx=ub}F1}H?j0m>vj}L<|>=_ z(dyORuk6<4mkE3D;iviio$=?#9(B~Y?b`g}^Y`BBZ@Y_^+K#O}lN~a)$W&hx*`~C< zp?fcX=VR+}P<(x=0@mP9n zfY<`XKWM7ewR@uku@5BUzOj7P%=6A^)9M#LIp#ZwoRj?#b~Qi$)epXRRAEy6AH4D0 z^nCG(R}{FtT)Ku5=J0*%+33&hQ#$@=-3Ghiw!01cKK9Ej#S=#H7T7kMC-4y`U&Z4l z9K$<8JU#e;cYqC!!AyqqleVfG@#quJmfM3jZ7niv!ZDl>uOeG|**jKT^z5t8Jl(8W zTJrb*^V>%xV(F`igUWth=jT5;{;r#@OSbKsCu_A5E=>78 zhab0QZ9C|hDn3v#=lJ%Up>ISCq+)EycOg&m zjPttKKW8uUxrdjysZ0H?oq8JBNOtdDuQ>V@!pW2O-FkCcgWvq>=wBXx%u$s+=fryl zHv>QW{`Zc#qHE{hZu{ipA>tW})z*q{$e$bG0!#!y-^@7+JwFJW6n;MPA&9Z1VY9{8 zhu#@tX%pC}92?Aw`w)c#a(Uq+>6$;VktF*byo9(%{6(}3$*bVyQrQHTta{IL7z0j9 zy*i$rR`D)$!wupmYl=2*oOJEr0Syn15)$8zp8@&4k7}Kp{i6l1zur!BI#YA|v62_? z;mRTv)j|lq@Ap1jZ-YjR_w@{1;P0aT8omMIk9fwchYd1YyRXkgSa#*zo?_ zmtN87g5N2RIZ;bEp7;;o_^AgT$Pq54O4mb{Qr%gZYl)ZAA8Qi%O6xc8vOnGRpfzrG zvddEBwW5FH1Mrxs*gA-x58pSv=Sj#%mcT~U*odE-z-z$<$04pD@R-mu-!yC>4YQlb z|Jc@UQ|$A)joZrg6Si(ZKU7m7=uTmz^nEMc_0P8!&hK$f+cv*Y?c#(EzYlEu`agbn z-01%O>lAO?c(X9EMoqb`o|E8uAN+#cR{H5L&$N?HztD5|zy#|U@ly4OvDLb_$3C+s zuGaa6$MYrhk9Z6m%JJU5&zLVI=EElk0G$tB(nNaTl!u=zk9`brJ;(rM(~8Z!X~^oNVFHg(dV7q?&lw`T6MmrZLaw5$Lh&xvu)c|E=0Y@hNyr0 z!*$mE(%!C9;P=gGCLJ<{3*sn@o?B)3sDAv@q0rRV={NE78XfP!2yxEj1Yj@B zYerad-gN@mLMexIoQD43+5_=o?P z@ys(#H8(S)Xs^~hX+0@(ku~6gTK^xf-)dtf-s1T^=z_#YKyT>X=ocZLn?A%^u8W^tM?G75*b!#AGci)*dHi=<&Ns z$zR;0{UBDBY}#_?tyf>&@VEc-qi)#WT06G|gY9zUZ|G%WWmnyRkdszY6kks*d3u9(%6ZA@vnYwKpF*cpBIj zebn~PD&pgyF%ru=L1x{9l|6IL^C0IWqv=%QtR*nhhB>-d4T+LAh?i zT1XJ7;_1n6#%`}zdRx5qt+xgY@6+cGKmXwmkKSAA_k#sf9Pf@YrLg=N(fs5ITR(t(gY>C7UGRIkpd#EQnEw);)L4$`NTfsX*pTNex z*MmdBNBo?I-&b5G!gq*?#KwhQAKALJrs>#i#2GCV16p8ttxmCtH{WS%Ki{_3en1{< ztvp}(Pd*V{d@ee9d*#A~gF2mc`tN>t^if|+|DyJm{7&n}SwETo+A9~ywl_z%+P5Wn zme)gIAHEPT_5P=uZQ!Vhl3V4sl|6)7IXn+|MxE5=mfh?O-xna*9(hKdOUm=mcfO#5 zl~AppCKMEOay#@mAcvkD2ccR#W%Q3UeCMT*&Xf0S7$}GE@(r7w&O(L(4Iqz zzAoLWc)R!2p8Urn57m1A;{SdBdqdOBHWdvUc@rGe*`{4dlO+Z+U9l z*1uZ0bjdhDpS`{nTOfC;_yqTgacYz9lw5-OD?YMIt{N$ORJ0F3yv`lwdXN6MM;8oq zURfW0S5?pXD*N5RyjO8dRb7ks_kG?dk9;rM3Unsg3O<{P*W33w_v95;^*zqFuQBg$ z-240O!F(RZ82=l_*L&zhTlxM*V{;W`40UDN6fu_N|wn zeY%zILA9mIKGXe3c8oBAj)DG7`*>riatZEKthDq6=@<0)`2LVw;C89_x#IX>=%eCq zD|=mW-8|UW6~|NAHNt!0`S0ED!9}=s_Z@A2-9xdZwA zfqo}kC;s~>1?^q0hc2$aZHlemwB6TLAR;*(zvAb@N2A(=k3Wtb{UhOGtl|gfC2ca_k3b-ur6%zH3Wo%2=vZ8(4Y`*kv8tCx?9x?R{W?|bmC zk(^b66{nQ?+M9)s%-V#HYljd0KaG8!Fz$JL>_;5-HP*Hi_U7D0*16lImL~n1T4l@& zv2E}Tj?uC4_0h-ARX7ebNgv)j)IR=PhjM(V*FEIlRlv%jj5+={hdhqMj6KFt89p+a zsb&mxAo?H<`!3~UA)D{oSp+`hP%PUjeB@KZskUI`)(PVps22EY;bW(2CaH^LsWtC@ zWP?Xe@Ot9p3lM+qIZ82Xz(e3A=-RY@#j}g2l|wnM_82SB`@x>?P{thpn}faHm-+q5 z@bUi|Y2OI>7@-UJ$L*7+cpk44)o$%=9pR%%ZNkTmV@9QD+~j6>;y!-x+4GlJK?~KB zQEess-`p#;LL3j`8TkCX4!UpwKMnZ?`+FYYS?}+Ad>-aMz7M}Y)IR=P@y7=;o^Z_| zGwsz^Sf4A`CB$pRL#xx`#~h9iYU~xpc_6>7>N}NPKdZ%=c4BIzmlBsf>7GA3{~(82 zwove~P5h&&@KI~(onAX)SeoL?v|qhYE@p@xKKb4Uyv9D5Ko7@GMSdo8MGXLY_^8*_ zQO}xzzqP8l4DVM)8{xCihk38qGvDDmhuU+F&?=sv*A>rO*?8mME5}HT?)KnfkIWxx zUeQ-P|G~ay?3IoCK*xTt*W1_k!#Lu<<8vc=;4{X0=iT=Q{XEE50Ux!-pMLZB@maz( zaa7I*cSz}&H02@b7m7J2{#>|l`AM<`n80Tda+mOPfQ#Vki=V5?j^k-79LIkz%z2pK zK+A`#M@EeD6!+kyBF)8*CycSG-tn;)HX>X&CgQM|o-03r+Tps7`18ci+5W~J|9N$f z!*%1&!#>ziZf|t2_uT)G#~(RiMfyjr!^e$d#$?Hn%Z#y_bJU)zo2m6e z``Ct>ZQz6Tf;u`re(7e6KP^W!O|^#`G0WK+e=c&Wj;lL%_F&_jjM-&h_4U&7y(Vv{ zI~wM5UvnM4Q=Pstd;}WtbyYI?9e3Rq$ydJkx_f?!Fgnesi ztc}bAHhy}~Y1I56Q=ylgetu8YV*9}NIP`tpV&@Mv<`2i1x5-Qz#!Q?vb3|LaX_q}Z z{qK%Z#vbOis`(C|SEmopEdCq^h!6DhT2tpi{3Ej}{!v|gggFd-RnLph;a3AjPK@YF zw6#U`{sK(}|D;GEvZo(nAI=l{aDH$IMwY+(sd$+7UzTkSzYaVE{*csI`wf5z^-crg z8_W&Zz?PXQzSDQu1Y5g7^;mQ+_G+dk3$p5V9fa#ucl?}}b1`oA0xDlWbUbhQdp?KE zWuV!r<~w{|ojyF%_;VZ}J_>6YJ~FDpM|I?@Fn{rV{PPO)%I86z9x?t#+pw*~YiU4V zfv)h!KwF37kMo2U&JVpoYfDytD0){NTge7qzd$%)oI&40o+5S+`HNUfx97PZsDzLMgpkw$3@@lx2??qe98{k~{ZP`02;Do)?;jgRT|Ezo-nbR=8mCbqhtU7&ouJPyi z`r>R|FLCayiU-9-wUKbu+gne$|A&k}esB9A)W1|2cZsS(&5cY5MqmkpU zx6d~0a9l8cXxYW?FnGo6h3g(_A5Ilw;=(-f%&5`B95R<-Uc)?BocHj4b^40e@VSZU zsQb}BY8(GZSDg{Z2hWo^uZWKzXN7qVeO2=t=B{F2@ppV4uz~IhK0eu}G|7`bs-+9x0-n>_;}{(#<#{W{dk;hw2U=n!d1Wq7|^`N#=Ylyhdy@w5F%q6n#d#0! zSEmopHvSx3hu2>-e56)}59T@AZ#c>+P8wYZ`hj^vm!W^|Fr z$07Meb}r;F<|(_NrHveWjcwSx-NzoQuck8xTi)&!BVZ(wg}Cpx-(PD@ls}4189jut zmD_wpYv>#SA88(6qwmR%8}PAp$F4}O@?plXAzVawJPhOab4BM>?vcvtc*ukEthe6# zIDwBZA*f67C8;Vzp&TgYUF)b?Bwta}Fp{~k-LN-tMI0Qi*8wYMT-ZzY-IZ=@RT(+Y zAs~+c+beyr$sTGi)!*%*ThxbK7S7Evc2aboS6`oHV<%i|qsEN2QDd+6He$@xHc99FH^Y>S+!}*=8VMdn~_2vDBd%Xn4icX@=8*(G}fL`>_EOmnwQah-5I z-xpT-!LQGnU%pQ=G!}BhSo>)+7cSK}`MvfL5D%%Fjy+5JA*SDFpYKs(HXVfIbr+t5w-O@_pt5+W|frFpj?l+)#@hEHG~V z&{x<4$1$$=Uwv~yO~FUYTE;)LUu@052N>bGBl8E^4X@!X@%;Qyj-ju{E!z9}oyH{x zKx5Eb!}NTcw`h4pPqGihufyoS_%mkAo~Ly?PqkR0m^9)|*#DC{>4Qd06h4rt_(RtK zAM}y_kKLjF=Js5EWNbrK+i3GPX&BgbW4t5GDSjn%lYV1vRGdyr`$Jlx*K46R1$A4{@9JmE z&r<3AaoYdfe$%= zO2NlTwG1EG!Uws7KCNFBKA3aXLwHBf4LAlH#Mtv0bX1)d@aOuYXd4=f;tRDmmF!UL zMFK7HhixdbsYWyhoy~Z2j>d=FU+8-<;3uRG3v2qwaoDEO!1?1O@Q>(Z{1*Pvck~UG z)l&6bbg$HmB&LhFM{kYgW1$XGXqDV6V+GS(Gt`IyBg8}o`AV1aahDYDRGCZ05Mlhy zIbXSa74UJg@KG!FUKjuPw(y)=Q}6-Z^8E2pNA=}em*>1g2bHg{2hLMCFF1s*!5R6| zT+=Zrec-j3bIW}%@%Vto(Aj6qobUTGAk$Fei{En2z&{)xK*F0);r8i>J~waQ;rO7o z7d5}&8(}|ck9`y_l5(ZXgjNYJ37BwyCHTQk5R3C?>xt>|ODTpJc`S+pi)>kM&R^!XHpb}#z=s&aCzzSHU|~(c z$EmdlA4dw$`ND^4BSv)bRmxYD$+cg`d-3>kej@rthDZN^yraJuK4LV+d;grh!te`X z--R|g54r(s_~3w#*w3Q*j9y5v5I(lqfHBv5{XzB-@V$W0y^$+*4!=*uKgQ==?RD?e z&eQb*w&{5dHqoD6pR>4JHVnAjGY08SHHUw65I$-}-D=5K;G>|n-~(EyP7CyQsQCED zo6DTnu>Tvls3$%^EkX8{88-HM_kWa&HNM>N5B`W!`R}&apt08p3(_5gj}W^P(Kq(( zitUT{`ZdAF8MO=_O@xolHI0A7({MPh4mSAhq2MFv=ao5-;`3I}Q$JV0Fd+?Djy+O8S>T~YF#~1NXe!qNAjq%6x4_-&V-xvR2 z-Ki~sw&|X?H(=tz!zxqu1 z70;61&|dzOQ&hLUb-oR}dX#M_+UDQe8zY=adj?7W_=0@37ysD5e8pJ72l@(q7<(H}>bY9H`b@%OxcAozHB&8wDkUK4BFNq+b) z@?D>=`U~eNMx;Yi8+y}N+n^G&=;HoI7n%;YZr{Ft{ao~4acurN=0j(k`@;t~j(A>d z9D2=rGiT4Q{M=Ptvy%72bE#~M;WK*1SV??hz{fcWd{ptAE1C27xsIRXipPheKE#3I z19}R7@ws|0zyGr3cFMKfiwdmqMNKTLQ-S4oZEpGJH@DGujJFNN8%2w;_zuXE6FI?x zj~y|5NH@oKf{iyeAM7RIcB^2&3Vnt7V*J?3D)JAo9qdcMa=K<&_C?v2*)7M?I%hjh3OY8kv6Cj)dX>E|$49_M zz=vW_h%dqSfz1nlMzl8vHsbx=8~ReDizo1L@N|Btzxdg)#~@#|P=1tZ&ugJkBTltq zer>R|hxP6&>kB0BEB+}ZFW7!WGupo;MKQD~S*o3_)<}(*TCmeVaZ2@NZ>q2SzB&bp z>B>06QZkgUksa+nSzqTnp=p6yzBO!;Z?ooWdxuz9VVU|6x9cH)nwJ;enqfIzng|!U zmfAhn8g_H-!Djf zBj^$MD6whzKIG`{YS_i%o8ME+w@Dm|=j4djfcw{GFY)m*{77Shk43g+u0M0`>~el} zsLwB~N0t3Pd`ADZk*|(D<~zbiOW{L%m(&7$2p5fL*g7SXm-`H$5#b~?C!#xOFM3|8 zJtDfRukY5&BX;F<@d9Yb{onW(WBx&8u02gY7UJ18PVU+9qTl%*nlbwo_Xw@V z<0E2MF{b560WIKTP68hX$wl3kk&Co+a?K$Tyv3tem&i(QpzR4h;`F?g< zFJ6=XoUum8i2e zvKKNJeB(sPE67yIlBrU}Ga9uMHqI!tv~ycnlk?l!tYx!ANs)wt4X7L+zK>p+y<7=C z(&FT+{o!Ny9TP3JU7@A4QO$43bM*_=%fA@uBeK~_?n=&4&Msr73ESX>{bS*kjt}ve za{XTS@AoS|e`wm+8n(>0v~~rSeY)!KpQrsQIx0W0Q!^{Pu%*pf{)Q-w94E!LYbB2Gp(Dpf zspBKRvwkQ3ktzO>CjJ3FvZQ~EynBr84<93@jI*qBbnSDr|7-g~`Ax*bnlyEc)RkQ- z@Hz18m=;!2)xsW`@JHmYJ@|<3o1Dbg=PEzS@gXy6jEm@{*EDl{%v$tS%U1y(_y=nf zK3dln`6|*SB3n)*Ywd~WV||V4i$pnyA;t-wLQ9ptTc=%POFm8YoX;+_#vKbq*OHaG z6jYriL0=<>m-`C8riulMl2z(5=Z?;AUa_)&+95X2$S=OjV8# zYy)Z~61Qg79DER8lE4S@z~OG9hoGBB{sPG#G5IOTB={0oU)}Cg(8N-jNq&+%lPNk( zI!{=*pwMzV3lClME%Ty0*`FF)YS+e&mp51aQ`lfHum~UgON;0&!bf2R{!tMhZr>G6 z`Vt;f1JIALU-iF#kfnFYvAiBl+zys?p=!FHE$qrCpVUTrNi)fRh02?fKLhlv(>k~3T;57@{& zRr!CXYHig%J=k_+&u!4OP_k5G#ed{l_F3}di9e)>PhSgWm%FM7y&bH z#Nh+WDDsMHBkpf2bN*2sd<^*WP)qHUWm&={I(}xCeDN^VZ0XqCGR{_hy=1PWlcJa| z^d$6mc!k@8V>(ITE8v7Vpr!-1pZQWG%TFF)CsE)#g(l5G1beP^v zzPujN&807-b;*!Sm1fD^GaMf&-3u(YOEckPrtpFO5lK|g70qj}tGLuF@4O~CO!~EG zIj3j7Wn3cpO#XE6GWySDE?pIA-6N5DjUpP_n%8S;H+h)z;-;A^5C`S=<(FR+Fu$yVDw-;&SFvozr%Q*sNs zcS^TBOO`y9EFRIQyS~#UQ}2tWFV40`;ve-DE7C~c$(9Z4ja6@oUqm%}f?NVVd~S5` zvhb0km@C$LaFN<0#~O4>cmMgwd&lk{A9s(6#sy}@KT^fR(k@Q7w4N#6(tD&hR*=8& z(`PIGF};K89<~+cTT1Ry9f-Q{NZGH^d@M2#8$*8;T2QC0adI^mdM#WF%ylG|4M8^a^Odkz|@=#S}K^ znq!TKpSrlQ)_-9|@=-luh0o9dX0Dzi{t-!3U%-cGkNA>o=_$xa;38T0AigBKd!Y@T zJaWJBC4H;FN6IBBMoYgW)zW)rSZ0q%N6C~eAmea9WjfT=OlG-XR zBCB-X{B1Kgm~aQx^X~ zzCwRN2TBnSp`{8NDU!E%FI8iAJw>_`IH9GUAzz|={SC!W>L_Ncu6SpIe94k|P24|N zE?`U99tzf``x?pao+Q<^orFw;ieKf&>_OB@I+xndmF^B6t`Oc`QX z;yoGC%N-x!SK}tmv0~$W*Ok^6>i$8l8?LRx z@aOnQ$X5pqkQhErsj2t?7hr}sKI-VyZQI!DNylh(rgYcym6z06zOk5|5y?}McZi9? zuN~JMJEFw~T@;tzqd@eTEt<==tX^7wC3DrgFxQ&(JjLd`H9yin*w;qH1wJBa3!*Ev z>Ea(J4?f4vn%K?GyX9gl7}VA>FUM}2Ys2pwZ=WcBcc1vUe}Ls&B%774@Awc-z*-~& z<_W)z#h3J2d@i|%u#NmCUXmuBlG;7pvh<$Yyx?KyN)I|iKE`%hCz==9>+|MCV-5HS zSW%zA$3a8Ge^49n0XC?GMNPD%v-2(GeEBdsi7vV{SDd-(Dt3-!r!?81+}9_bLF}O8 zqpN7EoAhV#lx*qa4TXj5o|0AM`#?vBm(=N)A)K_fUN`l()$89DEeR2lr-(`1<3Eo$ z$<)<{Vw-^D3&2UzC8G_J>Nq9tMWcBz8u>=P>7Onn!={VTsqZ;Eq&U$&zNFu?;B^mAG_T?F4>~9Mb~3U5v}^b zxl(7$5QR9inB|3p5|)H~|;s*oej0>KQmj^!>WZ?WsrpjO>ywH|eub)1NtSq#B(3JE1AxG^E!!a+32Vvch*8b?d@ICKi zzbQYC;R;NxS-09w@7clfE^IEHTlwX^+grid&em_ny*6^;p&>5h*P z%b&4BT#d(v27yy1!Uy%?YLox`An>7i0~hg4G#>QlFZAWui7DilI{6(v;~BX@zHCi@bTvSS?+_! z4-ap^9_Tz=$MBK(7XKWhIM662G>UzT#rNnpU%-c+ZNxvmq4)^&uDS6!bex2k!T3I! z`@mPCJO=R=WUv^2@jN-j)sidJu&L~|Eu>4FBHn$vc>OujEr^%uBz;4;zz&Mt_V&jo z+XmYrDlFE2CEAND+Pe%|jQ9p}lHS*+v|TzT-!hR! z>H_Qa*PCp_tVeC&oJVcsif3))s^_im{HJWN@GwBU1O72|99(-?( zt#?EUbQSQyB^@7=2U%e^=?%gN@mI;h2s#ikE)CTh^pFifElJI748d-Nz9C(uJf>dw zz*bk8d{r4fxW8EoW_#{SJ=ue?j}vp?xmohRJ1-$VSkEVF5uHcRSkD!iixyiK9ZRBx zCOeUy*-);QYhahxoaJm&DCq`8?`9FywgB_k(Oo zuX7Na+CVX<9)kxi#4oVdrko{goTqr!PTE6Ov4pIhU<3P2TF+E_mcZlX$ z{5ARRn}`v*Xgug1Q6HE@^j&S@pkGHkrhI+(*JY-i)ofwOr#58zz2X~>*@#8cZScZr zHe$sK)_>kq8@=Ks8zx@Sf7#R4R}Fj&5kCPRBbU8kk9@R1=ZJDgO#9N5pI<}d5B+1v zl#%XV%;=nFxfkmmxxb4GqO`Ypy!g5DVa+#o+&hN0{u(J@R(5a62;K--SAxf zbG{S92Cu`KiA?YXe85s`Cq52XKaZb_h#zbIgb#1R#$NHYn#;Y{7d-=by4Ij1#n(E| zkRO8@YiYto#s%6dR(2_Jl`@14d~V3+#DNf_l-51f9{%fJZQBmT4?^y=csYsJ5CgOk z-y#C>@1m2G(@&rw^}M%PCtIOyd~crftX;GCc^kFtc^kR%MH{&I85^{4x{X-=Hya{- zysu=d-ix2ILCdD;eaT+pDI=CXUo}45X=k=w`?rspcC%&lY-uN+m*qbFhO!GM$>!`l zL_Qg}xrz4a(b1z8`9Hu3`~%EXg^wbw9Od`NeXB*cU*@^P#0aN!D6piHm2=-5|Dt#a zv1{mrIZ+I>VDC}8aPdqx^iZNZWOoI)?eH09i=>u-!`+y<(04VYSY5w5& za*6O!9N}Z`bQ?Q=nhh5&1}}Y9dWQ6l3;}&HcNxn0&g>|D zflrvc40wic(P7Ye*5}s#Hd_8RVq!b*69R4vx`~~^yvsi5WUiyb*E&g_jSnpi_rj3~USL^iG@s>Bbqh<9! zO>(2;O7W2#>EOB2G4kZ2VLbpVUSmtR02_^D19trb{-K7hUQz$p?sqPR7~_q5;bZCC z$ZwDBOg`1j3&gk2kRH-Dib)`Uk$A2z$WVIb#DdbIynpPH5g*wL8?1q@pOCX6{n71L zG5*06?9D%F6F$BWe?|SPkpB_vxtFT##!myEU~!@tLf1(ydT&O0+!1Hs$NQ=)jG;6gVHs=~`fU-J9C) zFFVanzICt-diepHFz;ELAYTXV>V+@ZxW&)eNbwAO8puxlmrt`k%b&K(g_FzFdM$s} z`3L$3{*NImq@xQPgYbstj;@p&R?wSLu0M+ z;4`IzDArj1jcm!3>Ef4pJqlwvDvEVi9KFYp2^07f13v*9G=7ucxv9-q@lVYcD@6<+ zutgt7w1&)CK41QK@?L~3@=p|JnI)c`CAl{3bn<+a8_=vE(g|ZZC&)}erY66)B0hpl z1&z?E!iO`l7(Q+oJ@V8aAN$?fgpV)8?^cBm_aR9h#XjLRXf$VziEQQT&?LiRza@{_ z^A(y#H3-t%OI|u%GSmfnE}az5C!ZGUAL}A9v^-~G#s^IvrnP*X;{w|gvUI3D#k2m< z-nOw150{*fYK>(JO}{ABGJB?3&K22;xoTv|7b^}{KIY_0GOR)OG^=w_iq(_vIcs1G zYdQXO>pbIbyL8^8&J*AZS4w{Bz3e%=inesR>)zm^|MIE&&Q!Z{#WcHY#nZyZGuCs3 z^l@RKI{3K$(>H9WurWdy8!ms!n1zqpu-ERjj`t3+)ZU^m#Yxte|B#q5WUf?fz+gf) zJl8v<&l6W4@Pcg*I~e}K*WP+_Z+t{+w$CA`nYV0y6rTn@G~f6q(edEfnUc9O&e5|v zRl13Ecxuu|`6gQ9s1q-l3%?0<#Ax`lg8Urp#CzncFX|sWJ2gGd((S@W`&x#NFXTt< z4<8M+=Qi`=d7ruP49%VL+8i6oO~C(6&4CnRgU%GcP##0Bbc`&IJBn;C$rnpU6^$n; zN6FVgt^H%BsD`aeJgzJR2OhrOWo^`N9_#*gsaiUL`(QYaAb1lj3av#4#hYk#CYE9_u(k zhgVJdq?Y0*^3{56Jz<1=EOIlcM-<{AoL@+;f);2ln+ZF6^bh&ZBW%=Ge6T;~0pkNZ zMq~#k??CdVVxwr(6{*`;dvdErNWG@=X`Cb-Tz-rU>E4;LN4dVubC!>o+=kSP6=T~o z(;D_jcYGi-J=^rY78Cv5bhr)=aBt>MzI zhe)?TuRvBBE{s64!mCa<4sLl-=0Ll;eToD7qU)>nLF;IgM| z_^N4k#T!$s)6|L9=9bGWrLXAGV@i}KB|RRWVk7A$^*d)NrV>A*^m<_h-)UpXSC!&J z)5b&wd<5AnV1zsX&(Y$!fD^}}c!^|SY$vJhRCA~$`2;QOMCIGmD-?f|zlvN<@_t>v z6h2(Ok{`wO5?)uZ@A|W3Aba>n?bu)K*ki!Q7xK@m;vdwz^f{3Z66qJJ(TQHyL~|#e z9ObrZZsp%Y_a=vr_04_2!T|9Ttoh_PBwef)^B40ubqPn`ImR}#)wFbJpVP>+B8TW^36+rTl81!{m*->^JC+!>G;mp;9~J=(QTS^6!L?Ug^5Or*=nE| zM~_FA-j=7_;8)kobpElIeK&>=q7CLRpX)N4`&^K1#bb#LCdZgYUI6%kU%AZ1^E*$v zNeA%@<(t%Psd#?rC-_dNYe&2TGyo6rdMb(;D#u5>f6&LkKOSF#e07TCtFI+K%4JUB zg!-6u@*-bTL)oN|T~lQ@BvuMr6#6F50$JH}mE_OzxI3PU8h)_I7ZyDebj)#+#@d!r z@Db^_=yhzvN^A&xdZRS=33rXLLgi=YE5;8WSv|>DCkk&F1KU`u>$_OjM@HGmHy?0* zF-r74aPbrJcRyhR*F0@KS538^%b&7KmOf=yNVb9}^i}I8-Mhc|OJC_8H1v-FE^7%N zqUF)j+s7`dK0YR|pD%gpIrps)tI}689IYWpR zJDCn#|M>di!)@QP@1diK&n7iju8!(uW}GQo2sH(yW5cJRTjm_y!W(=-&jFo~=L2Sv zBp=X-QH95#V~!R7*tF|&!6K?bMcqQ8L$KrSRQq_>TAOg+HU8Zs*?Agj9c^@#*=j~F_b$9WHi&j2o zo#oFPD7^z&X^eb+;}<+*6Xf&5wmV+mg5$3wiF`1O&Kq<@HippcjCE*2{G)Mz7LX`^(L-nWml zI+veeIk)t)PA}YH{pLJkgQa&P53$}4P(xS1|BY`Vl9z}pL}rRUKh(aTaD#mdo6~U7 zFgD;zbzWq%KYu(o@(;3c2tIT9Jje#&ZrEI9hs5vOKAk1GNj{dvkxt|Bz#5~EN4yT( zacE(T+yl+AscZI`^^l$O_(V$^*TsHwNgLU^WNSUYrM7ncGl2;$_c=M5>s}X7gwARPt1B^gdkw4?`;G?&&L0%L#u3=i+2Ox_f3oU=nh%ecU zTu9ssgI33wp;3Bb7US{Zu_-bCB76h;a=-?CW%w8*yTSm)sPvulkoB1{#m-Q?W7d!h zHP7ws)m3wJ5nb40XMksf59Cs2ak=mTE@;lTg$?il-Mb8h?LFqR4}FlY%I#jU?|P1} z$Ny-Z#Bb6;wwaTqk2WuqohGW)g{|{Xlka!k(I)`^hdDl4*B*QvC;l<^Bu!>{{VPqT z-FeTwk}W0YDu=JG;%ie+YH5wzog}}5;u2)9#V$ph6tXY813#bVO2=#>uIK5veD1a8 zuN7&5SdS^Bv+2jHk59%N0-d7adXix zq&K)-R`R^)wXf*)%f`o*x(?SIyeFOe;SU$czb`bvJ7V}?E-_Ejn>L{W zA0uQJz`l!|hh3TYE$~6y#9vy$#p(C#-qFhRlA%E_v!^>w5c0d*eOT_X!vF z>yiTlKGDy2+ls{t{5kQgDmMI2w0Im;daP%PZ;^(qjL!rgJo}WUpDml_DXMX-I>OX_ zOfGC{x86O)N96ag2xVCCAo@t4RrAk55l?&@AxwK z2evN!CCEtFwV>xqMYrJN0pa5l=O0=o^*^ys$X8h7=ywPox5n^6Ts-(dX2QDE=+KC7fACJrI8F2~yB>9yaysQHwkcNk!)t#;JUOf}-~oG~ z<3m`$Cgn|-2(>xr;T_cADAf1!WrN99Ekk0vQ!bVbO!C!m=^tBnZ_+rl0GFzSLWSA`F3LP2IZ)V`l|Yhrpw3J=4SAJTv6 zGj1mywDd)L@S}zHkyh*Ae_(Gm?gagVoRjS`RR8I-*~%4p#(k0Q{}BHGAKV8vtayxs zF@lTG(4_{;2JE(H@e%kYSiN!Kb2fj+$C@8d5j{!dIn-AK4=NLhapfP7BLBqov*P@ZB1b5Q6i{AE@J_ znecH`CChbMM)8lS z!pB(ITKmcG2Tg&EzUZx5Tfql3RvG^|9Qe3gHsOBK`{5x&@GI&y7#X$nC420{g|YZV z#;xH)rc5b+^t(#z*7d@N{E+aDp^~cxkguy_gn$q10$Vi@@+`qezy|t7z=yAC!Uj2vA$KwIOG);vpic&DgdU897!~5g zu+!(rkCorCg%zIP$|gSs|A?ZiWBAxA{?SDEII>29p^`xfAI*f1Ev$Rg)+9Ro?x*f{ z9|N_{Q)Qb?>z=G!CDn+PU5bVeJRTqJlf{N59ueAJcyZiBa#wm6#ivSsEfiM3)`?ov z{=juEX=~R!e!G3D_!8{(5LKDEVy_YBsM){4%n{$K@V)X+)iZp3#x{8#_vt6}psby39OLHBb zm-}w@ERd%v`amjTgS9c}mEqY(IN7sSy4)sS!d?+ggps>MM?_vnHI12sQt(k&%ka@8 z!iSbP$^DLxsrOi}{B^|lG*ldHN)O?qmttefZR3$1fqaF1micxb3!kOM^l|1ZYSPKI z)?haw=Nfw!`9Sq$$NH7ztVRP)u`_SJ${t+syys^`^9gT0`p6&RyhD7%>!=8;qh>#4 zvrE?bwOqavCUy#&80{nbS(&}NdX*)q_E$sYnKkS|Ejr0mis!-?6?F4RW{RFwysQw8 z;WhruwXOvo;gsupvz{T}D{nEZz*EAyNe{;G zr4+~>Ice%-J+Y`#hK8XhSh_|0qqgBAKOP@Quy;LqkJmG&?zzW+D3*{q{2mjc`3(9u zG8FO@JOga7cNnqQ$WY{m5`&(5iEtvBtWoDi_B-j}b(H&)eno3LX+lSjmFoM(U9tr| zuAJ{_;tlhJ5AvbVgTO|F53sA3<@gw}Q0u7lQt;vYL-@E#^zvo%4{(9qikL|6ciYsYtgnc`M@h~IRRzR^YTEZyXf510sjRamI%ePl6yi#!?d0cIyI ze#zz)e=6=8!v}Jm{x4Q@`?6ka`Fy=%mLIcAU%t&wpEAG-HUDXS6$_zf(n$Ir&n`oC zgtL)<#|V6d`i^T|RPAv>YBrKmo-`wM%D zXZOmr-}KU6c|*^(({Jx%S3aW}I`bd0QL9C7ip?9dXqr6{vyn#l&}<4H*nxQJjBlN+ zG00co1O7oAmD7skD|~lfHa^@QE51RTFY;Rd6|xJgR1-$rPmew%eVqnYu2dsN<+4~z zSHJ~*RT$XU`+@f$(;<6`^=bR zr%zJ7)4?4iA2ic*DzLmulut+uqw;IgI;Q(NM;%s|yA<=V2Okyn%$Pmc_4zn_NDlE@ zOj>{i*?_J2Q zfA~!UbU)RvNxQO{HMymab(?yljaCl!)yjDow)6?vprTmW5t88_l@I!3@sA>Z&ccNB z4=@t&@tN@PwB##f74&oD?|_dhrMFgv59FZ3p?^S=5&g#e@xsRdHO}p^@iG2Fo~}3X z8e;45x6}4T`v>w_MSPIwOB~m=(%a_mSnGTjzTu0BdUO!vE9P(GrVY|tG-rwr?!WLc zkB=F<_;DNb%49q9wmz28N4Y%8CnPQlosv4m8Q9+SJkdFFl#k`QB+pv1g4?^hF=aR2-75~qEmht#-o}syjKV=u5i&)i^Fy!nv(kFQy+8VJY<*kwh##4n9f z{`aFFED(=CUX9Qi=^v53l6SzzvmY%|oUY;zk!AEd?7Qe7`;xB?8$QGru;)fNi7)~- z0zRC-=)TZJurUW&Eaa0M2nP1`ogiQF9q!%h)X5)ngXF8lMe8I>#e!O}FURl^`Or0Y z!pD`wscB8Y$2eTPcZBAiJl{cY+-Fz4bi2pVC--h+e~{jOqV^Fbex97HhSC)q>2;*P zOAZSd0UtESMM{$WVNzp=vBAUsh-*%4hN$a-)ZyWnCV-+J?`5*hZ)p;Xtn^71doMUyojL2Yn_)p+Nht_i*u)*~P%YJo(Yyk_muhqt5_KBJh=hTIbxbBBC8QsX1fx1;j1^2S|Y4K7oTkMehuWfR7pf?b%HQ*15% z?BO8+AIRIt(=LZ2UkM+|2Sq<;wJRo=0QW(pf8ZaiHT>iHv7>T@4>{$?K*ImK-R_<` z$^9R0zlznZoUj_Sx}4?n}sQLXaJU%J!!z5W*)H18>|KX`@e z)b^F%d5~xfyFGb9)Cajz&lr3>`tE%3h{)nn5g+gp{DUv7UE=ZR;DeYx;st5Y;g^mN z)r}jVh7KMu;`oT^6JWyep*20iN5pI3Utk2f4sBn2qN>m0{p{RpZ`KCQ-Hi)hv?b0z zV)#Iy($fSV_|R$ZZ(6Uo6vGK9r*t zCs%sRy5I@xY0sULz3^x;*rY;EZ_h4K+cq~V07L;k2NI%DG+yKdFrWw&}R zk`-d>_rC%k{TILBwyD0NfAE2xjZMq#y^^QU%fU{_7a_);Joli31Z;%9DjZbxe)t`F z2Xu}7Zq%xm?9SEyROJe^bCDqYBZd!3>1|fqq=|fc{U?fRAwEX2Icnrgg5^tvUF-)} zN;m1P+{!`9u^b_s44eIc%fuJl(Z^a2KHc^A%!^eo1|AZ_hwCBmkb}bq@w>G~Kc6&k zc!2=^nfrRhp?3)*lb*iU_d6yZ6Td2T6p}Av&5#VL#{S_cl1I_yQf2c<>3y>0jqhS- zsh(5Mf86D|D)KF{gV;jRHO2@l;rY@B8VEL>AiIxy>m|GClQ-aL4iI~?rbUbOp zJbQn~W<77>?$A5&vQy`l_-*(%gs}%uygJ-}uWVgzqf}FrI9lS{uhzYBe|?03YlQoy zJ3rOfs6j_P--uKh8e?1UW2@$fh(ptPh_Zt2@sCFd7Sy>bvgteCvfH;Tv70}gY4^%k z|G=kj+9b7!@4sThS8F|qoA;`Y(Q#-z4`T4IocR~)@bJ}^aowfXM1I^f@soxfB})-= zEo@{^OH1+;{w?Y)%cAyG8bducSyeP4Cmj(g(EndK)9>D^F?e zBOX&q{PiH&Tn9@3CbpJ39mLWFe8fMSczlrGhh9Pr9OC%UZ^HU#k!BQ7RooR z7!Go7-Kq|alw+d``r8AWD!y=FZ@;nY9mTdtMv}Y^_9tju(9i(M^tY_}r+ruk)nWsT zXxOpgYk7p}1G~yTzJ*_drnodt>wjQI^2_JDx7ck<|E{%3JVJ9gLGyN<=5W0HFCO2l zxs9Lqs*Z`b=b3O0V#J6SBi^|0tVit3DgCYa)txQv3gyeG4t=(2$WVtbN9$-t7x_n2 zU&(9JbQONC_HeB3;CToakD*0Tnq-)+;4fDiIr3ocR~ zl;S_|@#V;efepj`-o3OZw|q-2{@BZ|dhH$?qrAF-3m&yG(kDiVZzFFIpTsl3&eB`> zAWvdn_;6W8xNttA-||d64xC&&HF72ve)O(=u2@iyxf2aSBfg?ydW-$>I=%s)(Bj`e zl;gR(KN8P~>_)7yV3u+BRW8aM@6DF&4T)c5pg-~*eSon+q5~YtHRFF%egffx_x+E{ zDRkqLqK$U#Y}qZ)FNEDu@+aX_V(ysJLCAlV@Q?Usf__7;ugBbL{#mcU32T7obII3p z$v^I}(TMl_#8q*D<4JybF}>ni&9#hUl-!bxS%hxY;x3G0@}C+V3wAJO_n&+}QZ z_5=CXOI^0WE<+3+T#vCshSBjCdp_IO=T-f#;`{S=2_K4WiR?g%!PPwy2S(iD&F{^! zceJ`hK33U`z%1AlZ7|OFbWrhp2m3nMYPad!+&{nfYv}cR#T%7V|AOXQbs?2+PaM8u zL;ewTc=qtAZ2kj2==%v*dyAH@nC&0h zfsV)@>aO|ju|~F^O4hIN9?v7hvj#gq>mJXB20vQz(R;R0{9}t~4J#LR!}#?z90xpv z*AWd>fBlZ|p?lVSp`R1qez|CmSdyFHon4L(u8VIjTo*mzEsZpc=TQ3%IuFzq#jQv7 zDZhsPd9QSfjh^?sT`b+Zr+7Hy0~a1^ESo`P_=v}b<3qX>HbHQLj~<*16V`@mjY951 zZic51U|$EVh5hC~Ze3rz%?fYsWq(ku%6h$|s|y>MoieP|Ma>k)cc(B+{H|oq-Ma;6 z*FW0-Pc7je|Mk7^9sk@j)6dd_Tu+Vw@)hv_e_QmbWvPZM}j6UZSahg{pdpKBsSAYvazmH{RqECOoxu}p=(m)&c|H6>l^pWxk#mO{-k@N*V^{c zj?e5y$yeBy@x8!5XkLF_J$WlUqxd(ts z-1n*2u8SmdpLfq7J7rX7E9~CZ9(eI#$->)2Q<5!9J^y2q^z+s=5)73LN_x_93ue4} zmK7Jj?didy8>FlS?=7(o1G`zT2d}gK@_k>Xx>CK?Xx}8|<9L3jY*WGhhm4Dj!}%@p zYitd28W$f1L+G(%^^D@5&AyI#Mw}-!U(0mv=hn=z)uo>+4`iq8rN#0k7RjzzT;AB< zjK*i{MUU*6Mk5D<*zfTAQ2Qsf_X4>d_^#ob$Q;}UYr=KQUa|$d)@e-J{aRcP$pT9g zew$ByY}FgXHk|{1^mb7k_ryK2ZzB06^R|EF@%6;r;8zb=z%~L#z)W~A%zZpQJXT(O zgC6~!`wP#(zo*wOUx{bH*TXsdd$PS?BO6ED%FKss$g`8I)3yC=#+rE=FKdGS+}K#U zLHH=FgcNJ!TR%DOm?MRc)3gSCXr;TbPwRi;%Zu&V<*(b#v!7NR;R|*Jwf)va`FZ%I z!hE?Nt@$E0&vW?j6RY7bCMJsa@ehpFe2y26!kq4_kAG$rk4Gx5gxEylOU5sJ-mXzx zUVNLN*EBvuS0xAI8s%cpuJxRZ==1QsgYBu02|^ z4n5Z%tMO1@?qIK1@%!92=jXmgDrR@s!sr_0oRE7G@eA>9jft2q=HKI6SZ_4G{o#Y> zjPEgiUE&$|nx{44D)|qI>F50Avap^lYvcsUbHS#{M?p-k$F!lCi~fw``A3j>`TbS0<6o*c6!t~w zD<2TN16gZ=uz%g`Y4-5)*KCF2?BSg|T$`0tDep6JyNiiabeUj%>1LNxuvtE@n5VlJ|6Tq+#T{rq&?(^8{ydcTOkFPHqN=J%&H0@;Llfqub-%QYGku~LlnP_G+)=R7&4L$Ie67~wkb4dyT6 z-HN4GZR-iL#S&A`ygNN>eDQP4as1qdV{9!ncm}=@a){v-^u3lnVSV1xnxt41?g=?- z_?#zg^70urd&~PS=SF1`waymPB#*?*6h*r+QIsybb;7vc)<_^!F{nRYcg=qZ6TdGl z-hPizzN}=|j(1d#MYj{l&&a&&UHQ)Tb@rh0`-r6;I!AsZ>7;#Ey&!wyQ`TLr&s);f zL<7)DJT`bftZC%fReU}N`rLTnD+2d4OM! z7dF5Le490kwFG*uINt#ip@$y?T!0Oip)~ejcfVX~VK3>P=<(=b*QqYV^BYzv_G_E1 z-@VPY?Tq<4zy@ju4Ut4a;S#exkqrOPA4iY;aTTOkW8ePIscdFB%G1p_cPmP5(2p*#GaBZ#^ zumSy+Ut8CWYLZs(`kaHfk@3PD*McuH|6tK$78rxZ!rlnup!5EVe&M=9(b=WSI8G=r`~Gw|6DbRa9vjnI=dR)eC zm$AobwY$%pRwg}j+sGL@CA*~=F3CUv-S+c+E8(D!6mXPJ;?RUQK z*1IqDUIGVfPsma^6!ofZRoz>+{{Q~_|09l$@WBn=Nv-3=87+qa&$V2`{Lguxp`NAN zlP>VN3I`=j;#l7wuaPi}z7$OGnf$)~eO>l3`4|r`!+vC3E%0B`D^I^NZVNhA@;v-4 z`9Jc3*e<(2zxg6x$-ekL#0|<~H2is`xpu8dV zQ_wpq+>pK{z?IcmCh>0GL2{YXSBRZmO@bDA4-BMNf`(Dq2f{47jcAh!nK3_ z5Rcf-8YZpbhyI+T9ne|R7Axy%Va^u=FNhy2ixR~5WrfhKH-U=){JWGL3iJYSVTXS! zA*9~rYJeZiIp9fIlhyLY#tmyHc2r!r*toAA5Zq(#yg7H(*42Fia#@J&EbP^A`{8_G zevm7RdWs6nS3G#o)oGf3GZOegxZt`Dz27)!1^xwk&_r-97xW$cYrw{$`oaeoK z9{ZFsf@d$`6=UI;xcT>axyO-+VNv)&SfmbsIKn>peDYM(K~vZI8aA2J$J_6}PCrP4 zI1ijl)|6JUCj3nvi*!W8AC1OH90sgYzr{R5m-4>ksYpL0PX!vn@5fk!?a*jypB|7v zovl0|F9pXc*j|AfjM}Mfbczz>g-A*?nI0NBVrYlSBYH7hxKP{h?pO7g8a8g!j*TCn z27<$cd}HO92c{j<67NuXhpDn#tnnZR=0Hcz z{G3tX$ChDDdlkA#`W`Yb;7qhrMxh)}zD3g!Y5cm9D=y{xcIIoOzdzuWFst+cGA4`b z5jKe*#1YTNW3{oJaVor?F>A5#aiHFSF>LhJm*0T0H*y2afgeO{CUOcF92P|lutLiC zKP?v{eIzx%P)}X}2OVjc{~tCqxBF;aMcJbd-adKMH9dQDm>Aj%!T+V6zj5%upeLu^ zHMXp{XbI+`5b+1cfgu*@+kp8Z&v_d4Y>tDjq@sSu+SCMTqg$36FX$se{8)Spx^>9& z)O*o4VK(HjCw2T?dd=BX8u00^Gp$V1KQ`Q?+1NoWTrRmTa%9>1wq{jh9;ha zV^UtznKLmnpZmiNmkLvz?Ygo3`dl@B;NX6%A{YNV)`=wGNdXK#XX{)JYc2eL7}LkO zJO#9&|A*;xp;&!Lv#ZkgindwS-J@StL_U1zkSp^g*qG))mrj0pDRk~!&lro!W8xI~ z18(G-ehU8Ra$vAMUaQF$9vvFz1hB5(IA+e3+7w=p)^J;x`X%T!{BVnRBQ}@zO4KRE zTuVD2^tG$fcZ#n{lTl~BNq$Gh{wZ9*=an%n#0&gckQ=!Q=SrLn4PSh`e*Nv84c>q3 z`&<_k)aQ;HZwg7+wexqtkE5WsRoE=}?Ur;{&MAF@tk4J7iqGKJx+ZrI;2wUY^!LU0 zk@3^O11Z;fWD1ERI4AYBQWvY?gyajrC(s7o9$~gE$3#0Jal{`_I0l6$N>)?H`u$4K z@cHn!ot5^5w14w^(3h0?zBiQ|7CEjn($*zyd_)NR<7S6F!%9Sv>9mk!Sh$Puxwj>K z`|aIf!>$SZv9Q#c?;FxLu;>3i_w0moHK$&Oyp{(!tqSrxLa#ZgPSNP3pPo(Hj`r6c z6Ypn0CV}skw9UeAk#&@o(KZV`BzfNm#F9we3)V#P*_1(dj+eN>xuZTr+6!^a^GdJB{0j@=>p&k<@>olc#)%ENiGtsU`dY^S*lp0) z@*9#+Gtb=mPE zp*jafZAMhX&sf@mi5DK+AbudE%Vj~~1c$o>zYmJW`ai$;`=`eZ>(#T%$lgB%p4`$m zIPkH_cZO!tSKjS940)~$QTgXB&L$`8(2|~TV{VTeOO^Pn?68yrUxGYB9sX>ICx{gR zJ`e`D@mni6P;y9H!eV>ui+<3`KazS2(pzO8=Nu_IqUWg;&0!mBSW{=XxiVQ4xX<8w z@Y{fKV*NVe1M3k1J(?_5JAOg@a97}5I@;E5Sn=A;KLxCG1;dfXb8+rnq~JE``~1zhLa`Ehl6kNf$h>jjp~y=~S(5kxnxbHU`d<1GwMUq3 z%Q5-;#!&Cg{t5e}5z3E|d*Tb*xYkG?F!-cw$~zzqHB^9R*Z};X8T5-#ycBiy_-A#x z>Y$IT0mkIuf{%88y>-gXBZhZ~ddwXK_r`?`>+|`>kMG6$^9{C4d;=7PqVqgH05&T$ z!e{Y)SW)ux%1rS}8uAIi{=N{o&Zzf|V2mPUl_==8sPCPd7l$}C_>|&%>thP(3!!`> z=wI5FuzDr>ia>lC<7|i*(&vmkD&U`EAwIl_-_!9s9Q2qmj*LlIg_w-DF~9rkillte zfcQ%*Y`faG!2d8`xM0u&TV+G8{ImE-C0NOJXPYypO`Uw(fQ|xl9c`S~^yt;|v3u_u zU6f&d+-0@JyZy@*KxC~tIN7p8V`lZ$JA3NMUny3pxwIx+ew^GwVbbe;kl=t8rjj{t)q_j z+95-FuUNk9wsUp0?_iCBo{K4Vv4Bw|p&zvLO>jz^$u8s$eLXix%tEfK+0@TVpC#t* zh2JVI6;2ukp8#>#wz>!MmrZOBB>zl7dMc+IssDFp4o!L=w zqP1~P7$4UE;P&{(MZG;9I8r9;a02%5y!7Fr{^Sh!Ewk&i*i?}sYv53x{6miA6`g7H?%HicM*WBERt@Y_$%|CjDty zvy*l{=tmH*1bV?~r;Er*Y$^B_tCGIn_RC+48g0lJtpRQup8I+Cz&^A7`w^=sN4@y2 zG8=iFkn`QVN6O+#9#=Amq9=M>>8!t197YuKi@gGx5tFuEtW4P<>k1XZ!lczd#~d=% z2G}UjXl>a6&1kZ_&(}I^@Cg!!EDa5Rn*Pi)qsIpK@6`UamjH_G_L33(`t+DG>6Vd4 z_wRoOc##fzQVu5Tywbtr7*xa!{@E?k8_$T%*~ucN1UfG2YT(O7dZCxky8@n2uSdW0 z74Uyvow{9oS^R^@mUYiH8H0L3EvG$jgM1W=H@YBt&@Ij>^5NgG_RZz7H;o<`Y}ohO zEoS%*Y-m7Wz$-JuZ?{*ST!L?yf$v%aJr|57k{=0~>rH7QkB6$)V8%-yDizC|n2w%&W4iJVU&Z zohar(zb|9oX%m3V8Uxz095O6p8)9LXr>$`T^SL2bDH8q^)Pt&xwn(o%QrRUv=Xi~O zJcW$)hP_(GvS3fUG&cpi>K@*w?o~eKYCkU+O~3jDUkIEM!I>h<8%siSjKQvQhVoq_E*;x^Co`x86JKhW;W zO2$&p1)tNXBXKg1`dsiH+?Es~7aMpG`rk1QCR{pZw^H|-l;e=+}rhS`R1Z;JSa^jJzI9|gcOIhsT+kHMe-rR5W!`qyo?(_?EwAYJ$fvR{ z54J_rIAl(!>98@=ze47(1CCHXybLjM^Hbt9-xVE=P_XR3-YXiQXanJ%n>XIvLpO*M zv|rOFkb9|HLYty3YR~6LT*}`q@nVj&VL(5P_}oRnxhUWQw;0%bW}}V@W5%NL6U1`l zBK#=tdy#UU`4FsrlcE~5Yki+?ZEPZTpBi8A$+O!zq9JE_kbP`8r?t0kTcp4 zZrie};r)VsHfh|rA-lG2eH8d%f*+R|Ku~Y9VV#6Qi@Hmvqe;?}T=zM#Bfs5|0?OV=^Wa%o5(y zEgC^LC~1)2Y_Rc{{6kSyC;SMV$?sH~IY$)(Z@|Y8cGafV zc7+f6y@G9pON4Pfob$IH7xee?H}6+?rTonqlQA>rD-ltE{0ERP7MbIu4`y^R;*ODL zZw~0+io7J`>HJRYEYF7QZO41z-5_6(mqMZ?nFoRNg0+0{2Ly4Saoem}C0SW>pLpPb zu%W&C^tpnc%INwE&cK+U;J$A~$4-TV=~u9And>Y~Rai&e%$=eAF<$`uR8V7JSEU*L zT=8OgF5*amA2ZEc5li|{FKtlptZ+o(gTkE)?O#KFG?{}Ju+D2pPsqzLFO{qTOMe*1 z)$~24udRxOB#v;4DS_`4aAd9-@q3Ul82b`|e2AobZ)7EjEy#CXV5^n1Lh?;`H9O2g zjj&_L1%a>Xa-+zwvl{fGu)ezboyD_eO&%3Ip!XI0G)C9$WClWd23~dhjT43)+PD8n zEUg(fm%GB@ayK}ez;h9HB(Bf~Zxbb`CA%3lGZ~9T_@5)=6PtM`g&Tx(!n6NIo`YLxO>;h6Vgt=u-y*> zd_>@kXP%p6IeTs${Id%HJ7m!{V6sCtaZs1T+#5E;juwmc`6lFx)!>w{s_271|0Iur z7yh_GofS6~x9U$jWDYE}E5CE*m>|92^GIVP9s!qPAa^sSn6*Y1L+`dW+awa}%0#8q z%YpvMTC~J--Nus+6g|OOfc>Gv@d;1dGwIf0Apu4VU%Lm?D?GsKhg~!1qxEk;?6f%! zVV$i2T-CdXAB@GqfektS=%-f&R(;2@bkqi8ot|CD{g0Y@@aKv~Ocre<5vZd_m?!SY z9L<2`Na&JS=bSMY^PyYf@42u?$l5rN`{yGk5oy8##H%ufp8V8u$k@aI)+l9dKYYO@SUF*O>bRf;2LU zbIjA9e&GJ=#taA!xWdzJbl-ty0Q^O-2dCUU#(X5@dEiDmFyl1f%+ds15A{6E-6R)e z#LDeM{n?L;et>Vrx2WZ^Q@oPObsqRqx)*S-<=AE%9{tBzD~r6fbuf>^wtenIuU5PEJI!|mg?-hT`h)3)q)^*sZ!vV+C3)3f-HOZv? z1av{xAqCvWf>(M8w1D+^X@?|k(EiPsaMFy$xRy8*0elJvotX<+WqASok8={yPl9+i zcfZJX)uDg-lxek|rJfp@k-!-ek%gt9p&m!)>x8r7oUK0To%hz?fAh~r7%_b94%#~A zfI@rs?S9*J*=7}P9VRtOpb zdprF|<|6kHVV(5_Um1$3u7RnlwJIHG>rfWK`oeRDyIxkTy z`{5h$L29B%J5!3-7Ss;3YdM@7!B0_dt9U74u~PY_<>+)d4<_u}^HkW)VZ(w41QcuHFh8@1NDO)_N_J2KPyZEXqT^xfH!5Xvl86!?o z_v|8G$hdnTiFB1g-U_Fqu%Z6kKcbgL{%ZJ;U?YaFbAVoldW-Sb4DV;!vEwO#s~PA} zVXJFA>1OOZ{#bvQIU<-pFvn3N;*fuK4Pv-g!e2JF81W|1J2AKX4A>Xxuf^Jx)Y;N^ zg*q(y*Ry{0I@lsVFFGKKU8kTkV@)NCXmZd3uKCxJY!FkhCoySoTP$WIzK{RvqYr<5 z+xW3p59#?cgO}=1P}R8xJ3b(=-&2qN*9}!A6-xo3W&r9b0I$tyW&8y4p#r8^OT7$m zy{EB6yj74S7Jw#DpEa`>^ z=g$S>1JDH&E7=6LML3Cz8sxGwm1c`i(vrlwqr1i5l6Q;WBd631_z%uEqqcfly!i0Q z9+7pb3RnfciFrAhZ-RsZJNkz4C;h{)S*$KcB|6EpR+PivNASg~z4Hpj}4Rl;K_?R=-xt429vtB^dh8?4^k&#=P!~q%H(d2ZTaJij@$p;S1 zdIWX1hIRj$k#ns}KvL&@$zi<$0v?-kcUX09-b~TdcmViu99si%q{dkABjhH1hRK&nZxPzRtII0O|NiGc{c+NW;Gm$+J7dP1b;TLDVc@{vb|3ls`yD8asX+mge!04Ib2WXU2GQV+OPt7~6k9 zpWiFFlNA* z0b>S?88BwRm;qx3j2SRyK+XW2d|LfOYpdsZ(r9aaYA$15V)Re&yRX|cU88TCwOjB7 z+iJUYzhIlG+f^5ALl4o-jXwQ3aTI!ywtx$?mEt~Khd$4Y!I7>*eVdz2y0_Q2aVXt% zZ?A8wm2J&$uWu`rZOyQ(Z;R2|rm45kwP{1qb*O8zYPU5{x2{baO1DAIxlMa>UZAGCxlIkFdAgh1O7Tz_Wv|#6XdvBXt*X98>Z(H+Fyl?1j zQ*VwFsvGYQ6VItXZ3sBhewfsG?nC7{{E&O~5wt6`w^wb=Z_ZZj4ON@ZP&~k<+D!PN z`-^5rIF|kC&hw{y`wO&5VDq&34#jiQvn$2k=Z_uY1p71jG~giA+vfY`ypC^=9sbvU z1h!~zj~&|l-kgoz`%FCY{fk!5jPX6sBh}V&C=zCHMQcN8Zfh|sxMP~9zt-A9jW*F4 z=A{)7Bw$N;G1@Qa^q&%FG_m}##h01fP&37=N(Tg);yT#7H!_aD6v@gOz&XSQ1opkPlq0ojB3)i zc?RR{PT$7g`15=O+>Hb8GfZqEQS|)bK>hR#Cfa+fZ__Zw+vM|1Ihf|5__Rrk@xHn5 zSR~9ecjtQ_(YLuf-!=@!`w?)B&y^TV^PBs%VKAW=dZs8 + Version="0.4.3.0" /> SD Launcher @@ -36,11 +36,14 @@ DisplayName="SDLauncher UWP" BackgroundColor="transparent" Square150x150Logo="Images\Square150x150Logo.png" - Square44x44Logo="Images\Square44x44Logo.png" Description="UWP Minecraft Launcher for Windows by SeaDevs"> + Square44x44Logo="Images\Square44x44Logo.png" Description="UWP Minecraft Launcher for latest Windows by SeaDevs"> + + + + Executable="ClientHandler\ClientHandler.exe"> diff --git a/Package/Package.wapproj b/Package/Package.wapproj index d32f41f9..f392148c 100644 --- a/Package/Package.wapproj +++ b/Package/Package.wapproj @@ -159,7 +159,7 @@ - + \ No newline at end of file diff --git a/SDLauncher UWP.sln b/SDLauncher UWP.sln index ced923b4..79872466 100644 --- a/SDLauncher UWP.sln +++ b/SDLauncher UWP.sln @@ -1,13 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31911.196 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32602.215 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDLauncher UWP", "SDLauncher UWP\SDLauncher UWP.csproj", "{8EAE5A30-3D30-4D17-B6DD-0F01D6880587}" EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Package", "Package\Package.wapproj", "{817AAF28-3E88-4E8F-99C6-EE0C0B66C013}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientLauncher", "ClientLauncher\ClientLauncher.csproj", "{F97BA254-A457-4D27-BC65-90B7761B162D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientHandler", "ClientHandler\ClientHandler.csproj", "{B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -79,26 +79,26 @@ Global {817AAF28-3E88-4E8F-99C6-EE0C0B66C013}.Release|x86.ActiveCfg = Release|x86 {817AAF28-3E88-4E8F-99C6-EE0C0B66C013}.Release|x86.Build.0 = Release|x86 {817AAF28-3E88-4E8F-99C6-EE0C0B66C013}.Release|x86.Deploy.0 = Release|x86 - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|ARM.ActiveCfg = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|ARM.Build.0 = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|ARM64.Build.0 = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|x64.ActiveCfg = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|x64.Build.0 = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|x86.ActiveCfg = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Debug|x86.Build.0 = Debug|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|Any CPU.Build.0 = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|ARM.ActiveCfg = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|ARM.Build.0 = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|ARM64.ActiveCfg = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|ARM64.Build.0 = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|x64.ActiveCfg = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|x64.Build.0 = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|x86.ActiveCfg = Release|Any CPU - {F97BA254-A457-4D27-BC65-90B7761B162D}.Release|x86.Build.0 = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|ARM.Build.0 = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|ARM64.Build.0 = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|x64.Build.0 = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Debug|x86.Build.0 = Debug|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|Any CPU.Build.0 = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|ARM.ActiveCfg = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|ARM.Build.0 = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|ARM64.ActiveCfg = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|ARM64.Build.0 = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|x64.ActiveCfg = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|x64.Build.0 = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|x86.ActiveCfg = Release|Any CPU + {B7DA8EEE-E5E3-4A2A-B119-3787280A1DDC}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SDLauncher UWP/App.xaml b/SDLauncher UWP/App.xaml index f02eee77..aec01a32 100644 --- a/SDLauncher UWP/App.xaml +++ b/SDLauncher UWP/App.xaml @@ -17,6 +17,7 @@ /Fonts/Pixeboy.ttf#Pixeboy + \n" + ChangeLogsHTMLBody + ""; + ToastNotificationManagerCompat.History.Clear(); } - else + var toastContent = new ToastContent() { - finalHTML = "\n\n\n" + ChangeLogsHTMLBody + ""; + Visual = new ToastVisual() + { + BindingGeneric = new ToastBindingGeneric() + { + Children = + { + new AdaptiveText() + { + Text = Title + }, + new AdaptiveText() + { + Text = description + } } - wvLogs.NavigateToString(""); - wvLogs.NavigateToString(finalHTML); + } + }, + Launch = "action=ToastClicked" + }; + + // Create the toast notification + var toastNotif = new ToastNotification(toastContent.GetXml()); + + // And send the notification + ToastNotificationManager.CreateToastNotifier().Show(toastNotif); } private void Page_Loaded(object sender, RoutedEventArgs e) { + LogsPage.UpdateLogs(); + if (vars.Launcher.UseOfflineLoader) + return; + if (vars.UseOldVerSeletor) { btnMCVer.Visibility = Visibility.Collapsed; @@ -323,7 +362,7 @@ private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e) { flyVer.Hide(); } - if (sender is MenuFlyoutItem mitem && !vars.UseOldVerSeletor) + if (sender is MenuFlyoutItem mitem && !vars.UseOldVerSeletor && !vars.Launcher.UseOfflineLoader) { VersionCheck(mitem); } @@ -356,6 +395,10 @@ private async void VersionCheck(MenuFlyoutItem item) launchVer = vars.Launcher.Launcher.Versions.LatestReleaseVersion.Name; btnMCVer.Content = launchVer; break; + case "Latest Fabric": + FabricResponse(await vars.Launcher.CheckFabric(vars.Launcher.Launcher.Versions.LatestReleaseVersion.Name, SearchFabric(vars.Launcher.Launcher.Versions.LatestReleaseVersion.Name), item.Text)); + btnMCVer.Content = "Fabric " + vars.Launcher.Launcher.Versions.LatestReleaseVersion.Name; + break; case "Latest Snapshot": launchVer = vars.Launcher.Launcher.Versions?.LatestSnapshotVersion?.Name; btnMCVer.Content = launchVer; @@ -372,14 +415,21 @@ private async void VersionCheck(MenuFlyoutItem item) case "OptiFine 1.16.5": OptiFineFinish(await vars.Launcher.OptiFine.CheckOptiFine("1.16.5", "OptiFine 1.16.5", displayName)); break; + + case "Fabric 1.19": + FabricResponse(await vars.Launcher.CheckFabric("1.19", SearchFabric("1.19"), item.Text)); + break; + case "Fabric 1.18.2": + FabricResponse(await vars.Launcher.CheckFabric("1.18.2", SearchFabric("1.18.2"), item.Text)); + break; case "Fabric 1.18.1": - FabricResponse(await vars.Launcher.CheckFabric("1.18.1", "fabric-loader-0.14.6-1.18.1", item.Text)); + FabricResponse(await vars.Launcher.CheckFabric("1.18.1", SearchFabric("1.18.1"), item.Text)); break; case "Fabric 1.17.1": - FabricResponse(await vars.Launcher.CheckFabric("1.17.1", "fabric-loader-0.14.6-1.17.1", item.Text)); + FabricResponse(await vars.Launcher.CheckFabric("1.17.1", SearchFabric("1.17.1"), item.Text)); break; case "Fabric 1.16.5": - FabricResponse(await vars.Launcher.CheckFabric("1.16.5", "fabric-loader-0.14.6-1.16.5", item.Text)); + FabricResponse(await vars.Launcher.CheckFabric("1.16.5", SearchFabric("1.16.5"), item.Text)); break; default: btnMCVer.Content = item.Text; @@ -388,6 +438,18 @@ private async void VersionCheck(MenuFlyoutItem item) } } // + public string SearchFabric(string ver) + { + var item = from t in vars.Launcher.FabricMCVersions where t.Name.Contains(ver) select t; + if (item != null) + { + return item.First().Name; + } + else + { + return ""; + } + } private void FabricResponse(SDLauncher.FabricResponsoe responsoe) { launchVer = responsoe.LaunchVer; @@ -435,7 +497,7 @@ private void OptiFineFinish(OptFineVerReturns returned) private void cmbxVer_SelectionChanged(object sender, SelectionChangedEventArgs e) { - if (vars.UseOldVerSeletor) + if (vars.UseOldVerSeletor || vars.Launcher.UseOfflineLoader) { launchVer = cmbxVer.SelectedItem.ToString(); } @@ -443,13 +505,27 @@ private void cmbxVer_SelectionChanged(object sender, SelectionChangedEventArgs e private void Page_ActualThemeChanged(FrameworkElement sender, object args) { - } private void btnServer_Click(object sender, RoutedEventArgs e) { _ = new ServerChooserDialog().ShowAsync(); } + + private void navView_ItemInvoked(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args) + { + if(navView.SelectedItem is Microsoft.UI.Xaml.Controls.NavigationViewItem itm) + { + if(itm.Content.ToString() == "ChangeLogs") + { + navViewFrame.Content = LogsPage; + } + else + { + navViewFrame.Navigate(typeof(StorePage)); + } + } + } } } diff --git a/SDLauncher UWP/Views/CursedForgePage.xaml b/SDLauncher UWP/Views/ChangeLogs.xaml similarity index 61% rename from SDLauncher UWP/Views/CursedForgePage.xaml rename to SDLauncher UWP/Views/ChangeLogs.xaml index 27f96025..2c60e84d 100644 --- a/SDLauncher UWP/Views/CursedForgePage.xaml +++ b/SDLauncher UWP/Views/ChangeLogs.xaml @@ -1,14 +1,16 @@  + CornerRadius="10" + ActualThemeChanged="Page_ActualThemeChanged" + Background="{ThemeResource AcrylicGlass}"> - + diff --git a/SDLauncher UWP/Views/ChangeLogs.xaml.cs b/SDLauncher UWP/Views/ChangeLogs.xaml.cs new file mode 100644 index 00000000..596a7fc3 --- /dev/null +++ b/SDLauncher UWP/Views/ChangeLogs.xaml.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel.AppService; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 + +namespace SDLauncher_UWP.Views +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class ChangeLogsPage : Page + { + public ChangeLogsPage() + { + this.InitializeComponent(); + UpdateLogs(); + vars.Launcher.LogsUpdated += Launcher_LogsUpdated; + } + + private void Launcher_LogsUpdated(object sender, EventArgs e) + { + UpdateLogs(); + } + + public void UpdateLogs() + { + wvLogs.NavigateToString(""); + string finalHTML; + if (this.ActualTheme == ElementTheme.Dark) + { + finalHTML = "\n\n\n" + vars.Launcher.ChangeLogsHTMLBody + ""; + } + else + { + finalHTML = "\n\n\n" + vars.Launcher.ChangeLogsHTMLBody + ""; + } + wvLogs.NavigateToString(finalHTML); + } + + private void Page_ActualThemeChanged(FrameworkElement sender, object args) + { + UpdateLogs(); + } + } +} diff --git a/SDLauncher UWP/Views/CursedForgePage.xaml.cs b/SDLauncher UWP/Views/CursedForgePage.xaml.cs deleted file mode 100644 index b467445a..00000000 --- a/SDLauncher UWP/Views/CursedForgePage.xaml.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; -using Windows.Foundation; -using Windows.Foundation.Collections; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Controls.Primitives; -using Windows.UI.Xaml.Data; -using Windows.UI.Xaml.Input; -using Windows.UI.Xaml.Media; -using Windows.UI.Xaml.Navigation; -// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 - -namespace SDLauncher_UWP.Views -{ - /// - /// An empty page that can be used on its own or navigated to within a Frame. - /// - public sealed partial class CursedForgePage : Page - { - // ApiClient CFApiClient = new ApiClient("$2a$10$a0ARKzU18TThXSJA.Kn2ueHQDxhW0eue8BtbjRPJFqYOLBvdfKg16", partnerId, contactEmail); - public CursedForgePage() - { - this.InitializeComponent(); - } - } -} diff --git a/SDLauncher UWP/Views/MainPage.xaml b/SDLauncher UWP/Views/MainPage.xaml index 6284316f..db8d0d83 100644 --- a/SDLauncher UWP/Views/MainPage.xaml +++ b/SDLauncher UWP/Views/MainPage.xaml @@ -10,6 +10,7 @@ Loading="Page_Loading" Unloaded="Page_Unloaded" Loaded="Page_Loaded" + xmlns:NoobUI="using:SDLauncher_UWP.UserControls" xmlns:winui="using:Microsoft.UI.Xaml.Controls" xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" winui:BackdropMaterial.ApplyToRootOrPageBackground="True"> @@ -66,7 +67,22 @@ Style="{StaticResource CaptionTextBlockStyle}" /> - + - - + + + + + + + + + diff --git a/SDLauncher UWP/Views/SettingsPage.xaml.cs b/SDLauncher UWP/Views/SettingsPage.xaml.cs index d01a68ab..543a2d4f 100644 --- a/SDLauncher UWP/Views/SettingsPage.xaml.cs +++ b/SDLauncher UWP/Views/SettingsPage.xaml.cs @@ -12,6 +12,7 @@ using Windows.Storage; using Windows.Storage.Pickers; using Windows.Storage.Streams; +using Windows.System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; @@ -205,14 +206,12 @@ private void switchAutolog_Toggled(object sender, RoutedEventArgs e) } } - private async void btnCopyDir_Click(object sender, RoutedEventArgs e) + private void btnCopyDir_Click(object sender, RoutedEventArgs e) { - smbCopyDir.Glyph = "\xE8FB"; - var dataPackage = new DataPackage(); - dataPackage.SetText(txtGamePath.Text); - Clipboard.SetContent(dataPackage); - await Task.Delay(TimeSpan.FromSeconds(2)); - smbCopyDir.Glyph = "\xE71B"; + //var dataPackage = new DataPackage(); + // dataPackage.SetText(txtGamePath.Text); + // Clipboard.SetContent(dataPackage); + _ = Launcher.LaunchFolderPathAsync(vars.Launcher.Launcher.MinecraftPath.BasePath); } private void btnRefreshVers_Click(object sender, RoutedEventArgs e) diff --git a/SDLauncher UWP/Views/StorePage.xaml b/SDLauncher UWP/Views/StorePage.xaml new file mode 100644 index 00000000..3081bba2 --- /dev/null +++ b/SDLauncher UWP/Views/StorePage.xaml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SDLauncher UWP/Views/StorePage.xaml.cs b/SDLauncher UWP/Views/StorePage.xaml.cs new file mode 100644 index 00000000..cda14758 --- /dev/null +++ b/SDLauncher UWP/Views/StorePage.xaml.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +using SDLauncher_UWP.Helpers; +using System.Threading.Tasks; +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 + +namespace SDLauncher_UWP.Views +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class StorePage : Page + { + public List Items { get; set; } + public StorePage() + { + this.InitializeComponent(); + vars.Launcher.Labrinth.UIChangeRequested += Labrinth_UIChangeRequested; + LoadData(); + } + + private void Labrinth_UIChangeRequested(object sender, SDLauncher.UIChangeRequestedEventArgs e) + { + this.IsEnabled = e.UI; + } + + public async void LoadData() + { + Items = new List(); + await Search("", true); + } + public void UpdateSource() + { + ItemsCollection.ItemsSource = null; + ItemsCollection.ItemsSource = Items; + } + public async Task Search(string name,bool AddExists) + { + try + { + var r = await vars.Launcher.Labrinth.Search(name, 30); + var itms = new List(); + if (AddExists) + { + foreach (var hit in r.hits) + { + Items.Add(new StoreItem(hit, Items.Count + 1)); + } + } + else + { + Items = new List(); + foreach (var hit in r.hits) + { + Items.Add(new StoreItem(hit, Items.Count + 1)); + } + + } + } + catch + { + + } + UpdateSource(); + ItemsCollection.FocusSearch(); + } + private void ItemsCollection_StoreItemSelected(object sender, UserControls.StoreItemSelectedEventArgs e) + { + foreach (var item in Items) + { + if(item.ID == e.ID) + { + SelectItem(item); + } + } + } + + public async void SelectItem(StoreItem itm) + { + this.IsEnabled = false; + string d; + try + { + d = await itm.BigDescription(); + } + catch + { + d = itm.Description; + } + this.IsEnabled = false; + mddescription.Text = d.Replace("
", "").Replace("
",""); + txtName.Text = itm.Name; + txtType.Text = itm.Type.ToString(); + icVers.ItemsSource = null; + icVers.ItemsSource = itm.SupportedVers; + flipSamples.ItemsSource = null; + flipSamples.ItemsSource = itm.SampleImages; + imgIcon.Source = itm.Icon; + var f = new MenuFlyout(); + f.Placement = FlyoutPlacementMode.Bottom; + if (itm.Type == StoreManager.Type.Mod) + { + foreach (var item in itm.ModDownloadLinks) + { + var x = new MenuFlyoutItem { Text = item.Version.ToString(), Tag = item.Url }; + ToolTipService.SetToolTip(x, item.SupportedVer); + x.Click += X_Click; + f.Items.Add(x); + } + } + else if (itm.Type == StoreManager.Type.Shader) + { + foreach (var item in itm.ShaderDownloadLinks) + { + var x = new MenuFlyoutItem { Text = item.Version.ToString(), Tag = item.Url }; + ToolTipService.SetToolTip(x, item.SupportedVer); + x.Click += X_Click; + f.Items.Add(x); + } + } + btnDownload.Flyout = f; + this.IsEnabled = true; + ItemView.IsPaneOpen = true; + } + + private void X_Click(object sender, RoutedEventArgs e) + { + + } + + private void ItemView_PaneClosed(SplitView sender, object args) + { + //Canvas.SetZIndex(ItemsCollection, 1); + //Canvas.SetZIndex(ItemView, 0); + } + + private void ItemView_PaneOpened(SplitView sender, object args) + { + //Canvas.SetZIndex(ItemsCollection, 0); + //Canvas.SetZIndex(ItemView, 1); + } + + private async void ItemsCollection_SearchRequested(object sender, UserControls.SearchRequestedEventArgs e) + { + var txt = e.Name; + await Task.Delay(new TimeSpan(0, 0, 0, 2)); + if (ItemsCollection.SearchText == txt) + { + Search(e.Name, false); + } + } + } +} diff --git a/SDLauncher UWP/vars.cs b/SDLauncher UWP/vars.cs index be727e9d..5e8d4d46 100644 --- a/SDLauncher UWP/vars.cs +++ b/SDLauncher UWP/vars.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using CmlLib.Core; +using CmlLib.Core.VersionLoader; using CmlLib.Core.Auth; using SDLauncher_UWP.Helpers; using Windows.UI.Xaml; @@ -22,7 +22,7 @@ public static class vars private static ElementTheme? theme = ElementTheme.Default; public static ElementTheme? Theme { get { return theme; } set { theme = value; ThemeUpdated(theme, new EventArgs()); } } public static BitmapImage BackgroundImage; - public static string BackgroundImagePath; + public static string BackgroundImagePath = ""; public static bool ShowLaunchTips = false; public static bool CustomBackground = false; public static bool ShowTips = true;