From 602057eba897199b56037224687a5e4ff22d2f97 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Mon, 26 Sep 2016 23:27:29 +0200 Subject: [PATCH] Added new UWP sample [WIP] --- .../SkiaSharpSample.UWPSample.sln | 125 ++++++++++ .../SkiaSharpSample.UWPSample/App.xaml | 8 + .../SkiaSharpSample.UWPSample/App.xaml.cs | 106 ++++++++ .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 1210 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 17710 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 7117 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 2227 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 569 bytes .../Assets/StoreLogo.png | Bin 0 -> 1238 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 7938 bytes .../SkiaSharpSample.UWPSample/MainPage.xaml | 98 ++++++++ .../MainPage.xaml.cs | 232 ++++++++++++++++++ .../Package.appxmanifest | 28 +++ .../Properties/AssemblyInfo.cs | 29 +++ .../Properties/Default.rd.xml | 31 +++ .../SkiaSharpSample.UWPSample.csproj | 173 +++++++++++++ ...SkiaSharpSample.UWPSample_TemporaryKey.pfx | Bin 0 -> 2450 bytes .../SkiaSharpSample.UWPSample/project.json | 17 ++ 18 files changed, 847 insertions(+) create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.sln create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml.cs create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/LockScreenLogo.scale-200.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/SplashScreen.scale-200.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square150x150Logo.scale-200.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square44x44Logo.scale-200.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/StoreLogo.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Wide310x150Logo.scale-200.png create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml.cs create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Package.appxmanifest create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/AssemblyInfo.cs create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/Default.rd.xml create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.csproj create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample_TemporaryKey.pfx create mode 100644 samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/project.json diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.sln b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.sln new file mode 100644 index 000000000..611fb418c --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.sln @@ -0,0 +1,125 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharpSample.UWPSample", "SkiaSharpSample.UWPSample\SkiaSharpSample.UWPSample.csproj", "{BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SkiaSharp.Views", "SkiaSharp.Views", "{6B67133E-E932-4567-9052-2689AEDF76C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkiaSharp.Views.Interop.UWP", "..\..\source\SkiaSharp.Views\SkiaSharp.Views.Interop.UWP\SkiaSharp.Views.Interop.UWP.vcxproj", "{162D75E5-B52A-4B43-B896-5D3F3A7AB90C}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.Shared", "..\..\source\SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.shproj", "{5A67972C-1C04-4913-9950-06A03BFE9533}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.Views.UWP", "..\..\source\SkiaSharp.Views\SkiaSharp.Views.UWP\SkiaSharp.Views.UWP.csproj", "{8BB20362-91A2-4206-944D-634070EAC6F3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SkiaSharp", "SkiaSharp", "{384970C2-6392-4134-91D5-BE9AB7209DF9}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Binding", "..\..\binding\Binding\Binding.shproj", "{9C502B9A-25D4-473F-89BD-5A13DDE16354}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.UWP", "..\..\binding\SkiaSharp.UWP\SkiaSharp.UWP.csproj", "{BAB615AA-956E-4079-B260-DD7B1F52EC7D}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharpSample.Shared", "..\SkiaSharpSample.Shared\SkiaSharpSample.Shared.shproj", "{509B233A-35A0-41CA-A585-0B1A9F79D470}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharpSample.Platform.Shared", "..\SkiaSharpSample.Platform.Shared\SkiaSharpSample.Platform.Shared.shproj", "{0CC41AB0-0C4C-4DAA-8F10-A249725EBF5D}" +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\SkiaSharpSample.Platform.Shared\SkiaSharpSample.Platform.Shared.projitems*{0cc41ab0-0c4c-4daa-8f10-a249725ebf5d}*SharedItemsImports = 13 + ..\SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{509b233a-35a0-41ca-a585-0b1a9f79d470}*SharedItemsImports = 13 + ..\..\source\SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{5a67972c-1c04-4913-9950-06a03bfe9533}*SharedItemsImports = 13 + ..\..\source\SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{8bb20362-91a2-4206-944d-634070eac6f3}*SharedItemsImports = 4 + ..\..\binding\Binding\Binding.projitems*{9c502b9a-25d4-473f-89bd-5a13dde16354}*SharedItemsImports = 13 + ..\..\binding\Binding\Binding.projitems*{bab615aa-956e-4079-b260-dd7b1f52ec7d}*SharedItemsImports = 4 + ..\SkiaSharpSample.Platform.Shared\SkiaSharpSample.Platform.Shared.projitems*{bfc6b190-a17c-4538-b2c6-eeda46d87efe}*SharedItemsImports = 4 + ..\SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{bfc6b190-a17c-4538-b2c6-eeda46d87efe}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|ARM.ActiveCfg = Debug|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|ARM.Build.0 = Debug|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|ARM.Deploy.0 = Debug|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x64.ActiveCfg = Debug|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x64.Build.0 = Debug|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x64.Deploy.0 = Debug|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x86.ActiveCfg = Debug|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x86.Build.0 = Debug|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Debug|x86.Deploy.0 = Debug|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|Any CPU.ActiveCfg = Release|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|ARM.ActiveCfg = Release|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|ARM.Build.0 = Release|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|ARM.Deploy.0 = Release|ARM + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x64.ActiveCfg = Release|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x64.Build.0 = Release|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x64.Deploy.0 = Release|x64 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x86.ActiveCfg = Release|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x86.Build.0 = Release|x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE}.Release|x86.Deploy.0 = Release|x86 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|ARM.ActiveCfg = Debug|ARM + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|ARM.Build.0 = Debug|ARM + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|x64.ActiveCfg = Debug|x64 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|x64.Build.0 = Debug|x64 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|x86.ActiveCfg = Debug|Win32 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Debug|x86.Build.0 = Debug|Win32 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|Any CPU.ActiveCfg = Release|Win32 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|ARM.ActiveCfg = Release|ARM + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|ARM.Build.0 = Release|ARM + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|x64.ActiveCfg = Release|x64 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|x64.Build.0 = Release|x64 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|x86.ActiveCfg = Release|Win32 + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C}.Release|x86.Build.0 = Release|Win32 + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|ARM.Build.0 = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|x64.Build.0 = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Debug|x86.Build.0 = Debug|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|Any CPU.Build.0 = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|ARM.ActiveCfg = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|ARM.Build.0 = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|x64.ActiveCfg = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|x64.Build.0 = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|x86.ActiveCfg = Release|Any CPU + {8BB20362-91A2-4206-944D-634070EAC6F3}.Release|x86.Build.0 = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|ARM.ActiveCfg = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|ARM.Build.0 = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|x64.ActiveCfg = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|x64.Build.0 = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|x86.ActiveCfg = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Debug|x86.Build.0 = Debug|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|Any CPU.Build.0 = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|ARM.ActiveCfg = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|ARM.Build.0 = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|x64.ActiveCfg = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|x64.Build.0 = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|x86.ActiveCfg = Release|Any CPU + {BAB615AA-956E-4079-B260-DD7B1F52EC7D}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {162D75E5-B52A-4B43-B896-5D3F3A7AB90C} = {6B67133E-E932-4567-9052-2689AEDF76C6} + {5A67972C-1C04-4913-9950-06A03BFE9533} = {6B67133E-E932-4567-9052-2689AEDF76C6} + {8BB20362-91A2-4206-944D-634070EAC6F3} = {6B67133E-E932-4567-9052-2689AEDF76C6} + {9C502B9A-25D4-473F-89BD-5A13DDE16354} = {384970C2-6392-4134-91D5-BE9AB7209DF9} + {BAB615AA-956E-4079-B260-DD7B1F52EC7D} = {384970C2-6392-4134-91D5-BE9AB7209DF9} + EndGlobalSection +EndGlobal diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml new file mode 100644 index 000000000..a344b2e06 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml.cs b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml.cs new file mode 100644 index 000000000..5237989b5 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/App.xaml.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +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; + +namespace SkiaSharpSample.UWPSample +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs e) + { +#if DEBUG + if (System.Diagnostics.Debugger.IsAttached) + { + this.DebugSettings.EnableFrameRateCounter = true; + } +#endif + Frame rootFrame = Window.Current.Content as Frame; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + rootFrame.NavigationFailed += OnNavigationFailed; + + if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) + { + //TODO: Load state from previously suspended application + } + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (e.PrelaunchActivated == false) + { + if (rootFrame.Content == null) + { + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(MainPage), e.Arguments); + } + // Ensure the current window is active + Window.Current.Activate(); + } + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); + } + } +} diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/LockScreenLogo.scale-200.png b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..484d4f18b4e046ae3f90c4f1c405741967d172c9 GIT binary patch literal 1210 zcmV;r1V#IaP)VVBxY=G3CY=`125^+5zX zEK*cdgbA*dI($;3kcXD~^`Lv$OHmL({CFxBMTi%XR;dV~C55XpQ5!T)@e9e)YeeJS zgBT39DtPB*aDPw9Ip_Y*`Q?1%TtBzlE%QIdU+n>06iq;FGy%2I1k^?oP#aA^Z8QP3 z(FD%R>({S&@!|!Gi;Ifp`d!BRfGCQTm6ZW-^#6$pwhljCRtpHS(7E^lt3P0!l!e7>}$v&1XNfOVVJwujdu3o*$)2C1I z^Yc?yprxgS-rioHvRAKO(bv~UTwEOe{rz}69+HxhNK8yb6h+KtGyD7dJbLtqU_&75 zAKvqK>~$vJU*q>*fAZ#xj*cP-g7 z)<#TB%xBxXTrQqGdBXnwJ{cJqJbd`@)cm8tAN}gbWfT!`I2_3G;X!3E7%&=*+_`gy zo}M0}qoYr>fByVA4u=Di$wWg#1OEPB?qX|ei;0N|0165U0I*mr?CtF-ClD1Cg-)kq zcXyYPk`nUs^J#5u#p!gS*Xw=S3W9(j2m}TO(%9ID(P%t1TMz_19uFpyiN}v06A%!9 z)9Lg|DIyRS7Di1?jd!qiyPfXtZiFMbJC)R37NeO1N8Gxy&DcalH zznD8TH00e|larIYeEE`@nHk{lXdN9LJ(s|l$LQMH8Z|XFWM^lSl9Gbk?M4(u{QdpC zQ+}MRtSs{L^Xc#Jr=z2T)YMdd{Pvp@?T(g7Zf-86rKR5TrluxDQA7{~a&vPpE)W_T zie9hBVzFScSPmc3>8PrzB0fI;v(MDl)?&3?earUtHld-Rr;hJjmpPZq#k+U!SXx@bXf%?XoQ%n2^45=xj3CQ0 z2?+^AMn(d#u&}`V{5$|Ze0Ph$e>T|;zrxP;HNL-PWO;cRfY{hrpR0u=N!aan0B+vA zNl;MG#RV?P!NCEQm6cenR+^ie$;ru4Ec;Rf09IC3=<4dCuC7keTt#oA9?t*c)*_-?IzRvgi``-WDf8KxG_v7?9=b?k^bG^rFJjd%gf!8#Z5AJ8#k73wBm8%Lm z81{Q7hW&Q)k3I06cO8cD@a1>s%PQCZfIr@UmbJ4%Mj9H$t!8e&* z6mPodI$F56-Eq2$xw*LsSUcD{o87s0SHRK9GG<1G1;dVGDhijbyT?xb@F>wERLTvs za=f$@J@R{`g5n5olElFMle7jAdSQ3N*vFiBWiM+!;d=SB8_z2&x@1m#op45Y7wsRa z8O&C^`+iINeB9wt^ShPptvgOEY+~7!WVhqNbdw}y=0(=>v|68z+heb+{A7FubaGpX9_mm|Nqku~01>byAKc51oH zGC^WI(LV`S?z)eK1{+RJ$J^^=0c2!_2Iqj zF4tn6zMRP;8+)~1xq{s(yIIXY1b8(zrywBatW#U_EUjc?uBB2r84+wA{i*p-H3Kj^0AD$|1dT-xT zuOa^9h}UeTo5L#%BQ!%-y9k??(Ujj>bf0`%?9}SeSK-m?F&3A%F;hMke-OLIsH)2d z9q%n1Y{__1a72hL=ZN2!bbp}7!YFscUhMN1c*xh!IIrm9H(6Oj?|U57a5UKM zNYs{DUW?jx)Y8z&JSnRuMoSTF<}E+%!tC}#tG;+j#D9NG)4)AM;UvbA%tobc`i|2%K3Ow0G1S) zq79i_w8S!tiXPlioENrex{4mCM}1&ZR&G^v+2yzHZM(2*ynlbI!ec>4KjZo3iG3J? z3|8iSJ}W;+M{Vxb1s&BkFnEQ|!SVw2O&>10w!lVGaxm=ItG{2pzBH+;pHW1Z>`49Z zchwtT@T2curtHT=j3IpPE2Y72Wb%yc!41d}9^RUOlz@l)XJ5{r!<_mi7HI$f zT80c5Z_m=FuyAHUj^gJVc+zv=ylkm!rYwHf(!%{T^O?3a33i?CPW|tX-k4PT;vwhK zbLO<9T&I}EVx2Y7rNq>t#RTA7yY9B--)$s`irHBCz#40)--aM^#ZMQJ({kwP>3QPa zP1*3Z^k|iK7pURkw)*oi(ZDk9d0~y*#uP)8k(0_dT6kz9y!xV%`_G4S&5pjpD$DU+ zGt8%y!$KhY{wMY?DtNDM7A&+#3#zKBIyFv_b4_|(d+g)O_h3f~BOq;}N!%D_B@yqt zK2bt>lVu8bzVt%d*q8&oO|18PLn*B%hAn-B_xez6P;&212$RrB^xIO^%ZydO9+u31 z;WL}9T*+CmrNL5A{0uP2E;I?_iR^B*P!=wj*h1=t3Af4!SFN|_DtUN#uouE1Gok45 zPJ1P6S^rYV%=BA|N}hQ`#I2nQy|=gOwl`)umD%tLi<4x*XfgX+;rzR>ZwR-(Q|a?w zXm+2gV>E+OAmrFrk&%%R0Fk9=U|@hEK#D*)@}rCp953so)EY0FoSl7+a2LDpiOMU& z!qj>Jf4Piq`hN$u7s>JF9#T zTp)yM@cjIIr&A;UkaNO@kzMJ?i@cE+hDznG(}%au!gI4>d)E%kRxD^%tW&b)C|SAn zQ(XmSEwPg5p?)lFV)_LZ&88dE#o>b9KM&;9&`K*5JNz((QwtHml_{vGsIV74)_T9b z)I~2^w6o!E-(!*Y{_b?H3GT)*wLa?tl{nYVDxX4|HuFed%`5ua+VrBL6aD;pIy#5# zyY0G7=&*qTk6>QRJEX{#T+g|)N_1bJNFRD-86WuY0OM%iYmFGOydH;g`^{DkuPJ&% zyFA4iSzd?SSWk13-A$9p*4*uHzH`LsW9{n;Z(|%7igDE&rwL_~^{0m9J?)BA1~MQ5g$MG zUVfvibug-W^Dc!2-))^N?fAM>t2(yK`)Fp;ZeCND$P7`$~=w$aBAH z=!mnvE9G2nZ`$=VG&GuC3G<9Ly<%AT;btP@*eA36!>wOp>Rn9|!zs(p3zNHfOub=_|6k1Maf_~fBRygUFkl$hNKpLgM6->%H{51H-3Al zfkJkj?|Au_23N0-w#2bIk2a~`h7!&hm7IrMJ}T?Atd84_1wBIhN`Ld_?DmS^j=1mk zLIQDqq*0fg$-pXR7cds@B>)wmlu6Fp{ZFRz$HSy&N~lH5CRCF^AQ<^9wKwea*>o3L z|H&y=af$P_{h#$=>@j7Zh%B<6g-}K*PyFKcT}+;b3R_oPwe%J}Xnt2p73w=2ew%X= zLm|S0|6A|At}X){lqPP-ER!q=lkxb>u7`pV{!|r__37(Hb9Drs-hpx3$D1<9^S3gwG_fe{04qbMi=~{LWe{ z9?Aw(M4G*{A-Pa$Gi^mYA!BUbwGxcVT&$a33Y~&x$jbtE5Yz{_XlOW6D-2*kZd+eo zo>f~?3EYw{nb(F-KPLpmk(gcQlR~0E`P5yJ4eI^%vnI0tEhz_AUNVsulVng}q2l%HX8{K*Wq~Yr0Y6xa!Wo6z z1GttXLch;S-BEob`YgS-s;wr1SpuOZ@UIzKLr>~q60^Jc?8W*m z@->-_se(MGkuM}so4eE9MM56)!z58GabWHAo{McvqBhqzr!3{waQ;fB5MK?%UdZtJ zgW|o1;CI!!{r&W;hyn-R3SuG(=(;|kN;v-YwYIKqWZC}E4?#!y2BU3rRJKE^QL?rb zShl9HuUcm5=Z0Cvdq7jyn1|FRZp>CEpe2jIl6U7qrU{e|M^G=}p;BU6+UY$9S&jrV z3Tk$n4Se_u|K&_N*Yt<#7zw=T$E^aZnnwp`Olj_ipkuCJbtpNp)_G|Nzq7SMBxUMG zx^~`;!kKUw<1DEU`+5y<8?P0^X>}Cvsc^P)WAZza4p8b-*t?5t8RfU< z!ju0Fi`f_ahR43A11vBr*qqSv3sMX|hG4;NXwerx-YT%rKwT4^?sGo<`sez_%#g8H zJ6;2feDo*t;W%kG&5pmc#2k7{GTyvVg@=$xq>|u+RITRPyP4{pZFgv~I^@KsOhTp# zs4iGP7H*L^MJu;D07qs1Q0^Keniyd>#(NV^c>lM(oZi%eq>EmHu4j9tTC4lDV}BKX zdu@zo`U8(4FblL)Rotmah%wnd_n}a9rN^JA3jnql^4lKsOG4!=G$5eUG??EM*g#;b z-}XWt1V$ZTTUKZwp#aX5Yacs~8v?5VT5#d)*|UR{D}BMG&SUiu%*+d8ty-SLPg=$N zwl_<**C!)g5r_GcRqULq+E#hnBOAzLY8WV4pn`uuu;M(*Y6-LnO{g(4o4;xr=GD~H zs4e1Dn8ZocA`*5s$HX^op{fTszYhBTATXj(ge8DZQQq+zWSdmW?V;mfgBa56cy0YX zO~`xomlZh&mrv{c-c-_964J9|;K6~UloT$)QH+-tyTjtCM{ zql{VDrCc(|vB&stDOCGzq5hO-*Ol)MFByEQ%n?|udHNa0;p<*Y)*zCf_v*l-DL+@{btNl@=8h6@udGY*kj~*QhALF{7}eeeG$cFBFaWyVat{#{>hS|uwVu) z8KL5eRvo}QG<*IGc+BC+`{*F+F?MNJbzCN|?5__rLIeuQd@VIKRmlAF6BKs&w4}cA zHURt?jCHP4M=?qaRPF~CAn=Tw-uHP-_eLfnI5oAx&)gF$?zfLj}+7N>i}TjX~(&DZRrC%&ii z$f_D8P#cBJf;wsx=TQX<0g^vFKQJ8;5wZF$s_OczBw^%$$?E0J%`y3K=T=#90QNfM zGdE8ug#^H_ay8EWPuBU!@*S!34ax8H^TDn~dHd5O-mX~cFf1K*ne5>2E_O^%)5Dzs zc3aLS3>+0|O@_t*h6njf)>Iul=s7tW6QGReyuz+!P?D{uo zawS{KJwsow&}raOKN>dRDp_gkMmtFJWFPfp%p>VAit)mSatHVGA2jA7uHi`-- zx%Wrxr-}?0KYpIf&=Ha;1Rgv}&47vYg!nR5f7gFgn23>Cpp8OSUlZX{;)8;MdQGr< z0CnpS;etHe;+u=QPW-Xml4X^G( z%Fr&g{O#h2xoO(_586^xB8?ViDi&H+{dQ(|Mxs@=42o=S7=g~#Fr#kwH!_x48S){; zArTEwV}$J}M9lUy5#G1j3i2~Y7V*!Q!j_sS8vkC|@^sHwv_3#yP}c0x!}5Sc8x>@F zA<^sG*i|a)2TWtWW*)U7)bRFw_gPm!i+&q(u&2`=kNSaHIJH8?fE1N@+b*x}n2HlI zoRbqN0h^=Z)eTFE2S{;%LAWbf@d(;{+Q-AynC>v_qn-~zk>DO%f?~rpaP^nF9gv)v zQta9v)HAzI0~ZQ16)Q^FSRIS*7|B+;0ZYFc(GUAY_ysX96*&UW?9gk-o&YEeeuFze=NG^< zqj9oZd|hEOk6{l#p*-pYN`ZJ6P@=$uttm_VHx-^b=zz@fn?LD>==@f%AdNFKYtGHB z7q8qDEy}0j3fy@U^gO#mHRrnkNDceSEIzqH8we7q)|PruabOsyyd0tfUILhi%Sh${ z?4mv5U?6(*9pAZE>^?W>KKxXf+GpW4&@q$|gIiymV5sz3aowx?8z4Pu3OCHR$}BW- z(IutNRBp~UQd2N`%^DpXEDALt#n&>L9^ylo{hSqhXDPC3@ zm>4@fJ^!sjbQQ$E_Hr=o<#4|Z?VlT8GpGZBt#9H(IA{3&oQm&QOPpEfyE_T1%gXy3 zq2HSJmf%Y*I9$G7g3~L{op{XddUJ-RXSg9UIY0kfTq*X8&U=9-F>#U7&PRCI)RAq# zfEW)jP?<2v(U%f4B}0Qe@@pzGJDUsIH*P#HGyb@du(Oun4%>({7q{;gc|^y_fmlR@ z){hvFIFTMqZt7;E+xmRsG23B{Xpu~!*p5T{n;UZ^U9AzQzX#(`_eGIQT5k!vj5MOv zrCdLDq{Xp$j=!Gs=iEG=rj@_}I3_deXe?wczeCm9sQDToT!Y1_E@8+6I8BT94nL&U zm!}OUTZ=(hg4@##50x|SBU7FA`%zQ0lg=@ zeee#oc8Cl!C><*EduiF2cw+Bej@P*&5m9G6L}opN2rK9dc>SLA)wys#wgbn`U5)qwj2nq@k>*x2g-?{R>|sM z@KBR*YY1XD(4r)gl|q9MEmz6!DYRw)K=JFt%E@OdLZ6}I*IwGoUf3X?3t`w+?l$Xb zwKy>^CwBll2nz502j77@kM~#mQCL(ez)rx!l@fuBGCGg7XyDQ>A#0=eUd=(3d^J^7 zQ=o%wAXIU!krJp4_C?;#_J-r~wV1(|<6tA0&JEU;j{SD=3hGqH<6wK4d|aaT-Gvep zDUqlX1i}tUgosQK@c42{P67{!7*4>~Gq>fMRC9HaaswH7Mz>|E&z;kY9tKz3F`K>C$2vTX>V#_oS|4)TkM*1Y9 z(Y;F%b{4L;ul;8hfMU`|#E)#7e96bc^yO`2bX*a_+t=a@B$UTKA}LONR_IH@**Ug*RE&C-H^5& z3e^wn3Fl@ukfTOz*+90_1{A&5UaT45yfZYSNA;*mNP~EpWJU}F;e|;zT{CoNvvnr~ zcu{JO4heZ5s0mV7NRbucvM-)LZ*M5rL>Ri0K*mibwx!|Kk65t0GX1^>C~{b832T->*y9djk=Vm>P@SgG zIv!G&pXoW4BGHs8%g`$i^be8sD?w~G{?fEG8 zg=TT*=3Z38gZbZQe78-LIK2+1SFa{m`3&`+BM=oqN+4bvfexnh-VYDeg9t1Nq^nyX zW`w=I@;EK$5Mqw1SO~|l(UMq zgSCNkAc(p0-RHY8O%m-?7p&fNssP2P)M6P5CRiOe1<9It#vYJz zkOD+aRqz55t$gN!O+u78eMG3n%?*}+fr=v!_DUs5G)NCBCm{7sHSYb_gN8zvBp;-@ z(;EJ(IPkZx?x^prb{ah4R8^vo2Z1271BVfInSYjyB2Ib0W0_+)7>YZ3cS) z8uj6v3APr{{VQqhAbOplgQfQ6?5Ld9h&}@5UxO?orh^LiBGih(p8joD8L)pEIJSRW zlbQc~D!xvy^*`jD!eaLT>8X8wJ6lG=USME?M3X}fIkHn>2x5-Sy(qi5W4yKK&d)Efg z<3U7M2BA5*un@o1|GF60Q4JoeFzQGo(Ts=4H3Zn|)Y?2WlMl)Z|NAbB7|+%&V1!1^$L@e}v0n+}Y~iVGoyGz8MQevJJwA^xSFgo0{NSjUz1wv_Iqm=#mG7 zse7<|M40W9l>@bv?4=0@7g62`z~~SIk7g4(EU1cK$EohrL~2w$u#UlW`7LX-M`ZYt ziYOY;vVZdIg-(iZ7A4n$GoqvaQ#VDT<>gpGn~tp8Hz93|g%!Z!CJyP~;N~cWFwqYY z!^07`KsFoI^n2UVjO5&hN_P<92VsIFy81hxUUmQ+?Pz=tAo|{X1erT+vfes1ZhS^= z#?1Z8gwd`)a^oXWUl}+YAd5b7Bwm>mU*}wD#1c*Ff zyy?hoi{#M?1Dp-goLoJC7PGDOrBVx5Kt8U$cp_CRNe1bqbi^m6tV{|NVuTq}bmGe} zK#pKkgo95Yj!;@az|D8JFR90f@f(95hfEIyRPZ$#;vjq>i%QJCJ0(YF403}3S#-#C z2cX6dX`9Jc_wG*3p#1ibypzYwv7)HKhnxo(1wv$3dWBbdk0^z*98HgPQU&h+17Sn(D@=ZS zl|(o>SR;PJ*zE`5py|}m6;xrUjo$W15h$5;$O#7f#t5{QR2HJ z>M;|NEsP-T@B@GCRRUt5qra(8x4O3oN`+8LX`pL9C#K~cjvhA^b91DGj zTn%lAyeU`%{^vu+dU)-|Drh_Ok2!ta{oREpBDmGS`xZt#CVRoyM?@#r;sw$2es-r4~Ry2P>YBG^rr@)$>Z1v zByG^S1{;~>P+dhxr!CKnsI}PyPA;-^n)2Ft48c#`9OjW%!6j?6LTRV$5B-9s5cI*Z zw7gAo|94>WhvnDX!r`jv8~TPzfmw2u5~dMA^I7g1)0NkSDGc-rNzj=ki`HGj<<_m# zU!Fe!Yit~d%mwb^^>Htz*b3l(A3G#29(3e-u^zifuVn}$=hkdns6QsLAVL(a+eHcB z&_KqUF{L6mz?+QiLO(7e>+;yh0Xdd@*qxv;411tG8>2nvIs7QAgYt0ftzmJCs2j?i z(e}re{P!qYTTfTF#NPX~k2-B)mfYvGzJqK_@ zl&u8>NRG$SYx|z}F^g;8zI_8~-+6kcV*LUb4yZ5dkgY_3EXnxsKb;#QGS+3#VF}1v zKd7*?y_F2|cIk*Hu*>4?M=1bZkSCR%lh^k7=_w$+eOKX>-Jy~pg<1{%z7BoF6f_C2 z+Amfj4far)`m4kJtM%f8to^G>n*)300}!lyPN}m_k9%RLhnR4qjaAiRs$kvE$DHwH zO5m=atAJY8{X3l_fe0D(7N{d9kp{+Y=S81spD9Ar{vE_7Dc6JEp zP90vF;P;z?Pnok4d)W!<%joihz*Zgb;>kwN8X%mf=ji-GfdJ>Pf%EtKH5e>d570RV z9sU_Od__yRSgPcxU%lS$4y96u+{NX$TEpqYya)1a7L=?^c=k82IM6^9D1%&t=P)`2 zfM^JaIz;q<24p)@Gs^btB$kzR3t3@7VQA0L;vDNhsAIbFm^Sn%pI%DN!Ydman?VFq z1PmbIEd?YWrYVPW;5!T~Qz1)QeU}UV2KBp}@wJZ{0NmtJol!K*)TYcCY8EDW8VGwB z5_5193|pX01xA_pN=9XaZZH<18_)vdDdQ0E5G?elI8cp9T)7zG`GZ2Fs=(L=Ko7GD zz=Ct+>TOYU+rm@4$W2N03&|nL`fjbHs?Y;U?)~I1gSLx|OUBDA3R(hMYaX5B_ z)gz|xL-jx=<72p3F-kNXl@c;X(8k=Ms|^C{vte^?5<(*xT+@qy6U6|uJnd0qMjk#d zKY?K*y$g^Qbuxfz>%oPTAO>-thBg4IG7oI`0vIH{!r)sC!7YS_u}hD}SC&>S7v*x7 z#!NNvB!mEoAub%>#k;=>NAs2U#`Wv9P?T6rcGk&5sP@RL4*2JJugx1tpEItI5U5=I zw%Qi%`)ra`s~XzZ=!+Yl5iuR_DR!hLCQeBoN4RlGM(y3})k%{bmfWg!o0(E*GUqbz z{3lI6+~1|*#3*3I1O-Vm;^5z^cd|J2FDh^iI29IvOasK~kj^m4Kie$cA7bcG${i-V z-1$<(TBmZvI~FcfF`PrzsrlS>U=s-NDfGOz*VPXUpxfI;7^4e$Gdm*M@{RJ)njaBu7vo`c5D@PT_eexuNC0a1N=slrk0>;9nEKsfyq+96) z0Audve>d;DrnDkhe`e6LOD)5hg-;7qtqub4Y?Ornh(P%9BM=hCaQSU_53iLLV%E z5Gsk37;`s;tt=>cMC2DBuNPd3Xjv~;#lfnKFrj?Vm$Xsn*3`=YW?_`g&y2!~vupEQn5X6C4gNAYzUJ=Jt zeklC0uQ?0?1lzywI<2z&uYC;2qf*J=m6!tvG4b>BXU}S(Z;#Csg`hrRvi3z^huk?1 zV!773O!Xrhv_2T>>UDMlAh`Y$lAs_SceBsEx|j28@L1R@kbrLGkv8!q~*NNCLC$m_po_SQq~fT^c8>KG5Zl*pIHMwEa7BaKl+sD?{iwN0^hNp1BQ6p5A{ENpBaQc0%lh z+Dh_)@C~yvA}{+F5b+)O=x+vfBQtB50{ImVHa>TQ=2}z!dVas}hT>$$+eq_jq`O1F z@igqYe-819-)SX>pRB@QL-*}R@%1T&#SZv3MMl)$ppg76Wt`Fn2C8-8EE3!Po+LKx z2MLx1jYvmKfiaCnr{U5*Q`K@SUb;v}D_Ha(xSL@y4rOO<71=y5(@ZA7SSVudx)Aap zkpv+Vj1bzJBBh6rs*<%e-ZyRr^w0dM>yG}r@1F}=VBLi&j*TaWhar^rZ$Tsk;*y9) zWssiOwtb@d+B3*16bt}@HK4%BdEeYb$qw}=GmBIXL`ND4A6#8^?lOy~kWyc0)pk;4 zIaboybf&iyF6FlKniwruCjdFohJ%n0l?Nx5niF{)h6$*~1{$Rx9No@=N;g+I>mvw( zeGD3e{91#S4mrbZs6I3p4x-mt+GYG2$=?sem&m^76EAtOhe#a!I00i2z0d^bs&_W3 z=ZbQD_`7h&&LHm!4O*b%XQ4XrkNxmXLPU{_@@Nj9#kQB{?_8#^ES+t~fAXi3lYsPy zFdyR{5o!aP!o#cy3rDigO*CS`3Aj%PM*B*JBh-@M5;OVQW6*>+sC1lAs7uN_SW3Xz zBvPSsy%L&|qH6BIc|i(Xg{i~{uJRKHGnZ1)XdhfXR~I7HKytYuQqa_Q;y@9|`Y`9_ zSO?XR1<?Dh20E-ScgBSQO)Ok2A}kbsHp`X;z% zZZx5+;sPoT& zNkw7?xyF^IpP!sSKayDKbw)yOCSTq@R8V2|O&w>JjFc!}7#ac1D;*G=DVUln`E)YB zJ}50%3_WwBpwS;7MG+%3AJVMY`v1hNT%axtCHm6_`O`}A!jA@#KaF4%;7C(Y_A)1Z zvOyscLi0n^0Rj>c#~O^t@!Y2ag0=nI%f+M{Cr_G!;eZ&N;>ygAoe5&kELqUzjTmWN zY6MrVw9-n*TpCl$>Z!f&F9-9Y$_j`yrphJRHtEQ+uHq4bmUAX|-$o45( z*s%o6b(jI*ZmGP2dj;CZpUfAyR(cU0Ks~zG*>)0IXzumLoFXCrN@@wW8h!(X)vm_y{J~Pfp;Ts2t zi|o2Q7%L>g$c#3z`Y`DJs4#m!f)hqsJ9>FX4vrNHQ!ua{q{U`K=njoR!8kfHGJ-^J zD;RY4o^ehH2G^L!4yL$=(PTCJVRpy%qObp_Pwnw);V|sJ2!cmsoEr{o^VFRDHspcv z#JTAFcgXxIVX9LINm5LbPUe)e^z?1O&Y2|c-KPFZ6TLQ!;!lB97K(Z>A=Cq2F8ZKPAH36ss4@c~1gu8mTuBg>U691E6uk?3 z!U*?(?WDl871D~yJxj7~Fq0$(O&3150_6P|%r9!inH0lV!XsLC3VKs*;5OJVM>Gxv z&m?TiyoVX5bDqmn2I=JAsoE~~foKD`5h?T9dU|?1WL9uYP>mos@ncjc0QE}!2IWLSu_BYsb^*9805YXEGmAM}d;yFg8hiiWR+SRfj8)!R$HW+-2k#PtL zTo6FYUh*6Y^9u0z=-l-%ESwgAzqTzU$H;@}P*oCoipa*&_&o{ydoLZDa zPjyul2dD4qopa~Tv3<(MFxtoHp+2QB-ePBG$0k!e!-Cy2+6Nyb=#8qYt6K#wNZVoN z1s2L%^fqb-2)L-4_}}4_Z~*o~Tjh6Tpfn51AKZCToZ^bEOqn zt4FI`zj4(541KD?cXd-gKY7(NZR)3mVl(RAXEtGHwMfE! zdZRjkcY5mTkFRe%A9pQp zo6W7IP>y?68ZUZQ?p^O{vM3mLk)m6Sg=HSC+6_mi+VftUOb8*~fPY{)Lvs?8w7@cl zq&IJR-hXf4s&AL*-a2e=om|M>t&?Qm!&~go6GMFVeyeSnxG^^5AggTcw_YKhFj>E| z8n`7dnjX_4Brm2~d%K9U(m`A^o~{1&`GBAInEWrv>*?zc4L97$&Y?B6x99KZ(5$m^ zSs%csJ8%5BQYVTHNGxdlfk`;2o|&62Hq0w3I@%*$o>x%GYS`10S6K<_wQ}hdF58~N zslA;oGs%(Ix*CDZia!-_!C6H9FnY(M3S70cfPRCEiD>C4TD) z*#6GYar{CUcpSnVF-$oQE|_g!>NBtn`|;D=ex?iSJ4rc{{t}B<&e_m;MJs;-bA;8z zZ;Rl))L!kd|7p!n8#}v-!;FI4+%QR=+hIn7g&l;el{j2~ABkFc}eu<9p`k2vX>Q8v2@|8Vu6tfXW%Y zyu9XqxD7Fd6Z4A88T&(tdFADdk%51#I71LHg(~GOm+Q{0z9J4SP83NvTO663tPW3) z_q+fftjWA-C{5`6{yQdd9X&o}$+MCPPz_7mc9&4(gvjY;E=pOL#f8AKH)C!`-%>It zQfZMYB9SUntrpttgr>9tt7sJw4TgfPEqHh6iV)cr->o6aGTyA8sA?=_)ej{|L8#se zdie0+_=?*{7W-(!r+32#d-^n3J3IR)t;yJ!eIn_YYbCS)Ktj1eEY%w E0<8~$YXATM literal 0 HcmV?d00001 diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square150x150Logo.scale-200.png b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..770b86e27a0128c298a8dae38c064655ec88049a GIT binary patch literal 7117 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 literal 0 HcmV?d00001 diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square44x44Logo.scale-200.png b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6935e402e3e831b96522a79f3942217b4989c0 GIT binary patch literal 2227 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 Hu0mjfrLg%5 literal 0 HcmV?d00001 diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/StoreLogo.png b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..45ca71c26eb4fb1abd14eb5131d91def1921de2e GIT binary patch literal 1238 zcmV;{1S$K8P)wK~!jg?UzePTUi{3KfTdtd{(R@Q|nBsE(BMK#f=C`6|4wq zR$W93-MCN?5g~DWK}RDL3W6A1l-3p;Nf)+F6cmJ-iXye8tq-)(38OWFi?ow5v6^HS z(zIe9Dcs3i%KditoJ$Rbih7LgjVh}4ipq=qaa zHDnQ~5i$|K-%n3Z4^>rF^!N9Ro*x#fi`CPoPq}vOTHtwfbd;>DEYb2qHX=z$NeF@f zKxAYj2?+_J=7(%V03JVn%tq8VoVPS!RfdTAxJ4&SzwOUO@MFr*M z<-Bi1uh+}VmoI5=Z>O)X?^Nx~%nSe#5fNXUdY>{m zIf>8bBQ7qE{QUfY$kx^ttE;QxilnEfV=|fO>guAbtSrz$lgWh3gtfaTMm!Y8{;COUC>{1`l>-E&t z)d4U&JIlz($QN@rHa1vVS^{8udz)LgZZSMO9B8*#EO@=%phSY&emgrm85xpD=M z$AeC%aJgKV&1UgLOePa%vl+YH&f(!9 z=g*(#(xppeWMlwv?%X-9UcCw&pQ!-UYBk;6-K?yv0PyFV9e&c(QSfUlD(x>Ey!TLD zT@Ap+ix*FPFETO`olb|t;UGRfKA0|s?yTkYdTDNM#%8loP*8wguNO5xWT#(25NK|0 zMx|2G(9j@yzUU+J{{11ZZ5udt9PGQ@?EmA&?cQg9-%Uh>g5u&LE?iKH`AHze$N2ve z`OYpiWD%($i%1PwL~6()QbQJz8nTGg_+do;1$OVEo_A2gvH$=807*qoM6N<$g6x$< A4gdfE literal 0 HcmV?d00001 diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Wide310x150Logo.scale-200.png b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..b620b03f4b5e3fe81fff968fa351a2f4cf1d5592 GIT binary patch literal 7938 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 literal 0 HcmV?d00001 diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml new file mode 100644 index 000000000..dfa9df65e --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml.cs b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml.cs new file mode 100644 index 000000000..7c646b611 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/MainPage.xaml.cs @@ -0,0 +1,232 @@ +using SkiaSharp; +using SkiaSharp.Views; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.Foundation.Metadata; +using Windows.UI; +using Windows.UI.Core; +using Windows.UI.Popups; +using Windows.UI.ViewManagement; +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; + +namespace SkiaSharpSample.UWPSample +{ + public sealed partial class MainPage : Page + { + private static Color XamarinLightBlue = Color.FromArgb(0xff, 0x34, 0x98, 0xdb); + private static Color XamarinDarkBlue = Color.FromArgb(0xff, 0x2c, 0x3e, 0x50); + + private CancellationTokenSource cancellations; + private IList samples; + private IList sampleGroups; + private SampleBase sample; + + public MainPage() + { + this.InitializeComponent(); + + if (ApiInformation.IsTypePresent(typeof(StatusBar).FullName)) + { + var statusBar = StatusBar.GetForCurrentView(); + statusBar.BackgroundColor = XamarinLightBlue; + statusBar.ForegroundColor = Colors.White; + statusBar.BackgroundOpacity = 1; + } + + if (ApiInformation.IsTypePresent(typeof(ApplicationViewTitleBar).FullName)) + { + var titlebar = ApplicationView.GetForCurrentView().TitleBar; + titlebar.BackgroundColor = XamarinLightBlue; + titlebar.ForegroundColor = Colors.White; + titlebar.ButtonBackgroundColor = XamarinLightBlue; + titlebar.ButtonForegroundColor = Colors.White; + titlebar.ButtonHoverBackgroundColor = XamarinDarkBlue; + titlebar.ButtonHoverForegroundColor = Colors.White; + } + + samples = SamplesManager.GetSamples(SamplePlatforms.iOS).ToList(); + sampleGroups = Enum.GetValues(typeof(SampleCategories)) + .Cast() + .Select(c => new GroupedSamples(c, samples.Where(s => s.Category.HasFlag(c)))) + .Where(g => g.Count > 0) + .OrderBy(g => g.Category == SampleCategories.Showcases ? string.Empty : g.Name) + .ToList(); + + SamplesInitializer.Init(); + + samplesViewSource.Source = sampleGroups; + + //foreach (var category in sampleGroups) + //{ + // // create the menu item + // var menu = new MenuItem { Header = category.Name }; + // foreach (var sample in category.Samples) + // { + // // create the sample item + // var menuItem = new MenuItem + // { + // Header = sample.Title, + // Tag = sample + // }; + // menuItem.Click += OnSampleSelected; + // menu.Items.Add(menuItem); + // } + // // add to the menu bar + // samplesList.Items.Add(menu); + //} + + SetSample(samples.First(s => s.Category.HasFlag(SampleCategories.Showcases))); + } + + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + base.OnNavigatedFrom(e); + + cancellations?.Cancel(); + cancellations = null; + } + + private void OnSampleSelected(object sender, SelectionChangedEventArgs e) + { + var sample = e.AddedItems?.FirstOrDefault() as SampleBase; + SetSample(sample); + } + + private void OnBackendSelected(object sender, RoutedEventArgs e) + { + var menu = sender as MenuFlyoutItem; + + var backend = (SampleBackends)Enum.Parse(typeof(SampleBackends), menu.Tag.ToString()); + switch (backend) + { + case SampleBackends.Memory: + //glhost.Visibility = Visibility.Collapsed; + canvas.Visibility = Visibility.Visible; + break; + case SampleBackends.OpenGL: + //glhost.Visibility = Visibility.Visible; + canvas.Visibility = Visibility.Collapsed; + break; + default: + var msg = new MessageDialog("This functionality is not yet implemented.", "Configure Backend"); + msg.Commands.Add(new UICommand("OK")); + msg.ShowAsync(); + break; + } + } + + private void OnToggleSlideshow(object sender, RoutedEventArgs e) + { + if (cancellations != null) + { + // cancel the old loop + cancellations.Cancel(); + cancellations = null; + } + else + { + // start a new loop + cancellations = new CancellationTokenSource(); + var token = cancellations.Token; + Task.Run(async delegate + { + try + { + // get the samples in a list + var sortedSamples = sampleGroups.SelectMany(g => g).Distinct().ToList(); + var lastSample = sortedSamples.First(); + while (!token.IsCancellationRequested) + { + // display the sample + await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => SetSample(lastSample)); + + // wait a bit + await Task.Delay(3000, token); + + // select the next one + var idx = sortedSamples.IndexOf(lastSample) + 1; + if (idx >= sortedSamples.Count) + { + idx = 0; + } + lastSample = sortedSamples[idx]; + } + } + catch (TaskCanceledException) + { + // we are expecting this + } + }); + } + } + + private void OnPaintCanvas(object sender, SKPaintSurfaceEventArgs e) + { + OnPaintSurface(e.Surface.Canvas, e.Info.Width, e.Info.Height); + } + + private void SetSample(SampleBase newSample) + { + sample = newSample; + + // set the title + titleBar.Text = sample?.Title ?? "SkiaSharp for Windows"; + + // prepare the sample + sample?.Init(() => + { + // refresh the view + canvas.Invalidate(); + //glhost.Child?.Invalidate(); + }); + + // refresh the view + canvas.Invalidate(); + //glhost.Child?.Invalidate(); + } + + private void OnPaintSurface(SKCanvas canvas, int width, int height) + { + sample?.DrawSample(canvas, width, height); + } + + private void OnSampleTapped(object sender, TappedRoutedEventArgs e) + { + sample?.Tap(); + } + } + + public class GroupedSamples : ObservableCollection + { + private static readonly Regex EnumSplitRexeg = new Regex("(? samples) + { + Category = category; + Name = EnumSplitRexeg.Replace(category.ToString(), " $1"); + foreach (var sample in samples.OrderBy(s => s.Title)) + { + Add(sample); + } + } + + public SampleCategories Category { get; private set; } + + public string Name { get; private set; } + } +} diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Package.appxmanifest b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Package.appxmanifest new file mode 100644 index 000000000..8e18f23c1 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Package.appxmanifest @@ -0,0 +1,28 @@ + + + + + + SkiaSharpSample.UWPSample + mattl + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/AssemblyInfo.cs b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..74ef9ff29 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SkiaSharpSample.UWPSample")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SkiaSharpSample.UWPSample")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/Default.rd.xml b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/Default.rd.xml new file mode 100644 index 000000000..80a960ce3 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/Properties/Default.rd.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.csproj b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.csproj new file mode 100644 index 000000000..b3f540e74 --- /dev/null +++ b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample.csproj @@ -0,0 +1,173 @@ + + + + + Debug + x86 + {BFC6B190-A17C-4538-B2C6-EEDA46D87EFE} + AppContainerExe + Properties + SkiaSharpSample.UWPSample + SkiaSharpSample.UWPSample + en-US + UAP + 10.0.10240.0 + 10.0.10240.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + SkiaSharpSample.UWPSample_TemporaryKey.pfx + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + true + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + true + true + + + + + Assets\Media\content-font.ttf + Always + + + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + libSkiaSharp.dll + Always + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + {bab615aa-956e-4079-b260-dd7b1f52ec7d} + SkiaSharp.UWP + + + {162d75e5-b52a-4b43-b896-5d3f3a7ab90c} + SkiaSharp.Views.Interop.UWP + + + {8bb20362-91a2-4206-944d-634070eac6f3} + SkiaSharp.Views.UWP + + + + + Windows Desktop Extensions for the UWP + + + Windows Mobile Extensions for the UWP + + + + + + + 14.0 + + + + \ No newline at end of file diff --git a/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample_TemporaryKey.pfx b/samples/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample/SkiaSharpSample.UWPSample_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..b5a0a7db37302caa5c9bcfad3061376bf3b82dc1 GIT binary patch literal 2450 zcmZve2UHX37RP7OAe4ago+wQaVUidSv4C`>Ns%ImH7E!OK`~Nk%?VUQ0jfbj+x7_Wz5DgDc}VD zi;>_24F6<_lO26v&utWn?W&-(RF(ZS+~7I<^)jr?$x;`NP6UYDPSfu3)U(eN6%ePL6 z9+hKXA}M_uN-@R{uCi^}4Z=>TM`MRKY3Zv5v$M?Wgc%`Bl3HiuZOytG+rWj)UiAl) z9S+1U(~%aj_LVPhdaJ{nI^#t%&&hMcdU@Tl@k??64zC!w810KsRTo}q@5CS6J(2&QX&yuST?&eaUp8* z@0<4Tm#}V^t&={6x)gZc)1ECr&3E)QKQS7Ky=|y7W4^J=ulk&NsE=j;tJ6Mo%OPU0 z=;_U?T4}bwtKoajvPbt_S+E#RbZA|$zsU+_&9cAAxm%hX7#f%^sCZWSN~$f$kmud5 z>-FN(sE~`K)eG9`Ifk9befj4CmlqjAul=e^IcqX&%^Zsn;w4{ppj3uTH~C|D1a+0w zLP^M&&UhQRpYZ-p)?Sa4F&>`@$@%g5L4Ex9VPopdj)A`SX&3wVI>@&z8j&Vll3yOz z6@1!$xXP4$H%lVr)&WMqw|6ZbBlB$9g}VG%?=6{QlJcx-$6(>~sXxtY#maVl&7Yad zYA7}9&Jn}awy!mWYp=F8MT;2wB^g`oP&X>-_dJg4HPT+{jM|+ncJ)|p4e3#)h8928 zNGL&nJC4B2nO|-jEjltsKcrBdD?L)OiPW<5j`gMwgtwvN(F=ok$N33Af3l^70(Hh^OEU}Gn4p@Z-VsY-eKyPtXH&E@!FLp2c`$; zZlN-niU(sI{S{TeZfnNxP-wBgyp~P#zPu7yV5*S^nUMxaj*g@HwiPeWw?Eu1uza=R z`$6jA&psvwIy>se^*0iu{N|(gZ;NSCn{j9=tWXP0zwKwu6%sYsb$*chx_rgoisKw0?bZU#Y4(1-Nwr;MOs{515E%w{1HCgNFa>`xDUismcd3o8& zIQr;s%^P%bW~vXd^A-S0qry`{;@i>!C++fH#vBaoUM%rZIio@gU-sW&;r&OEo!M2V zW6VvrPo7}z_A+M?N6&n2_7BxX*I5UOnAbFjCaqOizs`-v z7ku5TWj?7aoiZ&m?IvZPh1}S9RaW}h^vd#pg9PpTbfNZxs!fC&PwZe|_7Z_!VKCio z&@nK;%Qkm{8IsMEHwyT^kZ)dh+FY?pXRG7f_Q0RVtp{s$$Y#VTVeSIr%bbUOIFfu~*5Dp=B0x>dj=mRv!6Nle|12G`1 zw*e&EE7<}zz$qk95D)+`5TgUZ010qJ&OeAh;EgC_WX=T6AS?jUK}Zs3fRpQ9B*1?C zx^sy7u}u&Jqsc!r|M6i!Z^FQ6B?QYMCiQFgM;E}TSqMhG|JnQTQiua;2m_<~5&j&4 z!MXx83PhnqCF9gFDRCz7C^(G2!LcEfPz5~;M_$gg?vj`%5{JK ztS2(^4}09&c-mm$%CMlCR@x1ZCp9rNbw*cZLGhZ5{JFTv<=p5)OUu)+xR1j7IYoesNTD(AgB#V>XFj+$E4+zG0xnw!JMj?dnR8x20$ zKh>_s^C(P`Y8nmCcOex>+LC`^e^j2M#*}OO%+rEp2TnFPT_cs!2Sra zyp_A;2QT>Jj!phNW< z%!T5zrN`k+kLf-)catJ|Oh`^Ww)V?hQs$~&b>&zwP_Uc|!6#;JUXeN6sxrNl8+giu z=bO@<-4jTmjARiHCdXbp7L~e@v2*0&*{EwUjrsJ0nV(?L8;3)LJ?Z_@lbQsg1gEeF z%I7nUd0qLab~dl>B~ikSZ<#{oN@w>`4K&_wAHLT8Syep1U7<8#sI}5*u!uVv_m*>j zUTi1Q;%RBi&oOH?a}B}EsfqSykb>Pvl7li7vgE(N>;@1K;=^IL5YQ+&j08_}Tvso~ s>_N_R--$p&mFr4TiA;=yYoAq!