From 1674f2c35b7f78f955baf36e7ff86d3ee922f479 Mon Sep 17 00:00:00 2001 From: Bruce Date: Thu, 20 Nov 2025 09:17:32 +0800 Subject: [PATCH] Update Shell. --- AppInstallerReset.sln | 36 +- .../AppInstallerReset.vcxproj.filters | 17 - appinstaller/appinstaller.rc | Bin 0 -> 12582 bytes .../appinstaller.vcxproj | 60 +- appinstaller/appinstaller.vcxproj.filters | 100 + appinstaller/cmdargs.h | 161 + appinstaller/dynarr.h | 77 + appinstaller/filepath.h | 871 + appinstaller/ieshell.h | 46 + appinstaller/initfile.h | 488 + appinstaller/main.cpp | 595 + appinstaller/module.h | 51 + appinstaller/mpstr.h | 42 + appinstaller/nstring.h | 465 + appinstaller/packages.config | 4 + appinstaller/raii.h | 10 + appinstaller/rctools.h | 121 + appinstaller/res/icons/color.ico | Bin 0 -> 188462 bytes appinstaller/res/icons/file.ico | Bin 0 -> 53039 bytes appinstaller/res/icons/main.ico | Bin 0 -> 35596 bytes appinstaller/res/icons/taskbar.ico | Bin 0 -> 35596 bytes appinstaller/res/icons/titlebar.ico | Bin 0 -> 412402 bytes appinstaller/res/icons/white.ico | Bin 0 -> 156504 bytes appinstaller/resource.h | Bin 0 -> 5214 bytes appinstaller/strcmp.h | 154 + appinstaller/strcode.h | 21 + appinstaller/themeinfo.h | 160 + appinstaller/typestrans.h | 265 + appinstaller/vemani.h | 322 + appinstaller/version.h | 124 + certmgr/certmgr.rc | Bin 0 -> 7072 bytes certmgr/certmgr.vcxproj | 4 + certmgr/certmgr.vcxproj.filters | 8 + certmgr/resource.h | 14 + dlltest/main.cpp | 16 +- notice/notice.rc | Bin 4616 -> 7096 bytes pkgmgr/pkgmgr.rc | Bin 4610 -> 7084 bytes pkgread/pkgread.cpp | 3 +- pkgread/pkgread.rc | Bin 4618 -> 7102 bytes .../AppInstaller.VisualElementsManifest.xml | 4 + shared/VisualElements/150x150.png | Bin 0 -> 3472 bytes shared/VisualElements/150x150_Metadata.xml | 9 + shared/VisualElements/44x44.png | Bin 0 -> 467 bytes shared/VisualElements/70x70.png | Bin 0 -> 2969 bytes shared/VisualElements/70x70_Metadata.xml | 9 + shared/VisualElements/SmallLogo.png | Bin 0 -> 271 bytes shared/VisualElements/SplashLarge.png | Bin 0 -> 7234 bytes shared/VisualElements/SplashScreen.png | Bin 0 -> 1330 bytes shared/VisualElements/scale.xml | 14 + .../splash/SplashScreen.scale-100.png | Bin 0 -> 1397 bytes .../splash/SplashScreen.scale-125.png | Bin 0 -> 1861 bytes .../splash/SplashScreen.scale-150.png | Bin 0 -> 2337 bytes .../splash/SplashScreen.scale-200.png | Bin 0 -> 3512 bytes shared/VisualElementsManifest.xml | 12 + shared/html/applist.html | 357 + shared/html/css/pages.css | 447 + shared/html/css/popup.css | 26 + shared/html/fonts/SETUP.TTF | Bin 0 -> 89344 bytes shared/html/fonts/SETUP.eot | Bin 0 -> 89502 bytes shared/html/fonts/SegoeIcons.eot | Bin 0 -> 442102 bytes shared/html/fonts/SegoeIcons.ttf | Bin 0 -> 441892 bytes shared/html/fonts/fonts.css | 34 + shared/html/fonts/segmdl2.eot | Bin 0 -> 264478 bytes shared/html/fonts/segmdl2.ttf | Bin 0 -> 264272 bytes shared/html/fonts/seguisym.eot | Bin 0 -> 143144 bytes shared/html/fonts/seguisym.ttf | Bin 0 -> 142856 bytes shared/html/images/SplashLarge.png | Bin 0 -> 7234 bytes shared/html/images/SplashScreen.png | Bin 0 -> 1330 bytes shared/html/images/splash.default.png | Bin 0 -> 2146 bytes shared/html/images/storelogo.default.png | Bin 0 -> 429 bytes shared/html/install.html | 112 + shared/html/js/animation.js | 188 + shared/html/js/bridge.js | 41 + shared/html/js/color.js | 463 + shared/html/js/dpimodes.js | 178 + shared/html/js/event.js | 338 + shared/html/js/module.js | 187 + shared/html/js/pages.js | 74 + shared/html/js/polyfill-ie.js | 130 + shared/html/js/popup.js | 60 + shared/html/js/promise.js | 241 + shared/html/libs/winjs/2.0/css/ui-dark.css | 5423 ++ shared/html/libs/winjs/2.0/css/ui-light.css | 5416 ++ shared/html/libs/winjs/2.0/js/base.js | 17047 ++++++ .../libs/winjs/2.0/js/en-us/base.strings.js | 63 + .../libs/winjs/2.0/js/en-us/ui.strings.js | 530 + shared/html/libs/winjs/2.0/js/ui.js | 49895 ++++++++++++++++ 87 files changed, 85481 insertions(+), 52 deletions(-) delete mode 100644 AppInstallerReset/AppInstallerReset.vcxproj.filters create mode 100644 appinstaller/appinstaller.rc rename AppInstallerReset/AppInstallerReset.vcxproj => appinstaller/appinstaller.vcxproj (68%) create mode 100644 appinstaller/appinstaller.vcxproj.filters create mode 100644 appinstaller/cmdargs.h create mode 100644 appinstaller/dynarr.h create mode 100644 appinstaller/filepath.h create mode 100644 appinstaller/ieshell.h create mode 100644 appinstaller/initfile.h create mode 100644 appinstaller/main.cpp create mode 100644 appinstaller/module.h create mode 100644 appinstaller/mpstr.h create mode 100644 appinstaller/nstring.h create mode 100644 appinstaller/packages.config create mode 100644 appinstaller/raii.h create mode 100644 appinstaller/rctools.h create mode 100644 appinstaller/res/icons/color.ico create mode 100644 appinstaller/res/icons/file.ico create mode 100644 appinstaller/res/icons/main.ico create mode 100644 appinstaller/res/icons/taskbar.ico create mode 100644 appinstaller/res/icons/titlebar.ico create mode 100644 appinstaller/res/icons/white.ico create mode 100644 appinstaller/resource.h create mode 100644 appinstaller/strcmp.h create mode 100644 appinstaller/strcode.h create mode 100644 appinstaller/themeinfo.h create mode 100644 appinstaller/typestrans.h create mode 100644 appinstaller/vemani.h create mode 100644 appinstaller/version.h create mode 100644 certmgr/certmgr.rc create mode 100644 certmgr/resource.h create mode 100644 shared/AppInstaller.VisualElementsManifest.xml create mode 100644 shared/VisualElements/150x150.png create mode 100644 shared/VisualElements/150x150_Metadata.xml create mode 100644 shared/VisualElements/44x44.png create mode 100644 shared/VisualElements/70x70.png create mode 100644 shared/VisualElements/70x70_Metadata.xml create mode 100644 shared/VisualElements/SmallLogo.png create mode 100644 shared/VisualElements/SplashLarge.png create mode 100644 shared/VisualElements/SplashScreen.png create mode 100644 shared/VisualElements/scale.xml create mode 100644 shared/VisualElements/splash/SplashScreen.scale-100.png create mode 100644 shared/VisualElements/splash/SplashScreen.scale-125.png create mode 100644 shared/VisualElements/splash/SplashScreen.scale-150.png create mode 100644 shared/VisualElements/splash/SplashScreen.scale-200.png create mode 100644 shared/VisualElementsManifest.xml create mode 100644 shared/html/applist.html create mode 100644 shared/html/css/pages.css create mode 100644 shared/html/css/popup.css create mode 100644 shared/html/fonts/SETUP.TTF create mode 100644 shared/html/fonts/SETUP.eot create mode 100644 shared/html/fonts/SegoeIcons.eot create mode 100644 shared/html/fonts/SegoeIcons.ttf create mode 100644 shared/html/fonts/fonts.css create mode 100644 shared/html/fonts/segmdl2.eot create mode 100644 shared/html/fonts/segmdl2.ttf create mode 100644 shared/html/fonts/seguisym.eot create mode 100644 shared/html/fonts/seguisym.ttf create mode 100644 shared/html/images/SplashLarge.png create mode 100644 shared/html/images/SplashScreen.png create mode 100644 shared/html/images/splash.default.png create mode 100644 shared/html/images/storelogo.default.png create mode 100644 shared/html/install.html create mode 100644 shared/html/js/animation.js create mode 100644 shared/html/js/bridge.js create mode 100644 shared/html/js/color.js create mode 100644 shared/html/js/dpimodes.js create mode 100644 shared/html/js/event.js create mode 100644 shared/html/js/module.js create mode 100644 shared/html/js/pages.js create mode 100644 shared/html/js/polyfill-ie.js create mode 100644 shared/html/js/popup.js create mode 100644 shared/html/js/promise.js create mode 100644 shared/html/libs/winjs/2.0/css/ui-dark.css create mode 100644 shared/html/libs/winjs/2.0/css/ui-light.css create mode 100644 shared/html/libs/winjs/2.0/js/base.js create mode 100644 shared/html/libs/winjs/2.0/js/en-us/base.strings.js create mode 100644 shared/html/libs/winjs/2.0/js/en-us/ui.strings.js create mode 100644 shared/html/libs/winjs/2.0/js/ui.js diff --git a/AppInstallerReset.sln b/AppInstallerReset.sln index b505453..d5d1e22 100644 --- a/AppInstallerReset.sln +++ b/AppInstallerReset.sln @@ -3,12 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appinstaller", "AppInstallerReset\AppInstallerReset.vcxproj", "{C96219BE-8AFF-4914-8933-B6B7047A94D8}" - ProjectSection(ProjectDependencies) = postProject - {33D91B58-1981-4A3C-B4D1-86EE406CDE12} = {33D91B58-1981-4A3C-B4D1-86EE406CDE12} - {A7753282-AA16-43D9-8ACA-7065239DD702} = {A7753282-AA16-43D9-8ACA-7065239DD702} - EndProjectSection -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pkgread", "pkgread\pkgread.vcxproj", "{A7753282-AA16-43D9-8ACA-7065239DD702}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dlltest", "dlltest\dlltest.vcxproj", "{F5CCB3AB-AC43-432A-862D-4F264760B09B}" @@ -30,6 +24,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PriFile", "PriFileFormat\Pr EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "certmgr", "certmgr\certmgr.vcxproj", "{E04CCAB9-35DB-495C-A279-5B483C707CD0}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appinstaller", "appinstaller\appinstaller.vcxproj", "{F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}" + ProjectSection(ProjectDependencies) = postProject + {8EAC0230-4990-4E41-8E0F-D641D1561396} = {8EAC0230-4990-4E41-8E0F-D641D1561396} + {33D91B58-1981-4A3C-B4D1-86EE406CDE12} = {33D91B58-1981-4A3C-B4D1-86EE406CDE12} + {A7753282-AA16-43D9-8ACA-7065239DD702} = {A7753282-AA16-43D9-8ACA-7065239DD702} + {798ED492-EECE-457D-8FD8-129DA93CE126} = {798ED492-EECE-457D-8FD8-129DA93CE126} + {F5CCB3AB-AC43-432A-862D-4F264760B09B} = {F5CCB3AB-AC43-432A-862D-4F264760B09B} + {E04CCAB9-35DB-495C-A279-5B483C707CD0} = {E04CCAB9-35DB-495C-A279-5B483C707CD0} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,16 +44,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Debug|x64.ActiveCfg = Debug|x64 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Debug|x64.Build.0 = Debug|x64 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Debug|x86.ActiveCfg = Debug|Win32 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Debug|x86.Build.0 = Debug|Win32 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Release|Any CPU.ActiveCfg = Release|Win32 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Release|x64.ActiveCfg = Release|x64 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Release|x64.Build.0 = Release|x64 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Release|x86.ActiveCfg = Release|Win32 - {C96219BE-8AFF-4914-8933-B6B7047A94D8}.Release|x86.Build.0 = Release|Win32 {A7753282-AA16-43D9-8ACA-7065239DD702}.Debug|Any CPU.ActiveCfg = Debug|Win32 {A7753282-AA16-43D9-8ACA-7065239DD702}.Debug|x64.ActiveCfg = Debug|x64 {A7753282-AA16-43D9-8ACA-7065239DD702}.Debug|x64.Build.0 = Debug|x64 @@ -118,6 +112,16 @@ Global {E04CCAB9-35DB-495C-A279-5B483C707CD0}.Release|x64.Build.0 = Release|x64 {E04CCAB9-35DB-495C-A279-5B483C707CD0}.Release|x86.ActiveCfg = Release|Win32 {E04CCAB9-35DB-495C-A279-5B483C707CD0}.Release|x86.Build.0 = Release|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Debug|x64.ActiveCfg = Debug|x64 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Debug|x64.Build.0 = Debug|x64 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Debug|x86.ActiveCfg = Debug|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Debug|x86.Build.0 = Debug|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Release|Any CPU.ActiveCfg = Release|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Release|x64.ActiveCfg = Release|x64 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Release|x64.Build.0 = Release|x64 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Release|x86.ActiveCfg = Release|Win32 + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AppInstallerReset/AppInstallerReset.vcxproj.filters b/AppInstallerReset/AppInstallerReset.vcxproj.filters deleted file mode 100644 index 03c8628..0000000 --- a/AppInstallerReset/AppInstallerReset.vcxproj.filters +++ /dev/null @@ -1,17 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - \ No newline at end of file diff --git a/appinstaller/appinstaller.rc b/appinstaller/appinstaller.rc new file mode 100644 index 0000000000000000000000000000000000000000..fe168acd41520db559689f97353355ee84691a24 GIT binary patch literal 12582 zcmeHN+izS)86O!L6mk)-@kqi@I^rs#fV6YtSE`RNTGHF_nw##GpOI&P74Eo3*#k|$p_ z>}N?Nz@<@Wj<01gSL-$XE2)TQ{RF%oQ4hO&>{`IY4jSYn_IlpInoqn_Kp2s-6hj7 z8ZBR4##y$0&yv>=co^pc`2Gy$J|?{bpPap)-P_KIy zn1ipHg9R&pAE1mwbgE56t&Vd{`rsvaMfw%>qtt9ZCaP^(MqxR3*F6yukuJI3b5*Zl z#%qv=uGce}f<2bdCI!2vWpb@8N$ncNJ$r}WkRz;TZ%1111m2r%9B6Pq^iEwvdu?-| zpM?e%;aLhz^`LJc^-<|d#(*vZpW?&z9Z-KsoPq==Bz0ZpBlGMhT3y&;;3eiEbuAXPXZ%zxK%(5lLJB%L-1btPqURC*>3yv zwps9%oN<9*6Y^#>Rt4{tF|#r_xeBanb=GL7rme!HniOA?v*C;uaA(?e(8uPR^jlp{ zL5_@T$O9L+8UL&!?pzfYp#qbjMwYAGY`J4OAgi0 zZXRQlVHxC}(o4+?vo!fXf%a8Nosw9G45&R-M5CLaqofdh;~?G`mJ!8C%a$Z_Gdc$XcPd^vdw*YN$$M?Lt zYqboc(dcyPz-ul-bE0b|dj)SD8UHYQbHFY7DS8-Y+G(srj@SkVnH4j)TbKM~F3tR! zxi42{w%tTe2leDR^KG_P+P{KUiy`6Cv{Tg80a1#y{yObq=v1XGKIc+|R-475ag_ zdS!Q%MHCaqe2x**8I)0Obq*8P zo|hWD zbH(^Zf7PUAu4nD?IfHp{M=NLLNPx$M_od%4_iw2M^hsPHCI3nVBqqCtQ5z22 z{PTkFPIw2ZE5MgXmh8FS|8P6O4<~|mY zQ3vmo6)i`!N-c_)6o2v7opSpK88-#`5spxQTc!t3=vKlj?}0gpQ4ZSDF)9~}53r9X-3-`)86TY(4a_3u^> z?$E3CBwL$d4l&nQ$mhBZ)+19(_{9BplS2yM;){uCt&Pdp_03Mths3h57RL7+f!g@+ zmG@z^s0mz+T|sRBo-I%Q^m@f>w3f$FwAE|6oO7pWmS9iZi5!z2%7+$&M^WD6am|c@9)ljX`wlKQK@NqTrGS32R9qj8^wIpsyNaB9p@{&AHcII%e`Oz z*W{hr$G2|Zwxcwus`GE2d?&NZyee^n(xa#TY388(OaKf=b8|1WtZkK zaG01>?lDt`%@s3m|Mr~#$NlnQVB=Vydc`cqQusdgew?RDwK|Ud$FEPwx70zp5<04oz{zGjhL*&)lo$e%G_Iz9;#;8|BF> z+k+KG?Z3~So$d8MdE-jy%J$WAzl=M3lK5sRI zCB4peMkja|Z~H+1R|kNrj#*4G%hQXcg(WI2qw?sGUj% zy*!y=+c9Vjb%BIuERCpe=OhIL%yV=Ac~ZT>ri?%5@&N22#YSk}Mmo@b5D z5r4US?|MSK`JL|g>Vuk6#JW#>`U?)*S08LQh8Ai^hUWnFUwxP@N}#H~*U~fZ9$AEu zXmq-Kbb20~OFue2H+`~wFID?t^L+0AOD`1{**ME&rf0iEpR>MJT&NF46!K?F3o?l| z-$Z=LHmzukiK>0Q3F0KJLD3r1u0I>+?(q>{GtozQeeAA#uF~O4eFxU)t6|3ApWW|A n|F`eQPr=3-e?P8y* - {C96219BE-8AFF-4914-8933-B6B7047A94D8} + {F0C84812-0CDF-4AA0-A0F8-F37AC833F39B} Win32Proj - AppInstallerReset + appinstaller 8.1 - appinstaller @@ -31,6 +30,7 @@ true v140 Unicode + true Application @@ -38,6 +38,7 @@ v140 true Unicode + true Application @@ -88,12 +89,13 @@ Level3 Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;HMODULE_MODE_EXE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions) true Windows true + shlwapi.lib;version.lib;dwmapi.lib;$(OutDir)pkgread.lib;$(OutDir)pkgmgr.lib;$(OutDir)certmgr.lib;$(OutDir)priformatcli.lib;$(OutDir)notice.lib;%(AdditionalDependencies) @@ -118,7 +120,7 @@ MaxSpeed true true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;HMODULE_MODE_EXE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions) true @@ -126,6 +128,7 @@ true true true + shlwapi.lib;version.lib;dwmapi.lib;$(OutDir)pkgread.lib;$(OutDir)pkgmgr.lib;$(OutDir)certmgr.lib;$(OutDir)priformatcli.lib;$(OutDir)notice.lib;%(AdditionalDependencies) @@ -147,8 +150,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll + + + + + + + + + + + + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + \ No newline at end of file diff --git a/appinstaller/appinstaller.vcxproj.filters b/appinstaller/appinstaller.vcxproj.filters new file mode 100644 index 0000000..8c0b91e --- /dev/null +++ b/appinstaller/appinstaller.vcxproj.filters @@ -0,0 +1,100 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + + + 资源文件 + + + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + 资源文件 + + + + + + \ No newline at end of file diff --git a/appinstaller/cmdargs.h b/appinstaller/cmdargs.h new file mode 100644 index 0000000..1a14889 --- /dev/null +++ b/appinstaller/cmdargs.h @@ -0,0 +1,161 @@ +#pragma once +#include +#include +#include +#include +#include "nstring.h" +#include "rctools.h" +#include "filepath.h" +#include "raii.h" + +// ǰ׺統ǰ׺Ϊ-"/"ʱҿ롰-args"/args""args" ǵЧ +#define CMDARG_IGNOREPREFIXS 0b001 +// ֵ硰/args=fileҪú׺Чַ +#define CMDARG_ENABLEPARAMS 0b010 +// CMDARG_ENABLEPARAMS ʱΪա /args=file"/args" +#define CMDARG_IGNOREPARAMS 0b100 +// в +struct cmdarg +{ + std::vector prefixs; // ǰ׺Ϊ 0 + std::vector commands; // ȲΪ 0Ϊգ + std::vector postfixs; // ޺׺Ϊ 0 + std::wstring uniquelabel; // Ψһʶ + std::wstring description; // ɰı + DWORD flags; // ־ +}; +#define CMDARG_PREFIXS_DEFAULT {L"-", L"/"} +#define CMDARG_POSTFIXS_DEFAULT {} +std::vector g_argslist = { + {CMDARG_PREFIXS_DEFAULT, {L"silent", L"quiet", L"passive"}, CMDARG_POSTFIXS_DEFAULT, L"silent", GetRCStringSW (0), CMDARG_IGNOREPREFIXS}, + {CMDARG_PREFIXS_DEFAULT, {L"verysilent", L"veryquiet"}, CMDARG_POSTFIXS_DEFAULT, L"verysilent", GetRCStringSW (0), CMDARG_IGNOREPREFIXS}, + {CMDARG_PREFIXS_DEFAULT, {L"multiple", L"filelist"}, {L"="}, L"multiple", GetRCStringSW (0), CMDARG_IGNOREPREFIXS | CMDARG_ENABLEPARAMS} +}; +bool IsFile (const std::wstring &path) +{ + return IsPathExists (path); +} +bool IsURI (const std::wstring &str) +{ + try + { + auto uristr = gcnew System::String (str.c_str ()); + auto uri = gcnew System::Uri (uristr); + return uri != nullptr; + } + catch (...) { return false; } +} +enum class paramtype +{ + string, + file, + uri +}; +struct cmdkey +{ + std::wnstring key; // + paramtype type; // ͣIJǴڵļ·ʱ硰C:\1.txtΪļͬҲΪ uri + operator std::wnstring () { return key; } + operator LPCWSTR () { return key.c_str (); } + cmdkey (const std::wstring &k): key (k) + { + if (IsFile (k)) type = paramtype::file; + else if (IsURI (k)) type = paramtype::uri; + else type = paramtype::string; + } + cmdkey (const std::wstring &k, paramtype pt): key (k), type (pt) {} + bool operator == (const cmdkey &r) const { return key == r.key; } + bool operator > (const cmdkey &r) const { return key > r.key; } + bool operator < (const cmdkey &r) const { return key < r.key; } +}; +struct cmdvalue +{ + std::wstring value; // ֵ + paramtype type; + bool isnull; // ֵָ֧ʱʱֵΪʱΪ档 +}; +// ڴлȡ argv argcargc СΪ 1argv ĵһԪָ startpos Ϊ 1 +void ParseCmdArgs (LPWSTR *argv, DWORD argc, std::map &parseresult, DWORD startpos = 1) +{ + for (size_t i = startpos; i < argc; i ++) + { + std::wnstring arg = argv [i]; + arg = arg.trim (); + if (IsFile (arg)) parseresult [cmdkey (arg, paramtype::file)] = cmdvalue {L"", paramtype::file, true}; + else if (IsURI (arg)) parseresult [cmdkey (arg, paramtype::uri)] = cmdvalue {L"", paramtype::uri, true}; + else + { + for (auto &it : g_argslist) + { + std::set prefixs; + for (auto &it_s : it.prefixs) prefixs.insert (it_s); + int cmdhead = -1; + for (auto &it_s : prefixs) + { + auto plen = GetNormalizeStringLength (it_s); + auto parg = GetStringLeft (arg, plen); + if (it_s == parg) { cmdhead = plen; break; } + } + if (((it.flags & CMDARG_IGNOREPREFIXS) || !it.prefixs.size () || !prefixs.size ()) && cmdhead < 0) + { + if (!arg.length ()) continue; + cmdhead = 0; + } + if (cmdhead < 0) continue; + int postfixhead = -1; + std::set commands; + for (auto &it_s : it.commands) if (GetNormalizeStringLength (it_s)) commands.insert (it_s); + if (commands.empty ()) continue; + for (auto &it_s : commands) + { + auto clen = it_s.length (); + auto carg = GetStringLeft (arg.substr (cmdhead), clen); + if (it_s == carg) { postfixhead = cmdhead + clen; } + } + if (postfixhead < 0) continue; + std::set postfixs; + for (auto &it_s : it.postfixs) if (GetNormalizeStringLength (it_s)) postfixs.insert (it_s); + if (!(it.flags & CMDARG_ENABLEPARAMS)) it.postfixs.clear (); + if ((it.flags & CMDARG_ENABLEPARAMS) && postfixs.size ()) + { + int valuehead = -1; + auto rightpart = StringTrim (GetStringRight (arg, lstrlenW (arg.c_str ()) - postfixhead)); + if (it.flags & CMDARG_IGNOREPARAMS) + { + if (!rightpart.length ()) { parseresult [cmdkey (it.uniquelabel, paramtype::string)] = cmdvalue {L"", paramtype::string, true}; break; } + } + for (auto &it_s : postfixs) + { + auto plen = it_s.length (); + auto parg = GetStringLeft (rightpart, plen); + if (it_s == parg) { valuehead = plen; break; } + } + if (valuehead < 0) continue; + else + { + auto value = rightpart.substr (valuehead); + paramtype ptype = paramtype::string; + if (IsFile (value)) ptype = paramtype::file; + else if (IsURI (StringTrim (value))) ptype = paramtype::uri; + parseresult [cmdkey (it.uniquelabel, paramtype::string)] = cmdvalue {value, ptype, false}; + } + break; + } + else + { + parseresult [cmdkey (it.uniquelabel, paramtype::string)] = cmdvalue {L"", paramtype::string, true}; + break; + } + } + } + } +} +void ParseCmdLine (LPCWSTR lpCommandLine, std::map &parseresult) +{ + int argc = 0; + LPWSTR *alpstr = CommandLineToArgvW (lpCommandLine, &argc); + destruct relt ([&alpstr] () { + if (alpstr) LocalFree (alpstr); + }); + ParseCmdArgs (alpstr, argc, parseresult, 0); +} \ No newline at end of file diff --git a/appinstaller/dynarr.h b/appinstaller/dynarr.h new file mode 100644 index 0000000..7e69982 --- /dev/null +++ b/appinstaller/dynarr.h @@ -0,0 +1,77 @@ +#pragma once +#include +#include +#include + +template bool compare_default (const T &l, const T &r) { return l == r; } +template bool find_vec (std::vector &vec, const T &value, const std::function &callback, std::function compare = compare_default , bool sorted = false) +{ + const size_t n = vec.size (); + if (!compare) compare = compare_default; + if (sorted) + { + size_t left = 0, right = n; + while (left < right) + { + size_t mid = left + (right - left) / 2; + if (compare (vec [mid], value)) + { + callback (mid); + return true; + } + if (vec [mid] < value) left = mid + 1; + else right = mid; + } + return false; + } + if (n < 64) + { + for (size_t i = 0; i < n; i++) + { + if (compare (vec [i], value)) + { + callback (i); + return true; + } + } + return false; + } + const size_t blockSize = 8; + size_t i = 0; + for (; i + blockSize <= n; i += blockSize) + { + for (size_t j = 0; j < blockSize; j ++) + { + if (compare (vec [i + j], value)) + { + callback (i + j); + return true; + } + } + } + for (; i < n; i ++) + { + if (compare (vec [i], value)) + { + callback (i); + return true; + } + } + return false; +} +template void push_unique (std::vector &vec, const T &value, std::function compare = compare_default ) +{ + bool found = find_vec ( + vec, value, + [] (size_t) {}, + compare); + if (!found) vec.push_back (value); +} +template void push_normal (std::vector &vec, const T &value) +{ + vec.push_back (value); +} +template void push_normal (std::vector &target, const std::vector &another) +{ + target.insert (target.end (), another.begin (), another.end ()); +} \ No newline at end of file diff --git a/appinstaller/filepath.h b/appinstaller/filepath.h new file mode 100644 index 0000000..173dd4e --- /dev/null +++ b/appinstaller/filepath.h @@ -0,0 +1,871 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include "strcmp.h" +#include "version.h" +#include "module.h" +typedef version VERSION; +template constexpr T Max (T l, T r) { return l > r ? l : r; } +template constexpr T Max (T l, T m, T r) { return Max (Max (l, r), m); } +template constexpr T Max (T l, T ml, T mr, T r) { return Max (Max (l, ml), Max (mr, r)); } +template std::basic_string replace_substring +( + const std::basic_string &str, + const std::basic_string &from, + const std::basic_string &to +) +{ + if (from.empty ()) return str; + std::basic_string result; + size_t pos = 0; + size_t start_pos; + while ((start_pos = str.find (from, pos)) != std::basic_string::npos) + { + result.append (str, pos, start_pos - pos); + result.append (to); + pos = start_pos + from.length (); + } + result.append (str, pos, str.length () - pos); + return result; +} +std::string GetProgramRootDirectoryA (HMODULE hModule hModule_DefaultParam) +{ + char path [MAX_PATH]; + if (GetModuleFileNameA (hModule, path, MAX_PATH)) + { + std::string dir (path); + size_t pos = dir.find_last_of ("\\/"); + if (pos != std::string::npos) + { + dir = dir.substr (0, pos); + } + return dir; + } + return ""; +} +std::wstring GetProgramRootDirectoryW (HMODULE hModule hModule_DefaultParam) +{ + wchar_t path [MAX_PATH]; + if (GetModuleFileNameW (hModule, path, MAX_PATH)) + { + std::wstring dir (path); + size_t pos = dir.find_last_of (L"\\/"); + if (pos != std::wstring::npos) + { + dir = dir.substr (0, pos); + } + return dir; + } + return L""; +} +std::string EnsureTrailingSlash (const std::string &path) +{ + if (path.empty ()) return path; // ·ֱӷ + + char lastChar = path.back (); + if (lastChar == '\\' || lastChar == '/') + return path; // зֱָӷ + // ϵͳԭ·ʽʵķָ + char separator = (path.find ('/') != std::string::npos) ? '/' : '\\'; + return path + separator; +} +std::wstring EnsureTrailingSlash (const std::wstring &path) +{ + if (path.empty ()) return path; + + wchar_t lastChar = path.back (); + if (lastChar == L'\\' || lastChar == L'/') + return path; + + wchar_t separator = (path.find (L'/') != std::wstring::npos) ? L'/' : L'\\'; + return path + separator; +} +bool IsFileExistsW (LPCWSTR filename) +{ + DWORD dwAttrib = GetFileAttributesW (filename); + return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); +} +bool IsFileExistsA (LPCSTR filename) +{ + DWORD dwAttrib = GetFileAttributesA (filename); + return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); +} +bool IsFileExists (LPWSTR filePath) { return IsFileExistsW (filePath); } +bool IsFileExists (LPCSTR filePath) { return IsFileExistsA (filePath); } +bool IsFileExists (const std::string &filePath) { return IsFileExistsA (filePath.c_str ()); } +bool IsFileExists (const std::wstring &filePath) { return IsFileExistsW (filePath.c_str ()); } +bool IsDirectoryExistsA (LPCSTR path) +{ + DWORD attributes = GetFileAttributesA (path); + return (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY)); +} +bool IsDirectoryExistsW (LPCWSTR path) +{ + DWORD attributes = GetFileAttributesW (path); + return (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY)); +} +bool IsDirectoryExists (const std::string &path) { return IsDirectoryExistsA (path.c_str ()); } +bool IsDirectoryExists (const std::wstring &path) { return IsDirectoryExistsW (path.c_str ()); } +bool IsDirectoryExists (LPCSTR path) { return IsDirectoryExistsA (path); } +bool IsDirectoryExists (LPCWSTR path) { return IsDirectoryExistsW (path); } +bool IsPathExistsW (LPCWSTR filename) +{ + DWORD dwAttrib = GetFileAttributesW (filename); + return (dwAttrib != INVALID_FILE_ATTRIBUTES); +} +bool IsPathExistsA (LPCSTR filename) +{ + DWORD dwAttrib = GetFileAttributesA (filename); + return (dwAttrib != INVALID_FILE_ATTRIBUTES); +} +bool IsPathExists (const std::string &path) { return IsPathExistsA (path.c_str ()); } +bool IsPathExists (const std::wstring &path) { return IsPathExistsW (path.c_str ()); } +bool IsPathExists (LPCSTR path) { return IsPathExistsA (path); } +bool IsPathExists (LPCWSTR path) { return IsPathExistsW (path); } +std::string NormalizePath (const std::string &path) +{ + if (!path.empty () && path.back () == '\\') + return path.substr (0, path.size () - 1); + return path.c_str (); +} +std::wstring NormalizePath (const std::wstring &path) +{ + if (!path.empty () && path.back () == L'\\') + return path.substr (0, path.size () - 1); + return path.c_str (); +} +std::vector EnumSubdirectories (const std::string &directory, bool includeParentPath) +{ + std::vector subdirs; + std::string normPath = NormalizePath (directory); + std::string searchPath = normPath + "\\*"; + WIN32_FIND_DATAA findData; + HANDLE hFind = FindFirstFileA (searchPath.c_str (), &findData); + if (hFind == INVALID_HANDLE_VALUE) return subdirs; + do + { + // "." ".." + if (strcmp (findData.cFileName, ".") == 0 || strcmp (findData.cFileName, "..") == 0) + continue; + // жǷΪĿ¼ + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (includeParentPath) + subdirs.push_back (normPath + "\\" + findData.cFileName); + else + subdirs.push_back (findData.cFileName); + } + } while (FindNextFileA (hFind, &findData)); + FindClose (hFind); + return subdirs; +} +std::vector EnumSubdirectories (const std::wstring &directory, bool includeParentPath) +{ + std::vector subdirs; + std::wstring normPath = NormalizePath (directory); + std::wstring searchPath = normPath + L"\\*"; + WIN32_FIND_DATAW findData; + HANDLE hFind = FindFirstFileW (searchPath.c_str (), &findData); + if (hFind == INVALID_HANDLE_VALUE) return subdirs; + do + { + if (wcscmp (findData.cFileName, L".") == 0 || wcscmp (findData.cFileName, L"..") == 0) + continue; + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (includeParentPath) + subdirs.push_back (normPath + L"\\" + findData.cFileName); + else + subdirs.push_back (findData.cFileName); + } + } while (FindNextFileW (hFind, &findData)); + FindClose (hFind); + return subdirs; +} +std::string GetCurrentProgramPathA (HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (Max (MAX_PATH, GetModuleFileNameA (hModule, nullptr, 0)) + 1); + GetModuleFileNameA (hModule, buf.data (), buf.capacity ()); + return buf.data (); +} +std::wstring GetCurrentProgramPathW (HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (Max (MAX_PATH, GetModuleFileNameW (hModule, nullptr, 0)) + 1); + GetModuleFileNameW (hModule, buf.data (), buf.capacity ()); + return buf.data (); +} +std::string GetCurrentProgramNameA (HMODULE hModule hModule_DefaultParam) { return PathFindFileNameA (GetCurrentProgramPathA (hModule).c_str ()); } +std::wstring GetCurrentProgramNameW (HMODULE hModule hModule_DefaultParam) { return PathFindFileNameW (GetCurrentProgramPathW (hModule).c_str ()); } +VERSION GetExeFileVersion (LPCSTR lpszFilePath) +{ + VERSION ver (0); + DWORD dummy; + DWORD size = GetFileVersionInfoSizeA (lpszFilePath, &dummy); + std::vector pVersionInfo (size); + if (!GetFileVersionInfoA (lpszFilePath, 0, size, pVersionInfo.data ())) + { + return ver; + } + VS_FIXEDFILEINFO* pFileInfo = nullptr; + UINT len = 0; + if (!VerQueryValueA (pVersionInfo.data (), "\\", (LPVOID *)&pFileInfo, &len)) + { + return ver; + } + if (len == 0 || pFileInfo == nullptr) + { + return ver; + } + ver = VERSION ( + HIWORD (pFileInfo->dwFileVersionMS), + LOWORD (pFileInfo->dwFileVersionMS), + HIWORD (pFileInfo->dwFileVersionLS), + LOWORD (pFileInfo->dwFileVersionLS) + ); + return ver; +} +VERSION GetExeFileVersion (LPCWSTR lpswFilePath) +{ + VERSION ver (0); + DWORD dummy; + DWORD size = GetFileVersionInfoSizeW (lpswFilePath, &dummy); + std::vector pVersionInfo (size); + if (!GetFileVersionInfoW (lpswFilePath, 0, size, pVersionInfo.data ())) + { + return ver; + } + VS_FIXEDFILEINFO* pFileInfo = nullptr; + UINT len = 0; + if (!VerQueryValueA (pVersionInfo.data (), "\\", (LPVOID *)&pFileInfo, &len)) + { + return ver; + } + if (len == 0 || pFileInfo == nullptr) + { + return ver; + } + ver = VERSION ( + HIWORD (pFileInfo->dwFileVersionMS), + LOWORD (pFileInfo->dwFileVersionMS), + HIWORD (pFileInfo->dwFileVersionLS), + LOWORD (pFileInfo->dwFileVersionLS) + ); + return ver; +} +VERSION GetExeFileVersion (std::wstring objswFilePath) +{ + return GetExeFileVersion (objswFilePath.c_str ()); +} +VERSION GetExeFileVersion (std::string objszFilePath) +{ + return GetExeFileVersion (objszFilePath.c_str ()); +} +// õǰ̵ĻRunPathProgramPath +void SetupInstanceEnvironment (HMODULE hModule hModule_DefaultParam) +{ + // RunPathΪǰĿ¼޽βбܣ + std::vector currentDir (Max (GetCurrentDirectoryW (0, nullptr), MAX_PATH) + 1); + DWORD len = GetCurrentDirectoryW (currentDir.capacity (), currentDir.data ()); + if (len > 0) + { + std::wstring runPath (currentDir.data ()); + if (!runPath.empty () && (runPath.back () == L'\\' || runPath.back () == L'/')) + { + runPath.pop_back (); + } + SetEnvironmentVariableW (L"RunPath", runPath.c_str ()); + } + // ProgramPathΪĿ¼޽βбܣ + std::vector modulePath (Max (GetModuleFileNameW (hModule, nullptr, 0), MAX_PATH) + 1); + len = GetModuleFileNameW (hModule, modulePath.data (), MAX_PATH); + if (len > 0 && len < MAX_PATH) + { + wchar_t* lastSlash = wcsrchr (modulePath.data (), L'\\'); + if (!lastSlash) lastSlash = wcsrchr (modulePath.data (), L'/'); + if (lastSlash) *lastSlash = L'\0'; + std::wstring programPath (modulePath.data ()); + if (!programPath.empty () && (programPath.back () == L'\\' || programPath.back () == L'/')) + { + programPath.pop_back (); + } + SetEnvironmentVariableW (L"ProgramPath", programPath.c_str ()); + } +} +// ַչ +std::wstring ProcessEnvVars (const std::wstring &input) +{ + DWORD requiredSize = ExpandEnvironmentStringsW (input.c_str (), nullptr, 0); + if (requiredSize == 0) return input; + std::wstring buffer (requiredSize, L'\0'); + if (!ExpandEnvironmentStringsW (input.c_str (), &buffer [0], requiredSize)) + { + return input; + } + buffer.resize (requiredSize - 1); // ȥַֹ + return buffer.c_str (); +} +std::wstring ProcessEnvVars (LPCWSTR input) +{ + return ProcessEnvVars (std::wstring (input)); +} +// ANSIַչ +std::string ProcessEnvVars (const std::string &input) +{ + DWORD requiredSize = ExpandEnvironmentStringsA (input.c_str (), nullptr, 0); + if (requiredSize == 0) return input; + std::string buffer (requiredSize, '\0'); + if (!ExpandEnvironmentStringsA (input.c_str (), &buffer [0], requiredSize)) + { + return input; + } + buffer.resize (requiredSize - 1); // ȥַֹ + return buffer.c_str (); +} +std::string ProcessEnvVars (LPCSTR input) +{ + return ProcessEnvVars (std::string (input)); +} +std::string GetCurrentDirectoryA () +{ + std::vector buf (Max (GetCurrentDirectoryA (0, nullptr), MAX_PATH) + 1); + GetCurrentDirectoryA (buf.size (), buf.data ()); + return buf.data (); +} +std::wstring GetCurrentDirectoryW () +{ + std::vector buf (Max (GetCurrentDirectoryW (0, nullptr), MAX_PATH) + 1); + GetCurrentDirectoryW (buf.size (), buf.data ()); + return buf.data (); +} +std::wstring GetFileDirectoryW (const std::wstring &filePath) +{ + std::vector buf (filePath.capacity () + 1); + lstrcpyW (buf.data (), filePath.c_str ()); + PathRemoveFileSpecW (buf.data ()); + return buf.data (); +} +std::string GetFileDirectoryA (const std::string &filePath) +{ + std::vector buf (filePath.capacity () + 1); + lstrcpyA (buf.data (), filePath.c_str ()); + PathRemoveFileSpecA (buf.data ()); + return buf.data (); +} +size_t EnumerateFilesW (const std::wstring &directory, const std::wstring &filter, + std::vector &outFiles, bool recursive = false) +{ + std::wstring searchPath = directory; + if (!searchPath.empty () && searchPath.back () != L'\\') + { + searchPath += L'\\'; + } + searchPath += filter; + WIN32_FIND_DATAW findData; + HANDLE hFind = FindFirstFileW (searchPath.c_str (), &findData); + if (hFind != INVALID_HANDLE_VALUE) + { + do { + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + outFiles.push_back (directory + L"\\" + findData.cFileName); + } + } while (FindNextFileW (hFind, &findData)); + FindClose (hFind); + } + if (recursive) { + std::wstring subDirSearchPath = directory + L"\\*"; + hFind = FindFirstFileW (subDirSearchPath.c_str (), &findData); + if (hFind != INVALID_HANDLE_VALUE) + { + do { + if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + wcscmp (findData.cFileName, L".") != 0 && wcscmp (findData.cFileName, L"..") != 0) + { + EnumerateFilesW (directory + L"\\" + findData.cFileName, filter, outFiles, true); + } + } while (FindNextFileW (hFind, &findData)); + FindClose (hFind); + } + } + return outFiles.size (); +} +// ǷΪ Windows 豸СдУ +bool IsReservedName (const std::wstring &name) +{ + static const wchar_t* reserved [] = { + L"CON", L"PRN", L"AUX", L"NUL", L"COM1", L"COM2", L"COM3", L"COM4", L"COM5", L"COM6", L"COM7", L"COM8", L"COM9", + L"LPT1", L"LPT2", L"LPT3", L"LPT4", L"LPT5", L"LPT6", L"LPT7", L"LPT8", L"LPT9" + }; + std::wstring upperName = StringToUpper (name); + for (const auto& res : reserved) + { + if (upperName == res || (upperName.rfind (res, 0) == 0 && upperName.length () > wcslen (res) && upperName [wcslen (res)] == L'.')) + { + return true; + } + } + return false; +} +// Windows ļ淶 (Unicode) +bool IsValidWindowsNameW (LPCWSTR name) +{ + if (!name || !*name) return false; + std::wstring wname (name); + if (wname.find_first_of (L"<>:\"/\\|?*") != std::wstring::npos) return false; + if (IsReservedName (wname)) return false; + if (wname.back () == L' ' || wname.back () == L'.') return false; + return true; +} +// Windows ļ淶 (ANSI) +bool IsValidWindowsNameA (LPCSTR name) +{ + if (!name || !*name) return false; + std::string str (name); + if (str.find_first_of ("<>:\"/\\|?*") != std::string::npos) return false; + + // ת ANSI ַ + int len = MultiByteToWideChar (CP_ACP, 0, name, -1, NULL, 0); + if (len <= 0) return false; + std::wstring wname (len - 1, L'\0'); + MultiByteToWideChar (CP_ACP, 0, name, -1, &wname [0], len); + if (IsReservedName (wname)) return false; + if (str.back () == ' ' || str.back () == '.') return false; + return true; +} +bool IsValidWindowsName (LPCSTR name) { return IsValidWindowsNameA (name); } +bool IsValidWindowsName (LPCWSTR name) { return IsValidWindowsNameW (name); } +bool IsValidWindowsName (const std::wstring &name) { return IsValidWindowsName (name.c_str ()); } +bool IsValidWindowsName (const std::string &name) { return IsValidWindowsName (name.c_str ()); } +std::wstring GetRootFolderNameFromFilePath (const std::wstring &lpFilePath) +{ + std::vector szPath (Max (lpFilePath.length (), MAX_PATH) + 1); + if (!PathCanonicalizeW (szPath.data (), lpFilePath.c_str ())) return L""; + if (PathRemoveFileSpecW (szPath.data ()) == FALSE) return L""; + LPCWSTR pszFolder = PathFindFileNameW (szPath.data ()); + if (*pszFolder != L'\0') return std::wstring (pszFolder); + WCHAR rootName [3] = {szPath [0], L':', L'\0'}; + return std::wstring (rootName); +} +std::wstring GetSafeTimestampForFilename () +{ + ::FILETIME ft; + GetSystemTimeAsFileTime (&ft); + SYSTEMTIME st; + FileTimeToSystemTime (&ft, &st); + std::wstringstream wss; + wss << std::setfill (L'0') + << st.wYear + << std::setw (2) << st.wMonth + << std::setw (2) << st.wDay << L"_" + << std::setw (2) << st.wHour + << std::setw (2) << st.wMinute + << std::setw (2) << st.wSecond + << std::setw (3) << st.wMilliseconds; + return wss.str (); +} +size_t EnumFiles ( + const std::wstring &lpDir, + const std::wstring &lpFilter, + std::vector &aszOutput, + bool bOutputWithPath = false, + bool bSortByLetter = false, + bool bIncludeSubDir = false +) { + if (!bIncludeSubDir) aszOutput.clear (); + std::vector filters; + size_t start = 0; + while (start < lpFilter.length ()) + { + size_t pos = lpFilter.find (L'\\', start); + if (pos == std::wstring::npos) pos = lpFilter.length (); + filters.emplace_back (lpFilter.substr (start, pos - start)); + start = pos + 1; + } + + std::function enumDir; + enumDir = [&] (const std::wstring &physicalPath, std::wstring relativePath) + { + WIN32_FIND_DATAW ffd; + HANDLE hFind = FindFirstFileW ((physicalPath + L"\\*").c_str (), &ffd); + if (hFind == INVALID_HANDLE_VALUE) return; + do { + if (wcscmp (ffd.cFileName, L".") == 0 || + wcscmp (ffd.cFileName, L"..") == 0) continue; + const bool isDir = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); + const std::wstring newPhysical = physicalPath + L"\\" + ffd.cFileName; + std::wstring newRelative = relativePath; + if (isDir) { + if (bIncludeSubDir) { + newRelative += ffd.cFileName; + newRelative += L"\\"; + enumDir (newPhysical, newRelative); + } + } + else + { + for (const auto &filter : filters) + { + if (PathMatchSpecW (ffd.cFileName, filter.c_str ())) + { + aszOutput.push_back + ( + bOutputWithPath ? newPhysical : (relativePath + ffd.cFileName) + ); + break; + } + } + } + } while (FindNextFileW (hFind, &ffd)); + FindClose (hFind); + }; + enumDir (lpDir, L""); + if (bSortByLetter) std::sort (aszOutput.begin (), aszOutput.end ()); + return aszOutput.size (); +} +std::wstring GetRelativePath ( + const std::wstring &pszBaseDir, + const std::wstring &pszFullPath, + DWORD cchRelative +) { + std::vector szBase (Max (pszBaseDir.length (), pszFullPath.length (), MAX_PATH) + 1); + wcscpy_s (szBase.data (), MAX_PATH, pszBaseDir.c_str ()); + if (szBase [wcslen (szBase.data ()) - 1] != L'\\') + { + wcscat_s (szBase.data (), MAX_PATH, L"\\"); + } + std::vector buf (Max (MAX_PATH, szBase.size ()) + 1); + BOOL res = PathRelativePathToW ( + buf.data (), + szBase.data (), + FILE_ATTRIBUTE_DIRECTORY, + pszFullPath.c_str (), + FILE_ATTRIBUTE_NORMAL + ); + if (res) return buf.data (); + else return L""; +} +size_t EnumDirectory ( + const std::wstring &lpDir, + std::vector &aszOutput, + bool bOutputWithPath = false, + bool bSortByLetter = false, + bool bIncludeSubDir = false +) { + aszOutput.clear (); + std::function enumDir; + enumDir = [&] (const std::wstring &physicalPath, const std::wstring &relativePath) { + WIN32_FIND_DATAW ffd; + HANDLE hFind = FindFirstFileW ((physicalPath + L"\\*").c_str (), &ffd); + if (hFind == INVALID_HANDLE_VALUE) return; + do + { + const std::wstring name = ffd.cFileName; + if (name == L"." || name == L"..") continue; + const bool isDir = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + std::wstring newPhysical = physicalPath + L"\\" + name; + std::wstring newRelative = relativePath + name; + if (isDir) + { + if (bIncludeSubDir) enumDir (newPhysical, newRelative + L"\\"); + if (bOutputWithPath) aszOutput.push_back (newPhysical); + else aszOutput.push_back (newRelative); + } + } while (FindNextFileW (hFind, &ffd)); + FindClose (hFind); + }; + enumDir (lpDir, L""); + if (bSortByLetter) std::sort (aszOutput.begin (), aszOutput.end ()); + return aszOutput.size (); +} + +static DWORD CALLBACK ProgressRoutine ( + LARGE_INTEGER TotalFileSize, + LARGE_INTEGER TotalBytesTransferred, + LARGE_INTEGER /*StreamSize*/, + LARGE_INTEGER /*StreamBytesTransferred*/, + DWORD /*dwStreamNumber*/, + DWORD /*dwCallbackReason*/, + HANDLE /*hSourceFile*/, + HANDLE /*hDestinationFile*/, + LPVOID lpData +) { + auto *pCallback = reinterpret_cast *> (lpData); + if (pCallback && *pCallback) + { + int progress = static_cast ( + (TotalBytesTransferred.QuadPart * 100) / TotalFileSize.QuadPart + ); + (*pCallback) (progress); + } + return PROGRESS_CONTINUE; +} +bool RenameFileW ( + const std::wstring &lpSrcPath, + const std::wstring &lpDestPath, + std::function fProgress = nullptr +) { + LPPROGRESS_ROUTINE pRoutine = nullptr; + LPVOID pData = nullptr; + if (fProgress) + { + pRoutine = ProgressRoutine; + pData = &fProgress; + } + DWORD flags = MOVEFILE_COPY_ALLOWED; + BOOL ok = MoveFileWithProgressW ( + lpSrcPath.c_str (), + lpDestPath.c_str (), + pRoutine, + pData, + flags + ); + return ok != FALSE; +} +bool RenameFileA ( + const std::string &lpSrcPath, + const std::string &lpDestPath, + std::function fProgress = nullptr +) { + LPPROGRESS_ROUTINE pRoutine = nullptr; + LPVOID pData = nullptr; + if (fProgress) + { + pRoutine = ProgressRoutine; + pData = &fProgress; + } + DWORD flags = MOVEFILE_COPY_ALLOWED; + BOOL ok = MoveFileWithProgressA ( + lpSrcPath.c_str (), + lpDestPath.c_str (), + pRoutine, + pData, + flags + ); + return ok != FALSE; +} +bool RenameFileW (const std::wstring &lpSrcDir, const std::wstring &lpSrcName, const std::wstring &lpDestName, std::function fProgress = nullptr) +{ + struct BuildTask + { + LPWSTR src = nullptr, dest = nullptr; + ~BuildTask () + { + if (src != nullptr) + { + delete [] src; + src = nullptr; + } + if (dest != nullptr) + { + delete [] dest; + dest = nullptr; + } + } + }; + BuildTask bt; + bt.src = new WCHAR [lpSrcDir.length () + lpSrcName.length () + 2]; + bt.dest = new WCHAR [lpSrcDir.length () + lpDestName.length () + 2]; + PathCombineW (bt.src, lpSrcDir.c_str (), lpSrcName.c_str ()); + PathCombineW (bt.dest, lpSrcDir.c_str (), lpDestName.c_str ()); + return RenameFileW (bt.src, bt.dest, fProgress); +} +bool RenameFileA (const std::string &lpSrcDir, const std::string &lpSrcName, const std::string &lpDestName, std::function fProgress = nullptr) +{ + struct BuildTask + { + LPSTR src = nullptr, dest = nullptr; + ~BuildTask () + { + if (src != nullptr) + { + delete [] src; + src = nullptr; + } + if (dest != nullptr) + { + delete [] dest; + dest = nullptr; + } + } + }; + BuildTask bt; + bt.src = new CHAR [lpSrcDir.length () + lpSrcName.length () + 2]; + bt.dest = new CHAR [lpSrcDir.length () + lpDestName.length () + 2]; + PathCombineA (bt.src, lpSrcDir.c_str (), lpSrcName.c_str ()); + PathCombineA (bt.dest, lpSrcDir.c_str (), lpDestName.c_str ()); + return RenameFileA (bt.src, bt.dest, fProgress); +} +bool RenameFile (const std::wstring &lpSrcPath, const std::wstring &lpDestPath, std::function fProgress = nullptr) +{ + return RenameFileW (lpSrcPath, lpDestPath, fProgress); +} +bool RenameFile (const std::string &lpSrcPath, const std::string &lpDestPath, std::function fProgress = nullptr) +{ + return RenameFileA (lpSrcPath, lpDestPath, fProgress); +} +bool RenameFile (const std::wstring &lpSrcDir, const std::wstring &lpSrcName, const std::wstring &lpDestName, std::function fProgress = nullptr) +{ + return RenameFileW (lpSrcDir, lpSrcName, lpDestName, fProgress); +} +bool RenameFile (const std::string &lpSrcDir, const std::string &lpSrcName, const std::string &lpDestName, std::function fProgress = nullptr) +{ + return RenameFileA (lpSrcDir, lpSrcName, lpDestName, fProgress); +} +bool RenameDirectoryW ( + const std::wstring &lpSrcPath, + const std::wstring &lpDestPath, + std::function fProgress = nullptr +) { + LPPROGRESS_ROUTINE pRoutine = nullptr; + LPVOID pData = nullptr; + if (fProgress) + { + pRoutine = ProgressRoutine; + pData = &fProgress; + } + DWORD flags = MOVEFILE_COPY_ALLOWED; + BOOL ok = MoveFileWithProgressW ( + lpSrcPath.c_str (), + lpDestPath.c_str (), + pRoutine, + pData, + flags + ); + return ok != FALSE; +} +bool RenameDirectoryA ( + const std::string &lpSrcPath, + const std::string &lpDestPath, + std::function fProgress = nullptr +) { + LPPROGRESS_ROUTINE pRoutine = nullptr; + LPVOID pData = nullptr; + if (fProgress) + { + pRoutine = ProgressRoutine; + pData = &fProgress; + } + DWORD flags = MOVEFILE_COPY_ALLOWED; + BOOL ok = MoveFileWithProgressA ( + lpSrcPath.c_str (), + lpDestPath.c_str (), + pRoutine, + pData, + flags + ); + return ok != FALSE; +} +bool RenameDirectoryW ( + const std::wstring &lpParentDir, + const std::wstring &lpSrcName, + const std::wstring &lpDestName, + std::function fProgress = nullptr +) { + struct PathBuilder + { + LPWSTR src = nullptr; + LPWSTR dest = nullptr; + ~PathBuilder () + { + delete [] src; + delete [] dest; + } + } pb; + pb.src = new WCHAR [lpParentDir.length () + lpSrcName.length () + 2]; + pb.dest = new WCHAR [lpParentDir.length () + lpDestName.length () + 2]; + PathCombineW (pb.src, lpParentDir.c_str (), lpSrcName.c_str ()); + PathCombineW (pb.dest, lpParentDir.c_str (), lpDestName.c_str ()); + return RenameDirectoryW (pb.src, pb.dest, fProgress); +} +bool RenameDirectoryA ( + const std::string &lpParentDir, + const std::string &lpSrcName, + const std::string &lpDestName, + std::function fProgress = nullptr +) { + struct PathBuilder + { + LPSTR src = nullptr; + LPSTR dest = nullptr; + ~PathBuilder () + { + delete [] src; + delete [] dest; + } + } pb; + pb.src = new CHAR [lpParentDir.length () + lpSrcName.length () + 2]; + pb.dest = new CHAR [lpParentDir.length () + lpDestName.length () + 2]; + PathCombineA (pb.src, lpParentDir.c_str (), lpSrcName.c_str ()); + PathCombineA (pb.dest, lpParentDir.c_str (), lpDestName.c_str ()); + return RenameDirectoryA (pb.src, pb.dest, fProgress); +} +bool RenameDirectory ( + const std::wstring &src, + const std::wstring &dst, + std::function fProgress = nullptr +) { + return RenameDirectoryW (src, dst, fProgress); +} +bool RenameDirectory ( + const std::string &src, + const std::string &dst, + std::function fProgress = nullptr +) { + return RenameDirectoryA (src, dst, fProgress); +} +bool RenameDirectory ( + const std::wstring &parentDir, + const std::wstring &srcName, + const std::wstring &dstName, + std::function fProgress = nullptr +) { + return RenameDirectoryW (parentDir, srcName, dstName, fProgress); +} +bool RenameDirectory ( + const std::string &parentDir, + const std::string &srcName, + const std::string &dstName, + std::function fProgress = nullptr +) { + return RenameDirectoryA (parentDir, srcName, dstName, fProgress); +} +std::wstring CombinePath (const std::wstring &left, const std::wstring &right) +{ + std::vector buf (left.capacity () + right.capacity () + 2); + PathCombineW (buf.data (), left.c_str (), right.c_str ()); + return buf.data (); +} +#ifdef PathCommonPrefix +#undef PathCommonPrefix +#endif +std::wstring PathCommonPrefix (const std::wstring &file1, const std::wstring &file2) +{ + std::vector buf (Max (file1.capacity (), file2.capacity (), MAX_PATH) + 2); + PathCommonPrefixW (file1.c_str (), file2.c_str (), buf.data ()); + return buf.data (); +} +#undef GetFullPathName +std::wstring GetFullPathName (const std::wstring &lpFileName) +{ + if (lpFileName.empty ()) return L""; + DWORD length = GetFullPathNameW (lpFileName.c_str (), 0, nullptr, nullptr); + if (length == 0) return L""; + std::vector buffer (length + 1, L'\0'); + DWORD result = GetFullPathNameW (lpFileName.c_str (), length, buffer.data (), nullptr); + if (result == 0) return L""; + return std::wstring (buffer.data (), result); +} +bool PathEquals (const std::wstring &path1, const std::wstring &path2) +{ + size_t maxlen = Max (path1.capacity () + 1, path2.capacity () + 1, MAX_PATH); + std::vector buf1 (maxlen), buf2 (maxlen); + PathCanonicalizeW (buf1.data (), path1.c_str ()); + PathCanonicalizeW (buf2.data (), path2.c_str ()); + return IsNormalizeStringEquals (buf1.data (), buf2.data ()); +} \ No newline at end of file diff --git a/appinstaller/ieshell.h b/appinstaller/ieshell.h new file mode 100644 index 0000000..9d059cf --- /dev/null +++ b/appinstaller/ieshell.h @@ -0,0 +1,46 @@ +#pragma once +#include +#include +#include +#include "filepath.h" +void SetWebBrowserEmulation () +{ + std::wstring instname = GetCurrentProgramNameW (); + BOOL isWow64 = FALSE; + IsWow64Process (GetCurrentProcess (), &isWow64); + HKEY hKey; + LPCWSTR keyPath = isWow64 + ? L"SOFTWARE\\WOW6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION" + : L"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION"; + LONG result = RegOpenKeyExW (HKEY_CURRENT_USER, keyPath, 0, KEY_WRITE, &hKey); + if (result == ERROR_SUCCESS) + { + DWORD value = 11001; + RegSetValueExW (hKey, instname.c_str (), 0, REG_DWORD, reinterpret_cast (&value), sizeof (value)); + RegCloseKey (hKey); + } +} +// ϵͳװ Internet Explorer 汾ţ 891011 +int GetInternetExplorerVersionMajor () +{ + HKEY hKey; + LPCWSTR IEKeyPath = L"SOFTWARE\\Microsoft\\Internet Explorer"; + if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, IEKeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) return 0; + WCHAR buffer [128] = {0}; + DWORD bufferSize = sizeof (buffer); + DWORD type = 0; + std::wstring versionStr; + if (RegQueryValueExW (hKey, L"svcVersion", NULL, &type, (LPBYTE)buffer, &bufferSize) == ERROR_SUCCESS) versionStr = buffer; + else + { + bufferSize = sizeof (buffer); + if (RegQueryValueExW (hKey, L"Version", NULL, &type, (LPBYTE)buffer, &bufferSize) == ERROR_SUCCESS) versionStr = buffer; + } + RegCloseKey (hKey); + if (versionStr.empty ()) return 0; + int major = 0; + swscanf_s (versionStr.c_str (), L"%d", &major); + return major; +} +bool IsInternetExplorer10 () { return GetInternetExplorerVersionMajor () == 10; } +bool IsInternetExplorer11AndLater () { return GetInternetExplorerVersionMajor () >= 11; } diff --git a/appinstaller/initfile.h b/appinstaller/initfile.h new file mode 100644 index 0000000..f97ce89 --- /dev/null +++ b/appinstaller/initfile.h @@ -0,0 +1,488 @@ +#pragma once +#ifndef _CRT_NON_CONFORMING_SWPRINTFS +#define _CRT_NON_CONFORMING_SWPRINTFS +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "strcode.h" +#include "nstring.h" +#include "typestrans.h" + +template std::wstring TypeToString (T value, const std::wstring &reserve = L"") { return std::to_wstring (value); } +template std::string TypeToString (T value, const std::string &reserve = "") { return std::to_string (value); } + +std::string GetPrivateProfileStringA (const std::string &filePath, const std::string §ion, const std::string &key, LPCSTR defaultValue = "") +{ + char buf [32768] = {0}; + GetPrivateProfileStringA (section.c_str (), key.c_str (), defaultValue, buf, 32767, filePath.c_str ()); + return buf; +} +std::wstring GetPrivateProfileStringW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key, LPCWSTR defaultValue = L"") +{ + WCHAR buf [32768] = {0}; + GetPrivateProfileStringW (section.c_str (), key.c_str (), defaultValue, buf, 32767, filePath.c_str ()); + return buf; +} +UINT GetPrivateProfileIntA (const std::string &filePath, const std::string §ion, const std::string &key, INT defaultValue = 0) +{ + return GetPrivateProfileIntA (section.c_str (), key.c_str (), defaultValue, filePath.c_str ()); +} +UINT GetPrivateProfileIntW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key, INT defaultValue = 0) +{ + return GetPrivateProfileIntW (section.c_str (), key.c_str (), defaultValue, filePath.c_str ()); +} +BOOL WritePrivateProfileStringA (const std::string &filePath, const std::string §ion, const std::string &key, const std::string &value) +{ + return WritePrivateProfileStringA (section.c_str (), key.c_str (), value.c_str (), filePath.c_str ()); +} +BOOL WritePrivateProfileStringW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key, const std::wstring &value) +{ + return WritePrivateProfileStringW ( section.c_str (), key.c_str (), value.c_str (), filePath.c_str ()); +} +size_t GetPrivateProfileSectionA (const std::string &filePath, const std::string §ion, std::vector &output) +{ + char buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionA (section.c_str (), buf, sizeof (buf), filePath.c_str ()); + output.clear (); + if (len == 0) return 0; + char *ptr = buf; + while (*ptr) + { + output.emplace_back (ptr); + ptr += strlen (ptr) + 1; + } + return output.size (); +} +size_t GetPrivateProfileSectionW (const std::wstring &filePath, const std::wstring §ion, std::vector &output) +{ + WCHAR buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionW (section.c_str (), buf, sizeof (buf) / sizeof (WCHAR), filePath.c_str ()); + output.clear (); + if (len == 0) return 0; + WCHAR *ptr = buf; + while (*ptr) + { + output.emplace_back (ptr); + ptr += wcslen (ptr) + 1; + } + return output.size (); +} +size_t GetPrivateProfileSectionNamesA (const std::string &filePath, std::vector &output) +{ + char buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionNamesA (buf, sizeof (buf), filePath.c_str ()); + output.clear (); + if (len == 0) return 0; + char *ptr = buf; + while (*ptr) + { + output.emplace_back (ptr); + ptr += strlen (ptr) + 1; + } + return output.size (); +} +size_t GetPrivateProfileSectionNamesW (const std::wstring &filePath, std::vector &output) +{ + WCHAR buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionNamesW (buf, sizeof (buf) / sizeof (WCHAR), filePath.c_str ()); + output.clear (); + if (len == 0) return 0; + WCHAR *ptr = buf; + while (*ptr) + { + output.emplace_back (ptr); + ptr += wcslen (ptr) + 1; + } + return output.size (); +} +bool WritePrivateProfileSectionA (const std::string &filePath, const std::string §ion, const std::vector &lines) +{ + std::string buf; + for (const auto &line : lines) buf.append (line).push_back ('\0'); + buf.push_back ('\0'); + return WritePrivateProfileSectionA (section.c_str (), buf.c_str (), filePath.c_str ()) != 0; +} +bool WritePrivateProfileSectionW (const std::wstring &filePath, const std::wstring §ion, const std::vector &lines) +{ + std::wstring buf; + for (const auto &line : lines) buf.append (line).push_back (L'\0'); + buf.push_back (L'\0'); // ˫ \0 β + return WritePrivateProfileSectionW (section.c_str (), buf.c_str (), filePath.c_str ()) != 0; +} +bool GetPrivateProfileStructA (const std::string &filePath, const std::string §ion, const std::string &key, void *output, UINT size) +{ + return GetPrivateProfileStructA (section.c_str (), key.c_str (), output, size, filePath.c_str ()) != 0; +} +bool WritePrivateProfileStructA (const std::string &filePath, const std::string §ion, const std::string &key, void *data, UINT size) +{ + return WritePrivateProfileStructA (section.c_str (), key.c_str (), data, size, filePath.c_str ()) != 0; +} +bool GetPrivateProfileStructW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key, void *output, UINT size) +{ + return GetPrivateProfileStructW (section.c_str (), key.c_str (), output, size, filePath.c_str ()) != 0; +} +bool WritePrivateProfileStructW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key, void *data, UINT size) +{ + return WritePrivateProfileStructW (section.c_str (), key.c_str (), data, size, filePath.c_str ()) != 0; +} +size_t GetPrivateProfileKeysW (const std::wstring &filePath, const std::wstring §ion, std::vector &keys) +{ + WCHAR buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionW (section.c_str (), buf, sizeof (buf) / sizeof (WCHAR), filePath.c_str ()); + keys.clear (); + if (len == 0) return 0; + WCHAR* ptr = buf; + while (*ptr) + { + std::wstring line = ptr; + size_t pos = line.find (L'='); + if (pos != std::wstring::npos) keys.push_back (line.substr (0, pos)); + ptr += wcslen (ptr) + 1; + } + return keys.size (); +} +size_t GetPrivateProfileKeysA (const std::string &filePath, const std::string §ion, std::vector &keys) +{ + char buf [32768] = {0}; + DWORD len = GetPrivateProfileSectionA (section.c_str (), buf, sizeof (buf), filePath.c_str ()); + keys.clear (); + if (len == 0) + return 0; + char *ptr = buf; + while (*ptr) + { + std::string line = ptr; + size_t pos = line.find ('='); + if (pos != std::string::npos) keys.push_back (line.substr (0, pos)); + ptr += strlen (ptr) + 1; + } + return keys.size (); +} +bool DeletePrivateProfileKeyA (const std::string &filePath, const std::string §ion, const std::string &key) +{ + return WritePrivateProfileStringA (section.c_str (), key.c_str (), NULL, filePath.c_str ()) != FALSE; +} +bool DeletePrivateProfileKeyW (const std::wstring &filePath, const std::wstring §ion, const std::wstring &key) +{ + return WritePrivateProfileStringW (section.c_str (), key.c_str (), NULL, filePath.c_str ()) != FALSE; +} +bool DeletePrivateProfileSectionA (const std::string &filePath, const std::string §ion) +{ + return WritePrivateProfileStringA (section.c_str (), NULL, NULL, filePath.c_str ()) != FALSE; +} +bool DeletePrivateProfileSectionW (const std::wstring &filePath, const std::wstring §ion) +{ + return WritePrivateProfileStringW (section.c_str (), NULL, NULL, filePath.c_str ()) != FALSE; +} + +class initkey +{ + public: + using pstring = std::string &; + using pwstring = std::wstring &; + using pcstring = const std::string &; + using pcwstring = const std::wstring &; + private: + pcwstring filepath; + pcwstring section; + template T read_t (T defaultvalue, Func process) const + { + auto res = read_wstring (std::to_wstring ((Trans)defaultvalue)); + if (IsNormalizeStringEmpty (res)) return defaultvalue; + return (T)process (res.c_str ()); + } + template bool write_t (T value) { return write_string (std::to_wstring (value)); } + public: + std::wstring key; + initkey (pcwstring path, pcwstring sect, pcwstring k): filepath (path), section (sect), key (k) {} + std::wstring read_wstring (pcwstring defaultvalue = L"") const { return GetPrivateProfileStringW (filepath, section, key, defaultvalue.c_str ()); } + std::string read_string (pcstring defaultvalue = "") const { return WStringToString (read_wstring (StringToWString (defaultvalue))); } + short read_short (short defaultvalue = 0) const { return read_t (defaultvalue, _wtoi16); } + unsigned short read_ushort (unsigned short defaultvalue = 0) const { return read_t (defaultvalue, _wtoui16); } + int read_int (int defaultvalue = 0) const { return read_t (defaultvalue, _wtoi); } + unsigned int read_uint (unsigned int defaultvalue = 0) const { return read_t (defaultvalue, _wtou); } + long read_long (long defaultvalue = 0) const { return read_t (defaultvalue, _wtol); } + unsigned long read_ulong (unsigned long defaultvalue = 0) const { return read_t (defaultvalue, _wtoul); } + long long read_llong (long long defaultvalue = 0) const { return read_t (defaultvalue, _wtoll); } + unsigned long long read_ullong (unsigned long long defaultvalue = 0) const { return read_t (defaultvalue, _wtou64); } + float read_float (float defaultvalue = 0) const { return read_t (defaultvalue, _wtof); } + double read_double (double defaultvalue = 0) const { return read_t (defaultvalue, _wtod); } + bool read_bool (bool defaultvalue = false) const + { + std::wnstring res = read_wstring (defaultvalue ? L"true" : L"false"); + if (res.empty ()) return defaultvalue; + if (res.equals (L"true") || res.equals (L"yes") || res.equals (L"zhen") || res.equals (L"") || res.equals (L"1") || _wtoi (res.c_str ()) != 0) return true; + else if (res.equals (L"false") || res.equals (L"no") || res.equals (L"jia") || res.equals (L"") || res.equals (L"0")) return false; + else return defaultvalue; + } + int8_t read_i8 (int8_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoi8); } + uint8_t read_u8 (uint8_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoui8); } + int16_t read_i16 (int16_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoi16); } + uint16_t read_u16 (uint16_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoui16); } + int32_t read_i32 (int32_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoi32); } + uint32_t read_u32 (uint32_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoui32); } + int64_t read_i64 (int64_t defaultvalue = 0) const { return read_t (defaultvalue, _wtoi64); } + uint64_t read_u64 (uint64_t defaultvalue = 0) const { return read_t (defaultvalue, _wtou64); } + bool read_struct (void *output, size_t size) const { return GetPrivateProfileStructW (filepath, section, key, output, size); } + template bool read_struct (T &structinst) const { return read_struct (&structinst, sizeof (structinst)); } + bool write_string (pcwstring value) { return write (value); } + bool write_string (pcstring value) { return write (value); } + bool write (pcwstring value) { return WritePrivateProfileStringW (filepath, section, key, value); } + bool write (pcstring value) { return write (StringToWString (value)); } + bool write (int value) { return write_t (value); } + bool write (unsigned int value) { return write_t (value); } + bool write (short value) { return write_t (value); } + bool write (unsigned short value) { return write_t (value); } + bool write (long value) { return write_t (value); } + bool write (unsigned long value) { return write_t (value); } + bool write (long long value) { return write_t (value); } + bool write (unsigned long long value) { return write_t (value); } + bool write (int8_t value) { return write_t ((int16_t)value); } + bool write (uint8_t value) { return write_t ((uint16_t)value); } + bool write (float value) { return write_t (value); } + bool write (double value) { return write_t (value); } + bool write (bool value) { return write (value ? L"true" : L"false"); } + bool write (void *buf, size_t bufsize) { return WritePrivateProfileStructW (filepath, section, key, buf, bufsize); } + operator std::wstring () { return read_wstring (); } + operator std::string () { return read_string (); } + template initkey &operator = (T value) { write (value); return *this; } + initkey &operator = (const initkey &) = delete; + // ɾ + bool clear () { return DeletePrivateProfileKeyW (filepath, section, key); } + bool empty () const { return read_wstring ().empty (); } +#define OPERATOR_TYPE_READ(_type_, _method_) \ +operator _type_ () { return _method_ (); } + OPERATOR_TYPE_READ (int, read_int) + OPERATOR_TYPE_READ (unsigned int, read_uint) + OPERATOR_TYPE_READ (long, read_long) + OPERATOR_TYPE_READ (unsigned long, read_ulong) + OPERATOR_TYPE_READ (long long, read_llong) + OPERATOR_TYPE_READ (unsigned long long, read_ullong) + OPERATOR_TYPE_READ (short, read_short) + OPERATOR_TYPE_READ (unsigned short, read_ushort) + OPERATOR_TYPE_READ (float, read_float) + OPERATOR_TYPE_READ (double, read_double) + OPERATOR_TYPE_READ (bool, read_bool) +#ifdef OPERATOR_TYPE_READ +#undef OPERATOR_TYPE_READ +#endif +}; +class initsection +{ + private: + const std::wstring &filepath; + template T read_t (const std::basic_string &key, T defaultvalue, Func process) const + { + std::basic_string temp; + auto res = read_string (key, TypeToString ((Trans)defaultvalue, temp)); + if (IsNormalizeStringEmpty (res)) return defaultvalue; + return (T)process (res.c_str ()); + } + template bool write_t (const std::basic_string &key, T value) + { + std::basic_string temp; + return write_string (key, TypeToString (value, temp)); + } + public: + using pcstring = const std::string &; + using pcwstring = const std::wstring &; + std::wstring section; + initsection (const std::wstring &path, const std::wstring §): filepath (path), section (sect) {} + size_t keys (std::vector &output) const { return GetPrivateProfileKeysW (filepath, section, output); } + size_t keys (std::vector &output) const { return GetPrivateProfileKeysA (WStringToString (filepath), WStringToString (section), output); } + bool key_values (const std::vector &lines) { return WritePrivateProfileSectionW (filepath, section, lines); } + bool key_values (const std::vector &lines) { return WritePrivateProfileSectionA (WStringToString (filepath), WStringToString (section), lines); } + size_t key_values (std::vector &output) const { return GetPrivateProfileSectionW (filepath, section, output); } + size_t key_values (std::vector &output) const { return GetPrivateProfileSectionA (WStringToString (filepath), WStringToString (section), output); } + std::wstring read_string (const std::wstring &key, const std::wstring &defaultvalue = L"") const { return GetPrivateProfileStringW (filepath, section, key, defaultvalue.c_str ()); } + std::string read_string (const std::string &key, const std::string &defaultvalue = "") const { return WStringToString (read_string (StringToWString (key), StringToWString (defaultvalue))); } + std::wstring read_wstring (const std::wstring &key, const std::wstring &defaultvalue = L"") const { return read_string (key, defaultvalue); } + int read_int (const std::wstring &key, int defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoi); } + int read_int (const std::string &key, int defaultvalue = 0) const { return read_t (key, defaultvalue, atoi); } + unsigned int read_uint (const std::wstring &key, unsigned int defaultvalue = 0) const { return read_t (key, defaultvalue, _wtou); } + unsigned int read_uint (const std::string &key, unsigned int defaultvalue = 0) const { return read_t (key, defaultvalue, atou); } + long read_long (const std::wstring &key, long defaultvalue = 0) const { return read_t (key, defaultvalue, _wtol); } + long read_long (const std::string &key, long defaultvalue = 0) const { return read_t (key, defaultvalue, atol); } + unsigned long read_ulong (const std::wstring &key, unsigned long defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoul); } + unsigned long read_ulong (const std::string &key, unsigned long defaultvalue = 0) const { return read_t (key, defaultvalue, atoul); } + long long read_llong (const std::wstring &key, long long defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoll); } + long long read_llong (const std::string &key, long long defaultvalue = 0) const { return read_t (key, defaultvalue, atoll); } + unsigned long long read_ullong (const std::wstring &key, unsigned long long defaultvalue = 0) const { return read_t (key, defaultvalue, _wtou64); } + unsigned long long read_ullong (const std::string &key, unsigned long long defaultvalue = 0) const { return read_t (key, defaultvalue, atou64); } + int8_t read_i8 (const std::wstring &key, int8_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoi8); } + int8_t read_i8 (const std::string &key, int8_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoi8); } + uint8_t read_u8 (const std::wstring &key, uint8_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoui8); } + uint8_t read_u8 (const std::string &key, uint8_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoui8); } + int16_t read_i16 (const std::wstring &key, int16_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoi16); } + int16_t read_i16 (const std::string &key, int16_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoi16); } + short read_short (pcwstring key, short defaultvalue = 0) const { return read_i16 (key, defaultvalue); } + short read_short (pcstring key, short defaultvalue = 0) const { return read_i16 (key, defaultvalue); } + unsigned short read_ushort (pcwstring key, unsigned short defaultvalue = 0) const { return read_u16 (key, defaultvalue); } + unsigned short read_ushort (pcstring key, unsigned short defaultvalue = 0) const { return read_u16 (key, defaultvalue); } + uint16_t read_u16 (const std::wstring &key, uint16_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoui16); } + uint16_t read_u16 (const std::string &key, uint16_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoui16); } + int32_t read_i32 (const std::wstring &key, int32_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoi32); } + int32_t read_i32 (const std::string &key, int32_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoi32); } + uint32_t read_u32 (const std::wstring &key, uint32_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoui32); } + uint32_t read_u32 (const std::string &key, uint32_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoui32); } + int64_t read_i64 (const std::wstring &key, int64_t defaultvalue = 0) const { return read_t (key, defaultvalue, _wtoi64); } + int64_t read_i64 (const std::string &key, int64_t defaultvalue = 0) const { return read_t (key, defaultvalue, atoi64); } + uint64_t read_u64 (const std::wstring &key, uint64_t defaultvalue = 0) const { return read_ullong (key, defaultvalue); } + uint64_t read_u64 (const std::string &key, uint64_t defaultvalue = 0) const { return read_ullong (key, defaultvalue); } + float read_float (const std::wstring &key, float defaultvalue = 0) const { return read_t (key, defaultvalue, _wtof); } + double read_double (const std::wstring &key, double defaultvalue = 0) const { return read_t (key, defaultvalue, _wtod); } + bool read_bool (const std::wstring &key, bool defaultvalue = false) const + { + std::wnstring res = read_string (key, defaultvalue ? L"true" : L"false"); + if (res.empty ()) return defaultvalue; + if (res.equals (L"true") || res.equals (L"yes") || res.equals (L"zhen") || res.equals (L"") || res.equals (L"1") || _wtoi (res.c_str ()) != 0) return true; + else if (res.equals (L"false") || res.equals (L"no") || res.equals (L"jia") || res.equals (L"") || res.equals (L"0")) return false; + else return defaultvalue; + } + bool read_bool (const std::string &key, bool defaultvalue = false) const { return read_bool (StringToWString (key), defaultvalue); } + bool read_struct (const std::wstring &key, void *output, size_t size) const { return GetPrivateProfileStructW (filepath, section, key, output, size); } + template bool read_struct (const std::wstring &key, T &structinst) const { return read_struct (key, &structinst, sizeof (structinst)); } + bool write_string (const std::wstring &key, const std::wstring &value) { return WritePrivateProfileStringW (filepath, section, key, value); } + bool write_string (const std::string &key, const std::string &value) { return write_string (StringToWString (key), StringToWString (value)); } + bool write (const std::wstring &key, const std::wstring &value) { return write_string (key, value); } + bool write (const std::string &key, const std::string &value) { return write_string (key, value); } + bool write (pcwstring key, short value) { return write_t (key, value); } + bool write (pcwstring key, unsigned short value) { return write_t (key, value); } + bool write (pcwstring key, int value) { return write_t (key, value); } + bool write (pcwstring key, unsigned int value) { return write_t (key, value); } + bool write (pcwstring key, long value) { return write_t (key, value); } + bool write (pcwstring key, unsigned long value) { return write_t (key, value); } + bool write (pcwstring key, long long value) { return write_t (key, value); } + bool write (pcwstring key, unsigned long long value) { return write_t (key, value); } + bool write (pcwstring key, int8_t value) { return write_t (key, (int16_t)value); } + bool write (pcwstring key, uint8_t value) { return write_t (key, (uint16_t)value); } + bool write (pcwstring key, bool value) { return write (key, value ? L"true" : L"false"); } + bool write (pcstring key, short value) { return write_t (key, value); } + bool write (pcstring key, unsigned short value) { return write_t (key, value); } + bool write (pcstring key, int value) { return write_t (key, value); } + bool write (pcstring key, unsigned int value) { return write_t (key, value); } + bool write (pcstring key, long value) { return write_t (key, value); } + bool write (pcstring key, unsigned long value) { return write_t (key, value); } + bool write (pcstring key, long long value) { return write_t (key, value); } + bool write (pcstring key, unsigned long long value) { return write_t (key, value); } + bool write (pcstring key, int8_t value) { return write_t (key, (int16_t)value); } + bool write (pcstring key, uint8_t value) { return write_t (key, (uint16_t)value); } + bool write (pcstring key, bool value) { return write (StringToWString (key), value ? L"true" : L"false"); } + bool write (pcwstring key, void *buf, size_t bufsize) { return WritePrivateProfileStructW (filepath, section, key, buf, bufsize); } + bool write (pcstring key, void *buf, size_t bufsize) { return write (StringToWString (key), buf, bufsize); } + initkey operator [] (pcwstring key) { return initkey (filepath, section, key); } + initkey operator [] (pcstring key) { return initkey (filepath, section, StringToWString (key)); } + std::wstring operator [] (pcwstring key) const { return read_string (key); } + std::wstring operator [] (pcstring key) const { return read_string (StringToWString (key)); } + bool delete_key (pcwstring key) { return DeletePrivateProfileKeyW (filepath, section, key); } + bool delete_key (pcstring key) { return delete_key (StringToWString (key)); } + bool clear () { return DeletePrivateProfileSectionW (filepath, section); } + initkey get_key (pcwstring key) const { return initkey (filepath, section, key); } + initkey get_key (pcwstring key) { return initkey (filepath, section, key); } + initkey get_key (pcstring key) const { return initkey (filepath, section, StringToWString (key)); } + initkey get_key (pcstring key) { return initkey (filepath, section, StringToWString (key)); } + initsection &operator = (const initsection &) = delete; +}; +class initfile +{ + public: + using pstring = std::string &; + using pwstring = std::wstring &; + using pcstring = const std::string &; + using pcwstring = const std::wstring &; + std::wstring filepath; + private: + template T read_t (pcwstring section, pcwstring key, T defaultvalue, FN process) const + { + auto res = read_wstring (section, key, std::to_wstring ((TRANS)defaultvalue)); + if (IsNormalizeStringEmpty (res)) return defaultvalue; + return (T)process (res.c_str ()); + } + template bool write_t (pcwstring section, pcwstring key, T value) { return write (section, key, std::to_wstring (value)); } + public: + initfile (const std::wstring &initpath): filepath (initpath) {} + size_t sections (std::vector §) const { return GetPrivateProfileSectionNamesW (filepath, sect); } + size_t sections (std::vector §) const { return GetPrivateProfileSectionNamesA (WStringToString (filepath), sect); } + bool delete_section (pcwstring section) { return DeletePrivateProfileSectionW (filepath, section); } + bool delete_section (pcstring section) { return delete_section (StringToWString (section)); } + size_t key_values (pcwstring section, std::vector &keyvalues) const { return GetPrivateProfileSectionW (filepath, section, keyvalues); } + size_t key_values (pcstring section, std::vector &keyvalues) const { return GetPrivateProfileSectionA (WStringToString (filepath), section, keyvalues); } + size_t keys (pcwstring section, std::vector &keyvalues) const { return GetPrivateProfileKeysW (filepath, section, keyvalues); } + size_t keys (pcstring section, std::vector &keyvalues) const { return GetPrivateProfileKeysA (WStringToString (filepath), section, keyvalues); } + initsection get_section (pcwstring section) { return initsection (filepath, section); } + initsection get_section (pcwstring section) const { return initsection (filepath, section); } + std::wstring read_wstring (pcwstring section, pcwstring key, pcwstring dflt = L"") const { return GetPrivateProfileStringW (filepath, section, key, dflt.c_str ()); } + std::string read_string (pcwstring section, pcwstring key, pcstring dflt = "") const { return WStringToString (read_wstring (section, key, StringToWString (dflt))); } +#define INIT_READ_WARGS(_type_, _dfltvalue_) pcwstring section, pcwstring key, _type_ dflt = _dfltvalue_ +#define METHOD_INIT_READ(_type_, _typename_, _dfltvalue_, _process_) \ +_type_ read_##_typename_ (INIT_READ_WARGS (_type_, _dfltvalue_)) const { return read_t (section, key, dflt, _process_); } + METHOD_INIT_READ (int, int, 0, _wtoi) + METHOD_INIT_READ (unsigned int, uint, 0, _wtou) + METHOD_INIT_READ (long, long, 0, _wtol) + METHOD_INIT_READ (unsigned long, ulong, 0, _wtoul) + METHOD_INIT_READ (long long, llong, 0, _wtoll) + METHOD_INIT_READ (unsigned long, ullong, 0, _wtou64) + METHOD_INIT_READ (short, short, 0, _wtoi16) + METHOD_INIT_READ (unsigned short, ushort, 0, _wtoui16) + METHOD_INIT_READ (int16_t, i16, 0, _wtoi16) + METHOD_INIT_READ (uint16_t, u16, 0, _wtoui16) + METHOD_INIT_READ (int32_t, i32, 0, _wtoi32) + METHOD_INIT_READ (uint32_t, u32, 0, _wtoui32) + METHOD_INIT_READ (int64_t, i64, 0, _wtoi64) + METHOD_INIT_READ (uint64_t, u64, 0, _wtou64) + METHOD_INIT_READ (float, float , 0, _wtof) + METHOD_INIT_READ (double, double, 0, _wtod) + int8_t read_i8 (INIT_READ_WARGS (int8_t, 0)) const { return read_t (section, key, dflt, _wtoi8); } + uint8_t read_u8 (INIT_READ_WARGS (uint8_t, 0)) const { return read_t (section, key, dflt, _wtoui8); } + bool read_bool (INIT_READ_WARGS (bool, false)) const + { + std::wnstring res = read_wstring (section, key, dflt ? L"true" : L"false"); + if (res.empty ()) return dflt; + if (res.equals (L"true") || res.equals (L"yes") || res.equals (L"zhen") || res.equals (L"") || res.equals (L"1") || _wtoi (res.c_str ()) != 0) return true; + else if (res.equals (L"false") || res.equals (L"no") || res.equals (L"jia") || res.equals (L"") || res.equals (L"0")) return false; + else return dflt; + } + bool read_struct (pcwstring section, pcwstring key, void *output, size_t size) const { return GetPrivateProfileStructW (filepath, section, key, output, size); } + template bool read_struct (pcwstring section, pcwstring key, T &structinst) const { return read_struct (key, &structinst, sizeof (structinst)); } +#ifdef INIT_READ_WARGS +#undef INIT_READ_WARGS +#endif +#ifdef METHOD_INIT_READ +#undef METHOD_INIT_READ +#endif +#define INIT_WRITE_WARGS(_type_) pcwstring section, pcwstring key, _type_ value + bool write (INIT_WRITE_WARGS (pcwstring)) { return WritePrivateProfileStringW (filepath, section, key, value); } +#define METHOD_INIT_WRITE(_type_) \ +bool write (INIT_WRITE_WARGS (_type_)) { return write_t (section, key, value); } + METHOD_INIT_WRITE (short) + METHOD_INIT_WRITE (unsigned short) + METHOD_INIT_WRITE (int) + METHOD_INIT_WRITE (unsigned int) + METHOD_INIT_WRITE (long) + METHOD_INIT_WRITE (unsigned long) + METHOD_INIT_WRITE (long long) + METHOD_INIT_WRITE (unsigned long long) + METHOD_INIT_WRITE (float) + METHOD_INIT_WRITE (double) + bool write (INIT_WRITE_WARGS (bool)) { return write (section, key, value ? L"true" : L"false"); } + bool write (INIT_WRITE_WARGS (int8_t)) { return write_t (section, key, (int16_t)value); } + bool write (INIT_WRITE_WARGS (uint8_t)) { return write_t (section, key, (uint16_t)value); } + bool write (pcwstring section, pcwstring key, void *buf, size_t bufsize) { return WritePrivateProfileStructW (filepath, section, key, buf, bufsize); } + initsection operator [] (pcwstring section) { return initsection (filepath, section); } + initsection operator [] (pcstring section) { return initsection (filepath, StringToWString (section)); } + initsection operator [] (pcwstring section) const { return initsection (filepath, section); } + initsection operator [] (pcstring section) const { return initsection (filepath, StringToWString (section)); } +#ifdef METHOD_INIT_WRITE +#undef METHOD_INIT_WRITE +#endif +#ifdef INIT_WRITE_WARGS +#undef INIT_WRITE_WARGS +#endif +}; \ No newline at end of file diff --git a/appinstaller/main.cpp b/appinstaller/main.cpp new file mode 100644 index 0000000..42a8b40 --- /dev/null +++ b/appinstaller/main.cpp @@ -0,0 +1,595 @@ +#include +#include +#include +#include +#include +#include +#include +#include "cmdargs.h" +#include "themeinfo.h" +#include "mpstr.h" +#include "initfile.h" +#include "resource.h" +#include "vemani.h" +#include "ieshell.h" +using namespace System; +using namespace System::Runtime::InteropServices; + +#ifdef _DEBUG +#define DEBUGMODE true +#else +#define DEBUGMODE false +#endif + +LPCWSTR g_lpAppId = L"Microsoft.DesktopAppInstaller"; +auto &g_identity = g_lpAppId; +auto &m_idenName = g_lpAppId; +struct iconhandle +{ + HICON hIcon = nullptr; + iconhandle (HICON hIcon = nullptr): hIcon (hIcon) {} + ~iconhandle () { try { if (hIcon) DestroyIcon (hIcon); hIcon = nullptr; } catch (...) {} } +}; +iconhandle g_hIconMain (LoadRCIcon (IDI_ICON_MAIN)); +initfile g_initfile (CombinePath (GetProgramRootDirectoryW (), L"config.ini")); +ref class MainHtmlWnd; +msclr::gcroot g_mainwnd; +vemanifest g_vemani ( + IsFileExists (CombinePath (GetProgramRootDirectoryW (), L"VisualElementsManifest.xml")) ? + CombinePath (GetProgramRootDirectoryW (), L"VisualElementsManifest.xml") : + CombinePath (GetProgramRootDirectoryW (), L"AppInstaller.VisualElementsManifest.xml") +); +resxmldoc g_scaleres ( + IsFileExists (CombinePath (GetProgramRootDirectoryW (), L"VisualElements\\scale.xml")) ? + CombinePath (GetProgramRootDirectoryW (), L"VisualElements\\scale.xml") : + CombinePath (GetProgramRootDirectoryW (), L"VisualElementsManifest.xml") +); + +HRESULT GetWebBrowser2Interface (System::Windows::Forms::WebBrowser ^fwb, IWebBrowser2 **output) +{ + if (fwb == nullptr || output == nullptr) return E_INVALIDARG; + *output = nullptr; + Object ^activeX = fwb->ActiveXInstance; + if (activeX == nullptr) return E_FAIL; + IntPtr pUnk = Marshal::GetIUnknownForObject (activeX); + if (pUnk == IntPtr::Zero) return E_FAIL; + HRESULT hr = ((IUnknown *)pUnk.ToPointer ())->QueryInterface (IID_IWebBrowser2, (void **)output); + Marshal::Release (pUnk); + return hr; +} + +public ref class SplashForm: public System::Windows::Forms::Form +{ + public: + using PictureBox = System::Windows::Forms::PictureBox; + using Timer = System::Windows::Forms::Timer; + private: + PictureBox ^picbox; + Timer ^timer; + double opastep = 0.05; + void InitForm () + { + this->DoubleBuffered = true; + InitializeComponent (); + this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None; + this->StartPosition = System::Windows::Forms::FormStartPosition::Manual; + this->ShowInTaskbar = false; + this->AllowTransparency = true; + this->Opacity = 1.0; + } + void InitializeComponent () + { + double dDpi = GetDPI () * 0.01; + this->picbox = gcnew System::Windows::Forms::PictureBox (); + this->picbox->Size = System::Drawing::Size (620 * dDpi, 300 * dDpi); + this->picbox->BackColor = System::Drawing::Color::Transparent; + picbox->Anchor = System::Windows::Forms::AnchorStyles::None; + picbox->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom; + } + void OnFadeTimer (Object ^sender, EventArgs ^e) + { + auto fadeTimer = timer; + auto opacityStep = opastep; + if (this->Opacity > 0) + { + this->Opacity -= opacityStep; + } + else + { + fadeTimer->Stop (); + this->Close (); + } + } + void OnLoad (Object ^sender, EventArgs ^e) + { + this->ChangePosAndSize (); + this->Visible = true; + } + void OnResize (Object ^sender, EventArgs ^e) + { + if (IsHandleCreated && picbox->IsHandleCreated) + { + Drawing::Size sz = this->ClientSize; + this->picbox->Location = Drawing::Point ( + (sz.Width - picbox->Width) * 0.5, + (sz.Height - picbox->Height) * 0.5 + ); + } + } + void OnResizeOwner (Object ^sender, EventArgs ^e) { this->ChangePosAndSize (); } + void OnLocationChangedOwner (Object ^sender, EventArgs ^e) { this->ChangePosAndSize (); } + protected: + virtual void OnHandleCreated (EventArgs^ e) override + { + Form::OnHandleCreated (e); + if (Environment::OSVersion->Version->Major >= 6) + { + INT mr = 0; + MARGINS margins = {mr, mr, mr, mr}; + HRESULT hr = DwmExtendFrameIntoClientArea ((HWND)this->Handle.ToPointer (), &margins); + } + } + public: + SplashForm (System::String ^imgpath, System::Drawing::Color backcolor, System::Windows::Forms::Form ^owner) + { + if (owner != nullptr) this->Owner = owner; + InitForm (); + std::wstring filefullpath = MPStringToStdW (imgpath); + if (filefullpath.find (L'%') != filefullpath.npos) filefullpath = ProcessEnvVars (filefullpath); + filefullpath = GetFullPathName (imgpath ? MPStringToStdW (imgpath) : L""); + try + { + auto img = System::Drawing::Image::FromFile (gcnew System::String (filefullpath.c_str ())); + if (img != nullptr) picbox->Image = img; + } + catch (...) { } + if (backcolor != Drawing::Color::Transparent) + { + picbox->BackColor = backcolor; + this->BackColor = backcolor; + } + if (this->Owner != nullptr) + { + this->Owner->Resize += gcnew System::EventHandler (this, &SplashForm::OnResizeOwner); + this->Owner->LocationChanged += gcnew System::EventHandler (this, &SplashForm::OnLocationChangedOwner); + } + this->Controls->Add (picbox); + this->Resize += gcnew EventHandler (this, &SplashForm::OnResize); + timer = gcnew System::Windows::Forms::Timer (); + timer->Interval = 15; + timer->Tick += gcnew System::EventHandler (this, &SplashForm::OnFadeTimer); + this->Load += gcnew EventHandler (this, &SplashForm::OnLoad); + } + void ChangePosAndSize () + { + if (this->Owner && this->Owner->IsHandleCreated) + { + this->Owner->Update (); + System::Drawing::Point pt = this->Owner->PointToScreen (this->Owner->ClientRectangle.Location); + this->Location = pt; + this->Size = this->Owner->ClientSize; + } + else if (this->Parent && this->Parent->IsHandleCreated) + { + this->Parent->Update (); + System::Drawing::Point pt = this->Parent->PointToScreen (this->Parent->ClientRectangle.Location); + this->Location = pt; + this->Size = this->Parent->ClientSize; + } + if (IsHandleCreated && picbox->IsHandleCreated) + { + Drawing::Size sz = this->ClientSize; + this->picbox->Location = Drawing::Point ( + (sz.Width - picbox->Width) * 0.5, + (sz.Height - picbox->Height) * 0.5 + ); + } + } + void SetSplashImage (System::Drawing::Image ^img) { if (picbox) picbox->Image = img; } + void SetSplashImage (System::String ^imgpath) { try { SetSplashImage (System::Drawing::Image::FromFile (imgpath)); } catch (...) {} } + void SetSplashImage (const std::wstring &imgpath) { SetSplashImage (CStringToMPString (imgpath)); } + void SetSplashBackgroundColor (System::Drawing::Color color) { picbox->BackColor = color; this->BackColor = color; } + // ʧ + void FadeOut () { timer->Start (); } + // ʧ + void FadeAway () { this->Visible = false; this->Close (); } + ~SplashForm () + { + if (this->Owner != nullptr) + { + this->Owner->Resize -= gcnew System::EventHandler (this, &SplashForm::OnResizeOwner); + this->Owner->LocationChanged -= gcnew System::EventHandler (this, &SplashForm::OnLocationChangedOwner); + } + } +}; + +[ComVisible (true)] +public ref class MainHtmlWnd: public System::Windows::Forms::Form +{ + public: + using WebBrowser = System::Windows::Forms::WebBrowser; + private: + WebBrowser ^webui; + SplashForm ^splash; + public: + [ComVisible (true)] + ref class IBridge + { + private: + MainHtmlWnd ^wndinst = nullptr; + public: + IBridge (MainHtmlWnd ^wnd): wndinst (wnd) {} + ref class _I_System + { + private: + MainHtmlWnd ^wndinst = nullptr; + public: + ref class _I_UI + { + private: + MainHtmlWnd ^wndinst = nullptr; + public: + _I_UI (MainHtmlWnd ^wnd): wndinst (wnd) {} + property int DPIPercent { int get () { return GetDPI (); }} + property double DPI { double get () { return DPIPercent * 0.01; }} + void showSplash () { wndinst->SplashScreen->Show (); } + void fadeAwaySplash () { wndinst->SplashScreen->FadeAway (); } + void fadeOutSplash () { wndinst->SplashScreen->FadeOut (); } + }; + private: + _I_UI ^ui = gcnew _I_UI (wndinst); + public: + _I_System (MainHtmlWnd ^wnd): wndinst (wnd) {} + property _I_UI ^UI { _I_UI ^get () { return ui; } } + }; + ref class _I_IEFrame + { + private: + MainHtmlWnd ^wndinst = nullptr; + public: + _I_IEFrame (MainHtmlWnd ^wnd): wndinst (wnd) {} + property int Scale + { + int get () { return wndinst->PageScale; } + void set (int value) { return wndinst->PageScale = value; } + } + property int Version { int get () { return GetInternetExplorerVersionMajor (); }} + }; + ref class _I_Storage + { + private: + MainHtmlWnd ^wndinst = nullptr; + public: + _I_Storage (MainHtmlWnd ^wnd): wndinst (wnd) {} + ref class Path + { + + }; + }; + ref class _I_String + { + public: + ref class _I_NString + { + public: + bool NEquals (String ^l, String ^r) { return IsNormalizeStringEquals (MPStringToPtrW (l), MPStringToPtrW (r)); } + bool Empty (String ^l) { return IsNormalizeStringEmpty (MPStringToStdW (l)); } + int Compare (String ^l, String ^r) { return NormalizeStringCompare (MPStringToPtrW (l), MPStringToPtrW (r)); } + int Length (String ^l) { return GetNormalizeStringLength (MPStringToStdW (l)); } + }; + private: + _I_NString ^nstr = gcnew _I_NString (); + public: + property _I_NString ^NString { _I_NString ^get () { return nstr; }} + String ^Trim (String ^src) + { + std::wstring csrc = MPStringToStdW (src); + return CStringToMPString (::StringTrim (csrc)); + } + String ^ToLower (String ^src) { return CStringToMPString (StringToLower (MPStringToStdW (src))); } + String ^ToUpper (String ^src) { return CStringToMPString (StringToUpper (MPStringToStdW (src))); } + }; + private: + _I_System ^system = gcnew _I_System (wndinst); + _I_IEFrame ^ieframe = gcnew _I_IEFrame (wndinst); + _I_Storage ^storage = gcnew _I_Storage (wndinst); + _I_String ^str = gcnew _I_String (); + public: + property _I_System ^System { _I_System ^get () { return system; }} + property _I_IEFrame ^IEFrame { _I_IEFrame ^get () { return ieframe; }} + property _I_Storage ^Storage { _I_Storage ^get () { return storage; }} + property _I_String ^String { _I_String ^get () { return str; }} + }; + protected: + property WebBrowser ^WebUI { WebBrowser ^get () { return this->webui; } } + property SplashForm ^SplashScreen { SplashForm ^get () { return this->splash; } } + property int DPIPercent { int get () { return GetDPI (); }} + property double DPI { double get () { return DPIPercent * 0.01; }} + void Init () + { + this->Visible = false; + this->webui = gcnew System::Windows::Forms::WebBrowser (); + this->SuspendLayout (); + this->webui->Dock = System::Windows::Forms::DockStyle::Fill; + this->webui->IsWebBrowserContextMenuEnabled = DEBUGMODE; + this->webui->AllowWebBrowserDrop = false; + this->Controls->Add (this->webui); + if (g_hIconMain.hIcon) + { + try { this->Icon = System::Drawing::Icon::FromHandle (IntPtr (g_hIconMain.hIcon)); } + catch (...) {} + } + unsigned ww = 0, wh = 0; + auto &ini = g_initfile; + auto setsect = ini ["Settings"]; + if (setsect [L"SavePosAndSizeBeforeCancel"].read_bool ()) + { + ww = setsect [L"LastWidth"].read_uint (setsect [L"DefaultWidth"].read_uint (rcInt (IDS_DEFAULTWIDTH))); + wh = setsect [L"LastHeight"].read_uint (setsect [L"DefaultHeight"].read_uint (rcInt (IDS_DEFAULTHEIGHT))); + } + else + { + ww = setsect [L"DefaultWidth"].read_uint (rcInt (IDS_DEFAULTWIDTH)); + wh = setsect [L"DefaultHeight"].read_uint (rcInt (IDS_DEFAULTHEIGHT)); + } + this->MinimumSize = System::Drawing::Size ( + setsect [L"MinimumWidth"].read_uint (rcInt (IDS_MINWIDTH)) * DPI, + setsect [L"MinimumHeight"].read_uint (rcInt (IDS_MINHIEHGT)) * DPI + ); + this->ClientSize = System::Drawing::Size (ww * DPI, wh * DPI); + this->WindowState = (System::Windows::Forms::FormWindowState)setsect [L"LastWndState"].read_int ((int)System::Windows::Forms::FormWindowState::Normal); + this->Text = rcString (IDS_WINTITLE); + this->ResumeLayout (false); + webui->ObjectForScripting = gcnew IBridge (this); + this->webui->DocumentCompleted += gcnew System::Windows::Forms::WebBrowserDocumentCompletedEventHandler (this, &MainHtmlWnd::OnDocumentCompleted); + this->webui->PreviewKeyDown += gcnew System::Windows::Forms::PreviewKeyDownEventHandler (this, &MainHtmlWnd::OnPreviewKeyDown_WebBrowser); + this->Resize += gcnew System::EventHandler (this, &MainHtmlWnd::OnResize); + this->Load += gcnew EventHandler (this, &MainHtmlWnd::OnCreate); + this->ResizeEnd += gcnew EventHandler (this, &MainHtmlWnd::OnResizeEnd); + } + void OnDocumentCompleted (Object ^sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs ^e) + { + if (e->Url->ToString () == webui->Url->ToString ()) + { + + ExecScript ("Windows.UI.DPI.mode = 1"); + ExecScript ("Bridge.Frame.scale = Bridge.Frame.scale * Bridge.UI.dpi"); + splash->FadeOut (); + } + } + void OnCreate (System::Object ^sender, System::EventArgs ^e) + { + splash->Owner = this; + splash->ChangePosAndSize (); + splash->Show (); + splash->Update (); + webui->Navigate (CStringToMPString (CombinePath (GetProgramRootDirectoryW (), L"html\\install.html"))); + } + void OnPreviewKeyDown_WebBrowser (System::Object ^sender, System::Windows::Forms::PreviewKeyDownEventArgs ^e) + { + if (e->KeyCode == System::Windows::Forms::Keys::F5 || (e->KeyCode == System::Windows::Forms::Keys::R && e->Control)) + e->IsInputKey = true; + } + void OnResize (Object ^sender, EventArgs ^e) + { + } + void OnResizeEnd (Object ^sender, EventArgs ^e) + { + + } + + + public: + MainHtmlWnd () + { + splash = gcnew SplashForm ( + gcnew String (g_vemani.splash_screen_image (L"App").c_str ()), + StringToColor (gcnew String (g_vemani.splash_screen_backgroundcolor (L"App").c_str ())), + this + ); + System::Windows::Forms::Application::DoEvents (); + Init (); + } + Object ^CallScriptFunction (String ^lpFuncName, ... array ^alpParams) + { + try { return this->webui->Document->InvokeScript (lpFuncName, alpParams); } + catch (Exception ^e) {} + return nullptr; + } + Object ^CallScriptFunction (String ^lpScriptName) + { + try { return this->webui->Document->InvokeScript (lpScriptName); } + catch (Exception ^e) {} + return nullptr; + } + Object ^InvokeCallScriptFunction (String ^lpFuncName, ... array ^alpParams) + { + try + { + if (this->InvokeRequired) return (Object ^)this->Invoke (gcnew Func ^, Object ^> (this, &MainHtmlWnd::CallScriptFunction), lpFuncName, alpParams); + else return CallScriptFunction (lpFuncName, alpParams); + } + catch (Exception ^e) {} + return nullptr; + } + Object ^InvokeCallScriptFunction (String ^lpScriptName) + { + try + { + if (this->InvokeRequired) return (Object ^)this->Invoke (gcnew Func (this, &MainHtmlWnd::CallScriptFunction), lpScriptName); + else return CallScriptFunction (lpScriptName); + } + catch (Exception ^e) {} + return nullptr; + } + Object ^ExecScript (... array ^alpScript) { return InvokeCallScriptFunction ("eval", alpScript); } + property int PageScale + { + int get () + { + CComPtr web2; + HRESULT hr = GetWebBrowser2Interface (webui, &web2); + if (FAILED (hr)) return 0; + VARIANT v; + VariantInit (&v); + hr = web2->ExecWB (OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, nullptr, &v); + if (FAILED (hr) || v.vt != VT_I4) return 0; + int val = v.lVal; + VariantClear (&v); + return val; + } + void set (int value) + { + CComPtr web2; + HRESULT hr = GetWebBrowser2Interface (webui, &web2); + if (FAILED (hr)) return; + VARIANT v; + VariantInit (&v); + v.vt = VT_I4; + v.lVal = value; + web2->ExecWB (OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &v, nullptr); + } + } +}; +using MainWnd = MainHtmlWnd; +std::vector LoadFileListW (const std::wstring &filePath) +{ + std::vector result; + HANDLE hFile = CreateFileW ( + filePath.c_str (), + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + nullptr); + + if (hFile == INVALID_HANDLE_VALUE) return result; + LARGE_INTEGER fileSize {}; + if (!GetFileSizeEx (hFile, &fileSize) || fileSize.QuadPart == 0) + { + CloseHandle (hFile); + return result; + } + DWORD size = static_cast (fileSize.QuadPart); + std::vector buf; + std::wstring buffer; + buffer.resize (size / sizeof (wchar_t) + 2 + 2); + DWORD readBytes = 0; + ReadFile (hFile, buf.data (), size, &readBytes, nullptr); + buffer += buf.data (); + CloseHandle (hFile); + buffer [readBytes / sizeof (wchar_t)] = L'\0'; + size_t start = 0; + while (true) + { + size_t pos = buffer.find (L'\n', start); + std::wstring line; + if (pos == std::wstring::npos) + { + line = buffer.substr (start); + } + else + { + line = buffer.substr (start, pos - start); + start = pos + 1; + } + if (!line.empty () && line.back () == L'\r') line.pop_back (); + if (!line.empty ()) result.push_back (line); + if (pos == std::wstring::npos) break; + } + return result; +} +enum class CMDPARAM: DWORD +{ + NONE = 0b000, + SILENT = 0b001, + VERYSILENT = 0b011, + MULTIPLE = 0b100 +}; +DWORD CmdMapsToFlags (std::map cmdpairs, std::set &files, std::set &uris) +{ + DWORD dwret = 0; + for (auto &it : cmdpairs) + { + switch (it.first.type) + { + case paramtype::file: { + if (IsFileExists (it.first.key)) files.insert (it.first.key); + } break; + case paramtype::uri: { + uris.insert (it.first.key); + } break; + default: + case paramtype::string: { + auto &key = it.first; + auto &value = it.second; + if (key.key.equals (L"silent")) dwret |= (DWORD)CMDPARAM::SILENT; + else if (key.key.equals (L"verysilent")) dwret |= (DWORD)CMDPARAM::SILENT; + else if (key.key.equals (L"multiple")) + { + if (value.type == paramtype::file) + { + auto strlist = LoadFileListW (value.value); + for (auto &it_s : strlist) + { + if (std::wnstring::empty (it_s)) continue; + std::wnstring filepath = it_s; + std::wstring listdir = GetFileDirectoryW (value.value); + if (!IsFileExists (filepath)) filepath = ProcessEnvVars (filepath); + if (!IsFileExists (filepath)) filepath = CombinePath (listdir, filepath); + if (!IsFileExists (filepath)) filepath = CombinePath (listdir, it_s); + if (!IsFileExists (filepath)) continue; + else files.insert (filepath); + } + } + } + } break; + } + } + if (files.size () > 1) dwret |= (DWORD)CMDPARAM::MULTIPLE; + return dwret; +} +HRESULT SetCurrentAppUserModelID (PCWSTR appID) +{ + typedef HRESULT (WINAPI *SetAppUserModelIDFunc)(PCWSTR); + HMODULE shell32 = LoadLibraryW (L"shell32.dll"); + destruct freelib ([&] () { + if (shell32) FreeLibrary (shell32); + }); + try + { + if (!shell32) return E_FAIL; + auto SetAppUserModelID = (SetAppUserModelIDFunc)GetProcAddress (shell32, "SetCurrentProcessExplicitAppUserModelID"); + if (!SetAppUserModelID) + { + FreeLibrary (shell32); + return E_FAIL; + } + return SetAppUserModelID (appID); + } + catch (...) { return E_FAIL; } + return E_FAIL; +} +[STAThread] +int APIENTRY wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) +{ + SetCurrentProcessExplicitAppUserModelID (m_idenName); + SetProcessDPIAware (); + { + // õǰĿ¼ΪĿ¼ + std::wnstring currdir = GetCurrentProgramPathW (); + std::wnstring rootdir = GetProgramRootDirectoryW (); + if (!PathEquals (currdir, rootdir)) SetCurrentDirectoryW (rootdir.c_str ()); + } + CoInitializeEx (NULL, COINIT_MULTITHREADED); + destruct relco ([] () { + CoUninitialize (); + }); + System::Windows::Forms::Application::EnableVisualStyles (); + System::Windows::Forms::Application::SetCompatibleTextRenderingDefault (false); + auto mwnd = gcnew MainHtmlWnd (); + g_mainwnd = mwnd; + System::Windows::Forms::Application::Run (mwnd); + return 0; +} \ No newline at end of file diff --git a/appinstaller/module.h b/appinstaller/module.h new file mode 100644 index 0000000..4001903 --- /dev/null +++ b/appinstaller/module.h @@ -0,0 +1,51 @@ +#pragma once +#include +#ifdef __cplusplus +#ifndef GetCurrentModule_bRefDefault +// C++ УGetCurrentModule Ĭֵ֮ǰ궨Ĭֵʱ˵Ⱥš= +// ÷磺HMODULE GetCurrentModule (BOOL bRef GetCurrentModule_bRefDefault) +#define GetCurrentModule_bRefDefault = FALSE +#endif +#else +#define GetCurrentModule_bRefDefault +#endif +HMODULE GetCurrentModule (BOOL bRef GetCurrentModule_bRefDefault) +{ + HMODULE hModule = NULL; + if (GetModuleHandleExW (bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), (LPCWSTR)GetCurrentModule, &hModule)) + { + return hModule; + } + return NULL; +} +HMODULE GetSelfModuleHandle () +{ + MEMORY_BASIC_INFORMATION mbi; + return ((::VirtualQuery (GetSelfModuleHandle, &mbi, sizeof (mbi)) != 0) + ? (HMODULE)mbi.AllocationBase : NULL); +} +#ifndef GetModuleHandleW_lpModuleNameDefault +#define GetModuleHandleW_lpModuleNameDefault NULL +#endif +#ifndef DEFAULT_HMODULE +#ifdef HMODULE_MODE_EXE +#define DEFAULT_HMODULE GetModuleHandleW (NULL) +#elif defined (HMODULE_MODE_DLL1) +#define DEFAULT_HMODULE GetCurrentModule () +#elif defined (HMODULE_MODE_DLL2) +#define DEFAULT_HMODULE GetSelfModuleHandle () +#else +#define DEFAULT_HMODULE GetModuleHandleW (GetModuleHandleW_lpModuleNameDefault) +#endif +#endif +#undef GetModuleHandleW_lpModuleNameDefault +#ifdef __cplusplus +#ifndef hModule_DefaultParam +// C++ Уʹô˺ꡰhModule_DefaultParamڸһЩβζĬֵ֮ǰ궨Ĭֵʱ˵Ⱥš= +// ÷磺std::wstring GetRCStringSW (UINT resID, HMODULE hModule hModule_DefaultParam) +#define hModule_DefaultParam = DEFAULT_HMODULE +#endif +#else +#define hModule_DefaultParam +#endif \ No newline at end of file diff --git a/appinstaller/mpstr.h b/appinstaller/mpstr.h new file mode 100644 index 0000000..d0c82cc --- /dev/null +++ b/appinstaller/mpstr.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include +#include + +using namespace System; +using namespace System::Text; + +String ^CStringToMPString (LPCSTR lpstr) { return (lpstr ? gcnew String (lpstr) : String::Empty); } +String ^CStringToMPString (LPCWSTR lpstr) { return (lpstr ? gcnew String (lpstr) : String::Empty); } +String ^CStringToMPString (const std::string &objstr) { return CStringToMPString (objstr.c_str ()); } +String ^CStringToMPString (const std::wstring &objstr) { return CStringToMPString (objstr.c_str ()); } +// תΪ UTF-16ָ벻Ҫͷţָת +LPCWSTR MPStringToPtrW (String ^in) +{ + if (in == nullptr) return NULL; + pin_ptr wch = PtrToStringChars (in); + return wch; +} +// תΪ std::wstringUTF-16 +std::wstring MPStringToStdW (String^ in) +{ + if (in == nullptr) return std::wstring (); + pin_ptr wch = PtrToStringChars (in); + return std::wstring (wch, in->Length); +} +// תΪ ANSI std::string +std::string MPStringToStdA (String^ in) +{ + if (in == nullptr) return std::string (); + array ^bytes = Encoding::Default->GetBytes (in); + pin_ptr pinned = &bytes [0]; + return std::string (reinterpret_cast (pinned), bytes->Length); +} +// תΪ UTF-8 std::string +std::string MPStringToStdU8 (String^ in) +{ + if (in == nullptr) return std::string (); + array ^bytes = Encoding::UTF8->GetBytes (in); + pin_ptr pinned = &bytes [0]; + return std::string (reinterpret_cast (pinned), bytes->Length); +} \ No newline at end of file diff --git a/appinstaller/nstring.h b/appinstaller/nstring.h new file mode 100644 index 0000000..15e3bf5 --- /dev/null +++ b/appinstaller/nstring.h @@ -0,0 +1,465 @@ +#pragma once +#include +#include +#include +namespace l0km +{ + template , typename AL = std::allocator > inline std::basic_string toupper (const std::basic_string &src) + { + std::basic_string dst = src; + static const std::locale loc; + const std::ctype &ctype = std::use_facet > (loc); + for (typename std::basic_string ::size_type i = 0; i < src.size (); ++ i) + { + dst [i] = ctype.toupper (src [i]); + } + return dst; + } + template , typename AL = std::allocator > inline std::basic_string tolower (const std::basic_string &src) + { + std::basic_string dst = src; + static const std::locale loc; + const std::ctype &ctype = std::use_facet > (loc); + for (typename std::basic_string ::size_type i = 0; i < src.size (); ++ i) + { + dst [i] = ctype.tolower (src [i]); + } + return dst; + } + inline char toupper (char ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).toupper (ch); + } + inline char tolower (char ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).tolower (ch); + } + inline wchar_t toupper (wchar_t ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).toupper (ch); + } + inline wchar_t tolower (wchar_t ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).tolower (ch); + } + inline int toupper (int ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).toupper (ch); + } + inline int tolower (int ch) + { + if (ch < -1) return ch; + static const std::locale loc; + return std::use_facet > (loc).tolower (ch); + } +} +template bool is_blank (ct &ch) +{ + return ch == ct (' ') || ch == ct ('\t') || ch == ct ('\n'); +} +template , typename AL = std::allocator > std::basic_string NormalizeString (const std::basic_string &str, bool upper = false, bool includemidblank = false) +{ + typedef std::basic_string string_type; + string_type result; + if (str.empty ()) return result; + auto begin_it = str.begin (); + auto end_it = str.end (); + while (begin_it != end_it && is_blank (*begin_it)) ++begin_it; + while (end_it != begin_it && is_blank (*(end_it - 1))) --end_it; + bool in_space = false; + for (auto it = begin_it; it != end_it; ++ it) + { + if (is_blank (*it)) + { + if (includemidblank) + { + if (!in_space) + { + result.push_back (E (' ')); + in_space = true; + } + } + else + { + result.push_back (*it); + in_space = true; + } + } + else + { + result.push_back (*it); + in_space = false; + } + } + if (upper) return l0km::toupper (result); + else return l0km::tolower (result); +} +template , typename AL = std::allocator > bool IsNormalizeStringEquals (const std::basic_string &l, const std::basic_string &r, bool includemidblank = false) +{ + auto _local_strlen = [] (const E *p) -> size_t { + size_t cnt = 0; + while (*(p + cnt)) { cnt ++; } + return cnt; + }; + const E *pl = l.c_str (); + const E *pr = r.c_str (); + while (*pl && is_blank (*pl)) ++ pl; + while (*pr && is_blank (*pr)) ++ pr; + const E *el = l.c_str () + _local_strlen (l.c_str ()); + const E *er = r.c_str () + _local_strlen (r.c_str ()); + while (el > pl && is_blank (*(el - 1))) --el; + while (er > pr && is_blank (*(er - 1))) --er; + while (pl < el && pr < er) + { + if (includemidblank) + { + if (is_blank (*pl) && is_blank (*pr)) + { + while (pl < el && is_blank (*pl)) ++pl; + while (pr < er && is_blank (*pr)) ++pr; + continue; + } + else if (is_blank (*pl)) + { + while (pl < el && is_blank (*pl)) ++pl; + continue; + } + else if (is_blank (*pr)) + { + while (pr < er && is_blank (*pr)) ++pr; + continue; + } + } + if (l0km::tolower (*pl) != l0km::tolower (*pr)) return false; + ++ pl; + ++ pr; + } + while (pl < el && is_blank (*pl)) ++ pl; + while (pr < er && is_blank (*pr)) ++ pr; + return pl == el && pr == er; +} +template , typename AL = std::allocator > int64_t NormalizeStringCompare (const std::basic_string &l, const std::basic_string &r, bool includemidblank = false) +{ + auto _local_strlen = [] (const E *p) -> size_t { + size_t cnt = 0; + while (*(p + cnt)) { cnt ++; } + return cnt; + }; + const E *pl = l.c_str (); + const E *pr = r.c_str (); + while (*pl && is_blank (*pl)) ++ pl; + while (*pr && is_blank (*pr)) ++ pr; + const E *el = l.c_str () + _local_strlen (l.c_str ()); + const E *er = r.c_str () + _local_strlen (r.c_str ()); + while (el > pl && is_blank (*(el - 1))) -- el; + while (er > pr && is_blank (*(er - 1))) -- er; + while (pl < el && pr < er) + { + if (includemidblank) + { + if (is_blank (*pl) && is_blank (*pr)) + { + while (pl < el && is_blank (*pl)) ++pl; + while (pr < er && is_blank (*pr)) ++pr; + continue; + } + else if (is_blank (*pl)) + { + while (pl < el && is_blank (*pl)) ++pl; + continue; + } + else if (is_blank (*pr)) + { + while (pr < er && is_blank (*pr)) ++pr; + continue; + } + } + E chl = l0km::tolower (*pl); + E chr = l0km::tolower (*pr); + if (chl != chr) return (int64_t)chl - (int64_t)chr; + ++ pl; + ++ pr; + } + while (pl < el && is_blank (*pl)) ++ pl; + while (pr < er && is_blank (*pr)) ++ pr; + if (pl == el && pr == er) return 0; + if (pl == el) return -1; + if (pr == er) return 1; + return (int64_t)l0km::tolower (*pl) - (int64_t)l0km::tolower (*pr); +} +template bool IsNormalizeStringEquals (const CharT *l, const CharT *r, bool includemidblank = false) +{ + if (!l || !r) return l == r; + auto skip_blank = [] (const CharT *&p) + { + while (*p && is_blank (*p)) ++ p; + }; + const CharT *p1 = l; + const CharT *p2 = r; + skip_blank (p1); + skip_blank (p2); + while (*p1 && *p2) + { + CharT ch1 = l0km::tolower (*p1); + CharT ch2 = l0km::tolower (*p2); + if (ch1 != ch2) return false; + ++ p1; + ++ p2; + if (includemidblank) + { + if (is_blank (*p1) || is_blank (*p2)) + { + skip_blank (p1); + skip_blank (p2); + } + } + } + skip_blank (p1); + skip_blank (p2); + return *p1 == 0 && *p2 == 0; +} +template int64_t NormalizeStringCompare (const CharT *l, const CharT *r, bool includemidblank = false) +{ + if (!l || !r) return l ? 1 : (r ? -1 : 0); + auto skip_blank = [] (const CharT *&p) + { + while (*p && is_blank (*p)) ++ p; + }; + const CharT *p1 = l; + const CharT *p2 = r; + skip_blank (p1); + skip_blank (p2); + while (*p1 && *p2) + { + CharT ch1 = l0km::tolower (*p1); + CharT ch2 = l0km::tolower (*p2); + if (ch1 != ch2) return (ch1 < ch2) ? -1 : 1; + ++ p1; + ++ p2; + if (includemidblank) + { + if (is_blank (*p1) || is_blank (*p2)) + { + skip_blank (p1); + skip_blank (p2); + } + } + } + skip_blank (p1); + skip_blank (p2); + if (*p1 == 0 && *p2 == 0) return 0; + if (*p1 == 0) return -1; + return 1; +} +template , typename AL = std::allocator > bool IsNormalizeStringEmpty (const std::basic_string &str) +{ + return IsNormalizeStringEquals (str, std::basic_string ()); +} +template , typename AL = std::allocator > std::basic_string StringTrim (const std::basic_string &str, bool includemidblank = false) +{ + typedef std::basic_string string_type; + typedef typename string_type::size_type size_type; + if (str.empty ()) return string_type (); + size_type first = 0; + size_type last = str.size (); + while (first < last && is_blank (str [first])) ++first; + while (last > first && is_blank (str [last - 1])) --last; + if (first == last) return string_type (); + string_type result; + result.reserve (last - first); + bool in_space = false; + for (size_type i = first; i < last; ++ i) + { + if (is_blank (str [i])) + { + if (includemidblank) + { + if (!in_space) + { + result.push_back (E (' ')); + in_space = true; + } + } + else + { + result.push_back (str [i]); + in_space = true; + } + } + else + { + result.push_back (str [i]); + in_space = false; + } + } + return result; +} +template , typename AL = std::allocator > size_t GetNormalizeStringLength (const std::basic_string &str, bool includemidblank = false) +{ + typedef typename std::basic_string ::size_type size_type; + if (str.empty ()) return 0; + size_type first = 0, last = str.size (); + while (first < last && is_blank (str [first])) ++first; + while (last > first && is_blank (str [last - 1])) --last; + if (first == last) return 0; + size_t length = 0; + bool in_space = false; + for (size_type i = first; i < last; ++i) + { + if (is_blank (str [i])) + { + if (includemidblank) + { + if (!in_space) + { + ++ length; + in_space = true; + } + } + else + { + ++ length; + in_space = true; + } + } + else + { + ++ length; + in_space = false; + } + } + return length; +} +namespace std +{ + + template , typename al = std::allocator > class basic_nstring: public std::basic_string + { + bool default_upper = false, default_include_blank_in_str = false; + public: + using base = std::basic_string ; + using derive = std::basic_nstring ; + using typename base::size_type; + using typename base::value_type; + using base::base; + using pstr = ct *; + using pcstr = const ct *; + basic_nstring (): base (), default_upper (false), default_include_blank_in_str (false) {} + basic_nstring (const ct *pStr): base (pStr), default_upper (false), default_include_blank_in_str (false) {} + basic_nstring (const base &str): base (str) {} + basic_nstring (base &&str): base (std::move (str)) {} + basic_nstring (const ct *data, size_type count): base (data, count), default_upper (false), default_include_blank_in_str (false) {} + // template basic_nstring (const ct (&arr) [N]) : base (arr, N - 1) {} + template basic_nstring (InputIt first, InputIt last): base (first, last), default_upper (false), default_include_blank_in_str (false) {} + bool upper_default () const { return this->default_upper; } + bool upper_default (bool value) { return this->default_upper = value; } + bool include_blank_in_str_middle () const { return this->default_include_blank_in_str; } + bool include_blank_in_str_middle (bool value) { return this->default_include_blank_in_str = value; } + base normalize (bool upper, bool includemidblank) const + { + return NormalizeString (*this, upper, includemidblank); + } + base normalize (bool upper) const + { + return this->normalize (upper, default_include_blank_in_str); + } + base normalize () const { return this->normalize (default_upper); } + base upper (bool includemidblank) const + { + return NormalizeString (*this, true, includemidblank); + } + base upper () const { return this->upper (default_include_blank_in_str); } + base lower (bool includemidblank) const + { + return NormalizeString (*this, false, includemidblank); + } + base lower () const { return this->lower (default_include_blank_in_str); } + base trim (bool includemidblank) const + { + return StringTrim (*this, includemidblank); + } + base trim () const { return this->trim (default_include_blank_in_str); } + size_t length (bool includemidblank) const { return GetNormalizeStringLength (*this, includemidblank); } + size_t length () const { return length (default_include_blank_in_str); } + bool empty () const + { + return IsNormalizeStringEmpty (*this); + } + bool equals (const base &another, bool includemidblank) const + { + return IsNormalizeStringEquals (*this, another, includemidblank); + } + bool equals (const base &another) const { return equals (another, default_include_blank_in_str); } + int64_t compare (const base &another, bool includemidblank) const + { + return NormalizeStringCompare (*this, another, includemidblank); + } + int64_t compare (const base &another) const { return compare (another, default_include_blank_in_str); } + base &string () { return *this; } + base to_string (bool upper, bool includemidblank) const { return this->normalize (upper, includemidblank); } + base to_string (bool upper) const { return this->normalize (upper, default_include_blank_in_str); } + base to_string () const { return this->normalize (default_upper); } + bool operator == (const base &other) const { return equals (other, false); } + bool operator != (const base &other) const { return !equals (other, false); } + bool operator < (const base &other) const { return compare (other, false) < 0; } + bool operator > (const base &other) const { return compare (other, false) > 0; } + bool operator <= (const base &other) const { return compare (other, false) <= 0; } + bool operator >= (const base &other) const { return compare (other, false) >= 0; } + int64_t operator - (const base &other) const { return compare (other, false); } + bool operator == (pcstr &other) const { return equals (other, false); } + bool operator != (pcstr &other) const { return !equals (other, false); } + bool operator < (pcstr &other) const { return compare (other, false) < 0; } + bool operator > (pcstr &other) const { return compare (other, false) > 0; } + bool operator <= (pcstr &other) const { return compare (other, false) <= 0; } + bool operator >= (pcstr &other) const { return compare (other, false) >= 0; } + template , typename AL = std::allocator > + static bool equals (const std::basic_string &l, const std::basic_string &r, bool remove_mid_blank = false) + { + return IsNormalizeStringEquals (l, r, remove_mid_blank); + } + template , typename AL = std::allocator > + static int64_t compare (const std::basic_string &l, const std::basic_string &r, bool remove_mid_blank = false) + { + return NormalizeStringCompare (l, r, remove_mid_blank); + } + template , typename AL = std::allocator > + static std::basic_string normalize (const std::basic_string &str, bool to_upper = false, bool remove_mid_blank = false) + { + return NormalizeString (str, to_upper, remove_mid_blank); + } + template , typename AL = std::allocator > + static std::basic_string trim (const std::basic_string &str, bool remove_mid_blank = false) + { + return StringTrim (str, remove_mid_blank); + } + template , typename AL = std::allocator > + static size_t length (const std::basic_string &str, bool remove_mid_blank = false) + { + return GetNormalizeStringLength (str, remove_mid_blank); + } + template , typename AL = std::allocator > + static bool empty (const std::basic_string &str) + { + return IsNormalizeStringEmpty (str); + } + template , typename AL = std::allocator > + static std::basic_nstring to_nstring (std::basic_string &str) { return std::basic_nstring (str); } + template , typename AL = std::allocator > + static std::basic_nstring toupper (const std::basic_nstring &str) { return l0km::toupper (str); } + template , typename AL = std::allocator > + static std::basic_nstring tolower (const std::basic_nstring &str) { return l0km::tolower (str); } + }; + + typedef basic_nstring nstring; + typedef basic_nstring wnstring; +} \ No newline at end of file diff --git a/appinstaller/packages.config b/appinstaller/packages.config new file mode 100644 index 0000000..c2da1c1 --- /dev/null +++ b/appinstaller/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/appinstaller/raii.h b/appinstaller/raii.h new file mode 100644 index 0000000..2117f28 --- /dev/null +++ b/appinstaller/raii.h @@ -0,0 +1,10 @@ +#pragma once +#include +typedef struct raii +{ + std::function endtask = nullptr; + raii (std::function pFunc = nullptr): endtask (pFunc) {} + ~raii () { if (endtask) endtask (); } + raii (const raii &) = delete; + raii (raii &&) = delete; +} destruct; \ No newline at end of file diff --git a/appinstaller/rctools.h b/appinstaller/rctools.h new file mode 100644 index 0000000..8e6a12b --- /dev/null +++ b/appinstaller/rctools.h @@ -0,0 +1,121 @@ +#pragma once +#include +#include +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif +#include "typestrans.h" +#include "module.h" + +// صָǿһҪ free ͷ +LPWSTR GetRCStringW (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (256); + size_t cnt = 0; +CopyStringLoop_GetRCStringW: + { + size_t len = LoadStringW (hModule, resID, buf.data (), buf.size ()); + if (cnt > 1625) return _wcsdup (buf.data ()); + if (len >= buf.size () - 1) + { + buf.resize (buf.size () + 20); + cnt ++; + goto CopyStringLoop_GetRCStringW; + } + else return _wcsdup (buf.data ()); + } +} +// صָǿһҪ free ͷ +LPSTR GetRCStringA (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (256); + size_t cnt = 0; +CopyStringLoop_GetRCStringA: + { + size_t len = LoadStringA (hModule, resID, buf.data (), buf.size ()); + if (cnt > 1625) return _strdup (buf.data ()); + if (len >= buf.size () - 1) + { + buf.resize (buf.size () + 20); + cnt ++; + goto CopyStringLoop_GetRCStringA; + } + else return _strdup (buf.data ()); + } +} + +HICON LoadRCIcon (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + return (HICON)LoadImageW (hModule, MAKEINTRESOURCEW (resID), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); +} +HRSRC FindResourceByName (LPCWSTR resourceName, LPCWSTR resourceType, HMODULE hModule hModule_DefaultParam) +{ + return FindResourceW (hModule, resourceName, resourceType); +} +#ifdef __cplusplus +#include +std::wstring GetRCStringSW (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (256); + size_t cnt = 0; +CopyStringLoop_GetRCStringSW: + { + size_t len = LoadStringW (hModule, resID, buf.data (), buf.size ()); + if (cnt > 1625) return buf.data (); + if (len >= buf.size () - 1) + { + buf.resize (buf.size () + 20); + cnt ++; + goto CopyStringLoop_GetRCStringSW; + } + else return buf.data (); + } +} +std::string GetRCStringSA (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (256); + size_t cnt = 0; +CopyStringLoop_GetRCStringSA: + { + size_t len = LoadStringA (hModule, resID, buf.data (), buf.size ()); + if (cnt > 1625) return buf.data (); + if (len >= buf.size () - 1) + { + buf.resize (buf.size () + 20); + cnt ++; + goto CopyStringLoop_GetRCStringSA; + } + else return buf.data (); + } +} +#endif +#if defined (__cplusplus) && defined (__cplusplus_cli) +using namespace System; +String ^GetRCStringCli (UINT resID, HMODULE hModule hModule_DefaultParam) +{ + std::vector buf (256); + size_t cnt = 0; +CopyStringLoop_GetRCStringCli: + { + size_t len = LoadStringW (hModule, resID, buf.data (), buf.size ()); + if (cnt > 1625) return gcnew String (buf.data ()); + if (len >= buf.size () - 1) + { + buf.resize (buf.size () + 20); + cnt ++; + goto CopyStringLoop_GetRCStringCli; + } + else return gcnew String (buf.data ()); + } +} +#define GetRCIntValue(_UINT__resID_) toInt (GetRCStringCli (_UINT__resID_)) +#define GetRCDoubleValue(_UINT__resID_) toDouble (GetRCStringCli (_UINT__resID_)) +#define GetRCBoolValue(_UINT__resID_) toBool (GetRCStringCli (_UINT__resID_)) +#define GetRCDateTimeValue(_UINT__resID_) toDateTime (GetRCStringCli (_UINT__resID_)) +#define rcString(resID) GetRCStringCli (resID) +#define rcInt(resID) GetRCIntValue (resID) +#define rcDouble(resID) GetRCDoubleValue (resID) +#define rcBool(resID) GetRCBoolValue (resID) +#define rcDTime(resID) GetRCDateTimeValue (resID) +#define rcIcon(resID) LoadRCIcon (resID) +#endif \ No newline at end of file diff --git a/appinstaller/res/icons/color.ico b/appinstaller/res/icons/color.ico new file mode 100644 index 0000000000000000000000000000000000000000..3db5e1ac263cbc4dd5eb282e795f2c84e322e65c GIT binary patch literal 188462 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 Ct3#Rq literal 0 HcmV?d00001 diff --git a/appinstaller/resource.h b/appinstaller/resource.h new file mode 100644 index 0000000000000000000000000000000000000000..9a2954682398b505f502caeda0eab1c186abb3e9 GIT binary patch literal 5214 zcmb7|OKaOe6ooH^ZVH9|g9^GS1e(}M`dB)a9h>N3B0G*5EtJwtp+BPk zv&**U%vi*-XRgKwp@*e!uFt(^9{TrpQ#R!rwoGyvODr83V9(51CT;2Cs*vy4p35^l zyD5>RawQjXC$}=ieku33cZ7RWnaP=4{LUjh z`x)Dn+~Cc7^X9coz!c~Uf zLbir9<%9WO_2ePQg&fEpj)%4MhHT4LAi0Z(6Q~>#aU>)+0?EhH1A7?ACb=0%rrrtm zdL{U;NZ$663*_zCWNm1o4c8(9bxYBiv?%X_EaqTk;6ikbqb~=T4v& zHfF!hBp(@C0WzyPtSEb+850c-iWYz?$jZu$HKb7C`sY=0J|AJ~`#qBDJa~xwu`&wiYoiUxB+0r52k^6tJVNv_TJrU( zBFz%I&7P_; z**mBVU5yl^%&cw0VlA~HSy#i7xw`KlQm!q^cl9I5)`R7Dl?V||D8^Es|3_#Yabaj(O+N-`HZm->)h P*8Rj}jG43QSFisAUW9;~ literal 0 HcmV?d00001 diff --git a/appinstaller/strcmp.h b/appinstaller/strcmp.h new file mode 100644 index 0000000..1748724 --- /dev/null +++ b/appinstaller/strcmp.h @@ -0,0 +1,154 @@ +#pragma once +#include +#include "nstring.h" +#ifdef __cplusplus +#define ptrnull(ptr) (!(ptr)) +#else +#define ptrnull(ptr) ((ptr) == NULL) +#endif +#define ptrvalid(ptr) (!ptrnull (ptr)) +// char * WCHAR * ַβΪ NULLжǷΪǿַָЧҳȴ 0ǧҰָ룬һ +#define strvalid(strptr) (ptrvalid (strptr) && *(strptr)) +// char * WCHAR * ַβΪ NULLжǷΪַָΪ NULL 򳤶Ϊ 0ǧҰָ룬һ +#define strnull(strptr) (ptrnull (strptr) || !*(strptr)) +typedef std::wnstring strlabel, StringLabel; +std::wstring StringTrim (const std::wstring &str) { return std::wnstring::trim (str); } +std::string StringTrim (const std::string &str) { return std::nstring::trim (str); } +#define StringToUpper l0km::toupper +#define StringToLower l0km::tolower +int LabelCompare (const std::wstring &l1, const std::wstring &l2) +{ + return std::wnstring::compare (l1, l2); +} +int LabelCompare (const std::string &l1, const std::string &l2) +{ + return std::nstring::compare (l1, l2); +} +bool LabelEqual (const std::wstring &l1, const std::wstring &l2) +{ + return std::wnstring::equals (l1, l2); +} +bool LabelEqual (const std::string &l1, const std::string &l2) +{ + return std::wnstring::equals (l1, l2); +} +bool LabelEmpty (const std::wstring &str) { return std::wnstring::empty (str); } +bool LabelEmpty (const std::string &str) { return std::nstring::empty (str); } +#define LabelNoEmpty(_str_) (!LabelEmpty (_str_)) +int InStr (const std::string &text, const std::string &keyword, bool ignoreCase = false) +{ + std::string s1, s2; + if (ignoreCase) + { + s1 = StringToUpper (text); + s2 = StringToUpper (keyword); + } + else + { + s1 = text; + s2 = keyword; + } + const char *found = StrStrIA (s1.c_str (), s2.c_str ()); + if (!found) + { + return -1; + } + return found - text.c_str (); +} +int InStr (const std::wstring &text, const std::wstring &keyword, bool ignoreCase = false) +{ + std::wstring s1, s2; + if (ignoreCase) + { + s1 = StringToUpper (text); + s2 = StringToUpper (keyword); + } + else + { + s1 = text; + s2 = keyword; + } + const WCHAR *found = StrStrIW (s1.c_str (), s2.c_str ()); + if (!found) + { + return -1; + } + return found - text.c_str (); +} +bool StrInclude (const std::string &text, const std::string &keyword, bool ignoreCase = false) +{ + std::string s1, s2; + if (ignoreCase) + { + s1 = StringToUpper (text); + s2 = StringToUpper (keyword); + } + else + { + s1 = text; + s2 = keyword; + } + const char *found = StrStrIA (s1.c_str (), s2.c_str ()); + if (!found) return false; + return true; +} +bool StrInclude (const std::wstring &text, const std::wstring &keyword, bool ignoreCase = false) +{ + std::wstring s1, s2; + if (ignoreCase) + { + s1 = StringToUpper (text); + s2 = StringToUpper (keyword); + } + else + { + s1 = text; + s2 = keyword; + } + const WCHAR *found = StrStrIW (s1.c_str (), s2.c_str ()); + if (!found) return false; + return true; +} +// ú "\0\0" ַͨöԻеļ +LPCWSTR strcpynull (LPWSTR dest, LPCWSTR endwith, size_t bufsize) +{ + if (!dest || !endwith || bufsize == 0) + return dest; + if (dest [0] == L'\0' && bufsize > 1) + { + dest [1] = L'\0'; + } + size_t pos = 0; + while (pos < bufsize - 1) + { + if (dest [pos] == L'\0' && dest [pos + 1] == L'\0') + { + if (dest [0]) pos ++; + break; + } + pos ++; + } + size_t i = 0; + while (pos < bufsize - 1 && endwith [i] != L'\0') + { + dest [pos ++] = endwith [i ++]; + } + if (pos < bufsize) + { + dest [pos] = L'\0'; + } + return dest; +} +// ȡıߣע⣺ָıַ硰chijΪ2 +std::wstring GetStringLeft (const std::wstring &str, size_t length) +{ + std::vector buf (length + 1); + lstrcpynW (buf.data (), str.c_str (), length + 1); + return buf.data (); +} +// ȡıұ +std::wstring GetStringRight (const std::wstring &str, size_t length) +{ + if (length >= str.length ()) return str; + return str.substr (str.length () - length, length).c_str (); +} diff --git a/appinstaller/strcode.h b/appinstaller/strcode.h new file mode 100644 index 0000000..f6f2f62 --- /dev/null +++ b/appinstaller/strcode.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include +std::wstring StringToWString (const std::string &str, UINT codePage = CP_ACP) +{ + if (str.empty ()) return std::wstring (); + int len = MultiByteToWideChar (codePage, 0, str.c_str (), -1, nullptr, 0); + if (len == 0) return std::wstring (); + std::wstring wstr (len - 1, L'\0'); + MultiByteToWideChar (codePage, 0, str.c_str (), -1, &wstr [0], len); + return wstr; +} +std::string WStringToString (const std::wstring &wstr, UINT codePage = CP_ACP) +{ + if (wstr.empty ()) return std::string (); + int len = WideCharToMultiByte (codePage, 0, wstr.c_str (), -1, nullptr, 0, nullptr, nullptr); + if (len == 0) return std::string (); + std::string str (len - 1, '\0'); + WideCharToMultiByte (codePage, 0, wstr.c_str (), -1, &str [0], len, nullptr, nullptr); + return str; +} diff --git a/appinstaller/themeinfo.h b/appinstaller/themeinfo.h new file mode 100644 index 0000000..d1c4fe3 --- /dev/null +++ b/appinstaller/themeinfo.h @@ -0,0 +1,160 @@ +#pragma once +#include +#include + +bool IsHighContrastEnabled () +{ + HIGHCONTRAST hc = {sizeof (HIGHCONTRAST)}; + if (SystemParametersInfo (SPI_GETHIGHCONTRAST, sizeof (hc), &hc, 0)) return (hc.dwFlags & HCF_HIGHCONTRASTON) != 0; + return false; +} +enum class HighContrastTheme +{ + None, + Black, + White, + Other +}; +HighContrastTheme GetHighContrastTheme () +{ + HIGHCONTRAST hc = {sizeof (HIGHCONTRAST)}; + if (!SystemParametersInfo (SPI_GETHIGHCONTRAST, sizeof (hc), &hc, 0)) return HighContrastTheme::None; + if (!(hc.dwFlags & HCF_HIGHCONTRASTON)) return HighContrastTheme::None; + COLORREF bgColor = GetSysColor (COLOR_WINDOW); + COLORREF textColor = GetSysColor (COLOR_WINDOWTEXT); + int brightnessBg = (GetRValue (bgColor) + GetGValue (bgColor) + GetBValue (bgColor)) / 3; + int brightnessText = (GetRValue (textColor) + GetGValue (textColor) + GetBValue (textColor)) / 3; + if (brightnessBg < brightnessText) return HighContrastTheme::Black; + else if (brightnessBg > brightnessText) return HighContrastTheme::White; + else return HighContrastTheme::Other; +} +int GetDPI () +{ + HDC hDC = GetDC (NULL); + int DPI_A = (int)(((double)GetDeviceCaps (hDC, 118) / (double)GetDeviceCaps (hDC, 8)) * 100); + int DPI_B = (int)(((double)GetDeviceCaps (hDC, 88) / 96) * 100); + ReleaseDC (NULL, hDC); + if (DPI_A == 100) return DPI_B; + else if (DPI_B == 100) return DPI_A; + else if (DPI_A == DPI_B) return DPI_A; + else return 0; +} +int GetScreenWidth () { return GetSystemMetrics (SM_CXSCREEN); } +int GetScreenHeight () { return GetSystemMetrics (SM_CYSCREEN); } +System::Drawing::Color GetDwmThemeColor () +{ + DWORD color = 0; + BOOL opaqueBlend = FALSE; + // DwmGetColorizationColor ȡ Aero ɫ + HRESULT hr = DwmGetColorizationColor (&color, &opaqueBlend); + if (SUCCEEDED (hr)) { + BYTE r = (BYTE)((color & 0x00FF0000) >> 16); + BYTE g = (BYTE)((color & 0x0000FF00) >> 8); + BYTE b = (BYTE)(color & 0x000000FF); + return System::Drawing::Color::FromArgb (r, g, b); + } + else { + // ȡʧܣĬɫ + return System::Drawing::Color::FromArgb (0, 120, 215); + } +} +String ^ColorToHtml (System::Drawing::Color color) +{ + return String::Format ("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B); +} +System::Drawing::Color StringToColor (String ^colorStr) +{ + using Color = System::Drawing::Color; + using Regex = System::Text::RegularExpressions::Regex; + auto Clamp = [] (int value, int min, int max) + { + return (value < min) ? min : (value > max) ? max : value; + }; + String ^normalized = colorStr->Trim ()->ToLower (); + if (normalized == "transparent") return Color::Transparent; + if (Color::FromName (normalized).IsKnownColor) + { + return Color::FromName (normalized); + } + if (normalized->StartsWith ("#")) + { + String^ hex = normalized->Substring (1); + if (hex->Length == 3 || hex->Length == 4) + { + hex = String::Concat ( + hex [0].ToString () + hex [0], + hex [1].ToString () + hex [1], + hex [2].ToString () + hex [2], + (hex->Length == 4) ? (hex [3].ToString () + hex [3]) : "" + ); + } + uint32_t argb = Convert::ToUInt32 (hex, 16); + switch (hex->Length) + { + case 6: return Color::FromArgb ( + 0xFF, + (argb >> 16) & 0xFF, + (argb >> 8) & 0xFF, + argb & 0xFF + ); + case 8: return Color::FromArgb ( + (argb >> 24) & 0xFF, + (argb >> 16) & 0xFF, + (argb >> 8) & 0xFF, + argb & 0xFF + ); + default: throw gcnew ArgumentException ("Invalid hex color format"); + } + } + System::Text::RegularExpressions::Match ^match = Regex::Match (normalized, + "^(rgba?)\\s*\\(\\s*(\\d+%?)\\s*,\\s*(\\d+%?)\\s*,\\s*(\\d+%?)\\s*,?\\s*([\\d.]+%?)?\\s*\\)$"); + if (match->Success) + { + auto GetComponent = [&] (String^ val) -> int + { + if (val->EndsWith ("%")) + { + float percent = float::Parse (val->TrimEnd ('%')) / 100.0f; + return Clamp ((int)Math::Round (percent * 255), 0, 255); + } + return Clamp (int::Parse (val), 0, 255); + }; + int r = GetComponent (match->Groups [2]->Value); + int g = GetComponent (match->Groups [3]->Value); + int b = GetComponent (match->Groups [4]->Value); + if (match->Groups [1]->Value == "rgba") + { + String^ alphaVal = match->Groups [5]->Value; + int a = 255; + if (alphaVal->EndsWith ("%")) + { + float percent = float::Parse (alphaVal->TrimEnd ('%')) / 100.0f; + a = Clamp ((int)Math::Round (percent * 255), 0, 255); + } + else if (!String::IsNullOrEmpty (alphaVal)) + { + a = Clamp ((int)Math::Round (float::Parse (alphaVal) * 255), 0, 255); + } + return Color::FromArgb (a, r, g, b); + } + return Color::FromArgb (r, g, b); + } + //throw gcnew ArgumentException ("Unsupported color format: " + colorStr); + return Color::Transparent; +} +bool IsAppInDarkMode () +{ + HKEY hKey; + DWORD dwValue; + if (RegOpenKeyEx (HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + DWORD dwSize = sizeof (dwValue); + if (RegQueryValueEx (hKey, L"AppsUseLightTheme", NULL, NULL, (LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS) + { + RegCloseKey (hKey); + return dwValue == 0; + } + RegCloseKey (hKey); + } + return false; +} \ No newline at end of file diff --git a/appinstaller/typestrans.h b/appinstaller/typestrans.h new file mode 100644 index 0000000..7abde9b --- /dev/null +++ b/appinstaller/typestrans.h @@ -0,0 +1,265 @@ +#pragma once +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif +#include +#ifdef __cplusplus +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +unsigned _wtou (const wchar_t *str) +{ + unsigned value = 0; + if (str) + { + swscanf (str, L"%u", &value); + } + return value; +} +unsigned long _wtoul (const wchar_t *str) +{ + unsigned value = 0; + if (str) + { + swscanf (str, L"%lu", &value); + } + return value; +} +unsigned long long _wtou64 (const wchar_t *str) +{ + unsigned long long value = 0; + if (str) + { + swscanf (str, L"%llu", &value); + } + return value; +} +double _wtod (const wchar_t *str) +{ + if (!str || !*str) return 0.0; // ַָ + double value = 0.0; + if (swscanf (str, L"%lg", &value) == 1) + { + return value; + } + return 0.0; // ʧʱ 0.0 +} +unsigned atou (const char *str) +{ + unsigned value = 0; + if (str) + { + sscanf (str, "%u", &value); + } + return value; +} +unsigned long atoul (const char *str) +{ + unsigned value = 0; + if (str) + { + sscanf (str, "%lu", &value); + } + return value; +} +unsigned long long atou64 (const char *str) +{ + unsigned long long value = 0; + if (str) + { + sscanf (str, "%llu", &value); + } + return value; +} +double atod (const char *str) +{ + if (!str || !*str) return 0.0; // ַָ + double value = 0.0; + if (sscanf (str, "%lg", &value) == 1) + { + return value; + } + return 0.0; // ʧʱ 0.0 +} +int8_t atoi8 (const char *str) +{ + int value = 0; + if (str) sscanf (str, "%d", &value); + return (int8_t)value; +} +int16_t atoi16 (const char *str) +{ + int value = 0; + if (str) sscanf (str, "%d", &value); + return (int16_t)value; +} +int32_t atoi32 (const char *str) +{ + int32_t value = 0; + if (str) sscanf (str, "%d", &value); + return value; +} +uint8_t atoui8 (const char *str) +{ + unsigned value = 0; + if (str) sscanf (str, "%u", &value); + return (uint8_t)value; +} +uint16_t atoui16 (const char *str) +{ + unsigned value = 0; + if (str) sscanf (str, "%u", &value); + return (uint16_t)value; +} +uint32_t atoui32 (const char *str) +{ + uint32_t value = 0; + if (str) sscanf (str, "%u", &value); + return value; +} +int8_t _wtoi8 (const wchar_t *str) +{ + int value = 0; + if (str) swscanf (str, L"%d", &value); + return (int8_t)value; +} +int16_t _wtoi16 (const wchar_t *str) +{ + int value = 0; + if (str) swscanf (str, L"%d", &value); + return (int16_t)value; +} +int32_t _wtoi32 (const wchar_t *str) +{ + int32_t value = 0; + if (str) swscanf (str, L"%d", &value); + return value; +} +uint8_t _wtoui8 (const wchar_t *str) +{ + unsigned value = 0; + if (str) swscanf (str, L"%u", &value); + return (uint8_t)value; +} +uint16_t _wtoui16 (const wchar_t *str) +{ + unsigned value = 0; + if (str) swscanf (str, L"%u", &value); + return (uint16_t)value; +} +uint32_t _wtoui32 (const wchar_t *str) +{ + uint32_t value = 0; + if (str) swscanf (str, L"%u", &value); + return value; +} +int64_t atoi64 (const char *str) +{ + int64_t value = 0; + if (str) sscanf (str, "%lld", &value); + return value; +} + +EXTERN_C int StringToIntA (const char *str) { return atoi (str); } +EXTERN_C int StringToIntW (const WCHAR *str) { return _wtoi (str); } +EXTERN_C unsigned StringToUnsignedA (const char *str) { return atou (str); } +EXTERN_C unsigned StringToUnsignedW (const WCHAR *str) { return _wtou (str); } +EXTERN_C bool StringToBoolA (const char *str) +{ + char buf [32] = {0}; + strcpy (buf, str); + for (int cnt = 0; buf [cnt]; cnt ++) buf [cnt] = tolower (buf [cnt]); + return !strcmp (buf, "true") || + !strcmp (buf, "yes") || + !strcmp (buf, "ok") || + !strcmp (buf, "sure") || + !strcmp (buf, "okay") || + !strcmp (buf, "zhen") || + !strcmp (buf, ""); +} +EXTERN_C bool StringToBoolW (const WCHAR *str) +{ + WCHAR buf [32] = {0}; + lstrcpyW (buf, str); + for (int cnt = 0; buf [cnt]; cnt ++) buf [cnt] = tolower (buf [cnt]); + return !lstrcmpW (buf, L"true") || + !lstrcmpW (buf, L"yes") || + !lstrcmpW (buf, L"ok") || + !lstrcmpW (buf, L"sure") || + !lstrcmpW (buf, L"okay") || + !lstrcmpW (buf, L"zhen") || + !lstrcmpW (buf, L""); +} +EXTERN_C long StringToLongA (const char *str) { return atol (str); } +EXTERN_C long StringToLongW (const WCHAR *str) { return _wtol (str); } +EXTERN_C unsigned long StringToULongA (const char *str) { return atoul (str); } +EXTERN_C unsigned long StringToULongW (const WCHAR *str) { return _wtoul (str); } +EXTERN_C long long StringToLongLongA (const char *str) { return atoll (str); } +EXTERN_C long long StringToLongLongW (const WCHAR *str) { return _wtoll (str); } +EXTERN_C unsigned long long StringToULongLongA (const char *str) { return atou64 (str); } +EXTERN_C unsigned long long StringToULongLongW (const WCHAR *str) { return _wtou64 (str); } +EXTERN_C float StringToFloatA (const char *str) { return atof (str); } +EXTERN_C float StringToFloatW (const WCHAR *str) { return _wtof (str); } +EXTERN_C double StringToDoubleA (const char *str) { return atod (str); } +EXTERN_C double StringToDoubleW (const WCHAR *str) { return _wtod (str); } + +#ifdef __cplusplus +int StringToInt (LPCSTR str) { return StringToIntA (str); } +int StringToInt (LPCWSTR str) { return StringToIntW (str); } +unsigned StringToUnsigned (LPCSTR str) { return StringToUnsignedA (str); } +unsigned StringToUnsigned (LPCWSTR str) { return StringToUnsignedW (str); } +bool StringToBool (LPCSTR str) { return StringToBoolA (str); } +bool StringToBool (LPCWSTR str) { return StringToBoolW (str); } +long StringToLong (LPCSTR str) { return StringToLongA (str); } +long StringToLong (LPCWSTR str) { return StringToLongW (str); } +unsigned long StringToULong (LPCSTR str) { return StringToULongA (str); } +unsigned long StringToULong (LPCWSTR str) { return StringToULongW (str); } +long long StringToLongLong (LPCSTR str) { return StringToLongLongA (str); } +long long StringToLongLong (LPCWSTR str) { return StringToLongLongW (str); } +unsigned long long StringToULongLong (LPCSTR str) { return StringToULongLongA (str); } +unsigned long long StringToULongLong (LPCWSTR str) { return StringToULongLongW (str); } +float StringToFloat (LPCSTR str) { return StringToFloatA (str); } +float StringToFloat (LPCWSTR str) { return StringToFloatW (str); } +double StringToDouble (LPCSTR str) { return StringToDoubleA (str); } +double StringToDouble (LPCWSTR str) { return StringToDoubleW (str); } +#endif + +#if defined (__cplusplus) && defined (__cplusplus_cli) +using namespace System; +#define toInt(_String_Managed_Object_) Int32::Parse (_String_Managed_Object_) +#define objToInt(_Object_Managed_) Convert::ToInt32 (_Object_Managed_) +#define toDouble(_String_Managed_Object_) Double::Parse (_String_Managed_Object_) +#define objToDouble(_Object_Managed_) Convert::ToDouble (_Object_Managed_) +#define toBool(_String_Managed_Object_) Boolean::Parse (_String_Managed_Object_) +bool objToBool (Object ^result) +{ + if (!result) return false; + try + { + String ^strValue = safe_cast (result); + return (strValue->ToLower () == "on"); + } + catch (InvalidCastException ^) + { + try + { + return Convert::ToBoolean (result); + } + catch (InvalidCastException ^) + { + return false; + } + } + return false; +} +#define toDateTime(_String_Managed_Object_) DateTime::Parse (_String_Managed_Object_) +#define toDateTimeObj(_Object_Managed_) Convert::ToDateTime (_Object_Managed_) +#define objectToType(_Object_Managed_, _Type_Name_) Convert::To##_Type_Name_ (_Object_Managed_) +#endif \ No newline at end of file diff --git a/appinstaller/vemani.h b/appinstaller/vemani.h new file mode 100644 index 0000000..17cd96b --- /dev/null +++ b/appinstaller/vemani.h @@ -0,0 +1,322 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "strcmp.h" +#include "dynarr.h" +#include "themeinfo.h" +#include "nstring.h" + +class vemanifest +{ + public: + enum class TextColor { dark = 0x000000, light = 0xFFFFFF }; + vemanifest (): available (false) {} + vemanifest (LPCSTR filename): available (false) { create (filename); } + vemanifest (const std::string &filename): available (false) { create (filename); } + vemanifest (LPCWSTR filename): available (false) { create (filename); } + vemanifest (const std::wstring &filename): available (false) { create (filename); } + vemanifest (std::ifstream &stream): available (false) { create (stream); } + vemanifest (std::fstream &stream): available (false) { create (stream); } + vemanifest (FILE *file): available (false) { create (file); } + ~vemanifest () { destroy (); } + bool create (LPCSTR filename) + { + destroy (); + pugi::xml_parse_result result = doc.load_file (filename); + available = result; return available; + } + bool create (const std::string &filename) { return create (filename.c_str ()); } + bool create (LPCWSTR filename) + { + destroy (); + std::wstring ws (filename); + std::string s = to_utf8 (ws); + pugi::xml_parse_result result = doc.load_file (s.c_str ()); + available = result; return available; + } + bool create (const std::wstring &filename) { return create (filename.c_str ()); } + bool create (std::ifstream &stream) + { + destroy (); + std::stringstream buffer; buffer << stream.rdbuf (); + std::string content = buffer.str (); + pugi::xml_parse_result result = doc.load_string (content.c_str ()); + available = result; return available; + } + bool create (std::fstream &stream) + { + destroy (); + std::stringstream buffer; buffer << stream.rdbuf (); + std::string content = buffer.str (); + pugi::xml_parse_result result = doc.load_string (content.c_str ()); + available = result; return available; + } + bool create (FILE *file) + { + destroy (); + if (!file) { return false; } + fseek (file, 0, SEEK_END); + long length = ftell (file); + fseek (file, 0, SEEK_SET); + std::string content (length, '\0'); + fread (&content [0], 1, length, file); + pugi::xml_parse_result result = doc.load_string (content.c_str ()); + available = result; return available; + } + void destroy () { if (!available) return; doc.reset (); available = false; } + bool valid () const { return available; } + std::string display_name (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + return visual ? visual.attribute ("DisplayName").as_string () : ""; + } + std::wstring display_name (const std::wstring &id = L"App") const { return pugi::as_wide (this->display_name (pugi::as_utf8 (id))); } + std::string logo (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return ""; + std::string logo = visual.attribute ("Logo").as_string (); + return !logo.empty () ? logo : visual.attribute ("Square150x150Logo").as_string (); + } + std::wstring logo (const std::wstring &id = L"App") const { return pugi::as_wide (this->logo (pugi::as_utf8 (id))); } + std::string small_logo (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return ""; + std::string smallLogo = visual.attribute ("SmallLogo").as_string (); + return !smallLogo.empty () ? smallLogo : visual.attribute ("Square70x70Logo").as_string (); + } + std::wstring small_logo (const std::wstring &id = L"App") const { return pugi::as_wide (this->small_logo (pugi::as_utf8 (id))); } + TextColor foreground_text (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return TextColor::dark; + std::string fg = visual.attribute ("ForegroundText").as_string (); + return (fg == "light") ? TextColor::light : TextColor::dark; + } + TextColor foreground_text (const std::wstring &id = L"App") const { return (this->foreground_text (pugi::as_utf8 (id))); } + std::string lnk_32x32_logo (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + return visual ? visual.attribute ("Lnk32x32Logo").as_string () : ""; + } + std::wstring lnk_32x32_logo (const std::wstring &id = L"App") const { return pugi::as_wide (this->lnk_32x32_logo (pugi::as_utf8 (id))); } + std::string item_display_logo (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return ""; + std::string itemLogo = visual.attribute ("ItemDisplayLogo").as_string (); + if (!itemLogo.empty ()) return itemLogo; + itemLogo = visual.attribute ("Lnk32x32Logo").as_string (); + return !itemLogo.empty () ? itemLogo : visual.attribute ("Square44x44Logo").as_string (); + } + std::wstring item_display_logo (const std::wstring &id = L"App") const { return pugi::as_wide (this->item_display_logo (pugi::as_utf8 (id))); } + bool show_name_on_tile (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + return visual ? (std::string (visual.attribute ("ShowNameOnSquare150x150Logo").as_string ()) == "on") : false; + } + bool show_name_on_tile (const std::wstring &id = L"App") const { return (this->show_name_on_tile (pugi::as_utf8 (id))); } + std::string background_color (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + return visual ? visual.attribute ("BackgroundColor").as_string () : ""; + } + std::wstring background_color (const std::wstring &id = L"App") const { return pugi::as_wide (this->background_color (pugi::as_utf8 (id))); } + std::string splash_screen_image (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return ""; + pugi::xml_node splash = visual.child ("SplashScreen"); + return splash ? splash.attribute ("Image").as_string () : ""; + } + std::wstring splash_screen_image (const std::wstring &id = L"App") const { return pugi::as_wide (this->splash_screen_image (pugi::as_utf8 (id))); } + std::string splash_screen_backgroundcolor (const std::string &id = "App") const + { + pugi::xml_node visual = visual_element_node (id); + if (!visual) return ""; + pugi::xml_node splash = visual.child ("SplashScreen"); + std::string bg = splash ? splash.attribute ("BackgroundColor").as_string () : ""; + return !bg.empty () ? bg : visual.attribute ("BackgroundColor").as_string (); + } + std::wstring splash_screen_backgroundcolor (const std::wstring &id = L"App") const { return pugi::as_wide (this->splash_screen_backgroundcolor (pugi::as_utf8 (id))); } + bool is_appid_exists (const std::string &id) const + { + pugi::xml_node root = doc.document_element (); + std::string rootName = root.name (); + if (rootName == "Applications") + { + for (pugi::xml_node app : root.children ("Application")) + { + pugi::xml_attribute attr = app.attribute ("Id"); + if (attr && LabelEqual (std::string (attr.value ()), id)) return true; + } + return pugi::xml_node (); + } + else if (rootName == "Application") + { + pugi::xml_attribute attr = root.attribute ("Id"); + if (attr && LabelEqual (std::string (attr.value ()), id)) return true; + } + return false; + } + bool is_appid_exists (const std::wstring &id) const { return this->is_appid_exists (pugi::as_utf8 (id)); } + size_t app_ids (std::vector &output) const + { + if (!&output) return 0; + output.clear (); + pugi::xml_node root = doc.document_element (); + std::string rootName = root.name (); + if (rootName == "Applications") + { + for (pugi::xml_node app : root.children ("Application")) + { + pugi::xml_attribute attr = app.attribute ("Id"); + if (attr) + { + LPCSTR lp = attr.value (); + if (lp) push_unique (output, std::string (lp)); + } + } + } + else if (rootName == "Application") + { + pugi::xml_attribute attr = root.attribute ("Id"); + if (attr) + { + if (attr) + { + LPCSTR lp = attr.value (); + if (lp) push_unique (output, std::string (lp)); + } + } + } + if (!output.size ()) push_unique (output, std::string ("App")); + return output.size (); + } + size_t app_ids (std::vector &output) const + { + if (!&output) return 0; + output.clear (); + pugi::xml_node root = doc.document_element (); + std::string rootName = root.name (); + if (rootName == "Applications") + { + for (pugi::xml_node app : root.children ("Application")) + { + pugi::xml_attribute attr = app.attribute ("Id"); + if (attr) + { + LPCSTR lp = attr.value (); + if (lp) push_unique (output, pugi::as_wide (lp)); + } + } + } + else if (rootName == "Application") + { + pugi::xml_attribute attr = root.attribute ("Id"); + if (attr) + { + if (attr) + { + LPCSTR lp = attr.value (); + if (lp) push_unique (output, pugi::as_wide (lp)); + } + } + } + if (!output.size ()) push_unique (output, std::wstring (L"App")); + return output.size (); + } + private: + pugi::xml_document doc; + bool available; + // id VisualElements ڵ㣺ڵΪ ڵ Id idڵΪ ֱӷ + pugi::xml_node visual_element_node (const std::string &id) const + { + pugi::xml_node root = doc.document_element (); + std::string rootName = root.name (); + if (rootName == "Applications") + { + for (pugi::xml_node app : root.children ("Application")) + { + pugi::xml_attribute attr = app.attribute ("Id"); + if (attr && LabelEqual (std::string (attr.value ()), id)) + { + pugi::xml_node visual = app.child ("VisualElements"); + if (visual) return visual; + } + } + return pugi::xml_node (); + } + else if (rootName == "Application") return root.child ("VisualElements"); + return pugi::xml_node (); + } + std::string to_utf8 (const std::wstring &wstr) const + { + std::wstring_convert > conv; + return conv.to_bytes (wstr); + } +}; + +class resxmldoc +{ + private: + std::wstring filepath; + pugi::xml_document doc; + bool available = false; + std::string to_utf8 (const std::wstring &wstr) const + { + std::wstring_convert > conv; + return conv.to_bytes (wstr); + } + public: + resxmldoc (const std::wstring &xmlpath) { create (xmlpath); } + void destroy () { if (!available) return; doc.reset (); available = false; } + ~resxmldoc () { destroy (); } + bool create (const std::wstring &xmlpath) + { + destroy (); + std::wstring ws (filepath = xmlpath); + std::string s = to_utf8 (ws); + pugi::xml_parse_result result = doc.load_file (s.c_str ()); + available = result; return available; + } + std::string get (const std::string &id) const + { + auto root = doc.first_child (); + auto nodes = root.children (); + for (auto it : nodes) + { + if (IsNormalizeStringEquals (std::string (it.attribute ("id").as_string ()), id)) + { + auto scales = it.children (); + std::map s_v; + for (auto it_s : scales) + { + std::string dpi = it_s.attribute ("dpi").as_string (); + if (IsNormalizeStringEquals (dpi.c_str (), "default")) { s_v [0] = it_s.text ().get (); } + else + { + try { s_v [it_s.attribute ("dpi").as_int ()] = it_s.text ().get (); } + catch (...) {} + } + } + + break; + } + } + return ""; + } + std::wstring get (const std::wstring &id) const { return pugi::as_wide (get (WStringToString (id)).c_str ()); } + std::wstring operator [] (const std::wstring &id) const { return get (id); } + std::wstring operator [] (const std::wstring &id) { return get (id); } + std::string operator [] (const std::string &id) const { return get (id); } + std::string operator [] (const std::string &id) { return get (id); } +}; \ No newline at end of file diff --git a/appinstaller/version.h b/appinstaller/version.h new file mode 100644 index 0000000..2253e1c --- /dev/null +++ b/appinstaller/version.h @@ -0,0 +1,124 @@ +#pragma once +#include +#include +#include +typedef uint64_t UINT64; +typedef int64_t INT64; +typedef uint16_t UINT16; +typedef struct version +{ + UINT16 major = 0, minor = 0, build = 0, revision = 0; + version (UINT64 value): + major ((value >> 0x30) & 0xFFFF), minor ((value >> 0x20) & 0xFFFF), + build ((value >> 0x10) & 0xFFFF), revision ((value) & 0xFFFF) {} + version (UINT16 major, UINT16 minor, UINT16 build, UINT16 revision): + major (major), minor (minor), build (build), revision (revision) {} + version (const std::wstring &verstr) { this->interpret (verstr); } + version (const std::string &verstr) { this->interpret (verstr); } + version () {} + version (const version &other): major (other.major), minor (other.minor), build (other.build), revision (other.revision) {} + version (version &&other) noexcept: major (other.major), minor (other.minor), build (other.build), revision (other.revision) {} + version &operator = (const version &other) + { + if (this != &other) + { + major = other.major; + minor = other.minor; + build = other.build; + revision = other.revision; + } + return *this; + } + version &operator = (version &&other) noexcept + { + if (this != &other) + { + major = other.major; + minor = other.minor; + build = other.build; + revision = other.revision; + } + return *this; + } + version &operator = (UINT64 value) { this->data (value); return *this; } + UINT64 data () const { return (((UINT64)major) << 48) | (((UINT64)minor) << 32) | (((UINT64)build) << 16) | ((UINT64)revision); } + UINT64 data (UINT64 value) + { + major = (value >> 48) & 0xFFFF; + minor = (value >> 32) & 0xFFFF; + build = (value >> 16) & 0xFFFF; + revision = value & 0xFFFF; + return value; + } + std::wstring stringifyw () const + { + std::wstringstream ss; + ss << major << L'.' << minor << L'.' << build << L'.' << revision; + return ss.str (); + } + std::string stringify () const + { + std::stringstream ss; + ss << major << '.' << minor << '.' << build << '.' << revision; + return ss.str (); + } + version &interpret (const std::wstring &verstr) + { + auto result = split (verstr); + if (result.size () > 0) this->major = _wtoi (result [0].c_str ()); + if (result.size () > 1) this->minor = _wtoi (result [1].c_str ()); + if (result.size () > 2) this->build = _wtoi (result [2].c_str ()); + if (result.size () > 3) this->revision = _wtoi (result [3].c_str ()); + return *this; + } + version &interpret (const std::string &verstr) + { + auto result = split (verstr); + if (result.size () > 0) this->major = atoi (result [0].c_str ()); + if (result.size () > 1) this->minor = atoi (result [1].c_str ()); + if (result.size () > 2) this->build = atoi (result [2].c_str ()); + if (result.size () > 3) this->revision = atoi (result [3].c_str ()); + return *this; + } + bool empty () const { return *(UINT64 *)this == 0; } + friend bool operator == (const version &l, const version &r) { return *(UINT64 *)&l == *(UINT64 *)&r; } + friend bool operator == (const version &l, const UINT64 &r) { return l.data () == r; } + friend bool operator == (const UINT64 &r, const version &l) { return l.data () == r; } + friend bool operator < (const version &l, const version &r) { return l.data () < r.data (); } + friend bool operator > (const version &l, const version &r) { return l.data () > r.data (); } + friend bool operator <= (const version &l, const version &r) { return l.data () <= r.data (); } + friend bool operator >= (const version &l, const version &r) { return l.data () >= r.data (); } + friend bool operator != (const version &l, const version &r) { return *(UINT64 *)&l != *(UINT64 *)&r; } + explicit operator bool () const { return !this->empty (); } + bool operator ! () { return this->empty (); } + friend std::ostream &operator << (std::ostream &o, const version &v) { return o << v.major << '.' << v.minor << '.' << v.build << '.' << v.revision; } + friend std::wostream &operator << (std::wostream &o, const version &v) { return o << v.major << '.' << v.minor << '.' << v.build << '.' << v.revision; } + bool equals (const version &r) const { return *this == r; } + INT64 compare (const version &r) const { return this->data () - r.data (); } + static version parse (const std::wstring &value) { return version (value); } + static version parse (const std::string &value) { return version (value); } + static std::wstring stringifyw (const version &v) { return v.stringifyw (); } + static std::string stringify (const version &v) { return v.stringify (); } + static bool equals (const version &l, const version &r) { return l == r; } + static INT64 compare (const version &l, const version &r) { return l.data () - r.data (); } + static version decode (UINT64 value) { return version (value); } + static UINT64 encode (const version &v) { return v.data (); } + protected: + template std::vector split (const StringType &str, typename StringType::value_type delimiter1 = '.', typename StringType::value_type delimiter2 = ',') + { + std::vector result; + std::basic_stringstream ss (str); + StringType segment; + while (std::getline (ss, segment, delimiter1)) + { + size_t pos = 0; + while ((pos = segment.find (delimiter2)) != StringType::npos) + { + result.push_back (segment.substr (0, pos)); + segment.erase (0, pos + 1); + } + if (!segment.empty ()) result.push_back (segment); + } + return result; + } +} Version; \ No newline at end of file diff --git a/certmgr/certmgr.rc b/certmgr/certmgr.rc new file mode 100644 index 0000000000000000000000000000000000000000..b98aca979758af17ad3fffc2b31a6f6bda0cf167 GIT binary patch literal 7072 zcmeHM%Wl&^6um1J2>!vOn<5@(j<@vAc~?wk`mM=RURq`BoG@Gl~}Vv z;tyEz75oHZi4Y&a_YzmtV26gp!Gfc=AiW|^rSs9m|wyf_Q=0| zuy5>Z*SYpjp2bum8y!Q~ijmZU-m}GqT3-1kYgFkxxm0-DoR`-x%EdE(E){;&&c}GV zAIO`wvB^0ne;P6mE3G4PY~GZSBUNP3Dq^RO2+HFi-}J=5DVW1Kh%HpWvW?(tr&a5S~>=9Sx zQxdH)DcMA=+C&E1dhbg)NuuQ$C7O1hIa7lhsEVvB_Mq3|YD_fR)JH)-C+nILQX(DM z@7dM+(6|eK=)7uDLq66)lR@4yGudnFCc4&f&DFstv)OJDP`oo2ky^g86M0V?u^RTxL2^+WsoIRWQi-M z&&hH~kJmSWTl%om;q;3EdiEyn>aHk4KFj+GWaM#Ww8pnq1sJ9T2`$}H=NkM`E{7p2r4coP$SreA*K-O+38{@fYR=8Xj<(kok8a=|5o7euDxZ0#o zb*#aU#5J@*3UU+w>;ZRnJN3wKS-vzMgguF<3cntgbPh_-7y-2-*J4Dq|DCDy<@ zh+=J4=x(16ew07HI5n7svzuqiF%6u&I6Bi)Nlc#+iBnTz^{{1#$a|pJg`a!ap#hqm zsdmVN!?xi~AMC;UjGJxX&;j^Z`$wO6KpLwCODsXNCAm7)p2g7~j8AH%e&Jov@5k4! zgq;{GL%fv?BGwDX)u;Z~!k72gpL}>QKm7J^|MoNy;O;bg9QZw2V>mkFW@Qal>y2$V zOP0I2SOGWYVIQ91dtfj-SaWR+U}U7>dDb^u|E#>ewEh*JPwu%#N50AGvO#I6p`O9{ zWL;B2O61AUH{TED<=v}fyk{^{sz-RwAYB$+BZvNW)6}N$dxlF<2Uq)rKs8U6KU5l( zPRA3x<|CyOyykYH6TIejBw|O4fr!N0<9x3 ziO&3A$nPj9M0;fNMt1AqX}>@m_Psj#Eh%|gsYHrJbUf}q7yPz&_&*nFOO+sbBPE>t S9@9ZB;eTt<|0$w=C#S!7AX|C> literal 0 HcmV?d00001 diff --git a/certmgr/certmgr.vcxproj b/certmgr/certmgr.vcxproj index 01b2894..1d2d2d8 100644 --- a/certmgr/certmgr.vcxproj +++ b/certmgr/certmgr.vcxproj @@ -148,6 +148,7 @@ + @@ -174,6 +175,9 @@ Create + + + diff --git a/certmgr/certmgr.vcxproj.filters b/certmgr/certmgr.vcxproj.filters index e923a7e..f17ca1d 100644 --- a/certmgr/certmgr.vcxproj.filters +++ b/certmgr/certmgr.vcxproj.filters @@ -27,6 +27,9 @@ 头文件 + + 头文件 + @@ -39,4 +42,9 @@ 源文件 + + + 资源文件 + + \ No newline at end of file diff --git a/certmgr/resource.h b/certmgr/resource.h new file mode 100644 index 0000000..5312ac3 --- /dev/null +++ b/certmgr/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by certmgr.rc + +// ¶һĬֵ +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/dlltest/main.cpp b/dlltest/main.cpp index 18a83bd..a61271b 100644 --- a/dlltest/main.cpp +++ b/dlltest/main.cpp @@ -195,24 +195,14 @@ int main (int argc, char *argv []) std::wcout << L"\\> "; std::wstring pkgPathStr = L"E:\\Profiles\\Bruce\\Desktop\\Discourse.appx"; pkgPathStr = L"F:\\BaiduNetdiskDownload\\Collection4\\Microsoft.BingFinance_2015.709.2014.2069_neutral_~_8wekyb3d8bbwe\\FinanceApp_3.0.4.336_x86.appx"; - pkgPathStr = L"F:\\BaiduNetdiskDownload\\Collection4\\Microsoft.BingFinance_2015.709.2014.2069_neutral_~_8wekyb3d8bbwe.appxbundle"; - pkgPathStr = L""; + //pkgPathStr = L"F:\\BaiduNetdiskDownload\\Collection4\\Microsoft.BingFinance_2015.709.2014.2069_neutral_~_8wekyb3d8bbwe.appxbundle"; + //pkgPathStr = L""; if (pkgPathStr.empty ()) std::getline (std::wcin, pkgPathStr); pkgPathStr.erase ( std::remove (pkgPathStr.begin (), pkgPathStr.end (), L'\"'), pkgPathStr.end () ); - std::wcout << L"Installing ..." << std::endl; - std::wstring ec, dm; - HRESULT hr = AddAppxPackage (pkgPathStr, [] (int progress) { - std::wcout << L"\r " << progress << L"%"; - }, ec, dm); - if (SUCCEEDED (hr)) std::wcout << std::endl << L"Installed Successfully." << std::endl; - else - { - std::wcout << std::endl << L"Exception: " << ec << L"(0x" << std::hex << std::setw (8) << std::setfill (L'0') << hr << L")" << std::endl; - std::wcout << L"Detail Message: " << dm << std::endl; - } + read_package (pkgPathStr); system ("pause"); return 0; } \ No newline at end of file diff --git a/notice/notice.rc b/notice/notice.rc index 40bf078ce2584f6b3864d8e4a457dca83384d818..6cf56bb5227f18467f154f558f5295c8733b8c7c 100644 GIT binary patch delta 185 zcmeBB*ywrrJ56*(&R=i?ailnxtJy^2+rfvXV7O*VEEYdwp)XtuYU3#<~CMW20w<- z$?h!5#vqnEgAaozLokB}gAPz(FheMV6HvqvEECUwsv;h!??2Pp$?F8THuG@&VBAvtHX%ysLe|J510V#$~bud delta 12 TcmZ2u-lVeO9RKDDNfRajB4GrP diff --git a/pkgread/pkgread.cpp b/pkgread/pkgread.cpp index bfe1b99..99ddf38 100644 --- a/pkgread/pkgread.cpp +++ b/pkgread/pkgread.cpp @@ -1068,7 +1068,8 @@ ULONG DestroyAppxFileStream (_In_ HANDLE hFileStream) if (!hFileStream) return 0; IStream *ptr = reinterpret_cast (hFileStream); if (!ptr) return 0; - return ptr->Release (); + ULONG ret = ptr->Release (); + return ret; } HANDLE GetAppxBundleApplicationPackageFile (_In_ HPKGREAD hReader) { diff --git a/pkgread/pkgread.rc b/pkgread/pkgread.rc index cc870e1d6c86f7fef8a858a6392b9f2078f7b6c5..08560079b24a3d9bae93a1eee743b24cc69c58b6 100644 GIT binary patch delta 168 zcmeBD*=N4NhFfq-oJJ{Y@bB(x!3qqH3;_(Dn+v%=GYV`de(ZN{hE2x2XpPdRvE_lA z7x0=fO;%%?$EVMr&!E8YvFUBM218%{ + + + \ No newline at end of file diff --git a/shared/VisualElements/150x150.png b/shared/VisualElements/150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..88f58b4c4b3019e313c8019a070a71181ed8d7b6 GIT binary patch literal 3472 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 literal 0 HcmV?d00001 diff --git a/shared/VisualElements/150x150_Metadata.xml b/shared/VisualElements/150x150_Metadata.xml new file mode 100644 index 0000000..3809fcb --- /dev/null +++ b/shared/VisualElements/150x150_Metadata.xml @@ -0,0 +1,9 @@ + + + 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 + E:\Profiles\Bruce\Desktop\新建文件夹\Microsoft.DesktopAppInstaller_1.22.11261.0_x64__8wekyb3d8bbwe\Assets\AppPackageAppList.targetsize-256_altform-unplated.png + 48 + 48 + 26 + 20 + \ No newline at end of file diff --git a/shared/VisualElements/44x44.png b/shared/VisualElements/44x44.png new file mode 100644 index 0000000000000000000000000000000000000000..b42b62f6abd599bb2a9263fcdf81882627a92de3 GIT binary patch literal 467 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 literal 0 HcmV?d00001 diff --git a/shared/VisualElements/70x70_Metadata.xml b/shared/VisualElements/70x70_Metadata.xml new file mode 100644 index 0000000..e3bc534 --- /dev/null +++ b/shared/VisualElements/70x70_Metadata.xml @@ -0,0 +1,9 @@ + + + iVBORw0KGgoAAAANSUhEUgAAAEIAAABCCAYAAADjVADoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJ8SURBVHhe7drhceJADIZhSkgpKSklXAn3L38pgdKuhFQAJ2lfM8bYgrWFd5fsM8MEhNDKX2Amk+HQdV3XdV3XVeRyuXxy9ynS/yW3H7n9ldsH5XbpBZ3P53/yU31Rdmlfar9qNxBZehzAmBuGPp/aZrUTiCy5FMDYbBhaT08/VG8gstQzAYzdhKGPUzlLPYHIErkBjFkY+jM9XK18IHL4STdZS0L85m6EsoHIwdlh8C66viM2vKvmlAtEDn0qjHEAU1p/i0DkwMUwvACmtK/5QOSwmzByApjS1zUdiBx02hLAlM6JDERmHRn9epFBDHReQCAnxu2DQzd9NJbovJWB7BuC4uCrCgLZPwTF4XcKBVImBMUCi3YMpFwIiiUeenEgZUNQepE5IgPROTPvjBuv+AXMSsfl27Kgvq6aAAbp2PVyFta+6gIYpOO38y5A69UGMEhrxNELYrSpPoBBWicWow2lO9UEMEhrxWJ0W9g9FKONPKznt+5Jq8ditNHH1X0M5uii0RhtKJlpIHpfazwsyzYMxmhD6YZePKEYWstil1CMNpRctJbFLqEYbSi5aC2LXUIx2lBy0VoWu4RitKHkorUsdgnFaEPJRWtZ7BKK0YaSi9ay2CUUow0lF61lsUsoRhtKLlrLkj9sjuwThtGGkovW8mSXh/84ycFYQ8lFaz1kp5BAGGcouWitj+y2KRDGGEouWuslO64KhJcbSi5a6ye7ZgXCywwlF63tkJ2fCoR2Q2mRzNvvOxDRZH83ENoMpTu8vo1/4z2iFzIXCE8bSldvFcCUXNwfuTj93pOhbCi9dwBjcpEfctMvgP1QMr8mgK7ruq7ruvYdDv8B85b251lfl2cAAAAASUVORK5CYII= + E:\Profiles\Bruce\Desktop\新建文件夹\Microsoft.DesktopAppInstaller_1.22.11261.0_x64__8wekyb3d8bbwe\Assets\AppPackageAppList.scale-150.png + 44 + 44 + 3 + 3 + \ No newline at end of file diff --git a/shared/VisualElements/SmallLogo.png b/shared/VisualElements/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..612edfd029eecc075583ab582b26d03a0b6057fc GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX0wgC|rfCAHYo0ESAs(G?r|cFztia=H>g4u; zLrzuMz-!kQNyo(%B5o(x^jqyGF`V?eBqeJ1qCj7PnZ+uJY4M7>gVOwWLY8szu3Ibf z;ucdQE33ZRV-Ak;FK;bR@UpOEJzIPG%-5I=bvGJnVIw3LnhWH+nJNni_ z8{*7NS-V+tzWW@L=H6kODE5ujsM_`8!xz_ce@aYil%3Jc*svidaoeQUx!n_iY{SG! zQT6QJ@0%PW{xv>-xYqa3w=e$~s+&w~gfc2Do1+`+(x36HVLit!et7qR%4qvVJFPs@ T7WX#*eaPVH>gTe~DWM4f!4zki literal 0 HcmV?d00001 diff --git a/shared/VisualElements/SplashLarge.png b/shared/VisualElements/SplashLarge.png new file mode 100644 index 0000000000000000000000000000000000000000..d230c50c0b42a93fb84efc963e147b1b50d4458f GIT binary patch literal 7234 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 literal 0 HcmV?d00001 diff --git a/shared/VisualElements/SplashScreen.png b/shared/VisualElements/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2338e5af8160819c87249aee67e39efb736c0d GIT binary patch literal 1330 zcmeAS@N?(olHy`uVBq!ia0y~yV9H@&VASDY0g7DFQIBU}VEO6k;uunK>+Ri(xwjHT z+8(ZtY!E!e(Q`p?7N?Ne364lb;UhT*I7%iRV!Nxb*I{aabO*26&)QEm&u>jC)!F;0 zxBmW~V-m?(XMGvE1kD_7FtqT(h(u-qGX^Mu5N+W_h=N(Tq+rH?<&n)2prJLJnQ&T* z%bg5~kCSyiS;syTYus>gRl5#bTJGe?cb~oQ2$U3T@Owhb3kuH;QV zQ?>l9K{kk&apl{urEmYQ>6AX?HaYP1>}|=B!sac#Y>Tg{=Puu@md7D|*7fb)EniR0 z+M$?ZBDOU+^YwhwLgyP9T3N?0nVEpi2)J_3>vknrU)rK?`M31IihJJujtsQ+x&0I@ zG4cM5F!2~$@9B9{z;+2|-cFtADi)b${^)Oq^r2(wOLM2EK6^PyCH5K6S%z=7$hy7N z2ih|u=hnS0klj9Jxyu)U+%wrbdj1NabC0E5GE>O{`Jv|4xlXY2W^eOeRCagA-w!hc z%-WXc_N<82&Rf04R;8u)VW#x$io)pFhwlW;_O;yJlVV-ubgX0c8pRxuZt}?~UD1>7 zJpcM6r7D9;_-9Hf`w*B7zhuv{uRDkdE(Kp_tPl#UZWxqb$XR z7nIT*Zanakv2588cy8;t0_PhJz^MGOVux)?wk3yj>7#4Ui?s#J)P&6goo{G}gGgYa zM^4n(laSqQe{F{wE1sR?5-?kJ^T|yiAXRxLw(MHNhQQNSpLLG%CN7@k2ej%4ZwqfB zbE5MdhZ_RsExbo~Azopr0M=UN)c^nh literal 0 HcmV?d00001 diff --git a/shared/VisualElements/scale.xml b/shared/VisualElements/scale.xml new file mode 100644 index 0000000..14abe86 --- /dev/null +++ b/shared/VisualElements/scale.xml @@ -0,0 +1,14 @@ + + + + splash\SplashScreen.scale-100.png + splash\SplashScreen.scale-125.png + splash\SplashScreen.scale-150.png + splash\SplashScreen.scale-200.png + SplashScreen.png + + + SplashLarge.png + SplashLarge.png + + \ No newline at end of file diff --git a/shared/VisualElements/splash/SplashScreen.scale-100.png b/shared/VisualElements/splash/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..788ff59f72c04fd9851f63bfbb2e9a62eceb875d GIT binary patch literal 1397 zcmeAS@N?(olHy`uVBq!ia0y~yV9H@&VASDY0g7DFQIBU}V72jdaSW-r_4e*<-@^tX z4T)~aQ+f_*$h8J;>a5i0VA^TXsekd|>+g3KpPE`{>icNV6Y+)!9Y%#5hC^&nqG1Cg zhct|Uivr~lqF@#-DV%0;NaK{kWfssGxTH|ciez%Q!O+4BBNCYf%ov~qLbQb!Aqr-p zOFf=H>(iXeFUyzPJU^+WlygTrtN;4WElbarcS|2Sc6L#jS?h9s-sNdp{-WkBy^evuy`r;>!hyDwZ9VP3JLT6k0W+)RZ-1JHu5OMIFx#~>_oc(e zvzeSg(IvUB@2?jVpVYA7qDii5{mbk7zlgW=x@B4y&D-?tY?MMyi2v=G-TJTY#ql3< zJGv!y=b|;w+B`UBt1j@ml@+5FozLyv!mGDz?X#`_x0=bi-*`}RE9%aLkmrVm9MW?< zqEGKO$+o${pV;i2`MU7+&#&%=$~gfuw$1yUS##VM=qjnDxkuC-gXg94CN5rg-R9}` zKl7f?X>ZkiZn^*YcAKZ+_c;z7`#R&RP38uft^4OYJP|O{JD%fmXW1ctr6LY#ac84X zMg1EWy50~l4|IkQ9O57*hbW08Sl5osGhUCrZGG$(<#~V3<%PKuUHB3gFMRq&CzoaC z_v&}m=f1g3>$eP(OI)0I!;4SEn?LCE^N7lp-eZZkyMopRv)F@qe2LLrmu_C>{9U}p z=8)U+4YuwtUs+yy3)Yu>LoRSt@x$Z4WVHJ?T(r!28xJ%M=yEdwvliY&VN`+{n+z7g z-iuLo-X(9JN-pM*Uie5Yi`pbOucKzCfh_?Pa$v;|(FF}!@kEqw(5(4?h&@nkwRzR9 S6ggmV%HZkh=d#Wzp$PzCJP6bP literal 0 HcmV?d00001 diff --git a/shared/VisualElements/splash/SplashScreen.scale-125.png b/shared/VisualElements/splash/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..9254e356fcce1a39a400e74aa82ed3987802011c GIT binary patch literal 1861 zcmeAS@N?(olHy`uVBq!ia0y~yU}k4vU@Yfg0g6Pu`LDykz|Q08;uunK>+Rj!y|)bn z94_kSdIxGob9onPzH9keAXdm@|7Ag&%CjGT*p?(R?UIfb+5bwM;Rgr91ZIXO3=EbG z4t&F%`9Y9Dft}$5BSR5GgA9F{2P&sktzG)EV`<#$N0VLo64r^_iCdb;lc(?Lz?ZN| zWDAee&wL*cdzHu*E~iSPRVoVX27z2rEDQI@gbPhzo}tF--W*`pqr-WE(PvVVvZKc8 zW7AlkFf8*pcu!#p?_zJJA_n0l3H}17o_$nhv}|}7yup+s^*PU^2AKm7G;avC6lL&% zjDI1rhSw?6pc`a-0oOH_g(kDzfyPUivCeM_kUFmdG@fTxQ@NwY@-wO+_ROYmM-BCJ zY9RKErgWhAd36wbded=*DGMY)Rvio~kZ%#PS`IQYgsZMO!0L<^P|2PvuQ%P%b`F!V zY*1_}_%B{HUw@?o--2R+d9{(3AFJm~V16OiQhxvT@%s@Hat_m^Wts30=s}z zi*EVnBX%;(PZ*k-HatIe?u7gEMwtUI9W9Fb>+dvgb>w?+L}AN~ccP_l_)aj+5o(!c zU7yVNl*O{)n4`sGMSN!Tz?})4*&Cj*0%9v9rN! z6AoKBiNBVdNewa%2?AB~WIyPE*%1P67H-cfg^n;-HY`x+DOq$Q8O)xb&{MJF$$pg% z#v%qrM~RAP&)EC1M6+owA7Ey!hZ`@>mz*Z!tWutCP><~V=wCXD@JQuF3A$@jANxfIzi z=(4XZmz0+TvrXC8mPyJ(#BJG?_ke6EQeZ#9c%o58fn9;Us6nPd<^(WIX(o6kVdeG2 z;DWW?Am^8(1rW}VqoTy{FI|x;k%6sJ8XEsFwk)u3wsQAB_uHbs%iN`LWJi1LO8yK^tXI7Nd50$0}lP|tEyps;% z1O|+sQI+edh^N0)`&J$76fzbANUbZC@JxVV!sR}!q`i)5_S1vAB|0Rn*@^DbU$ z$dd&NUy+QJzVOybYoWrT2^NdDGVO8&8-6KmOPRy#HjsgenQq&;GS-3(Tyo~cHO5$Z zu+A3AT+s`r5Cf-QyvC@@y|M-9=S@BDL@z9b2v5DZm)XjGi4ZU@I*n$jE+~fBqqg`a zQx!zm(`c6Ig6$AtrNuXye;I>Sa~j?9cCc>;S)XYBT;h?bo?+=0?!UXF=ROizZ+PUU z3DBRp7S%tS7rE~j-y64g0np;h1>eLjB|eMg(CW}I;Y`2(|B=!Pg+&2pBc4WER{z@2 zs#th1Wdyb_(o7vtP&I9y?n4uoeOVc^e{|8E^ zzt^?DW_6$Q)!v3a!DVbpT#-sr#!kO%=PYk(ICgfc9sAcn2WJ;xY=yhLZ~qc_Ws#G| z^fjqjz*yB;`G-`U3hV$)V1USJyU%-DDMiUZI(S71VP2>~)7Oo2eG zf*@f=K~_Q0Kwt<20vQk{M35E51h8R1wU~kk8x}5Ixx2*=90)wJttDLtj{t4;Ux1Ar~PFQRpF!kX_)5kZm+W(t8VHT+;+DV2lMo%!4Ek2Z$*e z94mp5$ixcP1F9QkN=ews SXMcfB9|liXKbLh*2~7a*xMQ3E literal 0 HcmV?d00001 diff --git a/shared/VisualElements/splash/SplashScreen.scale-200.png b/shared/VisualElements/splash/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..900365961916fe971bc1fae40194923759ce2b4e GIT binary patch literal 3512 zcmeHKYfw{H5WYZwfWky63<#weiLnlXsnv)Gnkq;@L5ETr2_izYI7up40VNe9zIbXw zw3gzd!%NXbA(CJVSWu`9SP^g{NyIuJz9?#C5RF>9CpXujiqs$eXs7*=nf>lLyZi0# zcP~rU(y$;q+X=Q9hS>$P1Hv(k)QMr{95M->O!!sm2+ubM2YeKE~jDT2%9flwkvZ7l6krM%t)9YiPTM+WiV+>1-Xc38DA7eOq6OYkj3@2}@ zW%L-s$(wi#k8#TK|DL=oiV^xcy08+*{0nq)zopb$xqn@6_`bACbI{BNC;szv!({H` zT1A2d$+fQT+Pp6f&%@rlvmY}pGPmRGRv^Lwo*2@Sha4*P-I6Dh&dt(zb;?y zSHMDN6#ij4ciGIXC6dy~Cb^`M)EyZ7Y_R$ZQo+jD%h zAzRl3xWbE8nZi-*T|JPAvd8s{d7gQb#|wdGV^jyvbLV-Q4pf_|T&Rw;-yeb}u93>! z=I+B2r_i{!XB6OeOo*yInTZm|8aVoI1-;vDqYPqoyl|0XZ^sP>6t--aQmKv%JGd0Z z`o>42p>b_KC`JJoLYe;})%b)EV}y2&XpdmhmHmis{hrE{Y1)vB!GS28O?-c(V(-P1 z*@$sRldhHLX;bEiV$*Y!eLT-KH;kYxTX}-#sir%jlN7b{JQt6S%@e?XN`AlLz|k+? z>oEtS_jxsgm2oQTN$|a42o(MXd(Lq=8-ZAb{PCIevR~5807NK+8-JMIniK_+b*5=! zw6-2CTLuBJ4+%sMy>iA2*CC!2YE7I}J5U^Y9Ex+Ep^Z97PF!83o(V)3(Dmca%{t(K zUlglTt}iRBGhOu7rn%)_ou<2v=r!cagJgrb%zWS(^{aZ{rL2YNoe9*{>eDi3K^wCs3N?9OG$9>CNSHU4Y(ZFqnkl zLm0k<;YS#A34=u#^9dsW8Q7MyY#9_oO{8Wa36Sh3Rl-ok^$j!)6ixBbHNwC#^PoZw zbdhx}!GRCOlHG+y=aogm+1F+@p&Ka+_2KjGi0Up?hn`q5cg629^I~d`A|J+gDWZ~R zyQ};wQ~g`N-oSm5%1MGmw|~=jK1?l9KJppV`0ef%wmgk=LtTp1JNXZJ$OC2af}6fq zRX>$ETEq01ol%>tWxXAxLFeO}%o?mp>{WG=^^K8K`OV61Ak=QHKPFj!{j|^v$2-U> zx#Uv3v@3GJnC&b{fBJAxYmVwO951lcpJe;?JUUuuI=9r&f#FUvaDh{46Mf3^X?Y@Vemu%LuK2z9InC;s6YocZCi5D3F;A z=t~Fy+KdCNf!;Y1fbQZa)K2)0;s6;&Kyrorq(b@r`>7g>O!8p|8 zOeRtS)<#D{KmbzXfFY_filr!2h6=*LSSO<<#Gnw=1Y96n1OKWUH~jIIV(>(w!(Bd3xPh4#Lty;!LIy>@;U+jjjJLc^in-VeE+Z@;uP%pwQ_l!7 zMqgs!6ovdJ^#s)TVzqy@0mOXKErNVCHrkB;lRbeC(I~^zBM!1kSt4r|H!c5 Mz_5Vh^J6pq1b7tkj{pDw literal 0 HcmV?d00001 diff --git a/shared/VisualElementsManifest.xml b/shared/VisualElementsManifest.xml new file mode 100644 index 0000000..bad6ca1 --- /dev/null +++ b/shared/VisualElementsManifest.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/shared/html/applist.html b/shared/html/applist.html new file mode 100644 index 0000000..dd4c97c --- /dev/null +++ b/shared/html/applist.html @@ -0,0 +1,357 @@ + + + + + App Launch List + + + + + + + + + +
+
+
+ +
+
+
+
+ My Application0 +
+
+
+
+ 你要如何打开这个文件? +
+
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/shared/html/css/pages.css b/shared/html/css/pages.css new file mode 100644 index 0000000..4b0bfe5 --- /dev/null +++ b/shared/html/css/pages.css @@ -0,0 +1,447 @@ +body { + margin: 0; + width: 100%; + height: 100%; + -ms-overflow-style: -ms-autohiding-scrollbar; + user-select: none; + -ms-user-select: none; +} + +body * { + -ms-overflow-style: -ms-autohiding-scrollbar; +} + +.pagecontainer { + padding: 0px; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: hidden; + box-sizing: border-box; + margin: 0px; + padding: 0px; + border: 0px; +} + +.pagecontainer.full { + padding: 0px; + top: 0; + left: 0; + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; +} + +.pagecontainer>.page { + position: relative; + overflow-x: hidden; + overflow-y: hidden; + box-sizing: border-box; + top: 0px; + left: 0px; + width: 100%; + height: 100%; +} + +.page.padding { + padding: 24px; +} + +.page.splash { + padding: 0px; + background-color: #333; +} + +.page.splash>img { + width: 620px; + height: 300px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +} + +.page.splash progress.win-ring { + width: 30px; + height: 30px; + margin-top: 32px; + border-style: none; + background-color: transparent; + color: white; +} + +.page.splash>.content { + position: absolute; + text-align: center; + box-sizing: border-box; + top: calc(50% + 300px / 2); + left: 50%; + width: 100%; + transform: translateX(-50%); + color: white; +} + +progress.win-ring:indeterminate::-ms-fill { + animation-delay: 1.5s; +} + +.page.preinstall .content.preinstall, +.page.installsuccess .content.installsuccess, +.page.installfailed .content.installfailed { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: calc(100% - 100px); + bottom: auto; + box-sizing: border-box; + padding: 24px 24px 0px 24px; + overflow-x: hidden; + overflow-y: auto; + word-break: break-all; + max-width: 100%; + max-height: calc(100% - 100px); +} + +.page>.controls { + position: absolute; + top: auto; + bottom: 0px; + left: 0px; + width: 100%; + max-width: 100%; + height: 100px; + max-height: 100px; + padding: 10px 24px 24px 24px; + box-sizing: border-box; + overflow-y: hidden; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; + /* display: flex; */ + flex-direction: row-reverse; + flex-wrap: nowrap; + align-content: center; + justify-content: space-between; + align-items: center; +} + +.page>.controls .command { + float: right; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + justify-content: flex-end; + align-items: center; +} + +.page>.controls .command button { + margin-left: 20px; +} + +.page>.controls .checkbox { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + justify-content: flex-start; + align-items: center; + -ms-flex-direction: row; + -ms-flex-wrap: nowrap; + -ms-flex-line-pack: center; + -ms-flex-pack: start; + -ms-flex-align: center; +} + +.page>.controls .checkbox input[type="checkbox"] { + min-width: 21px; + min-height: 21px; +} + +.page>.controls .checkbox label { + text-overflow: ellipsis; +} + +.page>.content p { + margin: 0; +} + +.page>.content ul { + margin: 0; + padding-left: 16px; +} + +.page>.content ul li { + margin: 0; +} + +.storelogo { + width: 90px; + height: 90px; + position: relative; + background-color: #464646; + float: right; + display: flex; + flex-direction: row; + -ms-flex-direction: row; + flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + align-content: center; + -ms-flex-line-pack: center; + justify-content: center; + -ms-flex-pack: center; + align-items: center; + -ms-flex-align: center; + min-width: 90px; + min-height: 90px; + max-width: 90px; + max-height: 90px; +} + +.storelogo .filter img { + max-width: 90px; + max-height: 90px; + aspect-ratio: auto; +} + +.storelogo .filter { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(254, 0.1); + display: flex; + flex-direction: row; + -ms-flex-direction: row; + flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + align-content: center; + -ms-flex-line-pack: center; + justify-content: center; + -ms-flex-pack: center; + align-items: center; + -ms-flex-align: center; +} + +.storelogo::after { + border: 1px solid rgba(254, 254, 254, 0.1); + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.page>.content .functions { + position: relative; + width: 100%; + max-width: 100%; + min-height: 10%; + overflow-x: hidden; + overflow-y: auto; + max-height: calc(100% - 10.5em); + user-select: all; + -ms-user-select: element; + box-sizing: border-box; + transition: width 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), height 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), top 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), left 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), right 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), bottom 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), margin 0.5s cubic-bezier(0.1, 0.9, 0.2, 1), padding 0.5s cubic-bezier(0.1, 0.9, 0.2, 1); + list-style-position: outside; + /*test*/ + border: 1px solid black; + padding: 5px; +} + +.page>.progress { + position: absolute; + top: auto; + left: 0; + right: 0; + bottom: 100px; + height: auto; + padding: 0 24px; + box-sizing: border-box; +} + +.progress * { + width: 100%; +} + +.page>.reason { + position: absolute; + top: auto; + left: 0; + bottom: 100px; + height: auto; + min-height: 10%; + padding: 0 24px; + box-sizing: border-box; + max-height: calc(100% - 10.5em); + width: 100%; + transition: all 0.5s cubic-bezier(0.1, 0.9, 0.2, 1); +} + +.page>.reason p { + margin: 0; +} + +.page>.reason textarea { + width: 100%; + height: calc(100% - 1.3em); + box-sizing: border-box; +} + +.moreinfo-content p { + margin: 0px; +} + +.moreinfo-content table tbody tr td { + border-bottom: 1px solid #ccc; + border-left: 1px solid #ddd; +} + +.page>* { + display: none; +} + +.page.splash>.splash { + display: block; +} + +.page.loading, +.page.select, +.page.preinstall, +.page.installing, +.page.installsuccess, +.page.installfailed {} + +.page.loading>.content.loading { + width: 100%; + height: 100%; + padding: 0px; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + justify-content: center; + align-items: center; + font-size: 16pt; + max-height: 100%; +} + +.ring-loading { + font-family: Setup, "Segoe Boot Semilight", "Segoe Boot Semilight"; +} + +.page.select>.select { + display: block; +} + +.page.select>.controls.select, +.page.installsuccess>.controls.installsuccess, +.page.installfailed>.controls.installfailed { + display: flex; +} + +.page.preinstall>.controls.preinstall, +.page.installing>.controls.installing { + display: flex; + flex-direction: row; +} + +.page.select>.controls.select>.checkbox { + display: none; +} + +.page.select>.controls.select>.command button:nth-of-type(2) { + display: none; +} + +.page.select>.content.select, +.page.preinstall>.content.preinstall, +.page.installing>.content.installing, +.page.installsuccess>.content.installsuccess, +.page.installfailed>.content.installfailed { + padding: 24px 24px 0 24px; +} + +.page:not(.multiple) .multiple { + display: none; +} + +.page.select>.content.select .multiple { + display: none; +} + +.page.select>.content.select .storelogo { + display: none; +} + +.page.select>.content.select p, +.page.select>.content.select br, +.page.select>.content.select .functions, +.page.select>.content.select .moreinfo { + display: none; +} + +.page.preinstall>.content.preinstall, +.page.installing>.content.installing, +.page.installsuccess>.content.installsuccess, +.page.installfailed>.content.installfailed { + display: block; +} + +.page.installing>.progress.installing { + display: block; +} + +.page.installing>.content.installing { + height: calc(100% - 200px); + max-height: calc(100% - 24px); +} + +.page.installing>.content.installing .pkgfunctions-label, +.page.installing>.content.installing .functions, +.page.installing>.content.installing .moreinfo, +.page.installsuccess>.content.installsuccess .pkgfunctions-label, +.page.installsuccess>.content.installsuccess .functions, +.page.installsuccess>.content.installsuccess .moreinfo, +.page.installfailed>.content.installfailed .pkgfunctions-label, +.page.installfailed>.content.installfailed .functions, +.page.installfailed>.content.installfailed .moreinfo { + display: none; +} + +.page.installing>.controls.installing .command { + display: none; +} + +.page.installsuccess>.content.installsuccess { + display: block; +} + +.page.installsuccess>.controls.installsuccess .checkbox, +.page.installfailed>.controls.installfailed .checkbox { + display: none; +} + +.page.installfailed>.reason { + display: block; +} + +.page.preinstall.multiple>.content.preinstall h1.pkgtitle, +.page.installing.multiple>.content.installing h1.pkgtitle, +.page.installsuccess.multiple>.content.installsuccess h1.pkgtitle, +.page.installfailed.multiple>.content.installfailed h1.pkgtitle { + display: none; +} + +.page.installing.multiple>.content .currentfile label, +.page.installing.multiple>.content .currentfile select, +.page.installing.multiple>.content .currentfile br { + display: none; +} \ No newline at end of file diff --git a/shared/html/css/popup.css b/shared/html/css/popup.css new file mode 100644 index 0000000..f3fb587 --- /dev/null +++ b/shared/html/css/popup.css @@ -0,0 +1,26 @@ +.popup { + width: 288px; + height: 252px; + position: absolute; + box-sizing: border-box; + max-width: 50%; + max-height: 50%; + padding: 20px; + margin: 5px; + background-color: white; + overflow-x: auto; + overflow-y: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 2px solid black; +} + +.popup .content { + width: 100%; + max-height: 100%; + overflow-y: auto; + overflow-x: hidden; +} + +.popup .content.with-ctrls { + max-height: calc(100% - 40px); +} \ No newline at end of file diff --git a/shared/html/fonts/SETUP.TTF b/shared/html/fonts/SETUP.TTF new file mode 100644 index 0000000000000000000000000000000000000000..bc89e9c154b383362ec785aa53b4e2f8e59eea68 GIT binary patch literal 89344 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 A5C8xG literal 0 HcmV?d00001 diff --git a/shared/html/fonts/SETUP.eot b/shared/html/fonts/SETUP.eot new file mode 100644 index 0000000000000000000000000000000000000000..c1d2803993bbd3368f172b2a4c82a9257e07883b GIT binary patch literal 89502 zcmcFs2VfLM7v6Hadv}ENKzhBD3nYY82x){8NFkI2>4NkgKzc7CAP6E&KoLQz2#A7$ zy^De({H z2+btH1b+pQ=hnd`jw|g+{tth=*#`%0*`IeeemLD#r+-?xKHNy|PHs9^1(lv$Z}>JE zzD?kUaZ{ltkn0OIQ@Lr}SZ*>miHqdga>-l@mj%~q-wPF_D=W8%6S>IpK5bG}(BTt@Refsv2Pm*aLS4b=3A0Bn{&D&?=re`mi+7J1Ic&sVd-__T?PE|f$3TUD zZ|j5b@5@kZV+aa!CAfD5$0=JTOddXLnbxV&0;wEthW3$@ zhD{vVcmI-&9N+H)jx$-SCQrMwrWZGp;|Edx9$XR0TSzaiauZv!uUOa+CHV;ooI_A|ts1F7nFTj0W?5L4<1B zgNc*2!oMRqPDi=c19cBhMtyAvC(4@4|_EwsF>zXAwN+K-mc86cpfrH$j0m z{AegZC;z5(ryxTC%!CzC-m&f!qoB-%@|AU`31~5WY27JJw(gWYp*&~ZsldJF2q-UF zcUt`6^CfsTyw}=A`G&df7e*>XZL0Juj@bC(huYiZ)M4(69ul!^3gR)BbNAiTSM)^l>31uCWccI(|&*X3c*;oa#(GtpDkd1UG z$3Q+(pgatv8f2pfl=V=ahXS%_1{qTBfp%X*X$$vFglFslSvwEK3*_%MkjW!Z$hbcY zg^UGgN5=vg57$#tp=XL&=J4&?$oAI6UG8T2(A${%j@0}Up)Zt{WpB4`6N z^3aZle{(PD!Ur(D%coxwEfC~>}oqrwr90z^Fz2eV6$FqRV-GEUElxu+5 zHYhOu<)@%zz%@T;1LIZv4GQogz}Oag!*eb{fw9U1&K!(Ys!vPdvn~wVKt15W0q>+e zzZISVJPLooGeK6w(NNBTOu%?D?FE^DF(HkB@-!3&$V4`jiBRr^0x~FDp?)8f*3kY@ zD86w2Jdm*qP)b1dUV_pYWawikOQDc)5DSHjk?Sp_J@iX;#9H`#2c8Mzf*%FtMd$~v z3n0V7-){8hz`yrEf$<jD&mtfbsy8+n~6{;`P!|U%Lc&9vT0D3-<%`1v-$2 zF(eFw@*B_rW6K0|nh1_SoAe}L5l=+?6)_2FdG-kSKRk^8np?mv1Yc`0w}e~DE#vOu zmUDM=E4Y>1D()U`HMfSlms`uNbI))mxl`P; z+;iOX+zZ@`+)Lcc+$-Fx+-uzH;BUOiy~Um8-saxn&TwbBce(etbKLvfdF})5U)+b> zN8HEUC)}spzq!x2&$$cS7u-dTF!~kvcwckhaNlxQxbL{{xgWS6x&LrKaX)jvaKCa_ zx!<_oxj(o+fpdT7-*m2mn*rQ>z6l27MoVXRsQwDzruDBVnz>j)xb7pN^=AxDYue@@mw) zXgPXaOmNI@Te9ux*uvO%;`+v2j2{>Od%^;{*}gt8G;vR>lvXEOcW!+)sbA8iq_0YUEd6ZyFB!fW>27~3GG=6K z$@n1CJF_%%Mdqtn!C6&VueS?rH?`fH?c25AmmQeBBKz+SOL9DNHswa<9>`12dp^Hg z{`&=k3cl%B)$zZD%Q|^>+R{0?^J85yyS&)7xa$W+LyE3+o7%0q`|@J%;;kjNlE+Ki zmA+h7TJ~X&p*_AYzq4HJxuTbEukF3#dLQYN-RISc9u*%~-ck8u-x;@Yx2@{u-|wOR z3H_fKkTc-*fjtL)I%ve8p9aqwA`Dr5dyCs29-27x$zgfJ-n^st9iI&!HT;(mb4GkW za=^&bqq0XG7|o6DJNmIP+?c*&){i+m);hN9*d=3kk9~dYm2uW_t=<0i7&mX+zHuLp zm&d1$A2NRR_-DueG9h|G-w7)woSg9e#PEr|C$5_K;>5ovrA!(zY4@Z{lY=J@n!J7T zhgH5+y{lGNot@%2rN@+YQ!Y)7o;qgg<5RCrYd3Atw0G_dymQo@kKg&<>D{JpnEu&} z#2K?@oSqpvbKJ~lXL--MW7hH69C)h(6-(DG zeP@}lEPL6cWqX!gxXbsh!n^LgYtLODESHzJTRv|2mgTQ5zj}A%-97JKboY_FFRl<) zq^uaUV%3V1E52FjyRu+q)ymx~KU`&9m9uKns)ts+e~)}m-aU8TbKstftNmA3tX{wR z^cs&frE8Y0dGTKE-t2ql-Fx!hzt?83UA6Y~I`4HA>o%?X>^|FllkPjYUS40ie#`oA z?oYXY#{I8u@ZE67h9@@)8+&iuz47-=T{mst^yB7&&G&BpY)kT%1zXNO5dJ{b1J7=? zZmrn*@YbKUWp7)s?eup4?E|(S*#6Ul*$*yy@bp90hx$FV{h?2H1n%g&WBrZ~9`=5? z=fmqBesia3XTi=HJ0IJ5@sYqsdOou3ktZMdW>?^@uDfRKIb>aa9o;CluvAwPt+dqLiKUsxT9E_@!wS&Og%WBzgQD3 z=76U2gV~M0rw|jJEM%nT32CX}f|wJUQed;?wFwDnlV`IPq=Y8fI;Mn%rgVfaZ9+ra z6oBTe<^qNO{48>REV^IlPw&qs_vh35-_q{SC(p@;`>S}Fe@7Ta?&s0{{5!aR{sevi z@XB-T_)qx_Vuw1Pu>rcV*<3V0x57QzGk_!L0UiN(wNiU4x#A!2jQBbz!Ia&NDU*%^ z9C|+hkJttEbL{~FA-z%SSm4^Ji%i{2hp)3=BR5ZC{=^#GucuzY-WuVzq9#$aOZnH? z?-9%|KO6UJT8Fy17LO_@&I@WT3zMbi>+aVNm_R6j5ekyp}wI~XMk_l(DY(2G*yl3x&< zhcN>3Axy0FDWa{~8`0+IgIZ8pTdDEVz4Dj;k5)_@{w~0%s6EzdI82&J!8LMQjTAO4 zs)uP6PGnWB!l`xu*GP4Zsl8&mVOn3rw5reI8sRxCee!ffN%bkM!b$7vT7_$ni(KoP z=3<3%`wi3Tz;vkhU|Nm3Qa+5|xvY`qr1d3KLFBc#W`~%etiDlN#SBcDIt5eD`{Fk8 z=ZF$VC91ggp;n>Gz(}sWI8k}(dTGVlMVyG~P%CiFomgBIjG|+cMj3;(T5sVZ73LL7 z)GYZO<)V|;a-$}|qX|=suZzbqt!e^B+6y-^eSw=ODOgNSYy3FJV>YUAbkiyr$7J5r zSIv~BDvs;tuOZDR{)C}dK?&E^Fa0n#A`I)=E{oCw5$pI1Ra7s;6-F<^#AT~fO;gNa zw~jwk1}0wRF@HNKH*U&bFc?H-B6@#n2&$;oU#L?+N1ztu{k2v8RVJg z==MsL-5NhkU8tkA3iiGny4&r1fxS@+Sn+7BZc+X+-=Xn0ykQN4IciAbNX;>Sj{UU8 zjT`lS%yA8_kgBlYD^H*|sIJu*WSBVmX%$WgbT5xpsL!DmfJu&;DjzdXYEn!(VfGvc zFnj7j+~z?Hq-g=ZNqHV)@}$Nf)60$xT7?snnW(~{8%@>%FzKttNr%jfniP}mm>I`v z%&@u&x5>d3;tRM&Ij1q`94h}p6^@5cg`0!slq7?4khoE5Z|U3mF~M`=Mvt9uF#?Xc zm_2nUt`V`|hz9rBh>4B>oozZ!>J@bQSA7LnIFP78D1hs(Zj z8r6y!-iez)$O46E3_2DoP}K)P;Kj=1pM?C^;?{QNr`L6ol!nEPi|67 zn4j*ZF6+Q#ivg3@Fa-T*6Sv1GQxJ!(GzQr~P<3D5sdVR|I~;9M1(B0pe7HHtJf|r! zF$ZCO9it6$vJ4}jg8yH8MjnN4Qi>4`8A3URFdp>gc=Pae}M zoPy&Pl+ngc4u8bFzJC7%W71eVWL}Sj-Z2lqa>rx?CWg3LdyI+vU&P@NgvrO~y5nVB zk&7y*j!okKHowz2IcYQ|uufI`1v?D08wUguYqwFOF_ObEkh1PvFvIg1!sK=I9eg-6 zbaGJz#iW&xZ?V+xv)!zmSS*-d$0p1kXkBER)BxPZFmaT3A&&k+-|t3Jph~ELTlkWJ z#pFa-Y{@gbV)S+D6Krc6D<_sb%$+e-VDxMq|HVi?gC8T0LM-xe2!#IVyU~d&M312U ziSVvvRsBBOO=GeObLV&zONC<)9x0CVxXq{dF>(xInb((<*kI~_I99Qxatua~AebbH zewH`f;)r$FoyKB<+gski%sANktDCD)hsW|N#zg%Y3ySoD#u3AS-;XLh(06qLs&I@) zumL97;$X`)^YHp?G3F8L7knLmw_Gz|^0J|Z$%)${t-}y`Q<>zrAt~Xp!Cylx2WsD) zUfhFP1w+xHFAK63fJry;5o=ogek|s(v6xuX@Edo$hu^qkxS`Ev+(zAt+n6qE95RN4 z&RPZ2nLV}dPE1ZAv2fsY0KlZ5xZ66c{y5uBV=~Mj6^2pZ0LQ(yEv_RzxyXP?1>#W9 z18WR}xf&)+EY$B%g<~&z1Yj~%_{TaQc0$zS$2NpXLw3kIAM>jQW9|qh?)fVzp>@P3 zM_|bj59l1yNuQXAI6R5I>p>>x(0N9Cf^+BqCie=3);TvPCk@OE`_5og$7>ZXP$Yh^`mJ?@d6>JL zG!_#qR~R$V;M>dKrq|}q89#CJ#~g76+@8jQG8V~&X)@waj6f~iLX9jsiKmI6WBJgU z^VW&A^+`iKVxAjnFU-PkT=~Pm@7EZm>VFJvcH=h75CnpoK4G>Qo7yo5BlWQM2qrkh z?%d10VI66n>nVa#jPv9Dd4I?SOhB&?!f-2-ht%8Y?P=qRW zB1r;F3RTrw)VP=u#sGge$jJ`;#(6d{+^mdj$j7Mu3`<4zU%19JKx2@}$u+m+Whw=x zml4at&)O{vq~WLmU^1oVn01mlvpyZ$kk8g2CTH;bJ&h}rj|@VQh1*m=Z-C?*#LqR1 zk?4aE5Kp0s0PVZ3V|Q@Vt^LehZY3rLJ5-J3q$Nhc+yx`x_yX5d8&Wo;O2p7LUB@yG zd9&8SX^3zrKLf!^bnK{_S1nWPk5M;dXYh55iI9rfGiK{SFtWBM{|Xk0>OQ!M^t{Hf zbL3Pb2Gwa=3kHeY3spR#eRqioV3MOoTMFxsvtgd`SZV0HFb0dodzd}bVBAD3!!^~0 z%q1DmX{&G3SY#Mf>-vT9tmuY`wcxX~Tb!ssj9Q&+dGprVVvLahF~izI067E5ixYmw zHBt$#sW#*?$vu!@RO7*O?Q_JkJPuX3%@Y|)u*3thVplI)+tt4oi1}>nci~+;7F0u? zu;78)$Obg4TVvfMV+Y^CA+E1s=T(Y8ErbsdwhWi-ni1R3B~|_7w6;gq27jT3_$`Z6Jx^1;2NbRg1~`SEvnmTEf@w499%Kut#qJQ#;P&q zYDM4Ma~*4fjkQU}WN0-RvzLG?$Y#6Raw4W+AdUNf^z1#SoGe3fQhinfiM3Fk(ke6? z)K2Yb*>AQsMot=wiAliBsQ#GYCAdO_M5o%Am<(>9G7#~jnzRZQtgU_%V}k9n{3>bz za?)CT3hYl}lVVbYF>x3o*oQCzLOHIHhv6D!t_A^n$0{~14oPd_6dWB!Rv{G_F^Q=O zg_v8%CdFhu_Bu!wXl)_5jA7#qQ)I<38&d8={HWy!0*76%paCfG@R$U-Qon?+^cF0U zi}-Kn%!8VCj%+d@;CLNlqF%+g@vU$hX&-K5$d*;7=p0fE9DNZ65N)Xq$`AS-E=&^C z&Wciht}M1A_&c`E__}1wfqWc`h58&u;4H2%J%wu&-GgO(s#tKq%+yAp`W{rF`Wi7Q zR%4|7U8Hd3qQ}!{Quiz$z+aDBs=0d%o_*%osBsRl}x~1z1k_NAP0|d%pG~OjKE`aE_%c1XA_4S_>vxbX}un zf&6j(I`*dJw(r#g>5lmXu zTu{8~j~6r+6KsbRFU+1}q@m^lu7RyPwPCx0TPTksj*B(^*gIG84ll#jV~30$L1Rlv zTz6%nx$;)(69Xm_@e6hsf{c!rahu<8g~9z-^o_&}13w)T>aeMOwF>9Z8Hp>BwF=kJ z0Xa$Hwk!MU-v<|q>`Y^Av$7Ar@;dgxfkReXEMS*98YSWRWXU7x`CsvTu=s8~*5;#k`>$x9H=JPul~)L3=~6Wq)- zRjCgA%Y(%3L<(yyLmIb7qtTcQG4N}M4AkMV{DL8P4L?S9GaA$(;rnP9u-A^0DpXx7 zJME4eCYs%8CH&iR(A>K|Ta5jYMq^^wf#SFxObpREaAa%CiF8GSfN{ug)+!h#>FB#U z6jeBSp$Z}=ZNwzYZ}t0Z7!#~t@OAv%V#wNZ+=tn7KmfWn!;UAgSdi@W+HIsIh$H?h zG@9^cKttAn!!26L1O@DlIM3QhebQJ=tg%>sIt+d~*$0R8$pKuWzKCliD}q44VUq?_u|un1j{r>iifPuW`fc$|V^W3rRSm0PjviPB9CzUw)i9S7@lY`&MQ+kK zW*Dh|Y84Cu$3eY<>S@4ajxZHYdZ{0Ij){C?HGm|urs;nOh(w}D@OM6*Is z-=x7<7VpFM&CEg7l`nsF+=8imA&#MyY0y4@OPE_BDFq4(ZcOq8!NGeSG8861Yi zU`H!@m%IP}CBEwz;z)WBy>&s~q|RWALk-jt?GaA11DLc?VZEmWM7~UU?oVvwQ`I#C!PR*ug@v;dy?}7MHzeE+BNsw!LSQfbX0EW{S8mrmO zD&}tyW~O=@u7RyE$mP+0#*1+$>zV4Tf?tgI|5f|$(n#?BgzoB4*oUhBex!jv{C@Cv ztko66>_>no6ncL*tHnZ`xPQkP~6pX5IeSl}(u%dV)i6JT)L7)uR4>I+BJ4q=ne-qVqgCHO%Dz)t z=W^XGFKaP1!}%vzqA{(OmobX!o3zGF2Uo*f4rJV|=D!-L3|8rDRDodzQUTYm)L$)u zT1?b18XM9!#vPfE280G*JO+A*Mi~Q5ejQct`qV+!9fE1FlxErM)Ex~Qh3Z^ejgRBu|a+b|?oB?BnECmEWIHp9x{0X}8*BBP0$zl$SPxhOK z4f1O>jK*q%4-fh5u7i3Qd*WeK0Wu-Tp8Orw&d#ycaKD`~cMf>rwPjQAMY>eN{w(eH zxtdoj)0Aq4GaeOq)L0B_Qjl+kkiQdgCqJoGXljt-mC>@z{ED&+`ZaKCeg!{M{+IR) zO+?@b+z4r+Wv+atu4h;bzvwLEpSd7okvG3+8gC7i-mdEz)=-SHgv}9shQ(ia-dbe} zuk#rO9Vp@iOGd{_+(*_hA*;@37=FWpU!mcli7uSI^c)w+zf$-4Py8zZwv>>Nlo)^i z81iWgcuRYP6H=b5;AOu5|2hAuKfS*VxgXAug8To^`A>;({!^R(bN*AC02{g2Nkbc3 z!2db_DH47IeA0EF{}f9pOSbv@+mb0|rtX;5>pcG{QC%cvUibM=Ms5_$-*uk}@OFN}d%218o!(u8D;t~5hYCP4ITdk=M)91Ys6On|NN(hXcfHixcLoN2%Z?} z8#?|8XpO3AE-bu>^PloCA?g)OEN{@2H+cS2R?QA!%=MrDg#AWgjDgk<@EAUeiNB%a zp8(fVuD!7S#?OBe)*EPj0oUAyD{l1sr(tTA6r|{T#0(w?9!(fod|h~x!sybCpbFK8 zFw!2FdT}ppqN$UZ0OS6z)0&ZHzEgEJs&GpZb$Lc6u0YK+1>DN>pMo;Ey?uu0adt{FWU5 z1Zzc6>K5sr#^r5b4ja-q;%WSHRD)%@ggFL{N*y)LVKezN+?+043aFqaIsOSSNm5fK zx&GXJtX1*%1~CCGRhvJx0HajHVNhn^CgKnSC^&at#dF#lJO8ObjWZSA+;2lPgo!DG zGUH}sR6Ax^{T7d&BwXRtoR}t3 z1l(qfYA9w{eG}J+7&f5`t}$YQt@TO0g07Zb-}z5j>Ne93xA=V>Yl;nFg7pi=%(MeD zqk^F$^F3WRsE08o@%SeG6WYX0+zfkx47s%*>6oxBsrniYb7`tCp-2{4k8h=3HvP+O zO{ys{`4`hC&KWQ9>Y7o8-Tj~~xJ{806U|THVV+DU&RXciu(wcGCye78JpT#os^n3> zj=fnqk-&{bI@WBcS%DdzO`Eu+0)RAzEDU>4@zUN6p8ph8b3p1`zb$SoCRpc6EF$AB z6(-EEI-O$Tf&iS2&A7=&7)OIG))#4*m>5qE&^HG;=L_FxgUdBNfUy(Fc}cVC-_w56 zn6S`@yN-qESnXk;4x%+~xE*H|dW^y_x(qwo^&bggM&?G(e+uVjNQdj+(;kbm6tE7( zI@Ta3hYbiQ1|8c8WAY)ElW|N=bgk4h$3KCbBywk@OZDf0-83fPq`F%f(6L5LQn6V4 zh%qU|PidOtp8%6wK3w)|+Vh`eKgNw7Yge0Nv#Q2m2-F&US0FamO?CcL0Y64AtpB&X z8j_QS#*)m!3!46n2~hnF2n1sU)C(8_3vSX>=RYO!N92k1`zII^sge3cW`3-jQ?7<# zehErQ>l)%}tuT;Hb^cQ{|F`@=(IuI9VH%f zr{>^SuChfV*Vq9+Rvp6H=u2L^@DOaO^Pi$cKc&(wj#$SW@TM`TWSBTd3XuWV`l~j< zb9pRIkBmr8AB@R6SWcSc_$M+i76&Wyv^=Qm8ar6OV9c;ztIRWC(i^j<$%!`UC9$~L zn%U|4xnP6!~kkhA_eHl|Af@>r)q)-Qf6%6-$N6JX?1Q z?!ZVk(fLn>;%?=w`r~Yv$3|oF7Uo5rX3(($mWn#!lNa%GOn6J!tvUaxQus%?(6r}2 zDHkv=>ix9F&8(_`3ANX{hB3w`-^TWt6g{!H~e>zb! zO&Qy?=Re7xVP@7~kQ~3V8r?KGz{u1##p)>9M#Ie(VAD)7i>uwD^Pjjc)Cy&9ZJ({7 zvC!DDBf*khZT5t=xJKo$u5et&H7d*Fahnre!=OBkDsJrjCt3YgdAn)Pe-id$Z7IP! zuB~HLXZ*yaP+&NLbODksZ=ZO-hKX_0od3lAtLD7&er%>yG>FM$JPPE&227s8HI99_ zhQudpOIH(}|CA1PXLS9TUG1mA^t37VoaRDSC=}832@xS5OCFig82($V)&(lTXFmo_$T3NA7y_1 zJ{#t_q3;c2BHWHglXwm59LGx5#svz%^lyx06P^FmR#la!8W&S)G$vWj7p#pPz84k( z2}TnP47Z`;c+^nCbdH-XZld#_Dr=5`-D%qMp9VNF(PAT;@e7x}#De4a9^d4+7lUMK zqVu0-a?_QUoA~^v`HVf+D6j?i;9()BQa2&7$vER&VMScc~uFhKSte< zox#@)wi!l2ZSSiBONI0*Zn7Q=g#+>eYd@vQ&VNc$qvc=gkF#N(8`39+>t`thE+K$e z>vqbXs{*7#?22VTn2m9BBrs5%;s$p$)%j1+>SU#F{kHg~F=5j=SEd#)133f8({QO_ zP34GxV;~)Y7|EtN{z>8@)XU0&`qu$(784-^j{}3J!LP(9nGEw{M-*$LtEHwn`icCG z^91GoOSzF?;GcT*Kl;Zmx&)E=I|?$lO$CJ`GUI<-A*a<`b49;USEG`Vy`QW%^SO zzKY*rOg?2zbQRk)M?QgXU#`Z;&$;dAxsG+f#_AX0U1maDiU0zOu*_Lo$%f+!vcnDq zqDJ60#yvlJ%APZAdKpT8y{9dohCi=Nz9(2+4jBjf$WY(LDEZudp?aT9)xK~B!-?g-t+b&Jk?imFL8eci({Z3l@qLAq-e^Fi#>=b zIaDeHZgxjqh)2^rj7h^Pb_RyzMvi;}yAxS+K`N;~R&djplrVmEE2?^6hDp*uZ4Cq4 zbwCZf!S* zZ?TQsb6^-d&tr9|ikLsO8y1U8_@>+NJ%;JdEjjWD#!eFVt@K^}zmq`> zP7`A?hhakO4*LNuH3E+V)dy<})u4q8lcc6P^C?=8sVd zEKPOhQ=qU`ksG%!qp_GMvOy|xu~ay~%+y9eHLQSaz~a_aXFf#=|5gf`_RJ@R?K*Ln z0Tw-Qv%Gb9afbLLII;kno18S&nNKldk}{)ypAFkutY7eTJWp0;FgbDa?O6tn8z!p7 zASYe$T@a&2m^8(aPsC>v=PBD8r%xJ<38WFAanaE*n%HuVdql;sr|B0wcADhKC%`02 zd_{Ssem@q=K|`3}_R1>;Oa?Gp?24AaO!;pn1SD4AwAZPIyZ*oyyot_yDiG6@59+tY zn8!wA@_~Unn9q@6pd;Y8hJ}FGYb0IgFeXiO=F>o7Dx7iKq-Q=UhGaFeUR>K_f$VyW z0Ay&?jvlBl7%*v?GoPyXUCNvF%L&$*SZ<^Se0}9j%&%cmNFYG~nDI@jA%xi^M?Qf* zSERjBA&u zmdm7$rTRph5yS*E&6!W!S86Qe$2RGiPbTL^KIg!I7`50MBcOu+U)#z!-oZ7-Rc5tm z&U|Vvd<%I6xA4p-<$Y`&oO_Y9_Y2zzP8d{bJ{~H!=**`q{yXK2+d5~1zhT;tr=gs2 zzAIgR_v5$cU~_smUqdzI&flUlpZapIE34|`uOSPGN4>HNa|2ES64zx0k!FEYw~5Iu zIr0h4v|3ivLkV~D0UCV@3)Xt_^H@HIVqtVlH*owXzUda7`NW@4hr-^|TX^P^bQgX( zJoD+?q|xC_w04^xe2Q7VHD^BY-E#(mA#ILH61H>Q zm0ns*&2Z)u)=*djD{Lo{oBV!{33GH{H7DDy1p8PQB6Ks8S%7My4=2We$VFzP|IG#Qmm0%I51m?@56S1u`ih z{j#Wo!?1F4edj%y{KOm>o7Z{XQyn9*6Gq_r&U-Sg;_pz7UGI5M$}!rDOB2E3pyP9= z2x#8I^_}-5dDgt5w7A~$o)osK;CjF0myH})^seu`Cuxmrlh@aM-jmGM)!p8vtpAp@ z_OqoNFSnE?Dxr0s_oO&~A;mRNV*=_v?@3-~8n0}u`@AP*BSyLI^Pc2)h3AzI>OSwu zsQ>Cd?@7Lo`$*YT_jymsCX8|2=RKKL$yeoI^WwVBjFN*RGrQaE-7_OypUO$MZxIoh z-RZegQcL*@`Fn^Dg}`B0(ecTAe6pC8C$eRU>D|6-&p3MBzfEXB$C4f~ZQ25v@-gWHi>&n1x2SLG+*@3jymIBvfdbJ7ZR#p-b6-Dt@QluQq2IWDH z02Cb;57av!PdWg~J$du#q{^`3p;2*G|Dd2QrDaho#|8OWoO#Yr;)|DP8PRGtnB7(lP$! z1GF~4;-75$P5sth+9BS=1K7NIz0korOF9R?cg*pLOi1{Q^!T_uAuBUnXxYNYAB07; z95R_r_O7WxBF}gA=EJk%;(B&%?>$lw#OTZ}LI+-q%`UO~+5Dc_OE1tSzp8%+X9UN0 zZW{{yJkL*oeu}wpf)N$-O!saA{7EmXng@AOVULJt<`I{dkWgOOwpmh=B`z(GpJEb0 z*vk{9&Yw4x*3%Yy4{=PZg%41KxAD$CtFUx^y(x6pktIg`=<(WBD zKFyvS5B5KY$6}HozzQ`9dy&w4@bSe zH54=%jN`A>E7rcEqK{+uJ_rx8ax}GnSj*<#tz*`|kz^(CQ(cpP|9$VIt5@12MfWHv zY&nGY-AmsZRYpI*@%pkz%7ffiU1^OK=5P_@ofFxG7m>$Qr%0df$;utccvKA4L~-rH1n&{gKKr|0th&-CGC3@+yr`Xb%&0}1D|L1C+jFOen-zGpG*Rtg z`G)`7&<{~aL>ob8a{HM4j9A6uomgNWdSu&@wxE5=ZB#oIoxI>!>8JK+nV21u(4%9L z#lO62U8PHLmD}c=d1OkM3HmYZQ8O(Y`Gp*)sapKF`XQPL_>v~ui!!5lJ}jeK;+Qv{ zdZ>VED5{P6eX*!;Ww-mbs+r*#MRt2}RunI$4O-TRUZl;YJzE%)?iVXT7vg#7FNOD@ zW0Q>;usSW$Qf*9Ug)>2uO;Yd7F&Xy4B!5Lo%qz2ZD|v?Rv6N~rqN$GmXO3EgCA+#L%pFmm*lcU#N9{n%Tc!Kmpho`qFaq z^K+=8vz0@ee*I~G{1G)%d5!yk=^uBKVoFP8nvSSxsrS_{K0Xo|BL{|r6qS`k&gat} zJ>gVoL_~j9Gb?&;qL(6KP9WQ5u-P^y|W2p0)^ zRIx&Lp1jn%Y*X?2rAsdj3~phGjf^ZU>l$3R^TeBDb7r=uO3vCWJ};rqel^p_C#E3( z_>{=f(yqa@ZLdYQC3|_(>j^yyQ>`tj4&)B2netJ=pRgVb$sJ=fn~X_0EHIyS$P$t1T(?&4CN6k~2M z^c^gm=b}m9tZP78Q@;X09WDgGs*u$ClXr$cRncc{&g_Eb=9rv>`0~!_9?6e=!v}13 zdSGg1=cu81dFv|oy-6>UX7THO+&9RnNh9Da&$ep5v|8NC*`YsTyWIZMI+d7@W_n5S zP$s=MeAuDV(s?Ou^F5^&Z3y+C;hT3Izk2Trqp5c$#bk6=^99fR)Rg&UrH6(MKR1cC zf!3YvV_w*|W_(d|>f*%}B!kBWG_+O+oBlEl;}R&(?JU`;tKN~@VHfsi!E>|6_w3{ZcQ{ zrrE4*h|idBZ*B?hdH=aZRHFutQdfJGT;2I7KjX~@H_?l<+4%9RRmX)xncnTeLCo&R z-g9g9jQE4}0~bSi2G~iTV4IwJ5V{4=fofh}jLb;c@bhg02DWeSlijU6E;cii_vx8G zbN@IPtJZ+f!RncizQ5eRh3|cIHSe(~E;EGpAq``ncy-QqXCKR>YC0v&*>6pxSS9Zy zV~g2DhP7MIAYEG5!lRM-q0^r&>=JF8F|B2%(z592L{G24p1o5BE~})TV|bs70RaQQ zUbgbSO%I*s=kB4`Y0Ep+zt@aEbMleGVB$!|!STuz>zak4ptL7glm6kak9U^Sfn>@U z`u7E0Nqi<=XdhP`c6|8g(IcPIyvC)gR)XdwuI1wJu;V}e!8hZZ{qf@oO&Kp$k3I8@ z`XnfC>SmJnTl1Z`Q+b}qmy2h3zob()E$Jz;eyMNFf0k4cRyZQ2yFI?7zjW+c%M{%*luL7>=+s-6b$fc$U0h$ZVuSg#p+PD9t@niYWL$N)(W&8N>A(?S= z-@3Ofk7(vLw!qZU=_#A|vd3THs~&miYMGA!*W=2eWxL1!t=>KRyD`*V_4IJ!&RvmO znn#oOPW$(P;YAV9RjF)}0ej|a^W8d(3>*;`*L_u&9fO|z5VT_(tEIU;KVh5dI61m2 zDD12_+m*uXtGqnzv+?gfR=KXj>@=%qLVkk1N5>RP+`b>x&mTU%pEYJp8>8OP>>m`X>y71PrY$IC@L>4&eA$%(B1tGeEBWU+l$-V1R*4?C~?jgFFsV2 z>+MCAb|61JAU-Sl(L)RW{Pz5yC&x|j5<=6!Cn#wjBPiYH?s?;@Ik_{a5wI%c9SEHK zILu=+InIyxQptRVHxUA$!j=XT7&;S;p;|B|+SBAB$CG!&cFM4UcRMC^&A{XTnagv_ zTU92~xvFH#=oAZTF)Sy1;rD0u%`Buky|Z0uE^xug1#zuzYt1+NbH=%W#6^H7kf|-v zdxB^xoVo9v9~Lk>VV8K``JRN0%AG(X;6!M2C(ub>bbK76&Qth3v3q93n6xzmPy9fL zI`>L^PK>#^H7+$LGBRw{x`p4rvu{=*D0^WenVmC2P7F^^%Wt0Exja5H&E{`yT{v?u zkU=a49iOS9-P{KHZv*{1=Q70GB=9&rK|Y4qB|-vtg{snAp$@ZG_euBnA8_Wv53?$E z_1d=9*0zP>A98y}YSM_$r%n6lrQHkqc!6Q)B-(k3!HkRVo-8k)ThYotAim5$5B$iq z%)rccStHjTeRoP+J~0eDS0+AX{x{IlipUI|)zfzcuPiOqMU4Ps$rclBBEweXgF^$s zx%Oxl)-Pw~{)2Ci{j}=akIy|88EXy*4(?i77CB%2eCKxc(hmm{EU{^M;!_Gl1bQTl zeP!SiOYbU*wUw3L6Wq0|G?Lyha`cENuWe!zBc5AqDzr=lT8N#bw7^7yNR0=tjoBC& z*U6%j7M|}OA4|)zsV>2PZ|Alof>p2FApc&g$K&=Z5zdgX!S87fi2OF1s*c^Clv}K#7S)4w#SW zB856g{Hoxzmej55`}2k^e4nF7`QBUZ|D`W=@B-6US3-oNBmNIVtjDi9%JSph_1Mh9JTC;(c)&vtm3%m%@BfJwDZJ=+< zNtkO6UzIneMcYG{)nD(MaOTvmLfx$&_|07_?%({-`~0#4z1HT;?c^y%Wyi;utVMY% zzueg`Wzh1gkn*CkXCrA6; zUsdKS`zLiuFnf!ggOc)Mt4<%hXIQ$+6u~V6SEr_@CAR9lrS!?S{yoiJmY1l|LCy0Q zgqhY^Ko<%8#6a9DBR$!~DAQfbtV{wFktK*1gc4!49FY>cWrXoePi$2$&j$CuYY>gm z5VLb}InT}g&+&n4QpbSHoY_s7$wy}u+XEN;@DAvqp~OhRjG?r&OK`^#G2PPAM;-@; z{#5_4_?YcQ8Q~l+RPqNkx}4*Skw#3fi!>%$PQqw}VM|LtdqJX?xtWELHut-6&d3N% zCARS8M|8r%%(jdI{-DW{)UnK-a(i1wTYfH`b-+I%)+@6z+ zB8bO8GZv50=~4gwH7q&Ohv-FdIG0B00oiiKMe-oVLnwkNzLO-Pm$Y|C!zAYF_USRL zyqmY|R>G*tos|u9l2mImGAF4x*iR>G!q~9>X^|}pAwpQ?xSNsX?M2&x^=;b>Cau~l zd`aD~GYOCZy8fuS&-D(eZ$kn$zV#C3O(sp|d9g)d;SoYe*xbd8vhZB@U`^jvI%Ox1 zhLuhZ4GAqSEeT)DcR9vrGm*HD)BTqvoi>;!C!dTU;R@5Lnr5|Vqf?;PR z$Ig0rWpUQ1wNJb|RgY8u#P52z=iG|c<42EB|FbVa-ID# zrAMwKzIc+@$k{Kdn|E%%TJF#2*`p2wdT!VB7LD-;@D>F!2x+i~jlY&HAjZdnO0qnS z`bac_x9QrGBZ#r0wvSG2-hZ;L58u9>5C8sP z0*yA&a8$clIcqBqzJ31Um*?L;cwqYMb`TXJ@9=`!9%yUB!Sq3o*GRQV1KsXRrlc?m z6**ek7vCi_S`>p*yV_@d`s@P}b9!xfe+dmo(J^;y^Tvr&?o1xAtg`a;fB$Emq^Rvf zQ#-}mOFG1gmeP59UcWeVH7|Yscm@ldlQ35CoH;ulRad;V;J3@~4;;9DT!96=CEnzt zW?E-K44oJwYJ2IN4F+MJ34{#vzaCKs0=*e>5Dbaw5^e9A5-6GCJCxc3+d4I7!OVl> zZ7C2U@h4%ejaT~(95iP532^snI5kr=(Z=>JDS;+I1fe|h{ldB5z57@$iSIUM-+uq`1Purg{KO(k<3n7AJB<*3s)Iz({cc1Kdv;(#uFdMbUi(^DiID3*_gNM-oB(FTza0wN*KHIV~~-4Lw$cg>9g62mb$R=4;nIz5x9*Hg^3*4Q9A8Ac>4V3I)UUJ^Yk6d zx6v^Y8S65fY-R_ZGog}rAR3kKvZ#KkR?q)*P-u`TDk7q!tXoLogNL8HgVCAiw39Rj zH$W$IM*E$kBT7oUg@%y3x=-z4XN0ntUIE1PV15WOy~DNXFt|P9+2z7;h z+~4!#>XRGq`>9_*GvDNxnDXL|0r>|{U!KjVjET{W=O~@Xetr8~Sxegnc)(p_c1_J; zR1P{)8P~I@y*FLoxT^l;P9)FWNog!);{_ryE+$5nQJ+uWlNpTS<|O%d+=%6+{+ZvE`Hgk+bS8MxwAU3 zMG|sf@`OTz{4j=v6ZuV{6(QYrxZ)FaD z^jAJ+|b&r__ivv?^gfwRuv=GWxi=du~pwzI>B9qkH1V z-}&Yew2g?&f;Aa7F=n^%WX4KXY6P7?GKMIPV@;=O)94Dqkq988(G`^=J`DUP_15U~ z04wWUyfKlvH7MxG=bqiU@HT%XDZk847n2jeKHBf)@sqz+Gc_`A>q~-`GQBxG*Exw# z8*=yFS0}Rd=hkrZC3X77;wcG<5I}O#ngZ)^)F!&{bkRy8cL1l2jCLBnr1l!Djz(z` zwa_G1X^mur-pgAqJ)TCFo?&U)iR9FoF8UzS!N_q!3Cl?OnhRMX(C8aUC!%!jTEys^efjMJ`DF3h7L)AT zti^3Vt>36V=|&xI{w*#GTyJWz_dm_Z%bB`+3~e6JvA8^D?UjnY{n&f941%>-YO`Im zxdlG8SN;F#8{k@~09&1#&nUd(xx){34DD8055T;__-k{Bs@$?oAhShjKlv3t=n zrzNp~CAou9xs4BDAwgJ*-#$P?s=-}KOQYtfUu|PFl9`-^&g8lVK}fQj zCWGddN?vUmX*7$j#cQEdLZ%y)#K(4{a%|e#K@cbHPNutIcdcere*OwwmiLoj&HkSI z%eK4G$b0@d^Zh|#p(OeWcP&+qoMc3fpsneBU2T5M&n9D98K^vj$4MQ5S4t&So!~{f z!)UX0DSTlDUH78%*}iuTPGMBuwJ4!S=Tr~6{(sz!#0R%*T)zD4fpnTo?dXX2 zWt@jKHaDK$m&x9oBtL+>(Phi&M9^-$H8)O#^V>%YpZ8|@!FpGWfn2E zLy4WHB2c;pnXbWa!%(`2%LpqNWYLC<5*qh$r%hkINeKypsma#DWkto^iI?iXjqrU#pRgYQsx`}e%MeFs10g<0QUcxS+X^^?1M zO98O9MN=TW`Yhb_(nnL5{qynT?R|5=C(i7^baG8InnMMCtaA;5Am$$4Wy^Xjw5yRO zycm%aJpYX%Tc%&U9({IAhndWz4_nheD#61yFs$+qKmUQ>uIRG9Wb1A{>`crpxdY@9 zBE6H&zqqG>W=_}>$$P9>FCSpBDMDAA0LwA#1=_TbIJ{g&7Fm~}c2|f`C74k?iQWuhGmB_%9hLx4Ta2#u%by35hwX`Jg*ZaNfL>L(}}c+OsIggW9q5J;U%Tr zLs@PG#1+$F-}Yjnm;G7)2~C$hoeflQW#ngtH*Y%o*I$S5~M$!ars%WjL|8XRUP& zh-J`pG8z+hzDOrc&1gc0r>9QVVZMyn$+5H%kAozvIwhpdl|2`%}@S|)ag>9n$o zPF(-noa>7op1FAptD(2s%Lw`|TxOUFPM{~~nv1){yJGl26i6Nk9+Nef0HV@< zr|BO$T^HVadp|XfVHHV{d7-n_ueUPDSc-@+gXDt5=u{OIEvDu-F2O%w$nA_Q#Y2W{ zk!Z5e!oyjO9W7}<7evvt*a1b&rcL25WfqWYq^R>{{5@MUmFx zoB@$hk+$eAh0o1^xo%fT_JhUEy9TE8+j(hKMB5m!=sfql=_R`MK-ch`GjZeE1C3d+ zg#eyk=~{ZIgy;z0=ZT|yA6R;*bjE*6@&oc7qbm;(Nr9Dzmt89lS8p3IXyAa`e%;^< zEQ4hocYrKC9HdJRFz0S>>S&Dtyr_<+u^u8n#1=Bbm>B{c<_a(p$HFp@W=ds(Rja;d zKVr*q%xA45&X;l+8mhA4&Of1m#x_H7`33SmlD;Hg45yBM~ATpK;66TEc zQ?gdkP@et359(LjcdDPxhYXdX;NSqWE%MO&AAfi0+{jav`)B6#3$v1$XpndUVtG-U z{(Ef1m{Gw2iZkWq-jW{OV@4G&ePZCtW9YP%1n_uaoM^XBb;k+TMBKysMAws)64#1| z9BtV{S3AA>EZF_x$5Ur~Im%YvJ>TEo9FSt`wx#DIhi3h7;mm;k>nC^fruI>3F4}{W z^W&zxOYCHJdw&HQk_99Ggk1kttt#f0mp}9F#ThgaP@uX~Y%Oe{abdcaMgqaL0{gY2 z=$?Y*h;F<#u7K5^^ybaY(K+$M-x;TegJE_mY#_5yHZM)0EgvX|tGE0WxP0x}XPgo~+t*JQ|KAd4-CN>b7rUdD!p1D(Yy!_={d$)ARbBTdG zm&Jch|MKyED+i~vXo(U(=U#qm&zx=&Z3US#p@N)~Ip(QBA6)rsQNM!~&NNVtm+t1i z20F%YkhVeAJL({V1>0Z+Z9qIEIK%9(Yn$5^Ja}?ULP3J3#oDH0kA#V*hdjOVp5n5R zK_kCrbHlx-#-BdEW8t763tYF8me!!koaqN2Kl|}z^{?OB7ZRD3OSqBHx6PF+!PXL; zA!h;R*(5Rv!y01FBn)5)4o(fExotUlJ=VTGKQ1%W$D8EI9Ofg&O|0tQFLdxo4^KMp zgS@vDJonk-Sw7j2iUSRK@3N~qcB%KidKmKKAVr3kuhskrG38fD-_%cYt*5w0lY=1~ zL02oxr@RRn@7f#fc4>t zHCeqpEIgDZBZfaSYFv88$fv`Km%Cmgwu?~zIP8w>D^P$e3>>AV!WL@zc4c-@9Ts( zHvigv>gH1+ND6gnx(J#_Z_xvxG+FVbeP zJoU{J>LHkbReCmuelyfn&~IBU*N{vT$kI!#7^4$#MV8f^k%2UDx%mAJJv}^W#tW>f zq*#6Z?j)Ar(f)Djs={oVYnyrK0xzx3nwUwmXK2&1?d5N&E2(*jBaS35`Kfu3qr8z| z@3y|;iq#NaotR4(VmoKVKrS`p+>M4Tx(Qu9wTPD#Haum1>9!Xk)lT+M^MczH#F6Af zl9soIq~(#!Wtw*J*=xfdD|=uF0af|vpiiF zzp%FA9zLQ7FRz*HjH7{iI{3_^eCqs&Qpf_KNh3!;x&T3hGziX-4JDwuil&UG7igl$ zrd}0w~`^xFfTtB zGSA=&%?5#B9_f$21Tmhq+@S_@f;-S&t+tZtq{12MjQB3-o3@`aT-iM1M?~cT3+}2Y_h)bK;LwJj*wx5qv&B(%3 zpa4s{(Toh)FR7C~eXN>ERHQT0gDB9|9`p)rV>Uy7o@%C~@{4GmdJO4}{YO1=u)^Ui zGgXu_Oxy13wz6>X7ya~zQ^7+|y)l;NZjihTcu=fgMs%lVr?D^=*<(|&Y*3oWM?ty< zO~nA;`Z=|Sl+ORd-Wv=FH~w6Gna23FTv>hLWLMC9G;)+5(00kzBey4XO!T&pL<@LC z*px@k%%Lxcs>jN8RXzP7`JzVx%dFtJ1(54HPFO(pM3C4B`3v$-&~tVJS*~{5uP0C5 zp+|wDM=sn{K?O5#q`De56`Z;nPc{?K78P3-!HxrGYAer`sy~RQL=U#li#}fKpap~v z=uA}jIW#Ni%-Z$&Ru9O60B1F&S?kx=N4NI&Y!TL9{lUv;`D<_eLbPf#$nwii*sK0H zgyu!GCMgeqRoj{|Vld<^JNI?ax8veM@1$33x3Jx#GCI4ZDf_RzGdw~J4Gk~Z5)!)o z&C#Dgnodpv(W#y752;^I3hP!@93Dw>7r_5A2^&l?gbzBuC$TNIH^n_o^v&eHVY50G zx|Cl3zBF$kB*$d8Kl;iWAGs9f2KDC|(PgEb14#w~dG=8u5%$=Gv1bb;7c);wb!K4< znI8se2aAbfb1rL0Cer|4F(@N8;b@0U-h)qu9W~B9DbNCZ%=0H9{@THp+EcDIKbil= zwO5GDLm*qlWmU8!&tRB$#9CUmbk|~$G`<$ZPbQO$ibMSlGet-vA~R>rnW@h$U~Zo) z_`-T3>=km$r*y3{uo%N%@m({bML`(ljA4MESj2JzBq296wR3z>S}b89FjLl{* z$&MA-JiU#m2o-W)vcJX;;-6qE+)|anEB~+5OropuVQU}`0oxbI3jT0EQ*>r$QQ=MT zIVE;J@OM4*fAFRF!W6P~2i`-a_@1ywevj=rqdqS6Es2m4|C)~q2}{V0wR&{jQj8%w=Bb_%$w-6CX9aIIKd-Cf+D)^;5bu*bd#iL#{EzZet-VZ| z!eg;Dc)Tzou`HadSBIxh$V6aWua*1hz zxix;iuDaprqLelutVJ`QZkjAW)Soj30V>0S@ys{dscWvRzhIi z`)tK?Kw}#hjnrm2y(<=!G;Q{3Zt=B5q{aA{OySAxBbtXa4^NHqkfe}=whipFHRS@n zFa6(rwo+nfaFi`PIm}`<$EJ1&4@wOTOAHj6S;Ary>)mH-+AEjAZy?vR&sI9-XZHRcj=v@CkTS=BakYBBTpRJr6lGY-$Lu5#d7leCLvO0t$ zRm2AdioO9YvK!iGD~*tHls5J5vz0eT6|~6e78Is<`T3@|&kh>Z)6df!8sy)mo_)5` z)292BMGfq;m9N;l`=$P`vojBG;=J>?MsvurWXaYsx@RO?wk(4rACe{60vq{Au#FAG z0eo=y0t^@**gygy90r2HA*6%=0op)9Nu3P|AHFj_ zW#3qsvz0lFo&sxzvqh_x*-XZ8gyoF_4{C#&cmWPmy#`BXUk-QfB#8p&X&1h@aRmuT%}zRHMkK>>o%H=B^_*a zYR;CvHPbKqI0a|RRB>UJ)xk`>ey18{o(i5T%gd$|Wv-?t*+5FpmR>sjsqEf@oGty= z1vPq&TD!(FS) zcqXzIu~KE@|!0g0i2hQC5 z_BNFW&Xzm~epzv9&X&^hfkG2Ou!ZG(^M#Z9inV1hLz%1@YEAUkmXdAd1A9bqwo>p- znSUXaf`69e<09h(p*3-!o4jAxT*#N?s%eJzh57Q(=|6X)$xDwWv1jgdd>8!Jg(zFJ z&No6^=jP#TlMNwc3z7HN-CSc^Vxkn8Zhs{=v~SNx?IxJcG%)|#Ow|*OFQvk42?F#m z;W%Rp$CW54eUPyQ!{z??pN1_?Rcr}qx!uuuyV+71ELKBxy3;cJr&NS3K|qlJ{n0#p zEdqKIRty}~J72v%ZnRJuovu6_Hg5dwfr+QAk-!qAQVJvU?G$(|*r&gSc6N*AYsvfJ z;o$D>?yuGAvSk3IgewBt()|+`nmz4Bc+$&2(_hsg@qFzuXrC6z*OK>7O@BT*a<@uN z=fHXq3HsEYBiG*EZ1foTu!p0moZK?r9u>{k)=!sHUwSxS3+0+Z9-h2^{Ziw}s;Zry zj$%1u_Hee!GM7B>$m>5JM%EWtW2xy{7^{-}=_<-Cj;|%pF>-qCmBvSphQk}3`91}i zo#*G#QBs-yHT_SWUB&xz!E7@ZmZitnI;J<0@6E&424OA&QF}j;{+BqmR=T0kIr#R9+S(;WSxd_+tyZ_5$cp&d z53R=5puRpGw$?FYm!22R))Jo^i}mX#OZ_IxhV?n6FzuRog+dcq?yT*pMl-OMtxAur zb<8|1T_KvSC8lga_Ef{FRZY+6Llr@m)$7^r?c2Ipl-LQ0WosQX|0aDeJ+`(lw~8%k zGzWQGD0H>UR2eGOz(sg?bN%in_sV)~bn1NRu(b}!Hgee)+1dvk*9X|z0$07hx@PT~ z=8unBBjro7vIu>lt@Fhl6+Vwzrp~iy3dEwdFxDiWlD`nR+90Z8n1`#yukUaGQT$-Q>$$MQNT)mdO=!qu)ETDge{B+iDRF)k53E7`0VkYH|Dphp12yLt?Q| z%`&wgntTOTnZsGv7d?FIjeC5k2&j2oLBQT|>$$zHUZo-(@qU7K%TI@DeY*0E@u7R~>pn~Bvah~a6!O=r@4S#A!k2(BHB)?U8(W_#6v$kPSvH+}NN*stC^!ZG0Uq{Gs7 zQBj!&bU^+e>421O45mdom04pf5A? z5w>*S@h>&@fA8i|x291XMT^GmS?aH3JB7Z$^*_k2L)A8T%+9H_!7>P!wm^fIh3dBl zM`p&4Pmk=rTb(V;7+RQ9e1|XJ?(DpM`G{9vFP5T3T7FDr%BDa|BIo}=B@2pR33MpV z{$oI1rt>vt=O3N=U|`Lq$tO#+=xjiML8Yzzi=M56!+Wn0c~39f>DgGCNt%}0%xO@x zpocJ$wX$D=o@9;|1r}j`i*vL>N1?BGJhT?Jl)(2{RlV`R zfG<4ZVuD_re4!W>BU4j<%)jeV=p)2;C z66#qVl$In6F|@MM95q*LS1=heL0aeS7UU~rXEUli%gCR{6T(==QdpceK}$&UCBMbG zAZ3zNzmd$(CP_m4tc>C;;L8$9zo6*!Q#fp*B=kkrum2#Sr%7(jFG`D^C8QIQGOQ&P zI}3&feE-q)($Ke_d4Gw^Y*)%P1% zKX(t*ddz`(6T&b%%WSj;Sk_4B*v>9N8S7=a3J=6(AVR}As_hA7XU5s^BG6eB3!YIt zply~>jc4hT&Yw_?0)0mRd)^AYMkVJ>(H$#Yg1C6lI3dbrD-XP|N#{uuoh8U$Our18 z#Bj67`=?wGadIO(Sb}=7x!9z?@qgGD}Fuu)Z{TStRh$$vVzs$&f>Ou9Dl*E9e7j7r9a@Ev%4XQ`_0n zfJvoFC|ndS3v>RbSYx`pED{+R3lDFz6lf@w${Vb-o_|%4xgDG?_(3uJXPTN5`qIW_ zL0ccvHXkn=KgTE)9QTcorzfC(NL=gn<`)kmD?+F7SA+@JhM3xEXnpAzBtt`NHkj@ zaO}20psq-{Dxq)@lq?~EtI2`B`5DWPdxb))*fft634l$0Dh{U_qWb)zFO6 zvp`t6Sy*&0-`*@pjb~C4A`?7f8g#6n?`Lr~Hm)xoKuZ9VR6L@Fj3@Xvt4&UEo(dkj zl_V+XYrQi0#OA1)&h=GrkpInM_}7m|&#i8qO5)VgL}LY=uf)07FY1hOu_z@kRER*W z0z=J;%#EdNtnv(_pmFC9UprQya6`72D>9IZz{d6`4goHo1a*prVg+qIaV9pdO<-cB zU_Q+U#U^)Qld=e+gUAaF2;w@XE*|z}mxL-TmRyxQd&S!WL!Tu{6HUa%#~&SMV&mFU zGO@|>YNFZ2ND9hedwqh!hG&oME!IPZz+fPtYd=^3q{$e-hM&h&F8I^L9a?hY4WYx2g6{XB>GS^4vY2C<8c-?t`7nq zLewE%zN3OT<%2BjtT>CsUvjn$99X|rt48^&-g>8?uy+er33XgJMSm(uo@f+Sm;7z`l1`oW+R5l>Nl$q&80aq96FqSiBEtD#!on&%_>Gedf_nlvY?-aV zyGRz+G5rdapI~8QxfeVMKM*8FkvE|>^PIze@F$H;E%vI;Nag9vw>I!-p~bZatuGzl z+2juOJ=bPMB?-Efi$P)0d7M$;I;Z(rSQJ{CpM}ka8ih?S1T1cqEfF=2CF6J@RP0*0 zBWmL0SsJ!FT@)7UdY+mQVoWF=Fw4RsNwH8in1VvIIKjdaSGf>-{B%N*eHqXDQ5>81 zgn9i^R#4X6sn!Arji%_!@%Y)1koeM&+po4gw2@Cy`REvs2r?HcVM>h^D$4;Q2=WoouLMyGv zOh_94Y(z-?)wy&9IgrK|RHYmvk?4UKmpk@UOUk;55yVCGfBB@&UJz zNQnCCm5WcuQi8cgufF4>Q9+eZxRDgHIp{BFKt-EW+uitw2NAJBgffh+NXtjmd?mwSt{qor-H?PRTIf)gb!B;}k zLS@K2pv6C{B_;QYlM}zmGAcQ!?Z`CO`#d|AFFUca@p8+)p@D6^Q*|0JCX9NYF}F%z z`sA5QYX&};I+~wh%U_x<^h!vcg{xkpJi&v^Yivv<@&w35ge!l>(gZMWEKab*s_zbt zOdp3d!QkC0!9PXiZoVTpOYjn83F^cWuY}}x)C$>U(2?L>W6hy_O{@kOkMv~RRYtKz zPMf^&*v;?vH=aAOw^SFX0BaDgVxX&OEo%1xE_8t~AK2gFU1`N}URzqQE3O%CCEu0Z z16>K;6?7$szJ+0hGZ*L%dWey^jJ^UJ!ykV0S7ZDCagz~+9DR) z0on&`FUY#0?@f$#Wj@3yNC>!ke3d&dZh~@^Eaj5&i1pa7Th_MLMD_KeQCDCOBQw8; zSg=Uem3a{s9vn-3FK7`uEM4XeMltg3dh_%V}bZ+8mue*Cn#6Zs=zy4 z(O2hO9?>W=c{46rS>L8oS<1@Jw&}fTv95H+^al{X`wwxfEBzJ7EN3&|P_-OsD~{k= z6_}-#W~~E%>+VpFOEl|B-I|_&c4t{vKXUFK4!hFJJ&hVAcuHHY4MyY&T&MyLic_Xi zt#4g36gpUAO^bCUe>%M!>V!qGuGCgbS)rMta`OCK^Vvf?*7y}94Le>On$jwguWpS^x0FVj^PvDubdm`r26 zxBbAOFF}Yn4t+h0bS0#Jg!ab7aIWNiNE)KzJ{lh;s(iU~^{7|vMRmXVYFb@&cX)LA zK9r)0;asH?(5^!i=L$uuhj3LN5E~U-dwcVRiT$Nouo8?$3!~Q6eyzJ?dwFPBB#|`_NWU z660J28wf|Dz#B?#4F$=@KOX^eECbLE2$8LRv$NxkcwH_K2q1Oh`3p1`{vr4n|{jZ)5z>J6S z5MQ>ld(ZfzP%NR8p;8DjjO!+-H*I++;|k$kfY_ka^qn)O8*s_AtrBuF=Ef~URcKIZ z8dEW@;pyK=f1HYOEz`TTmv;^n%j7nkQ*p{2=XaYN%FG-#DuQv%pV=;bEEVHQyl*XM z4>T2)C6x-Rcdj=Wq)^KlO3Ao7;O|raXG+F(U0yZYUQ&V*9B5XosmApMI?uw4t3&b@ z@#U0^s~k!Mx}XRUg-TF&mYf<*k~$CN>XiUhkmCF5F6{+#$+U|fZoKbRfk5qmK7|6Z@>yjGdqKa9~d zBS31J7ALClUI=l8emO{8kVaE6t~#d!lHIh**%rk18klW*SCvusD76sdD)|vzA-$M_ zaqSkYQMG1GKg>r6=>Q9@A;eatU|h@SUr7Iul5r(Iu!jve)9h;X2!&ZPn2-2M3+rEy zaV4ghMsiIG##LJDs$sL`kR;Bn%a2uALFuo##HcAu#kj(sEG6$P%(zN_ZYavP$#IU? zJ^s$7_H zl}Hql2?<=+l9EI8pcnoN+k_+&9tqo0iAu6NwoN8IPbF>Bz&{_1y@yG9J_F)3s@U@i zNvq_1Y&%POQSxbQTZNy04OZDwsBkQWn_aR>(l6?C@S{HX-3Oo93-`V7&d1>QsALTGu@<(r!PYLY zSVko4@VoZJ_GpKiMlUD{;ysPRyDK2dInM#-Bx> z>4QgglE)=Y&yI64FFdmkANe3Wk9uwH9?^5CpS$4yY@ecWY{&aU_rm!Vo*9EjLvWT*zoRp? h7h3Cq-|_vRF|rHZk-WFLX9#`s@y|>%D4gf#{{e||YI*nK0099J5D*X%DWOP{F4D`2h)NRy5fv2+ zh^UB&o`vHga^N8<$JzCiog+rlln;;g6G|KPX z@0Od-Z2cjR3{PApvN!GBuX)DJmuGeaQa4}~jGQ=pO3}6x2BN4uBFhhBhTl7djAR3T znW8dg!tBvQswOTX0=l8|?y+|dAC*yLzX@pv0Xbt45k1rD2YLeGFnQ$g(1qLIA!-qcaPh?9v!)orc`Kwh0)G6Y;S=xf@$svHWLREE%y8mSU%)QzhS|77s%g;XrjOV1aQz-VFk?X65JO7%2lA!lzYS_8&5m1e6MsxN8u=N)N?)Ye=E%k zPw}Mlg*crq!Zma~cq&f$J?_(9e(Clj%|nL}$DA(kE3_0TJH(W~FSHMGfHp2}0-k2r;=gD2hNy5no|RJqD@@#aMfczWCeurp6y zZ#UnKtKte>GSKDVg~Q2HJg0x6V(#o4-2gh=We({2*She>TEz z0~B5>w_87tC+u*iE7#*knyN>Qe!;J33Ad}$b=1qJ!k64}9y|{Y!u4sXvg)*zK61J8 zd&{uCZ0d&acYTVKDdAW{Szm^X_!m8fF6Yp^mr^}^K@mHIthMtP^05yLhyd*r5MC*~PR!o7|MuRIFBh8It~$Au2*=?VwHdb_|=rgxgo zgUaWD_*%c-4tj?pO178kh_ff zcnI@HkhdOQO<9Qd(5=I}hYnmF*W(hx$`8=<6}r>i@pX7sac*Xgg}lZBXv{NLTYwH@+&zTi!Zt4-M5`W~{OPg+od)Zy^0`6If?wek z0`k%44|eyHY8+EIsI$TCDw<5qhgH}c9EewGDo)9$A@Iic@(Yh2ZCr=ue0SIY7ogih zyt@pC7w+?3enksu%7%3OeAK7n`gC1}!H7rytrfWYewB}0ew_yL@HwXu@q;cYJyxy)hZlHWSB7g7uv)w?cP)kx!3TZazT8Di>HYJ(K`@gB6rut$5O(+QOF+zx ze%=h+2nYQ(3Cld}hIB=dM%ERGffRov;7HVwzDE`wS#;!~Baa?gd*p>9n~%JDWZRLq zkGy+i?~yN$oIFx=bimR1N4Fd;JX(76?9od{tB)Cu`5y~CmVB(yvF^u)9-DA%^|8l~ zJ$dZuV>^#sIv#)g*5kvEk32r-_*=(!9slt7C&#}zVLV|v5qcu#M9PW&CyGzLc`EW$ z<5NvewLCT8)Lo~Botk*+zEg9G(u-Oa4JaB{G_UCXqNPR4i`EuBS@e9-mZH~--YR;# z=-s0Ci*^5%;KElj>Wx;rx(vC zex!Iq@wF0OVkwC(i7QDiXq^#_JXP|1 z$>x%sCA&%vlzdilxa7-{Z%ax_elEFC@=Ix8skt<=G_EwEG`Tdpv|VZE(w?OQO9z+U zT{^yWLh0<%#idJ1SC&3r`ef;*(k-RiN_Um+DgCLm>a;u^eA;w6?{ufrolo~U-S_m! z(_>H1JiXxbiqnsse&TfD>3yfaKmFtB;xa1ZW&UNBvZyj!S!`K+S!!8ESyoxwvhHPl z%LbPXFB?@hv20q|%(6LU_m@3T_HfzKvPa8Sm#r<^P`0V;<+811ua~`1_J^{4WuKOv zC@U$eEc>}UsN7T@UT!UqD^Dm-DQ{GsS)N_qro3Hw=klA&Z!I5F{$}~x<@?HiC_h<# z^-T7eE@y5&)BVgHXYM{T`OMTaGtbO9^Z1$P&%Ai%z}cv?@n@T#ZFx5TY^SpW&la4$ z=j^Jpo6f#+_PYwI&?-VJ?yq>TVpYYuitQEeRqU_$tl}>f-&CBf_@&}%rB)eK8Cn@p z8C7YkjIT_qY*N|0vSnpv?e5`U!<#Uy z{WHAA(F8f|?d%45qn=dc8{M6;mm*2X4@Y*%q+>{-$BSE?y z-S4)ebw@VAj$S{q(``q`U`KRx;L-b!Zauo^XxY(9-HwdMOu8L)J2vRpJ;xqBw)WT) zu%p+GU94kA@57Gv9RK=+&k0}HQ5fu~JM3utDf6i~*irha9;XJuj>eywa%xr)6}2eJ zEV{Gko}vXs4-_pcTBY03rlQw$JNlh&N4s@9I#pC!R9RG2%!_?tN2cPa;)LRq;>N|z zVMp1;t%^Gp_bI-wcxLg^;%8w;qQnL}N+?MwXDy0_*6nD~=~bs6KmE+urW!j+E^7%p$}P()>s8iYx1$MV zQ_H5qjuya<9@6dTv3hp&UfJHVk6}keWficafbx)XGwdkVZAWRaqt@klEcGUI;cI1E^Ew5Np@p{FM zihUIaDh^kCS#hl5qHagV%8(j6vcrzjbvw$b>{>ZMx1*7;qw%n#g>E}~Mz^C+D!+ER1+m06Nc63m;BT-{VL(kvqwxd_h|K4p!6LmW(zi{qiX~pN`Q_ww2rW~g+F$JaxYjC^)IDxwZ7fl&S%ng+5|<`866Pn2 zjkyb~@6`z4M;uZq5&9eV$ka%C zBxpu9jcgK`1~(B92Z#nl0L+nLk%5tZk-m|B5!De_BGZA{IMN!K6`2{?0_m2>u!x-z zZ%4ct@m$14Mc4Ip(v#&2$Me39@B@W-KJMf zPny=4mYN<3yFIL5SP#?GuyhaWMOFAkUQ``DLEtwZ=Eg&pA7y! z_{-oo1OI619ejWAeTW+tJS6C75HuoaXAoLS{engX-HK;8res$FF9u!+ED!u^;CF$~ z1TG1DI&dLk#{@#V1G@w^3QSS>0jB`F0+t0V4S==c$?w=6Um40b~|Z29#xppD`7H4M~Uokv4|S6;&?q)akQF`zWV0>i_2u66;Q zt91Nl;d|Dw2M28y`D}LO@_E7SZb9sBH^AO}zH!Ch=;;G0-ansrdY<^=5#H%W$j~^}I9^YKYh3M0HEz{owj&i*t-u}sj>m`C9RROzZHgOr zvvHeor}2H`$DR~pJ$ZTJJ+7-%Pv}OjQSTpbl&a#5x^{UmjL-?h)v32DP1WA*)1_uS zWcyw+Z)!WCnsc(B|_cS>b$L5?glMND|s*s#4 z55hM`&XvPp8TH+1NUtB~4$};IP~IcQ3$T|y7hD{_V$F7K05WC7f_X{>xe zE~cmDbl~43C(~Bg&`2Bz_ z8JG|4#ird9Ig53W>*Rb|C7+NF(>UfQ*VAM2Nw!Arr!tn${3%j?Aa}{%vp||kyI3&$ zTHY<6l26MG@)>p)8;pF9uu%GdcCs)znuXJYu;_O|J%UBjb{55~%qGXMjx1U}%VJn8 zttEqej-ptc+(>W8=UIu|kJA1?Ts zPs-&oLvE%6EJeO77sxGgCQD_FSY!E$+{)7AtMWD0M7}P^(misUTt%vQQ3TP30S`8B3SjS##Dx92B3( zNpdo4Dc__xmLV6?YMLN-&@7rQ-;z6d5zC@!ESu%9T-J*Av)1xG)|TbT_gOocB=@pY z@{jD#@)K4hKV}tjshmLDK<`yKQm$ib*=n{9?LJ9vmlOFM_PG3rt&n@-M zSQ~LdoMPu?CT(VD9kyQHFI%#En6JE7Yb{QTQc*&oqFjbZtBjJ7GD2EpxHQW!87fUA zXb26ZVN`%aoFn8A9Pk{4L!6^&4779@vbz7h4D&?sOLD^ z%3{TFn#i0u8af$T1I>dr_@Exs*sXG+k_`@pPM1?)6Ek2LunRd&Ne3GtzT`*#IPV#V z1Es<8UOAoS&|K*A3^@~r5=|6J^JqRTV9V+EX$5rxqMw3y5kj&a385zxTd^q{f@ zWkK{XMbRU)l$Nn;v>f`pf>zR_(BJuT0X>FxSwm~lK95TW?UeV^+j0@TL%*ZAJIbEOV#ob?9%L$OKCrSN}tIU^tsX;xtu4n0c0f`V%E_U6iqR- zo}Q$qXahY%&r&Q-RXs-=>3Pt3f#N8hUZj^Pf&D_q=p;{}Q&dF7R6?b6n#!nLEEW#5 z!XUbf2GdolqTQ^AvT`|GS+BR{!e*7l%34cBTd$K(DC>l6`m+EQ$bw*tAvKn0QZ~rK zn3;vkcbP?5pUd`KcE|1VIc0IMw|L#oU}N4ECO7N$w535?+IGD)C`(`&EK}}K`p>dF zx-Z{`?&~^RYXPi1>%j6|y@=e6o}iQbgDliqvzu6F-k)`0{n%*vA?wcuvOCzFY&@)TW`CsAJ50}v3v|4&F|);_((p259bAZ7$3@q@WK2pK8WAR2l6}k0De24 z$!G9|d;y=&=ZTeKsaPSFiRI!^K9|qov-tgd34f3;<`3{i{1N^-GZ{x4?*Z8Y^D}RM=p~LJDFXSKcKl4NU zQ+`nAeH!>yT;Id@@{jl){x$!Kf62e#f8mGucl=xa4gZOC;YavUenfmG9)K<{;y?3q zypmV&v-}J%TryqZ_>tNe-Lbzwa}Vt=~^qQ)^fEREnCadGPOLd z4Zlz8pyl&o)Zl6Ukk(J@tKFvc(FSREYIkV^wZYmQ+GK5#Hc^|P-J^}y#%W`r}i5zjO$Q3oMo|17IGk=J!UdntU-^_Ui<|9M>P~gn$C9j8 z;u7pCV5O9dGE!c^{ROO)Q<2u_98p>jUjL_|DqV35eil*sLEJHDfurK!JL3vb7I@0u zN0f`YwptBI($czzksM?29Aw?L)01d zzB!txTXz8R+%gbQLDU_2dvwDM5hGv};4;qs@4!(-D^c(EM7M$8evrlO(}@P4>^riE z?wmq2=p`Iu0DnV(GxRXgFvzC>bcUnM5q6@HsPCxrM0cay(eDzC$srosnP{AX?L^~O z6WxQf2^)weB5fl4la>-qP6R*>Q-C)GcvBA%O#{F8qWtNQ+YFRH13b=LMKr4q(QHmM z7rf4cyyheSg0Vyk2LVtA$0(xvcM>gv+!k-fR2e)yg!D(+6D>uV%YeTkglOdm9Qim# z^jHPanrDd~N1fL#CVC=|Xnia$O}qmrC3*_=e;Va)7)taE(w|*Vv=L=IpNymTFA=>o zo@mn&yjp&ZXiI;hSJn}2orBlSeF0mEUIX3Nzae^K8UQlczMN&8-c@*g1p0q`0RaB@F8~x1{R#9A zJWKRRPh4|p0f3y6N&jPA?81TSip2* zfrZ3^x)TfTPb?&qm??xdhy>7OPE9~F_u`;!^Dye#Ox^3{spnrox~cwM65CJn`|Z4%ucMiAlBkC zu?+B;)rwg5C}KIF+bWV+>tn=V<1828xEY|{Q;=saL^hKy2JMn8v)uQI}sa&Jfr6k8-uj5 zyNHd0T*lABRfWEQGsGq!??mLCxR2Q6>BOcY-@RRlO-Eg3j371>IJ1`!n*(=l6|wn{ z#lmR3#z&s}dl6go6|u!Ti9HB@mY}SM4-;G33V^bffz}E?Vvn{bwhHxLb)MK`1Bk5# ztu=7hpl)jo0LXalJH#F@B(`oXu_ulYTi+k>Be5s95qk=Bo(8=QsP_h>KhuZUv!M0d zEMm{+~+))HqYLeL~J|Kcbp)$ za~-jF1`~U?1+n*x0F?iJPXJ`_ekrkC?-GN}v)==6Hz)RoAYvcRBerJ`05m=tKy2?1 z#QxZs*gmw~{%B$!LqGnsm)L;=#15j4pCaya$ovq>{qq;Z{?eV;7u|?`xsBM@8;E^_ z_Wu_3`WEv2K9ATB@x=a00JQy&!2JnnKcNmsP{xsS#Ezm(j->%m-{W?`YGNk@U@fte z2%iGa#q)@jg4ffK(P{8n4j#%&iJd|GnL=V`t;8x85j(em*w66)jIv?x?7~uFm(qz{ zeu>yG`-ojdnN@=T8v$pCRgVI^gKIz)#F-gzg}9bOTx1ZJBLGK;8=N>%G>f?JH^lv> z5cl6eJRq5P;AR}h%O@UEO58L7Qv?U#5b>~h;^sU6;={WVj|d_j`5KP%6%x0BPIMMv z3GtXg#ABBekMjc{FUEDAxQKXiH1QPBPKCeGLE?>n#L>T}h&Nq{;D2R1t68f_NM7))sYWi+p*zh_@>y-eEQI{Jq3GP9xq4^}6XL;$21)?|OuI zH_*7{1o7_Rv-@S@Jrarcd>DYVUhww<&%GxBz~61){Wb^jzCDTeGXNmB{_BX}4q5{? z5Wiy^@qyrRAaL(QzCqx5Fz60JJ%^#51#pL-BR+Bf@lo#(A8jE%2DHcSAU^Iq@q6sV zCk!M$aVhah;C*r#@u|_or=dKI(|kJ0xbJ=9GmtiOJ@HvHh|lg%d=AQ-8v-~(eBMFg z^S2ORu$cJ5!NeVr#P6R*e9>mW72=EGUjp2RQO+Yfi7%f*d{Ijzefz8*4o5;A(aGw}_*h(Fth_;cXrdC+|RS>i8510d%Y zkmp6vdZ`m}jNkm_P{1hSTizj#V~BifGLD%6_chSiCWyZQe%=H>J9ZP_2|nJ=BK{82 z-$CBrbtV4pVB+t6M*RIM;vZBH|2=SaLpFavzQT*d_n@4QniAhzK>UyC#P@-(ePzV= zgQt&6i621tlOW;;cM<>e2jZWB#v!!JpEHObK7(rqkkwcHiGPi}-+V_?3giuOhAbeJttvlZL$= zO~W)?%p*;HOqvhQq4?|~%@^RGL0Uk2zb;3XH6mhu{D_OD1weV??(OGr!WOIlMa zAdR&2P(T@J&3BX50yJBmAuV$qX<2Y{ek3jTVbWSvkk)1?X?d$jYX|;17yzpPM@Y*D z-}&1}>xl9@g#adzcGE7>I;R6RlGX)0cR{``r%3CX16T_HPu)=WZktKF1$DjU5NX{n zlGZbTv|Eh;(C!83{V{2M0DTeHe-LT6gNFgzNxP#BX#+cxc4tr01|1-6@B-3?SV$W> znzRBz+HllkB={QTAZ_$m(#Gwp}r2d%Yh3?vq&n@b}~)(lCG4o<2g_h5`WGXTb9_DDSyQ z(l!nNyg=Fuh{yPdb0*$@Uk9~Vc`?x=82axZRSim&W4vrx0Q?&DEDDM#B4)+3V zAnh;t0Pyt1V!##BzJ&YLV8AxgzL`$i_niUA_x%adewYQ=OWI#KU;tn%X+NU;A0hJ} z!S_$d_Y?R!g7!Ju27tCbT1DEirvQ-eaipIx0KnHt@O%<-J_Wg)I!0O%Xca@o#ov)u zf^tf`15lUKXGkmig0wRiNjnR-VmE1(lSn%!Nc$OOT>vi^mXmgIAZeFC`_c~5E(efy z#Y);$@Q<-st3Ho+?cGVRPJoLf_-iDz-6RZ6u^ED^0>&V~V89j$P54gKl>>XIb|eTZ6wk92NHP}673d|Xn&4Ghe;&z zft$a9M5j@JFG$?9fJEn2B)SxnxOqB>TOvtxhrj0x61RfSUf`q8QWAX!k?8j^iT7c(etHRjAuzi6mCXl325y#N+RiST~Er6X0Pz%7lH3Czq0VS^y4^cn0*I zsUYzz{Li7hjga^ALrJ_ah{THy5-)8bvFQ+r&5*|y;J%VaV(SPJuP!I?+D;O$e@9|l z6^S>#A+a6dH&>C^0olCO6>yovPL%m}F^S(nzup6{@9!qD3v}`M3-JfgD}*fepl%<* z|Izy-_Cm({kas`AAI~6hU@VDGT97!1I)C;Wi9<*`+?T{(>?FQGyL{D$#MhAk(D(*& z_;xFa?=F(~em#jF;{nqEkmpYp0B9YVL*iI>5+@*^lRZhC0)ItckthLf>2wmOfq(jA z5@k~WS4fmUMdIvY5*0s^IJXwCox}x{c>(z@1^^n7xI7r}FyIu4UqS)k6U%3D1!Y~? zOya7MMAZNi)jyDMf)}iPCEhnk_5w*hi=@^Wu#}`|LsE_>>Ej1DMbcN0^gBQ@U=m5( z@RmVmNQSf^Y3fNb^eK{ITS#I)EW@{vjK~MTjcf(jM>48E065k}Km|$LWs=b&07pp1 zJWDcmAjvoj;1J0KY`G=uB$>34qpdjfwkMf4mSnpfBs+j+{s594Un6;wfn;aU?ea0no12pCwwmNE zpxI+E$({#E_G(44H+a7-nPgw^+}}*{_LU^>2qHNUU&FZbGm>|8A~_g1Lla5DK4rlf zk|R*Zk?)ecJDTL^1tiCOMRHs(lH*bSJ!ya!NKP0^aw7bbP{t(0PtF3Mu2YbADtMVz zM)KahBryk;_st_YVDh3}JeWB|63ygwZPcMtEU^U5Yb4b1c+HdS3xgGMrI4s{p8|(nyTcLmr zfX_(ov;roOeEV6F@A#4Y9op($)bl;$dA||K55Vs(l)Y;s$=&Tq{$UHrLeTmUW$bZ~ z+}oezA5q_Z;9-9N0CM>g%094|B<9ZY;8v2KE+Y9E!k>e`KO^s9QFq2WGRt6 zJ&0r($}PV_^6U(f6?r5pQRcZXNL~P+7k?yqX)xeBlE0V%;Q7jQl2_Z1tU{bKk>oX` zUwe%Vw3iHQ8X5RbGH4ZKkOX*&42CSg0Wx5l%;39@41Vj$5YPy)6z~-pf;y2QcrY14 zdXm8u4fuu(VQFMAN0K2t8L*lRmRK@Gj3q-PXj^m0VDlqGH1J~kk|C}e8R8veNbFCB z%wp@ZqCYTb$;;KZgdv$mIj+}92shqL)>J9=1saqaE3&dA{a3(G+(Vm@^ zlbMiV2{#*(*sp~0t#-TB$Dy8=_2>0|gTroB=~jDn13tZUb><(XN06ObgO`k09&R!R z@uY;rbe?U>YR@wx5`%aQ^JUpt={(7l(H_yvkd&CpOy*dgY1rRk+U=Q{w@>SEWtzw5 zliD>qR&!{M*zB&U%3t+-aA;_7)$=OsLkjuoIS;Z3Qa&9uy1Ix*MXL-~^sv^u`iieF zH&nf;;viT2z^#LlsST0NT!LcQ?1Q((J_azZ^JNF$sp%}0*;BIYsE8rl9Km8)xJjC_ za&lQtY*yDs21lc=S+RN5vw|$f5W6)j#Oa6$Hbw+h&&uzgL7GnxOG>o2V>zKY$+_S!GehSURWh)eCU9#*0$Ku< zgwzwz4DFc0w!|>iT$(R4fs`T$I_+7m>=xHJK0p5U#~)dg?;jZypB8cNJ{G&DQCysv z=llDGR~Lp?_4l*^dq`=C)1kzy+DMS{DZOcV`?QWXv-g}guUS+!D7jsWB;SWw&Z|uZ zHsy|{u`EFIF`8TT7~0y`zge8&ZPwz)#eU2b+r(Ubz&|E9HoW>kxKnR#S0gKeihPw$ zUioyrb>vSUn8iP1JJ=3qm7lR-c<$N?E>d{VdX^*Z%N`-2SFoA)# zBKJ$VB4W2{I=SknK&}wv3}Mwz)ka(GC>*+~T3m4*fe(mLidR#5EG$(wC1q5ucGXqc z#4h)EWK6quV;<=tLOeb#n%}z zwZQ_tB-ROVRsi)k~;O z0{X=i0(y@Kds3poC!M)e%^WM@&|@NpkXh&u(TjwegIPkV$Dj~I|AT%hJF5drh|q^3 zboh4W=(pm%G2=g2)~C<155_B3bF?47?AAWZ$L8gYUEW8zS1Il0A(`S@*BMEs;F#=4 zQ?rPx%m#(MY1+D%xAmEC%e9UEV*mCBdTNd^bf3x|SMvj_b$dlP?3z2SI>!} z{_f%4o-&nd?Dfd#ww@y4R(+j$SLf8O?KD$xNQgPHxozb7skgSUuz8$EcNn#5_or4> zm@?uuYxFYpVpL&XallZ0bu)Dj5M!d1GU*PC$ZF7N&mcyR<)Q;hW$BE08L$EJat$+? zzHZ6o`g%GjU$=;Te3@I6&8(5^WV3mlwRN5@xN3aodCi=*NULFurx&i8+Ng)kX)~GF zNn7{E>~m+i&N&N%M{$kgP_F*Wd4`4RF@lmhTe&48R}HaM`gok1!7bL#)i0{vR?|E9 z#F*;Ru*e8=b!lt@x8IPKv)o;t(qcyF%Sg>n&;vu)&?TzriPDMe8V&McYFN^H&J6UJ zSp%o%U$rq;D>~7#+|{zqN#dkucrg@K&+a(w_Lk0xdew9cg{P|LoTzw4=c0OQjo!fd zhueIvVeIdM4?JQ7Rr3?2^ojvA50qRn6@)8?I*ZvEIf|9GEF(83JIkKx3ynt$SrB2t zAZp3f>ddWpq2lSG#@%z{(|M(@Ehxz5%PZ64b8ks|Nb#XM`2DdKi?6XdzdGOOYq7-c zS8<9xtEN90DMXf!JdL}x(w_4V2=K2O-l|*LEjjT{ojgVnbl!I44UF*9MpixJ7ZC`W zYUs7voob8$F)Q9ksR|oOItcw#m}~6Nt+ZzFcT3qdSG%hEIF(T;zJYA%NoEyNouj6A zk*td%>@2i3Pc)m8(rqkX4}YNYsiH`YRp?o4_|zp%;bUec(5(naQ>acNB`Y0n5W=yD zZ;!C2)2P*GX74ipjjt{&UVP!p?en|1{10CE@{Rdjd?;_i`uD!L_uenwTR$Ps+kX{3 zfJ1M1=Qh^Y)##2ek-zxDSIF08{`M~wJ(vHDFE1{>o`Q=SOu^yG{krpYmyI}dOa2Gz z#jlHD9*y1dL{qidO3ea_I|9NOG1i{8E&T{T1b97HG^ugam6SSxT5 z_YiF5+)_W{V`Tyg{&jiXP%d7wt0TvMLS9+}!ukItF!F0q!|tJ(IJx}TzpiKAvhw!d zNX~U|{t4OEXdrWV6s93x)!#@}>LmVUO?8`vhmq?w*Ms1!)nIIbr-TkCT`?@404Nux{Z5wTikMvhuJ>SHN7fttl>YP!5- z$p^=oVZ{n&IR3$sTU5w-WyK2T6&3Pv>}*SiN4j=fmLJ%tS-L$! zP=m$0S(|%u|4VgC*EwN%o~}uE(J|EvS6{W-ef{ih8ii+O2U>&RwFa5}!%~yu{Nrsg z35JN+#H1u8{MxakJjf%_!bxji}6lq7-iHNX>gwzB~VsaA@Qq7Q>keKS@@E%3IN1-Zu()shjg@J~7 zfeQ~he}1x|8SR<)sw~adDDvXjWuve5%bv`wQzi^&U&K2n^BGgNW;**;PwBa_Z{LkQ zTU4JjXtjfr8fZO(E(T!!zN?HUSs+Su4yl=x*G%54H#xA;;82fiG<$y+_MpSzoZDsp zY-fk~xcImaF`4m}UKi-^Z8QM)1cu>`#dXrdPMMEu<>5W6Lrin*qoqqV4Pk#%dTGp% zn3Trtzaqn5ICr|_hA(?Y1_VU-GNupMYq-<5%anCHKAAZ2lO5}(bkUACB*_u%FY(SP z{Jy%9^uJ})^qk}lEo1o&<=L5SUgMe=aHFr$*Xh(p_chKz6ZXBjY(!4>$YopiJJ$fGhe+ z%e8J`4hP5ni<*Bk$5owAJwh>k1<@?u=@9DJNugQ;_~<*IwfUt^2}=W&TV=^tSPmyB zy1B ztc)6*n>#p)SDNFpyQEh4Ruifen=K_i*p?J#PO=6E+Y-%$B zB{KsLHT2ftm>Q0DB*thgHYq7qV=;+|F;&-s5==?4Ro7yYv_(lVys$c7C06J24}%h` z9`(~&MJFXiYpwk1pxz)_wohzpVtYbEo$XC|iSRq~jeeo5(3Iz#VPa3S4M-W~yxZtI z+7{t#5fZ`Y^aCqjd!y5)ExAz*y_#TZfr^UvG zuTYA=B0M%WEu0Y?_4LWFI*^oa<98mstodPk;b2vcG2YMCDmus-l+hx>xz;zuCLK*e za0O0YyeRFn4_=LCnaMK`Z@6pFhQqUz+qlPg$C}rya3a0|ndY*^J`k@okh*S?4@cIM}v(PXWD79bS9eUE4Bl^3Re^CCe{U$>b{hbe1jQ?DFT%D58ym>-_ zdi>*+%5R?Fj8|FNk%Z>|rD|27xB^rEwQ2>^a%tc{*H%?}TRAuWJF4|>ZLNQ`UV3Y} zH0fVe!v9M3s@B`9`hQ$|RqO3l9sfT~51o2@RsD}^FQ?vKRsWv$;?zsc91L&Z?(|@c zT z7B8E|sKKkgo{ayEB%|K3{QE`o;bhgF|GQ^D`K z|B%-FRCCWwhQ$$qLe&m#HQ$*WnSAw?bJ)A`qRAHDPDX~XoS7BH8m$GBs{)R zSVj-KUr4xdNL0%v+(+%6g;_13CNnq0HBP!cPxBe%HH~v^ESci;!&kNQzN>FUi;13D zpXLY+iZBMJ#D_G>>Xa6lk!}x6=-n(Z>`<$`R-==+=7+E5WKPL7MOjQ;7q`jiWnu-j zvpY2x+|CSgSKY~AzKT~9K{cv-OKjeMNM>r=Qa{1lUi*#3cSWBmhNmXtywPtc$a|d& z)ehKqf%ay&w^v7|5B#TOnw9FFJgHqXDD7`9+Q$vFwX)wdZE?TkF{ zO7S&hhyD&)Ju&T5c{KIXUfoQrmn)?X4X#g26`k5M>?~hDxo@r3Y1W~P_r#2Z1BV*j zcOL68Q`JhU>5ehHr7Bq%qDUjX|w()XTL^pkMR4j%5a}wST5o z-B&*}yJci5{^o|+YBy#+TlnQYaB4VY*i#eQww>_Qun-&=#$B^KTkgPi@y@#P$)9j*lfOeg=!}$x;-IR! zQ*k@Z#W%RA?g1Ngm^gIP(0vM}LD^Z&-PgS=`lgJ!gXh|vfqapq&aM3|9ISP{?tb&R zo{JFL^%pIwYc5(;uZ~HK@hy<4R&%VeAj}njtmAzO!hBeCQZ&+1qOVH}t(vGhdq(P6 z_cq5b`Yluaq_#nS;igV;<7S6CzkR7$_l|k7kr5Sv0k&jIXhpM(X18?Ai;uJ*!kVHY zGJ(-nVFUz3yD?Ojs9FqXThEXKHKa=B@Ch~);-n&U^7`9cNo=Y*m=ww%HMNV6Z)f6< zhAMU#*lTV}iWQw>@VmMzHc4GEgk5^ki@E_tUzX4?(dwzyQ)O(!q{ZH=_@WuLbl<#* zA#6A?bvx4CX4l`HY_K*4N7x!C21-c&l=~cT&7H?9EgPz-D8!vbC9wLZysN%zPy|{X z9@W_Pk8=qL{o{YI_fRxGlxzWBilzx$5_Dh?qHCpK~zcEMEd{h2l_OqPJh^ zNTMeN$NjwgRf!u8w%~SKM4XSG$v^AW`3jezth)J~`6_`IKio3+{6h{{C82o-OlSssT0iV7_%bb+V@r$J=OWooa8WdKwCj;&plhIe{Mp* z9}A(@%KlfH@499$T*5}~_cPd1tQLEZl*cZP;BUBF)0tn>=;~ay-kSW45f>jz>0!56 z?N)=|em1hJk|+)u;^|O~)UtF%|0;%o>Nd*_n-xQ9ohGcxQ_Y-Wi-`9LFb8FCndxa} zFI7MuS2NGtqBnDVgcZ$vkS%hZA;%?K*dE3~gR;d5xbO8j{e`}!lZe$P3b;^P#|XUx zE(>Y`>0_YO`|^4g33F11P;^^$9qh$qPhqP(FxC|4g}SkecE^2P)uj4uUHyg<-g)Tu z+n(RpfYrA^lm%n@rQ0$}N)6J$x5tKAoe@?z^ak>>z*>cHrPQ`&tue%Pt}YL^jR*B?sfx|)J36!F=)T!@{+;KRM(xLE)N-<>4{77Nwc60PG1S%i zcJ5^Wu1(>LywZkPG`-%hWTP4Nk3%G?S1*`wdoI=kQ~yMYAt}t=>$p0GhV0)tTfLVW z5#OdsR7&+ab4-l6dRQLozdmbWOw53Ryj>eJXaJTxFF))EnD42p`d zro?94WXJvd*r>*tR%^?MH&vTTM{s0pNK$KC(_VJpP;*33Tzr@HZYHl^<#X{xn@1-Iu1g3;@xnc|sUxI4dJXB$^IU3YP`>*ZT@UT5+e{e4y9 zYL@sba)&lr?SE%|PkK)MtG38jZGk$+A>e-h?0PMYQ-eOPJEX2RquGpNI^sZDOyg#z zV4FV+=DxAGf1%3tNiv1ntuavnKK_0-jM|(Bn^SDA6ZlH5C_^Z@#-YVKq8v9td^yS8 z)Oz!K%4$j%JU#ptV+1M15{VNQLzziE?Wv%${v4`V=9h*jS#!hCTPeuSPu zx_X98$OYdcsW}#)?>x9hRnHs@x`*q%$|Tshz*zr2(|aWQM>dKHv;|ocEx|@9@uxk* zqGSAhZLzTdCY#YO$`TUYBuC=QZB1sc**q{hw|TOk^oz1L3k!@2iffh-<>#N1o8}+j z9}*OjWKRvVWu!(bhEQMWs&5lY#~q(M@P@A_xcaDe%(Xy9^&4m@ri-DbW5LH^TwZQ@1YA$vCM}PFu zQ4z!KMb|{A(4{)c=G3$wYJ@3?dwyD|d{?RW{0+VQZhL-V@7@cazfHLswHq=mD|hOU zwrz(@%~h_N(kf(4C*fL+=w26zLg`TH)jH{FmB0rX`Y#`un=|s!fp@MPnUgbe<()Eb zXnsOs$AWh4hjmO$>^Q8dy=R1Q>Qrz~vlE$pcKe*9AZm|WV!i2Y{N=O{>5ud${Pi+? z8YUHeX9T+Tgm6svC6)#?;UsLq#cC=IJ8tTUG%Xj;AeMqjVMKezBCse-%}Gu%V;I#( zh@@2acB2U?$fKxXsR*Atp#Hj7LReCEW^RH{W_XeURYDGK-m5i+>d3)Q0F%gtqH?iz zR0RjIh+HgUe6W5*#uT5_T$$jLkP3HwZ1V7p9R`Ochw(S6!&}^=y%UlcI&xj!U`vZA ze$z@* zl{Qa0KYhCSQ>+;;U~#Q)YneMSH!N#RmOVGgw9Hw)tktC4~Rfl|Q?DW;=U#`+cXnwqDPgKGEuN=i%zlOw~Wx*;B1I;4cGK7uxxqujD+JX~;@R z>hbotgyd!4^0VqKLSuc~ zjtjwv6`Iw$RkLWju)DrDWDN5+CEBn%8({H|&55#C>HULi#i_au^#aHBN{FMg(C=Kj zt}#nTiY+EQW#r`Px#q|en}3o$5uakP+5@xN3k8akwbtYVNF;)6kkMzYCI>W#yd$tCikmP!6q`#Y~)`wc$ zHh{SDF$HsA-NIRcj}wdIrnp`2ptTq!>hGYlrcjIkW~trx*LN<`v5)SWjMf~}tM_`~ zpWbVq@Rxl%d)o6711w>-6#w2wnIB78y9VEB^F7+fKgDK>^7jw(4^NN0^{qdCG2yq| zm^V0@^qY07y=c*-|X*PtIIRiY>~-)}>mb z)Yr%?&Rq7V0KYJ&{sA)w8{vGGjnM9OJ`-ZMMTg<Qno0K1(n@U@14G#a|(S#@DM)Ad0=Y-40+W+!E< zeJ_2_E71_clJu=mFJ#q2=-)xrzfYic!qhGpvZT7keRq#h`(XlSp=YO|5T7N0CE0QF z7lx>oysYMmud~Ldwk}+AU}X)33g7j~Cf9cgs&zztZv;df4$rqS3k%gs*GY)1v>!+j{`WRhDbObIzH%)BEi7+1Z)d-e!B9 zZP`uVB%~J-LJEWsAe4}R3~EA0$`u7sst9-mtTfAFx!_e)P`CnDP*DVxYvH0KyL0kC z@AsWEGrNhxz5o6HC_87)obsLTeBWE1_j%t>b3f_{{{-6J<0=DVl}H+7V3{CQ$gVmM z{5^tt*st6v1o{JktVmZffpIN}OB_d*F}|o0TBX!N)KZ2oRKI#5{KBrn1T(BZVi2fG^W$<&Om!W3&wxSUljaa=WstJVzF z`+W_AwPw1Wbf&+4sK)Gun8blCRW4VeHAaPOaA56Fy-&`&s+uFz&5`CR7rh7thTwg# z&0QtW?Db~6knW+B$>d$WVPj(5qg%FoZCz^p+NG6rOQ+KkYzm$sf8<{I)sI-y)s?9b zs^r)L){gu&H%(05cy+$h8nBtYHe8@0xODaU^x8)S3pI3n;i~rbRSOqnEKcYWQ$^Lb zv(IbK?%%g9ffmY_w4ZnOwkqYJG7I>za8UiA6G^iSn4 z$bbL039TqDcp59=u6$n1g~JBDPG@kMeVw@_^*X&?SHC3J=`%YGI-TASUX{G%yz_2J z7XJRE{2y;VoXb7@rcnDNuSM9iB_O{iYQ<1G9l{3+-E8Th-lJ+L_{ZX%R;>El2%CE? z?4A9S#0UKA5SB6~i444YVGj^7aO&4B%-=d{}5|uHme8Ms+-Yk7v*@flXiucpNTfIjk z82)aUfsc(95~;oj_d*yDrph}KaHYav5MpV7s#=IMEj%973nRWlRJteR59cE5?q9s+ z`cqqCZb4{>_gs9@d94?I^P>|Bk38`kdFHwU|NZJWhON?SRM@)bf*cAIec|8tIlZG} zy|+F3+&M#^{_=N(-$kNUyW5gn*E8|O@4tG%w#T=i_D;OPn`#Y@ed`T*=F02jnb)5< zyl~*Wdv|%{FX#5(^KZXBbk6f%zw^+PZPn*i-z5LnUu!^>j*JksE zY@*fSwpX}OM*LFooVzS0t3mj?@S>rzKJLDlO41U-x#I^r?=8{Jba ziN1zPtIMSiMIs@+%Vn)>=u5Orxi<>=%cVd~S1di^6@IewhgwabG2wBD?^M`K+Je(7 zRD0YuZMrkp-C!`O0Wo+>rSDNc zhhn1TtNoSVDK>d)kIIYV~>;!sQZsxoC-R!M-Pz20P3JxN^neYypBm|UB%SGx5 zukjh_PE-)eRx0l)uD);P-vq&GDZGyO)_1ky`ZqJSV8SEB)|;B+u~ySMA?B_M+P$tf z*XuenwwU?NH_b7dyQ{Hic&P7n!xQcSPa1qe|pGdHwxiL zqAe&P+^!5NqCq}# z`alscd!O&WRGC)lCp^{pgs>C#Xf^W~SBdxePW(z(E#$F`lKny)B8Ckx!<1Y|)n_DO zN9EgC2_&W$6$_Q|$|Qk^M+lJV=ry8LBVIJ5d^01|l}ufU!s+Y|f~IQ8#cMJv>rxB) zTkPIiZ#dXEkaQ$%dMVV<-Phw2B~cJV;ieVA2V4BL9nqm%*REc^Z~DG#dnm%A%LhL1 zic;Y^Uobfw3ikGO)>T$_4t7>MSJ{TDDXY@?a{rx z=C;eWg+ZLibXT=(Y8f2QuACT(+anHx)99Vrx?^R#FlDMs|7C1t<5+KdxGxuP{P?5K z?%43{A3itp*ZRa?g3^>B?(;0%xbyV&iH70sww?t|wVAIc>iiYH$*t$*wto8?Us<{F z>knRCgIH`=+|#Hrl}Q0wTVt42j^2Z8x=YdD^X3sjE)*r!&5>CDr$;d{#mGxV(M1tb zUW^&y42Hg1(YzRsYC&m~HuFKHQ#t8kk$Qr>idG@YBaz8f_|ulR4sH9&?U!$AYuj}B?O)l( zw^uJ0o$#o6*{pKHCwEFYvNR3DNpvn>U4A0pKJ?a>!k^sI8@#Yr8M*XPwNLOQLJmm6 zH0GsOQ?J>`XC^alIV=b9t0Q_Uk3ZunsM40Z+#}@1EIEtHl;g%UX0%ph8e!?RXAIKn z4a=`TYe+cMe(Gc$SqaML#nhB5fB&zi(I>#cvo61B>C&4n-;>E81RqQ{t~met`}9{* z`TM?|S1l`?L(4w&?6_*hd+D)F9pYh{qnXi79fd=*C6CGl8drj3z3A)zeHCpkxp`z{ z&!U=|MQ4tV+_aSTY<%#R4{fDT4Fpo2`2;Dd7zmZo1%1(#qB0=qObV_vnMZiKVkJ9$ zE?g~sLl<^QXWJYO+w4uQuh zRAC6G^s{+m%)+T3825qXT0p2mK8z_oOU=EL0ZWKnjFDDbWRvk&p#* z1mBzQRv&zcWUGAUv)Tfwb4FTgM*XEokm1zetQ=f}AO677J&-ooB%CVX*quSP|5GMv(Ld9Rs%{rYSI`VB`q%#2I^mYJ};F!Hlp+ z?s3Qc;`u@l@4^{13Qgh$8We@RGiH=${%Wf#{6YAzTi7W4!V0XxXyn^xPu05;g2(hRM3SxeBU4~ zqXX!_65qT`J62LeuFUG;h3(i}#vuO z{RVyyeG~N8@B7(zA6`VyDQIm$EQ~`BE!;75&o`gntJF?D|6bHizWDX0KQ}PQII>y| zuJHPkbcH8=gDYH5^_LGXY+m=_l|qP4zxdA=6XTCAy5aim9mV3y_nw~{*ni*dGhaQ3 zqj*(HO%Wkkso4Uns0v#&B*j-h<}k4NXJc>5(2+~>zkB(@UQ2ejA}L9pP+mD~vi$d*B{ znk7e?nvN_f16fbl!v}{xN8qapcM$+vULAI9U|@{I1+NfG-;OdEmlt+S2ajQX>ZbXM zOFTP2jWtlqY@!ru2A^E6CKy+fyFl#O5^UC;TzKl4kmGmI<*2pC*q(nN6WI~e?qk#R zSDKz>d&;~W@-a2pvQAbQNhjsr7w7&zU5%h51ZeA@5Zw9u=hA@MG5*0@!d6v48EHNV z$iamDlm1}sV>XYlO8hBnR(s4WY5Yx9RsKSc{J6iWs>xy& z^5)pwO;O!yi5BA=sLtAiTvc)t^ViUg#92ypqP%Fr*OP+b1td9Ux&3?q}bvV4{*^jX1 zOY}D_xoJ3IY|zj6Ctb>h*X)1ke@izz8j`@&qp+F!jPdD$QoPEARnCwwbCe zmw8Z!%u{8qlWP_)vCJyBuM;06ecoW2~L$N5m}*Z$gtqi)No6PmeZTjs0-_f zn$%b}E*%XL8U=nzFbWFLG@A(17|uD`!rxi+9Z5&&kw@~xE7j%DYtw`oA%eUxcvOmK z$5L|fsyen6Y8g%)4Mw9NtK#zPI&-fr-^Nj=!t^7L6f`1mcw+7HWfN%@DOn$J)UM~A zBfRw?R#qLIQAEBO0!CO2X96(mfPzU3T2cHR;r3H*Id{1CjGNZQ&0BAO?$Dvd;~cXgYS$>URdh@AKYCer)a$Oyuh9_&rw{#G8$l|mpXRjgPjj#Z|MSeVS z+UV1e^)Rd=SjiEfYU{BU41y5Qapabe6k>sOe8)Ns3{mXBYD$VO z#99N&NGV%N?w@8QDG?`C6U*KUTd8#x31!-ig>FzpS)o-lfveR3~W{U8HPA zlGQN;Oz;C^?8G0Wj-o!Mt|t`hgIOKZG$^$gcpw2xYcbTw-uS>^J4fi*L}a)UY)e(D z_+dK}FSQsOD2WtWO%{5Ap(pMHuuTdfzyCtGeka~YU5M9M_!ViX+2_QIrDpfcsX_P8 z3rBwL!V37LJaa0Q)s!2NUa;LlwlOTbk4 zr5lJ;9!i>Ko)_&OB*~`8B(9qYwJ%B~>QMCO{ACh^{Pr)rb;T8LePO%$snrbZzIOS_ zYj^ea?Yed)eHQlDPM+4=d)j2J`YGlmje1T&-IA^_OkKUBS3Qe9%g@2NnhLZyug@Fu z3I@L%QTdCoX3-tU7<(G+SDR0uD_TFlvGc$G|9w1VfX-XD2!rtb_RM~OW5g4V`QM!- zpKu*R5ymao5GplV)fi>p<@qZiz2Eo$_a_iTTyq!fj#I%6U#2;rxf1M3ifh4~WLX?1 zBkT~4g-|uKe|Z>}>tzmsDKj9$E^-1{hty5+e7ib<0Qm9i5#W{*kG54Q4Q7;6S{gdg*TnowlUAwu{zB zsR@fUW^>n?-dL=6O_$l63ECZ&XkSNzePY7a*x45`yOFhDn5E1YZUq7Lha@l<{aA&{ z7EJq%25@hD=6FlO=>)0A8wsX=<@8!?m9~+)zB0XS>r-F7dl+9V9#^Q^V2Etkbymy1 zw+|is)7i~?cWsCm3~Ax|mAiV4>Gyk&Xbb6#otBjmOSM ziW;`yIF*=oT&pfGZ&N99UD8gaeW?=f4r7dy>WXd+`7=dpwnUrb{5IC%8g)F(F!jpc zuC8o5Pls{nhPI9|d-r7fV43jq$UZLLhF*hSU=~?7_&bDMLj6+*GnWId@@qgM z0usbsS4I?q^E0S59QV6F|3kS^ephJeY&!3f%LjssmQ4n{0e@y?GUnF_f*|Uf(#iEL zuL-h{_-=F}1D`&cul6~^*6+!GlWU(_bXNEs;R{bbV6@I$ZVfjkthKhf_0fb&62Y6R zjHi8}u5jJ<(>G7n8zvLup`-GPh2Q=6|7{)i_&oQf~6H&%!URGZ8l z+tSH;v(O;={_C#FNThW%?T_2ccfBMBa6idd~tnz zEE;Y|C0$ybHC#Wma-O7EsyXfClH#Ns7g9}}QN)n|ig7YlMdk#v>}2bh&s*J{3|et} z`~D$yh3lo)oHJoSra46vL{WdRwsCZz(G_;g!~Z2 z#dZ@+H^0<^!YV{%0M<)sHgQ>6w}PJ~%6vmI$xHqt!=kWeImWR{Wx=@Ry$udaLNODh ztnlXUFMnjwY5)5BD-XZ*(CKWouU(H{w`yqL$JeI${GXXSKxwspV@Q8AHTTs^oQO$%*cVuuY7d3Yu&wvH#>w2`E}`vbo1jH+s#hc6ozj=Nnhw=7`OYyr33^Wuwce@fgT{|ypE z)gJ4Cmpnug1iTXDmVjDEs+ybT8MDB}36ma%4rfYz|9+%isn`hFXcTk=KBD*^>d4>; zeFlgnpy4S1h0K>ikrgOa16yPe)RwY$$!b1OoEh4QBF~1rH{B7JZwS|Co0EFIF*&%h zDLLF-XZgZImb$Lt>ZX+gNuyrtkEK!|2gx@iI#S-`z>4PDj1V#CX$kV&`Rm&CMj@K1 zrDJDU&_Pws^eIh~sfM`bn}POVw!QF{(^=besqY+4Qd8`E18tSG_<8H<^M)(i0(jPN)z93V~sui4^0*B zAL_em(UwnPK*=AsnhIZbI%>MBBEm0f8XIfmWTdLQ#^Dr~nykVe48l*DTcOhM@8oe! z9-~kw3XBv=NS2b%#IzmWH_cs|%T&#Z7MYzN)}+DKH!yJjGp`>|*M3F(^3d7Of8(AZ z;SM%CG~OWA>!br0KJwk4?ZX1Dzd`(Repr(ZJ@ERj-Jd;wfJZR-Vy+$AuV>&mO+o}Z z*#&>Q^26(z5l{V%d<-M_Q>YsAw*Ea$4%M0-P)0D9#+)0)9;)0PVxyRR4UAP9<^saE zOv{NL^6`nWflMn!O;U^{+31e zJ$Tu~2Hh8S@?2=uh@qVGruyv*zH#T-#jFKSgV!@W}ZAcgBS(B>^nrEqS z30j4J1*U&)Qo*{L2nkc=67lzju}5pw62zf)X-8X;hBGs##8Ug9JX^+bRC<6xDm2g&B{5zsC{Tol=JwzR!wd6dn@APJq99X& z9?jvBzwUC7P13n#9H@O6z`*bX2|xueKcGSo{{xg!JWLhPRD*}!O>!(69ZOOJ>LyNY zQM*y)%+32w&H{QB5>V3gB5Ut@j{G&D8eh?d;e1LYUb2Z!$QeW)+X=I`+@MjQ>@tv$ zQ!GhM^6PQdB{4$4YzvA^Y|sTEO|+|e&S=^GrO#a5H?(b}YSF>lSJkgsI_$rsKGmJ; zPDLBreYT)0(9t)VS@-e!gHgMG#hI5YW(p5zx(jD3Q>5Q^Fu1NG-rqNnSlyo(?W|&# z2wq~V%XS7v&RNkkxbIU>Jijl#Af4T~xXY=PlCj}Czw+H3XZ^>kZ(X|Kx^3+iB+B}7hbv2|e$w^Y;qapDoCN+52wBQO=zTDJ~qkCeT zckgNHSlHRrKHA#W^pZbp*H%xQF@A;ohWvZ^?|*z|p*K)7vbxdiC}*E6M3%`u&1GeL zo<0hq(ZFRgy+JE-ios3gKca*nB^~{MG!C~3OISDUQOyUjxJ5^D@*%nKdglF8 zvK1v>(H>ZBAS}C_37ZSqvFb0tDl~K^cpc1=qphPX)TL!tpfhLL7G4M^h|b~!8qy>q z@c}=WvUe!rMHLILgA8F>2xSCV5Jrika0B@ynLET=q}odacopq&D$zs+7&FOLs1_DI zMZb!yM^4&gi&`qNhhm~sRzUi(geLQ6W7U6(X)W4(FVqUf5xFwFxM9L29Ikq`7E#+tPA0Q=XmZ5C83+~GQ;%%}hm^iud&I98U z2k+Tbn5HSDHuT04awJAyXiV#0ILBDkI#87vZ;xuvN#|NZ4K*({ugY=( zPvU+&5x(cMbf{8)vLxHZjVL1%s`dstf{AYTzal&$ztLEOMI`Wc-408Ab3JfUw_|fv zJTFuQJ!#$5x+*^cXqg5&!Y99lFqp2|U)fMwv3s#6d^es-xOF~kFKaN{D{VT-j5bC* zd-ZmC4UGpO4&X}f51_z34h^z8j2A{aXCLJYT5wzvo^_bI6~u5<&9{IdFBY-PPXf5$X1ru7eB?hMrX+_(rS{JDFm1i*20JE55LNf(u-OV!UNsg^HI`Lg1PB?3V% zM@>QcJ>vpUONukHprO(MoZ3F$$|(CTqu4<%M=hqm$O?c>0MwLhg7Y*V(p;^%MRPa& z-zPNB{EzJeCC%ak*#PD2NJK06yv4*W-)7=kK{Lwtmv7I7IsZ47#jpRTCd4JG>?`G1 zm9}U`QRf0MIms4y1o(}pi|OG1!V(c~`kxydy2p8Q)Mgbw5q>XjD@|tK<(Jjn5afca z$?N`x$mIei)d>T|OCt6=Q>^eBx$($-ME(|;2g!5FIVz?5n=@3MPRIOOLzTy9H59hF z5z#S@Y}s?#B3u7y6Y1pOns$F{s3M4*ZHS#FU-MK?yk+fy$uFUNM<^xbblq#u-hb|v zF^eal6_3K_hm1_rrXsp!4}AHXr=R-RBlj;$PQ=Z&bkK~_9D|9;TkpDm?Ve{Idtj*; z@dUshD?Y~%JqM`aq(oE#zt8V3M!wX1QF3tM0JHelAW|rOy1)6|h0|OJJn4Qa0nbVp zzBGAYZA-jos@d1%*TaXi2P;CY{`NJ4$@Ii&{kFy1&e}X`45ox90YDtphaKYOrixHH z;3>Sm^nu5o*|YZkyKbFK491Nfb1-c)$0w4@?tkR5Q&0cqmmgTBi==83zBJ}@p0RJi z;3Dp=!unU@^gM`E#z#xAZDy({GL>-&n7ZSfG|pJc6QL#=6d#PQXlz^&7at5piSi;d zSRIwrAhGB_$Ti~G7uJSrYQlxJZgN~$o}Xj}F-?3RUR4z@tVJw;_FcLx{fy#u z4BO9(9O8#s1wjlJ%9&B-oG?65wGObP0m$6GbF0!gj+0aV8YY%@0igIfbLkObhZ$ z=KF*~)!pssbk*S6&XzSYj9-{6^d~PIAHPuWi7EMA zXz<5`A8beNfc*TdhFrDQ%@g%PzMvsqk&Y2H>ZgWVt!C$$g_%OWOfED3PNJTE3Vx*=;6 zHAJ8~u4&)AptiDkv@R4}SeJSej3*_O@(+DQLAXb&(Qh&QMq|bsQaMeq=7f79V#?%l znZ%UcuGMrkOZ)8h*&73`5zMlCG-3S~t%jYGpy(T>8Eh?F>q)!4@Cuz)cqO9ML|Oy0 zH`?veK2V!k?1tfTAw-+jYcyoZ(fghgC8g;Kl8S)%D4d-+Buk0g<|me%?f`Jk{7+87 zYHk$2*SLRZXg_^6H#Zjg_&0nuYc)$c#qV`?7Wz7uETO;j?JHzx@8BLE`W6W*9G=-h zI+%o{R&&ye@f*#4o34SY&ABct8Uq>AH?vEzE7EmwHTTVA3b4>9Lw(FFmYD*_ay!*T z0j7bxM=FZMF*@p5D(9i&C>+daSUExPq}2;80HCt80#JI(FkNF!AG;D2^m_c zd^xz-zVYHKZ(I-`ijS>XGlq`^H(q)1#&#+1i8?Bq{Z#{pFWbK+d+~GfTX);;^ksCh!xea#+{^u@cciC|N?Kd7i*d6mWd#o1eOyO2WZdj;% zM!G!P<_vSea2%%j3eD-H0Y#gLq(jd5$@ZL4d)ORFB<;}#cQ|G>rs{C8;BKkUoEI2uu55IiS6H<_;EdK3dZmy4+S3uq z))a0JMtu5Z4*Bhhm?P+!nMEqO+gBZQYbC2)-r=u_I0u`3HBlFxb%8$&Vu;En|=M-J2pe~c&UGnbo!L03c69jo+J80`&d`GNkW z+4b@3qczQgUeCu0FMlkO@z+G1(kH~9zU=YFWskQvS(`M3+`<|Z-kE*cUj;Ao!7x@r zH%C^Y5&q^uY5|=i8=cV%Z;P@AIwa3lhslF!Ntw+Wa6e!v5Lm{{p%WZUG5{E3nR%4V zEaJRNmZrlK7D@U~lW>C>15@Q`VqX{X+-2Rl_a_7M94`B=~7%a$L|r3*0p0+ zZzz{T;gbH59^o3v6$}TQf-@GYa?3~EFS*lkTd+bfq(fj*0Zz+_`7a8mT^7Vh!2N>m z+6)+UR{2xZ+HiKFZs6hpw^e>49E`M2)@K%lpBBzG(feN>+>u!`3I?>)9)~8<@fTT>X?7QRpa)c%bZ9`2v4=> zwc~wO5Kdf@F6sNvTyDQFsna@Lw%H%(QrVu?gy4-wqi(^7L>u?Z?pPcZrv$@qLn*i8 zxW;Bj0&Y&Ik|FlU2Fo*hgEEj7kquU|HZab#u#PE7ogxFULI$;j!6;&1Evh

BBF+ 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ⅅzeJ>fu=t7 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

ghSE(b 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
Oyz=Lh|2>8lc>-4^1<2$w;ksCYnR7c04_c^>z=% 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%0Ahx^jVJ5tO)BL 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 literal 0 HcmV?d00001 diff --git a/shared/html/fonts/fonts.css b/shared/html/fonts/fonts.css new file mode 100644 index 0000000..c3ed66c --- /dev/null +++ b/shared/html/fonts/fonts.css @@ -0,0 +1,34 @@ +@font-face +{ + font-family: "Segoe UI Symbol"; + src: url('seguisym.eot') format('embedded-opentype'), + url('seguisym.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face +{ + font-family: "Segoe MDL2 Assets"; + src: url('segmdl2.eot') format('embedded-opentype'), + url('segmdl2.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face +{ + font-family: "Segoe Fluent Icons"; + src: url('SegoeIcons.eot') format('embedded-opentype'), + url('SegoeIcons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Setup"; + src: url('SETUP.EOT') format('embedded-opentype'), + url('SETUP.TTF') format('truetype'); + font-weight: normal; + font-style: normal; +} \ No newline at end of file diff --git a/shared/html/fonts/segmdl2.eot b/shared/html/fonts/segmdl2.eot new file mode 100644 index 0000000000000000000000000000000000000000..ef3f40db6fc0c0dc5ad3a393009c704845fa1fc5 GIT binary patch literal 264478 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 z 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 >P61_i5XJ#QW? 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 Zk~4DivpU06kvt5((n!=KQE?vn{y$f_+y4Ln literal 0 HcmV?d00001 diff --git a/shared/html/fonts/segmdl2.ttf b/shared/html/fonts/segmdl2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..65cddd7a10f0ef8fa2bb6f602101987bf661bfdd GIT binary patch literal 264272 zcmdpf2YggT*Y}y3dv_B`+NP0&B%2;cfpq$UA@mw*DAEN4q>D(oAR-;4smP;96Hyeg zA)-b^MeL}Ef*K+a2ni%eO|r}PpS!!s60tn*^L_8{eZM{Y@0~m4%$b>Ur<|D^h!K%D zE(&>N=XUCFh?=hWp^8}VCd2*M5Z-FYQe~f!zcgp zWnwB(gULj`aU*9=4|o63{S~6*BZ%K<%;ftfRy}iW6;UG6vw`;wpEjA?C>Z<)AiUmv z6CN7#$@H_`iE>7fSo8VV(Zfgi7}cYQ8-nnRvG53aC}10&``|fh?8ND_8hqHT8=h}M z=qD#UFmky2^S=}zzpF(4lP3MCdh)DyuXqq8fggQKvToSXRu6oAE#Y3zme;7R z8$5{Kw|=0>`!7=yO}B5~uJoOy`@0j@Qy>kYnDXa43*onXXF2?JKY0;NrH}eF8%lAs zp8Oo)br4jC+Uk6STMS!6D!HkfRMapFw%^4!G=}@QscId@nf{afyyV64>y{fHP8Oo}K*VGam;mLYSle1i6uf%)=?mKPoGD zRm=6QBQF;}$GV9DX%Xhst?Il{S9*MeIsFvyah91O zFQ>nLm+{c1@*R}VwezaYORp2et1YL_%frD#0iSTVEq1VcyZ;^huQ}pMUVvT>%@GfG zryRlpcWXYB$Rmh`A$$fP<7uob`nygTAQlkSzmDE*1?~~L9C|p?$$LIPHT5L<>by;M ze};C~%Y?h07U9)*SN(VOcety0$!80o)ug?B8*YbAGTi^rPBM*rmt@^b_n*MoZhH8Z zKgN^cvY(N8%f3gCSGz3I|93~&^Y*yRV!u1{t(F0@vMu&Hkuq2N!|jY)eb?+fcr4=e zhFjjHU#)jh@^H#no%U}0q@PT00$jrXQU;fJu4yo4eR1criwrW4KTU@)3y^Owi=Ov6 zJR=Ru{_}L~3c^nykEeh=0Jq2Go6s&P2)hnHIRp3^?hZf~xJz(P2aeg}>UklbKgcHi z?&klVOI)c-|l?fKBe0k*Y%F}a>}L4l7V>WlSsBn zTL5|J=_2fTF&T#ROopTVs>5A*%5dki=14!+es|4F=cDoa<(*UgC3qP|0C<-0JO|~@ z)#K>AOfxYD|Cz_NA`*I`fu((k&tTUBuJhe?05*IQuS) zZ<3dea7TG%8mFI(C*i6;&al6_%lJTbyVrW>tNF{kWINuC*WL1z@ex;+S(Zmafi9}J zSLX${-bctgIgszT=Q{2#VRG)E*P%m3UEdtx)jS=1oMF{$B(I z$6=0lR=Bo{g9op4$nMG$ZoV4$&gDME;g%JP_LCu&ZNYM;3u9FaoSja&Bm`*fCcWd%0e|#yp3WRF%iD@#H z%g@P4zw03yLN%64`Fbpk4YS{+ggl?)3LZHQZdiOH4g8!xor4EqWqQZ2uA*_&gCyi{ zk#K~|yC&VzSO019>Tp-z;ia*btgj4n{4__tFR}*oBI_&q(uc2zzeU5qPt(0|y~}S5{4}Q&&hXmLG7i-RZE?ns_nI13E#Q&QENZTz$q;mr`DhFa zy{5~g`^Za8ifXTFhaz20ZPD!BXn}BDmIV3CH0~&iEGU@(P1X%V&m}bWJNs7P8FeD@ zDi7jK*(W@YH{zb$kNeSJ42y$7_vly2L35N-aseNCt!^(;HG)kA+?UF${im2vqMDx~ zohXy$^nxp2=j8AZ-(y`5u4t`hy8ke=M-KfagCXl~NB;6rbHMJBKJtgOdWii=UK>~Y z*~2tF$knZT*!4qqk|TvZrt?V#*;6?p={M;kfAR{qlZ#!?79He zFPE}{x&6n^RJ-hXIv+9L;Pu$IY(L&|C&~84oCG+my9jlur_woJlWzlBBOjMLe;V2V zGV}YPO-?ED^*00|)jzZ=%3uMn{A#}pxD)^dmOpf}H{EWdqm$jAJ4o7wq=iVn8M1?y zU3`5IW(j)F;7Oivd+Ej?Z}NuQ2P8FDmcJK6c01*X(WI1I?gFpoPTrjR7 zAfkpKqEHY~7>FnwL}UgLMSzGRL9ot&&~Jf=VnA3kfC%=jI9%gFun2;rPBq3g0R+P! z2cmLQ^5AfnbF zqBbBR3kY*X5K%i2;SIe9*K80`dl1Z#AfgT+qK+VJq#k610tFWBAN#xnh%n1kcR655Ya*q z(IX(DMIfR_K}3r|M2~@pmVk(sf?z=e5iJM7ItC(I2_jkrB3cb1^rEsKeH=uz7DTiT zM6j~1$8`gUXd{T|2@uhfAgm2QM4LcFPlJdygNXhGB6v=2lW175@R zbr8`TAfh)xL~ntJ_JfGt1`!~HdM{QyLC2t@QDNcM7v zas3EH^f8F&6A;l65YeX~qN5<9&pvtfc z??FVzK}0`*h)#fregqNy1R^>KB02@ani>Q{JBa945K#e$=ro9^5JVW?e#7+)i0CYc z(A%EFwFpFX9z=8jL{tnSx(LDw9Yj4vwcK7|+5D`-&AyI_97!h**NRu`-<*jli&;KhQM3*IQ$UvRkK`+~CtMW_3n zo_l)N>HO2hr!SwraoSpFD6CuPQy5hkSJ=65XyJsywS^lBpDKL1@b$tQMM*_Xi~1Ff zE1FZZplC(Wx}v9wb`|X@dadY?Kaa3`7ajW9&;;zL5iU${uE*@Vz zq4=TVMa7GYHxxfre5m->;;M`4MbC@g7h7IzcQN~7?~5ZZj=ebV;>wGUUwq6_k z9=mw*;x8A^qq%uW-4g$j1|`8Ip(WuZu_Y-bolAO`3@#a7GOA=^$<&euOJ2Sx_Ln+e>VIkUr3Wrex%A+r*_YN|+IH#azOMXV<$KCMFaPmM{VU#A60Rg& z$+FS@E+b-QZ1+U)9>t23`|y1M&n{?!k! zS+4cI_VTs8*NU!PzV3EC{Cd>&me&Vgf9Cpu>lHVAZus8_x)FM#*^QhV3vN7mW95x^ zZd|(QezV2RHa9!moOg56&7C)2yDc?a>L4rd&~z1G_dIYqIpG+6s>^{ z?kIXm*TJ`R9el6oLtO{Y6&0W7=iQ-$-sc;fH=mC_AAdgmeAfAApo7YVVCbOvLV~V? z_gu)kFyz9-3#%`zt=7R^chSLmcj#bdahu`}#odbs6%Q>Qr|X~w9b8)cL@ga`3mxom zvG2t((7}Zl*Ie9i@n07|gbscO9Xxlj3OcBkcvtISR7um4%#!XUeRLh1P%@=tI&^Se z$z!#2@a>YrB}brxMI~j>!Fr`$rM{)1x(+si4mK-oS=tsl*tImbbZhBrx(@zWTA=G- z8|YxaOCudR_|T=bx(@nX4!fKH9c)oc2Q^&>*Ol!l+gJ8++0n9NW#5+-mfg^G(5>7{ z*TIdxO*l-5Ydikb}u`Cfq5wCkNGQkbt{?1D^(7_E>>(Y^OlX2m;Rr$}x%pFqQ^B z9Vq7)6nHT3oj{D*ff&mJUk=<8_)_4Dfja`X;%P(R+Q4rEzX|*@@cqCa0*?n`%nUpb z_*P)oz;1z^0y6`%WP1BAuxVhEz^K5`z$kG4Cg5_ww*hYjyb`c8U`N3EfSCa^;5!GH z8gMVJLu8tOT%fh?N(@K{hz*Dihzf`ZFb9N7Klux&8{i(m{cro*{Hy#imIW~XO8*=F zzxfyVpYqr156gzvfL;F2`>*z2<-fvzk^g-Ex$t>VruU!eKiz+_?rQ2E;cxQy#$w}^ zUp}s{_-)5^t>0?DC4QL2`3?7L;al#D(bpFvyze`{ulO$Xo#{K>H`KR*=~>felbnO; zKhyoDv8MY>Lrwin{Y*VfT}+)#_n6w5vP>DKbW@rs#ni+UkL68-sevibRLA6QBA;@f z?|kG;g?t|Nne8*ur4eu09*1y$$?Gw%kzW11GT=6O zd3$c~Tm(DrIL}mj?w(;V`jN*TkF_4T9xXk3d8Feh7~R}2_2v8ozxtEwx2fN{K6I?! z<$7}7p^x5t9$zm*`A&JoeJjVTj33|!9nbsmbWn^H`xH_VlsU>m>8~tP*68k8JUM;k-R+9oO*fl+Jy*X!bGykoWv!pvCAYF#Ue%9odb=Qx zXk-dq?-K?z424qiyY>?#mFS`?zm%-{OAI?hC&+^|-PQzQ9^&1xumT z>}U3id}8(3uW&twwaN^bCTiW;zgWH6e$~$_*{@iYVSNT3)v;I_OUFuR3swYQu?)=o z>tp_EWdEX>tUhMt2e9UPgcc$G=a`v3$TC?LD*rRqj5TL1U~6o}TC+D;8!BWLI?CFz zcI#{8tIKw=&R8A2#JXSxKZ|u`-RKq8oyW5Rs>5DjJt&Or zW-qdrSTA~16tP_PEIY;evVN>T8^BJpLZrLQ^4K8yi4CTQaMI=(wujwIm)LMNg1%=X z*(f%eX0w;s7}$fyvT;~z)n((!%#$PXOY_(UtbreA8`%@$d7RvOj6KCR zv8UN)`kg()wz6$(JKMo_vLe2b&*vNXIQ}4Cz?bkfSnVvvT5Tyik9O+}OJ*ETL_02J zD`*M3z!P|59?8x0Gb?5n*|Yo!{v=<|O6g;EiC*E!bdp_WmDsoUXZv8s8V6g${jf1i zgl*vg*c7I~mM{%A1QlBNsni(Q5TGB>jiaz2)M2M!L6{B8*2A)fU@!QLK4;^gC-eC> z(qJuED76aKfqIbfG4{SJHLL;4p?xc016Us_!xrWV8<;n2UnZ=m{9x-^3k$${ zXzEv3{RhC_)d1`NC+JBYfz{$uSo1#(yVqu{^n)pc)rG|?6qc@Vtofyu%lBm)tXL!@y;PuUej)VqYv@-~tRu^?e!PNp<1MTRE3pzpdqY2@ zVUIJx6s9r*Gcq^k&g$?_*r%|dMIqiBSl36xcJ>z5^lxJoe-NwpSSDBR?^8Zj?1x}W zi^ppH6Kcc)`4QHD1+icj!Wyzr7RJJvnMJTj7R91j42xxPES@!DjadRqWJ$2OCBW8} z1RGlu*w#{DQ%i#_Edw^REZEMP!)DeJwzAf+ky&6HYX_THHf&)zuz_`i?W;3vUR`19 z>JA%MPuRA4!=}{-wyb`zVGV%oDi1cR!LU^gg^g+$Y*Qm(lNtqE)EL;H#Q~h=il|QoZ zzR~vg+5Rr`PuY0+7PELo^yGto=3m+f}>~JgWly8wwJvsZnD?d>+EfIfW5;G zvV8UdJH$R@huKH$2K$(O!hT|3v6HNfm9s0@S-8rsvFqH6_v2waoSX61Me%4J!(;JA z#^b$gjCV1SC-G$7gg50WJe8;Mbe_R8c^2=$oAKtn1#iha@y@&p@5;OJ?z{)@$$RnM zJeT+3eR+RAfDgo8#UMVI58*@k3;YW{6TQI(^m*&}TK+g+gC1uU`lc1=1DElo=pAG) z^(bG2UTYzG3k^NTJU*At;SclK{2@LIeaMUaCBBEh%wOSq`EWjhkLF|eNPZt5g}Ki= z{2+gqzsKLlUe^cw5dRRP)33aMU*eZ}DKF>O_;r3m1d0IRFZ_hBFbN;wExd%M@DTMy zJyBQG5$?iG7==NoLJ>l6!36Q!+{UfEidXUqev97}L85_(6)_@8M2ZMu7U3dHgo=hD zSj3AYkth;GW6?-75go-4F<1-|d19a#Ao`1bqOa&9az$^^OY{^yM0e3mbQN7hXVFRA zFUE^;n6KR@#)#2klo%;Sh~Z+GxK|7nE5!=2NIW7IiUrsenlI*wxnhoZSgaFk#p7a) zSS?nGjbejXFWwYyh}XqyVxM?b>=mzwm&G3OqS!575WB?3;v;cbd?*fy4@ACrU%V&2 z7GH@k#TVjp@tOEW92LjJr{akCMEoR9iXX)(aYFnoeh|NiyvlPpVI;n}k(V37gm{z7_2hZ^cXTR6LXb#a{_j{FDZYuM(|9 zDUnKq60gK5jg(j=O=+y8Vt$&UBq~jnB&CUxtSnbnC@Ym!%4%f|W~q-W>y-7%24$nN zQ`x5MP_`@YDDU#aB94Ege5HJ;{Gj?NCsbeMN7bbKr1~f)Rd3~#>ZSawdMdxD9?Gw3 zeWgIHr<_*nDurqtaPZI3LA?jdtkea6sR0pX2F;5?*j#Nje!_}GU40XCXO`WPv zQ75YpsFT!*>IC(Eb-X%G9jne#A5n99-F`pQ zdV&>hk>+6O5owMzL$-n0$ToLCdx&Npn20IzUJQo&m^*LG_SKQsx9U7Pv2Uwra%=on z-O;(0q!8(0vEl-s#)`D)}orVQq5YeW^D*<;9za6X6;tZ+P#|fJ`*!G-b?lhmV0Y`G0W0- zd2yn_!tybW|ItS-6P&*|I9wsu6|hT4J35QOj`gslka%m-m30?$au6PW`*&dArXv8e!K zfHG`vHUXZ*24@OTh%HW(C+;e?H+=!vSK?;_htU|wqcO^y0A2}5o3I{Ro#2y*I!p2g zvVncTC2V^l&*UrE_-u!5Pw;8_H8wj3W2+P8$w0kiyo{~R5CCzTL9XV_ft%Ro+=)%j zS%3}OoJia12mn5`I@gssj|*yzjxAX9rUU>R@#K%M4<0^rdB z;T_$8_pt4m2AspjC&D^+2G#w%+gI_M>&xN~>0b8VX0Hp7~6&s>C*bYS<4*C)sqF0HA zfd9}kY=!Q`M(7%%;fOZ^`HyM@oX5sz6*fGPe%vkq@yA<$&DiYp0aAe80P0~P_)ffp zjn9_Y_C(kelx4~hY;|72MkmtF7=`Uk)X#&6JL@>MH)mpVGaHzM?agptH#Ruy0s8^u zId=qb7#p3CbKZ4qb?zn7rUT%)U^2EiHEeJq??;ocxfuvR?#FO{3}tu>@t2@HOV?wA z6ZtHk102N$XLkVMD{)^Hh3!q`yLtiu-fPwZXty;5*y@bHM&}{`d9AZyqjNg|o*R&M z17z9&_YVb06DiIuWc3B^n_k)e;wPNkZWgiU=p@HkCDU>{FEYD0m*t1`cDZv^O?N zEdcWRf&=jX;u+uO_Fuomrs*ndnIi7#nE>ji za4fb>L(tVjp0iolFh%-v?_tXn^;&cWo2Ff{Wx5Rb4x6T-fCdy}>$D?Kh0W9L*gEZw zjZ>8A(lFp_Y@dS9WyCLoJmtvacMoiuLgs6TckOj-nl1wNVcT>(@DnypQLbB~0LWbd z9u*&B>l89oLiXDUz%JNR2LNk<&#`ni02RbUBVZH&H^w5S9ssI{8Qvpi90u$LE)jF< z35*9e0)@ot>;+B{!`Q>>M*)j~GsHZ{67yb0%x5rwJWY#<`T7Hh?-vRn%->>;b?j99cy> z<}ASx`HsL$0O>kFu8#2Qi2OPh;G+-l?1b`lg4~@UZ)em`=c_nU?*pJdx*(4(kgF@? z=@tq=wr)=XsORpGsR#Uelo9I{1&qa~3%KWkS1$7DbCX!#t^nlkTTHB99{~6M2Z;>` z1Ulmr#Yx2SS`!;I2dE%6I0pER*pTr+6|tcyz<%I3v0>mdJOt2y^TbAg|7henW)*OR z*nP-*EaHswB{m+s$0K|K+!IlTNlS=5u$b6n@Sl>8I zxu~nTX#ixKI}8BdxhsIJ0LnP`OW+KEdYI=0K-PIJf!@GaU>>j@*bU?ZsFQgm#O6b; z`GG(Z0GTw@&w?ib@Ofk~u||k1bQmZmw%CK%W4JE?-=&ak>C42HBhTe%ixs1Y zt?UXcBerTgvDJvXrVqj3383!QA+L3L#Mb)*cwXO+*oMi#K4MS6?}_Wgo;*bCsSscx z0RK%sz%gP^L$;@{5Zhcx?3ta!o;^xz%VuI*QO>Qe6Wa#)x98w9wV#OX>`v@?)Y;=dRIK*kr}Blgm4Vte3zxi_&_W)a(qGQJAGSCP-YHN;+n|LZ8% z8wteTg#Vknh`qG}IDpR~P`06yj5sRm8rH0>%S-0o3bvkmWnX`R)j@?;-p5eE`V% zeF3rK;CK8cKAk~3oj|%D>j5akNra#Jh1k!Ri2ZVc*so6#D?oTbF|k4g*h%cS9AG1W zvYdh68HAsKjAthiE9wsH2f*V(46$N_UyK8;5GzHQE@ctB><07%z9v={2+Sr{o(4eX zD?^E04F@_Cy9SxBBd_b=ePaMVE7pirpdKs7601VqwhUso*As^=m-FsG0X|oZ0ZND~ zZxUCNfW^cOX~d0nfSttMynx=ocHlg5_i&&yFqU{7#IKu0yq*W~`a_9(fS1Ql#633? z_c~78+eX~f1Qe@{Dc=AWjVYV)BW{!Y^(a@%U538-){Z ztN@TN;Y;F)kS`H=B~2in>;s@4noJ_z^gZG!NS~SkK#sJ@#M65NkTJsmga8|fXKo^% z2LQ@!>xaAJGIrUL#T7 zQHO|+hTna|fTP664kbP=oA~&xI2epL6J`P^<3tYtaV9PUkpILA;*+9?KafUzGM*<_ z5uXwQv;+nNvx!fA2>}182%iQyr^A0nBOo6*PJAZX25T4o;0b(|#)&_Ka?jpH{9zve z@#pj*KDQqL`R9!yKHnF(LVN+_UHB$|x?ETYpne~Le2+k$N467RG@kfklw&dSUyOVf zUnTxn7J%|ERe;^Z(O+})*L-ChP)vN)UI6j1ZsDu(yaw*aQHFJ6h;KldHufR@1Y~*= z^@_C#-;_lB=|G@6un0H+pguRl{jVrsGVy2E04V#GIso$9q7i>?Bk`?`fS$lC0O_z^ z;aIEiZMy-~&9>{rw}b!oIlz0wcOc)LsFR(Lbtm}mM46vY1C{_N->w+oAn_LHRar521`7+K3-USq^U{{!tdt8$ca?vV8#l$~Bo}WO@Be)+y{3B??PZ9sq1H_M}0H=t576c%l&$r+M%3%P)zMMz=E6DKG zKH^^^zi&{6Zy@KfdI01)c9{6LImEv^O8k4I{~qQ39_f$Q0g(2GE5uJA?g`|1LIY4= zCvFn|5qwTwBL1^KP)Ph&OvBZC$L;UIq;@2~X-j znK)zF4j2pU15S_-O@JdLl#fXmj+4Oty>OpRqE1U-Cy9E~0mQ@lKzM8?;TZ~iPQq&o z3GZh}_`FWSbby2(p8YwAfWagJcaaE+AQ6n`5PaI!Fa_vH0!t?mx|T#(0`MM*aQy9w z@b$nY66RF^_?y8iVk|HZKv-lQ0Dprc3i(HE0`>xsHR=?J=pX>{N9O>@HyYv5kToU* z7zIF%SmYP`6HrDX&Hx}R4)Vm!1`d&khhIGW8Z`nCr!n$L2m}g9B<2C zA<^VX5>5M&NI^ZM90YEXNJZJxP`)&zPe*u042i4>z+Mu~Ab+#Pz+nJ9TOgknh|_W? zfOIX-kZ2VLAbu;vZ*2h(uMNs?0UyhEB-$=mhyXhXdD1bSWXx6>Z&Z8Hw)GfnpLpkgn%5Bzjem$UR4* z590Shz4bjpqTeYJus?|bV}Lm%Fb;@8sHY)m0OAfE0ib;Mt^q1Y4BJm)`0FIl_lr@1 zfCU%}Abd3Vj?qY991vq6!?*$x<8i-#6Nw1}0EA790uX;vJrWPB2T+zN?*S)BOh=if z?;`DL@%$j3XBmJdz%ddJ#Q~7_A(VSI@}7N!#KWjJtOvv#)YaT}z*Q3SGJr_{ z}}pDeyMtsziI8P z&a7CrUg?fdEEn*X5fB;Y0z9zS{SFa)@qu3B{X|}G%d;j|-^N!k0#`)DRfW4rQ)W&# z`*~Mi+;Awn2CAlMRitU0&7V($cUIo5p9Zzg;!ckdRj($v`Nj#gjY&NYKngB8jJ` zwdSUj*0?9(*#rKe+;9V@7{s%-9|D82Z3~`r_i@L+=WGkIg92?oJd4u}%w~O-#Uqr> zcZOmi7!=6jpS3OFio#3!*~-J(#|gxkvdmDod>=O06vXTPeo z-ItDO(PGTf?#_GWu#WNZ9fxH)?n>0ZCydp#Ahw?&3FNU0gX|o_I7M|0{e!4{ysKDJ zJgep+m@Z(ocH@0VOG~Z7djJJAdAl=c)lFJ0ridw?Ra%v1&?=#xnymwSy9#f(tu1@M zY6;;z!awt5OyhfVRuVlL~uYo>om`hdA)nj3-RPD>jeZyU^}Hs zyQfu)d)q~EvRF7pwY#@Pt9zEa1vZTGZQNs$chxHINj)0-Ml}p{)1{N&tQ$4F!g*cPKszjC$(sNDiO_3q6?6{02%Ya(TKA;jq#KT zM(8vIG|&i@R8mo6Ci#G3W<<4Me(uZ>QqNwT#XhF>F{y z{|z&GnRc;xM>V$GHiM&T5w#L^kUDbpAZ^asPqxjlFwJVQT7<^yHt>&{y!!dUlc#=$ zgI3EwgE%B0k7ChfLpNaWThIkSIA(&hWGF?$$QDgEqet;JqOd%=;!+;=zTwnVQ(na- z9*x*AFd9nH2_iO{9i57wnHknqlxl*kr&ModQvIwa1ZfrcFa_=H=!1kjz$oieHRGb^ zFYA$$3P!T8gTmMl`EOImZ&w{Dq@vxK0%FNLBxD?!gFP;kP)2s;?uaYpvB#~d;d~2{ z)byXSJslkF+|bhz^))_$Du~6oqip#N9gCEGl!xLMi7qEINywf@sI7<4JYt zh#2%ezzCgJji^BBQd_)}`_b3|+gHuVP0~6nd~0&nz}Dto%MXkne_(kpbL)Xw{hq8^ z*mB(Ro;_BKYuR$#iXJ_ek86n&B#rv^D=F#M*Ls{a?#mllkIP4)wP~A_J7d-M0keKN zxVBN`y_4s)lWZircJn6R8yP;1w~*;w_*K2yx8KE!{rbMxSCbAj41W6f;fM2P4RNlk zDM~3zBpVPU3n=gLs2m1|gd~{!J~HQJVhWY%@^U6a!dG=$Vuy$8{=(R&HBJlQm+Aqu`K#K~w4 zr~fkL*P>`61zM+I{8MCSgYggdBs@bqeM1#@4v`i0;om;qHr-;GzU|}R9(Hw)`*8R2 zk(rqzSG@4yIH!C0?hjd0+bT9S&z8czG-`iLW#@2fS>{N@MYF*+rac(WIEJ;=8yb^Vn3|D&%P-S5cg9DdL}&q~f(a zoRgiFXTxE7v==9%h87RNImcM^=*c*Jm?^)~wZ9K?vSF694gH-^(_+mAKX2avb4EJD z%PlDy@J{uM^o~qVRRP0|(3B`Yzo?YZTWg&z!-MX(*1EeJCb?HY$)x%NXki=1It{Ob z1_=UV(?hDZG)#*P42(@{D29ck#|EyctEzRYw#X|h)8jHtV~DQ(-;$g`au%81g8N1O zwct=lhu}7dE}tBd{M)i)vizsD-UeqoJK#KL51irbFTXYZ+g3o03r8zBTSIRV_{&y_ zb^vA6TL&%l_hqe+RV|CFR2RC^?m|~0=O^}}%PNp<_wQ5%pR6a5Ebzl%FB#ycH!AK} zS=4Bxt3KXYGk;PqG0;`1pZ=-l6lkbyTW1|O>PXgu^fTjbcGivKes={>)LUzD(oHo? zQWeZ%G&zl_1Tb4b4RPFWV+7E2U50j|hU}$r){H?5h)ZiIH9Iaqy2LQ)S|jS$7gby2 zm6ti*1DUv{Lhz(f%}8a!+j$R8@XmlvIA;IOF<5^;UB+aVqJ(lEKVR;_(KALRajX%1 zTJxydy(OM`W`Ku~tBKgmP{Fm}q)1=i$fRJ$ou94cVH>@Y8P2@(Xs1q(zH`P_v2vxY z!uiD1RS%#2Wcv(@WybbT&OTh@J~OA&(wX;~r^U}&|Kgy*yVuW(pJu*y<`PA7$;g@E z9e1JKH5Z2jH#M2jnK?BXIWuKiT<7s^oA+8YI3;E9qF&A0j_({Nm5L}@p8*@NQYC#f z_cllC<2rN00B4K7jh+x=HnC`=sYtvDX&N_O@OQ=(dG@ zJaK<}+fY{O(V&iXUm)-8?%Fo)2Dd@BT()PBt(4cbUK4fimcvR%?v?VBz4^Ck{`@{m zQ>H`>&S}`NSIVZ53&Pr%=QCmzc&3zZ3XCq zrW|B2wwugGvxqhO2gI|COtY-LU|dpV4XU#G_?|p`JhCUxR`Qp1wbCx4yWx_(7TVaR zH)dZY2UZ1{!j$e@2{T#uRr#X+@`Af<>7`d8->lc4N`u%QTkarcvX*iaEB&i_(v|Y; z!)@ENX=~39T`9UY`FxvDbKj>VWs zVSa~$(#!;yg&A%W>cSk%%yqfh1hgeGbV{PRJdPRbixGY6BMOZPadRBHx0J7B4)Zq2%a> z6dJ+9G3)FCeXTubt2OI1)w0Scpt)Cy;b2lo#?sE3V}>Pn&1Ce6qWgeEekF$h&MI+iHBvF{N_#teZDy!L6|= z(nXFD%0^P0`p|bl4a3l~ei0^R4f)R#i;80msBQnVlFB3 z?@Y@rvVQ)WgM2ewI55j?x+DMp3Xgo-e=LX0_CJ+_=Ue|{IfMnvY1j7nFVqK2!2huv ziUnqt|4Vv$BD zt)^NkEh<&ynHMI_n#*}#A)Qvw2RM>e!Hj10-n4skZ9DcFnKyW3DzcDHIM zy4&#PGIsOu&{X%?v)xle<7A5JH`OU!mP-%!59JHEqxb!LDP4Qve=g~jJ9}iOy!fu5 zdYt&@^4`%e|1*he`saU7<~#c8|5R$19{V3j?b>ty`(itL%Kvt$UHbI@JyN^&_Wz5d zb{Pl$_ekwJLi{h1+GXtc_oapv2Ynq@qUf_>Ly(3HOd9P*U};@MsI*WZ6qZ6g+%-~l zRJl?{M8sA!m?rFJX%&=!kq)L894eMej zzree5{4?qPf;qPGA+Zq10lV}XEL>swxq(_X6ZT^Kp2Sh>NRPJj#C(Fx^2mdqv{&joH7@)V zvYTq`+up1;BfHf`vu|ZH&6%I`PO!$yd=w4&gu&MAl9M?th-D1a^6KU1qMQB3#^s_6oRf?wVU2Q zRqnMpt3>wjNTgxoAUQ}Sxiw)sxj(3}XA+L8$RLYMk=lQHJ4}^9F_ur(r$$7E1_CdkCOHil(tPTroW7yOmz^SwcQ7-I(NJNOqe$}0|pKrN@xj0>-*=3idsM6a^x@51z(P@ZbVM+1vDeV#+x5T!oaq-Dv zck^WCzX-fDg-Dfo+^WvasJm`LW99CSrs4EKDt%%2!hjQ`x|N+NIC5PvhQp`gKJ_Ws z37z5c5RcssZ+6D9{-|`9@s!sqaWWfqPR32fM7Us4lxLrCxG)ozn^<|SB9TqBt;;)R zJ;|f-4jKp+#zfmXczvsVEAy^StIB;(q>h$m+3MsKUnwK3Ux`0*(UcLaOEn`o9>{Y} zMvWpU276Pj!5Ih3&_Q5h5Bq!Ra-+{~QA)*TeLR={%<^2OJh~-;t>ega0B56oIz0dG zu_<%TAA6@q&jZKK&zW-U-RC=4eWV#wlW%?{UP%}v036C9dA0w;UOxT_>br7Gmeyjz z6GMhPF`4cwse^WDRIEEni5rQFkJ1IMalLM?7<}Mu&R9b2Q z8I~T2LO^7c%ukjKB~6zl)dLl>i+2+l-6@()Gay@R)#A@R;Rrj5`ORb$^FYrY@5o|) z^X~IGyu@BQMU#8q&=|y(a#jm1&*e?I4(8c@)@(oL8Az7I{;SfmhGxfT@tw!E zX*0HSycUx^G)pFxnK%l|H`(sVW0944$`0Evc~aBmu87`J^&I=B@-PyE`pA70bz7eG zL+gimY#ZX-)D)4&Tgk_*^4JdqB73@bU zkg6&8|C~^jeiSa>K)Go5i*&blR{8-glXEapa&3Eb9=)q_(}(25*(fe&$VUOOauAOV zP`_opb+&uhxA0Gw3M*sX#!w#{AY(xwnV&q}EJt*C4p+7j26mj&#VkZW_GaH}Hy9&# z7~Iv%HZ7)EyJq^KuIk|_G>9334E3>hlh!Avc}h~CJoM!pYGXR!f7aAXg(B(uAT5xs z9EG6P*t*A#C-*a>M412lRqleSOPDU@XW=M;^|8N@$xYTqb*U#itHrkLuS9j!h?G^H z1jCExfrAq`hz#`$ZEH^N7Ksz18arCQo)&LEr>3Gu&|?Rn4DDGYBY_e-5;7wN1lRNUi zyB6LpuRq}}%Y&J!X1otAaR<#PvSg-lgjnDP&{oKZ-%?B-ILq7O`4OzO>w(WxtY}=L&stJ3e z*SFKAeG3*l1`gcO#(vGS`;m&F1H%z&NS>DV!?zCd?4e`0L~jnwPSv+Ay;Cu-x?=^Q z);bKUXjM=}{FBoi6pEw;Q)AS$?~L|2Gx|1Z(syS2_A~o7u~A4$hsKR_QbR&gbM(8x z-Vq~}6;*80Dm6L$e$akKzotl(gT%?neP`q}?vNVNFttOY#yKe=At^a{BifO#@jc^N zNZyt@QcwIXz=M=ehw*nB@RuM=n8V`K1U@s6hjTrc{0O1?InqNILxl`W5|}sO(*!hD zCaxZsnBd?=YsLZ$iZM1L%7hcX`Ueo$okG_TD-UGgQv`2>BDLh05tRv-<3T^^Zo-kP zOf!17NC}w>qNVtwt3W1FhI&jzDrASR9s*?MSPL4>naqr1ADR9N^e76kj8A%+eTHvo zGuS7}#9y)cHMw8B=@sEK@`)CM{hKu4_pI`c&uAAPn>TD&qDRBJ$zw(jjg8H_cX*OV zkY}U8d3~eW=QV8Df`{4WHXPis3LC3>fCX@)-q7}l&;)69vPrnLLg zVlpGWm)lC0XHCkCYB{a>3g)|Xe#QLAj*$_G{TmN|_g-Obll9WO8T@O%x8AG&z{IpE zzfGHba&rC5=BahugMxzGGw#pGwq3RUV!K?+ZVf!b+D7^@ z>Rejd`Rxv=jdG&!2mR#V#;jAfuHxG`p!>+@d%M*$G|X&}ZFwZSvu~0=H!42peFnT; zmDD?9a`S#|CW|BKgEQsWu>!A9zVQw840SOhipA+txn69A6OK4FC1;){M^m?vi!HRd z2~$1a$O!p;gj1&+A+aV*0I+2SwUw_TgYxQ%mWq2k2G5#D3{shC!<%$V7~HhHeN6j^ zUSXC870ve0EXBvI-GX)@O{4v7S7SOw^bF08?1>Km(A&u6qaDm*y*FWaTJJHt+B_1F z8pJ!YEZ))83){FB^^3%NQ*$y#r@WpL)g`u7qn@^3w92_wLs-jDRrLr-3|0Ku+~}_H ztrB|2SEkAg@@@I~BERLNwB92M<|hwK)T*7NVETcM#vm;UVW=VWo;6m5T5EmzNcz&h z9>X7I{dd>?Hkx#V1>*1UF8S_|?J3(QHrrdHm3-$U#c}^jd%$=26P*26;E_q%=(lV( zaCqua%?jPQQpaqb=TfvG$T$e??jirbBb@8dPdav)b8LMj zgMJyu`lOOzW@Yx~mWqo(1`IG93Pwcv(M9rFr~@f#GD7Uip(iomu>64#QZS`XRIzBzjIn~J)s#purQ zHG#Hw?{y}1-Z?pgeWOyt2l>SWdpUy|%Dg(nIP(r~+9=vDFRWRcPRULQ+f9}EHL;yz zL1V_qS+ZkwBzw7_Wua2gheK5??njDsppi=X~^ z5Eim7`ho8>I78R%?VL5CKgZe;vm=u0QN1}Jid>Dt+J_a|oyJ(}K0}D@xNWefpP$j_ z=jUk~jQ7@1uX*m+X3h#}Ha53;JzE90IGfIKzx5<0%Hi(yjY1gfyR!n)EjyUC-b9~^ zp~{pJ)tdXHr}5ZOwdUls9E6ztv>%VfQbC@mHu@_X&LIDWGr8Gqwc;aNr?rNy^f#P_ zUS_K(%FhmKCBp03C2aU^3@R>x5CW!#D_3c`InDrMYB zus_wD^;D1qYe|e6I1*_$zeweDoIia-{j36wfJoXcU3G4~!Mb2>Px@|-d=D-gG>k?K zqy>R_3w`WC!^ksSn9*QlYQSO8GDXY7yQ(SLV4GK=VF=nCXPbu?78M3V6Q183ZM)8T z48NE4uw5TxyJkQRY%@C}2SH7)A7C;?_V$CW2x|Tj%dj2&$o9zxC^G)+ve9Z7L>RT) zxjbUMt!hZskUac#VJjD6Yt_&^VXJ~7q0B-vYKo@M$eeZv=Nk!Qgt?Y=y!JDzwyZj| zMBH(1AI8@|c>Mioe`&IHDxJJbIq^q-FxE>Yk>^*X6$n-7htJ;7KB}MUhT4~BHf4oW zqS)A5lPY+V(M^SLU4n1x-u|HM0|dwxx{dW*3;BQH;VZr{Oe(SZ^u!W1G9rN`@j6&{ zw&raxVBu43d#E&+yNsWwv5dj0C!O$V0 zSJo-nqmeJHFCb&tL^x#el_I_PddQseC zMsB@iM30O<%|g2`d+&55{(!wQJ9p-Yfygf+!XDl}D=8r{C??qYW3bN6+A27;Ym?v@ zpQahjQXAK|dz!;|tYp?cD>)${C^oo$a%QunhQUobcOTwi@})~fU%ouQ1L{(fBb`yc zJ9v2+bX&HEd@l@|Yz^r$;u~31IqF^in*kdBy8R%y{hW$b{l!YU91-*xgxT43F=?&V z2S>9r%&&Tnu38lh)OGpzHgcoIMzZg3Gk$qji`?Rq8-kpiF017qMN>(O?DkN9=OEJm zp>C0yWaMNc?|4D~HV!O%Bu`vJ(`4<`KG84d1=Ik;AA@0A*4!O;^lftdmzHg3m@56` zi;wxL%MG8E;;BlL_70fJWQg>Vn`5#wL069GwO#VNEot3V2=iWNFrMvihc2^j=ZKac zxW-~)=P-&XFn!`pFc?FP)x(RUVcaMpG{{tSdDz*x!(ZRLKz?ttVDsz4?e0E3Jo`Sl za`ob|tt)Ep;^u@jG6}C9eO#m4-E+?l^XxNy`RXN;I`MtAw{%gb_*F~VR_@>aV_D@# za{pC%Kb4Ea|Dw>?@sN80uzy1@uwxpFwJ))nT}9nIDm&k3$5(64A&<#PQe$WYbOKu* zdWuwUIhoR56>na>ZsX*f>{#<-g76s#49_-P6|ziP-=~-nbcBlgte<4j61t3O#``oI z(s3_O+Y*_Bvd*e#%}XG60H? z4_)wW0*mJ?vH@e}RLp7we6Xs+M_Tf;_k#y*+3a98_BY%xY|gTIK-aHS9%hGb(;@t) z4L6rC8%AZG&05+HV>j!d%|jowHG`%dJZ#J6Ev0;R*joM{;@$&3j_O<=o-<`vU0SVH zE3N8kwY%zVEy-_im{E2TMQV3+t`4Oalv##3)m=y8YzW=2}CO}XFi{=QGrYG$XLIdjTep0^w=PHQ1sBwftD zA$G$TVrq=(kvL?%;ZT&75HLtmP`VL%lf!60(OgB&kvog~yxzWIEn)rlHk8cqvEvc- zT;x_M?Js}XPOo#eT0#OEiNq4^?m}q8%KZB{G3# zaoa2iO+zp_Cawh;`XVFa7)TLZN`q<$IZ4jYEwDOrRHV^59v%uw_H*M_OZdYOUXH%0 zl0Ag$Ey57`fM1XHwDRa~wCXs{hKHmxq40-R3%un&3}O8P`ldev#p3~xky)nf0@oxV zcq*(A5m*p#U?3p=2U8vmhsxwi(~lukG!&5LuOj_x|a_1MhEb%dGfD! z6j|S?{FXMMedo&;#}yu9aew$$HzXuhI{iy$|9&7kqUK(f`MWQa>_)#)bMV$n!>Dqj zw!HDout*B!H+5RHtee7~m@x0Q7q@JA@wR#BBcXZ2@xj648=7T-WC;rVlU25J^EXcn z4xaetX6-h%bKv&PZEc%xAJ7tzZ$ZZ6q)E$VDWcm1iY+B*SgMi%g_6iX(gXl-=*%`W zn}jKyFFV_mdYi8p2p4&{SY*&+`~cc1KC^u+qW@+Aw)dr#i|(9oPi z&;9g2!+l-XKKlIY>({^j{G-=)-J|_^U-#jGfy3SVv_GRQ(aCB=n)$is-ue?ux=$36 z3Y)7M>yvYU6E+tnX~KQl-~aU1bDy&`Y5Vs7@$5@qI5A_!i7&i#_K*A7!MFtj6{V#W z0}Gg|sR&V#1Z$SlOPW!3oZ|7vS^1ucw5zvs{YG*dJ9{42 ze!3@)w4zHQ8_l@GbL#f1<-hFFe)_nP2c&)vD>wGHUrjRwKYV<~^XMj6-}&TpLpmcA z+MNhPxIS%_ThCFJ17l)JX_4c;IVBsuw_Z!Q^UkT6E4jkIXa6-dH^a*@TjxGBkDb*j z&8dswAs8}H3bLRSA!eh&7;p9Nx=g_20ni0>E;76zjRd1(@E!4hmQ_g}OcpnAOt4U^ zuKWs2U3$8w=k!uy$}?|nm~pTRR(6#MT?c10+&q((rj>k!owMdwfqjFFX=>H{S)GNF z5B?1Fy#YUJb>)Q1?Ivd{w_E;wW%amFPz{=j?>2XJ0rl=A{ncZiFgu(!H)$nAS5@+j zfaFHy5qTV^L4~)RYTt{bJ)IPjoJV`eaB?2kPEk&}R@bGtY^dj2nz{!V1wvbgq@mE{ z-OS6LB*2dn&(lQK`;=;pdg@ovb1tfnk#$9nCZ%gEpjl@KRfOf3u8s_a!cVfnkcP~5 zs2#K;YXpaZMuGx(07#PZ3?dF&j*~D#HL@Zkp3;WpVKxG3Njx2rFkrC1G9;eHJVVUc zuy~5sP&N9Wza@$?iXo2~bzHw)8PSHV{QmJ_eycK~;@yTorOqIa6sOs|7SPm&!XK&z z*~J1eCh?ZegopSY7OQRxr~Ds`s%ym=ldwx)ouu7F$;mMgwc~SwBJRwXQh{P&z^{1Z zpW**ubK7yu5*$6R0`(acgW-IvmUK#6sRdbZV$_7h(K5&&B2en1Q8pSGMMyEOf?0#E z5KQQt`X4NY^5;h1s)*%oH=S z+Opx;0DYso=*&Z%=ZYjpg7qBBLK@nXWrqna>|Dk*goqggMx& zaBK;KLM`oCF`MypH>AvivZ1Rc{yQ`p68)~~bR_q*+tamEac))-8J-vs)zqBCNQe%~ z!|ByBBUlMF$H*hF3Utr(6C}SDF);jc$dZ(vjytMd+0`hhzl&9fBNLyGsE;TqiQ-6l zbv7P@veL#Y|!_Xq3(sZk(xR)t3p>JF;NDcnUR z@p7nTNT-`BgXkjN3ON)_P7)r?4N#16>x-C?X?$*gVi@ffZ^4|f5Y|A1XX3lsmMoVm zTRuaqDAJ6Dy1pA;twtWyew31ebNndto6qDp@=lbrZiC+5zgTT2!lwcDht+7N~_k?n88q&Xb9q`fBQbIBH)% z9(`o$It%6teWMTN%q9DDjD9)izutPmdIa;8JRMp&)zOU}QJxLl2m(7f2b3>%bhwBp zGRu+B(bcuJtB;041A7-&RxaK<@J#!fE{~^cP5bcX>#p1UOz*sTy`hHY<_7JaSfXh? z5_D@ulL`^?JvFc>m56O{nkq;;I30oE?su!)Lkfoxjy?@=0Y*wSik-oDCqdy zxyKvWUm*Odlay5uK}J>XKWO+n+8{?+F%wkjvG6LQ{16ZRiN)q_0|zEsnt}touXGv@ zHinss0&$oIK7BCh*oYu0#B)Jwyde8XSamuqN?ItqQaU9OE*T<(5?6}g&X(cHD={CU z5X%+PY3Xz*EQK+N2(J~m)Sb(%ECTZ|Pl}bG3P1M18^O*QRtNLsE5zNc>MpIlmnn(% z9A90qq<-FXFF0VY*1k){)DEl8;#_;Om1)eHY|kwgZ=Xm5fcO_mt(UuK-Ih(Od&~Q; zyW{rVK4hN5WM=9)HEGrr+cz!E&R)7{`xUd4YcaRccoOIfUXn&{9`a(+q=yv|c`-%g z#k2?ta$&+{9Jw$_VYC6%(FGJJg&=JzuEym&cOYrRetgqMl#YaRToUiay#lBC5VQuj z3WxQrr1T`ql%p%?VbWV@dX;28co)UJKK|_MadBc|60piN6Io63`-+m@l19SAFtkpn ziJrJ0{2dB&RR~d%)BpB57;1=>QNE8;+BLrT`Wq2-RKBimVKr z0T`(d+eV*XGPSJ?E0jXe6CH*KtFmw)!YmMzRH~Gxb*NT+Ew|ra+SgE!pBrgXDteaG zMpWhbJcriRRKZ?ylt)@yOO}_lY%w9?qEo~T2?q)ycpW!<6_aK!o1X5qNNf_Nu6vN>5 z10P<}96vIrko25y^UV(|EN-qWOk$6FwR__5!>&fMhuTHGO%?fZk$G|X6-~X1*rRdr z@o|wN{{PQjb~Rn7-Q$(a3&p4P3$-T}K5+A9ADf$0SlO%wO>%Vtq=)HP=k}k3_;`>T#>4E1$WlsV1&e6X z@HF9Cj~U27LM{elW**D1S}2vHo4(W3CF6&WTy5}|52yku1xRfz^7~pDyzm+VIEYTf zIVbYhk~%$k);LL-ZFMpLWDI`}_; ze2vv|OI(7PQgV2}@@-L!Q%dHQXx|dW^o*21b7PvtrAToi^6VCM7iDE@FPAJRiIYVp zS`_TDc9AI={tQtPJ;6flhh;-$I4Q=-*kRYDHWRXdU>lTN4 z79>8p?(a8mdUf!b#p@E)#05RhO$&xRRai!R3 z+&l5AUY2%?ajUr3xFqs@;}YeU5flQGsxUD+s-i>?M4E+MUm~pMB5bUJQTjB|06%#) zN?o>Kgq6i;JZ}TVG=t zpD()OuTQRt22Ohqy>uN3Cx6=g%8`ClSP<58K3*rR!|L9|!7P|_x>el*fg*+eRf(A3 zZ5GDCyA+uwrEXQAyw#NZRG-v_VGfz}AiE)35AvIhw%zl{WA_|b(@4G<$T2dr#AcNe zU1V=?B}!IX$;{~&xH+P6&4GI!d*mKz-_qN^_QIL=_A@Vh?e?WUc&|BfQWS~q*3A}@ zl9B^&LzgddHe^J!ScQ~=+U}*>4lm#~33o$JZ%>2U*wCHog2UUEcGni9L`E0hbY)LP zMn*-?l{YPf*}`7vcR0&aO`}F?xzphp@FF z=0fO{o=aQLbj$g?LEyZxZY+kWj!3WgyN-?hC6fu5kbiDtN8gaC`3yzQ#`0yWpj!pF zb>MaPn(L4BnLB^bUul3LMvE3GjuhA`i z%E&me&)w*ASPrvH$(rb5f39uJs&Xc1j)e3itGiIkd-mnXYn8W()7inwnf=L0Y&1;HUfGALj(Yh$AmnTi>x&qJT zESkfywT`vjS|+XK6Kb@XJ3cKdzZk}fjN<&Pw0Ic7#~&suyJ;Gytuh+@4QDMvtg)QF zJ7%lv@-nM}yOJ+AEJMtV}Z)shtyLG6uz0^@y+uB^4?C{Yce@S1i z=E*JK*W<*Dn&f;(X|TfCw(b6>U;E(?*p~@b9tuUCWFz8x`MHkj!1NixB2*$UuOX*< z*XLh(=eNJzG-vbDp+Iha!@R`>sDi((w$$f!B-PJcxOic2L$ZSx9(mAN5iE7&CD+bq zsVn4%3Ub*mbNfpCt#x#La?Om^+CoQZTi0OA>NkG$>Qnb_ZG{p`2=-toa)u~}IS*tvP{; zia?H);vR5~YQbd^=q?}y3y1W${~2^PRZa7x7j@OU-Su5X@N*}_135I12?ErS5Erwa z$wDSD(v`wVUQ?oOJSQ=UtRP;Lubc2(TSLI@)zd@k!vv#;!!fB89IFo#BI%}hDnWCd zv|YjhNN0(lp78MDbdM}tzy?Q&rn>&FJ| zz9z4;sj#pqGpnu9n^9Pj5m(tWIJ-F^E;%tXE6-b%=kIQ*&&tfo$}DaT&X0JL;&aOL zQv3IfeC_$6lKS$JoOp-ZU!1F?6;-sB7dAPyXRCdcK8M>^jHPSNag)6zShsvu`FRfI zS_Nlum2>>MM0M!+i$DJPy2g2(EnX@;tG=b%UrPo)DMrDs-iL8{4un zn+s5~ce*b_R^xL@%j-)PfBkExclV{{m*r$AdBy%hhp*D>bh7^Hj`EhuqBQ*&v=97n z$~lG7Re*m2g8}A(obO}>@nXmzf)yD~32~%wMt!s(w2^vi$_Q)208}H7JrjCHL%0p4 zUcDeZ7J4QWsUS*$FC-J=KPU;Cq(D}T3r(SW+!#43y9GCVooG!Yh--D+P8CO~gb8d- zY7+?pn_)DLf}s0D!UkcK=n5$=x?m*wfnH1kq^Y;C`BwL_qC`LtK<32E@9lyJ~x->OUoLZ)P7#h=#RKyj0`e(xRac_>-#=_Q%@ z^)pKnG7>~5E2!`Gvv+NUakn@VTe?jfOVtvOY*oI;I67q365Gf+pQ|u8PLZr>@7Oc0 z)p}_TvO?T$$#SOqT-d2P@0;n0+?^o9(am`utGGWi*RH*6cU^#ViEG!f8FrVoCfM6G zEh#g{zJ)Ah!UYY|vI<$CN9e;^2YSwJj9D%~S=MncdV>Uy>E(SXIvzt+^_1HbtPWQ^zr+6LNBM za}pTramJoXCN_l|L&nirit2L(f%0Lzhl52ujYXoIoLl21C`)wDpC^q1rw&qS`e=#Z zx^!?au!wYXOYYWsR#gdwjiS(T%td(R&BsntDopxob>f3`)<)LT*Ho`tea8ReMVV|)MzJ51=b|eBQ(9reUVrG zeb?PxGiUa08d?x+W%ISxGkz;|T<{zOAG79;9V$Wlp;7&Hp4!{NcuV0ery&5{>_$&lowef@~e zaX7N>M})yNL^CcIwhK4m{Rzy1KnNEa9y&@JPOOQ?%%BW1@W6nl1+BBgNib%l=~ZeN zeeFcTaRrwd0>qkPE?~(1Msr-3hMW!c*5Bq0_7v=!)3ehPY4K3lrsot*yOyhtE%35l zgo{W=^Rztn`r0^mdZgE7|4{TIiUe0gk+B@2bCfuNwxEwIPcGuYkI(oI-(RSpvt9J{Io56wfHj@dHoA2J~fbL+)E)X0R6Qb^BU zQGY=X>E(nc`iZQ!)c=9TPr7QlN^)EnTo4Ww!7?g9>mX-5Spe6?$1)lTilcO%1>qqD zo{IA#oK6UFA?J908hiNRNQp#aH9npeK;l_3WL!fThRHf2%?>{keulk{%org(ONKTK zS33Nn93bG*Y`Q|L7iXKefWgBpq`QgmyQ#rANM`6q?wuOXt*LD?n^p%DDN1B@X4E-| zoIa|pR&{92T@V?Kj25^##3oK-*{-3Jqg%F&o*Z()=kOPn1#i72Ezt3|p1p142iCT? zN53`vG-K6Q)zh_fPyJQZjD>q4O_OxNYvzE4rc2YGrecJ2VT}TtM;1O+-5?Ng!Vo9? zPwJ-}(#buwAo_;OaJmnsKvFz@A*9hB!>+7SdM_v{fY1b*jKq5YSfJ0s=vK0}P!GcJ z71h%UM^NCH!fXnK)C0*Sh}ZAKFUR>VkB%Ws7=gkNd@`Mx7-d*aW{X_2V8Of-C!QO9 z^T|_>+;nh7bx-DHpt6I1Kl>#eDzlYjuH1Jst2+JW=yNAdK+hP{?nGRnIQ*H>H~FD? z3z{0&tvk|l??BNVe|vIuGm6R4IX;P9s$s)bW*2Nvu&Q-JTA;$KXY1!GXbe30M zSLv3+9ilBW+ks#Umn%2zmz@VY^9R_jze|_Ut4oh)7m5Q}6}APobYCR9c$%})Hs9l8 z&dN;oz72(?vznG^3Tn>WCHS*_!$L`gp7&o+3x+^;y z^*+#<_jk4nW1C51R({VRQEYF}o`ac_ zw`vqCjCftXTt`Yvuqn~yPt3?h7FVy!S*)bzWmw!aFpfcJDA1iN-v00t)%ye>Qn3rmd%p12Td{iucAF!d!O5!OH2B5UuD}7 zUk^4P%y3)pvy(pc!xf5TYB+(Fp2)*cftuGiBWx=c-MeHSM1nroHO?YMPO~NZa%`EY z@v;`)Lt4$;2j)0)ye=g{oDtvMvP1hDaPz+^-au0=##&)seg?Bf9(1AF`FZ82_Isqk zT@aG-;VMv(_6XnA z+h}`6^gaeRSyV5%-YDzR6%WkST;R0^KBQ9KAjp}jbu~~R@{({PZlH9M*K)^dH+fcj z>JcV}G+HntVM1Q~;mj5buULijoWfj(cuo}^xrI6Dsx&H%o_|E?j;s`eBymUosmhPa z#;2Dl;CQTlVD+L_tF?8}>H(Oh1eLw36@noTXw?L7UG4+yOBEn08Gd8y5Px=Dcnsg8 ztqquJ(O)Nx4+`w?r!{hXv^X)@r{Fl31Jv6m_VGoupV|L49S+ zjugbm=KvW%Ry|Nog%)n5W`_5p6G;q+nzivvHk?n#33WB&W0Av;DBhYqojo@W*Poxc z>9ZcWNgJD}VSNde!NDp;%dRSRxSM8|`N0syK@T&aFqqoFUvy74H%=ukGqqlN#>Dfm>pT1-k( z^!!CpZ{fdi{v_EZqv9rnOCs4wg3!4&*~_VpT{uD#M5EiOxIv?^8!KVPR`p`P;B#2i zR283vzq;mCBhO;}DzY+~?#$-aG%Fh0$nC@z@G+cSRs4{vk?G59Zo`wtP1CAL(2;&G zy~$fHL}H18 zUnE9}fQj7Zl5SptnvD;FOo_{eq22;J6FC>vVMDl5KtMy1LSX{6l)?MJK~xjkL6~aL z%+n1&u)01fbL!<_E4iVX-}Ib*$S-T*s|vojm^@ zhg``Ifon}@UjjbR$m#>@p_O7f6EQrm{$6>2s1>PPJcoloPGH1Q#vgo;1VmlJ!`w$r zrhH@t5glD zV($MWfCr*}mtL>mdtRVBesWFp-TFQlG1V0=qtqlANo0-4C8x_I3`EoEQWjG90^~_> zx+F1xSU)jrfgVc1A?I+r$hBcAgVx;A=ig+M7;$0FR&7q+o8yA4&e(8laPZiM8LAmL z#wBzkR!pTcbOl9}(FJHz^0WiWY;b>Sc{BDA$coM02#HwtMEBD(@KMm!tH1w!`BBp$ zUFH2pihzvH#7KB>-8%6>dZEDNV-+nM>@_L1&O|$) z4ogN-*0hwAx-6S3E}|qfE!@~lxl}CLwQ=^u%u1US^aSgQEZQORe37q0^<~RH6bwMd zg76EQP?>mZ(-kvIC<97v-Ygu_MzhMBJzeSWsF{{8UC>^}n`++{C{L_0nm(?tK^OG( zEho1|FPpt?;!b=ExxN%lg;mPoL(l!Vi6p4htH{O7`@!78M8PMKLR)g;CAx+yBLZA{ z(Hpn}A38<%>#!4%FY|+&G4F)^Y(Fwy9Y9wh(F4Qtt(33=b*M)jxHqFLsHa1$6>EEm zDc}*h9)7eX%((SXSK7TyYMU`-4p7FG)ANw5Gk&qCXo4! zVI6fnI2@1tMKFN|vy4pp_nz$QCENW$-SGvNG0xxD#9HP91V!p?EuaTg|lRJ|H?VC|Q zt);()j&bGga!Y_x6XCkRjQ%=;togk-rd^cm0|(fHF~YhSd&Rn#3t|^1jrEr!DY3S% zWm^3V9|@#Jtyk0=3ah?=sHtY^3+~Yq_;rNo*Up|1z`b;g7VeIL)-O3SmGj2D_QI#Q zhUgfL2aC$HvFMqj$p8Klyzvt05Ay_qQ7OlkeB`!;?=V|~hs5SvxIWs!2j=pLJZ>t- zu)Y8)Nv0T&yJkf-P=0mJ!8-C8j}=(Mmw5P)n+Hu0IJE4Ml2X`%TA*b6EcRvHvqa=_ zN($tqpwMl;i>XDymckS3TH$2I0$3B33sP=AS81&?f}=@>a#%qPAXwoo-PY-4dVoMc zJG@eSBd>SZQCg7VN{GxUI;{19<9PX`)su~LB80iB5*GncBJw1w`Sp54Kwu@iLHuD} z?s-Rkfj=H494=xN>WIuIG4&l@ipxpr#PBdgHDYH(3`nPl&hw?`+OC4{yq@W~(|pgV z*)-K>R$Jz$Nb;qpFEM+|bYJk~<*h|6I9*Y>aQHC^zQ`NGEP%EV!E~{*Mow5s;v7de z%L0}6G0DBSl@SyU#8rqU%Ve%dNZhq{PwAc7f!7app zs9O4u&ew^noWsXz9HkABSg0vetjCZAxZDB8G(o312g1L}KN7idQUwQ-Rdkg_l~-6% zt{~%!4@OI?y8R@^{)&~Q;zKwDMrF5z!B2d=UqM|lexdUNx72YN)5TYjgR7r@NL^mH zaZUKekkmbY@$f@$UAKAU*nwF*ju_U5jn^NwhU=EA4?Vs5$b~iGZ-k_t`EPE&?yZN0 zJFdR97o$xZp1yI#+(rnYB-ZNuAsyIq7M^YR&=6}R9Rpz{__f;*ys7QqKe1ms!1f=I zy==>{cIU(aX=FHzL3@CX$_Mtd1KNJJHH0%`V3flM{1GVlN6*KBcxV-mqKL!{JSkTw z6pA4aRghKB*@%ZZ5df-d6hvzR^&Xmu7jNs`)(Bsz^VEUUrzh}8xFzhD4(OwlI*N!2 z&rlP!M_8JqVnsvZ;-@1oh_g;h4;>iCYY6;ON|}p$jSZ$?RI89pW+Cs9i}=>mOoI;? z_@EaqjLhsIf@#1*4gXFN1}9>*gc|5^z2-KC!N@t3u7ah59+>GWOm@MSrpA)j1}`E1 z4L#J?++NBJR2WD8FxsVpX#RWS6BnhicyISbASyHlui&+gS;qv0#|ArfUsVdB7D-m& z>Af1gy2up6uwxs7eaIuFwL95XN!2~95rDvrWa-+ULSYrwS2DbPIRDtj7Bf7#W#iEW zW}_He#jbrw0ob@0_fT;m?N5>yYZ)Npf<5&45Zg+Iw{&edx)3TfqMD6jZn-YYJ+Lvy z(4PTN5sEjfOJbSuXGnsqU4bdt#wr;6@kj#VeHwuD?FIU#hZXUKVt{EOI)#wW7`a9k z?q#`5dH;$l-bY4}-`#t!h8zgviHej?v1%mg@n|EI@aG$0I?i)70uQSC0 zb4zm_govXd`YfEBcYK~^?=)lnH4V=+HPZC-zTC>R_%zP{N^42hLUqLM*EAF%|7?z?_|;smIwtR&9A z{=Ok&)e~*4nXi#^7^pkM`vn6*Fm+vluy{A<74rFj*6T|yM^csFL{fvG#wvwfE5Fh5 zIW~dzpb|ioETcj`Mn*Z$tdWnfp?Cx=h>d<55KjmQv~Tmri(HOC#JW9Rg8z!*r2r#l z!I~oEVIrlv3*OGFE=t$b^rGrKRYu{u-=u0TYb@mZv~I22?Lo-qzxO^oxIz0C>u9-Z z?V5&-k!KQ$Ynt-4Q5MW^swqwoj|NHJ39E#9jmklNz2oqbxwmxx>Q~JNy0R{y;{5%& z>_aQWHv^}Qk>ijBeM;Phz6r3)4ibwggb#lkZXIh-$cvDqI()TE!d0XTCPx0qtxL2& zqfT4!63bp>xl{Yu#CH~H|MpWk@uw3{o5-9LG|)Xg*^>!+6(BvGx!<@lORVygNCLI_A$cG_1f^iD>3{WG=ibOFJvv_p#hLM3;hj; zI9?YP#2kejAY9}zK?*9DQYCD;Yzj`L!xg5Z-jurpc|4K$3FS3slVK4I{GX`pdq)}tzUP^Mvyyu4j76|826`)C!5)pl2X7&h>{H2#b^@9A2xLrHS zBRr5~swo^9=(mx#@RIOV(gi5$l*A_p&JdPBS9Hx@nIs9csL@*?R;@2_WVWHPrND3= zZ7M)|MmY#IMZ@6bX?IEt&2ecz4zU_zkt2=!G)I?&I^aj9H{=Ko*o&J+CQsZGC!9Bu z^Wc?fvhkLn>tN}&yLpbEzes6%79R`HRLF67x&^=BG%<7WGFc8RYIMp2N_{}RCJ?#? zS*aYd{yw7=-L8%Xg-0p`vPrOzW`k4zr@$4o(cY*}YjRkF;Q>~2n$?&6hN;45ybY2j zt|j+j_@;xqQN|5oe)U#P2}n6RKCxbVS^LXv=cP%%+nmDM<*tglz#>=0_ygb6Tn{~V zTxl@J|K+yD1$Jje(QJf7I}#Hd?EZl_uOW>=;a#GsWarqnj-itImq!K-(xd+mCnLUx834iErOpYs@?QkTzQt}~Ql{3M7V6F3BToaP1k2>ObykF|q7 zU4gy=&mor_azo;+8M6zROseH5$UgN*w&;?w-Tf(CBZU`js+khhkp@U=q%!D_G z&Df=Af`&%R2lxL+;i5ppT3<$O?(|aM+6LOK%i+6$MTP%y|NTt3U;TioAE?+Pd`$bI zR1=IW_&^Mb!3mZ9IyF5a{2(A;QbMh~L!3leNp zNJZX7+6LKUcnkDoA2Jj+G!7^ocrbT=N3=IWDl9NEEZMW9J~u(3bm@Q+ z5_0R8>|KmL&=b@`X-+6;4UE4XXe~$pBA^NWnX7i}>+C$(23Sm$gtmj7o%?pIn(0Rm zVwO$_kvH)&PgO215AL~cYap=gy4}I@#g!li_~A3%0?mc+J!G}w&@NBB1bRnX%8Ezj znvOHX8ZbOCOh7eooam7XWdigF14lKeI#$%dD8Vb*DH4p^2+7hxVPMV_yyc|(gXouo zs```L-a8%QY0UQM8OcJY-@C2k`d5z4)mQt|ljqMp_R94nZD>EK_~LK0zn#=C)o(k= zQhxKriW~eVN8jJ8U#;J{_x;h6epE%Uu(ObVDp6|zf|GSJOCM6=N6v~s6Sq*7K5a`# ztmNNt89R#!P#Kd|N;#`-*{^NpmnqkSoNY&; zgUp(*)Dq=Gm^Khe@{QN`Y&FOM;KyWgl1mWXR=^qq4zT%D#+`5_m^2*#nQM@!!<~Xc z-1U%nklZvz!d7BYKen?|Omn(2Q%G#)S5I(Qjqj#px}0fZr+2uiKdp7as%g^irmb4g zV(V`j9#3gso3Th4UzD-7eaBUix2_^$kz~(=|IzuU5#5$)Ph#r*;#)`yZpz~ywPiww zQrA7Nqdc-Rrm{KWZRH*Fy6cn3n3B9w3x61FbEuh5(EZ8 zJwRbKIyC~0I~l%eLvjYE2e&JTh51xV6>d*)CENU&Ewf170|}Yi*Z1`eWHeSyb&g#r zr6f{g$)7StGxCg8$qi(AN$XQZb;H;D`sR{7*;F(msykRfEs7b+=Qn6K#p8CPC8GTr zCf#8Sdt8R)k`)R-3~U79*xZ(n55?7DeG|0$Fqlqj*SG*^?2{sKk(TP>{2CB=gvif5 z>1+p=?f{%{#H>mf6xQG^Y~%==BBjFB06DSA5!P34BSy~s=JdpnRyu)5BZ$Vxj-e-r zl#pwhmaxDJ;U01z1#w&2ePhjv{yIxehLu@rXRoMfS?O6CYzy_&XE`bZEnaU+pwf|5 z-xF#JHZ7gmkYz6_F3on86c^dE8fGqSnl`ll%Ej4f)lI>|56*K54ZJoZKBFRwOlO+< z#3MIst>~_DNy!PalwH+T(RfYUBTq0j$)25@=&&Uu*c^$;+4iJ;lFjK#N=QqxT9eWe zl3Y%kq-jg;Rj-=gkP@HkugyD4ilU%hN!bK4;@{;uk&&Z~ki=4+{}yjX`M0LD_Dov* zWlGU+pp*eqp{ z_?$V%|7%!J`ZYZKM^*i!^aMmt%uEalXk}nNs&_;k8N&zxY(#D-puSx8CQ%CR%J_vP z3AMBG%V8wqPo*sHWFw}Ma6-cU2=ayWff59o-#L5*qa^~8vohSxeNtkuIVlRyBQRb1 zr1Pe7Wk@0vYQh~aB9p0=Ob{-{4~#EO5lyts*<);Xr{)x8*gZL^sW~2dMo~_xo>CR& zc{MDU*r2%;C;cSN5+^1DpG|*4JqcCxQ$#hod_0d31#o^m0xi`9>k09FnFpViGjIo| zXmpbd;1eE?H`2q>%+> z4rv6fsxEFuxGITtxsI9%{*ET4yW7tRwA-AkVE5nl^i0iN$H7iDJp!zjuedHLGvxz#?olH?orKdBj_*)CHfREi@?5^OI{eV)L0lf{&E}(3Vyc%~})bpx-Cn-l9 zLsRumhoMw3mZ9O4!Kf*%3on3w=~?Lbg0IATsT?D$pDIIIcnY<)6{8$Ooal)I6hUAh zC_0&=cZ9lzMU4?UARux3YYFYXPkR&4N7$f8r_qplqB((ReD} z0m>59a5DdMY_{jvyw1>>WWmn)wh#AFVrEX2knO~3c!t77LZ+NIZW%t6vkn{^*-Qqz z#q*`^Q250)8+CKu!lT!3TzBPkQaXj+Td(dQ)8FZ zhH5ejy8ozkHPs|umfsae!|z6dQlWKqBpAjwsSq84AMRC?3|qeLaZhyJAW9-^^CmHO zGh|-S<0(nBqqOiaSg0h6@w5r(UXv~=!noSfO&v}N6aeIalc;2JCz*}}FN;vS0yz#Q zRWr7-NI|Z~DkqHumFjEsxxUsG{I~3+D`8|!R*XZmyy;La9LK^_eDsn*lQ2@SH*~Eo zZ>bYg)gfSZ){MR3%q+QPERt2q9vA}UpSkK`{xQ;i!S zjDhkSt?5Jb;w*H55hDnYkK>6(_4Tx9ZL*zbWFvzBMSqzpAQ{7WoQ*WP=4%hb?!0yV z&@$oxdg7&JL+iI zFk$Bp2G^atLofFn?xyH)rXF~Ec;Rc;PdYxows83E0~m3F@CKiG7b6wtZxv6S46m0S zI2l=K*#!k@_Z< zIkzYm+3?7b4wtVkfZ?vLvr>DPic$T+)C3>%TAn%oZe>THq_ny~yanDX5PHQz<4WmK znD(k&k=@1xt2xh-Rmo+IaGwTFJ@a5?BRRwfLk2^1N6lX5J*B%7o`Q!c(Q!@_R8A32 zhq!OUX|xxt5h8kt);9uGrnox1WPaKzoqQ)Li8#05(S(Y5o%L9TB`+lE98g^YqYuHIlz3ySR2nBz;bw4tXLKXPImX)ao@uOiX1)?76u-^|Bjxn zlLO%+vLdO+wLg9EWSO)|l~$EK`GNMQCd_#PL&72hUG27mZZ zR`~ei+PnY!;UMaS8D% zB6<%lNx>jeeFP_h;FzQKqUzjWZgr78NI%HES5h*4bhLRUO?YWkMK>Yks5bg&?zFNz zi`L4%W63LdO@zzh)jmH3NHpgBH4?^YwMHTE!Xj&OdII}T zSFMu4bHZu2_!g9OY+AXff*p)ZC4tMH%mEjf!4t;i*1F7magkM3S5MEWuB^yr{}o3f zmlPC(T>c{OWLSM{upc2+t;dF$;snO%xwfb0T2JJ=8NI7M)7tu(RlOPF3?4e+YQzaEm8%ufnuMk&?Kj$7amte=2xB*pm zZ6Bzt8ra_1v28(R<@{}({*J2b?5YlbNqa?BR%N^R^SZ^?c63~`G%#)Hwe7)cmISoK zyt*!*ud6mMueQtQ?W)VC@v@o;DK0Sl0$>}nfaTr5bHxaDyiGoW*m?hR8yn%BM0UNO zt)NcgB?YQdCMok{S~hO^+PB}u8@vSE3#WG(a;NpT5E*`m<88Df&l zT_9t%>-kkx^Eb}m+j$#XsOGtKoqk_eU2a}or(F5#UmqQQd~aV>@3KX`8F7gg=`f2+ zPs{A=?QJeD>AkXL_O`iI@n5tJ?l~ow`F~zr`)l!ByyRK9YJI(uVu^FRvl1-L8&)nZ zLsnQzenD1O#oVh}S~kqBsF=H=iUuRt|lgBLEYS-SqcJ9vA1M?RK zG8>v2o!;5A`--aP_w_DV+1$P=SXj2;GqcK9-+NWV#A5mOiO>9TYz%`A_82e->pviK zqi>P7Ot(#ebQr<79>X*ws}C~gmMz!nT0Q9x(fMP;ud^rmBR>!u`nAOt;o2=*v_Cwk zD|)J)KtjJ*ThuSsi}n55B8)2)9y|{q{~oQdEHomP2<~Rg4SGbDbn%S%VZMxQfT`9IcgYF`R$UKi@}Kb%+H*4dTImgsjs!uqT)>30)XmIDsb ztXZG-TuMP*@0xaRgFh=(QU0lYku9CJdEK%u-$Qx-n}5It+b$l=a^V#e;iy1Lb&!J=7DZK&(pJ!3_}K;x2@g8b%%ja5UQ zstxrEZdy^-aOH_*pc%#U&vza=@`zZxxvzGxrKqTFap0%3W_RwWYq|OPd-DU{OuM^0 z%hz6+EuNdZwWqLn?v0C%&XON{OdbqP@2^O=mvz@v&8l^|syo>CJ9h`>c^0o+SG(bx zz4HRQJLMHxhreg}wECs(9(UexSJt$ZH!oOva{csF`@ODw_28{q&9=6#-1>Qe#=$0c zTz>!jsP?LRB^rdPu1Ca>okDMde5(gI?i#Hnytgxhw1X_B5|(-rHMu<+Dk`l3RwW$`bS9?{aEjguk32=x#^p`T6Q&FdF~#z`RS$F{zXr-ZGSqfSR_f36?Ry@d)i=A{){#I zy0lkWW8=0ZjmsBlA8hh>*1*KsTD0?M$;`SuPxGA8otE>Po|{W;JaJlHLG3>GS?w2X zSDzf5cVztxxA#$xYvA}dHt%@-zNI$TzqK8n_$!Ok&dI5fL+p_>*iq6m(iQEByDVj$ zOQ-d3o9&ZRT}{Kmr8ni)Wt6m)BG+~ew zzPH?7l$8=F$tcW9PR?>$uF{^zf(!bm1HsQ_WpkR`?xs0qWe985-bw@V>YtwGDzc}0 zauCSIb^GKZc)+zEUgIQVlOPYwocKk6GE4JC$wV-UDk&+w zXMIOJ@Qeyy0@Iq?Ylg|=;W+|~SKVSU!JMMX0=^)2q%&;^0L z;|ni*d&SCcKmYm8xc1Y}zr14Q%g>$)#%upE@x=v7+q{W?u_G(K^ZXY&;$0o?J=)Lj zU-|9lPPNC;O_!y6JQx##kg5pUS(9XjhysFcf)oyc=7orQe*E1QH8S+EcT?;W$QQUW z^{Ad10X+&mfjsP~H>1%7kSb_xkoM?95;=taDLZ^vHBlN9^&oSDr0PEQdPqw&l0#RM zDhad$cn;D3Q6XpzqAuJ|gQwzz!Jni`Stw~K%T2SggUphaTh=0FomYbc`|dxnBRhM? ziTn2rSb>4DQIax*sCY(-&Gf+cDnO&u=HX!!F(cHBUZZhA3bPLJVErV#9ey~}P56f4 zz;x~da-&uCxJ_eEPzbA00b{CggTu>2UC;015EUuU$cZ#9(ro|&L2H- zXn9S|@*wOJjF8oVQ zkNgW)Gq7~nI;QSJ50WF1jRCGe)62ndQ2dP^eGY6Qe&SDJJZ`ZAoBh!GA*d5&l!LjF zyxy5p9+vJ5g|~#agrqyeTSL-a(p@3+SoGKMR$PK+#}CJ*T;$*5#p>?x=dp<7T3!rp zKaZX`)=PCv=3k1(tY5C>;4-;(RDA~(r3Z2 z;ye5_md7+sW0)`qKbA^9gCRAcQVu}b`eJXiv~OkPt_VEs&#L%SrL&O};*OA3rhI99 z3Huq{txnE=&~icpAW>7?HXIEJ`>>eOG)dPo+@RFp{JYdmvr8*_m#<#lTcH|TGk8cX zoxMrDOI70pzB7N}t)E#PT6X2Ny`!VpT@?yp*9Gq&zoN` zl@tsqZUMNVhATttXX8thFKJ~VaR&yD*t)TM?uPbUcqvr zFI`SMq*3TlNR)ArSiO^kF^H8&5v==R=0kD=-;WJ+ym$%H=u|dQ``QGNKTZ_&q+5J< zn8=Ko3OucB_Kg0mYq1jUy0u$x^SR1geh%clpfh;IYw*MnL7q1S{(G zPyobS9GZB6ldhndP`n2HTT)YkKR~%0aO3}A5j2yGQ|lWxGTkqkB9C(5V@C{vS$RTJ zK4&3pICwN34v(-gn32_y5h8~gT$LGLU=G36L?hu$jsvikc}K{iL{53IJP(IQ6k!ZU z;3};0ISTh?;AyE8=LFKpF$gkPk>e+i-f?2?^Hc_)BVIP94b$p(mc6G$Z)EHgz&X}x zRVfe*DEk=m!Y0nfmFbX# zLUS`@8}X`Rs`jjk@G=WG-I)A{wwDG$ZO>eF)1ylbzp|qX0G;$@X!o+KGx`9e5Nk8r zmFltNv71*p#8kAs3Ihza7LOTH(c&bx0-M3h^Cc|Np*Co#)Rlg+A*tjok3siK9w>t) zJ=w@9`1zo7NtDq);$&>iCzT9ZM&rObG0Z%K&<dk%LMMfz8_K)*~=P%+N|P8GC^A0U`7)UIgfQxNFf6>azMPZX@Pph7(qO4{u2b4 zi&N5sw>#0@OL%uf$RtM!0?Qm)CM#COXH@1tF91MLf1yU6QGbpr@K%?&bi|luwCh}6 zuL~b`VWBZz30Q~-8o$%qwX#V;p^*b5o`LUz(x}J=!=y_x*j&0?mZI5$zx^M9hHm2CN_QbU@)hPo@L9I9*WWx07Zy_}jxu z_uQ1>W=l-wp_t4>`%IgjxrL#}H0VUp^yqOX*wBmQTF9t3Y0McP6~dcJUebIAGlh^| z)q?ipVln=crohLOIB6@Q=tKcbg8l$jBZS8*k0Ife7o&A-Oa^g3k60GV*tlx(j-4MP zpI1V)xNbmFJ$YkbHyxcbsQ`>Z0JDHogdca6rHQu!X@jI_ct6E))Ce6{ z50S+Kzdg(YO36a%fT~R&X5Sk@3t@1DF&nKIZzKF5+{r1r9Muz;5M-kqHwLXD&nH`u zye=$3YEJ=oa#`4=u;6ugAJE(3FQUTXLZu}f=s?stlnarM za}gcQ&*XL~w4K}GwMkZolgdRq5>q8|gD*S)7u7|#f{+Phcpt|q^OS}EJPu<$-gCP| zb(b31&R*`=-Z2aM5FS0w`72&U=eBy=N#L*Ms>&vvWSkI#xq^a?6GcZBkJHM=)3hkP zp1T9DWMub1WFzrwva<>D1;jDLL2N|VC8Bj;GojS!RCjtE)E_g-T`$22%7K}f!myez zGD%{D@Eye6@DtVxSn^63*A(PckyT_N*+)}q-?o#C{ht#vPcLKaj;+%U^fNYmy8E`T zF?RRW(oLGCg(dNzhUG28+Cior46j~&aBIW#gDd3Tipqlx(>5Jkj+TLPGwEwWQye3O zG9t=?dhVAYYf*TNQW#6#bH55%Jt_`k=y3VNoP!3<*99FafM`7W0TQx+$wt1YDwq`R z)IVrrhG$wLR$4`qW*dnt@evK^|wl4rsE4FkOTjD$snGL^6uqdR^rC?`unbq#cmv{GPoN4ziNpL4=$03LDi9 zTR(r^!Tu?Yj*l{rmddFj?ijOti0I5RL;;fB2O&yW#-4Cm;Px>3NU+zVk_ryP)Kgz4 z6KAfHfYvqUOHRM#z5Ty^{n>${Zr>NRtKPfmKi__Fp=Vafz*oQX<1Nr|s2xKmN(_H7TW@b`N@`-IxM?cvp>bBcSf z9jt^t$dj|wX4PhOZ<$k~{+pJiXKRtFhIaPjXy>LmWzt&6Hvq31iT`Nz6Vn z@*4q}<+Kvf4A@G>CwgD!)1Z?ypHxh9uw`S9Hel0)HP89aHh(nqCKyCzJ z??fNX@nYv50aJA&e^N8&!fc+;iB>FFg-kLVz|pq}*C3V=n z@(q3X#>&r3wVT;~=9ajYxgWcwd!v3x{+Rl~N&ZBY!&&@UlTRk^Sp4wWf4Sb7N%Kl) z7?g9V-uRfS8<;B`fV%`Zo++k?hHZmv@+2)d2$WK2kPwB{e`u(HWvN7}Ik{HFvGosM z-ALM@Hhx@J0RwApUjg>VunRSBR~0w-xS*>W9K)3s^YN$#r4UpfMO_ z-Ae^-h-$penVRaf#iL9*87?fSE-eXkRBDB!@MFTO%ydeT-W`88t2jT;X3NVj&e96e z8u;PkgrZs6VZG4Tk_C!A8K84%Ov@#yTZ!cb+#Kk(b72xP369C{b#3hP@l13B$2PR6 z{{D@fQ^_|6BX66|$)-y(q#_zZfI?|h(^SGNBkf4~Vd0uxxAjrhI$FZM@3!mL6h2qK$V*+wKVC7hC=hUs0{-uVK1`di*jvo}kOtIu+)! zHgzeHk#d~mefvHO~)0FKv=cc#Cn;KGFtk7mfV-f>H;7gvpMt&$Fbvg`Yvz8s1$cQ>H2iR| zSaq%l|2|rLSBY9D*n(vl{zt0>V??=O>DCtzHkR+b{1U<9QMTylB28U{?YsBf!*(O( zA(qMI%j2@Rk6u={xWolOi2dC zfK(im-tD=yhcA3v*j-5L=30_0isQ2D=3)Wc+QvYNlJBqZW{aZboVk2&%MC5rb*Z1Y zc&{ve!rHxt#guCqN!;H)fO*c9W*z4Q+zEesaPtDhjp&wCE~|5sfDUZM2~e5|02N2W zqq0B%s5Iv{A?@3&E%Zp;4L9ysR!`i-Gz@A6^csS?@~YFFBvl*8s3K^5dx9IF10njp6&k_pxrde|#7! z_t-?gHfFt56UNUeaoy}|+8pg0n7Jba{^EMfceH~kJ*VKiNpXqlVx9=Z0rbzg3m3?4 zNAr(=B#;ZP(ULo=Ou8Eg6d70UWM|_>j0<2Rz z(+sEnHO<-?t=a4xV|(cuAc9yrb2&mI^+egTZgh+G$e(RBEnUUtvA}RonIs+(KmV0T zi}=b{BB6=#SldGEcf7Eu8n&kneBpNHNgsS&3PWTNKLTe=a&JWF5+WJMm%s!Z>tQoB zEl*~$IuqT23%bi^elbsC+)b`tst9Jjq6y&7dQulTI00J+mS~(jGBJ6TJW4YLb>@0j z9G6*O8KA+3Ut|&r_<`NiEU z)IlZN#yB{)q=LRfR>ISa*qLlzB&A5vC0tRZp$J(Dq(w0BMvDpwJXJ@=2>6Pc!=E^N zAvU2#G<)SA{*PxZK&_9Nt+dLQVEqcFL>y%s21Fxy>|~X7l9f^l*k$A;coGg`+LuG@ zLnUKavuo+YY!F8*$ssnta}Us|@u84rXCLBXt8xzF8OlPDhD?_a-`x@%!L0M*6Xm(U zdk01hE*I!MgNcZH`D&xW)Dk!o;N-f`F}&g-1;BAupxz=qTh(Lz^#wve%~jnCoM+lW zVK6Ze@eppZs;EyQ5RM|~5&>a4YJ|uHgc%^b08vYPR3kYhqOzylzN3;K5z(Op?)7fj z_1n;I%|B71sTo#-L4EZmusA!Qi|4 zi>fqc%#1D&lY>DTWjMxbPOH&W^0+()BoPPytw(K8U4-KCD!chRFfN(H)_{?&@ElHX z+=O6=>A?jkA&du+zNMNq*55z{u&z#E&;t!M>yLXNfbkz(Kh+#&B)mdkja_h)@_ukJPt}ylYj3%0&Y?e^S*y-G z_}q@hW$i_#eYL24S>xUxc24}>4CgerI-rW_E2?d)JKSr}{PEDPcV9YL=2^9UZ>MP@ z?cBS4m8a^=wG#X=u4*-J#TEnbzcFmUGcb%PlcM0&=LFZ?JRF1(rlOKnQs~ujet^9Z z(%!IIIOxvxD1#Y!lev0T?{N@TP3G0}cpFRv z8uBX8cj_CA6O8#uY7^{{MI;seM?haY8Ge`tEh<2Ds8Kg9)iTSSG$Smt4gm6dYl4( zw;n#)Oh&|qT>y2giWzK@GZ4$Eq5Sgf?^nNg+X4+OJ1!hc?O3^MR`c?XA~IT%v8yP! zylK|16~WYFk=XG<4Nhv+g4`U|Mko&8HdC9R+xF8D<|}x-ItoFS#7cJH-^>jlIVkBi)GPZvqda-U`~f zJM+}0nwbOm2mfw(P*nP|vwf8r#@3P%b8#g0ZfJ3_H%aE*=2luA7@AQ~Fk>h{+tgHP zWpI6I%Y7@`H~N(XCH!zwR&f^olFY64?#0)O4?P8iucu?>x+P2!icov41NphRV)1dN`$wyF?@e zPdD%{J+sZAa21VIoq(Go?IUvAkmCIRkoF#cZB_Rk@I80vdfT!r%S*Op*^=WKTi#A= zdBpKZoWzNpM9y%QLjnmI5C|i=86?awTOe%GFv}>b%+?fW>B!>&h1Zr29+Xo03J+R% zO=9Wh`~A<=m1QSTzVDNLb+7I?=iD>?d%)by%tB=$V_yTB5JrG258%JiZ7{~BoPu?f z$Nt+yxCw3nrQh-LUs=r6u&Md*g#$gRC2K}L6AfwTo`1fDgn}NiIjt(&)9>B(-cKJt zbarky^I)=5`j#V^s<>tsbK228VF0zrSBbGYYE-S zqwal-{vHeccWheVK5Ou$)L*A?A<1P zZ|;pSquE*P1#jR_;aGskJxa!d0;kN~z<(55fKw_Heu$iaA-6-&F5H`q%W{d5;TZ&` z2z5z}$R)f`&A@EY6zZOgXdllg-qoUHyTQAq_fL*Q%XeXVG%Ows`wXIi>~4th?#9TG zb`BAeRaZTz)OwdC|F?Q6+pLBB+CA(Y{TG@z#x+5j0z_(9>}hz)@FFxBq_8m>Rsoi} zf;k}l^PUf`Z67OLbMJ-Q?-(f=oAsT)2R|aVfeFhW`RW$wlVIVdXAjQl+4JNE>9b(f zou{5$h2jN?$TrJSl%I}yU}i!f@BvT~o&gkWBn+5MJ5&lO@$s@FJG;7e9$6O36hEGS z^@f=fAh^%i~Syte{me`i`o`fy(M4Vwe#L(bhkyDx#8;h^RL-3Q*`J>xT&gY zsI6#xSy9_iRn_9QBE1MLq8T2RidXY_IWee4lZYC{ALR6Ki6bV_kkd0$tE?JBN$`f` zx&*_(oP~w<6B2uP#6~Q0q`Rlc?df5nW=;r^F@8TZNqi3+X=;mNP#0kTU9-=WiKstGNl)=iUg&~%Q3sMOl zT+pZTH7J!xYCIws>(3+G@Kw@aC_l@l zKO4R)IW<+%e?i@16e7K&Z=&0R4?oO)7k*G8aGe!zk3%fJ>5@QI*fPtSTozYZbwyE( z#zy0lMU?JDFjS3-=2v4|dOH%*3M%PA5f6q0BpwE!6ZFHlT@dh3V+*R#1F0m|EQHE< zLlOl>-k*z`jUM2A#$1pRy6KiAl|0;Cn4CP=C6B2{PB-w|m&TsBzx(=r$lO-8ZLbL3 zkXcgBF zvc$^bx%oZQ<_}|m3bUNKL2Y_P=*G+(die!6c9$-lPC|x!rzA9YpAu#@XQU;~-+J)M zeH%KIEKlw5(9razooz{}C}vCkbZY^BXX0Fe)r%+MkyE->yc0a%_~bzR1q?M`Zj`KA zg+G6Ni%M~Q$wZYq^mET3bP}Aa(P2o0>r?&wy-o=femGATp1cn|p!?Z9=mBwabPv2Z z>19J>Q7;?1p1-XAC+2_R{_Ad5xV22aGbA{x3T$|N39m11ihli|@U^cTx{h8sq|Isu z1qrxR{RgO1=c&u1NBwBtb#)rDQ?EcN{;C=f|o1*v5}7{8+{DbOZwgdqX0+ zsEw33#zu~)v_U%y9gapE6c`(@Hvn|su00B`%W_&9V)^+vetx3OMtivEkdSb=P1F{E zRNfMbBy6+|Z31HiJrZeasAb>SA|%!>eO3@to&$!b9!lgj8$A>o)jBIbHhM_G@$@PH zL9pq>3PLOr-cR%p^%P{H6a55&K!b(>%pABrz+M4gYKZfwMos}zI0Ipd)bY?LamWiQ zLp@^J&YqAUIYBgH5k|EFS;kUSVo|zx0{7`|4V*Vojvzh&Qvu`CP|rR-JEF65Qnctc za9lmG>RuoWBId(#K+<)>24T|#JcS{RN%|sWB-ltKi2y@(22Hw){92+mJC4t^Mc+fm zmLE`7#%eH|0XF8$r!$hq^oMxl=uOsYhcBMh ze(`kOA7C##=S-u7jrq=3FinqEo;B1E{p{Bs6VCRAAqw%m5yPJMwb*TL#{4?f_x}+fG9~esDGw^rVM~b z_Jc8{aTH+eEJ$_1Utm4^Y386!>Z4fiNs#-IH#Ao_ag~z~$;;vMfUE?M8U==1cYvj` zza9v_al;KtA(d~)l8j~sf2lkT+67I8=&lw7E82>=$>k@8F3_a-h*aTJ5wWFQDulUe z5lqfyBFisi0zlMw1%VbNA@~!KyNn!sgzYgiiOL>TLzctn6Fc6-0Y7($P7oo#2trH; z0*JV*^-8`rK4KC8mP?KB55W;lzWWHoS8~J-IyiiUo3-659fhsqz0^|z*JlW@Tl4Uk zvg8X*V4u99vC^!$h+)r7)wqzY8CbFwM(AM*430E#gr7A$GBP~;$)1g`EF^iPq)9^E zn(>b%ADYNj%p1%$cuWDO z0xO5EVljUk>j0=>B@GY$`pZ4W{YI{KLOJ+wTw9MH>2el&_TRRzMg;FzuUO$`^Rvy9 z8%SwAz&@Scz*UcaaeaaMyYe3+XT&StpWMW&SW3alzqa7WOLevw#YaCj3OjU*m%cAPD)p}KXy^KL1 zh(oK4`I%oI+xo%0v9U2l3%!S_`U}>k|5&WUQb)uyti{zIj1T|f<(Gf)W8frBIHCSf zbxi6JF6(7rb5IF3pS1{7tplnA(w?AgB)h~;UdaBe->2ssVz(dA*BI!REa3?^5h^y0 zZ$3G6p7K!FcuAT3E^6WHkk4rwkGsGz9KL|)u-QpRO$SyNkS2f~IjfLeE)b~31mBuk z>1il%P=%pfpe~fL5f=QVZ?sxL2au)!nV=?lBTU%!lO3TzHSjTxB561hr}rhJdP3;f zpaasNS`@~q*HDR})c{=Az`;=$kYWiJG;&|i$X*PX@X~yS!qludL4Q_(g26o z_}8r*%3nzo184%%nvV8F570Tto_Q`ymw6q(3GW-aa100FeOQD}o))GEouVn8St}0F zIqz&*JhV|~17^^NeqwC+o{t57TeO@u_X$BB(N5ltmy!jH3GU%GDa!CS=;LHO%uC|q zO2yKL?=i=3&nilkGR8Fx(qeqjVSJB_9p9v|qg5bqIZ6@Y;hTO%Q5JD<@-PhIctF}H zNeafk*2lS6mGLON6qUG-dD( zKPo@a2SE{gp)h`TY)Ss&z~ZJWyNB;9eL>`nS_7cvw!1m&M654B{~jq2`ct zVpc;(dhM#x#et#HirMW~V1(#2dtuUPL5}pB2aviq!tqD-T;11p9SPbHt%SM*VYzuX z5V+P^4sXHrj5AijQ!I% zJ0j+g-algpiCXdO)lKOOE??V#Ug4dkpCA6k`-mhwZ(GY>Y$>#-6+FVIZ+ zT2F!94Egp@>(h8Tixi>lbOeU7Dny6|h&c)k0A--}Yg%_EhZj6mm;v*(57 zk`Pg{xe?K%^pLg4F@NDVDEYDm#r!EczEG7ZwKVq#49F#ym1KKx-Gum3fc}_cg~|B; zbSp(*0phs`Rg*>tm|7rc4`&Qo;^aQAk>u2{e55r`ILh3Bga90#MVn#^oV<}0iJJqV&y>`_$r}W+P!4zM|Q5Yx_VyQrW z)Pv>V&NYrG=;uj> zLDVwOs>Hj7zW6$u_>P>%0SzcVB-|LL1;`-qH-?vn*xdL%{7c4J8hCS~lUTozJ87v3 zVcU$Uv<*gt=tQ@b&(bJ*7!(Sp6G@@ZaXyiUs5?v;hj$UHW=zH~XMn0FAP1)@dBZRU zXKuqcw%{9T|8`Y#i<&dM`x$FRSHKeN^!Fv2_v@?U)FYPzs<;a;Z_c(!bx_%-l}`nq zUO06hFO*i$l(tiu(^$ByiSh_~M;At;5h;djiZBH*3DRIw)C5UbA6t%+L6aN0OsL;2 zYK^;vIjZ>y5LRCo_yAFTL5vZ?^roo@iAv%FbR6%I(s|Nm0OD9S|MQX+*mP{$#fZ6H(IuxKHLt`audb}#0aG(u9^hg%d0$U4@ zmy?e;otAD_b0r5wtx(fJN0F+^n{M&aF)Y+SPt14aCB|4|tT~yExVV%URrOpytsp5U zIW0wrV^HZTAHH~5Z|`L!*)l;lc^^LU-2k^rG&N-PmE64lr^iAYwW!dQXmJ+gHs!>oD~TD!o?=JAd?rbS z`90konQHsa@1L#2BqpXg^Bpm9$;b?t6bs9b=29iU5YD%v1hW|_wY9r%hPOa=l+P?k z%bR8|5fw2mE+aRg?i~4=*aQUP5#y8MW6+G)@+3t?k`C#?Gxgdv;T{dWlRhmiHYO?7 zniMw@Be9c%O=sV_GPlK5Se~C;Vm(6(Y`c3yTudS$PaWU)FO zIkGJ?Cm|Vu;$sryY*uHywJ-#v=}MO=WUY62XJ8r!9G7ILKcQuzLqJs3ot`Wwp90^Jp)zdqzS($)BE|l7cVVi=rq~D}_n&5l#c! zsF$#D5f#E>p>UFG$U>Bp!?$?Si0<$$pCk-R{bSPFM8_D?F{(JE0jW|`@!>GK96E}y z6*uIc$nO`1qtM$<#Dy0TyI$gwTS#`pfzc4n(}2tb`$(93Wmajv)rgH~r!c zLjxgsWZ5`hH@s+|T;DOut(i0QTlBxM^_@M$$t1)CAB2*k0b$bSIHe`7cD1m4V9{`$ z5p747QCxNH@I|vaE}kxVP`q*8nqQiQ;`C8sRC+q~TUi!6D}#Qx+g-s2oK#u^R1?zT zn1rZzUM_4Ud}PGh;jwW@_Z~fSz|RuWfxQ3%AB00waX~QU>6s7{i-o2o0p|+wL?o<^ zy~ICwj=ygGlAes*{$(2)NAEkowe|e_Mpqtb(I|*|Sx;k0cA{a76D|FH;%L>1*VauE z#rF4IFi=)Da6w;q9|@gPf5EoVx#iBf{;JBk4Y^CNdv@i@XRlj2F#A?4HHt@4G;`k2 zVBtjRW;W-}9bWI`csnPxS(~ru?7U+0EOXE2h|((};yKn0Y&~r0HdXW@rXs%YTYTh%Vt#cmg-=IGJn10y|HuCnqKk6^nu^E3c*Dk0NqD_brCtoZA8TjLpK*-#}q%B!E zBOD}%egu(ZTr*0%BKggc(FdpsjlcsDm?VrM-3QhtHgJo$1}PDDYSM@r#oQ)xmDVo* zsgd75COwfWoTuknBI2khnsqae#%^dtjJ6p`5fNDhU6=4 zztjw9`gjLopy>e3foYz_ooGnQ;^>3>Uq&jIMK=|hQF}_Z~hjPLV8y# z3kRD;h%Ab7f)K8ljmRP*bL;oQy42bl(NpLykSX9|YPt-qBM`~@gEvIyMXX(QTI7~Cs zyq6#*d7K!FjB9SV^vVbA&FG2449|rQkNf0f>{fgW$Jk+g)H2Er(@D$dF(jo)M^PGo z=L(@+7!m@)3dGtPg;adAuua$@T!fsydyyIKN<{m;LHMq4Sh!QTmulqZrsQ=H!GsRx zGRXmmP)Ml)k0DcqYoffQ^~0^PrMa1vC7Eoj@A7gMaj-ijlwaN#_QVUdpsL39 zMo(q;KzHSoBUt5W)RN$*4sWhC1q~_5b=r0BqNPNp0yu#*(Rh{(b&7PCLk!}pBA6Bi ztYpM$ZeY5wlE`}<_y`7!K(h?E5(c4|K12Y~yrn&DP^b~0#H}EiPVxg87f7HDsTtp6 zM~9e4WWr)Ws{o5qxa~;T7mRdc1ewT74^B9r25z_^aN~{qn*t^gng_{M3-U{oY~~eQ z7l(sXqeki}pmIt0%m4fGN2SBTQIww*LYB5~E+51f)&WKBZv~Y5npKdFWdKBPdRsY} z8Bfq^tOdRxjOdwXn(7skmcjqGiC^69JeySD<`fr;wgp(C{?EX+(0i^tS^#_%Z2kW| z-NPx)1@dT!n(lcy8>OO&XuH7Em?fjIaEKfnxfora9?>KbLWz7IYkN|D}bnljTM@kp>cVxf}$(9wDR-9RV;lbk+Qh)?%su4U38(?_`-fSZ~| zZKro4Y=x=Msc|o4J8iU1TbPNjCT!tc5u4&9(F+4}6>ckajuw)pLI9<}(F1;9Sy?^v z=CydaHJoN*UTKug%IPVd)?Js6j=#`p5B{p)p!gspgb6h@-cnYo9}cb553XRBhq3_e zGz*Jy)|EvE1gDZvMjl})S5=Ake^A810`UP6k(JAQb&lK;ctx*R!FIBP6c=cM;^SV! z2*P7TOfv{LD{~x^e8-R;OuSbwm9J;-1dkmP@1+nc$JjgkG&_tt^irHO>}^!E3jDJX zrz<)ZRuoK|=qZH^tqUwbzA!I`<2hAJnl<{PJ#98nUZBRB;caU9S5CFZZueB@oVdYR zMMqUm%LS@<;s#MwMayOp`PB(Am}r7RMR7y{4u}1xw`Zi06z@DqsIT3OQdp{(ZAU;h?G?{@a%Q(}>mg z0k9UQnE|a#uB8fXA~66^1Rp-?yNGBJvosRgh{Qw`gNICpNYZu^n;~)Yhv|cM+H-=# zTnx$>kTB>s;4$h-S>vP)?xMYU6YV)aCA>un& z<>!_mu07>+9zY@&go*VWw315)@dD`%<>8sP_gwh$!Jf+HR}PoW>+A94_1(N+>l2r@ zk39CTo9BIRwz99Za_~DpKYz(}>lw2RM&6VQ_3;R97r9= zwj#oHpll=-G1&_eFV=#aP>!v9=bQt-zhh|R;ZLp{IMUyD-{68P)-+TG_ADssEBJ_g zEZXX(^>@7(A+?`M2CcufE@4z)svmOE&x}lAZQ~G8jsUAkQ80xxC~Ewl+~en z@#mrKnXW=)d`PvqQ?}IAr`qyU3NtEO%X1PO#i<2pak056z!CoZHrK7QmL0Mc+dQsZ zo6QoF`*tm;=i!bImvo5R%|eS*9;$2lbu$N%1k|3jNtv^jaC5 zE5g{YCoK)Q8uy*>o_CVqLG8M3bKx=cJ&*0h7@qElu*%RTI-^Gni0|$ z8VbZ#0+$)t!oP_@HLdE3aE`3$_&s6!WOMexWQY7$09Dh{6$3m|@mOFjXme$rS zi>AlNS1+33qF+^kxlJh$J|AYTQ0%c|;LDEzxD&WPc5?l(W6G`gaV&J$I4l2(e;7`l z6zrayloV%?-Cl%!PSFRY&CR9QP{Ly^T~rAb?`+IYYV04Wq2JEBITfhqR;mCcilfIM zZ8&lGn2NgS%&+(_<B)&P!MEhYzj>th+VlD>5@3xeUWnCy1z-J$L`|#TOV-^4bG#tljaV%Z z_ga0*6~X_NtnFHvzp2?%INRS~>)*Y8g}Z4+N2$iD_P)vw8RS#u2PGUga=I~1u@7{@JrmA7iWC5EZ}@nsQ+AlR!xqP^`M#@ zSCTxvYsF0cb(DDl#dn3qlc}e%L8JkXwxf_ zG8054G@g)|#NG;h3i}f_Tling1F%3YgT!YCWIe!SZYw|%-joNa;@}DZD~GAnm{w%6 zt@A+{&q0{G2#Rb@VuNJn&wxrN41i#>Xm~Y;hD5mg(j94dH3qamK(Dp{;L=#~#FWCH zg^A?MOhCX@E4|quIc**rv$zs-k`gnLQe-ApTH@uzgxFXl#*B}TiA~aD9Qm;xdu(EC zY^*HVraQ#g*yL14YD}^?25&=XLZQ&M0F=oEQd~^_+=}vx=A}VNo3U|qU58c5IOm-A z^!nt`Z~bfUn?HAHl76;w#Xj~*LUMu?S&CvrMV2gzB?c}bimbl|I0G*^78?_nV6nUp zC??8Kjw?)dBwG|&mRSr^CgT;DqQ=B0&e3Y?Ho$|OS!|1T&EDM)OShQ5+7T*EB-$-V6IlMgD3Er$;4A73(a!}59Vf#uKmR&ThVd+)2O z_4IwACzYHNf7%C{^Y5%m?Z-N?B4aVFV^vhbmDSUlQYC;$r6YaOIhXqXrQg1RRsXT& zywL?&p{M*}!aniPt9w6U_BQ=*miUDa9X;HxpSW)E=uhi*?myJOZ``9~@73!tfkaHg zD$84zHz0e@K`roJlwkqkMcz70WQ?_&-e`yTpZOhYuK51h?m)%-Ll=&8xb-3>XYWsb z@|tDNb^mzd(VO?Rl&>sGAJ}~0yLSz+u3e$eU%_kKi9UOaZMPJobQP;T1La4}AOb?@ zH|j2>;Jou5(3dCZwJqP}LIXyB=)sxV5Nv?xLzS z{b z!c&sT4?Rmv50b`boD}50WRy>DC<6C0r{JLUl)ZE?cmhn16ca?eC{-iYrl@gxS;lyl zMaZZqOxJMZ!2;aq1a~tUJPz(gQpeGS(4L2-i@DGekzEh@zH;fJL9>TtDI`mzWF%hB zQp3u{$)VeUJP62HOP7w4S*k`C%8Q)^Rs~8x zP2@MyZBju2Wty$XR=}c|@>YteX$oi2Tq>ZZhD>KQjby~hggYi*Xm3=Q4*vn`um zp92s4kvXq#+VZm-hddoC8X8t~c!JM2-?DJ=&F8k(4sB|v+q|TqZR;&V3vX!-oN2*1C z)yV3N=j~TDYG=FMvumkOjHCXaZrb$I{*^2F-tynIyDq=x;I3MF``TRxuep3z z?c9NZxg#U^Chjb30V{zr%m4(+k3>QxMFZKM!`2l7Jjf^Oi-3G2Y$P04NdXK;3~*a) z=E}|wKImK?dJUW?*feg?iowSfT^s5A^ZT94_7Zyw;Uc~vO~oFWoHW!P3+tDNP9~EC z4ptZ6!C_51p^=VS0sBNO6uA|`MpmF>+K_`<1B}*W6o|683?FgH7`&V!u5&dR|BbToQ6Gk^bB%Bt%~WIoa)Wzv5tG6t zV(tWv>N(#Qj#ZqEUefIj7heB0zZ=Gwk;!Aur#g%M{S7QrYnaS~v(zNyOZWqO6 z{kI_l>IYi^7cgpdrzV!^!&Qbb7-Q|6_dcr0aJvQ(bhm&~Le2A&8M zbUBi&F`^|YyEI=_)wDt<3rQ@wFIAM9FKJQ|V`f~n5Wjoyya+^^hA>5IY!bbJO2w4Onde{n@ z#BU+*h)yoziZWULx?|OEiVjY|#KZ^M@HEGcTxdc|>h#~I+svIFvFIZcH--0X>IoI7kAfis z?ZHb8Ms-XxvEsMg(kQI3ZAVWa*@lv6CTZHS}=`=DP7m8ax@- zNR`I#K#!A8;ly_cEiv!r?-|A>YBUBz8+gUk0vWGC5&4XezYqy(gc^w`q9~ux6KWFL zMu-YE3t>uwN+S;of#;tDLmMtHQmU$HaP$$-ToI2^DI$)jyAWGcqfAano{3t>@l?b& z*AAjMATv#&UL>Cvl!l3hZ%jLw+|X^l`qI?=YUHJB;gAJWor2z6nDM z_#MIIc%H7CcTg>O3XR~}j|5ONu;d{LIFKwiI-3GOjIeizm;$~CsGRg>;``tI@Yeou z|J+;u{N4GNt*oh8dD;B%Ui!Sap`loR|CG=fQ?+1oXG5_h1n&Pk(i`6R_xl4{%Z97x z&b@j=i@BFI+$7Ci|9SCri2RLU~6o#k)dz zak7-_EtGeT3B)C6d?gU%Co826D#6fVBRgtXd~85MiIdERc$qi^Y07n)@H7i804ipF zKXY$}sx-teubIt1=qL`zLDn|qckCH zBy}RU?+@z^k-$3F$lc4${UKX&!Rvs;Y2Xj|$dU^Zs4B=s$Z!zWHAJR?lO|23EclkT zd%XyCZ0?=NVVz#&bB6cgC*7Opc)fErclY_%bhzCeYy2m5|C&y>yK{}d&%7pIv2^9i zrG35g=Jkeh=(~@8%U?woOcm%_RMET&Y4Pm)o_TfMx>ujMZ+4&mrtdu#2t4+^oBR_; zeG}L9F9IL!+VxSOulL6rHvG8P`0g{#5qRaZ0Q08?aZd!JmplejU^ngt*}|Jkr;+0sJ4k`m)A~ymhPwC0T5D;sBVA?U?0R4p~YnflzZ@$fHKND4mdK5o+kSd0f3DE5yYZD z`Dfxy0DON0&}#)0eq;QPvJiS3zvh9$dRf=VES|!IAJ=5;gIH$*fD^4?lt{cUW#18a zR%4h(f+?UZtFSVJgNzv%1NPApw?nbJrLoJtdiSwQJ3B9Z?A@;}i$31|>*sDcXU2?k zZh7w4+qb=A9>4PhC<0A8{dVI~RiFpn**5Wj`7lxfYLcb_PHh+dsV1t|5XM0C21*vi zGv}&_p+xbYfe>~9@t^z)KULq96Z|F)?Tj}j9D=cc+!lxjgTXm7GS$jn zuqOvUMLVZLJI*AUx|h?Tp$&AnbXqQEog1f<5qvm#ru_83$@c6F`mdA5ELyZVFU))O zA4CJk zv4%wy1NM&a96VY<8>0j+bihQwLwthbDr(`JP{fwXn4vt+Ggf=VmWrk7pFzsVYyrd& zN`=IbjH$-4A`z4QX=;W@LddAgp9WZ}G<*_OK>mOY3S2G?;8aV8Fq__qLlb&4Y+Ojo z-;v%E8$>6V=206gGYJAsYyeCQCt?Jm4kk8kS_bPfGBBGsYuo{#MKmn^W79!)S@0y? z`tR?aToxXs4gd{8ucZ(~DuhLA7vdE3L-sh?vel5$S<@&|p<#X)HYD&$WSoU{7iAvd zuu&Xg!%D(hLjekFN%_a+*j$#)4J7CkW%@#N10JWwg=1)J^OE3L@b>oY zZ!Z{L%fzd%X5!l5oBkt#z!Cp&`T2hT`Q;!66g;2-I8s<9{DhhOe=S(Dcwl(##*J&A zZtd)B9WJk`f*FW~sChnr4Zjf&V!QLGs9_T@kV&>ENl5fD3H8evy%Ei6{BeDu#Cz=w zqKe-UPouF9^jtJX7}vOYA}x2y!DI?HCZf(y9BJg^@WvNk1mB>}M)_6oaR$o{4dP8ILaVr)3t@xFLIKqWld~3aY5<9;iB@I7U#Rw8$-2Iaf&2NK^6q4XlTX>UeR2RKxGp;*LF2Eby1myXI@l^w?!RuduQN6 zbOfgzC^t04zr!4ZuO8e+OjHp~J@c@qG_km}F-ny{>lLaEeww;NdW4(v%*%s8N@ zt27_@1VubH0V6nEMAHr*VoV_c;EwwSgHPUi#O?=?Z~P>3o*EWIxXrlTeBi_|DM6?V zVx}qDE3Kq5eEk~jBm5K(=~$@|y`GXClLP=OpF6b}AzZ+sK(|3damIxY-$kmNI9ODG z%0zfrJpa^F`tw?#`+?_P8y$V^xd*!SFNXi7X@46IY+{bvZexy3!3%nxU%&qOoHa*=lcP{R4YN|6RQ3DzfB}!SG z0p-7)*3M>5w=hRJl~0TK>77w2_chAAOU$)q?#=lY-bWns;4$*&7cT1ws|NqAicf}! zb@H-1J(IZ68{g-e9-`2eBJZVv^P*_Wsc&iOIH4;v7*e=+a>_l-kftK`xY1K#mNcxS zGkH?7ekGQLm>S}4h%uV-&e?FB{__h5dWz?4=?=86>TpN94Y@m3wPKLx6vJBvVehUX z-hEYIxVzuvy!*R{1FOK86VEkK1yy-^56Bvo0(W;l*8;6K-uuW>!z0P4a_J-Y-iX?0 zHip}zbKV~la=81&QBzJZ`eOGmrYSXr!)z`IBun=^@Tv_wdKh24v`(SZHdT~i{UuRU zrXPi&Ac63U)-yTWVzp9kHmnsw=q47YJ%~m@_UE}wJ3m+6m?4fL5f#GU@C6NI$|;Me zhuJM5tz>nLX-HVJx&*i#%O69Jzul@1LYC+}H+V==`gx%*a=6Z*mUKWTWEk#o%_Rq{ zkVCk@F0o;+_$zVF)4@~0yWDkY|76*0jQMY4Yw`=)CaWrM-r5$wPmu<1jM8W>-15^K z2RmE!l644|=a+?0jW{QGN*Zx5C}&xE8*4r6+csnIccXQeHxE@-XH3r^C8??59K7MD zTUPzBZ&d#=dzmP6z!jVyg^axX2jqpqp`IOufzAEN0k!K6&S8iEOfd<1lm{cLP zpwel21ezVJkpVUJt-1W1l?AC9A%Fe_0ir**ae85#{*}pih<yLWM}OG0tN{k0IMBW-=cq z7dUL2sXq_DsFJJr;GA3!`4YEbVzp$gV^_815B~iS)8IO*UHd-|E{|S}L2cu!4`02u zp7~8r8|JTHd-cPwzRSA-_Sxos{Fli+8xP+3_=@E}xbxt~?iBsmv_;#l?CHH?+oCkF zytS>ZRn~6OKl|{3lB1e-wB&&gS?WzuD^c9fi`}?9oT$L4HYAV0$D+#0MLT8(wJTy{ub^BXv@Rpq>r8QvhTzqELjyoC_Wbt)<^9bC25E63LUbrXL34lk1Nr&XI}{#3^A#0q#YH}Il49aeDd7(% zp7}8qiI1q!^ZG4w4pfB3OxP^(;(2|+0~YFYe^8SjDDn|G;VaT_F=sKYH6j*hUS^q6 zXkwp$DBxJi*B1rL3wHv9OG5bT>U^P}3NHa4d%XyH9AtSR3PJlFw7wy0Fzd zs2dPqU}I|~`sVKCd~2DA%M9U|3{PaI^N}6ovZ_sp>2=?&v z1{hxvh!uSj@a?2Pjkn;N;)-%}2+DCq)6P)-PG-jG^^A?~FqFa*=ge!yo_CI+ESCH* zz~JnAL{DRIc1C2_ui@pQ`8pOwFVm9zT8>T(m|Prbz({!W&5YbQ`iB^}6Ifpqn*)Qx zM%mjIO?d>=0M~8tbk3+0#QykuY`{$ACLJXgaQzYFccav9kI<`u`wQoUCVD#=vQsb0 z!2APwFikY*ebVC~aS?YfidN#2AdVDe2yuzF80lS4@J_@KF;mG-WC9f9r}j`MgHMfc zsV287Oz9q$ zAAV!98`PPR_Kd{TbSK(G{{HwE!6@K9{M1eg=w*DA2rmUT0#^j$1xOdH2`WJ#ju|Ir zMjPahSSu6V6+I&+9iyE@e$gK>iVFGigWBaz`(AaDwng&Oj6cH`m=FM%Q%AmN*X5V* z8YYe;z=KqG_xE>y+xes^+5wY28a8>MfWaFLcfYWH{R`a~D}m&K7ELhbi<`^ZjTwV* z0%@wj0F1dX>7ZRh zYbnwOp|f#}8u6eeYy5S4j2H+swp=}7nN4rPWtmwyFKZXiEXZpfs&~(Fq@)kjw{DtWUa@d{S7TR-Eqx}yCNKm*2=F#0yGC6I zGF}t4Ij+{_&GmuSf~5GCcx&<8t-W36FRZY|w8kgZ;8wija=hbg^BqZTA@)lr%uYiF zdb4l-ffvjaGu4kRJB|Lpy{fu7cth}pozlnB$2-ML3BPb0%-l)$vV-c!%E$a(t_#7q z;EJ?a+PpJ}i+Cb<13#voJ}6`=AFKRsgoVe*sLJMGrg;wz_#ujic0N`oalsFrq$>oh!f{?X_y}E; zS?;nqGTu})h*m4ycJNTk{sR_2BDZy+B#jij+LTeSJ=vA+G@8Sj%~hW1?#lYT4nh2p)}s)HcJG}S@& z(N%UFkci(vmI@qGSOgRKHNA?DIrHSPMeY2t=@V~)@N7V89rhr&ZS2s~UC!kaf%?pnKbbCaH zGYPGy7zko~xTDeMgORQtq)dsutR(nLsaAhi`3ihB(E%JghizBLn$zGW1i)DQ(Kq9r z!ecAoi0eZ!4MG~lTvvgXC5-~4!(v4sxvOymjVyW}L;Nd)UkvM0Ug;LNQs`FsDbgU~FMHqmjH1^gB-AXJPB$noV^J?$PGY z*X~&`aQCkMkT7HU_PV<5%V(H-5CR0yfnT9R!sLVj7RnKt*AI47WYn%bv~Ac@Y*3&2#ls)UyokSNz#lY3y1MHttixwbGcLEH4kCim0cT)6jybDg12LG;l^y}|pcdC8=t8dgF(m&p| zr|b7uvuSKk=wH{2|5iN}d>SLs#>eD1O17eGCstrJVF2kJXWu@!Tw`@l!VyN?j10H>W%o#zfPBJZ1c7LHiMUga z|L|q4s%rJ>sw(Z}m%XDiXO4oHB#R-9OPo{i7Ub)}TZ$<~nmw9fd_wcN3`{Igf%vBb z%prnr^bLgtPSa(>!i@tF^t~~EF@nOAoEEc%v)G^(Kq}rN5zypA9d;KS^O3Jm^14+7 zR)i-AoHWpr(3L6FbJ!HT4yGX5z?D9r20Q18L8cN_J~_o#FpznSs^~bocf2fg?7zaT5I2y zR<~;I;B8&=Z)E4ZzqRYCu8QSVTej%sIgL3H9@1wHvtd^ zggjA>SOvKAxIkk>ppcTdz={OUQ-CC&qYSJ*?gNG1L39Si4Xbeyqtv%pYHDefbKx|f zJ+;2Nnp$5P5+YeXN2Jb#G)r3kba#4N|DyR_nN0P?JE&iAEt6$pruM3M7&g-xzrY68g>={HMO>w((w%zi? zb5GxSiTgYHU-jVUe|UZAuKs6!`Nz*sU3QPM<-INE{{CE$oCL}7PH6iEBT^voA;{Z? z7vN5kWcW^FkH{04KY$(dVo;ut-*8=)SWjvcWW^&ICl^WY3|lWO7o!--PWrAoZaWFA zpnjI9s3Mb;nD~@*XR5uveNM48R*uiJJAA$>ds=pCtdx`*ZxQw5Nwu}9RV{PMmH3#r z7)OPB!(|J+ahH?~mcV%}CPraZtE>0Ir%j5js;fZcS~#vLk{t7F&FFX+t$IXHdm%ff zX7XkGeUq3d7WH~OUsJ68DigpBs>|`%ibjHUf#j8?sym)fY-?zW3 zXiI*gYcDT(e6XyiHdkvbEnKvC$n!K?|MZpYFAaJ(2I*Ge3U!rwE?{CNAbVrPHh_G} z$>gMEgaxbDA&eP(IUF6!vDVbPttpp1!VeVEX9DLg&iV z3PT?-OJ>xqE1NlO)rKvNC55wG`laKaS2Vj5MYc*3 zEvaeJkAoK@IMlj7i-jLyPHP+sYFOBapGVTtTF^cqs3^si!-dVVjU}C+UK?X;Lt`V- z@AZ+}$Jm|udVybDkq;nDrop;q0s6ogqd2VaFr{qx$Yf&R0U-b*Pm|#$=xx zH65jD^!Io_a7!YpDO+&EW&v57zFrP7xn^ZT(lDX>JiQH;i=re78HW$E45&(P0ewt_glN$TqinrdXc=JvEErB)|1A6k)d}}k$ z;u@bV7)VXlP=$q}uS{di29ZD}rU!BLqTi1d0Or!1rl|55!1)s zako@vYniDh-%ZVgz`xba1_#}(;C915oNiNo<94z^ezTTc+2S4y37M%yBo`|0KU&i7=ZgO3gnr4F(bWh|s37Mhwp(*n`de9nx4`)hA#s?miTlA5CIUxemlYhqvWk$Cg^Vie zJ$RB^iZftFkPqppO5yoWTsU*^}oq^`fKm6o(?DZn*vD+aCD*-WBOL#uYUWY`$`E;Lg2ElUnb1@X>p( z-8ggll1uvbfB4ePb*si!N$flDiC=Kfg7~>N&yCGb|4y-W@S(wMn|EGuUf1|*ITcOL z8(8@*r5E4yP$0j(u7I`eVXp6FW$)36VFpCzIvt8AY=vgW@Q^189CRfyGQb~n3`A?N zGsKfyfNe;Yp^bs)l}Hq8-HOaubV4GnA~8 zze1!Fyq13<+;(O0!}f}}#4Mj#3CauVSi3{1a3I2%^+7Yo-4M{p;#S0cDW3<}&V6a)c* zkhKcl>-;778;EIS4of)4yiE#oX%x_t(+oyL5KhMvmqU^hDu5_zXj%Bah;UvMIG<{b zq#S^EZsEYl_SspLcG+f8lOL4W43k}9Tn<1b@vk9ro0_YOQ7a0eb6OdEVE;92(c;zflssa;0< zDzVqE;VrB2*wM0FYAIH;AYLS`R(=OB5t1465sED3YRPbeiRd-N546r5cLV}=?C9(~ z|MsO%DLsbEPlw0Tw#2tiS-$IurFZR^HEYLRO9Qu`*Acp>_beZr_`MxVeKpHw6{9jt zuDhhO)gPfg7nc;1j1rPvnL@ME$Z{z!#ISRc@_pT_W){_Z9Er-~(%JcQE?rSSt0?ht z^+)=HzH`=G9l~O>FaZ zY#TdQUTcYqkIS>QoYhy7TiaJ2<8d{WX2m5YHO}gDRm@#i=V`6Ts_b9w%c!xlj~@Nm z&wlU&QP-~sJ;b)@*NKbR1>%a(z54wumc6KVBRb~-maKmvzm`*zoiQ!7`K)c1FPph> z|6<6VnWNG|X`K#JWc!d2o4kv@T7i6cNPSlOZX2Zsm#) zAjeL1BAH6zDJrOV$!&9CgMAL=z_!78n>M@4t@@^d6+oV;kVWj>_V>6CK$}^V8Xi|qs-AV+EbjEQx^Mh=)8I2Rr-+Kx46A!k@1hoN=)^HOjF$mp!$bC&UHuM+O+cFy>p%JnZ>RpH~nPe z(D!b*cu95e=Q-u|+1U#h_dC>>=9T9)=J>oA%<;?Qi}iQv&Rf;m9N6ru-L|r&VaYlE z{Dr+WHFFlZTm#+HYkCJB{Bo&&6r44-rC%;Z=In=QTl(dX8kd|?Q+M7-OVjWsU&+#e z4tsn;=+`xUgZcRb-POLng?T6l(LH5Co19Xn4CrgPwHtYl(PDz_3#}tV(IGn_AcL(7 zSRRlhT>rO~^SWGV23qpo}hz+hV2T5qNa)qUvg8!7wr-+mx{}YkuEzI6;HJIlE#JmdO4Vv7u8cB1~Bl`b1MSWD+R6K*8nrx??I9L5NSEt}5GXyEaq z9Q^bL>y6xh35p6Lg%|~sAp+xNC>)6$xjL?}l1u@OmK_JZgfdSFSstdLU>!fgTql<_ z8g!<>>0U&5MwoTC^um?nFI>&kt1X+Z)=yk*=!h;7KcMYTostX}d-$P>fd97$=CSnymJSJYiI8a`0|?;R;LwYB~R;FH?wAOYe8xE@~T<4 z&ChaYTGg{-GKy*n^}D^z#c4?y2#4C+;*tmhwl1k@S<%y+sVseRUcun9WhJ%S&K)h5F3I(^7v?wCR%hDEo4U*Mo656- zsZDi5KOF&V>n*KY+E&PChqxeho8^9ta5DMZTM>JK{*X5i9!s^9ke&y-5dRw5E$&IU zNBkt@5HAZ|eB%57o4Z#3A4&h8Rnq?susb*C_lWw@4bmZf?P7i11~x3Rm8>fGg?LZM z7;n*+cA@+QsK;95*9;h*&H&~PK9ax-Tu4v;81iIrT*vL0OctI3$B+nPf(ony@krDs zuqi1@NdEe8^}^1&^ySXJ<>&glHxBjo4>wmWoYi1op4&ToZb#4AgWYq7Eq}JTG7=Lp zKxx=d*ZYgBX|(7^VuCeG`j4o~N!6-SIJ9DoZ{sul{W%TIt?u!AQ~O5R_gEbmlibk71!2{bWJO5?Q1RlVRBZ1%~p_|l9J`N6(e0-s@piubfhIEOuooi z5p2SbmEh1R_C zoF;#2etC9Id7f2t(vcHKsjf1d$+xzn8|b*PE%c&(Wy6vs1TTc6sRNc~MD(DH5TnEa zg^gYSD}Z##wT<~mH14abx54loPS_ZB=>7nKNnPe6O@#+rMt z>=V=UD~bj@3+A!&^bgDZzG-DOvsU;UR?Vr2fBNxwTaI<5+nZh8RZ`vEP+D5)A8ht5 z@2QG;{9)0VJDgxoj?E}*`RTT8`s>?6yTrXj8;QQu{g(5%7eHy)`*l5dsDpsA5J2&q zfyf3kHGV;KrW}c^)o3Ab{%Z0nX%R`@KK1FT_b7%G!LZqR=CjeieKz{pXKO$IbXDS? z9K|^))*P=Rz1V5BI=#nNm)6%*R3J@Tg)b?q&|cDzm{q9W<0y8f;Htynbt0yy_g{_T z{h_65H-1`EoW-}}r9)>s zAERK%ts`g!_7h>l6N6-}2X$Z|8N)}}>LarWrFf-SYgq z+oO(sn#N;P^BDgc|2AKlTqD%r=_MJZo)AteD_kzyugQKA!OU3N-Q3(!;`j4|_ENJ8 zsCR(bKpkq3oomn!mf`&cW{(JhNnS-6}f+BEztYM+Stf+!X3+l3?6tJVRy>5#uCbB8*^I{>SYg61W{tCagxvfE(N4kFpr8 zC1Es~@{pxD^Kn6vp(CU)LSb%-|hjuqaS>#qO zzsHV3f_e1lIAlGr`4Y%7TcK+()EqPW(65b=6{}wqA}{v;u=gJDaa7m-_}rOo>RPR& zRa;4`)vEU{tF4+P*|Enb}=Q1`OoA_xb%k|CM&9-?`=7bIv_A#Cbx*LQmAu zh^ZVVahYx+6zGr&sg3D5iEE8KEh>~9aIfah6lN%8WTR))V-!aGw!F$LPgZ4~%|oBl zLQ_#ulixpSGITA1!5>xzO|J zb?Xx1QMVdIrVQ7u0-0DNtB1vH2TAYD@NfeKBh7pzqSxBT)v(x-8pn*?BgYW(U9DxB zed9*E{j|&Bak#R2da}mV)Rvhjs+G+)Qe}edT3H^c5T!pmqgWO7tw=%(`rrf z35a}w;cS=#weSwO67?R#I}!UpQ9a4|BstYM?wWpYDHOJZ77KOU2!jJKYN>V|%1UAF z!WlSyQQiV%3Il{j76K?8ur%9f*s05jd-E1=-r2kG zvEB+jC&ZGDYtQXk@9oRHMHe5h$(glkTetU~t}x)~0H{JAhd>?X^sPzO9Z1@{TwRM= zb!jvC;dZqL1U*$oTerJsVY4pxowTSszq^g(Ox)scCuVM^-m{SrJh>c~tT-4q&>$?s zWt<-(pztx zJr_Q6o=FJrxs&36u6tDtsrl+Ua()|}Zm&v9tFliY)B=2N>}+r8ys8T}=*PW?(ei-3 zE)7M)2XAQqB#QOLc-7{Jlsf8{-N>?glzYC{vtHktfF(c~fI-zS zyGp+Tp9bw-;C|3xJ_8B6lg^$vIJ0UcfN+t_4cMTG#2OGdg;9_QPK!)tGtjRsSkTZo zeW2%qKo@(ZXW;pjbMNmJ-?as<4gO5|Kz!-fZQX5a_72Y7iwG4zWm3`}oqz}=@#iFMZp+t`lQy>kcmu4(IP7eooYWq@uA^@CI&eZkH8B(N$_Z{bVJ ze~QO}#><-4ha#dD2~|9{F<}X-v#{O;1_&IH6UPpwT21g{^sXIF13b`&M#k)* z63AwmPQZJ{M~XYByaZAejrx2bG6LF2)6_&*Fbi6%CX9j3=YfG!-BUQ)Gx1=;R?toQ z@^RqNgAET(+u^MtqTjQ#MU7rS1ik#YPRn!x$*&oHow<1XZ9{a2J5PDW%*iJ`JZ;~9 z(v6(02-NG(p61ul=`luGya;uqNP(0Bi+strwE;*-qg}k{=uyv68DDi{E?&KQ{i?U# zTD4x^(pUl^g}goBU8Kj0A$TV!CgBdbB9UTWLcPSarb#WSE4e44CIlS6C->FHR20>+e zH~-@4n<^@9dioceRc2WE4=?PMpZ6;Np|i(w=fw}NUj6XJof>m39aP@KJxaHiGd-Oghmcy5i-UF|mF&w)d5!Nh#o-ITlaC(NbG3-wBi0PxmK4FIi+?^j( zF7hnvh&XFv$mwG$$GxX4Fi6nu)mo3Uwuo}WXA{qO7VaoxOE98l!gG;lVM!k}%Q*Xi z8P*N@+f(_=7!I5m_yxg7FmnKtpIX8A)P?mei2cwBuE5DxOavH_%7698Rg=vSR8RL zz)ow$LuWiov9-e`X!i<_oarp#n#3Y&|Umq)$ zm74bf8O=c>Xc5Z$=T}zF?=PoqS9?$%dn_lH7o?{blqYLjN#D`8Be#HqA#DskWRrvq z3|jGlee}}6_S&JA+}xI-+S=hsxjCZaK(K4a}Mvc98l4ctH$JQ9Uz zRD@i10L9BN9hC7td^nDyC@x(BX~z~2rHYiA)5=d{bF_Y9#12sTWiZ>@BHJ+{mMswc%=N2npap1 ztQB@M!|#67Kl&F(cfqxa^3e-@GMKejYHob&r{Z>Mhat2s)7NL=wV1vpGZFuN(eqai zEPCXVTM7=b6lvoH|PmoKCK?rquS_{%$QDii(wIVkX2p6HD&PUoQ zzQ#s&a2O3>jNn@WgFsrlCt!%w&;$8xGv@h7H&+O-?~ZoiBg0)nW3`GP`!}KwC{=Vpnel+#$vI;xdml zF*zltwJMt!{aM2axydQcjDm#ZWK&+Rr!{@uh3>vpU8M+C5!@Y>660uc$R!nv?!KUH z(&}4%&2_T9!XA}qX<<@ymaDj?IX9!A$bDgUI}owThX8vNU^UXmdza^tVz zx5hhst`3Ul4tv+cSp+r6#7!qx4Ezly%X7~05pgYEn{t}!%4_gb;9hLI4ST@s07d;a)dMbMGu)0lR>dTMvQ14 zy;S1SOZmz|S2UR8KKaBO`j=`$yVwDuHe%&x0$Af8xR_?V6{rz%LNdyuc;J{&6h#MI znjcu(Cal0+9G1hH*bv5Xl35t^a@izTpf%Bz?w(jz4 z&l&1FY~ryuA`1@-X_KueR(VZ%C#f=BIjX;p2`omrt#VOCc@q^F7r)@C`OmYh&$oty z*Rer&t95B+TX*4MTG46Pn7nd}v4S2%Uu}ey?@r-rVYjeXxJkGb9wv7S_X!8VtCKl) ziU!4@)iosXs+BjPC<>uCzN;k-iPvgKU7CRG!(u+0mV6eX2oprCa7QFJjTB_iLF#qH zq9ob~MIA-4AqggtL>UHa{|H89*W{<9w)ku|G)qj7u9`3q7*0Fi|QQGVn-dcPT2d)U!=G= zNx6}X7a-piJzUcQBTaoPP8jH5NJOnyDJ&@zH}eXiQqnXo;30sgm2;>L1pfv>MuaTc zyaPf9%AAR{7Bi+GI}8nz+lVC*555{D!spY-iOMO=DtSa;9`*#A76cdexR}MD4N_hU zZZ-2%=VgKlZpfp^(Cin0h!e(}m{YzpgCeinS)&8Gd0fXXI(25LhR z6g2||)xZgwFEFyv02qaGDm0Q{%QoQ`{0K-|_aQ+>!%Y*>i=J$oY6B>I%j{ zV=O^Hz#(YLKS;VTwH(yB6Rv;$6`tfwQwH5%*RLDOx!Vmzb5Ab*&rYs47$@cB*P<~Ab~bqwMFvm7E;!L1j8~g z0nMKfkK9RG8z^AME}qP*FL9(4HsvK$xAhhDZgB-$U1SFBx}RW!O!eHXKeMku`j#WG zFT?hK#DXA~TI(Q!t(3`ry3CSeQ{J8seqHh^pLFyN6ijZdPH;69ruMY9_Vl#UvrHhT zA{6bAZ6A}@N<@J?T&^U%YfYJWntB&{u|HQ88 zm(8t=)PPscy=?lmC+-|RCEUO)?>$&mvTfhtd67!*d58CHE2(<$J>}#LL?ihafC}Uy zdTl44(-ayzUS)Kxu!V-HyKb-qxihnAOCivRsPTLbagcOBt$O$<(zqel7>ujb^-~UW ztExxC)+oI*hW5|{=;r{e0dJR33QHj@xRii$ZehHOh^Re}mH%G_N`Zkzj zNwDNjvWoAZ_)uYfoOzHx_Rdi4>^7Kc@s*{JnkQun&+-9316Gg@=2;m6>JzoxLJ;!rT-mgrR<4@%x$oeMecwU!^N9 ziH$WO1b||Sb(fHmPn0lVmqVTgt1m7VhdVZ>Q^F{#vD=qv6JVrDCi`H0(FE} zIk49thDqjnGvHEAl(Bup`!VqA%@My8v`W=zQAvcf^#SAf8i_y!?9jiVoImz)#4j3w z)jOBwa!+e3xVtD39&HqZsJ)9+fWZY`G00>QmLw3r$n0Pc#3Z=T3wH&a1j5pA39yz0 zHZvu_CbVis9MeV!u3#d=vAU=RmW0j&@&jwUQO_dMXpmJ+5ydIkl5)YJ;}=7MBb%%a zd-L~yr~K`v$YdfOdF?9??OEEOrW0BF(>s;Wr7`1qjwrtv@@x8Uqq=6`EaAt-Z0<8L@A7M;?5wkk#T_Ra0kAtx|uc zD2pQws+7n}RbMxFwY1^J)5486GJN%I#Ga-rB3edL6f%+2AOL=MlP5(|t|qZt+O$cI zq*XgM8E%Mxs|3)fbAesavs_aTd zKE$8ir|f-WZ20ecSnqf5%E22JRJ1*I+OJyl>!V2Yv$k?b0zc;8_4dBH@3i0A# z2tO3&`x++c?#|XxtE+1%-nxHmtnmfD`2$lUvj`inY||xVJncec+}5f}P(Q+NGWYHT1csaP@2JfuZ_-=k)CQ_kisn#)RhvP*Ns4Pk}CRCEe~MZMwEi% zqd<69=4&D&8djGL1V}iAuYhC{^}Wssu~i&;Uo?HnStt%$WP0t(kdPJn<@aL2%} zF$Gp_@PLEZ!1Vh&-iggCsmU&Gt#rGKGBS$t-4$&mC2bY%d^&QwD_e_mYKon4;xF#F zg9&%Yzi0CAW$ckynj+MR9bqyN|3Kq})A&1|)%`O{|Che*Mb^?Ro z`*_o50Gu`5&#ztke7ATTmMhVO&qItI-XKHB^fwchnO~@eY5u{fEC}POv-OBPp6kseE+)ajPkbpz=PBUu%r<< zm;ykh{RE}>(pV!0eO_&6zLDQgPmaj>owa!e<91qw<4N)w((c!`obGZzZ~+3*rc0TWIuqr7;aV91~NqTI=4B^26=VF_t?EiKgy=IA7PM>MCV8D4{( zD7MOZbe?QRX%ee;wHQiru9t)icS!>BG9neRA}5r%A!azK?x+_|hItU~&<*fn%p-VA z90k5E*Q6C0W1At7V zuQh^OLtI%N%CS+4b@Dl{=D45J2+BZ5+6bqnq9`b2A+?3%M@}YWhkwE=9f*ovw{onW zV&%G;`8)4=a>;dpW!}NpHxR;yc4B2L+Z%VDZ}?nERC-kvhG9Q1hE4MhB8#MU?{q2?|Pu{h2e$9DHeA8!zwG^u6A|^FvG+9+p;~39Ss4O9r#xyJ*zbF}hES+lI zv32!~3S0R=eP*k@acYIFVcB&@URvXO(re6I^768I_wTuIs5~~irqGy}lw_X1X~0#` zG3=XPe8J)JyU9Cw3cMVPFi`xgU>IGiQW7w|A7lVr(VrpJ!wou*cGikk+mhG zY(9-5D}{)p;o7Kabbu)F;W*Dro;q%wuPKAdQ7o*Z)ie|`q=+Qi$n3TbB_NJ9W4J z4=hgnl&}~u1IdRBrX6NO?%=LBSoX0fTh!z|y^k>WzirD(OY2{{{hY$tGbg7Z@KvT(D+SL(9Uxn%wwRPX}*pzqF(3;lLA{IuWZzEu5w_ zWKJ3#31^t5cp?;`Lzl4$gxSca(ydW0qFzRv;*O+*%0YK1ybQ&Tj@(jsN>~VxIGx%; zUt%O6VW%J+DqBLflhOq0R5NC5mYM<;PCS_ zA8lAfLZ|}5!?_g--rX8<9$rmC^|Pp=KumMmSq4h3_Y<+ zK!gv>6$A?R&f})zh{6()=oR2W5C>)m-!O%zTnJ7M+bSOvsZ$4jP9doqNPB_H3Wfyl zCdE2xXI|`_RFq3@dEfRK_|$ix+p6kCqhj|Sf~a? zgz$?8;$-|5FjweB?k&n1oh)hfebp-;>M+D0G~w3xq@;N1{i=nP)h%0FTer4US1vRp z##^oNTj}y;wb#s~dzBsct=`)4(8`fNVWw{QLHD-F{)?3V60_8^;#-vqs=`H#?$gRe z5r*}lVymhaRI;L(*VJz9II?mis8+(f0z=}izkhZ0rl&e-L=uFn&7|heqd*AH;>Qm#^_|BDWa5uFDzsNk?pm& zxofx77FARfVdHMIUsiQ#bo8ZFmsLy+pPpKwomDy_X%)zn@o4<+s_R;oG;eKcYHVz3 z+SCj|U*BRKMxk++2>4aNLxQ3+w zA`oLDsD|ni-&fPF(a=+lHBmT4$Q^i_W@bR0nM9|tZq5WGbO_ym10u;V$$+54Tw$!o zR3sM@zyrh#pu=WPtbwX+R)#{8QE>S)vuhT! z!0>&O+Xe>OCf_$aeaC%6L-*~NF6Vl3QJed%MX7-sRK=>npPk!KrTlr`{Wo8+c}Y>x zlFe7#eE&RVt!l{4Rz8Ytsw^t1Y>M5#>Y015s;#~1-e*=BE(*@Km~RaTPEU@BkP})b z2v@>Zl=5NG`j21{a18KmG`gTv1;wN)!zz#ZFZjU+Uj094d6=joDGIUPM_Rjw#qa3X zaMR^LYBHkd`DMw2j-&TTnueo;`ivMDMCOEfl7!GJ6$Ye0fvlT)t{@-04Eg3D7%!5~ z80@gClKi#v=gunazwws4h6i^3%j+Lqn3HqiN3Z|O&Vk{(Zn?34_CwO4Ta`a=@40qx z@YkmEu^FQw3l$wwG3Bicr&j-g* zf>uz^Ksbo?1tbU5TjT!7dIQ&y9?%Fhe-h6kVg<5j@D;2UWbx-xCLN>Mc)7tCiBA)A5_0U7c1=2I;aQP! zjI)W6NZ)9<+-TNiiFhUZp)pqcyQvGaAM{M(Q5(d+$JO=wYIE{htMZ~uu3BGzUEJjs zS5<2sswxVaUV@%@T(*`QKvA4(IkN(J61DPlH1+emp^^`eZ#}|ZJ+M$ z>+N=y%-o3fqm_H6DYG|AR{@}l| zg(9AZjjBc=oB6+Wi^Bv(#Nt%8!@YeZ%hma`qW+kZP zzu3g8*Z^d zd3_tE7i-=VOFp{9$f=S*>lFjlon|Mr|KmCEFPxX-+9`T;39`1GI0avN;t4PQzxO@- zO0SJmrJl`%v*}Nx0Obi?ex`2$tm9kc`(|x&j~%9O+C=5rabx$*+dMRJTs7G_Izt~< zvLXCNW6M;ig%}2lx=6tNracl=G^oBl-nr$U-Z|{Q2==!-niY9MH>qm|b>^zjKP1c- zHhjZ=I*YmfO}p$XpoVV_UT23&3?gFhYgjM`v|`d3daG3Q%+y{(yo4a%C}y=RC!JQ<(+dhB&hLB9RE?2(kRekte-)6-BAdo%EKUx zM~6gf;d%U1BznaPUBVlNbxB?wt}iSv3GtP(G8TuWwA66cuLHr`qF}h<4|CaaIcgT zT^m!2@jc@{)0mz`cLno4cT_bN<@0;;Z=W-;oX6tO7}IAO9>6(Z*$r|Yye363> z0YoB9zR9yYAgj_S@I0gP{dotETM}X@f^BY7Nt!+NI5DCmBtsl);z#)x8JdW(lmlGn zN!lco!EgiJsLCr_dyZRTViM%ElBV38=G5bo8+tM>j0P7qi5{UkCb5-fOAp~y3!~Q<>$9r!lB2Bl1WR0eVtfL^ z9Vv$r3$wBcV=b1roFZG|!I=11OI#E@_DxX-Q`4>4#c4^EMOp3)wmid~RaBX@mSPi4 zj*5$mQtqPP$=2*b=~|PcwBGTz*t&*d&B@8*BN# zxiiB(*;^jiYkSW2DR2kgVAy5LC4nO3(X?!Y(e19>o3IW z7=17BzE1#eJ%}d&CE;E(xnT1(HZ(k!{2keq#LKC(ixZ2Bc^_vM6{lq-7>cP&sa4btLopuJ8l2(opeNOqj+UFU(W7&7yPHcb zlhKP^S%n2z!CST&({c+^a?o9N1N&Dh0x_ymmDkZE@#m7$kY|kkoF0)rbR0UIy_Mam zthk7vaU-BH8PK>)0OBM;q6%^ZGnD|jc!&uippk4CH9#c;4;3iMx|G1QAq=y*8x<8>;&7BkBQS;~Hqn;YpO9gTu~{EYkF{8hjKw}`Pq*b3 zrS#kCtMb%N2Mk#^*o(81iu7)ei}E2Fmb5BuPJ{A@B`(gwhKnXA4VbJ66omL{M@fkz z_&|JqZc3abIyx>beJCz9GvU3oO1ve%(-NCiP!#)!y*>AL)VVB0vSjAyBb1gNE3Rh` zQ(UeG^np?Uk`K`PX#{RC6dN|8Pf6Ot=OYaJ!}e=xhhnN4Y6w`0czmzooFtzLK&EH{ z`waJMR2p4-O@$2&b36*x_*_JfgiksR2D!z-CK6==6F{_se=-h*4$FbT#N@|OL7|)M zAu(9Vt8MI({L0`M}8{Wo;DR^P1r3Opq~mgK z0z@RudX`w)W;DcWC|buSUlS1*H#EeD(XfVBfTC2qqC>R{?S!stJY7i%!LEi>2Hp6`5XR4hK@dg|h5h8$ITPJ^pnxwRJtFJac zzt(3>PfKFUjh|&$mAkDOKg_SK&HrJBl`XSofSbmLYtYq9%%5kA$zx-v79n341w>(U zHX^~`LmSx~{)59W4k3Xor1Zp?$55+N%x{h|tw1iiE}GliCPNj?axYBHjTo4csF~_} zDcNX>aTH1?+C>A~^x;nq)|)Izxg}{iWr=ZV@#Pm?ee*fP_w3zPZjLr5)Hv)#*-7z} zzVq_?+qy2CQ$sqE?#;8SYvyh?t?1Ztcx7Bhe0s4X(V3Q9WNTa8?JAyr!Q>cQOu8c} zyU3oIvHI{u?ZIEw&{KGtYg#tXt$`&?FZ-40dD9Z;*c-WhAZkda{i<;Y$KgQgK3mzB!5+vcYo#;k`W5!8x+T}m&B#tE$V$wx@4EihovE2kl?mx_W#_oo zZInKAww7n`dudya(pt;ZZ3{o9I2{_aAX37=(t^g%JnGsE+&+#;dK|Vb5Xj@!28rf) zjX81kWJN%c3up^RF8X*P7o=D-pZq=f-^jEikwbf=STYDuD@|Bk8^E4}&kx`a8?2pW zk|Uy4ByXyOttJ$b;A+fpYJ}Kc9gXY>egbw7-a>>cViZY$FHhTyp8F8Z!Q3&2>NlTP+NwJ0mT96~d!f(G>hUP8`R*eGnBPr~_(<4zd zB_*b89ms!?G4k7hY{?kCliVsTJ~qsTe8|5(>{A|99>F0g!pPm#1Z`dr!fCJaD5Y(G zgmSeHQF4!A6b=~xqOag>B<033429ciErtwb8RD=vm?ZumZ}1V*c``ZA1|RW?AB!L3 zgoJK4FoA6`A2MCdSL+rkAxgAC=|lg_AWH>-cV+hONP$!k^s;wNh{YV-VlW0xY)5d5 zF(G&a%)0qhGoG&1n*UO zW~y&N&%!3TX<<)6RmE?9Q&FV|Jaj9?a&=_x+Lh@rVDXBjt3hyi9E$Ld!W-v*2wkqf zdDZZw*x)7NHL;V1S2cHSto-1E%8gw-Z0o0=@=&e?eVNx@o7wl@-U^d^66VbRx3|Iw zt?vJ1E6gE?(qL#TWQAjnem+Er1Vdy_9yJ!UzO)(AZVifn7Q>+R6+r609i|{i{C{9( zAYJ4C1FZl(`yXya-kEUi#2F#!Gv~{2?f3~HW8RR#nj(K8u08XFP|P|CJ`=J%%b5XP z{MV!zsPy>e{PRi1m{#P08*Up<`6iCWM2ZK=Xrt9Rj_!SFsC3`+iLu2vNsIZ7VJetT}jBU{=wiG))FMAc2YkR z7oyh}%=16O-OPD(CB$}pHx@Bb?75*zS;Q+U$>eolxI~uTCqzT5Tgp z@fUUO_{xF=hiI_gw_k~>on?=H)t*GHARWM}9#(d$XAPHkk;q8G55qS`kmb){PN}Zf zwW&bXtPoWRYPhklSc;$%uWwQcLLg{x^W~+`jKd#E>PR1tzSJ5Ng}F`s$7;731<0sm zEK*2D^;P=CDC;Qr%j-hck*LENdKVVc|AgM95z(9TWn=UO{W2nuxq)8L*X$QA=H$5O zoAisC+L_ko<4Y08!0s5xjeuIc5o&Mnc}PCSTqf8x?ah;T|R zu^YJ`nH9QUrnX#DO+X!^`j^$RdMD3J0w*Ifnx@da0WRuRWW8w>l|^eV+cV&M=!SLK z%o*^<*pp(NIdB0GavOTx?AEN=t1s!Ce8sw1=~F|Q*p0I4!!P=&nIHx5-Imn=YRscI zHL7iCue)i*-Z^q?l07DHGzP{l9(Qj;E~Wn{Ip_Q?m!26O;u{iILgWcP9}Q;EeVQny zGw52B!61ka2WJOoi#T(V@8b&fl?n}3$e_~URo#r}RDw;j=hu87FlW(wpA+zrTmNvk z@bNkVSpxK{t`b2sOdgdXW(Inp#)e6RPJeZ0ZyIggGYwk)Wt3PdHkcUJREX^Qhd^VzS1o7X~;)=*=Q|wB{SA0(U$D0fu!sq>>tcY!OCIC~kO@ z$*0gr<~E!d8SmN0#=G`SIAI3+s<_z+-YDe+`Sa?PKHDvgF0>?ng?Zfy;bO$`ybmpd zrwu}R5&W8A2M!-CZWlvmOyrVfGQ*XY{AW3YQ${WA7V@$U-LFq`6sAu22_dZYRgqRw zI5>%lG)&6Uor&vXTIZ~t)N=lu)|mB)JC`bM=%WSqEXc zXv*r&DMO^4nf>j?jJ8~LpOh^_QzmaL@NAq_)iLs~<8(Ic=y)ZJ=r0*)%*|~aDABfT zYSm+Fo0s+#74oe}AKM$=2Ni^d_pz!0xR}oQ?O- zr{jK4da+g8r)#*^y=HRttc{+2dDr+iOXC$v!Pybj;MD;L17Z+^L=Y;WM;I0ssaYs< zc!xkl? zrQO&+%TXVngYxWKXNcBml(zi}?FnU8)aeve9{-X$QfFQJv#;$}s2pi|Kh!W$0wgws zjRcskes%m}kiRL`V8Yi%1*DtS>;x#5k5h{c(+q#*0dO&ugQIc7 zAlV2nb~W;-jjmEkX(V{&A&_w1TJK768QmX&D7KZRF|{%9#P(vJ)?CnCB99sOeH1V_bOFX2$bbT&0xT*D znUkdUjfO|WkApU^I0PSAckofKxjbm2khLY*x`VaE z;BgRB7gfYUl3BbOO^q{@spv-hxycZIjA=d0V7VEys@A|HBNGS;1+@O<{mWwmL4A#2 z(%b`x3F8R1w+?X^ARCb|8U-1OM>pS~2lRv;l4=rhS|D%2>DN8CjyUabRE~f^++{e} z+TcBd5=Ij1TgKP8L4j5(%tKH4^{5-v4>I8(^CQA8;V$8OydPl8$3a-N-!>yA1hL*6 zb_?SvB%4@Bt0xN4N8uyv*ueC+F`k0kaQ+Wz;w9u6CGA5COQEFkYM2FXd8UO|058vA zUBcBrxDzucRprCM$P+t{fL#?~H)!~kb5&8jslRj6tZF&MU6*4ri_FxD{I%YavYec) z2VPjc`h^2qb8^Z`yse#`ttKX#O*wV$6uElVrp}z|<|UJhxQ4@1S)E|b+2h?&etv7~ z`Q2OIJhKRj0^sQ%CuYUGhL;CvGutTh! zv$@mn&uyu8MLF8Cv80MMn_BOhJ^N17==|0m&+E<~z2)qIOZ z$X=ucUZe&?J~1RR@G9@IJR}|)E04Ky%ry$hng@$=K>+s0ge6-%l9Q%W3_p+x5DS5X z1i`Z8MKgyrL<0llQP?+H zXdsj%Kg9hE*@z^>gTrl@teB^Ts_26+@neuS9hVIclvh`mpX=%E^?a{pMnhIs!;G49 zhtEBCI9N{S&ZVo$r(>>&a|&H-?=^FR-jSuc(IQaTG8zT}WXTNnazA`g;J;|CtV08))8ITS7@^Z^P{KjsrbdE}rG!T`lL zDiG%Y`M?P1$Y~%V51MUW?8S^Dxg3b{mKwDVK@z!Z}oiT{zLh;!ffvG!q+{+nQ zea;2M5O;H?FQI8P8yEy(a%y@SgRV}0ZTv}6_xpU9!u2IsUOLxn+awZ&+Joo6FS(!kj;h?fz57s%Gmoqv$a-XdVR^ze_?>^?2548GsYEgp+`ox#K!S=bY zZ%_p_X28vwA3Y3N%6u;`F?Vu77NwD9{;aGi7tSmRdMFuAQeWRE-rIYxXm>L~4Jo*OqGylAQzePHoJ+ow#~{?KB>d~HvxphNvMZBa->Ii)B`dmf=iwGu;7 zs<=LZ7%fwUUPR%QsUxz%|E3Tb3?OM81-NJ+IVNCJaz~$5q zoy7*nsLoU4?1lxGO`d$&f(CtSdU)g^{n$81+ry)TB{Y8#wBpQ>yA9?WnCUl9U)eWs z)w91*0(2gf{AirQD|dVpYtM**p)j^w?`v51u-sbkOJGN}>bg*YSAsHh)05S}T;#J08hI2hHh9etMAWA`0f{l?|a16>L%!2HL5>!A>&`Eu* z`VoK)ICCpP7%+wJIY}JOTSZxPM0tdOn`5s)s9I1C3Zx#Hxo1@?uM@RV76sypNiRl= zM}RwM8|Fqh;H#<(1EG|J)>V6EQYY|&Ned;DB1{0bQgdE{FH|EN!|xh$4`Nk_Ruh5N z)HTk%W%!W8A0%HD4H+ak3Isp zbGZV%VGy$s4l(e-0CI#tL1j4G!Dy1-4;C<5%B5_O4^75Rp*<?g{rR*Up*mYoGQq`8?iz%;Pv=73u&%`g#P{o=M*eld4Aodl#FLb3fRK>+6osLS6O-PO@@in`Lrght6(vy(jv2j%mL1FO7+_b8+x^?Hx?WQAtd?H9ZNww$ahi1^HHIWlnrzVth`e)0$rp9c@#BNw^+UvS`#? z(q@PMQ+#E|jD>4k2bK>HHl$S7)o1iyRevPkm6ThNl~s|OB>44-UK^3Jtc$_UI;AOv2?!j%GBFMlz8Q_pA5wig^ z+6_SBgpcqKN2YKthMNs>ftWEM3mRf_uwsn5rfXt=Ig)KfOi(^A5tohFTH@x21q$&5 z#HQ19r|AJ0B|zi=ujX*4E5Y2@Xz?@5F|y(Xo2~1H!dW4pJeM&qP!iX<6hk9S8C)?} z0d`zg0SMx&aR3=1Cqxpplj@Aa6%W_O0TmF;0g*@A2RvJ~r)W)$k_^Js1NVNrr+WEd zZSCOl>Yi`kdtmCsGd=tE?QP5M>nJJd=*w=~yKi4l_s#qEwCiWu_w2j5J9K914}SLM zf(38>><3fzyAkd$t32248CuaAlv`H}dF;96S#hCrV)&dK1HZTUl7_B=g06;=ct>%1 z%)~RJLg*a3rFEz}C8c_(RaqN)0^NkE4vn#KHpl81JtSd13FHp3-b2AT9M@~q#0_lO z&HeXlpsGULN0r+V>ub3*sG!gYoKT5q-IT|`NUl2Aa%Uan-7#{f9mL${9z58D{H2pk z(hG6XQg(F0=%<-Od@aX0qv_u&SKf(F&9r@NiMmr)1R^C{P%ajJ0`Dw|l5U=b!cMsBFv1%R*K;;O+9-R#k;M zdV-u$7XZIB?a#4F?bOCdlj*`?i@W>L%N!$LZytB5b zxH3n)n#m(RT6dLaYkE-b&FPXN_&LMOc`S zpv$PrD>ze)gtS~fL2@hrhPEIf85fsruw)hI6CKep3@1dKj&Lamd2j>fX!R0e&#+G~ zV&lVlc4=~gB5iBRuNbJwBqo|T^XPdut!gG2WKw>TMGwiD*FLAVu0Bt>-|gzkHpQAE zOF+8jp-sK*uW#?`%FLS9YjE|Juz~3$F%2y?=Bz_rYO3cR2~&kzihBIVc>|jZ=X_-;W<@5^o;(a8Ff>l|4|V+?B{?l_`S7 zqU2gEOmNhfyB*0!_M|b{;V!Qa?)h+lwOLz~)-teimf&AV)NK^z-B7Fi);K!%r6pH> z^7cbbbHLVszfv>t&}(-bEuH?9SCOx}OjfSA?5fTk9?yYNsgFuMP)^dZSX2LKB5sJaeq$E>Seycd3DPBn=hNOPhK^( zc;29I`5NS@x$DWLQ*Y|A2ov9>zW0K-MC z7r(jrvdt{FuK1kQ^35|SCC_rk_9Ekg?5oMi8Q;@0fw$L_3=!PY7xuI!W!Ag85x{F5 z+tDC^T1SJ4;_;E}#9u-CQ6PThPJY}`m1ol%Ys;&0h_X)QS>mcATRT@TM;A9Ny>3=u zOXs#DtIB3wx3qzG^VjNK(ik=6=pCHXRFxksT7oA()w@@GyYQ;-{_KLi%4xjz_-60n zz3XyKe#rGItc zHH3`$lC}4#z#NeV`E-p>zWd1~dIuBPE1t4?$IUakuV`%^xOZsZ=^w5m*ahw2JU($8 zKIlR&h{$};HIl?caE^@krz*HXw7}2F{bVbIILnUZ0AJwbAbnX%F|BDSy$llMK;DaE zD>hhKH#+SpYR(vay@IVl&%L2<*_N8Qbe-czH6bS7om=Df7565#%~)J3CDtyU(Q552 z_MQ4a#{602znv5KOHMO@PHHbwW)_K{H{B!GbTfILICGvMv_6V>ul_o9-6T{iqruNS zx)?>@dcjOs2*(2&21j6expPVI;vbYo2$wZsGBjPntlH#KT)R4c>M7h$Yrz= zeTzTX5s(!Dh&srl#f3= zTs&hIWU_3BumhPlNLWdl4FRkK$s>9CDq4ZE9Y$eCK-g*6N%CUKv25I67 zerZN>m{}=Ef|YC1T5yJ>`<%s8NrTG3gf+D+HHl+0)hxkj!t_icJXT+q)JQrQ_RGO} z^9H>g-Q69*YdU&*I=pmjXy0|yO}l(swr}4ux{7{%bPP$0Y@7?M0UY7&c);s@phNxj zs^?hZZsma&UsN90?c2gC4kWmPyFxvwuDw8+b5O{5(;-0J>_X5AP0u)1&H(VF$d za#SFV2dE9_rc4+QvPpKJH54F2H9!VuN!%joowz&;Tgbk_ubc+gNIA{L`ub(Hwae;7 zWQJ779kOOF8o*WD#{@2Rt~sx^_PiQM1yl|NQRom@+<3z511!bk%>u=hAhj;D+N_P% zLaXtFatvwD-KPZ~HphHmehwZq%E-m$SKO4=!bd@{u_}Ub^G}rT9}LO|mG2X4*sS5C zbVNetQU{L9(E^*x?1VPeUMrz>`Vs~bbepq~vVAo=p-nJ_>>Gfv{ca7gj{k$!X25QK5QaQN4)c7x&v!l z9fMLVzDgeDKV%Q)tjjw z13!4~ngK;v|6`WM=CEBqe^L3i@~WadwPHfh({WZ|_k#QhZ{Ic~lf+pW+52<03k9V8 zc)h&hDMdjU-+pnT4Jj~%#OJt?@`mN`QTV(zVcLwH7GK;3$)l4>ZTltlJwxS01MhK& z%*g`p3#{+H#Kdmgo6qnjM#@k#L}XZxhv86Lg-;0ns%Bb`Y#yJRR038yWSO99lLcK5 zP6B57+AuHCq{x4obX>rUX-EQOz9Pe9Bs4QVL+i;8KDx! zJU#wVnwfYGS!mSf_*3C0B5xOXYe;HIGBCQwiYNI*$Am%=JD6-f4Oa@6P$%?+`?eGT zLd_KV6OjO&s$dKGVIlCLRSF8B1&TiHDW;>@v_nU#E6XmK!tBIxjmY%N?1MYzLG`QR z%~4f%C(YC4Gm^=cY6>CKX;)P1jA_H3gHJCZ6@rStsn%){EF@v=yh7g5PBawFv=%m&Bo0m?oVo0L?hf zbNU2x8Q)607%D(H0I^qm@Bn`kTO6MR^#y)uk4}fZM)V$2DUb{wiaDfGECGb4$3Hx3Bb&?blFW!-5 zFZ4J@kH<6=viY`5!;5VDF=muoE?6{>5~wqnGYe@v$(bz4S<+l`tW%7!48F0pdDHnz zi;`pF;-w$OOq#W-Ij_COWj@-tz5Byl2YbVF=g{D{JCZuD@1J#`fAkd=o#~!3Wx&NI zr{x)=@*KZt-%#Ca$g~A&rDqLfy{Soo_53?(PR(L&eM}rA&>?b$JjOihs?GeV|~xaqy47^<8NTT zlF%$a)7N4AOUJ9QIVG~qnH$p4(H=P~l8ur6CD1{{V@}@5rUv95ck%1kBP@sy*W)$8 zDhLoktUFXVz~$|v@X%x_Nf=5>@>7>Y@wmCt*vOy?m~!3AmoOU&z3BO?2O`t(E`IcH zH|4E=`S3LhYPfpXw0AEvsdOJMn!+CC^x64 ztYigFVLYNo7cT2tU8+n1VF-woj`H^4J52cFtXtN5xf)666(rEfu;G869ezHzs$R%eE$8HPBTrNQ}4S(={`fpaiPcO_Lb-^ zD>BM4F>`KN-%g!1cmLLNEZOb3v{+L9GH0r3+NJl;FTZ2n$ns8_Aki5H!EWsSsH1ZctWjA|)DJ|{+h zb{^*$^0GbrhEWu%bB^Rz-qVU7y%i2_{n!dkk3f0^vhBi3o3lL-DX5Bm_|O3JVCHa9 zi!p?xh~_ag#{hHw&@;q1l9dVm_^;XyO-(4hPfa-~v-i{TvmFSRo}Hg29)M{KD0hHR z1~N1Yf!v(R;^LalawQiQ-;hK~9K&Eu0SYF|YM*h1w6wD1U(S`xVXJaAt`4x`vA`9LMK2R{20V*kmpZZ zb|HS!N)dT7#*jXJ;hMUh-RpaM*YED>y{hrFQ0zUYy80Y%v9`4cs}6R}`Nh@vO)g6t zxi~64Bh6AZr8>QAXzSFeTZhVuON_@)%4t>oRrpWSw<@%8`7y1&NID`AEi2RsyIf-J-UfZWPW67=yvGp+fW%P5>iH?$gA73uZEy|xHhDxgV4P_3@Ut>D{AS#u?+He6Hz2qd z5Nr_^3(KJ$yBM{DS+BW}tk=P~hZ6|!xbq=*n|O%DxoW+Ql>oydX#kvPwbTLaP@QW5 z(9zSOxYStFS;_jx?MktuDJojS;9&V9^;f+9MuptTl&ngpjnb}`xs<=h#1%Q*&KR2` zDLyIQ8gH*I%5?j4Y;pD&WDW3VI+F9N9Fs>W6NT8ERjBMxP9i~1Q+avN&n!u<>fFrg z{FHLjRpqb0UM?%A84J8-&MB>PC?{zV$1LuKs4gifhWQ*tRnFk__^NVeQhZcWy3@WT zHYfL!diSxM(!MyGv$QPsSmxw{PqJ!|+qp1H`i$Nfs2!H&h8XF&z$-6g*A>}Q@~bmn z14h6An`HE-opZ(GI1ExAa0|>*j4vU`u{;-H2kUswfe;t-6KnHFby9}eC~+2XI^(&g zQI6$+wQl457GNNfFH+erTDN1?m@h|7!`Yy_Vbu>RM77`si)XAQl4sbB?na~4Sm<^d z&F(0Wc3Rx>fi$YTs2j#9)KDa zRzr{>A?`6*=wfJ8T3i?+QItx=9>O2B6mhxH4*ProYozx{3IS=sDTo=6f;U$VaH#=_ z5lo+WgU6LmyidTu%*aIyfuom-Z_<4vl#uBjgP)!secl&5&fsUK6HQ}VDTe>71x zZa4*dJ@w`6ILD^KQS-+pnaj}W{pzbR$~;Gp*+~X&kWWCkPOq0v_6I!a75ORVI9u#% zM%g#o@KecT6s5<5Ge}}*S{JIqkNZ>dE7B8-3S6>5xYC021HFR zGJlK_AzCE>?_s9kby`wYH}8Cd00ivOa;ciCWwtcb)rw#C!|?kJS*nKE=5oDb!P}x| z`Rq(X&lX@EuoR`c!Y0u!yakR8^d4q!tfvU(7$~+tS5qLZfpg~(+ zWft8Fvf47r9!&(H7faE&NSqR6pLMTj#?Nn7-d>Lfo z%OLI|sGcXCu@+*28#uymP&1sO5ISoN5_qG6HJeIv2eB(zA#5tY}WF=q^j|a;eu+odwR+1a?b8a$0FaUvy1RLtS1%!u@nu z*I$Qwl(p$uso-5w>10YmUcK8^w?Mw_(8EVe!f~&1GhTIEF=ygEyvVYi3j3s$dk;VN z;)}k{1?TjY(d+42UPGBH$B~$vpsY=(XsQUFvbpQ?5>k>;EDkf%*)4QaW2t)6{Rs(q zbq(D$Gaq^Q(5>6&*PcF2%%vIqnAj(6wPXl_pLs|!h_f8SsQC}4!j?zn_H}T=+|q@C z1VmgM7$E}XS~m`RVI;usSJwda1aa2&;;HkW-#c{9wa={6w(Rds%i%J4{hIcs<<||< zR^@6j=w6+b9|-dK$1pUcc;4%8KvV<1iY7=DRv0iswxbH&J?p9c4pvb5X?z^GvkvA{bbxvGX!5& z-z6s6Gg9OEYJvE?Q6aP&pPFG$6uaEM<|&D7GZ)oKAJ#3J*=n8A>>G*iSe887I5InV zS;wYT!8cb)LO|ZOP5G4=pPXuoWioMvtHdgCRje&FIe{s^+O|yllxnO!Iu8f>Nnn~p7GbezF{nB z>27i>(IRy8Z-6WO%-z)8Qeu4LuYa9k3cW9atA`T=X*O%4L@pJgoYxUwqhIulc!K_; z>|4ed<)V3;eVY%y?0x0nX77dS*0&i(;rh`l z5DtEL*=;P9goEYBlu_lS??RXO;d56H3|#%(hs=2W9%lK&u^zC>CLwr2+2>{ZL>~l` z*YrmUCYL<=*PHSVDgX8AdhIC)7^#dYyMJ^kOHx$23C<66Ge*-sgO4D~0uU7n0OsO< zAY*{S|Btpe0gS3V_lM7WmYIa?nM{_+I+@H&_I)MWWPt?2nh=(RC4hh+JA$YP#|5P- zQ~}XqZE>p#MQdBzT3el7>$O$uz17xQxm9lK((Avp-dZgrGl%c@yyu+BBmqTlze#4! z{+@Sz_656EzyzRUAZ`i*fJgvvY7!)TaV#3=Dc%PU7f1*acaSv#s1%GR-UA}RuwMxC zCbx;q9j(G(|-cs968p|CGlia<{P|JPDb`F}wvRR8~bUG(U9U!p}A zx6$6kNL{ch7{0I(;#MIT79PDY?CG(Of`=yFf&0%@@Yo|T4Iy(8NJVl>^{`G^QVOR= zNWj4Dn;V%fQ9z0r(M$9P7eE+D#Sl*_!cDt&-4t%0k=J=yt2NbGn3j~2?zUPoin8L# zAj@}NAlsVF>u$I!rf>h{lS@l%_H2+arBiE*5=%>9OJntaPkU|89__X7gO6C2Ps>X4q(>!27R;G9P)U|nXSrw5-ArD0BWwCm)aX)g=|{ksFyP)hx_=ohqk*lJH07UlN+Q;F9dbmwZQR>tK?{V^EUpVZ0#D z#zR!P5iWtgh|mKkZGGQ#OeN=3tI&kFk+fELxW>Rc001!CVgdnLuwUqBNvbGct`@A? zw!7`J#gM>+B7GPUKkoB`IT^vtcoZKX0KNz2P2b{J&MsJc?XBIkg6dWsm=EJb`fxmf z?FgpJ{0F+#`Bk&)GQosF3a6S8O3W>XKlBiag_#l!KmDRJMb;;{Ehnv~1O>PQzFV+V zqU1i{X5st@@$^aYBog^hj-S3@-++}u%7~8#dj|p$B+Kp`hzNx`8(WHfAklerneMA#ZjE`{Zm5%P zfFOP3mVte5`2E)o?i&!J(LM#o>@A&xmj!o0J72#c;<S{Z4jZQwwiNCu*wQI z-iQ!v*h=6K_l{O%@kzvAPJdkslHkPAm7kYLV*TSIKDO zr8}_46Hua0tbSfkfqr$pRA&0{U6edR18voLom_pO?m7MoU7R_|55mf3#pgZ!SU zZ8`GGD~3PKsVwr?ExRI9>~S7PTzYD9BQsp)YJPn8!l-eT(7v*5=t z{_O^lN+c`n-o}!>;kxtD{daeT)iS)sz+Y;+zHI$DtxWWZRmBJsq!ZjaMMjQGe6*zyhoX-M+3v`K?j)o; zBZcpW6Hj6LESZ9H7|u)K_v`x>GATsthp;D%{eT~{5KkI)i~`-$fteUKuMuH)%&Z(g zZ)6{dU{wf3eX4KbtMw*Kd@-+(?9-oPK2ez1R=u!u7p*&1r8xs^LII-7^mBc)fzWlu z8R^@(XDC6XNT!1&_<)Xjfs(@{XWkL@g2P_mG+lnc&*NUF>04?%9m((4ZKF))nYJqY zIDH(-XlJxD9CG29mGC{ykBtq#fKE1M3j#FTv@^`6-|x54qY7Q}+2}5SFx-VwJi0iR zgayXCr1!?&pg(l(WOzyRxOPT5~t)CW6!M2EX34ina&VDK;oj2Mpz#;-YApK!7H^tZZ`*l$0*X>|XSz1x2K^xYd8 z8#mnj^l!I??Q2yeQRmJw;~vl-J||3g#CRNZsv-XdyhUxT&~=c_8MsrO(A7-~XyI{m z7*aNnC8GWXh%ty&GfpE%j^+W$v51l<`Ie+Y{D4nVZmA=%%Tbz}MCg)^q?_o7bm~Oy z2QctfHWgC&$wsZ5yk2#P!5OLF}VY z2GEfv(h(5~6kL4d=H2^@IFc-m;ztfpBuTyBxkiWjJtnN*LGzLh1r+$GVApIURIs{L zG;am?+>k0Ka0Xp%u1UQ`J|A%(=zYE4NBV-VvDks{ve$yI^Yx(Xt@T=yHK@-=q9z4{ z5|-JuL-;2~fy=DJ&$1tyXSsC{rXSapSwS0=ER0gg~BGDG=48`#%NyXz`l8GVo zZQN==07JtS(ww7#$V(vh9W#r6!5TrWjX8uJegg@~WZ*Uh^8z#1m?crLm|keS8SI)w zJcNNW5M9a?p>tl|nL-Q>?5Qc?t2ue7x0^xG)=`D+Fj(c7MiHQ46;KcAN@DYf2OGm( zX#Z0+P>LIysDs35dY!EVqpG=yXf7&_h5KEHG@fk>B-BWLOD-Oh4FHE`E&}Ez=zLKits@F zkfn#@EQQjL!l1c0d#KCqOq@I+I6gocV#c8ZAknsyEvNMCs&DOR8=a7CJHEB5q`NZR zoI~lA-P&)*G0Dme6ukr$eEF#nA*U@{{LlQo-+pO>FKilac*Ac>^SI!bn9p;os_efR)8^hjUGskW*J4!qnOOJ z26#MO3?-y1F#G^g~@U1)T!Zz3Eo>(jG6vgUI|*Gm;6! zVjc$6OlWpXZw7OW^V%`2^+yr1aiIdtQtHUc2t2K*bZ^K+4XbswxX$T8q!Avd1M`x@ zX~2XC0eQK98-ml3Az5-PJeRz%Y9J|11J)?vRT?6bDkN6LlzCFb9qtK9_?|;X+=%Xm zbfzvF!Vmo?h0-6BafTj!j}X3YbVzmOz#6IwlKauhF~8EGfiouu`oe$VRw-CRx<^`9 zQ~>oAhKFQoGGD^DAeZom&xHMkwYwv%-74W#E>!Yd=p z7VUUQYEwhXY?4{QIQ4V*B=lSjS4hcNmvCJrgLaluBl?SHPIgu=+}d2Tu4G_)eouod ztFpa&y0dJ}{QAW+D;If7FR!gw1kc=s;*pj`t)67-q_pDpB`u8$Tk}&RBU6hymem!t z6r{#TQgli|Q&CB4QCf^7N2e9Ei0^<>YHEDq&9gV$tG)j}CrhqzZaVzEm;P|&KBoNn z`EIdZcGmZlcC6~iP0HNZZ7*yqDQ(VAieU5QtWIC=)ZDDgGE&lO=hQ6Tl**nin7U;3 z+VYAkE??SRSkO7Ja&>9trgh7w7X^OgX_?(SJ3DJme{WlUep}yy-kj{&b7wZ?DZepn z^p~Cd_^@Zw3y<8iq+-hTPha^l!GKs{GwD}A8q(|?JwW*9RB#^vT1vNx*gN}<13%OehTKY013CM_yILcyFQYP3M4`{C7w=D zDkSC9?IH}u%wl!%Xv@?SFs7hz^O*Y~DW?o;Ly~lkj7YKx^JP%jCWN-i=gwlmg+!Vv zI}RCU@YVR7coVW?H`8UJ2v?>`aMq|V^pz9p3w z>Pvyy0aXD=uhsr{fW=E?gDievWZOk*9lV-?euCx#M5Yhy2;&E|{~a7;aRb4rpH+E| ze+Vvz)ty5%9!U}~D-H0OtRx8v$pGs*93nqn1rl@}F!5gdETmDIOyf(!jxX2-dEFPNxw7s{ z)e}e?@w-*jvlz8BnH4w+e#XpVTwU^66Gm5veE!Hsl12#d{1s4hF2t)PE!%owtFTMB z9kns6+pIeAN=_X-1`B}&xOmV!HzU;MjAPg8amkoVi?i=oQz-{ zCmHQZm796IP;EnlBX;q}hg*v$rdX3gs9S+s1~ zBKB<6q7JXOeNk1_qIPd)gF}>)-Bp>HRqkZkMkGYU#YsVmQOOB0&R_vb3FQ4ijt&$P zJ0P&H{*irE`+Ira?CCv=mVBIOwSkGdSYPUiH8pRdb+;#gP*Tj_46Nm zt4sS<&$DaSKHJkX@ZRp-?+pZJc{=nOP)(Q^7l#*{b)c;*IvO4&(a0#BqiV>uvGZqI z7jkdB_@bDZDy{WT?-_W1_xaX6?SoG|i1*#0-SJAB+A1&^AUi^kR3RFAI}toBM4>Rz zOM#EXQMP(eyH~q+kgeiBY}KIT)=#X~j^Zp%X!qhrkg*hKj46J(8&)>NqtpOBfxiM` zvfDt-j0z$^XM;0Fm=eLubIfZN{d17)3Y$8EInKAmnq=9$Kg7l4ltWs>0w#208 zq#>4*?Q@$1_cCoq*2r5 z7uxAyFe+AJkDMl76p-mH?e31HljrSU-LQ1w4}wD20m%23cG$OrlC-L5Z#?HDD7Op8 z6c>&%3H(tYhKHvFYYMW_i{J|2QH_2gLj)d4kU%Jju}pnBX|$2dgwL!{(+8Q`TGM$d zaLUlZV*Kf@Pz*U=$h6as_JlR{)TyeRUY!*oY>kmaOMHCf;y}yyj2$_W;@LQI*3BD8 zEyOVqA1|WjO;kkL3Q6GMbsA$u74wlXU`A18QHIKYsUFk>6;ys;J2BVc4a)N6qCul$ zq*6SCB{jtzwIzi`X+?bFFdv|jgSrEeF^H$M?4A})QFkTnG&F}ku1WVpzJi*-Jp!)%+~WeR##=r7 zE%4>{%YG{a?SUareQ7}{4EIhuJVg71xV$V-;O!GzL$H$z$Kh&DjiQi|P#03`0A$f( zM2n;sp{Akc1=OOv6bHqMWTWvQ%?6JKgOtn$4`r9a$*R3XZ?Nk1#pw|t&z&|IUL)$G zm}A^29h(sI5j`RJU{l~H&!n+Efi{qMe@ur2eC~8oid>*u{ON8eT`U7SeM_)T<&;c; zVWmLppCB1&>&YQG1-^*{&bVn1Qj_xepmX=iXgC7QKr#%`xnj~5Ta>{MRrSNcfekF> z-g{ZfhQL)i${*C_#&R4PVe2_LWgmtPqe&?|NUBLj93&L9!c0$MGkDb~qf0TUQMkjJPX(txW&(F0BXe$)zspo2+2z)=v`nae9eEh2XYGHa)m zWwecqUQELmbD!F5`Da#Tp52~TnRV`Uv9fEggqM^4>Kz!JKw1+G_?f9#~AML@2 zhvGkz@ehTD77o z!P~CNi%W!X+W zqh)?gYHH2=7Ds(fb^nx_MD4%+XpuAP`X;B=p+ukHv-+_f(jieL4-hLtxWVeyYh`s_ z`eS-#2E-uqcx&tEJ0?McH8}+tJB@EjZ5{IY7+<>A%99{y;4A54Zkfst{n$pWSh{ot zeP0gG!tio_IZLUxxG}jsk}ODq;?m?CYso3IqC`sq;47)HV36)?uhk#+Zd& z#0C7LQIj3nSG9C@^Jo$1DwM1J-jiS0y}Z6^iQB!Ts%}MhVZKK@@cqmx5A@&=bfgp{ zd#W-U3VM5!;1~^>tf@1*epY#5$Hv)3Q`;1)X;o%!FYGBk{1hJL&@3o~J$?&LHFYXi zc~;caTvgGw||g{Tq`t%E?~_QWb^q1ym^pok z5~L{cv?an)e#*RJY*~7A%qA^@uGJLI@|DL#Nq=z9D)i0Rojs+uvx#hBiRNQG`vFsT zMv$CX4~7_Ck{+W-mr$SQZySwUW)ilrSg1&0f6(}4M|nqnI-GSZph5(z4@;y37-thA z#ojHPKrdHDiz#FzVbyUBpW58ykMOFFaIj98C5v>=&6w<75^HituohMgJqULqqsZiS z6n)d{DaJVH`LEHj;JK1vP!wXI=_PvNWa#3J^W#%wi^6kkJ)6ngR~1ibOv(MaTv;N z(Ee9@MSJ`SqBL$e`{&;cRn0F+3fvdospz=zS*gb#M+k$D{q0aqXY2Ch6PeY8nF@lf zCY2ThznxL;O5)y-2~oM;f-MzNcs6YP;v>s#a<>5okW z!JCq}?+^F&lle&Hl70Op%PLZQ<^Y;o&N78pbmCZt(aBZNP%goUl2F1)1X?am9hec|iE(Y%47-r|NS0O+VcJ?A~ru zm)yPgr#m#Eb^F6>);zqu)s*Fmpz!Dc>V2|t^@w1nsJIl)M{K4y6OcP`M3Epdn&JCj=2$T$%PZ+cvvFDfRnG7z?+OCc! zA$eMP3A8(5{ff3DRu%6dVw=!$V~#)5!GHfn?aN@vF7pg4&0Cgr+k?gS?qyrpefjnE z`L^8j_;`maSQ2*d+2H}m9Pz;y-`h3uWq#8pUnOb5M(N~`jzqR_fv|O7ul9Zbk zH~yF)u+f7g74-lDFGYmdCkZx~PVcn5F{KO_csk;^p8Cy-e&eP}=7Q#3XVZ-x0fRko z)gS{b3zt8e*eW}xX*|t3$78w0K^rC6&>91av*SNUV>Fd2?=hEzXdAF=v zo4s`B9lbth>*B_|Wz~KeeXUZR#{6iZW$jN&P4cAYlxN4sXP4)sdvIv+8Fr@up{=Re z=WA|i3)z2;7-8v*Fm*RZ4b0rWYOrphFW+)wxFu>p&3D({aL2uKM4`BEN6(7Aw&9)~ zeFz3W=iWPRsCDOKAUVCJf?G_dQ5~zix~MHD(SaA9X2hPEbB0zO%DlAI_SuW)B1V{> zy%^337c(8DcAK>XlmM|nf8?5m5EGyk&ti|}{-~rO3bG22B#2Xn1cy}#Zp9sg_@_{K zyIDGefpkzHV+o)B2TIfrYQ`h3U>@y%f^aXS^pj)(0Jf{^etZsm^S0pk#F@7R9@Vng zA31fZf@gQY%OIB1&1Pmj_$naHur6)3N6J>9&lHG|!JsW=Sa6)V?7#Z3x23Q zo|cxDD$fcIh#v794EX8H&UdSYzt;4pLHdfAx|%RpIsSwFmQ)Da=ohk?Q?5E@0UYk zl>vS0cI3qnY+Ssq+qxPg1ZZ(kb)@#@A}zp`F!CF)f=dFpaDZ53HwE7VfN5r9Lwj(4 zZQjX5)j-lK0k{+~B#b3u9pXg}!#LhE@fKN*Fu%r;m*sCcHC{X6y@Q{u(eg90vTLUm z6m(~%*Q94ubrljygY8su@JSYxo=ycgJPDbIqEQ%kt34~T$j;vE`{h-H(D)ntz>tP4 zjGk2d^lKtG62sD6nik=zY;tNzgdjJpVZY0m?k()D&Cbej)HRDSimafW)5|@z>q|27y9aVkj_clfE9S$DB|Q?_>O;fuZ#^axrf}@WcPV z_yTgVs4><~jNQN950GObj*-X~;$Q9oNU~Vq55}4hHTma2=+HMnhX?}&GgdjW@}^jR z9{fN|n;-n(c<_VyVjBNBjuT2P0+YXVnAHXki|hFgt39l}B(4wQ++olL{lW>$32Q$n zr+i4+1!fOHEy$Bb(GAZB%%PC(f9V8pvYgP4*Dk(pYS*sCwc7C$CT)JAX34Iuu3bxN zSih?UR@TSUOIyVgC+M!)#k;zYL(KGh4bB&jPrZ(kS6(+YIG^9>aAw2bPem@;IZln{adE_;@RaA~siCm2`5 z#O6;Aik9H;g9F<0tU0)GRGQo~QP>>(#aNN@SaCCCM)+XOlG!!`1l1mVPZfqL38;GJqgjOIeA`Bp0g%LPDz%X?i^Xc#-5Ys#z|bG z4X)v20ppvh1b)&5>h9xUFz~5138A=RL@Dqo`;C2!~H2@5|huc_cc(Bf6)SGG>4|BE0--D^65Xz7Z0f` z@e}Z`S~0lPzk2!NC2Lj;EJ0da{DQp1hiiVw$Dv!80eRUFTBYlDNQ0nT=5S3mSbL6G zu>t_a$Xf=Clpb|Lw0caWNze^IjVG;zh*KxHNCIHxQd*=8Aoxt_G$|8jX<7cdUAIr$ z_`=c4qHiR_WFupTcy;uw?MLQKy*}j$b?D__;hjzVSh-*L5fX1 zy(bkO*}P(kd)BSbY#_Ze2^e+H22tqUzh-jbj4Rq*CcuTo8^KWmEJP^Lmyfg#LG!qE zS#FXkHUZJnX&Oj%HX%}h zmnZ;9Ks2kPIoI|yF73!OZ|!VtzrH=A6xM8LKD}>*kJ_j)G@Xb7Icam2Q$ZF;#m=eljTKCCKq1;UA7Lu_ zT_BX9Ec9`Zfj6m;XR4g1bs1hKJgX}KL0ypsWg7A@6QKziF~ZT&c?Mz@s{v;aWdRe2 zPc{WuM>uW*N12? z%7w_Yf|6oSuMcWutV4)6AYtQ*KTc&+t)v<>0u?4Nfl!?daU2)ZqHdw;QZ;FGX=#xN zgeuOP1T#Qt9ZrwnhgP839&-VjZPA@Pz_Idzc#BkSwkXijq&3DDnkoySl@=%9GsZsA zW{kBNZEp_ZsBa})iSPtyHQ8En5CbxUJmgKX(jB%>=SbSmV-+CoL}i3=M#F zbn!ZQ*Fk`Up|x0Hk53IJkvS=%VPLHv>8<3N?$F!gJB#3t#*D(iPoW@Fe;FG79QM-in+5r1J&$=C>)=?dr`SE zU(!3~3SeoSn%Ln7_+bkah4~iSF4jv31yjtAIe{g8Q-k1~oCd_KH%@>s7 z?Re{_U*FW+yy@#deQQV9zO{eCDdRG_jrFsB3+USm%LSJ{anG(r6%~ti-SfoKuzkyk z38#$90R9r_Wtr$@vbz=tqLIC_)XzY^via72K+XBAUps;8Cm6;L@0I{eVj%6oy_n;X zB6--HupB>!=pe(#kx~~K+m-pj{vhrhJ}#fQU&Die`^EdIK)ey6$P*U9e50G7JD5{U z5b^kl6M8u)OTUlL7(KJIXiH$&>mNRGLb@FFIuSUb>==1gbfP{SzF`GYL_4yXCRh_D ztFV#C$P_bxN^pNxegIG2BmlESBbJw#s0WQR*+kl!Aja6r>1NceOAgaTvYe1;f{P3$ zDvDHO7x*7P&o1ygs9M4Uh=sBXlptROYyS3_xC%P2fgwVFkQ8A7;?f*KpK$FG+>_&& z#Z?IN4K8RS+Nh4w6eE&`WSlWmn{&>C6QoAWMQ=)-7s)5N0uk};LcQ#)<75}_V4^~a z5Nm``h}7w(V5pHBdXTP~1b3vUyxH2BWsh#dzheh(4T)B4IciJ2mP#x!vlKiGv zv09a4lkPd~J4VtY%i9rI2@$c@;j3+t3*y<*c=%68=XrCZ^2;8MkCD|J%|oYR;@R6d z?%cQo35jxQnI|Q#EWXB_+t^(+x#;7e;TMlY#ZQVyY+yM$W-W8XV zkdPB+5`L5)SD*hNJTN-?yq0KM%b-U<+8p6gqy*(i;5Y1ufb&G6aLfY9u6dt~yU*e~ z?z)(u7o!(}hfpA1!DF*wg^*;}eA0rq(evTg$%{>Y)VNAFz;D6Y2QB47BW{)5MWz&9 z@`A))jms4LQ9L6jfpj;Y1mwoV`4~9#V|iEU!oU;-6oDy~!Q^rqe2wBXPeuqmlcw%` zbp7eg@?LeXT>af`Q?D7QPRqK5%@8x)xfa%uT)TMc%5V4NEnK>+c<3t&@^M$w&-ZLN zwysVZY1djC@?A}HOKO+QXiSWcWVebZr2N@e_4eMlxLSNLI8d?h+MeF4=aqxXy6k)V z=DhH2_J&sY(^Xr%Gq+B!T2ZK4kchXec~gJowAMS*^3!AMFF!cAOnN<7y=lknTfVna z&0N}4f#~Mh^>Zo;XP%t4Z*6Pi>RVq;@4kMh-nZ^6B*5}T)Db5wouc%s8KAfZcrgB5gWxrfC{Gs)^;qNqF-P(Fx zvoakp5~FQB4-ik84_D&NAs7jfysmYwGeq;_!DYdyosh|&!eY@dXB%ZoL7>mR{qiQ* zU(9aWQla(efexN>xkhnkAMhLi?*MwGrM>^8_BOSKT-UMrgbf##a=A@WQwGqhk=6CFhks6E)qq`9?1y; zYpnBBf@QBZS<0#IaC_RTb0lr@-3L{Wl?P)E2P+S=XEI$TRC8s@je+fMUwL|Zxz8=# z#$Eus0g4$h-KVf;v?+mGrS^oTToVZAHYEg}rP=>J*H3JS?+{C@@9S%VC=J7&lBfWtc1p(o<}I<{1um-kS>OE@4Dr%gxXNO!UaV@1_@ShCs)&7X=Pbv_P zcup)znENj!c$nZ$Pfc>wd6H&!RW&qJ!EPxdS>)ib_Oclz`pHR?lz%OagE7RA z@r)f3BqbEV5|SXBjzM6x@4_k==i>o+HP5mJLLi*-PO-<*1yBmQ6b^PJ+_*us0+6Yk zn!AYO2Yc$OXK(6KyKZ{+s>WsQc_xI?zaAlA5w9^(Don zndRlBQ~8cL?Fl0V9;<)!wSU~W>%C|1$p0vJ+1Bf)n8MR3*Kb{x`}cwaKYjPQ8~^dz zqxFkRw%l+>j~-T2e^t*NH*6_^-T^(tqq&cfqK#dT1QrNySVC)VGy*kIfcjS#3XX=} z&{ya=ET(fRt(*|mMt;4d^Cd_aisyP3&_RXF12BxclBuNU1QY}M*H;noNFB7MMkxSY zcRL>KV|*z%DG%tzJ*{LSN-ikTNl?1SA^7o3l5OGRU*Ef;PA#3gLEYbV#j6iqrq-?4 z`}LDrQ;ai7Gb2%@%e-gcY>EIj0P3H|BZ>Z^Ia?1rx}@ipt%I$(J-7UH%aTVAY@JgS z6p$2*5Z5Sl3#^TpBuY1)LpK0vP+wS8@QaimmT9KKDS_1~_XIOyi2oI|jqAn18BjiSrwzSGlT4;);Gv(f$cheBVva@IoI)!>?{iL zI?Q}CUO|BD!R|~G33)Q2THqYSsbPbH;i6!iFewjAb&g5N)f?!V|C9ci%lDw&1xCjY zp8@zpn(r3PuLAYm%jB5PJk} z=BVJvwVd`Pv157vRozS?#xbWk=ptTr_6_CpzpgG#D=ZZZjS{-i4juSttkbZ1@>-6m zBibavc^3ew2$|$kc*D@mCK+o{Nohk>p8l21efA=%urI8>#q=%0 zZLmu^1k34rg>ND%3_MGvabJ>ogP*Oj;XGkAx`)m|8d(DaBRhGcN?7R(-vpekqhox@ zoWd;YLS-n%eY`A`Yd6ZKXUuXbIuw;_mW^ere>fzdg@q5)7&z3$)il|4($Tn)F42cy z=Ib8Ngcd&kaBToBR^u_cfi9AiS2ng#f#7ovzZNbUr$I1I;1u@B20(wi`7BT>FJi)@ zIFHw3iSrM=g$|8}b-NI=v%nJ^hW zjLso`fx3@d{OAxRzC-#mfjd9rk^t;kk0ClvhcrCqEZ%H&;Or|GJo|Fk+0{DVgnNH& zp4H)(^`!MAUoUPGn(H(HLc`SYNDxIla!!hsbXb`bVHr8;P;Z%(Xx5T5X9oHRy*%7I zfZg7Q37z*5Jp$Gn91}rIv5#LNx~Y$D>LdL8Fhcht(2>E-jjmQNxVcu;1fv6F2^>;| z7+VQ0CwMy(GjK9|AEp<`*J=qu`M6*+oPdZ{Hfb9Au- z7cv03^QUMq$Zd%NDXH|lc_SNrT2kprenk*si9+HO98m>S`#!*wyM(U^_X+n44-1b8 zCv_X^u{45>Oc1#$8VNK)G8L1ey0mKyP#Nh!=ofQYheuBG9?o6H3Ir6r6moxH3gkB#}2Fy-lnM%U6t z*T~OZjZ68zq&B+VCJp99OS$tQo#dCjc3x=Nvb5WNg#T)AdIdmBws$Yx(sCs1m&RVd zPeq+X0Y9juCYV1sR)lk^K?iZnPnZUg{uy;M{%DIYW-oGu935UQu4YGrN99+7M;Yw) zhF1rVDo4fD=kN{UE3SS;Tg@qRgO1?36e@_yA;V?M>XB-0z>G3Rsxhkt3GtofUt#&_ z*#+pL{3{KwK_xH|v8b@VDY`;5YLF|wt-T%04d!ZZi`X(8i*F;F%mvQr_YzDnVui(l z%1yx$YC}1ksa9BnRa7(jf>;6~->J2}NMp8>{p>~3R$B%7l9?!(l8`nU5gPg8!>Hpr z)mxZk{StsKQWi4LFcdKuw6P6lK_A*;TR2 zRaJdeRaSO(R@GJ2RW6*k;8|_@xMd?78R)m4e(sPrZ|UaiI!wc_j_Wor&2!AGT-Li# zgxAQZO(|YH^7!YzY4rWte~uSRkqW?^4+-2_)XdK9zs@ zzT*JRqAJ9P;OE8Ywl2hp*aV7nOqRQcIetAAOdJ$;07zd`8 zJq{^plEZ@?dTZ!o92n%A#Em&d6H_tX@qFd+qTenUoIgD^@U}T0rQFo%^9KvWTsi@H z6zqcDPMzLASQvPl4y4?|!T#wm2p{Ea$k%KIdY)q_=m5Dk5H7Ar8lV_DI=Pj>K0!A( zB*_^Mt*<)<*0mtiKAGCX%+|`hT;>noZ^CY6%<^{Ax>=>g1s^%{Tsik03!HLPO{*)Z zY$__4R-2PvSYCu!r;_{r`*P-#md(xisNf3i`u76om5k!XTzg?=mfhv+oKvL~mph7^ zobBb>Q%f^EcDFMtM)Y)M#KkU&5K3pQYnpsT!ACiB%Sz|u+;@NA6ce+G$_vwTV8&n6 zTv1ZjUG0$E$L`B<gzR?RS6!BOie*MI!lV|DO95!8;K{h39Gw`1uMKpjtdRxY{ukry`R-ud^(hsdSL z3}tV`c+<{Y^TMsuLB1i8JWs_A4;2n0tSZKQlxs4%CBEW_%iyaGXw6Ni4aYV;gt0Ct z=BUBVAqk>E(^kORz%10)2VqsR3?#u4Uk5=xYbo^&giZp4*(&Ev=zb1G%*jrVQ`l0X zFX}Dj&1-(iA9E$Y#tjciM&`*Rc_nOsD3HCgsA7>-xvkA`obIyKpz zogKU0oj)+&GDoG}M+3QRNya$9N`lwg2B8Y?T|)E9DK~>lGDe+v=E0GNxoE;YdTsU{2wWFg| zeARpCxzpRj<-ivv3fO^h)PQ);SG0%z?ccPAzB0Ijl|AwZD?_obZ`<}d3Vvu{;2|(g z#7|+wuoCn+L=kOuFOkvNL_-3MuiNR_u|&*23i2ZlhGtj*BY?5N$dI&#v^k?+<{ugW5e+@Ymk$K!d}w&cIUy9BkEjG1ei|oO)$4Xa<{ZFN zq$lE*?GqBAS=^>cw{gpa&a4_Y#M1ugINtwVn`U?&sR@PW{yA~XpG(C^FC2=rW=;;M zp<$Q*SvsvMLp7BSYDU$xQm5NIbZZZr(sy$^al&cp__6J&y}V)Ii3jg$rBHp(ubOku zjPz3JiVKc+;GP+CXp|SdzuVQ4D@Kdbm|-6|C85 zV@ndYW6%}90h+)H`k+{tPLYe?GX^UF7qcO4IhLix>cQHnGZrZJ2z$aB1^-yEZhWyv z&fvy<60(}YUI*^?APJpWl6V{IzpY{QJ*IiOYZij2*!+C`Z@2PE7J7!Pb+)z*! zr7adCScGJoTwc^yz&5mhV=yV-{^<2{pI?`gyZ(haRb6FimRxbBv#Ebuk*_2pLOW_n z@itQSHlj8_9;oEW$-djLwc+2t;m(=&(+z80zN}*YiG^3Zvvt|Bq|&4v?{Db1dCK)O zb{3_Ur>r|Na9cx3Va+Xr-H$x^)PiN13xDgi;#9Y)bF0xmJEkzZGWb${Y(WQ@g^Jb9K}0dxtiaNrbb^B0h`+R$9DgtMfORs{$0Dkj+om-v-IGJ zpzsuX883cWdTR7}DsAjjTs4emynqC}P_Tpa0TL8AzsDC|of z9w~JaCXKhw7WS*F#Yr_zUvY!>I`R*^{yLJu^PTXGtm^e4nH<$kanU`!uLU1}jo+q~ zj@_bD6d(9SA7pUwEZ1$L$f6TL6L?^RYzS(s5JB0_3zT$9<<>%duiHfO#iNrr1&d`H zPLZrpHSEh)!rJOKXidK-yhx>nYdz|ycrOWX!})*|dLO@}Yd>`0X{E$i{1SzoF-zeO zxebX1jXTAA$2~IfM2Oh@^3@vCgiv!YkV~g~t(Mge86bJ&2iT;t(3Z}j0#~+rTU-k!2`;Q&-(=6{3UbmKrCy7@fm<)XZEw&WP z(L)1=%zx%L_i!pKPBo_X*g4!HTE++QlS1BP1cwQr>pC5kW0Z7g1F4KLi6j`;QUEK0 zRsfx3sxYt%U<6vx)Nf!HvTab)hBAYQYZwCHL2sSp-}}iMPh8j8dEFCle6lxeUmR2y zuJ^6a&A05{ZOPBY?n1S7W6PAgW~wvqn$ohd^|LQW2op*)Nw;S{p{4epWHKDx4QfG52`_2Ycf1JbV z%1uuaKa%1ldg)&d$!(RrYd39J)D%I|P!VwV1me2%LlRm|HBbO-;VlPFo0BWxOAH$% ze#V|OiOHB$(%(0}^!WZ&wauIEd-kmzJOBHI`|E6ZwjFOhd*7z!%Bv5Y`|%YOgE#al z%9fY4_a9sOTWf!0_qL-y{Etog9lo8%*NLM3?3!N=53c|5xdTg{JbHbJtK0Pi7Ua2S zOS)%pj|QO+w8zQ#4&kOSKL|T3ed!nc=@B?UsO;8TRP^}7^oAUxs5v5 z4}^mCf{!uJD4qzj(c*TdixP82LHk+9S2;;S^+o&9eMi|{+N6UAOZ~>O|BJbFgF;|2 zI|I`Ab*&_L&Eboe&7=fZ6wsH%#ur{*dhnn&iQRRS?Y}_j!{W_Uw)RWS#wy3u9FSs6 z%_Wks6TBE-?F*D@)H%?2(GpQ#3AG(xdFV;%MP8n&WLZhlRYA4WRp5*iL)=FV;IajJA|tXo zjCc{!P<)sPgM(mSkPTt!cYB+Le!U?)K;wpA4>k3EcWGFRJ5qd;NQw-nii+m#mdX?g$v)UUYgTvgnJ-%57xcLB zgWb=pS@TTyx-V3Hk{77JKzi+66c@p8rWjv;N{bTGx_ow@U$8auXhxpke_z^2T%=*_ znh8mIhX4B#h6?0>VUe5weCvfz4bgfe(T2s9p-#F;<40Rwmz?<7jki4ByL*0d@%-Jr z0|$>DJ&5d56Gv82jg+l}yY~guOX>`3>D-_E$2;4ueEUCsGI!u0yYkgn*_Bi{PYE!7 z=+6sdGRqF4zXCHZp@+a(3TrrgorJlZA()XPD5sbyUm0(Ui)>9KTS15xE1ZvN>uT!| z%7#I%5-UN7Dj|^x@JP6whlx`tteKOp8Cxf|6mP;jXFfycEy66{T>o-K)T}{uxqq&2 zmS%-yNo9Y?T)F$u40Yzg-77QMABI6zl4UEQo)G%MxwH7n_>x_!1z);GTsPTg&^3C7 zqyzGBbWvTo_BR_6IxH@)D~i@E*nN4yy*F#mH@m@Q0n#mI<O)tQ%_6e2Yr&|W3{7SXe2`^q+U667XmGou_m53?SJ zjv{*xp^LKx3+GcR~{8rIj_k{M->AzC&x1fjMQ>R-XNPe`4tAzjlS9%+DcWRy?)iR%Jw^) z5$v9f`1nk>-R{OV!~Msi#>OIiW#Ly(v`nRvsm#oV^w@@3L)CPgSv#W?g@bTAha!oP zldw+(pIy`Njm2~r4k2M*et+x2joEc=p*oRSr8oRQyuP2 zXn%s!19_A=*AYfwadFMgJvX+(|9x@bMC%QEcGeUxt_d!-Nd4k<-kTnKe)Wmf&p&pP zSG>+TE5ehRSCt#D-IZ3E#{MHdw<<5w6A@feQKkLw_E*36wbs_Jeec!nT&Bw{1yt_I z;uXqK6Mdw(EmU=@=!8%Z;{j17{j%yZjHU%@e6k8gPG@UxDY5Fh(LkyAiBkK?2x4h~ z1sBL!f~m3)|ME!f%kh$++x&_V4YN&Fes+WO$tP?(k>x6pbwM>J`K6bVbD-fj%!su? zPC1aIQc(qk{8G8~FM?J<5~SNRkbQ6+g1cMou- zh@zaEq$q3ztJFM?HH!7F(kFMKAa;ph_TK~Zi} zTu^}_R*8$^l;9b~kV7F;y){&ii`7q7t4fB{SxNaxY2|4u6Dk&W7o8XErS8;Jcd1=f zE}`bZW3@}N{`PZO6#b%_HM#GusMNf)w7k?PKW3w9tldh)>RgX#54=@?yeWwZU<)nL z%%#tU7O@pMF}b!DV7Q6FstW^=r)PSABPC@hp=hmE3u3n=Bj|&U|8#w>Znj-T`H?Y7 zE{j^ea$#p&Y>dS@_ntSkziU7HuIBSDnpuUY2$9y(X_byiNm({qHdCsm%`afSV=VLU zKik)BPnMzoDVyA6A5miqyje0!jaBS9$x-PwGb`ozgy@{2!YIri8h9eK{Hh4u9wr<=wxnWDQ5~CDPEq9z%o3=mx zE=zs*AamX6Xh==XPP9x)Op6m^#FF`i@vS?r-qpV2jaPoLHUd#3tkEfnQSgia#3%D5 z%u;+f&sGMHlAXd{VLy5la!Ip8&_~70gCHUCqz*wJ(uCm3Z7IQ+7U)TG3`TborN>Pp zc*jBvWWlY8WKQ-u(+cav=x9e}cbPTP7C)(K<|41=`>ysg?eA~iGuLT}iH+-AxUyVU zix*EX%eEzDCQX`DRFo4FA1_zVtVxeb&ao@8sVt|kC~8EtH%%^!h_K4AmfrWXzq8C^ znm;rvD^e%UO4!X)@5}0@7oU4(MJ(^^lCFyMDSKaF0&DmYFb%6*TVB;!kdRqByP|1p z!{m*dwvId>m6#H3&2>8?*8bv^H+FRF+PSkezHoktVpU?(5~D1M*{P`wjyttK9DG>& z^Sh64Z<2HB7GHQ~GoL;nf(8Ar^7vH>ETVGYf!fRSO~B>_mdr#`Lkx{wJ`6~MO9lr} z-x*swB;qLs@do`Rxee2DXl8u$Fn|gc0l5lO+!H)m2DNw*Y?+a%2Qn9nU4pk1Ksz7| zO-eDC<06yH^TKJeEYnU8k-_DVO1~-_YPh0+2?d4mwjsr0u{BJcQ#gE#M6^DbKt?xv zd{4geU%&fhFUu*Lmn_TTP<%{E%K4P0oMWqh_vWvMQro6>);d|M#4IV!{A4~SwbwFc z7y*juwapR*7tu&^?*U{iEI2O|T+z_9r$PH;OmeiRDc??_M)SNA9Zu6laffkzEC|~+S}~X{6iG9eMq|QGsZ#^s3(Sxt+_jAnJvDMhUJQeW4*up-G9CO zWSgfsT4JK_ypWvlOtCPjl{srWr?#aI{rb({tv+V-QT&i7%PDnyTeAFd~&LIU$KKbu+s5#-jdB`{c1;Lett=B_*@Spq+2YRueXUr^8P1 zOW<~yfGklog-G{0fKtbmI9`{-vzrlv1rmw=3BMB5q@{>|xb>ShW@0EoA^8lFH>7C@ zZEU4qP}W9kbYfIOX|2zd>g%47m*h=SlA-|%tCx5uPft}M;v#TUMaA4TR>6$aXa;$n z7z{$CdAaAg>z?m9c_)p7D*8;mN?{r@vg3#@xWryOxeIWeGxPc#;OW9V+-1j zbwT6}<}&x6mT8BgG7uL;sk*TMlC9O=QW#&yA}tY9dD_uO5-e_&~*Bd@r2|2H4K|4`%P!}mY>&Hc4Sc?sD! z9slVQU-f1#-}#kWZ{E5fC1IL+e8pT_QF)zjdQs7IUtM{TZSL|D>a+kiAm&GeI3RabPS54o-}A6$kJtNERyK( z$M9;1h%ht~jSqhEY$z{#sk~3=a z)7W$-T9oFlhSmK~%}w{%ywh{z+^}@6?aWI^c6g$qBI9y15^H)dTRJoGChhE=jQMM~ zZC*9A)S2%@R+@^E{H%m1S&EEKh)ynTzWvZ$UHe$-nUZD8mK0{U=S7vbcD2{X@74aP zHr#RWmWr4NYxE?m*zmx2zc>AMW>c1z_ibv8h>r-|?`jt|kV^+&-B%8%2r$#8hV_yH|<&jpzg2@omDjX5%1=Y@J&DLaZ6$l$q%R^wV zh-5`ch>x*em6RTto?JRqnLOF&%P8%e-jW*Qal|E4n>+={`UJ{zN2KQ!S5I!~$jz%O zEwDS>xpkeLE%w~*+^pXI*^bKWf*xOu&7H5ktVAWnl`JTTw#7s!qT3Z$-P+}fjE`?@ zYe}qHIDK-G2iA-r;tY!Ti|4us%f_}}8#a%aa$w7^e{f`7W8=CbKlt^Quzi@XASVfO zw~f8qaLYgYs|gPn4`bqo)e^As!WL-U&c>|8__uuayYU9X0~Qq!c{;5#FoqV8K1Lb^ zooE_%B72&Yh*hH*z0AFX9=Fgh-RO;1iuEo{gM*3!XC#=$ANF1m3_tJP15FVVpd z^aJ*=l{*2(M^B=2_1QTMg{l0Y);J(YK_^h+=vBN+KfvfxkRAnpz(Yi@04I_!5X_tf zGCijd1caini+e*jbj-bQwHL^`P)6^N1`@j*h8q?&b|Kfu#wzQyJzhcb4g?7%Vg+21 z0%~3c$>|h_jJ%@KY2u2{3dBvb)1!%1m7G9Mc3DAwRa=RcL)g(sZA!-YdXNZJjZ8?1 zi%UV)R(_4wg(e60MNNTxfmBf;u9!0$oO1@5gjlo`2ib7zw}T+Af!i0q7qSSLRZxX% z5=6g=FDVZh&ySF=2@VfgfH1#r8@H-u-!)gyV6K@M}jt-Btiv_ z6`taR%&$n z1CO_c;|M|yJU0lM&OLJxjSd!G1m~@kE{fAPTp3^|EE5ZFX!ClkD2+2nA^ffD4mf!v z<2qL!02$$YsXRVcnwM4-;Um0SI>Sn|*9Q)H*1f*AV$aRjuWGToN*$%?WxMYZI|i!?=jBaX>})J?luVhQpAh4j)#{z%^LA(D z^%drK)n@O{Yc5G+H*_wnN{UV|ZtJhlYRX8ToZUFPEXmPZTREdDEvuogD!ba9l;En( z%dK`M#5rrk_|ndbtVD|?F{f%enDXKntIb)}?QvB&ZIPllDKV!!H@7S&5&Mw|*<~y} zwJ67C%PC4Vw;5iT5_-L4yhN=^NQ!h;wD+&|<@)L?lHPGQrFff4vJxW>vD@tx^{u(h ztNYr@os+J!q`Jx`cY0ZNZC^uXLdsxcVqQ&NO=E_oTXED^wl`&@^`+QSO4^GKmPnbU zty-|{vYmA$E0)b~^G3wXjg4Eix&2_dS+dDQ=NOk{MpTJ@kg$@uC9*M)Ygu+s%&RNE=<}E|(z-z)%#CjU?S)#gKup!(i+ys&qlmKW_&=W`<&wpXSjx$Qwd5LnIBKxT^ z!$Q_hqk*Z2&oPbNX?1dP4`3OTg#tf)EM{04B1obYkR`#1_xV%$YHRya_^)Mc*nxI; z*+UyPJXEIt)}v8qYTzGbeJ!qv-YX{0yK$hb^Qs4yM8>A%?1?G4VuZW0S(?of2M!IZhXxQDzsS{JuDuCYuBQ?*qAWS)+fj!dVf%%l zcb7fH=62Qb8U)XJ+vk@yu9;cVb>-oiYkzoTn^$(GYkU>+>Ve-qiw zOqoJdN`l}py7Z6@A&Q0cW-EH+;I2PzugwTzx?}OzkYFL<>KqV{{7`)`&MD% zt@>lb!i1ZR2g7>~)KCFqR%kOMKROar0f)(e%(&u4Fm82N75%EBA{H=E0L&~*%nI#F z4fuUoQ1RjV41SO9A1CM#9njncd7vKh10pn-D*!#yTRvtVEBlrGWUU38Q65wX0kBhK z2irEF?br4XuxzhN-TqTTxtWzSuq2$FgQz#IomW3;PwbrShkFrOUGq;~ z7k-QeA<{bCi(u~gT`MLh&)s)feOLQef5qr70<$gQW)o5b8%P3SvH5kLWl z(nu`G?8*y)ersaN!p-WQ?Tc!P=3d!dzi!1M@4zp14Bfx2t$5buSKZK>R#RRO8xv)b z6?RN5Xt<(&+Er^7FIlR?DX6>vuE;#dxsVu+I9J|!HT5fiki&y%FKkU zMAWH*Das?L(_~ao=SqpRsey!x=rqi@5Zyv9Q4~hkAY72`Rj!@AZ$&XH|Xie_)^UU1*kxhEFSzxT?{Z{8~}Mt+W4`mX%Wjz(|k z*Xw-wbFb^~Ts^%aGy2-hY1c08*)TP?sp6}}rRB@^FMi+`#h7;@dy(Z>8WHg~maw2M z>37!DI*`^eL4qNJ)6#hM_F(*F|M|kVeRtn}qxSoU#o1EP_1X@0>-C$s8Z-UokvF9& zr?r*8Kx+q>MfomD^P(($zH+a@u=essQod#h4E|$VpSyKd@14Kc;hj5srmOo{fB&6p z8{4+rJJ5V}Q-%2b;0sRA4EcAHw|{r%uAl5_gJj!wZ*g_yvRfBk_LX_=2t|regF#8g zye&j8{}a7jfJ|E9Z#D?IBFKI`^%tqntarcS^6YBHw~<1k16 z!u$LGW9~iR+bYlf@$;UeBgv92Ted9OvMpP-hWB1^;#iIokL*3{Ovs*)5J*Tu4unm@ z3WQZ!R)9i*Qs`jTEurNWxX`B1-ll`n7J6^X?O>GH(#ik(yyqNQRuYo5{rx}JiFAg} zc*pZT@AE$6`=GVWHl*FA#>UY9^O~3Lz1V-qchTM7To(PYWzM)4)kErj_0pfc%yzL0 z+4&EHpNZMbBL4~XBm|Bbc$`5|T)?Gu3Q5eG;ENP|n!pkFrsgW91YyMVT4dwYioSi% zZdm{9zR8u-H+445??Z}<8LFwN7#Lh_P&L=i?U%p{ZPHtcSy0HVabl!0Lz}U6@y{w(! z0;*@MA3JXSjOwcC8-_1w7}z_t@3O^>jRTiWp0;-YK2fNfEWe-7hx$Bi3>MP}_Vjq9 zk51}C(~5)ZyUU!O)}{Nuzjwmk_Hma_TzP0CVq{D$FI=(y(Tm1Uy8PQ~ChqKS4A0)X zV8-rwRb_K8vusA+-S_D9wg2_Tv)9b<-%OLSO@ZwgvCf_aVO_ZO(%*WbOqvm`a6ym#w;8&}`4abjt@)fH%&w(hFV8C$2<-ypWRJMOygu5oR*9=d7EL>lu}jQR6<`Ex--38f!lw9J}N(t#U;OIEI_ z2GdO{!QGq%x3^R|I13ihGDVin{K;LT+vU{kSXbAPpR2}@i6WV4(r)23won7dI-}Cb4 z2}Pr8!0n5p*n5}J&1)+x_YQ=6GB1N@!v zTuyAWGfx5u&1Cv)WImWVt+@9qG#`vhoDYga(?*v`9ZsGdmR`T;{Ojf=%nmeOWy^iM zbj`@cl~_K*AfYLPHGjd=PZg$wvdY(;%dCOKaZOpF)+tLym;TtPCXuWhK8YNBaAXph zwtoYkMCw*8ozu=UI0>!r#*RSJ&H_#V&9-SQg;hzAn1gPUr#V2fa}XkU5W8W>I#{$? z+$O|k>|obM;l07G#U5la$o^2u41M`|w&l6!*p}yGKK9?LNA(;R-xuGH`JQK+pa0vQ zf9%2kzhPe*JaUBeZAXs4HYTXT;NX&PEnWJpCG5he>C;d5s5h|-Jxji`cxT714*cJ_ z_&Y?8f-s2nTm*Y&()*-HSwR%eX;Gq)Xha%}h|k2PMc)*k!2<_bM2-yQe<=MhI_5*u zlVm+WmQ(1^)(SH2P1EqY0Ib1~f|n8i!>dJz4n_y1NbDx@Lh-_(wOe*Q;qc$p zW$b={wBCQS`kMM0YmKf|zbn_T^gj~nGSj@B#JZuPa|y2k})(cfm9zaQ{Zq1kVQ!&}L+Nx)`l_ zJ!l1k5*oES!&)Ual|WKRI3(0L-Fj7vtRLj>Kwq$#YuYuayO5X-(yFHS3MT9$&>TK~ z;Sz4p^~1v?Vb6SV*|d(@G%>e0RFq9xQyxEcy-AYd2O44wKkqIn4S1!rx{j&kti3y} z7F+RKnpG*JuCMX?Yv>bIjJ+HwLy7%W`sqcHrRv)9PDiWspRJD0^5Mer32CjS*4DHM zTNFY}qGWt1ekT)f(=s&iyfc#kdliRMqOB_HN_N zHR^9+Y9)7)+R{fKEv;3R+VEGu8mEo;~3_Q;Z;? z*OD6{^)Ww7D27;I^AoC~jRtf+x;9}nz&ojlkb5{*KAs3Dk>ljph%X8~q%Z=?HE>*j z3ibrvMK4m6q_R>W*8^Uh~i zj_iN>Drgu*g34y}`Kz>R$gK=3S{g+tKKLA!)`GD~krWt32AEEpB5niVV_gNyA`|vhR${qm5>^9)a zCaxGymz=>MD?t{=1OpE;Zja$6$spyg)(>?%4L_g!43pq*tIW-{cF`9h<{xp?m5MC=$$k&KwZXD%zeX~O}Dad z8&6>0){agpgK=+sR8iEK7U4!ni)4w?%B~z2$mbGu1*gXgp-R*0N&yWJ$U&_NxB`Lk z5hGv0OFs+2fIxFi_-@3; zE%4fAa4s0f!i_D>z_)0C@+1_lhcTTyxrr{agEhC*d)xpDLDo&T2hKq-u9JNoJRX{s zCVxJ2!-o*3$$f#r=x8YpQ<^EbKkz5wmC&NsyBo0H82MHIF>cJ)mjT)O>+mkT2eSwO zNU(^<Mph(Hq9bTK-HKuatbH+rgTt259sz%GCiRLsjGIujpiZd279EU{yyIh)` z<-@)h{WVTm<<)i*`eVPA`RnAfAOC^}C{&>2fr*wPcvR&~Av9EJyLg;+$NQ>TBvNFRU#K zxnfIdAp%~OT~d=*x1g)iEdED+{_qteBeKRjaU9!J(CFG4>=gHB7x>C-sA1(8=?=W0 zpsfHP3{159#uu0w06J35a<(VioCaSt81IA5wm@G1@5LpewaDe~cABya{LX?JQ8cSJ z<07-XT!OU-sHoM8b{qJglp&x^9ao&i!>MD=p!aj3mFN8TxNYxU&DM1Y{i$<@UnBU(K4 z3xlrot&ZVHzng`+B|Q}Y-V!{4YR}NGi|NJEANW+R4A00-2KLDfu6=dRaYYu4tQf|YyF{9VIj^pzd+8ZeRxODG?L~zPUc7c{XNL$D z7vuQ~j5}$Ic^51_m0gF}?tfTLz~C_wk+A+|!^o>WcpVAlRi zO-|C3f^i`n#~*^p+Ygx&kjhQKqk>vBOhz?gRuoafGnbxbEALHn=cij7RuLrZDn<=% zp)9{(2O?6&Ir80(jqh#S_TI*r5X=#yIlMc*^0StL8# z0Zt9Uf~1U7ZB2u#-hAVYl~n`PnZZoiDib%NCc`dHRQFe(|2lpa{}!sO48_u)Rv&os zDYoKi_B|$e-Lq%Ay`QTr(9$ucOs8f-g4yIZ?$njvMeM|Ez{6@9n;4&hK4~6fJ{-o>4fcep?aV0S@9k` zH68{2@GKMD4m3eURf-DW`k5bl9s=>`gt!{SEhISxlH*H<;)*g0+XHzHEi;3y_lGn$ z3-X%8+$qqy$gFVrt`2(C9t{r)b)>nanqaPy)r;C3*8*#AFoao$=Aq`GA--YuLt~LC z7s973T=4EIPxkda`O3Q&T=775~yJ~?h zp$(Uk_$~~pgObv==D=*q&|qw1n-dzd2-Q98MWwj5 zFg?8xehS)FGIoru_(035{f{46*SoK&X? zzLvr?9~{lHmde?=Ubh1|z4KFO?N!00fZJnlsJCV3`zjE&gSmm2I1Mdhzpk&X-s`Pz z>thEaYx>Hiy+guYsl0DZ#Mh4OccOqicTC*X$Le#<&=`=ug z6A#V*@YM&hvjg?MlYOB-up;_^i zHWozhD`+hB(4MrM_HLHa(xm8p^!-=5Spj1l`J;6U*Z(NMbGc~K}g%2?#_#3BtJV{WC)C_#KkuK@<8sY+C^ zcB-JL*ws&AlmFBX*aBWc%}lREBGGF|n}`V$SM8*0>1X2GBxS%A9s=13VUR}iAe}MO zOgF6fJBk#gsKal^epuW^@^ijJe)~WR-v>Anc;|JQ| zKj52MitdpvJ$J0rrtUBSiNd8o1le(N)QFJCG4^($=+wxNH$2{pK5U*$TdgbbY9dbj z8ryTuNT&S7C;+)C{J$B?K>ZtwY-h&sM#m){o_Q<}30lii0Hx6aM8wqE`mu3%wnG_r z(w{-y2~yoYWHx$S_^xnN_z+M!@ijlq*)?!wv3Q#64g0S)j{~lV=5OR#05K+lcOk<9 zIsdkVL718VpxtQkkYMcrKxm>dnTQvXk7v9Df5`aMP2Ls8v~Eo41k!8l)AW8OGqgWx ziDrq3L^dX3+IBRzIeh7hA8dKsY)pT&ZCx3B+gV?`v!OZh;)Wd+ z%j)J#ey9-8`6Joo%F7S8bsS2sYwt;3#SQ%-X<28wCwVy*Dl$~UpdBe@6kvvM+gS#(w6JLyfyPo;IKNx0Io+k&Mt z#|2oyX>yd0U9u583lmBfao6~|9sXAZ7aob)XHx$H_s^O!O`q{_R-j_qAE zE)vmqG><86=ZWhl4ORG#e#o`IHJ57Gl0%5FdEe~#n8~V&`_p1hSYmVt)fjbSTG~<8|r2c z;=iGSLl*bZ&J$EJtnZM6&naK5VO~2cyp%4*S48PjycJF(Uy6QSOQS;P)m;XE*0<7! zpKI0!>FWk)_7~l+=V77es*8NaJfm-su?L(FT#yMv0>PLIX%r#MBjo-?S&lsFNVw5u zIWFW#n6aB^*2Z}fdg#N2ySOwr9GB)ykmiQDG-uMKIq-VU|7pI}|BT6iCW13^eq<}4 zKW+d*m9dLSLpxFw%2kB}IAl?VfYV8_3-tNm400^hkLpGBH|h!jme-e#X`g;K+CaX< z5I~~w`b(&Pl-FO<>#xmKTJ5!c`X*79CO`VK2qZ2H$K_blh#Wi2f121>vPAYK1R#tQ=})R63Xb|qL-32uvQLcr=g`7?4JVw?UuIm~Kyx8n-xp|ySd zdzcr9)bLtq2n7qfWTX`ZlG;c9wCZceWC8x-QXAzR!30BjvhblYGDzM=S?OH7i~=lN z!Z4MSmrFAZXzj*JMo_2(2Bw3G@s6N!(GA8{+vB$4)3oasmMyV7;A3bA(!6Wsq25OO zoT(K5)VrbZL%b zY~04mg_B=cGh;tR@a~@xQFi=z+4QfjF!ELz$tiZewfv6n8M;|rmkUZBgx>;YA+*V! zL~a845k@1e4S*A&X@F>fL}pByT=3h|Ypix4SIkhU|iZifs1txvyP9P|h-scv1y|ciy~;{XBniSkuI;m;PYP{%VuG zraTw_X)#JZ)-}Dedux*Rw6sql@9;;Su+N!+_mukzveoe1MU>SQauVnbXo*8uhprHI z3s<0hM~Tvir5vFuPChVsg=7-jp@uVpk~|i}K?zb5nhPRRDBKVv?g5~eBpKfW7;i8Q z)2IYx?yId{aDeMFs)ypJC8i1aBxZXpOd3>(%aiF1#r5W!k=Pl~pz;VybETxcwMV z_Z9VORryVNW}+BtVkW##Ly@)snG=3OsnB*z29nW$unOoXFR*f)1QV5z1fhv%K|m{+ zEkHKF$cAw-%(vPQ=fT+gR}AGa`p0BxsFpd*aS0Ejgfsj%Z_m-F zI%167dnViHzixhoIq-TLDM)P6#gO4HReglSHz11u{>X$X>&wD1Tvo<8MptM`6639@ItULTTcS2))0B?? zT17LF=4~`@K82bic@=erT}o z=g(6k$!D05d?tF*8Kxv(!{dOpzM>4g6~YC=E_f*3j_kW%)1?nX$|Ai07qoc9mY#wL zLWBiE0|)#Z$>GwV_q3Mi28`OzFF`0!h^)foN#cj*)<=*wtXc}g=ENC2VDx18@cYM0 z%;oWOx0V*aISW7IqLZM*e@93nHT_|Ak~dGB;?1M*Dmwh8yRoohL8acjT2CI(TheN6 zj)Z@$)nOB!tB7Pj&aOK_e0%NL*Q`JD-yq>m7 zpH=*Z_PhG{yt}X55MonP{Z(zT*FtQ)6@TiX&_eB|wkm(>$*AUPgkV(iyzGT=|8K(m zHKe`B^Tu8aOenBgN0*U~K%SKgD#nJhLRnW_HvZBM$zczV+dek3x3hC^WbCBi+N~G# zx7bae&bsO1fr7dVF4;9!6k7T(*t#~T{ZwBtaPdvE#_qc0g6QwAxJZP+81pf89L>cImX?w*It+3+qo8mao=D^YAjMPm81<>& zC&4zE(BpbXn}q$$^!^K1PhlIqvLh8efxn9X@?5mz67^|ES>8-mdtLO{vwOSsMmgKo z7Z(Sp<<)1Y7sNkOuWEg3x?`j>twQgW&;3@7?cbPNKC@J7mS6N=a><0t+Gnb7$uq8f z{=E~|>7=5Zu|1=;yydA;#X9X_+PA1AG&Gam5nPr(!#zv}M;BWVb^PbpJoUEu@SB(? zJ`}rv%~-06?er_zi_jlw(Bzds$J9mFJAs5kIJzFv=vtZsW0A}y>;%vuxv#=mk&^Tw zYSO60tnPeNlid_$`8V#`8NPv)-l@F)I=pQZNW$x1eQZArwVGU^LuV+O z1Zu|Jn1+QbF4Lq1ihyw8<>Dw5h;dAvG1$w)@jFy&-?8zk1rL3%0GBpTAfA{L0K}OIOZr z%FHiLPqEuWUbiy6hNq%OheDy!dwUX zo_YF#F`~tmYO$u(U32TrV-)otS2T*uVALtX>~pQ&6n@Drl}PG zziEnu-8L!3X7Sc^hNWcy$RW(1*vIXC{>HLAtG6x}Xg-mkE&3H}jyr>;WjJNoZ3XZR z`z0W7d<|i@g)I&)Su`axCFspAt8NJtca3jrtPJE?g8?bUSx}bmE(=k8-09v>TF&^% zbE@+rkv4bz@@h9Ab6lmttft76vch`rjCr$tX~hA*XsHOf+9oe-$Q<7}HX|dYq^F}X zy(B2gkhxRK7F4CX>@o;l(S2moK*w(6@GR!|qch{lMP^jnhBM4$b(k z6@o9V;D$iK;xRFJLI?)Qb0nz5j!^fBV8;pV2v0yMZ0BbI}uu>fP zFn&W!Ge!d-O^CyTpIF{QsS03!t>T`l6a-1!V?>=&rb}S3Dshb+2o01D(aZ+~1D=eI zA7&+-w*Ye?3~w9&@GHus9S<#A_Rx+=1O`((fBU3K+vnFxq>fUe%MLq*T+a?}tl!rpTVJ46;6@h?R-jqz zNNFXCxglG2_7lY=Anh7!A%>*=4f_)eq!!1nkdzGG-9s2ZoFhr$0-^l*|jj<`Qj z=l?N^h#N9FQ78bNZL7}zKS~k?2^3UUR<(9l*B0kix_m9;x~n-&K;?=+!0s&$&{U5FD)9iYK>i<#6$D{vQ?}(&Z^%07*Xm!@H^20N`ti>XkCDUP?1B_W zwxjl{h0EUC8te_6_xx9HAMdNpwdKikgL&zW{eOI9asR^~9Za)(L+;GH*1TnpwNGf1 z%^4F{T`@g0y*vYG1;X#(|K$VY9?Q$4zuTQjJESusHv&imD4hs!0HEJ+4#b6xmgdZs zOs#aL^&X$qnV*s0UetN(?2^erTgaQ4XA>P6U~dzPh97xReQSF|d79f{^?AHODf0D= zPyO24Twr%ugq-ZErPZ^(GUF@if8No#r^D&=hMW#DCoe}Fx3itS%Z84smFkHtTZ?=A zuAE?=J>@mF=UG;A!Z$wOW<#N28oJFYm^KPUyarN2WRiKjLVVrd5-|U&Y*txk zULfQhyKStxIQlJhDV*B9p`zSCe`xkYv&8|^Mp5?pyg{+7n!!oW4@_GiADXGVAZGT$ zkF=9#%tgn+?-BZNYNNPr0gFkEMH_kr1k(}s=jRQTN()VFVC4z-p_{4eIXPIc!W}s# zmOozBf2HQf!{EWs>4K~c$m;8Cn=q-RBrQEH=**UcI8GW%Jlff3BP= z7gpsv0&RVhyK<)O>qxC!vU<~4YlbbypJjFA6lOeAIW4F**o!i90y(LY=<2R=)sGqH z%g)IQW@QGQH}|o1Ws6o`I6<;_LpJrdt`ckSWjl9VdD}u;2H?d+|Hd&6M|n+6(8HEK z@$3(GID=Wv;ykB3H_KVDc=N?umKM0OGP1HD@6|TDtLBw1e0*+r@yhj0?U#&kdJr6t zU)7RVv3BeB&F6gG3osxJNMgsVU?j|s1t zAG5S-NHp-kcJXnQi5<{Q1?($Cr1Wl1qXbFG1pv1vM8ZE#%CF=XOGp@Nv$%R|Ss>3m z>;75lUt@n&hf`9#VXrH#tg15oI+nHn{8!Fz-`U_x%N!+ z8N#oC%cLOwk8hTRakH1NZ5%jy zabRkBU2km;f>JscUC^;fRd4h*d%fj_1%<86&AzR#Kd>#A;H6!;jqZ)#dt`re-Gqko zZXB3;XU~RL2R!8-d!~3r$eWREcNS&L+E?qZoPXPE7fyTNfqM_`YgzW?HmA3weO8sH z+B4_gTd!zdx;t046y+C`m`oO1nk{to*WbCgFqq-b%gC}f-TL((u3z@%#szm?I3ZL} zv8_8Zlxa=jt7XBWn8=IVgY~ix^6e;JEWU2T8rcGWNf}|-09_h1j7j=-cr9dVxOzmy zNVG|EtJ?wdu4DEXTMCF)2M2K-c|TkrxpnQP{^nAwBx|u!Z$8DlY0;id>pp~?1i!c- zvHxycd-G%8U8$|6FJva!6x(~|vfZ=#rNh^(Xwuj4%$i~iom5)B2Cyiy0xLLWHERXB zbO(Gd33Z|pz6Qkz&$c84;d4K9#8sZI?9!D}{tJQbHTT`4{_6AZj}<>oYSXi+isZiW z_xCSQ1|Ip-O(vtEjjehXl>(E%;zmK$2rsTehzJvfUijloA6+ZfTq&Z0sUm@bfOF{9 zVp`9ib^X-8ZbFQE8(a9y6Y96rpPdlSmtOhTYAhDs_}eedR_1)^w+GZEMy-wQ+0*j3^p}54Jm+Ya&*ih-Pf|YrHRon zju`${#}#AGjA9-~D}=mee8+BNv;XJkKaW}e+^~5}&$ii>^@}d;t6EeZT3FpUcU)0! z!_>xtFw8qKQXg z40<>p!Kb{5o3%4Ja1lhFLM@&I>sRF8fGUfeP{Zad5Da814^+4*2=}9yPpoHQltoHe za!Q3CtHg!>TSDutj_!v#`3N5O!I1#3BZyi%i@Eb9PET;%iG*2nh0 zpbD>E{n^jHzGu><+fuTe&^YB~{d(CSc4>>g+0#GE8oI-Cd9ckD{G_2av!EoCIr6)@ zd&TYQ-}5K*^!gj=Bv7%cmR+PCUH1H)p$!x6+WxC6X3ko>vSYg_1^K=Ff62Ivu0k=vb|#^>#1w-_x4Q4XO7H3ex~YD|DIV=kXhSECm&%|7cEnd zUgW)N!iLbD%f5EGC+KQpY~@;hGkb!c-Oe7M)4^finiUIX&eLA9_k$HnwyOVg2;hhS zF(ltBLD>l!IP%hAAJnh15yVp~_G#1w9D9hB&pLjKV7^3JI%Z#eA?oc2xbi z{~5Cq%U@h3*2QKhQXM?i!Bh|}I1oF^(gvQo3In_fZ~Hv?Vw+q+mYY| z`icMyHwJ#X2oD_uZ#hm0y3X9Dh9aO$^9x80(L%Qjm~}1GguvFbGQ17BDT?|>^=Imj z?)|d*`XSq_J@+p%5Y$V@HP-nCoQ3|N`wUR*pa1d@YxxQ*6YKvr=biWdYeDn%cinf# z)eUaHG)Q9$qZGa(NAl7xy4po|UJ&7^>Y0V5?t#?2Y{wTO zv#XCaHa+`fAw*Y5T5iAF=J%Exv2(FK@s@?Ikb!q&?ka_c&p5R17T&rvLlLLaP(Mie zMPrjFN8EfY2Re|Pn#+#60lp3u;6)gQd}cGQbRdUD{1MuH^w^R6g17_h5BH9s6A#h~ zxhlKdMTI4%93keaM5u)r_}U;EOyVq=E^w7+SJChM1YONcEe#lWG2RSRWm0NVWoRFTr#hn65jrH84C5zq zvc>*d;|f(EeW>~7=C-!xfj~GMU>Wh;b?OV0MDg(9V}}O@0Pd~uhtY!~3A{ z)4}B5w95uZu23Tio6&q=>eK_x{eh(o4NK{DiP`MtM-_y!D8a+Z;kbn#G6?yBk_27> z`HSn7xz{y(cqt-@_z_1%Ns={?cYvp6mUup9i6?TFkiB^Xp8=kW_@m}gNbnYu(?;K0 zGkZdn?b1taRTE~{D5DOzQzA6t7-tGOiVFN0QNhSBZEVG%Q{1dQiE~&hH0J_V6`jH& z)C?ADy%HUe7@XjO8neZ+3qHJDO9W~H0JsAHgQT`|0%(C0MocD^4OV5eek8p<~|dmB7c_dd8_?6?IFUN$wS zDX(cmdHs3p`3aYfDef!{P4Ktvn$WfBx}NUqH+6|ZS38Zjj9|#0dQ>_byVvQqvS;BK z`=;bbPdABU^9yp*nEJxH7rvrY7Zz4se%}jg5uBOkEy(+Ij^E`(0=wK-=ijw&T`;(A z-(BE7)q`*LZFsNsp%N%z`F;B0sK|mM4QOLi|aArIIYVc6d&^khiW#2!QX?nvstcYAG@Z zk#UH2;X;U}%my1FWXQxHZpnR3yCWP!#XUa1FMV3?Di zGCxNU{RF!t3k)ZY)5)_c5tRne{1ijMvmsJ*VprrF?ut(3A!K6S&5G7ET60mu7{^+X zh7=+QnBIuwG}mspLZOVbFXJZ(zYro6S9x+In189QG|oqDMY$2cu@o7tL@jZg8UR$J zSg>oxZWQl^d2pmP=>)YE-NoAqb@}2Fow=>3JQVzi9s`jXZ9`iNKE|QclfclyGia`{pbhZ=`j3L{Fx@$g2te~g=_z6c{YN7d zV~SqO!-{x?5LzS%h-u=x43QSzIRY2nj`}9gPa|a26HfG6%L46)j;)5Gxc{6pv3p zIS6!(++t9A)Pz_hFQvi<6{@KaTfm0Mm?$27K;~mb=ites`;_mccN=BUxF7f!`WiNT zG=SEn3Humi3XJ&2(Q>?G#;_v!ST7}=60kT!JH^n;Ht0F)xv!QGa0ZF69LWOtPmdyFu=s=Xyh!zwF+Ge>Y=v8 zojM(j^kW##ZGwRWIJ~K!3H{n!pd1(EEIJ%bu{ozIl}SD2Sq=xOzh5uasot;60u*w0 z{3Cjy&hjySfWS}b-B9OIyggp}AZuYGcMlyrA>fAi?FVr)8p)J&H?TI1(G$cR4%q|v z5e7oq5RCvO{s@c;`u9c8Ab~~3XXF{=je-f3kE!^RO!V9@dd|sZ;nUqI%0gaW76q&! z7xvpuJzKgasB4laBS9T`ZUMqHdI%)TpIH>UsgDWiB~MeKy3iN|(f|wkBE`p|$E4&{ z$dU>0;!MbEH?(fu%(ZK0@^7Y;baICYnGY-VnEJ=8Li^!kBt{rZ5Mvt?jHGzR!`P$7 zbMQ3Y@3LSb4gmWiMd4921t~65M1RoEOb@ERLPH;B#nF8XGoM)Z^wYphD?SXatNw~T zh`ErRr+#^~ocf6|CKAVw>Elz4AJgAYdG>F{S@h=UQI$Yh233rVEhI2PVYO65L@OL{ z2U9(#ihuPv(64;)a}4SlDGxlD@E0!$FB_wIS1$`>`j3oJEs&Qcc#I_j{g4L?uqn_w zXj)a>U4RvvAryNweS;sS2Lx3~fUzKrX_(@y;5-D6!vbc3{1ApifdohAaF7QN>jbD} z>moe>sm4uR%Fs)+emA|W#Jc)=q|dsy&8}98#?G#b+M8NBcbwOgVY;`dxzvqW`mG}O z(kt#?D}8Eq*`u}QJ@1cjXif8lm5usv$Qw}xxjMphbGG_(*SxLQ_Nu>79&T7MYg{@j zO)sCiw&NG(K;!tr0p&8bCcJ04$P|C*8^els@v{Sh`zt&zZw@{nP$YlNqq$--bP zs11w52;Vp{ViFQP)9WB`ke7$I>1h5z(F&BSm2W|dLE={~0 zFmZB}Awt%n6#-urC`ODn>WC!^tqkIVKP>>_bgumX6`UsclGvpPT(TD=%-Dt|1bFo@ zu>$`9C@>8Kf(7&|?E~~xh&3?Y%Lsz2A)7kY076EK2dLsL^e+h68sKcG4Z#&r zt>Pcj>WtI`%f)TOX{H~X*S9h{UA(wj-Eki44XDRgyjC<^C*7pJsRr1DyT1D9A@%$0 z=qYP%qStrgqbI=g z4C##tICrf3!qnpQ;mvI{eHkm!`vqM@>mIGac!}hBYTi(WV!G+B==I_+zZ4r}U!6Kd zT_}#fea;^bsaJ?uw+}5eKR!O%EbeMnH=M@?D%JPS`$O=_^Dcsh3N0wonnBT|<&I9? zs7myEvA;aWcFs{>I>gL#-rjY1&L*x+)#pkJtahFe%JC!e08saw$cf%r7^q*M9%lN zByVi)W^ue)yNR9u>1GB*eZB2zsETaA>F>j97J$@0tY_a`8T-Zr>Bb`pvS~+m-Ms;v z;$!t=tyY}tDP(nt*W;himl*VN8hy#I5~mgDfk5Q+IeTphI174(W6hn7j)^}RS{G7t zot-WZ)W*Q4DG4YIW7<#N()45jx4@JjkS0r)cNOf@IRz_i?N^0#MLN4YflIjtg2o2n zIFJv&b`r8E_Gx`iTdd>GM(23e<)mk7XxO9>MhpQp2Y=TPe;c1m@Ya8-oCdE<)}EBW zM?;{tGv>Q5YENzE)!K998xtzV9<`*Vf22LqRO!M26sZdJYEqr(q}HCKtBbeizp1L~!^JC5pJ99nJAK?vbdUqgcY^ zfKddr=@C_%`E@59pS1KhQVxn*%0YNCm@S%lC{bKKQrZ-n z79uzCQaEZ-G;U>IN%NL2Ix{+8(_(JuVqzkC1IfE0arE!`KJ zlPq6ru)K*SAbrEm9)hkgwtBQHv;}NhJm6L42CRg~4g0zp%oZwf*OumzzDg=_jyJ>+ zRrTOTJ;szOSeoujAAy1R!!9ZTT}@UlQ5G%EKxSHAT4u4+gGbSiqUo~4QsTudSz?df zlUQmheN50|Uu!4~_U3p1ELfc}_DrCtG>t3JTuypah)DuwsG#~S7Q|o%Kb1lMp9?bR z6l5G6P=#R-q0aL`kmqC@P{^{ZkQ8FUvoX!k(1i{dCJXJD$Xhw(N}*6ICvmS+$;g^4 zWatv{7Lz6-^U2JZ)M$&!D8`BbmtmM{vNDO9BQ29Olaa1(WHl1a;<`Saog5c*T^|z# zDmi2&>;MH8)Yl*=g*#N!SJa`a7Kq1U`^5TJ~1afc_6fL+1hM`QF3%C)& z8y=bpq%!amI<3dzcTxJ8WX;;CW5kuhF>{&*#xI{(qJ^Z2S3lU#+SOP3ABP?rkp;P0=gV9S`=audw$12iet#fl1cBohJU0Wn}Ml~B|fx)82KcsrTg2`802GdON6JfqEnh6+<1 zq$LIEAz6e7R`Z2MYEZbTz*fRNOf*dyNxdLYt3b-im_P%XGCr{gJt`&)E9SU6iaHqM z{w)!@0SYzzA%`L;lcPRqwq>owueunsOc!u0n0}q_b(hk=8RKZnqSEH#|cmip53>d4>W?!lcc9_O-KYL+SD2%?RE-$7UQU zX9^_13a$kiFSVa*Pq!`W3czM@cD*e&dx~mTnn2(lOv@aX-;@#(QrAJemBZ} zR()T=iw(wlb|jF%ohZMc2Na-LYq^yQWI!e7{8Ie*GDTiI1-O=meh3s<)i&c!*g zmc%iUjx{dVZN>}POocud8tZBjtq@4hf-y%c{EevFx$&3(_uLtJwsUR5gprz1KDfi3 zLua4;>_PL|IrZ=vq?a?w9%MiKSD#_}H#`GtrhmB{5aj;lXFyaCfZmcI5ss1vN6Uf< zVql`|P3xmH@JW8B3@r#u1<;0I1&MExxw$VL`5~dV$)^b${S*WrI9>_-izLiZt38tF z3xpCp7vq-jY~fo-3YR8-7Co69A4%n+sa+IWP0|XBJL7T9i9$*!yn)u0kbeP+O6p?r z*d*l(G@W#gUrA~$1?CKrOyM4uH12(u>CU0YjdIA9a;#w5jw1}jg|&;Vd1`H|~UB=YgD^I!*DEo!_Lfu5ocsFxNxSrHpJ4*H~eaeGY`B4q-oRZ=_{;D*q8 z+_#VV6dE)Ow;&J2wJIo4kjf)NRwi+m_oreW7z!F{5R2yG5u`WDw9tX548jIo>1}EU z6*Xd|Jqhn8a?#&J`-x45)40tk~=U)jUz%CRcu5wmVUx7FP zGs^upkf4fyArO57)MsAJrl0Osy*Qd)f+c)R5!;C+Z~da z!Ul+o()bvJ7S{`Xa=9=Q&i*G+B`HWX!ld!R86I_%?q_&P5F1isAcB!6Skne|Mo|X- z6Lo6L2|de|8()YrGnzbO--R00B-+^k>9Y9)(5a-DR!G|!hkvP=#BpGZ;mM&s68hJ} zS5?3QJGrK39)H|AGpb@|H|9pyL_Mp4mQdy#*qS4hJ3V-6ew)m!lO5a={fnesr{lQE zOq;_qC#Z7Sbt#dQYfH0xm)7_%Pcv5{Gi zbO&HyU}6|-C(p9n#onY~VgMZ_aI#S|KIR1qA2{8_OODa-fZ&`&^Y4&JX+q41%NX&( zkPM><27IUjU5_pzMuhwEP5hMRi7(`*J;*h&>|}oGhc1ujJR-iT^H|PLah`O2^joq! z@M$!(yyR4R{sCJgmijri@pJSWj>&_Bm@FpaOS=sXDYmE4$I1fk8pVm}W~#o%hv|{{ zQ7KKr`g7~J>bYKDO}Z&9*RA9QPuLtLcK)cozPxn4$=}c!(7GFmQ1fsdYz3Ir zlY20Bl6UcG#u2T&v~fgMi&5CjBS^lbW7)Jt0rZf4h%WG0bVWINjPh*qV0JhQAv#-u*R8|((z#ETiKBwBEnp9gb zOsZ`S;e?#NzOaQGcrfW_-&bd<`&-?=U`{svu`jE~j(@-H^M7AUEV^g->E+6j$Nq9_ z^*OZ(=`1t~$l|N9q&4o@_xed_Lg&)YB4^$@fp9`O$DU=sr&^d5y=Sq~I;)Ge z>OiZ5SS({*49ws@d}AS^uh+*Szt&t}Qm+u!BcA^ja1b6_O%5-bGYR1$U`Zxp4nd%? z$0vKT8h}7z1o{Wb?rGS$UA;sl;n6IhA%}fJiNb5S%>_J<(H52I?5adxtbP0t1MtS>{ebnCtbHhaf;Gsst|+O6JE|{H)$#gKY45 zbx0kOe?X!o7bb@`^-BnPy6bAllj9~D@iglL`6~;x&;US}q!kio4a!BI737jc<8%EgBn{_ zWTb~ymmBAdt@@tvn?4S>tv>)yQOc$=Pgst&Mmk+a!S;Y1aCt%j8^}GAJ5Z&vOb=r5 z(SDvXo+t>`2DBz&_M8G=KMQ9Gp*>FWfb!vRBLKnGhEVbX5=zUktGgvT?8}tyQ$K%s zoj%(?1skyWrOKgaIF9~bVmA|>yLx*tXxku56;T0s%yzlPp|(T6Is)vx_8rs zZ>S%9H4%_~*Hu^T0x0{9mn4DZ2i9%9U{UJ`SpMZ&eog7zFE6< z92JkiP2%I47l+&6Av}Y9)o`zjkrhb^V4w+Uio^5LQ$OeyZ zb6oETi@X<^=P?3@75b)q4f&a*KFMxBA=oARFy2YWnzR~==p&X!tydi6SMn!*t`z#k z!C1s!C_yHRDv-_;aN4^qAHf0+-s*$T4{5F-m}LU@u))vB0f>=0dckUt2#9&Z%*{N;q+ zNr1`>SXB5&ifj&JM6c%j!-Naro*=|tROE@!R$AaB6Z@!N%>00TkFP|rbcCbui;6T6 zi|}CVfBQuY%MJlrbe&%jenBzp(^_m2y#Ozx*KxgXJtg|l7!uYh&4Ah0IS|Y8XE6yW zihyL0@R6tyEcocf63ohR#Zpw-Y7FAm()&11RU^s}0?vOKSxl>2{4I_^6ox7Qf6yUe z>EBxVp22h8D{a*=bRwjfTX#U=p>{4^hd4so_ZiNEk7^x%BWXeZFLjOnf29t7dcoQcH>KDD$WMC7K z%>l@$L6_(d;gDI$$PG-?Q(kcwO%bjnq!Em}aN@aaQ@^^&WMl;R8a%ItzgxAd^pW2) z_n|~T!^=N8`dAAqgKoBK@V}XLzn+7@EX0nfw}PSuZd8YV|H4&$n}5h$4;SC^we{nB>yzxuzsj$Aic%RYcfY^3xBz(1R<*8sti@j|*iv^LeE@S0l)%==W83x$(s zCcR!1{H}C;?~f>N_w^G4uIA0Hmw)n;$6Cz$J6c?sV2Qt1hY#>Nzg)em^wHn5Y`xBo zZy2+LzKz$D9iw{uqE zFk6Pqt2v!76V3SFeM|lOIMt(5c{APBrAfvwN zc!PP(nl*2(UXB0k?lo&vY}epFYf#_Bt|}z{NGIsJyVk5>jkt~eSi@@V56Lv%q`T;2 zn%P_tdyM_MFcdV3lu%Ik>cxv6uax=7rVvJ?#^xSQdyeULZL87sVy=*DuCjax$qv4va2sziS4F+m((}>o zYG^KVtEK0p=c;jCs*q~#wS1CrU2inCSNd9XZZEE*J?U$`z^*+ilLaO|U@jQMV9)U+npV0H>_DY{%5BzVnh?xp=YXH(e zh;1hj9K#}j1bAo|vWhK$=O-w_P*w?(vxw7!hS0AW1;Om&XfdJh0fmEI)(ipnr&WfUQJCMU2QbA*66sAaw!$Hd9GuPxN&11ZuEFc z)YY+tQ&<&lT@Az^UT%y@;@TABclx}s1JLfCf9jf%)en}6GO@`|Q#2*XCADtihXzOD zG3}q~92y}6G9PJ#{19q*{BHAVl@oUK4IT5Yt;6K`SF?0p~dn- zqgyPLm$5oZ1h-mT&54x0G{WSEG6hBY$z*$~* z`bI?6P!IekhH>&9P3=+C62D-Gvb#>TN7tOT{ltU;u5lzh4NWJ48I823-j>*4op$yu zdD`})cJU;9&gPhKAn2acx782|{046UG)D~Wb@~H#7f~fHJ5$3XkW`$Y^c|Q^{vB;W zgU_IuWEwi{G1`I#r#2>g`zQZKi31D}9& z?wqlP4TxOeiZ*d*e5mljc_5){rWC;3`RHQE1c>a>crbzz$RUK*I-}HFYP@N1w_lvu0E1rJGb0EkF8ekZd)_8s=0Pepp1lZ@ek~O z`-cv?v&7x8d-8%@I#gg~yBj{z74XJDenl?%^WvlOgzHB}dh_x;-pG9Kyy4ph8+$9p`Qz=G4s8w^?LR2E0tK-y}3edt@STdmR)bCfy# zAANL`zWV1t^f#>18OSA-`nGhKo57Umz}u++3e2#VSby{*Yl*3Nws<%;FdH|qpU`*z z>=>-|SP4+zviWiNCDn2LWl6P6p;8tkj^UY8&jhq*6&@G+c0c^$kIp;qM=w6Sdop`` z?rlH(-Df*?eD=E^-ZmFz+TBZM!Bvfos}8>W;g6e_Xg4)4-rdu^XGwGH9b8Vg6&KU(cnlUX zx$GLthn8_9KXA}jX4$-R=tykyPBGUqZpY9o;;lPlAEJte93SAbJFU2GmDu;l1|*dl?Y zJa6e!ckEeM*Vm0(>PwtOxTXKyt=iT6aj^$@vP@XojHH>U%Msy-WgO~)?BXdRWET>f zQkZ32tX+I%M{Hbd+z#=TSo;p~hr+Q+gcS1=? zSML4Zyz16!2fN+j@>DkW*y|^@G!&<&-|xuwR5bTAmQ3)f8?{RwNY8Smmox>k8W-=q z{o%(S^HXM2g}Qch9z1ScBc+pgZJzi3+^!NlqpGXgGiLRHM_%~;k;R=$ru9_j=6O-9 z&Ok#?bEU`SP&YVGirDe2KvPM&D=Ym0Iz;H(Z75`8PjiJQ+i`z-dT~R`#QN!vJ^t|R zdlxs#Cn&Kh5v3@M%A=QHfHcMgrxlL)Oq>czYOrPSEoTar=HSm^j->;`U{E|38&Hu- z%nYWa4h}pV+b-VlFq9{XNr2|8D4pZq)F?VI`pG z%}|)kcKD`!-rZ-+m<1k6Fyb1WFo@+^a`6^IN2SR|lh!TndNTTH)B`V-7E)p2j0xGe zkaxwfd%G(0aj_sjP`zGBDUw%haaksd44Wj<4SEbo}wBFc|tl49*C zS$EHQcy9MKS1J(`tpjW4T|8;x_W5Yf3VnV z7VjNo-wt(D=N2?}mzDQ4yYO_=f^cQ7!UV)LGzEMhH&K8L*(`hr8sP|n3j<)$yS%yS)5^Z$et=sYHDf* zQnooANQ_psvjFQi!pjEmK7XR=s6yIf8+TkT-Ww*N*+>?ozg;t%Ay z;W+)m8zmQucUr$ACJY2kE<@a{i|Cnw(M3!Orl?9jCmG3nKn6UQ4>G4}HVvZbhBk(T znjk^x<@^AWOqm>Gsw8A2s#{TigZk&IQ&RGRUe}mA?*CGIervufSddvF3&r^*Jtg<3 zZ{41PlwBrMVF)REkXg%BkZBdCeB-%qPUD$+zF@q4Dy3M)m{%ej!&Kp3;pZr&u4_g) z$Q;IbDwrY3GEiMuDCr=mGi93<8E?cCkg7c`&1nP4n9Qb>P(yoH zk67t&7nhg%Q`~h0IicLNEPw5o34ydcSDFaANwrFHif>F^SwV)$?#c-H8s>+@6luH} z13lB5pVG9p$>ug!Z(BX7HsD*nanpj93@<{<3z?klE3&8Mwv8K;V^3q(d4jc5moA=_ zQ{r#x>h8+TD8HaFG;ZgX<$il!W*Rb!fs(W8igG%-CkNbaZ+S~wtEZ$Vl#!d_NR!V$ za{iRtrZ~KgR3uT&v*r8F+j_~$N!EhCDLpO4>R;?BfvVbyB8$`Q2~@cY7O!15uPNP~ zpC)5C`$~M(lNa~T$W6<0J2Hz_)rbgyhxB`D`Uhqn><)?aPxu!yW^~G#1(|FFU>iIc zN7RvIc5Rkn6>7cU(F^uHv6|;3@JzaF_1vA)g8=pqdDlF@f6lV|-oB6wMsx4KY})vB zH%#}2&Z!)15YCY2n-m`Dspakh@gZjxr$Qvjs(Nqzd3Ez2o>efWAf2Sxgf`U>tp$>s2r8Pk#y>L9$O>^7;H@aI z(+K2cMR*1*Ki+jz zUG>&^-(BHI!+N%UPt(dDtYjVH^=zummKT&?b{AS*Mb3&vwX+@@C|^)v4#NoQZT3{n ztGIS}y>$A%0U{B|hoS;TcqD3$GMcU!DI)~9gfwRz3`x#l?*n)}IHZqRg|IgzJGEeZ zj@lDFq)wqMbA_I9zhN)F|2n(nbx&)7v&fMbFm)6Zi5U4Eos^c(XGtll%5XTCDEYN@ z4I~gS?-Zt({j3(wHE04quZx>Qj z4f=$<6bJ?#7eJkWANlVJy2%>bG3Gf*cupNd_3vR@m95m}_~UCAJMhM6jOec=A9j+Q z^=?N|@ct&h6Oc-pGXWm{|F!oWP)%*k!a1q*-W3QLDp zSTIDzf`W=23-;bCDvG^byJA-qMO5q+h4{}tA;`Vgd++zwd*Axrdg~7)XPTr>B)HIZasF4cT1JaTf;YFG_we#~Z z2PjeCURIZ482GatpR|g3=-@| zwl}J}diP;5?ffIcyw%mc!y^3cn5;hDuBz>@L+NFQ)xg`o>-)_NaZOK&_p`C_i%&^+ z4Vl>w?D~7?>8i_yYAI0|nhtJ?2V`h&2jonH)n7xuhqk_%zPb_xSWO6M!wXg5&CO|E zcJOu)FCc7ml8&yr9Va-B%i(b2f;o2Tx;hwkRnJ5nTdhSWGqhX_{JS2&*aEm22+|bT z6>vk4u+jz_5l*MG8MKWJ#D=hwFr#8-WF2IL3O%O6D>BS{&CH$fG`De2POmNuNL=-_ z+-}r~8Ii=6HC9soWK|L~&`K$G`k?~wrbeQYzDj7c0C!bY`3B@1OuccvbFuBL`e)H0?Y3b`Y(Sd(nwhz<(%nRNPHnHqF_&+#cG+aQrL$bj%zVw|TdrN(rDIM^ z?+@Lf`g4?3+)~Qcoy;e;R!JCAMkoO=iF0%WHzMZ=kf=tND2y^XU#dVMDU2f&=1wpU zKq=F};|N+gXvj+#9IS$W%)>&T3gv!-FC2Y?nM;Q>;IrPbV^GKA@#A4v33T_gB`}h( zkYTWGfzb@gIufRkH_3gPKzSI9HQ_M=d1i-^RxnWr`8yXmLK3D+kR;tD%_ET-o$f;> z65k~#8a+lN9z8+wJ{1|bL(3)T{2@aEI}cXGyBQSy2MW;{w2?2RF7Se$E}fHwHnk>w z+r$9_CT>e_Z=^627LE)I9Jx@YQtv)2#NIw+n0q}&QUrgHr~xP;%D^B&vILYoz&<3! z110%RQiPD7NPuPMiAW0Qm%!gI2HIB+oS?$2C}1Rkfx|h;?I~o(GP2{8jU8ofYUGk)n336P2fR1fD*9( zCpy&eP+}Tj<;BC<|J|;&SCb?3dnixT^{|8qQBSgAIKT|B2A?kdVJEN@cI!!?>r)sy z`YX;}dUTp8f|8m6yqz!b`!IY4aHJ0A0$VOV$k{;9UH{|&3D%zc(<0K7qyMvT#E$`S zgk4(DV3Ms&2lcTF!cBUxLL4@#nz&ecq}Xb)I39YQ5x7BewT-u({*wqoiW^b-xeZ_$8M=nM^$IhyigF0d2(j+f zU(nAo$jmIbeINOHQu|d|d=j;l?QQ53Xzv{4YDzaYir}Qvo z`CInUr>Pm+S>SBlL6niQ;@*AOaeR(%QHqZnyyMF@(AC7XU!sF;L?0V-&;HBp`X)F# z$NE{D8YUa+y2j-BhKw5GrlG|(F#6Vqd=+ZNwk83UY6iGV7^ea1eF5%qpcNqjy@EeO zz!(b;Hv^>m0Ob@IjQ|>N#_)z!nx-=R(m^Mr zCp!^{jZMVV7}$g$avIh%GD&tJF%mON`5~k+$Yi>5M|2kelNv(qu&;}j6@$lxlQqVx&dFI&HKbh%Av z`qin?>D<_K%_=e62NQhxP3JzL$1^2{dX5gXj{#CFB9h7=T9fMwj3xZ2%$IAY;G< zP=_)>(H^=i5?CYP@*=^r(k?ik`%X6WuA)%#HH;l8lSD=Wn|T3#BB5;f5d1V+ojie~ z@Pko695l%5U|tAi%MV|>AtOFmuxwl?z!F*j<^pWNix=WH(HFSucBZ+jy&XHyS;j<1 zztJ`p*619_wzGFNr!=Cysc$XXre@YgGA7n&WNl_jeh$X2vMSiSy9Op15(-ca1 zwCt(dPLjx-&k=V}mW`&Nwz5Q7+weQTGgk-7MUubLMJ^dgx}CRkB+dv!50J-YqLqY( zPho>9*NPxM1U3y|AMOtp-9Mcnw@I*LCibdIn3YM7?xs=5U*3HsL+rhRm+rh09*qcD zkC+4BC)k^)8A5L4m#&*tRSy%$txCZZJi6kFm>gug4jh9q*mMMfrFtC94cMT=klh#% z5QTmlMgb-PBGE7@&|xUV`~NFxy1|4>NCHUnrKlgxTL}MrRa^k-7m}3}DUhbDdx{Qd ztHN({n}ia8(n%CRAp%$cVPuMa+SmT=V`?)T!2St5f^Q?K6ZlC7UZp2`Zw|0y7(Zg;lex_K97vP;$sl7(b(X69m`NaquVrwl3g=^M}|($2-n zVWx(rDU$j+niI)vaPk=dZ}5>IvHZi}#xccr<7f0<5EoO$iEtM5>74_qt@RvC0a$2+ z>KFkae>xF7IPf`WSco^BDip&SWXwPZOaK|So;n`x1Qw?QiZKL*7$1d)Aa0S-H7cGouE@MbGr~_4TBf*iG4bQ6RXub&8$YkSuZU z)Xma}{-vAKeMj;JQ>l|>8|x0rwn=AXVH$I0V;WhaxNE|Ki_sF#=@F6B;T6(ku*M_N z>w)wd6T8z0PZSdyw1e;uQvqx;39{Px`d0boyJABgv_0hdUZEc5<{qKF$Rwnf#ZVB7 ztPc_`PWX7ILvs5EDSnYSp5Ydeq5Ah3JgQ|-^m-^dQdZJ&s5ftF6y*1TE9B4Y4blc61_R!60(6W-ASw7p zWOpQC0T*B+EP#BWW37lhQx?Inh4CN*s?q9UvQyBEN9Sr0J%^3{`i=mIMz4AL2E~yP zx6TLvY5=x7umWgf2=Bp_?uA|T^^568+SgGeZ73b^d6G__jF1kzGSZ+pGMjp#t-c;) zq{OyBaAAQ`LV*;(1F8h!F{1BC6rxJ%i6>n;4HBWlfMvh~nng{e)U>D8x5K5L+Igka zpmukr4}kT1D7TexfdZ3U@rOpTCovCSW)9Z$~AzhWWQAv%4O~RzIVp$P| zK~CJCqM@y{S_{@-yTc8+laf=!(qXah?UadjpeyPQ11ZP2P{njvi<8~|6G z0)Z7)qM(eRk&uujG?IEqZ$l4eFQq~En(uGP!H0|+AboOVz9+YyOTozV;50$ZiWt?1 zg^@bW^X#+-Z5-4?w^y{CdFZ!OR0gGrOb0G1rKgLJ=^V^?q2t(j8lBkmrl2`vW1~R3*}z}nAS>hPj#Slw1A;NYUT0L@#38m6TN%VIvUAL8u=)N zOnIVZrq##CWeBpx{5v4g14K@vUs~3R=P40>M22 zy{!Sm_QEdH!N2J+i3(f`&??&q?G@fjnLbY6QQyExUrCupcH_E9>B>}!ikpWsLs^YMqta<)j6tLAchCHO3V;B% zR^XcX??#b!&_vls=##uBxlfiuNO_3EAO|JY)S)0J&@G+p=~gsa)^AzP3C?6?6*VeN zTUAv{S*eF<$gAr;2=PooQdg3#!KI_DptKs(L!=^@+JaTQLI zzw|&XKZ=A1`!Y23RJYA zsYadw6dt3Z7XfOK7ZPDQ5x<@YGl=-zL|BOkpCH1ZT_a_XuXlzqk|o8fGfXCFP?9>s zly33VZebe9h?3ozhE6i0pj8H=Dnr|alx3Y^C6WXAac5YS6i?Oa469S7QZqWk8r|Y` zNp_4@B3^}Pzr0_nsLe`xM7&zJcnuU*vL@oSAgrN;6JcEl>nQmVVZCnY^&zaK6ivh% zbc;8Ju!d495#NJIlTUDV@e!5T~5@d>*K>}fcK*$yI1^F(_z}#GBEI%t-EMms;L_A>;FT*8{mnGma zBZDK{n1Lb@Pb`Y%WfkUfg$X>N2r@BQE*x(n4N4+UAjHs}nAeYa}V4?>u%tS#UGml%$EEMseK4=4qW{L&ObRmx`<~cDl_@aVbZm|=S zo1eif5c1(^Iwax2l`CQv@Pv7Mu^5U=D<;~T%TMR!qq5+Eh$#>%0-2}=r$6_qKq$y4 zOcy&b5%?f4BoTI1z|Uun%I2qMcWc=wsFa_do?Dm!u1bSkRsc2qEUPyG0Xsg_BIe~GBoOkU)(pX@{9FOId!+z9 zt{hZ6A?l6*1`>V?#RY|8W(E&+6G1qems{|Ahyq6C7k4H{0|LVV@X6+<@d3gvq$oJ; zBLqL*Tv9HC(n!UaI#8w@Qa>PA(Vz%nE-b}h?UpGgtocB zDNFBe-lC>%8X@FfM>H5FYX&4Jr?{4zLk^QT?bL zsMYBZ%I|8IJO>&fgjpzM_ZT!b@;;!J{PS3$HVUBLLa0Sdv>x>zVV}HSc`2x#KlT9i zj0t0g;FJ!(zlPZ;fCg$SN}Ue9DTKP@c>QPCBM9XZy|;t(_K*wVT^f=8*QLwb@W+<@ ztFZl9IvT@#m}N}pIl@ka_o!Ej`TDCK$ourGcJ+pG6gYr-BJT?tCo~7psG+&U@9b*^ z#Ec?(E`WH10e_8qXiombDl|?CED#X66fuQxR{*d^n1|r47)?|*!eNA4xsalJX@4AH zIgQFE#-n@biWwrG9di6ZIFJTkIS#u#3x6hVp|&)%{PuiQtL-!0XHn0xo=tex^z3U( zUCWv0gPtcp&u(#jzPKA5MwFP}b^i$Ny3=SL(5Ii2n4rbKdk(Fnno(KQ0n{+6FZ_CU zJw+wuLvN!1wnYSd5q$>;W81M6pfEtA9tdz00<_Rf`>OP?29_aAlFE3${}hBSc0%Lado8oI~gBIS8=3+{hyRW#$clq=i*M?VtTGLlk|i`#^`S#09piH$c0WJaQmS@ob`tS zsZ5TW_~zI`>o8@X>b;56NOjD!eFxvUGeh%Eal{F)7qt)9QSD##wiF!eeMa6dZ08@o_matTDWjbXLm99%36vxuVwb2b&$`9s>vSIZX z3-Vc7xCV-3=rUq?8F_;I43-(*6UC_L>i^`Py0L#OJG>WqPSG{*{yc-njN@nJBc38U zC=juaIBsUB?#9BsaW|Hin#I$YX`g#`e)@v3LS@^(l`{oxmvA)DmeR=SKYGlkT~a>(_WkXr9zVS`h$T)qH-k;fn#$s6dD!;wv)1EAoDuJwI@l*z zWk0#?arEcO+}GRu)M6{%H++jq*y4ROT)Jfu$F?fdcjA_qy1ipW1FyXN>Yq1%n_5^* zScESqaO#YACk)XVW1Gx3{*XS!oYp6|sf8c_B6Z#JGY zUb;a<&b*bJetVt9A@1vRJRUvPrbgleR)^zZEU*$p2&1ZN{S#rrg}hwESq}tGnvg0) z%m_ZP)VvIq0j`IV({$Cre%{-|+Y$5>?i>%?9F=NCHNp)fdd=;_#~!pK4S6Dr+Vjyu zY~|McW;33E5|~p5;!tr-cuiPYNT;BXF3kOdpinS^?+UT5ooqNEC5 z#yQTorwb&)lN3G2FlrPYf%jM3zVOAO27#(yXx9bWZ$^w8!Plg9R2 zeRAW=^#>Vrla?J<-rPC%{>7IFj&G~M!^Di8wnxjaXpNNF9@`kSeB++qvcsPh@aFbs zpD@;V^>W}n4!&WU68?FogUgM{2NV6j&f4ubQGCvESMSiKx1r%j4Kw4<_N+5KF(_@Y@M~7B z4b%NW%Gx#ahHbKwT)44w*;C4%^lLly&Kx~6y_ZVj1V-x*jaL#Kj|iQ$hhvjJt-aG& zuG()@!{o3VTD7NIHoh*;ai$GTJ+<2*d5Kle;UP^XdS(L7d1JODXIkW{oXqsmRX6ZU z^UM_#un8#OLtKll+_~E8gKi79M7oi`U(zAtt_<)-F*P$4V228U4+tU!;;Lx6Yf@1$ zWw>V7+^6ASZ2seS6z<07g!7dxD~G0KU-6wgEBWTd#YQLoyA%%a7O)nOwUfemI=iv| zrzqTClr6?fm!fVmsipJq(m8l(WfyQ5^xEZdcrZk8_i>i)yQX~8_5r%#StI#P9}$$i7!(*5_$ zNQbX_2(~?)P&{uGSY^C>dFw)ySr6{YV@XyfZ)dDeiwVh6YVz-6R`nI1Yd+j0P#%&?ViCCaZ+emc2X=pW87bf1~M>$#=roX_c$b&SnoEX%?_;A@8hZ zOJ56{={=oOZ*!&vPIEBOyvgk|H#;@OB&;hOrlM_=2e?zvUP2} z4M$J$ycl(S_|8whVR3sKpWapF`a0a4<8+aeqR}HV- zIXbt3G1g{e@Fsdr^Yv2?trpKOJjs$8SKw0P>A?KsfVTf(Hu^7F{ca*jP3d+V$WABo zuS{XVF{qy+3NZ9P?^IbDz;*n**T-FdW~8z#smu*-SJItk_q9EDWAwJ;yIQ`!`1YMC z%AMY9aH{G1%sSd&Jh)qSHI^stUZW?``LjA_MNf$dn$e

1vtXCm!(NR4GQ}ijJ#+2=5=|059 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 #?*GUK7-%Cw1Jb-neD*&3yd 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 literal 0 HcmV?d00001 diff --git a/shared/html/images/SplashLarge.png b/shared/html/images/SplashLarge.png new file mode 100644 index 0000000000000000000000000000000000000000..d230c50c0b42a93fb84efc963e147b1b50d4458f GIT binary patch literal 7234 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 literal 0 HcmV?d00001 diff --git a/shared/html/images/SplashScreen.png b/shared/html/images/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2338e5af8160819c87249aee67e39efb736c0d GIT binary patch literal 1330 zcmeAS@N?(olHy`uVBq!ia0y~yV9H@&VASDY0g7DFQIBU}VEO6k;uunK>+Ri(xwjHT z+8(ZtY!E!e(Q`p?7N?Ne364lb;UhT*I7%iRV!Nxb*I{aabO*26&)QEm&u>jC)!F;0 zxBmW~V-m?(XMGvE1kD_7FtqT(h(u-qGX^Mu5N+W_h=N(Tq+rH?<&n)2prJLJnQ&T* z%bg5~kCSyiS;syTYus>gRl5#bTJGe?cb~oQ2$U3T@Owhb3kuH;QV zQ?>l9K{kk&apl{urEmYQ>6AX?HaYP1>}|=B!sac#Y>Tg{=Puu@md7D|*7fb)EniR0 z+M$?ZBDOU+^YwhwLgyP9T3N?0nVEpi2)J_3>vknrU)rK?`M31IihJJujtsQ+x&0I@ zG4cM5F!2~$@9B9{z;+2|-cFtADi)b${^)Oq^r2(wOLM2EK6^PyCH5K6S%z=7$hy7N z2ih|u=hnS0klj9Jxyu)U+%wrbdj1NabC0E5GE>O{`Jv|4xlXY2W^eOeRCagA-w!hc z%-WXc_N<82&Rf04R;8u)VW#x$io)pFhwlW;_O;yJlVV-ubgX0c8pRxuZt}?~UD1>7 zJpcM6r7D9;_-9Hf`w*B7zhuv{uRDkdE(Kp_tPl#UZWxqb$XR z7nIT*Zanakv2588cy8;t0_PhJz^MGOVux)?wk3yj>7#4Ui?s#J)P&6goo{G}gGgYa zM^4n(laSqQe{F{wE1sR?5-?kJ^T|yiAXRxLw(MHNhQQNSpLLG%CN7@k2ej%4ZwqfB zbE5MdhZ_RsExbo~Azopr0M=UN)c^nh literal 0 HcmV?d00001 diff --git a/shared/html/images/splash.default.png b/shared/html/images/splash.default.png new file mode 100644 index 0000000000000000000000000000000000000000..c951e031bdfa0d4ebe68d52647f14caf710ca471 GIT binary patch literal 2146 zcmb_ee{2(V6#s5lN>g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/shared/html/images/storelogo.default.png b/shared/html/images/storelogo.default.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + + + + App Installer + + + + + + + + + + + + + + + + + + + + +

+
+ + Splash Screen +
+ +
+ +
+   + 请稍候... +
+ +
+
+

有多个包将要安装


+
+
+
+ +

Install {Package Title}?

+

{Package Title}

+

Microsoft Store Application

+

Publisher: {Package Publisher}

+

Version: {Package Version}


+

Functions:

+
+
    +
  • 使用全部的系统资源
  • +
+
+
更多信息 + +
+
+
+  Installing... 0% +
+ +
+
+

Reason:

+ +
+
+
+ + +
+
+ + +
+
+
+
+ + + \ No newline at end of file diff --git a/shared/html/js/animation.js b/shared/html/js/animation.js new file mode 100644 index 0000000..5b44fc5 --- /dev/null +++ b/shared/html/js/animation.js @@ -0,0 +1,188 @@ +(function() { + "use strict"; + + var AnimationKeyFrames = { + // 弹出(从边缘) + Flyout: new(function Flyout() { + if (this._instance) { return this._instance; } + this._instance = this; + // 向顶端 + this.toTop = "WinJS-showFlyoutTop"; + // 向底端 + this.toBottom = "WinJS-showFlyoutBottom"; + // 向左 + this.toLeft = "WinJS-showFlyoutLeft"; + // 向右 + this.toRight = "WinJS-showFlyoutRight"; + // 从底端(别名,向顶端) + this.fromBottom = this.toTop; + // 从顶端(别名,向底端) + this.fromTop = this.toBottom; + // 从左侧 + this.fromLeft = this.toRight; + // 从右侧 + this.fromRight = this.toLeft; + })(), + // WinJS 内部使用,建议不用这个 + Progress: { + fadeOut: "win-progress-fade-out" + }, + // WinJS 内部使用,对于搜索框弹出搜索推荐 + SearchBox: { + // 显示搜索推荐 + showPopup: { + flyoutBelow: "WinJS-flyoutBelowSearchBox-showPopup", + flyoutAbove: "WinJS-flyoutAboveSearchBox-showPopup" + } + }, + // 渐变 + Opacity: { + // 显示 + visible: "WinJS-opacity-in", + // 消失 + hidden: "WinJS-opacity-out" + }, + // 缩放 + Scale: { + // 放大一点 + up: "WinJS-scale-up", + // 缩小一点 + down: "WinJS-scale-down" + }, + // 默认分类 + Default: { + // 从右返回 + remove: "WinJS-default-remove", + // 从左返回 + removertl: "WinJS-default-remove-rtl", + // 向右移动 + apply: "WinJS-default-apply", + // 向左移动 + applyrtl: "WinJS-default-apply-rtl" + }, + // 从边缘 + Edge: { + // 从顶部 + show: "WinJS-showEdgeUI", + // 到顶部 + hide: "WinJS-hideEdgeUI" + }, + Panel: { + // 从右侧 + show: "WinJS-showPanel", + // 从左侧 + showrtl: "WinJS-showPanel-rtl", + // 到右侧 + hide: "WinJS-hidePanel", + // 到左侧 + hidertl: "WinJS-hidePanel-rtl" + }, + Popup: { + show: "WinJS-showPopup" + }, + // 对元素的拖放 + Drag: { + // 从右复位 + sourceEnd: "WinJS-dragSourceEnd", + // 从左复位 + sourceEndRtl: "WinJS-dragSourceEnd-rtl" + }, + // 进入内容 + Content: { + // 从右进入 + enter: "WinJS-enterContent", + // 从左进入 + enterrtl: "WinJS-enterContent-rtl" + }, + Page: { + // 从右进入 + enter: "WinJS-enterPage", + // 从左进入 + enterrtl: "WinJS-enterPage-rtl" + }, + Exit: "WinJS-exit", + UpdateBadge: "WinJS-updateBadge" + }; + Object.freeze(AnimationKeyFrames); + /** + * 生成用于 element.style.animation 的字符串 + * @param {string} swKeyFrames - 动画关键帧名称 + * @param {number} uMillisecond - 动画持续时间(毫秒) + * @param {string} [swTimingFunc] - 缓动函数,默认 cubic-bezier(0.1, 0.9, 0.2, 1) + * @param {number} [uDelayMs] - 延迟时间(毫秒),默认 0 + * @param {string} [swIteration] - 播放次数,默认 "1" + * @param {string} [swDirection] - 播放方向,默认 "normal" + * @param {string} [swFillMode] - 填充模式,默认 "forwards" + * @param {string} [swPlayState] - 播放状态,默认 "" + * @returns {string} 可直接赋给 element.style.animation + */ + function generateAnimeString(swKeyFrames, uMillisecond, swTimingFunc, uDelayMs, swIteration, swDirection, swFillMode, swPlayState) { + // 默认参数 + if (!swTimingFunc) { swTimingFunc = "cubic-bezier(0.1, 0.9, 0.2, 1)"; } + if (!uDelayMs) { uDelayMs = 0; } + if (!swIteration) { swIteration = "1"; } + if (!swDirection) { swDirection = "normal"; } + if (!swFillMode) { swFillMode = "forwards"; } + if (!swPlayState) { swPlayState = ""; } + if (!uMillisecond) { uMillisecond = 500; } + if (!swKeyFrames) { swKeyFrames = AnimationKeyFrames.Flyout.toLeft; } + // 毫秒转秒 + var swDuration = (uMillisecond * 0.001) + "s"; + var swDelay = (uDelayMs * 0.001) + "s"; + // 拼接函数 + function buildOne(name) { + return name + " " + + swDuration + " " + + swTimingFunc + " " + + swDelay + " " + + swIteration + " " + + swDirection + " " + + swFillMode + + (swPlayState ? (" " + swPlayState) : ""); + } + var swResult = ""; + if (typeof swKeyFrames === "string") { + swResult = buildOne(swKeyFrames); + } else if (swKeyFrames instanceof Array) { + var parts = []; + for (var i = 0; i < swKeyFrames.length; i++) { + parts.push(buildOne(swKeyFrames[i])); + } + swResult = parts.join(", "); + } + return swResult; + } + + module.exports = { + Windows: { + UI: { + Animation: { + Keyframes: AnimationKeyFrames, + Animation: generateAnimeString, + /** + * 异步设置动画,返回一个 Promise 对象,动画结束后会执行 + * @param {HTMLElement} element 元素节点 + * @param {string|Array } swKeyFrames 动画关键帧名称 + * @param {number} uMillisecond 动画持续时间(毫秒) + * @param {string} [swTimingFunc] 缓动函数,默认 cubic-bezier(0.1, 0.9, 0.2, 1) + * @param {number} [uDelayMs] 延迟时间(毫秒),默认 0 + * @param {string} [swIteration] 播放次数,默认 "1" + * @param {string} [swDirection] 播放方向,默认 "normal" + * @param {string} [swFillMode] 填充模式,默认 "forwards" + * @param {string} [swPlayState] 播放状态,默认 "" + * @returns {Promise} + */ + RunAsync: function(element, swKeyFrames, uMillisecond, swTimingFunc, uDelayMs, swIteration, swDirection, swFillMode, swPlayState) { + return new WinJS.Promise(function(complete) { + element.style.animation = generateAnimeString(swKeyFrames, uMillisecond, swTimingFunc, uDelayMs, swIteration, swDirection, swFillMode, swPlayState); + element.addEventListener("animationend", function() { + element.style.animation = ""; + complete(); + }); + }); + } + } + } + } + }; +})(); \ No newline at end of file diff --git a/shared/html/js/bridge.js b/shared/html/js/bridge.js new file mode 100644 index 0000000..f41c198 --- /dev/null +++ b/shared/html/js/bridge.js @@ -0,0 +1,41 @@ +(function(global) { + "use strict"; + var ext = global.external; + + function blankFunc(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { + console.log("blankFunc called with arguments: " + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ", " + arg6 + ", " + arg7 + ", " + arg8 + ", " + arg9 + ", " + arg10); + } + + global.Bridge = { + External: ext, + Frame: { + isIe10: function() { return ext.IEFrame.Version === 10; }, + isIe11: function() { return ext.IEFrame.Version === 11; } + }, + UI: {}, + String: { + trim: function(str) { return ext.String.Trim(str); }, + tolower: function(str) { return ext.String.ToLower(str); }, + toupper: function(str) { return ext.String.ToUpper(str); }, + }, + NString: { + equals: function(str1, str2) { return ext.String.NString.NEquals(str1, str2); }, + compare: function(str1, str2) { return ext.String.NString.Compare(str1, str2); }, + empty: function(str) { return ext.String.NString.Empty(str); }, + length: function(str) { return ext.String.NString.Length(str); }, + } + } + Object.defineProperty(global.Bridge.Frame, "scale", { + get: function() { return ext.IEFrame.Scale; }, + set: function(value) { ext.IEFrame.Scale = value; return ext.IEFrame.Scale; } + }); + Object.defineProperty(global.Bridge.Frame, "version", { + get: function() { return ext.IEFrame.Version; }, + }); + Object.defineProperty(global.Bridge.UI, "dpiPercent", { + get: function() { return ext.System.UI.DPIPercent; } + }); + Object.defineProperty(global.Bridge.UI, "dpi", { + get: function() { return ext.System.UI.DPI; } + }); +})(this); \ No newline at end of file diff --git a/shared/html/js/color.js b/shared/html/js/color.js new file mode 100644 index 0000000..f39f9f2 --- /dev/null +++ b/shared/html/js/color.js @@ -0,0 +1,463 @@ +(function(global) { + "use strict"; + + function RGB(parent) { + Object.defineProperty(this, "red", { + get: function() { return parent.red; }, + set: function(value) { parent.red = value; } + }); + Object.defineProperty(this, "green", { + get: function() { return parent.green; }, + set: function(value) { parent.green = value; } + }); + Object.defineProperty(this, "blue", { + get: function() { return parent.blue; }, + set: function(value) { parent.blue = value; } + }); + this.toString = function() { return "rgb(" + parent.red + "," + parent.green + "," + parent.blue + ")"; }; + this.valueOf = function() { return parent.valueOf(); }; + this.convert = function(type) { return new type(parent); }; + Object.defineProperty(this, "hex", { + get: function() { return parent.hex; }, + set: function(value) { parent.hex = value; } + }); + Object.defineProperty(this, "color", { + get: function() { return parent; } + }); + } + + function RGBA(parent) { + parent.RGB.constructor.call(this, parent); + Object.defineProperty(this, "alpha", { + get: function() { return parent.alpha; }, + set: function(value) { parent.alpha = value; } + }); + this.toString = function() { return "rgba(" + parent.red + "," + parent.green + "," + parent.blue + "," + (parent.alpha / 255).toFixed(2) + ")"; }; + this.valueOf = function() { return parent.valueOf(); }; + } + + function HSL(parent) { + parent.RGB.constructor.call(this, parent); + /** + * @type {number} 色调 0 - 360 + */ + Object.defineProperty(this, "hue", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + if (max == min) { + h = s = 0; // achromatic + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return h * 360; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = value / 360, + s = (max == 0 ? 0 : (max - min) / (max + min)), + l = (max + min) / 2; + if (s == 0) { + r = g = b = l; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + /** + * @type {number} 饱和度 0 - 1 + */ + Object.defineProperty(this, "saturation", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + if (max == min) { + s = 0; // achromatic + } else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + } + return s; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = parent.hue / 360, + s = value, + l = (max + min) / 2; + if (s == 0) { + r = g = b = l; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + /** + * @type {number} 亮度 0 - 1 + */ + Object.defineProperty(this, "lightness", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + return l; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = parent.hue / 360, + s = parent.saturation, + l = value; + if (s == 0) { + r = g = b = l; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + this.toString = function() { return "hsl(" + this.hue + "," + (this.saturation * 100).toFixed(2) + "%," + (this.lightness * 100).toFixed(2) + "%)"; }; + this.valueOf = function() { return parent.valueOf(); }; + } + + function HSLA(parent) { + parent.HSL.constructor.call(this, parent); + Object.defineProperty(this, "alpha", { + get: function() { return parent.alpha; }, + set: function(value) { parent.alpha = value; } + }); + this.toString = function() { return "hsla(" + this.hue + "," + (this.saturation * 100).toFixed(2) + "%," + (this.lightness * 100).toFixed(2) + "%," + (parent.alpha / 255).toFixed(2) + ")"; }; + this.valueOf = function() { return parent.valueOf(); }; + } + + function HWB(parent) { + parent.RGB.constructor.call(this, parent); + /** + * @type {number} 色调 0 - 360 + */ + Object.defineProperty(this, "hue", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, w, b = (max + min) / 2; + if (max == min) { + h = w = 0; // achromatic + } else { + var d = max - min; + w = (max == 0 ? 0 : d / max); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return h * 360; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = value / 360, + w = parent.white, + b = (1 - w) * max; + if (max == min) { + r = g = b = max; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = b < 0.5 ? b * (1 + w) : b + w - b * w; + var p = 2 * b - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + /** + * @type {number} 白色分量 0 - 1 + */ + Object.defineProperty(this, "white", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, w, b = (max + min) / 2; + if (max == min) { + w = 0; // achromatic + } else { + var d = max - min; + w = (max == 0 ? 0 : d / max); + } + return w; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = parent.hue / 360, + w = value, + b = (1 - w) * max; + if (max == min) { + r = g = b = max; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = b < 0.5 ? b * (1 + w) : b + w - b * w; + var p = 2 * b - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + Object.defineProperty(this, "black", { + get: function() { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h, w, b = (max + min) / 2; + if (max == min) { + w = 0; // achromatic + } else { + var d = max - min; + w = (max == 0 ? 0 : d / max); + } + return 1 - w; + }, + set: function(value) { + var r = parent.red / 255, + g = parent.green / 255, + b = parent.blue / 255; + var max = Math.max(r, g, b), + min = Math.min(r, g, b); + var h = parent.hue / 360, + w = 1 - value, + b = (1 - w) * max; + if (max == min) { + r = g = b = max; // achromatic + } else { + var hue2rgb = function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + var q = b < 0.5 ? b * (1 + w) : b + w - b * w; + var p = 2 * b - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + parent.red = Math.round(r * 255); + parent.green = Math.round(g * 255); + parent.blue = Math.round(b * 255); + } + }); + Object.defineProperty(this, "alpha", { + get: function() { return parent.alpha; }, + set: function(value) { parent.alpha = value; } + }); + this.toString = function() { + if (parent.alpha == 255) { + return "hwb(" + this.hue + "," + (this.white * 100).toFixed(2) + "%," + (this.black * 100).toFixed(2) + "%)"; + } else { + return "hwb(" + this.hue + "," + (this.white * 100).toFixed(2) + "%," + (this.black * 100).toFixed(2) + "% / " + (parent.alpha / 255).toFixed(2) + ")"; + } + }; + this.valueOf = function() { return parent.valueOf(); }; + } + /** + * + * @param {number} red 红色通道值 0-255 + * @param {number} green 绿色通道值 0-255 + * @param {number} blue 蓝色通道值 0-255 + * @param {number} alpha 透明度通道值 0-255 + */ + function Color(red, green, blue, alpha) { + red = red & 0xFF; + green = green & 0xFF; + blue = blue & 0xFF; + alpha = (typeof alpha === "undefined") ? 255 : (alpha & 0xFF); + this.rgbData = (red << 16) | (green << 8) | blue; + this.alpha = alpha; + // 红色通道 + Object.defineProperty(this, "red", { + get: function() { return (this.rgbData >>> 16) & 0xFF; }, + set: function(value) { this.rgbData = ((value & 0xFF) << 16) | (this.rgbData & 0x00FFFF); } + }); + // 绿色通道 + Object.defineProperty(this, "green", { + get: function() { return (this.rgbData >>> 8) & 0xFF; }, + set: function(value) { this.rgbData = (this.rgbData & 0xFF00FF) | ((value & 0xFF) << 8); } + }); + // 蓝色通道 + Object.defineProperty(this, "blue", { + get: function() { return this.rgbData & 0xFF; }, + set: function(value) { this.rgbData = (this.rgbData & 0xFFFF00) | (value & 0xFF); } + }); + // Alpha 通道单独存储 + Object.defineProperty(this, "alpha", { + get: function() { return this._alpha; }, + set: function(value) { this._alpha = value & 0xFF; } + }); + // hex 属性 + Object.defineProperty(this, "hex", { + get: function() { + function padZero(str, length) { + while (str.length < length) str = "0" + str; + return str; + } + var r = padZero(this.red.toString(16), 2), + g = padZero(this.green.toString(16), 2), + b = padZero(this.blue.toString(16), 2), + a = padZero(this.alpha.toString(16), 2); + return this.alpha === 255 ? "#" + r + g + b : "#" + r + g + b + a; + }, + set: function(value) { + var hex = value.replace(/^#/, ""); + if (hex.length === 3) hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + if (hex.length === 6) hex = hex + "ff"; + if (hex.length === 8) { + this.red = parseInt(hex.substr(0, 2), 16); + this.green = parseInt(hex.substr(2, 2), 16); + this.blue = parseInt(hex.substr(4, 2), 16); + this.alpha = parseInt(hex.substr(6, 2), 16); + } + } + }); + this.toString = function() { return this.hex; }; + this.valueOf = function() { + function padZero(str, length) { + while (str.length < length) str = "0" + str; + return str; + } + var r = padZero(this.red.toString(16), 2), + g = padZero(this.green.toString(16), 2), + b = padZero(this.blue.toString(16), 2), + a = padZero(this.alpha.toString(16), 2); + return "#" + r + g + b + a; + }; + this.RGB = new RGB(this); + this.RGBA = new RGBA(this); + this.HSL = new HSL(this); + this.HSLA = new HSLA(this); + this.HWB = new HWB(this); + } + module.exports = { Color: Color }; +})(this); \ No newline at end of file diff --git a/shared/html/js/dpimodes.js b/shared/html/js/dpimodes.js new file mode 100644 index 0000000..58c2ce3 --- /dev/null +++ b/shared/html/js/dpimodes.js @@ -0,0 +1,178 @@ +(function(global) { + "use strict"; + var highDpiMode = 0; // 默认不进行转换 + var dpiValue = 1.0; // 默认 100% + + function IsIeVersionElder() { + return Bridge.Frame.version < 11; + } + // 0 - 不使用 + // 1 - 转换为 px + // 2 - 转换为 pt + function setHighDpiMode(modeType) { + highDpiMode = modeType; + refreshModeDisplay(); + } + + function refreshModeDisplay() { + switch (highDpiMode) { + case 1: + convertAllPtToPx(); + break; + case 2: + convertAllPxToPt(); + break; + } + var images = document.getElementsByTagName('img'); + for (var i = 0; i < images.length; i++) { + var img = images[i]; + var parent = img.parentElement; + if (!parent) continue; + var parentWidth = parent.offsetWidth; + var parentHeight = parent.offsetHeight; + var scaledWidth = img.naturalWidth * dpiValue; + var scaledHeight = img.naturalHeight * dpiValue; + if (scaledWidth > parentWidth || scaledHeight > parentHeight) { + img.style.transform = 'none'; + } else { + img.style.transform = 'scale(' + dpiValue + ')'; + } + // console.log('Image:', img, 'Parent Size:', parentWidth, parentHeight, 'Scaled:', scaledWidth, scaledHeight, 'Transform:', img.style.transform); + } + if (IsIeVersionElder && IsIeVersionElder()) { + var contentElements = document.getElementsByClassName('content'); + var controlElements = document.getElementsByClassName('control-column-bottom'); + if (controlElements.length === 0 || contentElements.length === 0) { + console.error('未找到相应元素'); + } else { + var controlElement = controlElements[0]; + var vheight = controlElement.currentStyle ? + controlElement.currentStyle.height : + window.getComputedStyle(controlElement).height; + for (var i = 0; i < contentElements.length; i++) { + var element = contentElements[i]; + element.style.height = 'calc(100% - ' + vheight + ')'; + // console.log('Set height of', element, 'to', 'calc(100% - ' + vheight + ')'); + } + } + } + } + + function convertAllPtToPx() { + var conversionFactor = 96 / 72; + var allElements = document.getElementsByTagName("*"); + for (var i = 0; i < allElements.length; i++) { + var el = allElements[i]; + if (el.style && el.style.cssText) { + el.style.cssText = el.style.cssText.replace(/(\d+(\.\d+)?)pt/g, function(match, p1) { + var pxValue = parseFloat(p1) * conversionFactor; + return pxValue + "px"; + }); + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var styleSheet = document.styleSheets[i]; + try { + var rules = styleSheet.cssRules || styleSheet.rules; + if (rules) { + for (var j = 0; j < rules.length; j++) { + var rule = rules[j]; + if (rule.style) { + for (var k = 0; k < rule.style.length; k++) { + var propertyName = rule.style[k]; + var value = rule.style.getPropertyValue(propertyName); + if (value.indexOf("pt") !== -1) { + var newValue = value.replace(/(\d+(\.\d+)?)pt/g, function(match, p1) { + var pxValue = parseFloat(p1) * conversionFactor; + return pxValue + "px"; + }); + var priority = (rule.style.getPropertyPriority) ? rule.style.getPropertyPriority(propertyName) : ""; + rule.style.setProperty(propertyName, newValue, priority); + } + } + } + } + } + } catch (e) { + console.warn("Could not access stylesheet", styleSheet.href, e); + } + } + } + + function convertAllPxToPt() { + var conversionFactor = 72 / 96; + var allElements = document.getElementsByTagName("*"); + for (var i = 0; i < allElements.length; i++) { + var el = allElements[i]; + if (el.style && el.style.cssText) { + el.style.cssText = el.style.cssText.replace(/(\d+(\.\d+)?)px/g, function(match, p1) { + var pxValue = parseFloat(p1) * conversionFactor; + return pxValue + "pt"; + }); + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var styleSheet = document.styleSheets[i]; + try { + var rules = styleSheet.cssRules || styleSheet.rules; + if (rules) { + for (var j = 0; j < rules.length; j++) { + var rule = rules[j]; + if (rule.style) { + for (var k = 0; k < rule.style.length; k++) { + var propertyName = rule.style[k]; + var value = rule.style.getPropertyValue(propertyName); + if (value.indexOf("px") !== -1) { + var newValue = value.replace(/(\d+(\.\d+)?)px/g, function(match, p1) { + var pxValue = parseFloat(p1) * conversionFactor; + return pxValue + "pt"; + }); + var priority = (rule.style.getPropertyPriority) ? rule.style.getPropertyPriority(propertyName) : ""; + rule.style.setProperty(propertyName, newValue, priority); + } + } + } + } + } + } catch (e) { + console.warn("Could not access stylesheet", styleSheet.href, e); + } + } + } + + function setPageZoom(zoomLevel) { + // document.body.style.zoom = zoomLevel; + dpiValue = zoomLevel; + refreshModeDisplay(); + } + + module.exports = { + Windows: { + UI: { + DPI: new function() { + Object.defineProperty(this, "mode", { + get: function() { + return highDpiMode; + }, + set: function(modeType) { + setHighDpiMode(modeType); + return highDpiMode; + } + }); + this.refresh = refreshModeDisplay; + Object.defineProperty(this, "zoom", { + get: function() { + return dpiValue; + }, + set: function(zoomLevel) { + setPageZoom(zoomLevel); + return dpiValue; + } + }); + this.ptToPx = convertAllPtToPx; + this.pxToPt = convertAllPxToPt; + }() + } + } + }; +})(this); \ No newline at end of file diff --git a/shared/html/js/event.js b/shared/html/js/event.js new file mode 100644 index 0000000..033998e --- /dev/null +++ b/shared/html/js/event.js @@ -0,0 +1,338 @@ +(function(global) { + "use strict"; + + if (!global.Windows) global.Windows = {}; + if (!global.Windows.UI) global.Windows.UI = {}; + if (!global.Windows.UI.Event) global.Windows.UI.Event = {}; + + var Monitor = (function() { + var _sIdAttr = "data-monitor-id"; + var _idCounter = 1; + var _aRegistry = {}; + var _typeRegistry = {}; // 按事件类型分类缓存 + var _polling = false; + var _loopHandle = null; + var _cleanupThreshold = 30000; // 30秒清理一次 + var _lastCleanup = Date.now(); + var _checkInterval = 200; // 节流时间 + var _eventTypes = [ + "resize", + "position", + "attribute", + "child" + ]; + + // 缓存 DOM 元素引用 + var _elementCache = {}; + + function _ensureId(el) { + if (!el.getAttribute(_sIdAttr)) { + el.setAttribute(_sIdAttr, "monitor_" + (_idCounter++)); + } + return el.getAttribute(_sIdAttr); + } + + function _getElementById(id) { + if (_elementCache[id] && _elementCache[id].parentNode) { + return _elementCache[id]; + } + var el = document.querySelector("[" + _sIdAttr + "=\"" + id + "\"]"); + if (el) _elementCache[id] = el; + return el; + } + + function _getAttrSnapshot(el) { + var attrs = {}; + for (var i = 0; i < el.attributes.length; i++) { + var attr = el.attributes[i]; + attrs[attr.name] = attr.value; + } + attrs["_rect"] = el.getBoundingClientRect(); + return attrs; + } + + function _hasChanged(snapshotA, snapshotB) { + for (var key in snapshotA) { + if (snapshotA.hasOwnProperty(key)) { + if (key === "_rect") { + var a = snapshotA[key], + b = snapshotB[key]; + if (!b || a.top !== b.top || a.left !== b.left || a.width !== b.width || a.height !== b.height) { + return true; + } + } else { + if (snapshotA[key] !== snapshotB[key]) { + return true; + } + } + } + } + return false; + } + + function _pollOnce() { + var now = Date.now(); + + // 按事件类型遍历,减少不必要检查 + for (var type in _typeRegistry) { + if (!_typeRegistry.hasOwnProperty(type)) continue; + + var list = _typeRegistry[type]; + for (var i = 0; i < list.length; i++) { + var item = list[i]; + var el = _getElementById(item.id); + if (!el) { + list.splice(i--, 1); + delete _elementCache[item.id]; + continue; + } + + var newSnapshot = _getAttrSnapshot(el); + if (_hasChanged(item.snapshot, newSnapshot)) { + item.snapshot = newSnapshot; + try { + item.callback.call(el, { type: type }); + } catch (ex) { + console.error("Monitor callback error:", ex); + } + } + } + } + + // 清理过期节点 + if (now - _lastCleanup > _cleanupThreshold) { + _cleanup(); + _lastCleanup = now; + } + } + + function _startLoop() { + if (_polling) return; + _polling = true; + + function loop() { + _pollOnce(); + _loopHandle = global.requestAnimationFrame ? requestAnimationFrame(loop) : setTimeout(loop, _checkInterval); + } + loop(); + } + + function _stopLoop() { + _polling = false; + if (_loopHandle) { + if (global.cancelAnimationFrame) cancelAnimationFrame(_loopHandle); + else clearTimeout(_loopHandle); + _loopHandle = null; + } + } + + function _cleanup() { + for (var type in _typeRegistry) { + if (!_typeRegistry.hasOwnProperty(type)) continue; + var list = _typeRegistry[type]; + for (var i = 0; i < list.length; i++) { + if (!_getElementById(list[i].id)) { + list.splice(i--, 1); + delete _elementCache[list[i].id]; + } + } + } + } + + function observe(el, type, callback) { + if (_eventTypes.indexOf(type) < 0) throw new Error("Unsupported event type: " + type); + var id = _ensureId(el); + if (!_typeRegistry[type]) _typeRegistry[type] = []; + _typeRegistry[type].push({ + id: id, + callback: callback, + snapshot: _getAttrSnapshot(el) + }); + _startLoop(); + } + + function detach(el, type, callback) { + if (!_typeRegistry[type]) return; + var id = el.getAttribute(_sIdAttr); + if (!id) return; + var list = _typeRegistry[type]; + for (var i = 0; i < list.length; i++) { + if (list[i].id === id && (!callback || list[i].callback === callback)) { + list.splice(i--, 1); + delete _elementCache[id]; + } + } + } + + function clearAll() { + _typeRegistry = {}; + _elementCache = {}; + _stopLoop(); + } + + return { + observe: observe, + detach: detach, + clearAll: clearAll, + EventType: { + resize: "resize", + position: "position", + attribute: "attribute", + child: "child" + } + }; + })(); + + global.Windows.UI.Event.Monitor = Monitor; + +})(window); + +/* + +// 1) 监听元素尺寸变化 +var el = document.getElementById("box"); +Windows.UI.Event.Monitor.observe(el, "resize", function (e) { + console.log("resized", e.oldValue, e.newValue, e.rect); +}); + +// 2) 监听属性变化 +Windows.UI.Event.Monitor.observe(el, "attributeChange", function (e) { + console.log("attrs changed", e.detail); // detail.added / removed / changed +}); + +// 3) 监听附着/分离 +Windows.UI.Event.Monitor.observe(el, "attach", function (e) { + console.log("attached to doc"); +}); +Windows.UI.Event.Monitor.observe(el, "detach", function (e) { + console.log("detached from doc"); +}); + +// 4) 取消监听 +Windows.UI.Event.Monitor.unobserve(el, "resize", handler); + +*/ + +(function(global) { + "use strict"; + + var EventUtil = {}; + + /** + * 添加事件,兼容 IE10/IE11 + * @param {Element|Window|Document} el 目标元素 + * @param {string} sType 事件类型,如 "click", "resize", "scroll" + * @param {function} pfHandler 回调函数 + * @param {boolean} [bUseCapture] 是否捕获阶段,默认 false + */ + EventUtil.addEvent = function(el, sType, pfHandler, bUseCapture) { + if (!el || typeof sType !== "string" || typeof pfHandler !== "function") return; + + bUseCapture = !!bUseCapture; + + if (el.addEventListener) { + // 标准方式 + el.addEventListener(sType, pfHandler, bUseCapture); + } else if (el.attachEvent) { + // IE8-9 fallback + el.attachEvent("on" + sType, pfHandler); + } else { + // 最原始方式 + var oldHandler = el["on" + sType]; + el["on" + sType] = function(e) { + if (oldHandler) oldHandler(e || window.event); + pfHandler(e || window.event); + }; + } + }; + + /** + * 移除事件,兼容 IE10/IE11 + * @param {Element|Window|Document} el 目标元素 + * @param {string} sType 事件类型,如 "click", "resize", "scroll" + * @param {function} pfHandler 回调函数 + * @param {boolean} [bUseCapture] 是否捕获阶段,默认 false + */ + EventUtil.removeEvent = function(el, sType, pfHandler, bUseCapture) { + if (!el || typeof sType !== "string" || typeof pfHandler !== "function") return; + + bUseCapture = !!bUseCapture; + + if (el.removeEventListener) { + el.removeEventListener(sType, pfHandler, bUseCapture); + } else if (el.detachEvent) { + el.detachEvent("on" + sType, pfHandler); + } else { + var oldHandler = el["on" + sType]; + if (oldHandler === pfHandler) { + el["on" + sType] = null; + } + } + }; + + // 暴露到全局命名空间 + if (typeof module !== "undefined" && module.exports) { + module.exports = { + Windows: { + UI: { + Event: { + Util: EventUtil + } + } + } + }; + } else { + global.Windows = global.Windows || {}; + global.Windows.UI = global.Windows.UI || {}; + global.Windows.UI.Event = global.Windows.UI.Event || {}; + global.Windows.UI.Event.Util = EventUtil; + } + +})(this); +/* +使用示例: +var handler = function (e) { + console.log("事件触发", e.type); +}; + +// 添加事件 +Windows.UI.Event.Util.addEvent(window, "resize", handler); + +// 删除事件 +Windows.UI.Event.Util.removeEvent(window, "resize", handler); + +*/ +(function(global) { + "use strict"; + /** + * + * @param {function} fn + * @param {number} delay + * @param {boolean} immediate 是否在第一次立即执行(可选,默认 false) + * @returns {function} 返回一个新的函数,该函数在 delay 时间后执行 fn 函数,如果在 delay 时间内再次调用该函数,则会重新计时。 + */ + function debounce(fn, delay, immediate) { + var timer = null; + var lastCall = 0; + return function() { + var context = this; + var args = arguments; + var now = +new Date(); + var callNow = immediate && !timer; + if (now - lastCall >= delay) { + lastCall = now; + if (callNow) { + fn.apply(context, args); + } + } + clearTimeout(timer); + timer = setTimeout(function() { + lastCall = +new Date(); + if (!immediate) { + fn.apply(context, args); + } + }, delay); + }; + } + module.exports = { debounce: debounce }; +})(this); \ No newline at end of file diff --git a/shared/html/js/module.js b/shared/html/js/module.js new file mode 100644 index 0000000..6502ef3 --- /dev/null +++ b/shared/html/js/module.js @@ -0,0 +1,187 @@ +/** + * @module module + * @description 模块化相关的函数。 + + * 将模块化相关的函数封装在一个对象中,方便使用。 + * 1. directexports(cObject, cDirection):直接将对象或函数公开到指定方向。 + * 2. exports:公开的对象或函数。 + * 3. imports:已加载的脚本。 + * 4. unload:卸载已加载的脚本。 + * 5. namespace(swNameSpace, cDirection):创建命名空间。 + * 6. export(cObject, cDirection):兼容旧版本的函数。 + * 7. import(aswSrc):兼容旧版本的函数。 + * 兼容的旧版本函数需要引用预处理模块,否则不会兼容。 + */ +(function(global) { + "use strict"; + // 是否为通过构造函数创建的对象实例 + function isNewFunctionInstance(obj) { + return typeof obj === "object" && Object.getPrototypeOf(obj) !== Object.prototype; + } + var module = new function() { + if (this._instance) return this._instance; + else this._instance = this; + /** + * 便于从代码块中公开。 + * @param {Object} cObject 需要公开的内容,以对象的形式分配好命名空间和别名。如: + * { + * myFunc: function() { }, + * myObj: function () { + * // object constructor + * } + * } + * 然后默认公开到全局。则公开后可以直接通过 myFunc() 或 myObj() 调用。 + * @param {global | Object} cDirection 公开方向 + * @returns {void} + */ + this.directexports = function(cObject, cDirection) { + if (!cDirection) cDirection = global; + if (typeof cObject === "function") { + cDirection[cObject.name] = cObject; + return; + } else if (typeof cObject === "object") { + var keys = Object.keys(cObject); + for (var i = 0; i < keys.length; i++) { + if (typeof cDirection[keys[i]] === "undefined") { + cDirection[keys[i]] = {}; + } + if (isNewFunctionInstance(cObject[keys[i]])) { + cDirection[keys[i]] = cObject[keys[i]]; + } else if (typeof cObject[keys[i]] === "object") { + this.directexports(cObject[keys[i]], cDirection[keys[i]]); + } else { + cDirection[keys[i]] = cObject[keys[i]]; + } + } + } else { + cDirection = cObject; + } + }; + /** + * @property {global | Object} exports 欲公开的内容以对象的形式分配好命名空间和别名。如: + */ + Object.defineProperty(this, "exports", { + get: function() { + return global; + }, + set: function(cObject, cDirection) { + this.directexports(cObject, cDirection); + } + }); + if (typeof Array.isArray === "undefined") { + /** + * 判断是否为数组。这是函数补充。 + * @param {*} arg 需要判断的对象 + * @returns {boolean} + */ + Array.isArray = function(arg) { + return Object.prototype.toString.call(arg) === "[object Array]" || arg instanceof Array || arg instanceof HTMLCollection || arg instanceof NodeList; + }; + } + /** + * @property {HTMLCollection | NodeList | null} imports 当前页面已加载的脚本。会以 NodeList 形式返回。如果为设置,则是追加脚本,而不是覆盖。传入脚本路径或其数组。 + */ + Object.defineProperty(this, "imports", { + get: function() { + if (typeof window !== "undefined" && typeof document !== "undefined") { + var scripts = document.querySelectorAll("script[src]"); + return scripts; + } else return null; + }, + set: function(aswSrc) { + if (typeof aswSrc === "string") { + var scripts = this.imports; + if (scripts && scripts.length > 0) { + for (var i = 0; i < scripts.length; i++) { + if (scripts[i].src === aswSrc) { + return; + } + } + var script = document.createElement("script"); + script.src = aswSrc; + document.head.appendChild(script); + } + } else if (Array.isArray(aswSrc) || aswSrc instanceof Array || aswSrc instanceof HTMLCollection || aswSrc instanceof NodeList) { + for (var i = 0; i < aswSrc.length; i++) { + this.imports = aswSrc[i]; + } + } + } + }); + /** + * @property {HTMLCollection | NodeList | null} unload 卸载当前页面已加载的脚本。传入脚本路径或其数组。无法只读 + */ + Object.defineProperty(this, "unload", { + set: function(aswSrc) { + if (typeof aswSrc === "string") { + var scripts = this.imports; + if (scripts && scripts.length > 0) { + for (var i = 0; i < scripts.length; i++) { + if (scripts[i].src === aswSrc) { + scripts[i].remove(); + return; + } + } + } + } else if (Array.isArray(aswSrc) || aswSrc instanceof Array || aswSrc instanceof HTMLCollection || aswSrc instanceof NodeList) { + for (var i = 0; i < aswSrc.length; i++) { + this.unload = aswSrc[i]; + } + } + } + }); + Object.defineProperty(this, "global", { + get: function() { + return global; + } + }); + /** + * 命名空间,其实为一种字典。 + * @param {string} swNameSpace 命名空间路径。如:"WinJS.Namespace"。不能为空。命名空间之间用"."分隔。 + * @param {*} cDirection 创建的路径,默认创建到全局 + * @returns + */ + this.namespace = function(swNameSpace, cDirection) { + if (!cDirection) cDirection = global; + var strarr = (swNameSpace || "").split("."); + if (!strarr.length) strarr.push(swns); + + function setNs(strarr, direct) { + var newdirect = null; + if (!strarr.length) return direct; + else { + if (typeof direct[strarr[0]] === "undefined") { + direct[strarr[0]] = {}; + } + newdirect = direct[strarr[0]]; + } + strarr.shift(); + return setNs((strarr || []), newdirect); + } + return setNs(strarr, cDirection); + }; + if (typeof preprocess !== "undefined" && preprocess.ifdef("COMPATIBLE")) { + /** + * 兼容旧版本的函数。 + * @param {Object | Function} cObject 欲公开的对象或函数 + * @param {global | Object} cDirection 公开方向 + */ + this.export = function(cObject, cDirection) { + this.directexports(cObject, cDirection); + }; + /** + * + * @param {Array | string} aswSrc 脚本路径或其数组 + * @returns {boolean} 是否成功添加脚本。在兼容模式下只会返回真。 + */ + this.import = function(aswSrc) { + this.imports = aswSrc; + return true; + }; + } + }; + module.exports = { + module: module, + namespace: module.namespace, + }; +})(this); \ No newline at end of file diff --git a/shared/html/js/pages.js b/shared/html/js/pages.js new file mode 100644 index 0000000..a3733ae --- /dev/null +++ b/shared/html/js/pages.js @@ -0,0 +1,74 @@ +(function(global) { + "use strict"; + Object.defineProperty(global, "pagecontainer", { + get: function() { return document.querySelector(".pagecontainer"); } + }); + + function getPage() { + return pagecontainer.querySelector(".page"); + } + var supportPageList = [ + "splash", + "select", + "preinstall", + "installing", + "installsuccess", + "installfailed" + ]; + var supportMulPageList = [ + "preinstall", + "installing", + "installsuccess", + "installfailed" + ]; + + function setPage(swPageLabel, bIsMulti) { + var page = getPage(); + swPageLabel = ("" + (swPageLabel || "")); + for (var i = 0; i < supportPageList.length; i++) { + if (Bridge.NString.equals(swPageLabel, supportPageList[i])) { + page.classList.add(supportPageList[i]); + } else { + if (page.classList.contains(supportPageList[i])) page.classList.remove(supportPageList[i]); + } + } + if (page.classList.contains("multiple")) page.classList.remove("multiple"); + for (var j = 0; j < supportMulPageList.length; j++) { + if (Bridge.NString.equals(swPageLabel, supportMulPageList[j]) && bIsMulti) { + page.classList.add("multiple"); + break; + } + } + } + + function getPageLabel() { + var page = getPage(); + for (var i = 0; i < supportPageList.length; i++) { + if (page.classList.contains(supportPageList[i])) { + return supportPageList[i]; + } + } + return ""; + } + + function isMultiPage() { + var page = getPage(); + return page.classList.contains("multiple"); + } + + function setPageMultiple(bIsMulti) { + setPage(getPageLabel(), bIsMulti); + } + + module.exports = { + Page: {} + }; + Object.defineProperty(Page, "current", { + get: function() { return getPageLabel(); }, + set: function(swPageLabel) { setPage(swPageLabel, isMultiPage()); } + }); + Object.defineProperty(Page, "multiple", { + get: function() { return isMultiPage(); }, + set: function(bIsMulti) { setPage(getPageLabel(), bIsMulti); } + }); +})(this); \ No newline at end of file diff --git a/shared/html/js/polyfill-ie.js b/shared/html/js/polyfill-ie.js new file mode 100644 index 0000000..6f5df17 --- /dev/null +++ b/shared/html/js/polyfill-ie.js @@ -0,0 +1,130 @@ +(function(global) { + if (typeof msWriteProfilerMark === "undefined") { + function msWriteProfilerMark(swMark) { + if (typeof performance !== "undefined" && typeof performance.mark === "function") { + return performance.mark(swMark); + } else if (typeof console !== "undefined" && typeof console.log === "function") { + return console.log(swMark); + } + } + module.exports = { + msWriteProfilerMark: msWriteProfilerMark + }; + } +})(this); +(function(global) { + + if (typeof global.Debug === "undefined") { + var fakeDebug = {}; + + // 基本属性 + fakeDebug.debuggerEnabled = true; + fakeDebug.setNonUserCodeExceptions = false; + + // 常量 + fakeDebug.MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE = 0; + fakeDebug.MS_ASYNC_CALLBACK_STATUS_JOIN = 1; + fakeDebug.MS_ASYNC_CALLBACK_STATUS_CHOOSEANY = 2; + fakeDebug.MS_ASYNC_CALLBACK_STATUS_CANCEL = 3; + fakeDebug.MS_ASYNC_CALLBACK_STATUS_ERROR = 4; + + fakeDebug.MS_ASYNC_OP_STATUS_SUCCESS = 1; + fakeDebug.MS_ASYNC_OP_STATUS_CANCELED = 2; + fakeDebug.MS_ASYNC_OP_STATUS_ERROR = 3; + + // 方法:输出 + fakeDebug.write = function(msg) { + if (console && console.log) console.log("[Debug.write] " + msg); + }; + fakeDebug.writeln = function(msg) { + if (console && console.log) console.log("[Debug.writeln] " + msg); + }; + + // 方法:断言 / 中断 + fakeDebug.assert = function(cond, msg) { + if (!cond) { + if (console && console.error) { + console.error("[Debug.assert] Assertion failed: " + (msg || "")); + } + // 可选触发断点 + // debugger; + } + }; + fakeDebug.break = function() { + debugger; + }; + + // 方法:异步跟踪(空实现) + fakeDebug.msTraceAsyncCallbackCompleted = function() {}; + fakeDebug.msTraceAsyncCallbackStarting = function() {}; + fakeDebug.msTraceAsyncOperationCompleted = function() {}; + fakeDebug.msTraceAsyncOperationStarting = function() {}; + fakeDebug.msUpdateAsyncCallbackRelation = function() {}; + + global.Debug = fakeDebug; + } + +})(this); +(function(global) { + + if (typeof global.setImmediate === "undefined") { + var nextHandle = 1; // 唯一任务 id + var tasksByHandle = {}; + var currentlyRunning = false; + + function addTask(fn, args) { + tasksByHandle[nextHandle] = function() { + fn.apply(undefined, args); + }; + return nextHandle++; + } + + function run(handle) { + if (currentlyRunning) { + // 如果已经在运行,延迟一下 + setTimeout(run, 0, handle); + } else { + var task = tasksByHandle[handle]; + if (task) { + currentlyRunning = true; + try { + task(); + } finally { + delete tasksByHandle[handle]; + currentlyRunning = false; + } + } + } + } + + function installSetImmediate() { + if (typeof MessageChannel !== "undefined") { + var channel = new MessageChannel(); + channel.port1.onmessage = function(event) { + run(event.data); + }; + return function() { + var handle = addTask(arguments[0], Array.prototype.slice.call(arguments, 1)); + channel.port2.postMessage(handle); + return handle; + }; + } else { + // fallback: setTimeout + return function() { + var handle = addTask(arguments[0], Array.prototype.slice.call(arguments, 1)); + setTimeout(run, 0, handle); + return handle; + }; + } + } + + global.setImmediate = installSetImmediate(); + + // 对应 clearImmediate + if (typeof global.clearImmediate === "undefined") { + global.clearImmediate = function(handle) { + delete tasksByHandle[handle]; + }; + } + } +})(this); \ No newline at end of file diff --git a/shared/html/js/popup.js b/shared/html/js/popup.js new file mode 100644 index 0000000..64493a8 --- /dev/null +++ b/shared/html/js/popup.js @@ -0,0 +1,60 @@ +(function(global) { + "use strict"; + var flags = { + HIDE_WHEN_CLICK_OUTSIDE: 0x00000001, + SHOW_CONTROL_BUTTONS: 0x00000002, + }; + + function Popup(content, options) { + var _content = content; + var _flags = options["flags"] || 0; + var _element = null; + _element = document.createElement("div"); + _element.className = "popup"; + _element.style.position = "absolute"; + _element.style.display = "none"; + document.body.appendChild(_element); + if (_content instanceof HTMLElement) { + _element.appendChild(_content); + } else if (typeof _content === "string") { + _element.textContent = _content; + } + Object.defineProperty(this, "content", { + get: function() { return _content; }, + set: function(value) { + _element.innerHTML = ""; + if (value instanceof HTMLElement) { + _element.appendChild(value); + } else if (typeof value === "string") { + _element.textContent = value; + } + _content = value; + } + }); + Object.defineProperty(this, "", { + + }); + } + + Popup.Options = function() { + this.flags = 0; + this.position = { + left: null, + top: null + }; + this.size = { + width: null, + height: null + }; + }; + + module.exports = { + Windows: { + UI: { + Popups: { + DisplayBlock: Popup + } + } + } + }; +})(this); \ No newline at end of file diff --git a/shared/html/js/promise.js b/shared/html/js/promise.js new file mode 100644 index 0000000..51255d5 --- /dev/null +++ b/shared/html/js/promise.js @@ -0,0 +1,241 @@ +(function(global) { + "use strict"; + + function PromisePolyfill(pfExecutor) { + var swState = "pending"; // "fulfilled" | "rejected" + var vValue = undefined; + var aHandlers = []; + var pfOnCancel = null; + + function invokeHandlers() { + if (swState === "pending") return; + for (var i = 0; i < aHandlers.length; i++) { + handle(aHandlers[i]); + } + aHandlers = []; + } + + function handle(hHandler) { + if (swState === "pending") { + aHandlers.push(hHandler); + return; + } + var pfCallback = swState === "fulfilled" ? hHandler.onFulfilled : hHandler.onRejected; + if (!pfCallback) { + if (swState === "fulfilled") { + hHandler.resolve(vValue); + } else { + hHandler.reject(vValue); + } + return; + } + try { + var vResult = pfCallback(vValue); + hHandler.resolve(vResult); + } catch (ex) { + hHandler.reject(ex); + } + } + + function resolve(vResult) { + try { + if (vResult === self) throw new TypeError("A promise cannot be resolved with itself."); + if (vResult && (typeof vResult === "object" || typeof vResult === "function")) { + var pfThen = vResult.then; + if (typeof pfThen === "function") { + pfThen.call(vResult, resolve, reject); + return; + } + } + swState = "fulfilled"; + vValue = vResult; + invokeHandlers(); + } catch (ex) { + reject(ex); + } + } + + function reject(vReason) { + swState = "rejected"; + vValue = vReason; + if (typeof PromisePolyfill.onerror === "function") { + PromisePolyfill.onerror(vReason); + } + invokeHandlers(); + } + var self = this; + try { + pfExecutor(resolve, reject, function(pfCancel) { + pfOnCancel = pfCancel; + }); + } catch (ex) { + reject(ex); + } + this.then = function(pfOnFulfilled, pfOnRejected) { + return new PromisePolyfill(function(resolve, reject) { + handle({ + onFulfilled: pfOnFulfilled, + onRejected: pfOnRejected, + resolve: resolve, + reject: reject + }); + }); + }; + this["catch"] = function(pfOnRejected) { + return this.then(null, pfOnRejected); + }; + this.done = function(pfOnFulfilled, pfOnRejected) { + this.then(pfOnFulfilled, pfOnRejected)["catch"](function(ex) { + setTimeout(function() { throw ex; }, 0); + }); + }; + this.cancel = function() { + if (pfOnCancel) { + try { pfOnCancel(); } catch (ex) {} + } + reject(new Error("Promise was canceled")); + }; + this._oncancel = pfOnCancel; + this._state = swState; + this._value = vValue; + } + PromisePolyfill.is = function(vObj) { + return vObj instanceof PromisePolyfill; + }; + PromisePolyfill.resolve = function(vValue) { + return new PromisePolyfill(function(resolve) { resolve(vValue); }); + }; + PromisePolyfill.reject = function(vReason) { + return new PromisePolyfill(function(resolve, reject) { reject(vReason); }); + }; + PromisePolyfill.all = function(aPromises) { + return new PromisePolyfill(function(resolve, reject) { + var nRemaining = aPromises.length; + var aResults = new Array(nRemaining); + if (nRemaining === 0) resolve([]); + + function resolver(iIndex) { + return function(vValue) { + aResults[iIndex] = vValue; + nRemaining--; + if (nRemaining === 0) resolve(aResults); + }; + } + for (var i = 0; i < aPromises.length; i++) { + PromisePolyfill.resolve(aPromises[i]).then(resolver(i), reject); + } + }); + }; + PromisePolyfill.race = function(aPromises) { + return new PromisePolyfill(function(resolve, reject) { + for (var i = 0; i < aPromises.length; i++) { + PromisePolyfill.resolve(aPromises[i]).then(resolve, reject); + } + }); + }; + PromisePolyfill.join = function(aPromises) { + return PromisePolyfill.all(aPromises); + }; + PromisePolyfill.any = function(aPromises) { + return new PromisePolyfill(function(resolve, reject) { + var nRemaining = aPromises.length; + var aErrors = new Array(nRemaining); + if (nRemaining === 0) reject(new Error("No promises provided.")); + + function resolver(vValue) { resolve(vValue); } + + function rejecter(iIndex) { + return function(ex) { + aErrors[iIndex] = ex; + nRemaining--; + if (nRemaining === 0) reject(aErrors); + }; + } + for (var i = 0; i < aPromises.length; i++) { + PromisePolyfill.resolve(aPromises[i]).then(resolver, rejecter(i)); + } + }); + }; + PromisePolyfill.timeout = function(pPromise, nMilliseconds) { + return new PromisePolyfill(function(resolve, reject) { + var hTimer = setTimeout(function() { + reject(new Error("Promise timed out after " + nMilliseconds + "ms")); + }, nMilliseconds); + PromisePolyfill.resolve(pPromise).then(function(vValue) { + clearTimeout(hTimer); + resolve(vValue); + }, function(ex) { + clearTimeout(hTimer); + reject(ex); + }); + }); + }; + PromisePolyfill.as = function(vValue) { + return PromisePolyfill.resolve(vValue); + }; + PromisePolyfill.wrap = function(vValue) { + return PromisePolyfill.resolve(vValue); + }; + PromisePolyfill.wrapError = function(vError) { + return PromisePolyfill.reject(vError); + }; + PromisePolyfill.thenEach = function(aValues, pfCallback) { + var aPromises = []; + for (var i = 0; i < aValues.length; i++) { + aPromises.push(PromisePolyfill.resolve(aValues[i]).then(pfCallback)); + } + return PromisePolyfill.all(aPromises); + }; + var hListeners = {}; + PromisePolyfill.addEventListener = function(sType, pfHandler) { + if (!hListeners[sType]) hListeners[sType] = []; + hListeners[sType].push(pfHandler); + }; + PromisePolyfill.removeEventListener = function(sType, pfHandler) { + if (!hListeners[sType]) return; + var aList = hListeners[sType]; + for (var i = 0; i < aList.length; i++) { + if (aList[i] === pfHandler) { + aList.splice(i, 1); + break; + } + } + }; + PromisePolyfill.dispatchEvent = function(sType, vDetail) { + if (!hListeners[sType]) return; + var aList = hListeners[sType].slice(); + for (var i = 0; i < aList.length; i++) { + try { aList[i](vDetail); } catch (ex) {} + } + }; + PromisePolyfill.supportedForProcessing = true; + PromisePolyfill.onerror = null; + if (typeof global.Promise !== "undefined") { + var p = global.Promise; + if (!p.join) p.join = p.all; + if (!p.any) p.any = PromisePolyfill.any; + if (!p.timeout) p.timeout = PromisePolyfill.timeout; + if (!p.as) p.as = p.resolve; + if (!p.wrap) p.wrap = p.resolve; + if (!p.wrapError) p.wrapError = p.reject; + if (!p.thenEach) p.thenEach = PromisePolyfill.thenEach; + if (!p.is) p.is = function(vObj) { return vObj instanceof p; }; + if (!p.supportedForProcessing) p.supportedForProcessing = true; + if (!p.addEventListener) p.addEventListener = PromisePolyfill.addEventListener; + if (!p.removeEventListener) p.removeEventListener = PromisePolyfill.removeEventListener; + if (!p.dispatchEvent) p.dispatchEvent = PromisePolyfill.dispatchEvent; + if (!p.onerror) p.onerror = null; + } + if (typeof global.WinJS !== "undefined" && typeof global.WinJS.Promise !== "undefined") { + var wp = global.WinJS.Promise; + if (!wp.resolve) wp.resolve = function(vValue) { return new wp(function(c) { c(vValue); }); }; + if (!wp.reject) wp.reject = function(vReason) { return new wp(function(c, e) { e(vReason); }); }; + if (!wp.all) wp.all = function(aPromises) { return wp.join(aPromises); }; + if (!wp.race) wp.race = PromisePolyfill.race; + global.Promise = wp; + if (typeof global.Promise === "undefined") global.Promise = wp; + } + if (typeof global.Promise === "undefined" && typeof global.WinJS === "undefined") { + global.Promise = PromisePolyfill; + } +})(this); \ No newline at end of file diff --git a/shared/html/libs/winjs/2.0/css/ui-dark.css b/shared/html/libs/winjs/2.0/css/ui-dark.css new file mode 100644 index 0000000..604fe51 --- /dev/null +++ b/shared/html/libs/winjs/2.0/css/ui-dark.css @@ -0,0 +1,5423 @@ +/*! + © Microsoft. All rights reserved. + + This library is supported for use in Windows Store apps only. + + Build: 1.0.9600.17018.winblue_gdr.140204-1946 + + Version: Microsoft.WinJS.2.0 +*/ + +/* +Modifications for top-level elements html, body and iframe. +*/ +html, body { + height: 100%; + width: 100%; + margin: 0; + -ms-user-select: none; + cursor: default; + -ms-scroll-translation: vertical-to-horizontal; +} +html { + overflow: hidden; +} +body { + -ms-content-zooming: none; +} +iframe { + border: 0; +} +html:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + direction: rtl; +} + +/* +Explicitly define a Segoe UI font-family so that we can assign Segoe UI +Semilight to an appropriate font-weight. +*/ +@font-face { + font-family: "Segoe UI"; + font-weight: 200; + src: local("Segoe UI Light"); +} +@font-face { + font-family: "Segoe UI"; + font-weight: 300; + src: local("Segoe UI Semilight"); +} +@font-face { + font-family: "Segoe UI"; + font-weight: 400; + src: local("Segoe UI"); +} +@font-face { + font-family: "Segoe UI"; + font-weight: 600; + src: local("Segoe UI Semibold"); +} +@font-face { + font-family: "Segoe UI"; + font-weight: 700; + src: local("Segoe UI Bold"); +} +@font-face { + font-family: "Segoe UI"; + font-style: italic; + font-weight: 400; + src: local("Segoe UI Italic"); +} +@font-face { + font-family: "Segoe UI"; + font-style: italic; + font-weight: 700; + src: local("Segoe UI Bold Italic"); +} + +/* +Explicitly define font-families for Microsoft Yahei UI and Microsoft JhengHei UI so that we can fallback requests for, + Microsoft Yahei UI Semilight and Microsoft JhengHei UI Semilight, to Regular instead of Light fonts. +*/ +@font-face { + font-family: "Microsoft Yahei UI"; + font-weight: 200; + src: local("Microsoft Yahei UI Light"); +} +@font-face { + font-family: "Microsoft Yahei UI"; + font-weight: 300; + src: local("Microsoft Yahei UI"); +} +@font-face { + font-family: "Microsoft Yahei UI"; + font-weight: 500; + src: local("Microsoft Yahei UI"); +} +@font-face { + font-family: "Microsoft Yahei UI"; + font-weight: 600; + src: local("Microsoft Yahei UI Bold"); +} + +@font-face { + font-family: "Microsoft JhengHei UI"; + font-weight: 200; + src: local("Microsoft JhengHei UI Light"); +} +@font-face { + font-family: "Microsoft JhengHei UI"; + font-weight: 300; + src: local("Microsoft JhengHei UI"); +} +@font-face { + font-family: "Microsoft JhengHei UI"; + font-weight: 500; + src: local("Microsoft JhengHei UI"); +} +@font-face { + font-family: "Microsoft JhengHei UI"; + font-weight: 600; + src: local("Microsoft JhengHei UI Bold"); +} + +/* +Weight and size definitions for typographic classes and elements. +*/ +h1, .win-type-xx-large { + font-size: 42pt; + font-weight: 200; + letter-spacing: 0; + line-height: 1.1429; /* 64px when font-size is 42pt */ +} +h2, .win-type-x-large { + font-size: 20pt; + font-weight: 200; + line-height: 1.2; /* 32px when font-size is 20pt */ +} +h3, .win-type-large { + font-size: 11pt; + font-weight: 600; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +h4, .win-type-medium, code, pre, samp { + font-size: 11pt; + font-weight: 400; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +body, h5, .win-type-small, legend { + font-size: 11pt; + font-weight: 300; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +.win-type-x-small { + font-size: 11pt; + font-weight: 300; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +h6, caption, figcaption, small, .win-type-xx-small { + font-size: 9pt; + font-weight: 400; + line-height: 1.6667; /* 20px when font-size is 9pt */ +} +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0; +} +.win-type-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +h1.win-type-ellipsis, .win-type-xx-large.win-type-ellipsis { + line-height: 1.4286; /* 80px when font-size is 42pt */ +} +h2.win-type-ellipsis, .win-type-x-large.win-type-ellipsis { + line-height: 1.5; /* 40px when font-size is 20pt */ +} +dt, th { + font-size: 11pt; + font-weight: 700; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +abbr, acronym, address, blockquote, cite, dl, dd, li, ol, p, q, td, tr { + font-weight: 300; +} +b, strong { + font-weight: 700; +} +em { + font-style: italic; +} + +/* +Additional letter-spacing for the document and its controls. +*/ +body, +button, input, +textarea, .win-textarea, +select, option { + letter-spacing: 0.02em; +} + +/* +Fixed font-family rules. +*/ +code, pre, samp { + font-family: "Consolas"; +} + +/* +Text input controls. +*/ + +input[type=text], input[type=password], input[type=email], input[type=number], +input[type=tel], input[type=url], input[type=search], textarea, .win-textarea { + -ms-user-select: element; + min-height: 28px; + min-width: 64px; + margin: 4px 0; + border-width: 2px; + border-style: solid; + font-size: 11pt; + font-weight: 400; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} + +input[type=text], input[type=password], input[type=email], input[type=number], +input[type=tel], input[type=url], input[type=search] { + width: 276px; + padding: 0; +} +input::-ms-value { + margin: 4px 8px; +} + +textarea, .win-textarea { + overflow-y: scroll; + word-wrap: break-word; + padding: 4px 8px; + /* Leave space for autohiding scrollbar on elements that enable text selection. */ + padding-right: 17px; +} +textarea:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm), .win-textarea:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + /* Flip sides for autohiding scrollbar padding on RTL layouts. */ + padding-right: 8px; + padding-left: 17px; +} +textarea { + min-width: 260px; + min-height: 39px; +} +.win-textarea { + width: 260px; + height: 39px; +} + +/* +Clear and reveal button styles. +*/ + +input::-ms-clear, input::-ms-reveal { + margin-left: 2px; +} +input:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-clear, +input:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-reveal { + margin-left: 0; + margin-right: 2px; +} + +/* +Button control. +*/ +button, input[type=button], input[type=reset], input[type=submit] { + min-height: 32px; /* content (20px) + padding + border */ + min-width: 90px; + padding: 4px 8px; + border-width: 2px; + border-style: solid; + background-clip: padding-box; + font-size: 11pt; + font-weight: 600; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} + +/* +File upload control. +*/ +input[type=file] { + border: none; + min-width: 100px; + min-height: 20px; + width: 340px; + height: 32px; + padding: 0; + margin: 7px 8px 21px 8px; + background-clip: padding-box; +} +input[type=file]::-ms-value { + margin: 0; + border-width: 2px; + border-style: solid; + border-right-style: none; + border-radius: 0; + background-clip: padding-box; + font-size: 11pt; + font-weight: 400; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +input[type=file]:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-value { + border-left-style: none; + border-right-style: solid; +} +input[type=file]::-ms-browse { + margin: 0; + padding: 0 18px; + border-width: 2px; + border-style: solid; + background-clip: padding-box; + font-size: 11pt; + font-weight: 600; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} + +/* +No underline or special cursor on links. +*/ +a { + text-decoration: none; + cursor: default; +} + +/* +No border on images when in a link. +*/ +img { + border-style: none; +} + +/* +Select control. +*/ +select { + min-height: 32px; + min-width: 80px; + border-width: 2px; + border-style: solid; + margin: 4px 0; + font-size: 11pt; + font-weight: 400; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +select::-ms-value { + padding: 4px 8px; + margin: 0; +} +select::-ms-expand { + border: 0; + padding-left: 6px; + padding-right: 6px; + background-color: transparent; +} + +/* +Radio button and checkbox shared styles. +*/ +input::-ms-check { + border-width: 2px; + border-style: solid; + display: inline-block; +} + +/* +Radio button. +*/ +input[type=radio] { + width: 23px; + height: 23px; + margin-left: -1px; + margin-right: 4px; + margin-bottom: -2px; +} +input[type=radio]:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 4px; + margin-right: -1px; +} + +/* +Checkbox. +*/ +input[type=checkbox] { + width: 21px; + height: 21px; + margin-right: 5px; +} +input[type=checkbox]:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 5px; +} + +/* +Range control. +*/ +input[type=range] { + width: 280px; + height: auto; + padding: 17px 0 32px 0; +} +input[type=range]::-ms-track { + padding: 0; + width: auto; + height: 11px; + border-style: none; + color: transparent; /* ticks hidden by default */ +} +input[type=range]::-ms-thumb { + width: 11px; + height: 11px; + border-style: none; +} +input[type=range]::-ms-ticks-before, input[type=range]::-ms-ticks-after { + width: 100%; + height: 5px; + display: none; +} +input[type=range]:disabled::-ms-fill-lower { + margin-right: 5px; +} +input[type=range]:disabled::-ms-fill-upper { + margin-left: 6px; +} +input[type=range]:disabled:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-lower { + margin-right: 0; + margin-left: 5px; +} +input[type=range]:disabled:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-upper { + margin-left: 0; + margin-right: 6px; +} + +/* +Vertical range control. +*/ +input[type=range].win-vertical { + width: auto; + height: 191px; + padding: 0 17px; + writing-mode: bt-lr; +} +input[type=range].win-vertical:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + writing-mode: bt-rl; +} +input[type=range].win-vertical::-ms-track { + width: 11px; + height: auto; +} +input[type=range].win-vertical:disabled::-ms-fill-lower { + margin-right: 0; + margin-top: 6px; +} +input[type=range].win-vertical:disabled::-ms-fill-upper { + margin-left: 0; + margin-bottom: 5px; +} +input[type=range].win-vertical:disabled:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-lower { + margin-left: 0; +} +input[type=range].win-vertical:disabled:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-upper { + margin-right: 0; +} + +input[type=range].win-vertical::-ms-ticks-before, +input[type=range].win-vertical::-ms-ticks-after { + width: 5px; + height: 100%; + display: none; +} + +/* +Progress control. +*/ +progress { + width: 180px; + height: 6px; + border-style: none; +} +progress.win-medium { + width: 280px; +} +progress.win-large { + width: 100%; +} +progress::-ms-fill { + border-style: none; +} +progress:indeterminate { + height: 4px; + padding: 1px 0; /* Indeterminate dots should be 4px tall, but overall control stays 6px. */ +} +@keyframes win-progress-fade-out { + from { + opacity: 1.0; + } + to { + opacity: 0.5; + } +} +progress.win-paused:not(:indeterminate) { + animation-name: win-progress-fade-out; + animation-duration: 3s; + animation-timing-function: cubic-bezier(0.03, 0.76, 0.31, 1.0); + opacity: 0.5; +} +progress.win-error::-ms-fill { + opacity: 0; +} +progress.win-ring:indeterminate::-ms-fill { + animation-name: -ms-ring; +} +progress.win-ring { + width: 20px; + height: 20px; +} +progress.win-medium.win-ring { + width: 40px; + height: 40px; +} +progress.win-large.win-ring { + width: 60px; + height: 60px; +} + +form { + margin: 0; + padding: 0; +} +legend { + margin: 0 0 10px 0; + padding: 0; + color: inherit; +} + +/* +AppBar/Flyout z-index values: + 1000 - AppBar/settings click-eating div + 1002 - AppBar + 1004 - Settings Flyout + 1006 - Flyout click-eating div + 1008 - Flyout +*/ + +@font-face { + font-family: "Segoe UI Command"; + src: local("Segoe UI Symbol"); + font-weight: normal; + font-style: normal; +} + +.win-appbarclickeater { + z-index: 1000; + background-color: transparent; + display: none; + width: 110%; + height: 110%; + left: -5%; + top: -5%; + position: fixed; + touch-action: none; + outline: 1px solid Purple; /*Necessary to block passthrough over webviews*/ + -ms-high-contrast-adjust:none; +} +.win-flyoutmenuclickeater { + z-index: 1006; + background-color: transparent; + display: none; + width: 110%; + height: 110%; + left: -5%; + top: -5%; + position: fixed; + touch-action: none; + outline: 1px solid Lime; /*Necessary to block passthrough over webviews*/ + -ms-high-contrast-adjust:none; +} + +/* +Back buttons. +*/ +.win-backbutton, .win-back { + display: inline-block; + min-width: 0; + min-height: 0; + background-clip: border-box; + box-sizing: border-box; + border-radius: 50%; + border-width: 2px; + border-style: solid; + padding: 0; + text-align: center; + + /* Normal sizing. */ + width: 41px; + height: 41px; + font-size: 14pt; + line-height: 37px; /* line-height must match the content box height. */ + vertical-align: baseline; +} + +.win-backbutton:hover, .win-backbutton:hover:active { + border-width: 2px; + border-style: solid; + border-radius: 50%; +} +.win-backbutton::before, .win-back::before { + font-family: "Segoe UI Symbol"; + font-weight: normal; + content: "\E0D5"; + vertical-align: 50%; +} +.win-backbutton:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::before, .win-back:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::before { + content: "\E0AE"; +} +.win-backbutton:disabled, .win-backbutton:disabled:active, +.win-navigation-backbutton:disabled, .win-navigation-backbutton:disabled:active { + visibility: hidden; +} + +button.win-navigation-backbutton, button.win-navigation-backbutton:active, +button.win-navigation-backbutton:hover, button.win-navigation-backbutton:active:hover +{ + display: inline-block; + padding: 2px; + min-height: 0px; + min-width: 0px; + + /* Overwrite default background and border styles from HTML button element */ + background-color: transparent; + border: none; + + /* Normal Sizing */ + height: 45px; + width: 45px; +} + +/* Default positioning for a Navigation BackButton in the App Body*/ +body > .win-navigation-backbutton { + position: absolute; + top: 50px; + left: 20px; +} + +/* +Command buttons. +*/ +button.win-command { + background: none; + background-clip: border-box; + height: auto; /* height is 88px (label) or 68px (no label) */ + padding: 12px 0; /* bottom dependent on label/img, 2px margin */ + margin: 0; + border: 2px solid; /* reserve focus rect */ + min-width: 40px; + text-align: center; + font-size: 9pt; + line-height: 16px; + font-weight: normal; + + /* Commands are lrtb */ + writing-mode: lr-tb; +} +button.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + writing-mode: rl-tb; +} +button.win-command:focus { + outline: none; +} + +/* +Command button icons. +*/ +.win-commandicon { + display: inline-block; + margin: 0 28px; /* padding for command buttons, 2px/side for focus */ + min-width: 0; + min-height: 0; + padding: 0; + + /* Normal sizing */ + width: 40px; + height: 40px; + box-sizing: border-box; + cursor: default; +} +.win-commandimage { + /* Default font for glyphs. */ + font-family: "Segoe UI Command"; + letter-spacing: 0; + + /* Applications provide their own content, like . */ + vertical-align: middle; + font-size: 14pt; + margin: -2px; + line-height: 40px; /* line-height must match the content box height */ + background-position: 0 0; + background-origin: border-box; + display: inline-block; + /* Still 40px */ + width: 40px; + height: 40px; + background-size: 160px 80px; +} + +/* +Offsets for sprite versions. +*/ +button:hover .win-commandimage, button:active .win-commandimage { + background-position: -40px 0; +} +button:hover:active .win-commandimage { + background-position: -80px 0; +} + +button:-ms-keyboard-active .win-commandimage { + background-position: -80px 0; +} +button:disabled .win-commandimage, +button:disabled:active .win-commandimage { + background-position: -120px 0; +} + +/* +Offsets for sprite versions in selected state. +*/ +button[aria-checked=true] .win-commandimage { + background-position: 0 -40px; +} +button[aria-checked=true]:hover .win-commandimage, +button[aria-checked=true]:active .win-commandimage { + background-position: -40px -40px; +} +button[aria-checked=true]:hover:active .win-commandimage { + background-position: -80px -40px; +} +button[aria-checked=true]:-ms-keyboard-active .win-commandimage { + background-position: -80px -40px; +} +button[aria-checked=true]:disabled .win-commandimage, +button[aria-checked=true]:disabled:active .win-commandimage { + background-position: -120px -40px; +} + +/* +Command button "ring". +*/ +.win-commandring, +button:hover .win-commandring, +button:active .win-commandring, +button.win-command:disabled .win-commandring, +button.win-command:disabled:active .win-commandring { + border-width: 2px; + border-style: solid; + border-radius: 50%; + background-clip: border-box; +} +button:hover:active .win-commandring, +button[aria-checked=true] .win-commandring, +button[aria-checked=true]:active .win-commandring, +button[aria-checked=true]:disabled .win-commandring, +button[aria-checked=true]:disabled:active .win-commandring { + background-clip: border-box; +} + +/* +Command button labels. +*/ +button.win-command .win-label { + position: relative; + line-height: 16px; + display: block; + max-width: 88px; /* 100px button, but allow for 2px margins and 4px padding on each side */ + margin-top: 5px; + margin-bottom: -1px; + padding-left: 4px; /* 12px between buttons, 6px per side, minus 2px margins */ + padding-right: 4px; + overflow: hidden; + word-wrap: break-word; + word-break: keep-all; +} + +/* +AppBarCommand separator types. +*/ +hr.win-command { + display: inline-block; + padding: 0; + margin: 14px 29px 34px 30px; + width: 1px; + height: 40px; + border: 0; + vertical-align: top; +} +hr.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 29px; + margin-right: 30px; +} + +/* +AppBarCommand content types. +*/ +div.win-command { + + display: inline-block; + min-width: 0; + min-height: 0; + padding: 12px 30px; + border: 2px solid; /* reserve focus rect */ + text-align: center; + font-size: 9pt; + line-height: 16px; + font-weight: normal; + vertical-align: top; + + /* Content Commands are lrtb */ + writing-mode: lr-tb; + +} +div.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + writing-mode:rl-tb; +} +div.win-command:focus { + outline: none; +} + +/* +AppBar Edgy Container +*/ +.win-appbar { + z-index: 1002; + border-width: 0; + width: 100%; + height: auto; + left: 0; + position: -ms-device-fixed; +} + +/* +AppBar control. +*/ +.win-commandlayout { + text-align: right; + + /* Hide whitespace between buttons. */ + font-size: 0; + + min-height: 88px; +} +.win-commandlayout .win-selection { + float: left; +} +.win-commandlayout:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + text-align: left; +} +.win-commandlayout .win-selection:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + float: right; +} + +/* Narrow buttons and no labels */ +.win-reduced button.win-command .win-label { + display: none; +} +.win-reduced button.win-command .win-commandicon { + margin: 0 8px; /* 2px margin for focus */ +} + +/* Narrow Separators */ +.win-reduced hr.win-command { + margin-bottom: 14px; + margin-top: 14px; +} +.win-reduced hr.win-command { + margin-left: 10px; + margin-right: 9px; +} + .win-reduced hr.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 9px; + margin-right: 10px; +} + +/* Narrow Content Commands */ +.win-reduced div.win-command { + padding-left: 10px; + padding-right: 10px; +} + +/* AppBar reduced height and width. */ +.win-commandlayout.win-reduced { + padding-left: 10px; + padding-right: 10px; + width: calc(100% - 20px); + min-height: 68px; +} + +/* +High contrast AppBar needs a border +*/ +@media (-ms-high-contrast) { + /* + AppBar Borders + */ + .win-appbar { + border: solid 2px; + } + .win-appbar.win-top { + border-top: none; + border-left: none; + border-right: none; + } + .win-appbar.win-bottom { + border-bottom: none; + border-left: none; + border-right: none; + } + .win-appbar.win-top button.win-command, + .win-appbar.win-top div.win-command { + padding-bottom: 10px; + } + .win-appbar.win-bottom button.win-command, + .win-appbar.win-bottom div.win-command { + padding-top: 10px; + } + .win-appbar.win-top hr.win-command { + margin-bottom: 32px; + } + .win-appbar.win-bottom hr.win-command { + margin-top: 12px; + } + .win-commandlayout { + min-height: 86px; + } + + /* High Contrast Reduced sizes slightly different */ + .win-commandlayout.win-reduced { + min-height: 66px; + } + .win-appbar.win-reduced.win-top hr.win-command { + margin-bottom: 12px; + } + .win-appbar.win-reduced.win-bottom hr.win-command { + margin-top: 12px; + } +} + +/* +Flyout control. +*/ +.win-flyout { + z-index: 1008; + position: -ms-device-fixed; + padding: 25px 20px 20px 20px; + border-style: solid; + border-width: 2px; + margin: 5px; + min-width: 26px; /* 70px - padding - border = 26px */ + max-width: 466px; /* 510px - padding - border = 466px */ + min-height: 5px; /* 54px - padding - border = 5px */ + max-height: calc(100% - 59px); /* 768px - margin - padding - border = 709px */ + width: auto; + height: auto; + word-wrap: break-word; + overflow: auto; + font-size: 11pt; + font-weight: 400; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +.win-flyout.win-leftalign { + margin-left: 0; +} +.win-flyout.win-rightalign { + margin-right: 0; +} +.win-flyout.win-scrolls { + overflow: auto; +} + +/* + Hub Control. +*/ +.win-hub { + height: 100%; + width: 100%; + position: relative; +} +.win-hub-progress { + position: absolute; + top: 10px; + width: 100%; + z-index: 1; +} +.win-hub-viewport { + height: 100%; + width: 100%; + /* Allow win-hub-surface margin/padding right to work */ + display: flex; + flex-shrink: 0; + -ms-scroll-snap-type: proximity; +} +.win-hub-horizontal .win-hub-viewport { + overflow-x: auto; + overflow-y: hidden; +} +.win-hub-vertical .win-hub-viewport { + position: relative; + overflow-y: auto; + overflow-x: hidden; + flex-direction: column; +} +.win-hub-surface { + display: flex; + flex-shrink: 0; +} +.win-hub-vertical .win-hub-surface { + width: 100%; + padding: 15px 0; + flex-direction: column; +} +.win-hub-horizontal .win-hub-surface { + height: 100%; + padding: 0 80px; +} + +/* + HubSection Control. +*/ +.win-hub-section { + display: -ms-grid; + -ms-grid-columns: 1fr; + -ms-grid-rows: auto 1fr; + padding: 0 40px; +} +.win-hub-horizontal .win-hub-section { + height: 100%; +} +.win-hub-vertical .win-hub-section { + width: calc(100% - 80px); + padding: 14px 40px; +} +.win-hub-section-header { + -ms-grid-column: 1; + -ms-grid-row: 1; + margin: 4px 0; + font-size: 20pt; + text-align: left; +} +.win-hub-section-header:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + text-align: right; +} +.win-hub-horizontal .win-hub-section-header { + margin-top: 129px; +} +.win-hub-vertical .win-hub-section-header { + margin-top: 1px; +} +/* Override default button styles */ +/* Button is used so that both piece of UI change color. button:active becomes active if the children are pressed. */ +button.win-hub-section-header-tabstop, +button.win-hub-section-header-tabstop:hover, +button.win-hub-section-header-tabstop:hover:active { + display: -ms-inline-grid; + background-color: transparent; + border: 0; + padding: 0; + min-height: 0; + min-width: 0; + font-size: 20pt; + -ms-grid-columns: minmax(0, max-content) 3px; + -ms-grid-rows: max-content; +} +button.win-hub-section-header-tabstop:focus { + outline: none; +} + +button.win-hub-section-header-tabstop:-ms-keyboard-active { + background-color: transparent; +} +/* Use grid and top level layout for truncation */ +button.win-hub-section-header-tabstop.win-hub-section-header-interactive, +button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover, +button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active { + -ms-grid-columns: minmax(0, max-content) 7px max-content 3px; +} +.win-hub-section-header-content { + display: inline-block; +} +.win-hub-section-header-chevron { + display: none; +} +.win-hub-section-header-interactive .win-hub-section-header-chevron { + -ms-grid-column: 3; + display: inline-block; +} +.win-hub-section-header-chevron::before { + font-family: 'Segoe UI Symbol'; + content: "\E26B"; +} +.win-hub-section-header-chevron:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::before { + font-family: 'Segoe UI Symbol'; + content: "\E26C"; +} +.win-hub-section-content { + -ms-grid-column: 1; + -ms-grid-row: 2; +} +.win-hub-horizontal .win-hub-section-content { + height: calc(100% - 44px); +} +.win-hub-vertical .win-hub-section-content { + width: 100%; +} + +/* + NavBar +*/ +.win-navbar { + min-height: 60px; +} + +/* + NavBarContainer +*/ +.win-navbarcontainer { + width: 100%; + position: relative; +} +.win-navbarcontainer-pageindicator-box { + position: absolute; + width: 100%; + text-align: center; + pointer-events: none; +} +.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box { + display: none; +} +.win-navbarcontainer-pageindicator { + display: inline-block; + width: 40px; + height: 4px; + margin: 5px 2.5px 11px 2.5px; +} +.win-navbarcontainer-horizontal .win-navbarcontainer-viewport { + padding: 15px 0; + overflow-x: auto; + overflow-y: hidden; + -ms-scroll-snap-type: mandatory; + -ms-scroll-snap-points-x: snapInterval(0%, 100%); + -ms-overflow-style: none; + touch-action: pan-x; +} +.win-navbarcontainer-vertical .win-navbarcontainer-viewport { + padding: 10px 0; + overflow-x: hidden; + overflow-y: auto; + max-height: 250px; + -ms-overflow-style: -ms-autohiding-scrollbar; + touch-action: pan-y; +} +.win-navbarcontainer-horizontal .win-navbarcontainer-surface { + display: -ms-grid; + -ms-grid-columns: auto; + -ms-grid-rows: auto; +} +.win-navbarcontainer-navarrow { + position: absolute; + top: 0; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + height: calc(100% - 40px); + width: 17px; + margin: 20px 0; + font-size: 16pt; + overflow: hidden; +} +.win-navbarcontainer-vertical .win-navbarcontainer-navarrow { + display: none; +} +.win-navbarcontainer-navleft { + left: 0; + margin-right: 8px; +} +.win-navbarcontainer-navleft::before { + content: '\E0E2'; +} +.win-navbarcontainer-navright { + right: 0; + margin-left: 8px; +} +.win-navbarcontainer-navright::before { + content: '\E0E3'; +} + +/* + NavBarCommand +*/ +.win-navbarcommand { + display: -ms-grid; + -ms-grid-columns: 1fr auto; + -ms-grid-rows: 1fr; +} +.win-navbarcontainer-horizontal .win-navbarcommand { + margin: 5px; + width: 210px; +} +.win-navbarcontainer-vertical .win-navbarcommand { + margin: 10px 30px; +} +.win-navbarcommand-button { + -ms-grid-column: 1; + -ms-grid-row: 1; + width: 100%; + position: relative; +} +.win-navbarcommand-button-content { + position: relative; + padding: 5px 10px; + display: -ms-grid; + -ms-grid-columns: auto 1fr; + -ms-grid-rows: auto; +} +.win-navbarcommand-button:focus { + z-index: 1; + outline: none; +} +.win-navbarcommand-icon { + -ms-grid-column: 1; + -ms-grid-row: 1; + font-family: "Segoe UI Symbol"; + height: 40px; + width: 40px; + font-size: 20pt; + margin-left: 0; + margin-right: 10px; + display: flex; + align-items: center; + justify-content: center; +} +.win-navbarcommand-icon:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 10px; +} +.win-navbarcommand-label { + -ms-grid-column: 2; + -ms-grid-row: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 11pt; + margin: 10px 0; +} +.win-navbarcommand-splitbutton { + -ms-grid-column: 2; + -ms-grid-row: 1; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + width: 40px; + font-family: 'Segoe UI Symbol'; + font-size: 11pt; + margin-right: 0; + margin-left: 2px; + position: relative; +} +.win-navbarcommand-splitbutton:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 0; + margin-right: 2px; +} +.win-navbarcommand-splitbutton::before { + content: '\E019'; +} +.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before { + content: '\E018'; +} +.win-navbarcommand-splitbutton:focus { + outline: none; +} + +/* +Menu control. +*/ +.win-menu { + padding: 5px 0 5px 0; + line-height: 33px; + text-align: left; /* Set explicitly in case our parent has different alignment, like appbar overflow. */ + min-height: 38px; /* 54px - padding - border = 38px */ + max-height: calc(100% - 26px); /* 768px - margin - padding - border = 742px */ + max-width: none; +} +.win-menu:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + text-align: right; /* Set explicitly in case our parent has different alignment, like appbar overflow. */ +} + +/* +Menu commands. +*/ +.win-menu button.win-command { + display: block; + border: none; + padding: 10px 20px 12px 20px; + margin-left: 0; + margin-right: 0; + float: none; + text-align: left; + width: 100%; + font-size: 11pt; + font-weight: 600; + line-height: 18px; /* 40px - 10px top padding - 12px bottom padding */ +} +.win-menu button.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + text-align: right; +} +.win-menu button.win-command:focus { + outline: none; +} +.win-menu hr.win-command { + display: block; + height: 1px; + width: auto; + border: 0; + + padding: 0; + margin: 9px 20px 10px 20px; +} + +/* +Menu toggle buttons. +*/ +.win-menu-toggle button.win-command::before { + font-family: 'Segoe UI Symbol'; + content: "\E0E7"; + visibility: hidden; + padding-left: 0px; + padding-right: 10px; +} +.win-menu-toggle button[aria-checked=true].win-command::before { + /* Display a checkbox if aria-checked is set */ + visibility: visible; +} +.win-menu-toggle button.win-command:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::before { + padding-right: 0; + padding-left: 10px; + float: right; +} + +/* +Settings Pane +*/ +.win-settingsflyout { + z-index: 1004; /* above appbar and below flyouts */ + border-left: 1px solid; + position: fixed; + top: 0; + right: 0; + height: 100%; + width: 345px; /* 346px - border (1px) */ +} +.win-settingsflyout:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + border-left: none; + border-right: 1px solid; +} +.win-settingsflyout.win-wide {/* .win-wide is deprecated in Windows 8.1 */ + width: 645px; /* 646px - border (1px) */ +} +.win-settingsflyout .win-header { + padding-left: 40px; + padding-right: 40px; + padding-top: 32px; + height: 48px; +} +/* Settings back button is slightly smaller. */ +.win-settingsflyout .win-backbutton { + position: absolute; + width: 30px; + height: 30px; + font-size: 8pt; + line-height: 26px; + margin-top: 3px; +} +.win-settingsflyout .win-header .win-label { + display: inline-block; + padding-left: 40px; + font-size: 20pt; + line-height: 33px; +} +.win-settingsflyout .win-content { + overflow: auto; + padding-left: 40px; + padding-right: 40px; + padding-top: 33px; + height: calc(100% - 112px); +} + +.win-settingsflyout .win-label { + font-size: 20pt; + font-weight: 200; + line-height: normal; +} +.win-settingsflyout:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + right: auto; + left: 0; + border-left: none; + border-right: 1px solid; +} +.win-settingsflyout .win-header .win-label:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + padding-right: 40px; + padding-left: 0; +} + +.win-settingsflyout .win-content .win-settings-section { + padding-top: 0; + padding-bottom: 39px; +} + +.win-settingsflyout .win-content .win-settings-section p { + margin: 0; + padding-top: 0; + padding-bottom: 25px; +} + +.win-settingsflyout .win-content .win-settings-section a { + margin: 0; + padding-top: 0; + padding-bottom: 25px; + display:inline-block; +} + +.win-settingsflyout .win-content .win-settings-section .win-toggleswitch { + margin: 0; + padding-top: 0; + padding-bottom: 20px; +} + +.win-settingsflyout .win-content .win-settings-section label { + display:block; + padding-bottom: 7px; +} + +.win-settingsflyout .win-content .win-settings-section button, +.win-settingsflyout .win-content .win-settings-section select, +.win-settingsflyout .win-content .win-settings-section input[type=button], +.win-settingsflyout .win-content .win-settings-section input[type=text] { + margin-bottom: 25px; + margin-left: 0; + margin-right: 20px; +} + +.win-settingsflyout .win-content .win-settings-section input[type=radio] { + margin-top: 0; + margin-bottom: 0; + padding-bottom: 15px; +} + +.win-settingsflyout .win-content .win-settings-section button:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-bottom: 25px; + margin-left: 20px; + margin-right: 0; +} +.win-settingsflyout .win-content .win-settings-section select:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-bottom: 25px; + margin-left: 20px; + margin-right: 0; +} + +.win-settingsflyout .win-content .win-settings-section input[type=text]:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-bottom: 25px; + margin-left: 20px; + margin-right: 0; +} + +.win-settingsflyout .win-content .win-settings-section input[type=button]:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-bottom: 25px; + margin-left: 20px; + margin-right: 0; +} + +/* +Grippers in touch selection do not dissapear when focus moves to an element outside of the selection range and they are always drawn on a layer above all HTML elemements. +When an _Overlay derived control such as AppBar/Flyout/Menu/SettingsFlyout is invoked and steals focus, if that _Overlay is laid out on top of the elements in the touch selection, +the grippers can still be seen over the _Overlay and its contents. However, all grippers any where in the document will be hidden whenever the current active element has or inherits +the style "-ms-touch-select: none;" +*/ +.win-overlay { + -ms-touch-select: none; +} + +/* For input elements we filter type using the :not selector to capture any unrecognized user specified types which would just default to the form and function of a textbox*/ +.win-overlay input:not([type="file"]), +.win-overlay input:not([type="radio"]), +.win-overlay input:not([type="checkbox"]), +.win-overlay input:not([type="button"]), +.win-overlay input:not([type="range"]), +.win-overlay input:not([type="image"]), +.win-overlay input:not([type="reset"]), +.win-overlay input:not([type="hidden"]), +.win-overlay input:not([type="submit"]), +.win-overlay textarea, +.win-overlay [contenteditable=true]{ + -ms-touch-select: grippers; +} + +/* Singleton element maintained by _Overlay, used for getting accurate floating point measurements of the total size of the visual viewport. + Floating point is necesary in high DPI resolutions. */ +.win-visualviewport-space { + position:-ms-device-fixed; + height: 100vh; + width: 100vw; + visibility:hidden; +} + +/* +Rating control. +*/ +.win-rating { + display: inline-flex; + height: auto; + width: auto; + white-space: normal; + align-items: stretch; + justify-content: center; +} + +.win-rating .win-star { + flex: auto; + height:28px; + width: 28px; + padding: 0 6px; + font-family: "Segoe UI Symbol"; + font-size: 28px; + overflow: hidden; + text-indent: 0; + line-height: 1; + cursor: default; + position: relative; + letter-spacing: 0; /* Use letter-spacing: 0 to make average star look like one glyph. */ + touch-action: none; +} +.win-rating.win-small .win-star { + width: 14px; + height: 14px; + font-size: 14px; + padding: 0 3px; +} +.win-rating .win-star:before { + content: "\E082"; +} +.win-rating .win-star.win-disabled { + cursor: default; + touch-action: auto; +} + +/* +DatePicker control. +*/ +.win-datepicker { + display: inline-flex; + height: auto; + width: auto; +} +.win-datepicker .win-datepicker-month { + margin-right: 20px; +} +.win-datepicker .win-datepicker-date.win-order0, +.win-datepicker .win-datepicker-date.win-order1 { + margin-right: 20px; +} +.win-datepicker .win-datepicker-year.win-order0 { + margin-right: 20px; +} +.win-datepicker .win-datepicker-month:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 20px; +} +.win-datepicker .win-datepicker-date.win-order0:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm), +.win-datepicker .win-datepicker-date.win-order1:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 20px; +} +.win-datepicker .win-datepicker-year.win-order0:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm){ + margin-right: 0; + margin-left: 20px; +} + +/* +TimePicker control. +*/ +.win-timepicker { + display: inline-flex; + height: auto; + width: auto; +} +.win-timepicker .win-timepicker-hour { + margin-right: 20px; +} +.win-timepicker .win-timepicker-period.win-order0 { + margin-right: 20px; +} +.win-timepicker .win-timepicker-minute.win-order1 { + margin-right: 20px; +} +.win-timepicker .win-timepicker-period.win-order0:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 20px; +} +.win-timepicker .win-timepicker-minute.win-order1:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm), +.win-timepicker .win-timepicker-minute.win-order0:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 20px; + margin-right: 0; +} +.win-timepicker .win-timepicker-hour:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: 20px; +} + +/* +Toggle control. +*/ +.win-toggleswitch { + padding: 0; + background-color: transparent; + vertical-align: top; + margin: 0; + display: block; +} +.win-toggleswitch .win-switch { + display: inline-block; + height: 19px; + width: 50px; + padding: 5px; + margin: 0; + background-color: transparent; + -ms-grid-column: 2; +} +.win-toggleswitch .win-switch::-ms-tooltip { + display: none; +} +.win-toggleswitch .win-switch::-ms-ticks-before, +.win-toggleswitch .win-switch::-ms-ticks-after { + display: none; +} +.win-toggleswitch .win-switch::-ms-track { + height: 15px; /* 19px - 2px borders */ + width: 46px; + padding: 0; + margin: 0; + border-width: 2px; + border-style: solid; +} +.win-toggleswitch .win-switch::-ms-fill-lower, +.win-toggleswitch .win-switch::-ms-fill-upper { + height: 13px; /* 19px - 2px borders - 1px margins */ + padding: 0; +} +.win-toggleswitch .win-switch::-ms-fill-lower { + margin-left: 1px; +} +.win-toggleswitch .win-switch:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-lower { + margin-left: 0; + margin-right: 1px; +} +.win-toggleswitch .win-switch::-ms-fill-upper { + margin-right: 1px; +} +.win-toggleswitch .win-switch:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm)::-ms-fill-upper { + margin-right: 0; + margin-left: 1px; +} +.win-toggleswitch .win-switch::-ms-thumb { + height: 19px; + width: 12px; +} +.win-toggleswitch .win-title { + display: block; + vertical-align: top; + max-width:470px; + font-size: 11pt; + font-weight: 300; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +.win-toggleswitch .win-label { + display: inline-block; + vertical-align: top; + padding: 5px 20px 5px 0px; + min-width: 65px; + direction: inherit; + -ms-grid-column: 1; + -ms-grid-row: 1; + font-size: 11pt; + font-weight: 600; + line-height: 1.3636; /* 20px when font-size is 11pt */ +} +.win-toggleswitch .win-label:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + padding: 5px 0px 5px 20px; +} +.win-toggleswitch .win-label.win-hidden { + visibility: hidden; +} +.win-focus-hide { + outline: none; +} + +/* +Tooltip control. +*/ +.win-tooltip { + display: block; + position: fixed; + top: 30px; + left: 30px; + max-width: 380px; + box-sizing: border-box; + margin: 0; + padding: 6px 10px 7px 10px; + border-style: solid; + border-width: 2px; + z-index: 9999; + word-wrap: break-word; + animation-fill-mode: both; + font-size: 9pt; + font-weight: 400; + line-height: 1.6667; /* 20px when font-size is 9pt */ +} +.win-tooltip-phantom { + display: block; + position: fixed; + top: 30px; + left: 30px; + background-color: transparent; + border-width: 0; + margin: 0; + padding: 0; +} + +.win-viewbox { + width: 100%; + height: 100%; + position: relative; +} + +.win-semanticzoom { + height: 400px; + touch-action: pan-x pan-y double-tap-zoom; +} +.win-semanticzoom * { + touch-action: inherit; +} + +.win-semanticzoom-button { + z-index: 100; + position: absolute; + min-width: 25px; + min-height: 25px; + width: 25px; + height: 25px; + padding: 0px; + bottom: 21px; + touch-action: none; +} + +.win-semanticzoom-button::before { + font-family: "Segoe UI Symbol"; + font-weight: normal; + font-size: 11pt; + content: "\E0B8"; /* minus sign */ +} + +.win-semanticzoom-button-location{ + left: auto; + right: 4px; +} + +.win-semanticzoom-button-location:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + left: 4px; + right: auto; +} + +/* +ScrollView control. +*/ +.win-scrollview { + overflow-x: auto; + overflow-y: hidden; + height: 400px; + width: 100%; +} + +/*Flyout control animations*/ +@keyframes WinJS-showFlyoutTop { from { transform: translateY(50px); } to { transform: none; } } +@keyframes WinJS-showFlyoutBottom { from { transform: translateY(-50px); } to { transform: none; } } +@keyframes WinJS-showFlyoutLeft { from { transform: translateX(50px); } to { transform: none; } } +@keyframes WinJS-showFlyoutRight { from { transform: translateX(-50px); } to { transform: none; } } + +/* +SearchBox control. +*/ + +.win-searchbox { + white-space: normal; + position: relative; + width: 265px; + height: 28px; + border-style: solid; + border-width: 2px; +} + +.win-searchbox-flyout { + position: absolute; + min-width: 265px; + border-style: solid; + border-width: 2px 2px 2px 2px; + z-index: 100; + padding: 5px 0 10px 0; + top: 30px; + left: -2px; + right: -2px; + max-height: 272px; + overflow: auto; + -ms-scroll-chaining:none; + touch-action:none; +} + +.win-searchbox input { + height: 100%; + border-style: none; + margin: 0px; + padding-right: 28px; + width: calc(100% - 28px); + font-size: 11pt; + -ms-ime-align: after; + line-height: 20px; +} + +.win-searchbox input:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + padding-right: 0; + padding-left: 28px; +} + +/* +Hide clear button in search box control. +*/ + +.win-searchbox input[type=search]::-ms-clear { + display: none; +} + +.win-searchbox-button { + position: absolute; + right: 0; + top: 0; + width: 28px; + font-family: "Segoe UI Symbol"; + font-size: 15pt; + border-style: none; + height: 100%; + text-align:center; +} + +.win-searchbox-button:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + right: auto; + left: 0; +} + +.win-searchbox-button.win-searchbox-button:before { + content: "\E094"; +} + +.win-searchbox-suggestion-result { + padding: 0 18px; + display: flex; + height: 60px; + font-family: "Segoe UI"; + font-size: 11pt; + outline: none; +} + +.win-searchbox-suggestion-result div { + line-height: 20px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.win-searchbox-suggestion-result-text { + padding-top: 9px; + padding-bottom: 11px; + height: 60px; + width: 179px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + line-height: 20px; +} + +.win-searchbox-suggestion-result-detailed-text { + display: inline-block; + overflow: hidden; + -ms-text-overflow: ellipsis; + line-height: 22px; /* Some characters get clipped if line height is < 22px. Work around by setting -2 margin. */ + margin-top: -1px; + width: 100%; +} + +.win-searchbox-suggestion-result img { + width: 40px; + height: 40px; + margin-left: 0; + padding-right: 10px; + padding-top: 10px; + padding-bottom: 10px; +} + +.win-searchbox-suggestion-result img:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 0; + margin-left: auto; + padding-left: 10px; + padding-right: 0; +} + +.win-searchbox-suggestion-query { + padding: 9px 18px 11px 18px; + font-family: "Segoe UI"; + font-weight: normal; + outline: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-size: 11pt; + line-height: 20px; +} + +.win-searchbox-suggestion-separator { + display: -ms-grid; + -ms-grid-columns: auto 1fr; + padding: 0 18px; + height: 40px; + font-family: "Segoe UI"; + font-size: 11pt; +} + +.win-searchbox-suggestion-separator hr { + -ms-grid-column: 2; + -ms-grid-row: 1; + margin-top: 18px; + border-style: solid; + border-width: 1px 0px 0px 0px; +} + +.win-searchbox-suggestion-separator hr:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-right: 10px; + margin-left: auto; +} + +.win-searchbox-suggestion-separator div { + -ms-grid-column: 1; + -ms-grid-row: 1; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-top: 9px; + padding-bottom: 11px; + line-height: 20px; + margin-right: 10px; +} + +.win-searchbox-suggestion-separator div:-ms-lang(ar, dv, fa, he, ku-Arab, pa-Arab, prs, ps, sd-Arab, syr, ug, ur, qps-plocm) { + margin-left: 10px; + margin-right: auto; +} + +/* +Search box control animations +*/ +@keyframes WinJS-flyoutBelowSearchBox-showPopup { from { transform: translateY(0px); } to { transform: none; } } +@keyframes WinJS-flyoutAboveSearchBox-showPopup { from { transform: translateY(0px); } to { transform: none; } } + +/* +ListView control. +*/ +.win-listview { + overflow: hidden; + height: 400px; +} +.win-listview .win-surface { + overflow: visible; +} +.win-listview > .win-viewport.win-horizontal .win-surface { + height: 100%; +} +.win-listview > .win-viewport.win-vertical .win-surface { + width: 100%; +} +.win-listview > .win-viewport { + position: relative; + width: 100%; + height: 100%; + z-index: 0; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.win-listview > .win-viewport.win-horizontal { + overflow-x: auto; + overflow-y: hidden; +} +.win-listview > .win-viewport.win-vertical { + overflow-x: hidden; + overflow-y: auto; +} +.win-listview .win-itemscontainer { + overflow:hidden; +} +.win-listview .win-itemscontainer-padder { + width: 0; + height: 0; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} +.win-listview > .win-horizontal .win-container { + margin: 10px 5px 0px 5px; +} +.win-listview > .win-vertical .win-container { + margin: 10px 24px 0px 7px; +} +.win-listview.win-rtl > .win-vertical .win-container { + margin: 10px 7px 0px 24px; +} +.win-listview .win-container, .win-listview .win-itembox, +.win-itemcontainer.win-container, .win-itemcontainer .win-itembox { + cursor: default; + z-index: 0; +} +.win-listview .win-container { + touch-action:pan-x pan-y pinch-zoom; +} +.win-listview.win-swipeable .win-horizontal .win-container, +.win-listview.win-swipeable .win-horizontal .win-itembox.win-nonswipeable { + touch-action:pan-x pinch-zoom; +} +.win-listview.win-swipeable .win-vertical .win-container, +.win-listview.win-swipeable .win-vertical .win-itembox.win-nonswipeable { + touch-action:pan-y pinch-zoom; +} +.win-listview.win-swipeable .win-horizontal .win-itembox { + touch-action:pan-x pinch-zoom double-tap-zoom cross-slide-y; +} +.win-listview.win-swipeable .win-vertical .win-itembox { + touch-action:pan-y pinch-zoom double-tap-zoom cross-slide-x; +} +.win-semanticzoom .win-listview > .win-viewport * { + touch-action: auto; +} +.win-semanticzoom .win-listview > .win-viewport.win-zooming-x { + overflow-x: visible; +} +.win-semanticzoom .win-listview > .win-viewport.win-zooming-y { + overflow-y: visible; +} +.win-listview .win-itembox, +.win-itemcontainer .win-itembox { + width:100%; + height:100%; +} +.win-listview .win-item, +.win-itemcontainer .win-item { + /* Used to place above .win-selectionbackground in ListView */ + z-index: 1; +} +.win-listview .win-item, +.win-itemcontainer .win-item { + overflow: hidden; + position: relative; +} +.win-listview > .win-vertical .win-item +{ + /* Allow flex box to fill win-item in list layout */ + width: 100%; +} +.win-listview .win-item:focus, +.win-itemcontainer .win-item:focus { + outline-style: none; +} +.win-listview .win-focusedoutline, +.win-itemcontainer .win-focusedoutline { + width: calc(100% + 4px); + height: calc(100% + 4px); + left: -2px; + top: -2px; + position: absolute; + z-index: 5; + pointer-events: none; +} +.win-container.win-selected .win-selectionborder { + border-width: 4px; + border-style: solid; +} +.win-container.win-selected:hover .win-selectionborder { + border-width: 4px; + border-style: solid; +} +.win-listview .win-groupheader { + padding: 10px 10px 10px 2px; + overflow: hidden; + outline-width: 0.01px; + outline-style: none; + /* Causes the focus outline to tightly wrap the header content */ + float: left; + font-size: 20pt; + font-weight: 200; + line-height: 1.2; /* 32px when font-size is 20pt */ +} +.win-listview .win-groupheadercontainer { + z-index: 1; + touch-action:pan-x pan-y pinch-zoom; + overflow: hidden; +} +.win-listview .win-groupheader.win-focused { + outline-style: dotted; +} +.win-listview.win-rtl .win-groupheader { + padding-left: 10px; + padding-right: 2px; + float: right; +} +.win-listview.win-groups .win-horizontal .win-groupleader { + margin-left: 70px; +} +.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader { + margin-left: 0; + margin-right: 70px; +} +.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader, +.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader { + margin-top: 70px; +} +.win-listview.win-groups > .win-vertical .win-surface.win-listlayout, +.win-listview.win-groups > .win-vertical .win-surface.win-gridlayout { + margin-top: -65px; +} +.win-listview.win-groups > .win-horizontal .win-surface { + margin-left: -70px; +} +.win-listview.win-groups.win-rtl > .win-horizontal .win-surface { + margin-left: 0; + margin-right: -70px; +} +.win-surface ._win-proxy { + /* Position relative + overflow hidden are applied to this element to stop margin collapsing of a margin-top on a header + the margin-top on the surface in list layout */ + position: relative; + overflow: hidden; + width: 0; + height: 0; + touch-action: none; +} +.win-selectionborder { + position: absolute; + opacity: inherit; + z-index: 2; + pointer-events: none; +} +.win-container.win-selected .win-selectionborder { + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.win-selectionbackground { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + /* Used to place behind .win-item in the ListView/ItemContainer */ + z-index: 0; +} +.win-selectioncheckmarkbackground { + position: absolute; + top: 0; + right: 0; + width: 0; + height: 0; + margin: 0; + padding: 0; + border-width: 20px; + border-style: solid; + z-index: 3; +} +.win-listview.win-rtl .win-selectioncheckmarkbackground, +.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground { + left: 0; + right: auto; +} +.win-selectioncheckmark { + position: absolute; + margin: 0; + padding: 2px; + right: 0; + top: 0; + font-family: Segoe UI Symbol; + font-size: 11pt; + z-index: 4; +} +.win-listview.win-rtl .win-selectioncheckmark, +.win-itemcontainer.win-rtl .win-selectioncheckmark { + left: 0; + right: auto; +} +.win-selectionhint { + position: absolute; + margin: 0; + padding: 2px; + right: 0; + font-family: Segoe UI Symbol; + font-size: 11pt; + opacity: 0.5; +} +.win-selectionhint.win-revealed { + opacity: 1; +} +.win-listview.win-rtl .win-selectionhint, +.win-itemcontainer.win-rtl .win-selectionhint { + left: 0; + right: auto; +} +.win-listview .win-progress { + left: 50%; + top: 50%; + width: 60px; + height: 60px; + margin-left: -30px; + margin-top: -30px; + z-index: 1; + position: absolute; +} +.win-listview .win-progress::-ms-fill { + animation-name: -ms-ring; +} + +.win-listview .win-itemsblock { + overflow: hidden; +} +.win-listview .win-horizontal .win-itemscontainer, .win-listview .win-horizontal .win-itemsblock:not(.win-clip) { + margin-top: -200px; + margin-bottom: -200px; + padding-top: 200px; + padding-bottom: 200px; +} +.win-listview .win-vertical .win-itemscontainer, .win-listview .win-vertical .win-itemsblock:not(.win-clip) { + margin-left: -200px; + margin-right: -200px; + padding-left: 200px; + padding-right: 200px; +} +/* +ListLayout +*/ +.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer, +.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer, +.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer, +.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer { + display: none; +} +.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout, +.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout, +.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout { + display: block; +} +.win-listview .win-listlayout .win-itemscontainer { + overflow: visible; +} +.win-listview .win-listlayout .win-itemsblock { + /* Avoid clipping of the focus and hover visuals */ + padding-bottom: 4px; + margin-bottom: -4px; +} +/* +ListLayout - Vertical +*/ +/* Vertical grouped list layout needs to remove float from group headers when headers are above so that static positioning gets applied properly */ +.win-listview > .win-vertical .win-listlayout.win-headerpositiontop .win-groupheader { + float: none; +} +.win-listview > .win-vertical .win-surface.win-listlayout { + margin-bottom: 5px; +} +/* Headers on the left */ +.win-listview.win-groups > .win-vertical .win-surface.win-listlayout.win-headerpositionleft { + margin-left: 70px; +} +.win-listview.win-groups.win-rtl > .win-vertical .win-surface.win-listlayout.win-headerpositionleft { + margin-left: 0px; + margin-right: 70px; +} +.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface { + display: -ms-inline-grid; + -ms-grid-columns: auto 1fr; + -ms-grid-rows: auto; +} +.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer { + -ms-grid-column: 1; +} +.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer { + -ms-grid-column: 2; +} +/* +ListLayout - Horizontal +*/ +.win-listview > .win-horizontal .win-surface.win-listlayout { + display: -ms-inline-grid; + -ms-grid-columns: auto; + -ms-grid-rows: auto; + /* Use vertical-align:top when using display:-ms-inline-grid to avoid extra spacing around itself */ + vertical-align:top; +} +.win-listview > .win-horizontal .win-surface.win-listlayout { + margin-left: 70px; +} +.win-listview.win-rtl > .win-horizontal .win-surface.win-listlayout { + margin-left: 0px; + margin-right: 70px; +} +.win-listview .win-horizontal .win-listlayout .win-itemsblock { + height: 100%; +} +.win-listview .win-horizontal .win-listlayout .win-itemscontainer { + /* itemscontainers have a -200px margin by default, but here we want to increase it by 24px to leave room for the scrollbar */ + margin-bottom: -176px; +} +.win-listview .win-horizontal .win-listlayout .win-container { + height: calc(100% - 10px); +} +/* Headers above */ +.win-listview > .win-horizontal .win-surface.win-listlayout.win-headerpositiontop { + -ms-grid-rows: auto 1fr; +} +.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer { + -ms-grid-row: 1; +} +.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer { + -ms-grid-row: 2; +} +/* +GridLayout +*/ +.win-listview .win-gridlayout.win-surface { + /* Use a grid even in non-grouped layouts so that there is consistent margin + collapsing behavior between the surface and itemsContainer in all grid layouts */ + display: -ms-inline-grid; + /* Use vertical-align:top when using display:-ms-inline-grid to avoid extra spacing around itself */ + vertical-align:top; +} +.win-listview .win-vertical .win-gridlayout.win-surface { + margin-left: 20px; +} +.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface { + margin-left: 0px; + margin-right: 20px; +} +.win-horizontal .win-gridlayout .win-container { + margin: 5px; +} +.win-vertical .win-gridlayout .win-container { + margin: 5px 24px 5px 7px; +} +.win-rtl > .win-vertical .win-gridlayout .win-container { + margin: 5px 7px 5px 24px; +} +/* Headers */ +.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer, +.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer { + -ms-grid-column: 1; +} +.win-listview.win-groups .win-gridlayout .win-itemscontainer, +.win-listview.win-groups .win-gridlayout .win-groupheadercontainer { + display: none; +} +.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout { + display: block; +} +/* Horizontal - Headers above */ +.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface { + -ms-grid-columns: auto; + -ms-grid-rows: auto 1fr; +} +.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer { + -ms-grid-row: 1; +} +.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer { + -ms-grid-row: 2; +} +/* Horizontal - Headers on the left */ +.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface { + -ms-grid-columns: auto; + -ms-grid-rows: auto; +} +.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer { + -ms-grid-row: 1; +} +.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer { + -ms-grid-row: 1; +} +/* Vertical - headers above */ +.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface { + -ms-grid-columns: auto; + -ms-grid-rows: auto; +} +.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer { + -ms-grid-column: 1; +} +/* Vertical - headers on the left */ +.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface { + -ms-grid-columns: auto 1fr; + -ms-grid-rows: auto; +} +.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer { + -ms-grid-column: 2; +} +/* Uniform and cell spanning groups */ +.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout { + display: flex; + flex-flow: row; +} +.win-listview .win-horizontal .win-listlayout .win-itemscontainer, +.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout, +.win-listview .win-horizontal .win-listlayout .win-itemsblock, +.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout, +.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock { + display: flex; + flex-flow: column wrap; + align-content: flex-start; +} +.win-listview .win-horizontal .win-itemscontainer-padder { + height: 100%; +} +.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock { + height: 100%; +} +.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout { + display: -ms-grid; +} +/* Vertical - uniform group */ +.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout { + display: flex; + flex-flow: column; +} +.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout, +.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock { + display: flex; + flex-flow: row wrap; + align-content: flex-start; +} +.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock { + width: 100%; +} +/* Cell spanning */ +.win-listview .win-cellspanninggridlayout .win-container.win-laidout { + display: block; +} +.win-listview .win-cellspanninggridlayout .win-container { + display: none; +} +.win-listview .win-itembox { + position: relative; + transition: transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms; +} +.win-listview.win-dragover .win-itembox { + transform: scale(0.86); +} +.win-listview .win-itembox.win-dragsource, +.win-itemcontainer .win-itembox.win-dragsource { + opacity: 0.5; + transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms; +} +.win-listview.win-dragover .win-itembox.win-dragsource { + opacity: 0; + transition: none; +} +.win-listview.win-dragover .win-container:hover { + outline: none; +} +.win-listview .win-container.win-swipe, .win-listview .win-container.win-swipe .win-itembox, +.win-itemcontainer.win-container.win-swipe, .win-itemcontainer.win-container.win-swipe .win-itembox { + position: relative; + z-index: 1; +} +/* +FlipView control. +*/ +.win-flipview { + overflow: hidden; + height: 400px; +} + +.win-flipview .win-surface { + -ms-scroll-chaining: none; +} + +.win-flipview .win-navleft { + left: 0%; + top: 50%; + margin-top: -19px; +} +.win-flipview .win-navright { + left: 100%; + top: 50%; + margin-left: -69px; + margin-top: -19px; +} +.win-flipview .win-navtop { + left: 50%; + top: 0%; + margin-left: -35px; +} +.win-flipview .win-navbottom { + left: 50%; + top: 100%; + margin-left: -35px; + margin-top: -39px; +} +.win-flipview .win-navbutton { + border: none; + width: 69px; + height: 39px; + z-index: 1; + position: absolute; + font-family: "Segoe UI Symbol"; + font-size: 16pt; + padding: 0; + min-width: 0; +} +.win-flipview .win-item, .win-flipview .win-item > .win-template { + display: flex; + height: 100%; + width: 100%; + align-items: center; + justify-content: center; +} + +/* +ItemContainer control. +*/ +.win-itemcontainer .win-itembox, +.win-itemcontainer.win-container { + position:relative; +} +.win-itemcontainer { + touch-action:pan-x pan-y pinch-zoom; +} +.win-itemcontainer.win-swipeable.win-horizontal .win-itembox { + touch-action:pan-y pinch-zoom cross-slide-x; +} +.win-itemcontainer.win-swipeable.win-vertical .win-itembox { + touch-action:pan-x pinch-zoom cross-slide-y; +} + +/* +Typographic color definitions. +*/ + +body { + color: rgb(255, 255, 255); + background-color: rgb(29, 29, 29); +} + +.win-type-interactive:hover { + color: rgba(255, 255, 255, 0.8); +} +.win-type-interactive:hover:active { + color: rgba(255, 255, 255, 0.4); +} + +.win-type-interactive:-ms-keyboard-active { + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light .win-type-interactive:hover { + color: rgba(0, 0, 0, 0.8); +} +.win-ui-light .win-type-interactive:hover:active { + color: rgba(0, 0, 0, 0.4); +} +.win-ui-light .win-type-interactive:-ms-keyboard-active { + color: rgba(0, 0, 0, 0.4); +} + +/* +These classes reverse the colors on the subtree to which they are applied. +*/ + +.win-ui-dark { + color: rgb(255, 255, 255); + background-color: rgb(29, 29, 29); +} +.win-ui-light { + color: rgb(0, 0, 0); + background-color: rgb(255, 255, 255); +} + +/* +Text selection color +*/ +::selection { + background-color: rgb(87, 41, 193); + color: rgb(255, 255, 255); +} + +/* +Text input, checkbox, radio, and select control colors. +*/ +input[type=text], input[type=password], +input[type=email], input[type=number], +input[type=tel], input[type=url], +input[type=search], textarea, .win-textarea, +select, input::-ms-check { + background-clip: border-box; + background-color: rgba(255, 255, 255, 0.8); + border-color: transparent; + color: rgb(0, 0, 0); +} +input[type=text]:hover, input[type=password]:hover, +input[type=email]:hover, input[type=number]:hover, +input[type=tel]:hover, input[type=url]:hover, +input[type=search]:hover, textarea:hover, +.win-textarea:hover, select:hover, input:hover::-ms-check { + background-clip: border-box; + background-color: rgba(255, 255, 255, 0.87); + border-color: transparent; + color: rgb(0, 0, 0); +} +input:hover:active::-ms-check { /* only checkbox and radio have press state */ + background-color: rgb(255, 255, 255); + color: rgb(0, 0, 0); +} +input:-ms-keyboard-active::-ms-check { /* only checkbox and radio have press state */ + background-color: rgb(255, 255, 255); +} +input[type=text]:focus, input[type=text]:active, +input[type=password]:focus, input[type=password]:active, +input[type=email]:focus, input[type=email]:active, +input[type=number]:focus, input[type=number]:active, +input[type=tel]:focus, input[type=tel]:active, +input[type=url]:focus, input[type=url]:active, +input[type=search]:focus, input[type=search]:active, +textarea:focus, textarea:active, +.win-textarea:focus, .win-textarea:active, +select:focus, select:active { + background-clip: border-box; + background-color: rgb(255, 255, 255); + border-color: transparent; + color: rgb(0, 0, 0); +} +input[type=text]:disabled, input[type=password]:disabled, +input[type=email]:disabled, input[type=number]:disabled, +input[type=tel]:disabled, input[type=url]:disabled, +input[type=search]:disabled, input[type=file]::-ms-value, +textarea:disabled, .win-textarea:disabled, select:disabled { + background-clip: border-box; + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.4); +} +input:disabled::-ms-check, input:disabled:active::-ms-check { /* checkbox and radio have filled disabled state in dark */ + background-clip: border-box; + background-color: rgba(255, 255, 255, 0.4); + border-color: transparent; + color: rgba(0, 0, 0, 0.4); +} +.win-ui-light input[type=text], .win-ui-light input[type=password], +.win-ui-light input[type=email], .win-ui-light input[type=number], +.win-ui-light input[type=tel], .win-ui-light input[type=url], +.win-ui-light input[type=search], .win-ui-light select, .win-ui-light textarea, +.win-ui-light .win-textarea, .win-ui-light input::-ms-check { + background-clip: padding-box; + background-color: rgba(255, 255, 255, 0.8); + border-color: rgba(0, 0, 0, 0.27); + color: rgb(0, 0, 0); +} +.win-ui-light input[type=text]:hover, .win-ui-light input[type=password]:hover, +.win-ui-light input[type=email]:hover, .win-ui-light input[type=number]:hover, +.win-ui-light input[type=tel]:hover, .win-ui-light input[type=url]:hover, +.win-ui-light input[type=search]:hover, .win-ui-light textarea:hover, +.win-ui-light select:hover, .win-ui-light .win-textarea:hover, .win-ui-light input:hover::-ms-check { + background-color: rgba(255, 255, 255, 0.87); + border-color: rgba(0, 0, 0, 0.44); + color: rgb(0, 0, 0); +} +.win-ui-light input[type=text]:focus, .win-ui-light input[type=text]:active, +.win-ui-light input[type=password]:focus, .win-ui-light input[type=password]:active, +.win-ui-light input[type=email]:focus, .win-ui-light input[type=email]:active, +.win-ui-light input[type=number]:focus, .win-ui-light input[type=number]:active, +.win-ui-light input[type=tel]:focus, .win-ui-light input[type=tel]:active, +.win-ui-light input[type=url]:focus, .win-ui-light input[type=url]:active, +.win-ui-light input[type=search]:focus, .win-ui-light input[type=search]:active, +.win-ui-light textarea:focus, .win-ui-light textarea:active, +.win-ui-light .win-textarea:focus, .win-ui-light .win-textarea:active, +.win-ui-light select:focus, .win-ui-light select:active { + background-color: rgb(255, 255, 255); + border-color: rgba(0, 0, 0, 0.6); + color: rgb(0, 0, 0); +} +.win-ui-light input:hover:active::-ms-check { /* only checkbox and radio have press state */ + background-clip: border-box; + background-color: rgb(0, 0, 0); + border-color: transparent; + color: rgb(255, 255, 255); +} +.win-ui-light input:-ms-keyboard-active::-ms-check { /* only checkbox and radio have press state */ + background-clip: border-box; + background-color: rgb(0, 0, 0); + border-color: transparent; + color: rgb(255, 255, 255); +} +.win-ui-light input[type=text]:disabled, .win-ui-light input[type=password]:disabled, +.win-ui-light input[type=email]:disabled, .win-ui-light input[type=number]:disabled, +.win-ui-light input[type=tel]:disabled, .win-ui-light input[type=url]:disabled, +.win-ui-light input[type=search]:disabled, .win-ui-light input[type=file]::-ms-value, +.win-ui-light textarea:disabled, .win-ui-light .win-textarea:disabled, .win-ui-light select:disabled, +.win-ui-light input:disabled::-ms-check, .win-ui-light input:disabled:active::-ms-check { + background-clip: padding-box; + background-color: rgba(202, 202, 202, 0.4); + border-color: rgba(0, 0, 0, 0.15); + color: rgba(0, 0, 0, 0.4); +} + +/* +Placeholder text style. +*/ +input[type]:-ms-input-placeholder, .win-ui-light input[type]:-ms-input-placeholder, +textarea:-ms-input-placeholder, .win-ui-light textarea:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.6); /* same in dark and light */ +} +input[type]:disabled:-ms-input-placeholder, textarea:disabled:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.22); +} +.win-ui-light input[type]:disabled:-ms-input-placeholder, .win-ui-light textarea:disabled:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.22); +} + +/* +Invalid style. +*/ +input[type]:invalid { + outline-color: rgb(255, 128, 51); + outline-width: 2px; +} + +/* +Clear and reveal buttons. +*/ +input::-ms-clear, input::-ms-reveal { + background-color: rgb(255, 255, 255); + color: rgb(0, 0, 0); +} +input::-ms-clear:hover, input::-ms-reveal:hover { + background-color: rgb(222, 222, 222); +} +input::-ms-clear:hover:active, input::-ms-reveal:hover:active { + background-color: rgb(0, 0, 0); + color: rgb(255, 255, 255); +} + +/* +Option for select control (all colors are same for both light and dark). +*/ +option:checked, select:focus::-ms-value { + color: rgb(255, 255, 255); + background-color: rgb(70, 23, 180); +} +option:hover { + color: rgb(0, 0, 0); + background-color: rgb(197, 197, 197); +} +select:focus option:hover { + color: rgb(0, 0, 0); + background-color: rgb(222, 222, 222); +} +option:checked:hover, select:focus option:checked:hover { + color: rgb(255, 255, 255); + background-color: rgb(95, 55, 190); +} +option:hover:active, select:focus option:hover:active{ + color: rgb(0, 0, 0); + background-color: rgb(211, 211, 211); +} +option:checked:disabled, option:checked:disabled:active, +optgroup:disabled option:checked, optgroup:disabled option:checked:active, +select:disabled option:checked, select:disabled option:checked:active, +select:disabled:focus::-ms-value { + background-color: rgba(255, 255, 255, 0.4); + color: rgba(0, 0, 0, 0.6); +} +.win-ui-light option:checked:disabled, .win-ui-light option:checked:disabled:active, +.win-ui-light optgroup:disabled option:checked, .win-ui-light optgroup:disabled option:checked:active, +.win-ui-light select:disabled option:checked, .win-ui-light select:disabled option:checked:active, +.win-ui-light select:disabled:focus::-ms-value { + background-color: rgba(0, 0, 0, 0.55); + color: rgba(255, 255, 255, 0.6); +} + +/* +Button control colors. +*/ +button, input[type=button], input[type=submit], +input[type=reset], input[type=file]::-ms-browse { + background-color: transparent; + border-color: rgb(255, 255, 255); + color: rgb(255, 255, 255); +} +button[type=submit], input[type=submit] { + background-clip: padding-box; + background-color: rgb(70, 23, 180); +} +button:hover, input[type=button]:hover, input[type=reset]:hover, +input[type=file]::-ms-browse:hover { + background-color: rgba(255, 255, 255, 0.13); + border-color: rgb(255, 255, 255); +} +button[type=submit]:hover, input[type=submit]:hover { + background-clip: padding-box; + background-color: rgb(95, 55, 190); + border-color: rgb(255, 255, 255); +} +button:hover:active, button[type=submit]:hover:active, +input[type=button]:hover:active, input[type=reset]:hover:active, +input[type=submit]:hover:active, input[type=file]::-ms-browse:hover:active { + background-clip: border-box; + background-color: rgb(255, 255, 255); + border-color: transparent; + color: rgb(0, 0, 0); +} +button:-ms-keyboard-active, button[type=submit]:-ms-keyboard-active, +input[type=button]:-ms-keyboard-active, input[type=reset]:-ms-keyboard-active, +input[type=submit]:-ms-keyboard-active { + background-clip: border-box; + background-color: rgb(255, 255, 255); + border-color: transparent; + color: rgb(0, 0, 0); +} +button:disabled, button[type=submit]:disabled, +input[type=button]:disabled, input[type=reset]:disabled, +input[type=submit]:disabled, input[type=file]:disabled::-ms-browse, +button:disabled:active, button[type=submit]:disabled:active, +input[type=button]:disabled:active, input[type=reset]:disabled:active, +input[type=submit]:disabled:active, input[type=file]:disabled::-ms-browse:active { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light button, .win-ui-light input[type=button], .win-ui-light input[type=submit], +.win-ui-light input[type=reset], .win-ui-light input[type=file]::-ms-browse { + background-color: rgba(182, 182, 182, 0.7); + border-color: rgba(0, 0, 0, 0.2); + color: rgb(0, 0, 0); +} +.win-ui-light button[type=submit], .win-ui-light input[type=submit]{ + background-clip: border-box; + background-color: rgb(70, 23, 180); + border-color: transparent; + color: rgb(255, 255, 255); +} +.win-ui-light button:hover, .win-ui-light input[type=button]:hover, .win-ui-light input[type=reset]:hover, +.win-ui-light input[type=file]::-ms-browse:hover { + background-color: rgba(205, 205, 205, 0.82); + border-color: rgba(164, 164, 164, 0.45); +} +.win-ui-light button[type=submit]:hover, .win-ui-light input[type=submit]:hover { + background-clip: border-box; + background-color: rgb(95, 55, 190); + border-color: transparent; +} +.win-ui-light button:hover:active, .win-ui-light button[type=submit]:hover:active, +.win-ui-light input[type=button]:hover:active, .win-ui-light input[type=reset]:hover:active, +.win-ui-light input[type=submit]:hover:active, .win-ui-light input[type=file]::-ms-browse:hover:active { + background-clip: border-box; + background-color: rgb(0, 0, 0); + border-color: transparent; + color: rgb(255, 255, 255); +} +.win-ui-light button:-ms-keyboard-active, .win-ui-light button[type=submit]:-ms-keyboard-active, +.win-ui-light input[type=button]:-ms-keyboard-active, .win-ui-light input[type=reset]:-ms-keyboard-active, +.win-ui-light input[type=submit]:-ms-keyboard-active { + background-clip: border-box; + background-color: rgb(0, 0, 0); + border-color: transparent; + color: rgb(255, 255, 255); +} +.win-ui-light button:disabled, .win-ui-light button[type=submit]:disabled, +.win-ui-light input[type=button]:disabled, .win-ui-light input[type=reset]:disabled, +.win-ui-light input[type=submit]:disabled, .win-ui-light input[type=file]:disabled::-ms-browse, +.win-ui-light button:disabled:active, .win-ui-light button[type=submit]:disabled:active, +.win-ui-light input[type=button]:disabled:active, .win-ui-light input[type=reset]:disabled:active, +.win-ui-light input[type=submit]:disabled:active, .win-ui-light input[type=file]:disabled::-ms-browse:active { + background-color: rgba(202, 202, 202, 0.4); + border-color: rgba(0, 0, 0, 0.08); + color: rgba(0, 0, 0, 0.4); +} +.win-ui-light input[type=file]:disabled::-ms-browse, .win-ui-light input[type=file]:disabled::-ms-browse:active { + border-color: rgba(0, 0, 0, 0.15); +} + +/* +File upload control colors. +*/ +input[type=file] { + background-color: transparent; + border-color: transparent; + color: transparent; +} + +/* +Link colors. +*/ +a { + color: rgb(156, 114, 255); +} +a:hover:active { + color: rgba(156, 114, 255, 0.6); +} +a:hover { + color: rgba(156, 114, 255, 0.8); +} +a[disabled], a[disabled]:active { /* :disabled pseudo-class doesn't apply to a, even though disabled attribute stops navigation */ + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light a { + color: rgb(79, 26, 203); +} +.win-ui-light a:hover:active { + color: rgba(79, 26, 203, 0.6); +} +.win-ui-light a:hover { + color: rgba(79, 26, 203, 0.8); +} +.win-ui-light a[disabled], .win-ui-light a[disabled]:active { /* :disabled pseudo-class doesn't apply to a, even though disabled attribute stops navigation */ + color: rgba(0, 0, 0, 0.4); +} + +/* +Range control colors. +*/ +input[type=range], input[type=range]::-ms-track { + background-color: transparent; +} + +input[type=range]::-ms-fill-lower { + background-color: rgb(91, 46, 197); +} +input[type=range]:hover::-ms-fill-lower { + background-color: rgb(114, 75, 205); +} +input[type=range]:active::-ms-fill-lower { + background-color: rgb(129, 82, 239); +} +input[type=range]:disabled::-ms-fill-lower { + background-color: rgba(255, 255, 255, 0.23); +} +.win-ui-light input[type=range]::-ms-fill-lower { + background-color: rgb(70, 23, 180); +} +.win-ui-light input[type=range]:hover::-ms-fill-lower { + background-color: rgb(95, 55, 190); +} +.win-ui-light input[type=range]:active::-ms-fill-lower { + background-color: rgb(114, 65, 228); +} +.win-ui-light input[type=range]:disabled::-ms-fill-lower { + background-color: rgba(0, 0, 0, 0.2); +} + +input[type=range]::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.16); +} +input[type=range]:hover::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.18); +} +input[type=range]:active::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.23); +} +input[type=range]:disabled::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.16); +} +.win-ui-light input[type=range]::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.1); +} +.win-ui-light input[type=range]:hover::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.15); +} +.win-ui-light input[type=range]:active::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.2); +} +.win-ui-light input[type=range]:disabled::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.1); +} + +input[type=range]::-ms-thumb { + background-color: rgb(255, 255, 255); +} +input[type=range]:disabled::-ms-thumb { + background-color: rgb(126, 126, 126); +} +.win-ui-light input[type=range]::-ms-thumb { + background-color: rgb(0, 0, 0); +} +.win-ui-light input[type=range]:disabled::-ms-thumb { + background-color: rgb(146, 146, 146); +} + +input[type=range]::-ms-ticks-before, +input[type=range]::-ms-ticks-after { + color: rgba(255, 255, 255, 0.5); +} +.win-ui-light input[type=range]::-ms-ticks-before, +.win-ui-light input[type=range]::-ms-ticks-after { + color: rgba(0, 0, 0, 0.5); +} + +/* +Progress control colors. +*/ +progress { + background-color: rgba(255,255,255,0.35); + color: rgb(91, 46, 197); +} +.win-ui-light progress { + background-color: rgba(0, 0, 0, 0.2); + color: rgb(70, 23, 180); +} +progress:indeterminate { + color: rgb(138, 87, 255); +} +.win-ui-light progress:indeterminate { + color: rgb(70, 23, 180); +} +progress::-ms-fill { + background-color: currentColor; +} +/* +Explicitly define indeterminate background transparent for dark and light +because ".win-ui-light progress" has higher specificity than "progress:indeterminate". +*/ +progress:indeterminate, .win-ui-light progress:indeterminate { + background-color: transparent; +} + +/* +Hub colors. +*/ +button.win-hub-section-header-tabstop, +button.win-hub-section-header-tabstop:hover, +button.win-hub-section-header-tabstop:hover:active { + color: rgb(255, 255, 255); +} +button.win-hub-section-header-tabstop.win-keyboard:focus { + outline: 1px dotted rgb(255, 255, 255); +} +button.win-hub-section-header-tabstop:-ms-keyboard-active { + color: rgb(255, 255, 255); +} +button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover { + color: rgba(255, 255, 255, 0.8); +} +button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active { + color: rgba(255, 255, 255, 0.4); +} +button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active { + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light button.win-hub-section-header-tabstop, +.win-ui-light button.win-hub-section-header-tabstop:hover, +.win-ui-light button.win-hub-section-header-tabstop:hover:active { + color: rgb(0, 0, 0); +} +.win-ui-light button.win-hub-section-header-tabstop.win-keyboard:focus { + outline: 1px dotted rgb(0, 0, 0); +} +.win-ui-light button.win-hub-section-header-tabstop:-ms-keyboard-active { + color: rgb(0, 0, 0); +} +.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover { + color: rgba(0, 0, 0, 0.8); +} +.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active { + color: rgba(0, 0, 0, 0.4); +} +.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active { + color: rgba(0, 0, 0, 0.4); +} + +/* +NavBarContainer colors. +*/ +.win-navbarcontainer-pageindicator { + background-color: rgba(255,255,255,0.4); +} +.win-ui-light .win-navbarcontainer-pageindicator { + background-color: rgba(0,0,0,0.3); +} +.win-navbarcontainer-pageindicator-current { + background-color: rgba(255,255,255,0.8); +} +.win-ui-light .win-navbarcontainer-pageindicator-current { + background-color: rgba(0,0,0,0.66); +} +.win-navbarcontainer-pageindicator:hover { + background-color: rgba(255,255,255,0.6); +} +.win-ui-light .win-navbarcontainer-pageindicator:hover { + background-color: rgba(0,0,0,0.44); +} +.win-navbarcontainer-pageindicator:hover:active { + background-color: rgba(255,255,255,0.7); +} +.win-ui-light .win-navbarcontainer-pageindicator:hover:active { + background-color: rgba(0,0,0,0.58); +} +.win-navbarcontainer-navarrow { + background-color: rgb(74,74,74); + color: rgb(30,30,30) +} +.win-navbarcontainer-navarrow:hover { + background-color: rgb(202,202,202); + color: rgb(0,0,0) +} +.win-navbarcontainer-navarrow:hover:active { + background-color: rgb(30,30,30); + color: rgb(255,255,255); +} +.win-ui-light .win-navbarcontainer-navarrow { + background-color: rgb(231,231,231); + color: rgb(92,92,92) +} +.win-ui-light .win-navbarcontainer-navarrow:hover { + background-color: rgb(218,218,218); + color: rgb(0,0,0) +} +.win-ui-light .win-navbarcontainer-navarrow:hover:active { + background-color: rgb(93,93,93); + color: rgb(255,255,255); +} + +/* + NavBarCommand colors. +*/ +.win-navbarcommand-button, +.win-navbarcommand-splitbutton { + background-color: rgba(255,255,255,0.11); + color: rgb(255,255,255); +} +.win-ui-light .win-navbarcommand-button, +.win-ui-light .win-navbarcommand-splitbutton { + background-color: rgba(0,0,0,0.09); + color: rgb(0,0,0); +} +.win-navbarcommand-button:hover, +.win-navbarcommand-splitbutton:hover { + background-color: rgba(255,255,255,0.22); +} +.win-ui-light .win-navbarcommand-button:hover, +.win-ui-light .win-navbarcommand-splitbutton:hover { + background-color: rgba(199,199,199,0.31); +} +.win-navbarcommand-button.win-keyboard:focus, +.win-navbarcommand-splitbutton.win-keyboard:focus { + outline: 2px solid rgb(255,255,255); +} +.win-ui-light .win-navbarcommand-button.win-keyboard:focus, +.win-ui-light .win-navbarcommand-splitbutton.win-keyboard:focus { + outline: 2px solid rgb(0,0,0); +} +.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened, +.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover, +.win-navbarcommand-button.win-pressed, +.win-navbarcommand-button.win-pressed:hover, +.win-navbarcommand-splitbutton.win-pressed, +.win-navbarcommand-splitbutton.win-pressed:hover { + background-color: rgb(255,255,255); + color: rgb(0,0,0); +} +.win-ui-light .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened, +.win-ui-light .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover, +.win-ui-light .win-navbarcommand-button.win-pressed, +.win-ui-light .win-navbarcommand-button.win-pressed:hover, +.win-ui-light .win-navbarcommand-splitbutton.win-pressed, +.win-ui-light .win-navbarcommand-splitbutton.win-pressed:hover { + background-color: rgb(0,0,0); + color: rgb(255,255,255); +} + +/* +FlipView control colors. +*/ +.win-flipview .win-navbutton { + background-color: rgba(213, 213, 213, 0.35); + color: rgba(0, 0, 0, 0.60); +} +.win-flipview .win-navbutton:hover { + background-color: rgba(215, 215, 215, 0.94); + color: rgba(0, 0, 0, 1.0); +} +.win-flipview .win-navbutton:hover:active { + background-color: rgba(41, 41, 41, 0.74); + color: rgba(255, 255, 255, 1.0); +} + +/* +ListView control colors. +*/ +.win-listview .win-itembox, +.win-itemcontainer .win-itembox { + background-color: rgb(29, 29, 29); +} +.win-ui-light .win-listview .win-itembox, +.win-ui-light .win-itemcontainer .win-itembox { + background-color: rgb(255, 255, 255); +} +.win-listview .win-container.win-backdrop { + background-color: rgba(155,155,155,0.23); +} +.win-ui-light .win-listview .win-container.win-backdrop { + background-color: rgba(155,155,155,0.23); +} +.win-listview .win-container:hover, +.win-itemcontainer.win-container:hover { + outline: rgba(255, 255, 255, 0.3) solid 3px; +} +.win-listview .win-groupheader { + outline-color: rgb(255, 255, 255); +} +.win-listview.win-selectionstylefilled .win-container:hover .win-itembox, +.win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox { + background-color: rgba(255, 255, 255, 0.3); +} +.win-listview .win-focusedoutline, +.win-itemcontainer .win-focusedoutline { + outline: rgb(255, 255, 255) solid 2px; +} +.win-ui-light .win-listview .win-container:hover, +.win-ui-light .win-itemcontainer.win-container:hover { + outline: rgba(0, 0, 0, 0.3) solid 3px; +} +.win-ui-light .win-listview .win-groupheader{ + outline-color: rgb(0, 0, 0); +} +.win-ui-light .win-listview.win-selectionstylefilled .win-container:hover .win-itembox, +.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox { + background-color: rgba(0, 0, 0, 0.3); +} +.win-ui-light .win-listview .win-focusedoutline, +.win-ui-light .win-itemcontainer .win-focusedoutline { + outline: rgb(0, 0, 0) solid 2px; +} +.win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox, +.win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox +{ + background-color: rgb(95, 55, 190); +} +.win-listview .win-container.win-swipe:hover .win-itembox, +.win-itemcontainer.win-container.win-swipe:hover .win-itembox { + background-color: rgb(29, 29, 29); + outline: none; +} +.win-ui-light .win-listview .win-container.win-swipe:hover .win-itembox, +.win-ui-light .win-itemcontainer.win-container.win-swipe:hover .win-itembox { + background-color: rgb(255, 255, 255); + outline: none; +} +.win-listview.win-selectionstylefilled .win-selected, +.win-itemcontainer.win-selectionstylefilled.win-selected { + color: rgb(255, 255, 255); +} +.win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder, +.win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder { + border-color: rgb(70, 23, 180); +} +.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder, +.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder { + border-color: transparent; +} +.win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder, +.win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder { + border-color: rgb(95, 55, 190); +} +.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground, +.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground { + background-color: rgb(70, 23, 180); +} +.win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground, +.win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground { + background-color: rgb(95, 55, 190); +} +.win-selectioncheckmark { + color: rgb(255, 255, 255); +} +.win-selectionhint { + color: rgb(255, 255, 255); +} +.win-ui-light .win-selectionhint { + color: rgb(70, 23, 180); +} +.win-listview:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground, +.win-itemcontainer:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground { + border-top-color: rgb(70, 23, 180); + border-right-color: rgb(70, 23, 180); + border-left-color: transparent; + border-bottom-color: transparent; +} +.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground, +.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground { + border-color: transparent; +} +.win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectioncheckmarkbackground, +.win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectioncheckmarkbackground { + border-top-color: rgb(95, 55, 190); + border-right-color: rgb(95, 55, 190); + border-left-color: transparent; + border-bottom-color: transparent; +} +.win-listview.win-rtl:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground, +.win-itemcontainer.win-rtl:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground { + border-left-color: rgb(70, 23, 180); + border-right-color: transparent; +} +.win-listview.win-rtl:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectioncheckmarkbackground, +.win-itemcontainer.win-rtl:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectioncheckmarkbackground { + border-left-color: rgb(95, 55, 190); + border-right-color: transparent; +} + +.win-listview.win-selectionstylefilled .win-selected a, +.win-listview.win-selectionstylefilled .win-selected progress, +.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full, +.win-itemcontainer.win-selectionstylefilled.win-selected a, +.win-itemcontainer.win-selectionstylefilled.win-selected progress, +.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full { + color: rgb(255, 255, 255); +} +.win-listview.win-selectionstylefilled .win-selected a:hover:active, +.win-itemcontainer.win-selectionstylefilled.win-selected a:hover:active { + color: rgba(255, 255, 255, 0.6); +} +.win-listview.win-selectionstylefilled .win-selected a:hover, +.win-itemcontainer.win-selectionstylefilled.win-selected a:hover { + color: rgba(255, 255, 255, 0.8); +} +.win-listview.win-selectionstylefilled .win-selected button, +.win-listview.win-selectionstylefilled .win-selected input[type=button], +.win-listview.win-selectionstylefilled .win-selected input[type=reset], +.win-listview.win-selectionstylefilled .win-selected input[type=text], +.win-listview.win-selectionstylefilled .win-selected input[type=password], +.win-listview.win-selectionstylefilled .win-selected input[type=email], +.win-listview.win-selectionstylefilled .win-selected input[type=number], +.win-listview.win-selectionstylefilled .win-selected input[type=tel], +.win-listview.win-selectionstylefilled .win-selected input[type=url], +.win-listview.win-selectionstylefilled .win-selected input[type=search], +.win-listview.win-selectionstylefilled .win-selected input::-ms-check, +.win-listview.win-selectionstylefilled .win-selected textarea, +.win-listview.win-selectionstylefilled .win-selected .win-textarea, +.win-listview.win-selectionstylefilled .win-selected select, +.win-itemcontainer.win-selectionstylefilled.win-selected button, +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search], +.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check, +.win-itemcontainer.win-selectionstylefilled.win-selected textarea, +.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea, +.win-itemcontainer.win-selectionstylefilled.win-selected select { + background-clip: border-box; + background-color: rgba(255, 255, 255, 0.8); + border-color: transparent; + color: rgb(0, 0, 0); +} +.win-listview.win-selectionstylefilled .win-selected button[type=submit], +.win-listview.win-selectionstylefilled .win-selected input[type=submit], +.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit], +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit] { + border-color: rgb(255, 255, 255); +} +.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower, +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower { + background-color: rgb(255, 255, 255); +} +.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb, +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb { + background-color: rgb(0,0,0); +} +.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper, +.win-listview.win-selectionstylefilled .win-selected progress, +.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper, +.win-itemcontainer.win-selectionstylefilled.win-selected progress { + background-color: rgba(255, 255, 255, 0.16); +} +.win-listview.win-selectionstylefilled .win-selected progress:indeterminate, +.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate { + background-color: transparent; +} +.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty, +.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty { + color: rgba(255, 255, 255, 0.16); +} + +/* +Color for the BackButton controls +*/ +.win-navigation-backbutton, .win-navigation-backbutton:active, +.win-navigation-backbutton:hover, .win-navigation-backbutton:active:hover +{ + background-color: transparent; +} +.win-backbutton, .win-back { + background-color: transparent; + border-color: rgb(255, 255, 255); + color: rgb(255, 255, 255); +} +.win-backbutton:hover, +.win-navigation-backbutton:hover .win-back { + background-color: rgba(255, 255, 255, 0.13); + border-color: rgb(255, 255, 255); +} +.win-backbutton:hover:active, +.win-navigation-backbutton:hover:active .win-back, +.win-navigation-backbutton:active .win-back { + background-color: rgb(255, 255, 255); + border-color: rgb(255, 255, 255); + color: rgb(0, 0, 0); +} +.win-backbutton:-ms-keyboard-active, +.win-navigation-backbutton:-ms-keyboard-active .win-back { + background-color: rgb(255, 255, 255); + border-color: rgb(255, 255, 255); + color: rgb(0, 0, 0); +} +.win-backbutton:disabled, .win-backbutton:disabled:active, +.win-navigation-backbutton:disabled .win-back, +.win-navigation-backbutton:disabled:active .win-back { + background-clip: padding-box; + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light .win-navigation-backbutton, .win-ui-light .win-navigation-backbutton:active, +.win-ui-light .win-navigation-backbutton:hover, .win-ui-light .win-navigation-backbutton:active:hover +{ + background-color: transparent; +} +.win-ui-light .win-backbutton, .win-ui-light .win-back { + background-color: transparent; + border-color: rgb(0, 0, 0); + color: rgb(0, 0, 0); +} +.win-ui-light .win-backbutton:hover, +.win-ui-light .win-navigation-backbutton:hover .win-back { + background-color: rgba(0, 0, 0, 0.13); + border-color: rgb(0, 0, 0); +} +.win-ui-light .win-backbutton:hover:active, +.win-ui-light .win-navigation-backbutton:hover:active .win-back { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); + color: rgb(255, 255, 255); +} +.win-ui-light .win-backbutton:-ms-keyboard-active, +.win-ui-light .win-navigation-backbutton:-ms-keyboard-active .win-back { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); + color: rgb(255, 255, 255); +} +.win-ui-light .win-backbutton:disabled, .win-ui-light .win-backbutton:disabled:active, +.win-ui-light .win-navigation-backbutton:disabled .win-back, +.win-ui-light .win-navigation-backbutton:disabled:active .win-back { + background-clip: padding-box; + background-color: transparent; + border-color: rgba(0, 0, 0, 0.4); + color: rgba(0, 0, 0, 0.4); +} + +/* +Colors for command buttons and AppBarCommand "content" types. +*/ +button.win-command, div.win-command { + background-color: transparent; + border-color: transparent; +} +button.win-command:hover, div.win-command:hover { + background-color: transparent; + border-color: transparent; +} +button.win-command:active, div.win-command:active { + background-color: transparent; + color: inherit; +} +button.win-command:hover:active, div.win-command:hover:active { + background-color: transparent; + color: inherit; +} +button.win-command:-ms-keyboard-active, div.win-command:-ms-keyboard-active { + background-color: transparent; + color: inherit; +} +button.win-command:disabled, div.win-command:disabled { + border-color: transparent; + background-color: transparent; +} +button.win-command:focus, div.win-command:focus { + border-color: rgb(255, 255, 255); +} +.win-ui-light button.win-command:focus, .win-ui-light div.win-command:focus { + border-color: rgb(0, 0, 0); +} +.win-hidefocus:focus { + outline: none; +} +/* + win-hide-focus needs the qualifier for win-ui-light or dark, + otherwise .win-ui-dark button.win-command:focus is more + qualified and stomps on the transparent that doesn't have .win-ui-dark +*/ +.win-command.win-hidefocus:focus, +.win-ui-light .win-command.win-hidefocus:focus { + border-color: transparent; +} +.win-commandimage { + color: rgb(255, 255, 255); +} +button:hover:active .win-commandimage { + color: rgb(0, 0, 0); +} +button:-ms-keyboard-active .win-commandimage { + color: rgb(0, 0, 0); +} +button:disabled .win-commandimage, +button:disabled:active .win-commandimage { + color: rgba(255, 255, 255, 0.4); +} +button[aria-checked=true] .win-commandimage, +button[aria-checked=true]:active .win-commandimage { + color: rgb(0, 0, 0); +} + +button[aria-checked=true]:hover .win-commandimage { + color: rgb(0, 0, 0); +} + +button[aria-checked=true]:hover:active .win-commandimage { + color: rgb(255, 255, 255); +} +button[aria-checked=true]:-ms-keyboard-active .win-commandimage { + color: rgb(255, 255, 255); +} +button[aria-checked=true]:disabled .win-commandimage, +button[aria-checked=true]:disabled:active .win-commandimage { + color: rgb(0, 0, 0); +} +.win-ui-light .win-commandimage { + color: rgb(0, 0, 0); +} +.win-ui-light button:hover:active .win-commandimage { + color: rgb(255, 255, 255); +} +.win-ui-light button:-ms-keyboard-active .win-commandimage { + color: rgb(255, 255, 255); +} +.win-ui-light button:disabled .win-commandimage, +.win-ui-light button:disabled:active .win-commandimage { + color: rgba(0, 0, 0, 0.4); +} +.win-ui-light button[aria-checked=true] .win-commandimage, +.win-ui-light button[aria-checked=true]:active .win-commandimage { + color: rgb(255, 255, 255); +} +.win-ui-light button[aria-checked=true]:hover .win-commandimage { + color: rgb(255, 255, 255); +} +.win-ui-light button[aria-checked=true]:hover:active .win-commandimage { + color: rgb(0, 0, 0); +} +.win-ui-light button[aria-checked=true]:-ms-keyboard-active .win-commandimage { + color: rgb(0, 0, 0); +} +.win-ui-light button[aria-checked=true]:disabled .win-commandimage, +.win-ui-light button[aria-checked=true]:disabled:active .win-commandimage { + color: rgb(255, 255, 255); +} + +/* +Command ring colors. +*/ +.win-commandring, button:active .win-commandring { + background-color: transparent; + border-color: rgb(255, 255, 255); +} +button:hover .win-commandring { + background-color: rgba(255, 255, 255, 0.13); + border-color: rgb(255, 255, 255); +} +button:hover:active .win-commandring { + background-color: rgb(255, 255, 255); + border-color: rgb(255, 255, 255); +} +button:-ms-keyboard-active .win-commandring { + background-color: rgb(255, 255, 255); + border-color: rgb(255, 255, 255); +} +button:disabled .win-commandring, +button:disabled:active .win-commandring { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.4); +} +button[aria-checked=true] .win-commandring, +button[aria-checked=true]:active .win-commandring { + background-color: rgb(255, 255, 255); + border-color: rgb(255, 255, 255); +} +button[aria-checked=true]:hover .win-commandring { + background-color: rgb(222, 222, 222); + border-color: rgb(222, 222, 222); +} +button[aria-checked=true]:hover:active .win-commandring { + background-color: transparent; + border-color: rgb(255, 255, 255); +} +button[aria-checked=true]:-ms-keyboard-active .win-commandring { + background-color: transparent; + border-color: rgb(255, 255, 255); +} +button[aria-checked=true]:disabled .win-commandring, +button[aria-checked=true]:disabled:active .win-commandring { + background-color: rgba(255, 255, 255, 0.4); + border-color: rgba(255, 255, 255, 0.4); +} +.win-ui-light .win-commandring, .win-ui-light button:active .win-commandring { + background-color: transparent; + border-color: rgb(0, 0, 0); +} +.win-ui-light button:hover .win-commandring { + background-color: rgba(0, 0, 0, 0.13); + border-color: rgb(0, 0, 0); +} +.win-ui-light button:hover:active .win-commandring { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); +} +.win-ui-light button:-ms-keyboard-active .win-commandring { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); +} +.win-ui-light button:disabled .win-commandring, +.win-ui-light button:disabled:active .win-commandring { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.4); +} +.win-ui-light button[aria-checked=true] .win-commandring, +.win-ui-light button[aria-checked=true]:active .win-commandring { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); +} +.win-ui-light button[aria-checked=true]:hover .win-commandring { + background-color: rgb(33, 33, 33); + border-color: rgb(33, 33, 33); +} +.win-ui-light button[aria-checked=true]:hover:active .win-commandring { + background-color: transparent; + border-color: rgb(0, 0, 0); +} +.win-ui-light button[aria-checked=true]:-ms-keyboard-active .win-commandring { + background-color: transparent; + border-color: rgb(0, 0, 0); +} +.win-ui-light button[aria-checked=true]:disabled .win-commandring, +.win-ui-light button[aria-checked=true]:disabled:active .win-commandring { + background-color: rgba(0, 0, 0, 0.4); + border-color: rgba(0, 0, 0, 0.4); +} + +/* +Command button labels colors. +*/ +button.win-command:disabled .win-label, +button.win-command:disabled:active .win-label { + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light button.win-command:disabled .win-label, +.win-ui-light button.win-command:disabled:active .win-label { + color: rgba(0, 0, 0, 0.4); +} + +/* +AppBarCommand (and MenuCommand) separator. +*/ +hr.win-command { + /* Same color in both light and dark. */ + background-color: rgb(123, 123, 123); +} + +/* +AppBar control colors. +*/ +.win-appbar { + background-color: rgb(0, 0, 0); + border-color: rgb(0, 0, 0); +} +.win-ui-light.win-appbar, .win-ui-light .win-appbar { + background-color: rgb(240, 240, 240); + border-color: rgb(240, 240, 240); +} + +/* +Flyout control colors, flyout normally has light theme. +*/ +.win-ui-light.win-flyout, .win-ui-light .win-flyout { + border-color: rgb(0, 0, 0); + background-color: rgb(255, 255, 255); +} + +.win-ui-light.win-settingsflyout, .win-ui-light .win-settingsflyout { + border-color: rgba(0, 0, 0, 0.24); +} + +.win-flyout { + border-color: rgb(255, 255, 255); + background-color: rgb(0, 0, 0); +} + +.win-settingsflyout { + border-color: rgba(255, 255, 255, 0.24); +} + +/* +Settings flyout is light in both themes unless the app explicitly overrides it. +*/ +.win-settingsflyout { + background-color: rgb(255, 255, 255); +} +.win-settingsflyout.win-ui-dark { + background-color: rgb(0, 0, 0); +} + +/* +Settings flyout will be white in dark theme so we need to have the header stay +aligned with the theme unless the app explicitly overrides it. +*/ + +.win-settingsflyout .win-header { + background-color: rgb(0, 0, 0); +} +.win-settingsflyout .win-header.win-ui-light { + background-color: rgb(255, 255, 255); +} + +/* +Menu button colors, menu is always light theme. +*/ +.win-ui-light.win-menu button, .win-ui-light .win-menu button { + background-color: transparent; + color: rgb(0, 0, 0); +} +.win-ui-light.win-menu button:focus, .win-ui-light .win-menu button:focus, +.win-ui-light.win-menu button:active, .win-ui-light .win-menu button:active { + background-color: rgb(222, 222, 222); +} +.win-ui-light.win-menu button:hover:active, .win-ui-light .win-menu button:hover:active { + color: rgb(255, 255, 255); + background-color: rgb(0, 0, 0); +} +.win-ui-light.win-menu button:-ms-keyboard-active, .win-ui-light .win-menu button:-ms-keyboard-active { + color: rgb(255, 255, 255); + background-color: rgb(0, 0, 0); +} +.win-ui-light.win-menu button:disabled, .win-ui-light .win-menu button:disabled, +.win-ui-light.win-menu button:disabled:active, .win-ui-light .win-menu button:disabled:active { + background-color: transparent; + color: rgba(0, 0, 0, 0.1); +} +.win-menu button { + background-color: transparent; + color: rgb(255, 255, 255); +} +.win-menu button:focus, +.win-menu button:active { + background-color: rgb(222, 222, 222); +} +.win-menu button:hover:active { + color: rgb(0, 0, 0); + background-color: rgb(255, 255, 255); +} +.win-menu button:-ms-keyboard-active { + color: rgb(0, 0, 0); + background-color: rgb(255, 255, 255); +} +.win-menu button:disabled, +.win-menu button:disabled:active { + background-color: transparent; + color: rgba(255, 255, 255, 0.1); +} + +/* +Rating control colors. +*/ +.win-rating .win-star.win-user.win-full, +.win-rating .win-star.win-user.win-full.win-disabled { + color: rgb(91, 46, 197); +} +.win-rating .win-star.win-tentative.win-full { + color: rgb(129, 82, 239); +} +.win-rating .win-star.win-average.win-full, +.win-rating .win-star.win-average.win-full.win-disabled { + color: rgb(255, 255, 255); +} +.win-rating .win-star.win-empty { + color: rgba(255, 255, 255, 0.35); +} +.win-ui-light .win-rating .win-star.win-user.win-full, +.win-ui-light .win-rating .win-star.win-user.win-full.win-disabled { + color: rgb(70, 23, 180); +} +.win-ui-light .win-rating .win-star.win-tentative.win-full { + color: rgb(114, 65, 228); +} +.win-ui-light .win-rating .win-star.win-average.win-full, +.win-ui-light .win-rating .win-star.win-average.win-full.win-disabled { + color: rgb(0, 0, 0); +} +.win-ui-light .win-rating .win-star.win-empty { + color: rgba(0, 0, 0, 0.35); +} + +/* +SemanticZoom button colors. +*/ +.win-semanticzoom-button { + background-color: rgba(216, 216, 216, 0.33); + border-color: transparent; +} +button:hover.win-semanticzoom-button { + background-color: rgba(216, 216, 216, 1.0); +} +button.win-semanticzoom-button:active { + background-color: rgb(255, 255, 255); +} +.win-ui-light button.win-semanticzoom-button:active { + background-color: rgb(0, 0, 0); +} + +/* +Toggleswitch control colors. +*/ + +.win-toggleswitch .win-title { + color: rgb(255, 255, 255); +} +.win-toggleswitch .win-title.win-disabled { + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light .win-toggleswitch .win-title { + color: rgb(0, 0, 0); +} +.win-ui-light .win-toggleswitch .win-title.win-disabled { + color: rgba(0, 0, 0, 0.4); +} + +.win-toggleswitch .win-label { + color: rgb(255, 255, 255); +} +.win-toggleswitch .win-label.win-disabled { + color: rgba(255, 255, 255, 0.4); +} +.win-ui-light .win-toggleswitch .win-label { + color: rgb(0, 0, 0); +} +.win-ui-light .win-toggleswitch .win-label.win-disabled { + color: rgba(0, 0, 0, 0.4); +} + +.win-toggleswitch .win-switch::-ms-track { + background-color: transparent; +} +.win-toggleswitch .win-switch::-ms-track { + border-color: rgba(255, 255, 255, 0.35); +} +.win-toggleswitch .win-switch::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.26); +} +.win-toggleswitch .win-switch:hover::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.29); +} +.win-toggleswitch .win-switch:active::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.35); +} +.win-toggleswitch .win-switch:disabled::-ms-track { + border-color: rgba(255, 255, 255, 0.2); +} +.win-toggleswitch .win-switch:disabled::-ms-fill-lower, +.win-toggleswitch .win-switch:disabled::-ms-fill-upper { + background-color: rgba(255, 255, 255, 0.12); +} +.win-ui-light .win-toggleswitch .win-switch::-ms-track { + border-color: rgba(0, 0, 0, 0.35); +} +.win-ui-light .win-toggleswitch .win-switch::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.26); +} +.win-ui-light .win-toggleswitch .win-switch:hover::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.29); +} +.win-ui-light .win-toggleswitch .win-switch:active::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.35); +} +.win-ui-light .win-toggleswitch .win-switch:disabled::-ms-track { + border-color: rgba(0, 0, 0, 0.2); +} +.win-ui-light .win-toggleswitch .win-switch:disabled::-ms-fill-lower, +.win-ui-light .win-toggleswitch .win-switch:disabled::-ms-fill-upper { + background-color: rgba(0, 0, 0, 0.12); +} + +/* +Tooltip control colors. +*/ +.win-tooltip { + background-color: rgb(255, 255, 255); + border-color: rgb(128, 128, 128); + color: rgba(0, 0, 0, 0.6); +} + +/* +SearchBox control colors. +*/ + +.win-searchbox { + border-color:rgba(255, 255, 255, 0.8); + background-color:rgba(255, 255, 255, 0.8); + color:rgba(0, 0, 0, 0.6); +} + +.win-searchbox-button { + color:rgba(0, 0, 0, 0.6); +} + +.win-searchbox[disabled=false]:hover { + border-color:rgba(255, 255, 255, 0.87); + background-color:rgba(255, 255, 255, 0.87); +} + +.win-searchbox-input-focus { + border-color:rgb(42, 42, 42); + background-color:rgb(255, 255, 255); +} + +.win-searchbox-button[disabled=false]:hover { + background-color: rgb(95, 55, 190); +} + +.win-searchbox-button:active { + background-color:rgb(0, 0, 0); + color:rgb(255,255,255); +} + +.win-searchbox-input-focus:hover { + border-color:rgb(42, 42, 42); + background-color:rgb(255, 255, 255); +} + +.win-searchbox-button-input-focus { + background-color: rgb(70, 23, 180); + color: rgb(255, 255, 255); +} + +.win-searchbox-button-input-focus:hover { + background-color: rgb(95, 55, 190); +} + +.win-searchbox-flyout { + border-color:rgb(42, 42, 42); + background-color:rgb(255, 255, 255); +} + +.win-searchbox-suggestion-result:hover, +.win-searchbox-suggestion-query:hover { + background-color:rgb(229, 229, 229); +} + +.win-searchbox-suggestion-selected { + background-color: rgb(70, 23, 180); +} + +.win-searchbox-suggestion-query, +.win-searchbox-suggestion-result { + color: rgb(0, 0, 0); +} + +.win-searchbox-suggestion-separator { + color:rgb(122, 122, 122); +} + +.win-searchbox-suggestion-separator hr { + border-color:rgb(122, 122, 122); +} + +.win-searchbox-flyout-highlighttext { + color: rgb(70, 23, 180); +} + +.win-searchbox-disabled { + background-color:transparent; + border-color:rgba(255, 255, 255, 0.4); +} + +.win-searchbox-disabled input[disabled] { + background-color:transparent; + color:rgba(255, 255, 255, 0.4); +} + +.win-searchbox-disabled div { + background-color:transparent; + color:rgba(255, 255, 255, 0.4); +} + +.win-searchbox-suggestion-selected:hover { + background-color: rgb(95, 55, 190); +} + +.win-searchbox-suggestion-selected .win-searchbox-flyout-highlighttext { + color: rgb(163,139,218); +} + +.win-ui-light .win-searchbox { + border-color:rgba(0, 0, 0, 0.27); + background-color:rgba(255, 255, 255, 0.8); + color:rgba(0, 0, 0, 0.6); +} + +.win-ui-light .win-searchbox-button { + color:rgba(0, 0, 0, 0.6); +} + +.win-ui-light .win-searchbox[disabled=false]:hover { + background-color:rgba(255, 255, 255, 0.87); +} + +.win-ui-light .win-searchbox-input-focus { + border-color:rgb(42, 42, 42); +} + +.win-ui-light .win-searchbox-button[disabled=false]:hover { + background-color: rgb(95, 55, 190); +} + +.win-ui-light .win-searchbox-button:active { + background-color:rgb(0, 0, 0); + color:rgb(255,255,255); +} + +.win-ui-light .win-searchbox-button-input-focus { + background-color: rgb(70, 23, 180); + color: rgb(255, 255, 255); +} + +.win-ui-light .win-searchbox-button-input-focus:hover { + background-color: rgb(95, 55, 190); +} + +.win-ui-light .win-searchbox-flyout-highlighttext { + color: rgb(70, 23, 180); +} + +.win-ui-light .win-searchbox-flyout { + border-color:rgb(42, 42, 42); + background-color:rgb(255, 255, 255); +} + +.win-ui-light .win-searchbox-suggestion-result:hover, +.win-ui-light .win-searchbox-suggestion-query:hover { + background-color:rgb(229,229,229); +} + +.win-ui-light .win-searchbox-suggestion-selected { + background-color: rgb(70, 23, 180); +} + +.win-ui-light .win-searchbox-suggestion-query, +.win-ui-light .win-searchbox-suggestion-result { + color: rgb(0,0,0); +} + +.win-ui-light .win-searchbox-suggestion-separator { + color:rgb(122,122,122); +} + +.win-ui-light .win-searchbox-suggestion-separator hr { + border-color:rgb(122,122,122); +} + +.win-ui-light .win-searchbox-disabled { + background-color:rgba(202, 202, 202, 0.4); + border-color:rgba(0, 0, 0, 0.15); +} + +.win-ui-light .win-searchbox-disabled input[disabled] { + background-color:rgba(202, 202, 202, 0.4); + color: rgba(0, 0, 0, 0.22); +} + +.win-ui-light .win-searchbox-disabled div { + background-color:rgba(202, 202, 202, 0.4); + color: rgba(0, 0, 0, 0.22); +} + +.win-ui-light .win-searchbox-suggestion-selected:hover { + background-color: rgb(95, 55, 190); +} + +.win-ui-light .win-searchbox-suggestion-selected .win-searchbox-flyout-highlighttext { + color: rgb(163,139,218); +} + +/* +High contrast colors. +*/ +@media (-ms-high-contrast) +{ + /* + Typographic color definitions. + */ + .win-type-interactive { + color: WindowText; + } + .win-type-interactive:hover, .win-type-interactive:hover:active { + color: -ms-hotlight; + } + .win-type-interactive:-ms-keyboard-active { + color: -ms-hotlight; + } + + /* + Text selection high contrast color. + */ + ::selection, select:focus::-ms-value { + background-color: Highlight; + color: HighlightText; + } + + /* + Button high contrast colors. + */ + button.win-navigation-backbutton, button.win-navigation-backbutton:active, + button.win-navigation-backbutton:hover, button.win-navigation-backbutton:active:hover + { + /* Overwrite default background and border styles from BackButton control's ]]> + /// The BackButton control itself + /// The Back Arrow glyph + /// + /// + /// + BackButton: WinJS.Namespace._lazy(function () { + // Statics + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/backbuttonarialabel").value; }, + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get badButtonElement() { return WinJS.Resources._getWinJSString("ui/badButtonElement").value; } + }; + + var BackButton = WinJS.Class.define(function BackButton_ctor(element, options) { + /// + /// + /// Creates a new BackButton control + /// + /// + /// The DOM element that will host the control. If this parameter is null, this constructor creates one for you. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to + /// one of the control's properties or events. + /// + /// + /// A BackButton control. + /// + /// + /// + + // Check to make sure we weren't duplicated + if (element && element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.BackButton.DuplicateConstruction", strings.duplicateConstruction); + } + + this._element = element || document.createElement("button"); + options = options || {}; + + this._initializeButton(); // This will also set the aria-label and tooltip + + this._disposed = false; + + // Remember ourselves + this._element.winControl = this; + + WinJS.UI.setOptions(this, options); + + // Add event handlers for this back button instance + this._buttonClickHandler = this._handleBackButtonClick.bind(this); + this._element.addEventListener('click', this._buttonClickHandler, false); + this._navigatedHandler = this._handleNavigatedEvent.bind(this); + nav.addEventListener('navigated', this._navigatedHandler, false); + + // Increment reference count / manage add global event handlers + singleton.addRef(); + }, { + + /// + element: { + get: function () { + return this._element; + } + }, + + dispose: function () { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; // Mark this control as disposed. + + // Remove 'navigated' eventhandler for this BackButton + nav.removeEventListener('navigated', this._navigatedHandler, false); + + singleton.release(); // Decrement reference count. + + }, + + refresh: function () { + /// + /// + /// Sets the 'disabled' attribute to correct the value based on the current navigation history stack. + /// + /// + /// + if (nav.canGoBack) { + this._element.disabled = false; + } else { + this._element.disabled = true; + } + }, + + _initializeButton: function () { + //Final EN-US HTML should be: + // + //Button will automatically be disabled if WinJS.Navigation.history.canGoBack is false. + + // Verify the HTML is a button + if (this._element.tagName !== "BUTTON") { + throw new WinJS.ErrorFromName("WinJS.UI.BackButton.BadButtonElement", strings.badButtonElement); + } + + // Attach our css classes + WinJS.Utilities.addClass(this._element, navigationBackButtonClass); + + // Attach disposable class. + WinJS.Utilities.addClass(this._element, "win-disposable"); + + // Create inner glyph element + this._element.innerHTML = ''; + + // Set the 'disabled' property to the correct value based on the current navigation history stack. + this.refresh(); + + // Set Aria-label and native tooltip to the same localized string equivalent of "Back" + this._element.setAttribute("aria-label", strings.ariaLabel); + this._element.setAttribute("title", strings.ariaLabel); + + // Explicitly set type attribute to avoid the default '; + this._headerTabStopElement = this._headerElement.firstElementChild; + this._headerContentElement = this._headerTabStopElement.firstElementChild; + this._headerChevronElement = this._headerTabStopElement.lastElementChild; + element.appendChild(this._headerElement); + + this._winKeyboard = new WinJS.UI._WinKeyboard(this._headerElement); + + this._contentElement = document.createElement("DIV"); + this._contentElement.className = WinJS.UI.HubSection._ClassName.hubSectionContent; + this._contentElement.style.visibility = "hidden"; + element.appendChild(this._contentElement); + + // Reparent any existing elements inside the new hub section content element. + var elementToMove = this.element.firstChild; + while (elementToMove !== this._headerElement) { + var nextElement = elementToMove.nextSibling; + this._contentElement.appendChild(elementToMove); + elementToMove = nextElement; + } + + this._processors = [WinJS.UI.processAll]; + + WinJS.UI.setOptions(this, options); + }, { + /// + element: { + get: function () { + return this._element; + } + }, + /// + /// Gets or sets a value that specifies whether the header is static. Set this value to true to disable clicks and other interactions. + /// + /// + isHeaderStatic: { + get: function () { + return this._isHeaderStatic; + }, + set: function (value) { + this._isHeaderStatic = value; + if (!this._isHeaderStatic) { + this._headerTabStopElement.setAttribute("role", "link"); + WinJS.Utilities.addClass(this._headerTabStopElement, WinJS.UI.HubSection._ClassName.hubSectionInteractive); + } else { + this._headerTabStopElement.setAttribute("role", "heading"); + WinJS.Utilities.removeClass(this._headerTabStopElement, WinJS.UI.HubSection._ClassName.hubSectionInteractive); + } + } + }, + /// + /// Gets the DOM element that hosts the HubSection's content. + /// + /// + contentElement: { + get: function () { + return this._contentElement; + } + }, + /// + /// Get or set the HubSection's header. After you set this property, the Hub renders the header again. + /// + /// + header: { + get: function () { + return this._header; + }, + set: function (value) { + // Render again even if it is equal to itself. + this._header = value; + this._renderHeader(); + } + }, + _setHeaderTemplate: function HubSection_setHeaderTemplate(template) { + this._template = WinJS.Utilities._syncRenderer(template); + this._renderHeader(); + }, + _renderHeader: function HubSection_renderHeader() { + if (this._template) { + WinJS.Utilities._disposeElement(this._headerContentElement); + WinJS.Utilities.empty(this._headerContentElement); + this._template(this, this._headerContentElement); + } + }, + _process: function HubSection_process() { + var that = this; + + this._processed = (this._processors || []).reduce(function (promise, processor) { + return promise.then(function () { + return processor(that.contentElement); + }); + }, this._processed || WinJS.Promise.as()); + this._processors = null; + + return this._processed; + }, + dispose: function HubSection_dispose() { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; + this._processors = null; + + WinJS.Utilities._disposeElement(this._headerContentElement); + WinJS.Utilities.disposeSubTree(this.contentElement); + } + }, { + // Names of classes used by the HubSection. + _ClassName: { + hubSection: "win-hub-section", + hubSectionHeader: "win-hub-section-header", + hubSectionHeaderTabStop: "win-hub-section-header-tabstop", + hubSectionInteractive: "win-hub-section-header-interactive", + hubSectionHeaderContent: "win-hub-section-header-content", + hubSectionHeaderChevron: "win-hub-section-header-chevron", + hubSectionContent: "win-hub-section-content" + }, + _Constants: { + ellipsisTypeClassName: "win-type-ellipsis", + xLargeTypeClassName: "win-type-x-large" + }, + isDeclarativeControlContainer: WinJS.Utilities.markSupportedForProcessing(function (section, callback) { + if (callback === WinJS.UI.processAll) { + return; + } + + section._processors = section._processors || []; + section._processors.push(callback); + + // Once processed the first time synchronously queue up new processors as they come in + if (section._processed) { + section._process(); + } + }) + }); + }) + }); + +})(this, WinJS); + +/// animatable,appbar,appbars,divs,Flyout,Flyouts,iframe,Statics,unfocus,unselectable +(function overlayInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + _Overlay: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + var utilities = WinJS.Utilities; + var createEvent = utilities._createEventProperty; + + // Class Names + var overlayClass = "win-overlay"; + var hideFocusClass = "win-hidefocus"; // Prevents the element from showing a focus rect + + // Event Names + var BEFORESHOW = "beforeshow"; + var AFTERSHOW = "aftershow"; + var BEFOREHIDE = "beforehide"; + var AFTERHIDE = "afterhide"; + + // Helper to get DOM elements from input single object or array or IDs/toolkit/dom elements + function _resolveElements(elements) { + // No input is just an empty array + if (!elements) { + return []; + } + + // Make sure it's in array form. + if (typeof elements === "string" || !elements || !elements.length) { + elements = [elements]; + } + + // Make sure we have a DOM element for each one, (could be string id name or toolkit object) + var i, + realElements = []; + for (i = 0; i < elements.length; i++) { + if (elements[i]) { + if (typeof elements[i] === "string") { + var element = document.getElementById(elements[i]); + if (element) { + realElements.push(element); + } + } else if (elements[i].element) { + realElements.push(elements[i].element); + } else { + realElements.push(elements[i]); + } + } + } + + return realElements; + } + + // Helpers for keyboard showing related events + function _allOverlaysCallback(event, command) { + var elements = document.querySelectorAll("." + overlayClass); + if (elements) { + var len = elements.length; + for (var i = 0; i < len; i++) { + var element = elements[i]; + var control = element.winControl; + if (!control._disposed) { + if (control) { + control[command](event); + } + } + } + } + } + + function _edgyMayHideFlyouts() { + if (!_Overlay._rightMouseMightEdgy) { + _Overlay._hideAllFlyouts(); + } + } + + var _Overlay = WinJS.Class.define(function _Overlay_ctor(element, options) { + /// + /// + /// Constructs the Overlay control and associates it with the underlying DOM element. + /// + /// + /// The DOM element to be associated with the Overlay control. + /// + /// + /// The set of options to be applied initially to the Overlay control. + /// + /// A fully constructed Overlay control. + /// + this._baseOverlayConstructor(element, options); + }, { + // Functions/properties + _baseOverlayConstructor: function _Overlay_baseOverlayConstructor(element, options) { + this._disposed = false; + + // Make sure there's an input element + if (!element) { + element = document.createElement("div"); + } + + // Check to make sure we weren't duplicated + var overlay = element.winControl; + if (overlay) { + throw new WinJS.ErrorFromName("WinJS.UI._Overlay.DuplicateConstruction", strings.duplicateConstruction); + } + + if (!this._element) { + this._element = element; + } + this._sticky = false; + this._doNext = ""; + + this._element.style.visibility = "hidden"; + this._element.style.opacity = 0; + + // Remember ourselves + element.winControl = this; + + // Attach our css class + WinJS.Utilities.addClass(this._element, overlayClass); + WinJS.Utilities.addClass(this._element, "win-disposable"); + + // We don't want to be selectable, set UNSELECTABLE + var unselectable = this._element.getAttribute("unselectable"); + if (unselectable === null || unselectable === undefined) { + this._element.setAttribute("unselectable", "on"); + } + + // Base animation is popIn/popOut + this._currentAnimateIn = this._baseAnimateIn; + this._currentAnimateOut = this._baseAnimateOut; + this._animationPromise = WinJS.Promise.as(); + + // Command Animations to Queue + this._queuedToShow = []; + this._queuedToHide = []; + this._queuedCommandAnimation = false; + + if (options) { + WinJS.UI.setOptions(this, options); + } + }, + + /// + element: { + get: function () { + return this._element; + } + }, + + /// Disable an Overlay, setting or getting the HTML disabled attribute. When disabled the Overlay will no longer display with show(), and will hide if currently visible. + disabled: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return !!this._element.disabled; + }, + set: function (value) { + // Force this check into a boolean because our current state could be a bit confused since we tie to the DOM element + value = !!value; + var oldValue = !!this._element.disabled; + if (oldValue !== value) { + this._element.disabled = value; + if (!this.hidden && this._element.disabled) { + this._hideOrDismiss(); + } + } + } + }, + + /// + /// Occurs immediately before the control is shown. + /// + onbeforeshow: createEvent(BEFORESHOW), + + /// + /// Occurs immediately after the control is shown. + /// + onaftershow: createEvent(AFTERSHOW), + + /// + /// Occurs immediately before the control is hidden. + /// + onbeforehide: createEvent(BEFOREHIDE), + + /// + /// Occurs immediately after the control is hidden. + /// + onafterhide: createEvent(AFTERHIDE), + + dispose: function () { + /// + /// + /// Disposes this Overlay. + /// + /// + if (this._disposed) { + return; + } + + this._disposed = true; + this._dispose(); + }, + + _dispose: function _Overlay_dispose() { + // To be overridden by subclasses + }, + + show: function () { + /// + /// + /// Shows the Overlay, if hidden, regardless of other state + /// + /// + // call private show to distinguish it from public version + this._show(); + }, + + _show: function _Overlay_show() { + // We call our base _baseShow because AppBar may need to override show + this._baseShow(); + }, + + hide: function () { + /// + /// + /// Hides the Overlay, if visible, regardless of other state + /// + /// + // call private hide to distinguish it from public version + this._hide(); + }, + + _hide: function _Overlay_hide() { + // We call our base _baseHide because AppBar may need to override hide + this._baseHide(); + }, + + // Is the overlay "hidden"? + /// + hidden: { + get: function () { + return (this._element.style.visibility === "hidden" || + this._element.winAnimating === "hiding" || + this._doNext === "hide" || + this._fakeHide); + } + }, + + addEventListener: function (type, listener, useCapture) { + /// + /// + /// Add an event listener to the DOM element for this Overlay + /// + /// Required. Event type to add, "beforehide", "afterhide", "beforeshow", or "aftershow" + /// Required. The event handler function to associate with this event. + /// Optional. True, register for the event capturing phase. False for the event bubbling phase. + /// + return this._element.addEventListener(type, listener, useCapture); + }, + + removeEventListener: function (type, listener, useCapture) { + /// + /// + /// Remove an event listener to the DOM element for this Overlay + /// + /// Required. Event type to remove, "beforehide", "afterhide", "beforeshow", or "aftershow" + /// Required. The event handler function to associate with this event. + /// Optional. True, register for the event capturing phase. False for the event bubbling phase. + /// + return this._element.removeEventListener(type, listener, useCapture); + }, + + _baseShow: function _Overlay_baseShow() { + // If we are already animating, just remember this for later + if (this._animating || this._keyboardShowing || this._keyboardHiding) { + this._doNext = "show"; + return false; + } + + // Each overlay tracks the window width for detecting resizes in the resize handler. + this._currentDocumentWidth = this._currentDocumentWidth || document.documentElement.offsetWidth; + + // "hiding" would need to cancel. + if (this._element.style.visibility !== "visible" || this._fakeHide) { + // Let us know we're showing. + this._element.winAnimating = "showing"; + + // Hiding, but not none + this._element.style.display = ""; + if (!this._fakeHide) { + this._element.style.visibility = "hidden"; + } + + // In case their event is going to manipulate commands, see if there are + // any queued command animations we can handle while we're still hidden. + if (this._queuedCommandAnimation) { + this._showAndHideFast(this._queuedToShow, this._queuedToHide); + this._queuedToShow = []; + this._queuedToHide = []; + } + + // Send our "beforeShow" event + this._sendEvent(_Overlay.beforeShow); + + // Need to measure + this._findPosition(); + + // Make sure it's visible, and fully opaque. + // Do the popup thing, sending event afterward. + var that = this; + this._animationPromise = this._currentAnimateIn(). + then(function () { + that._baseEndShow(); + }, function (err) { + that._baseEndShow(); + }); + this._fakeHide = false; + return true; + } + return false; + }, + + // Flyout in particular will need to measure our positioning. + _findPosition: function _Overlay_findPosition() { + }, + + _baseEndShow: function _Overlay_baseEndShow() { + if (this._disposed) { + return; + } + + // Make sure it's visible after showing + this._element.setAttribute("aria-hidden", "false"); + + this._element.winAnimating = ""; + + // Do our derived classes show stuff + this._endShow(); + + // We're shown now + if (this._doNext === "show") { + this._doNext = ""; + } + + // After showing, send the after showing event + this._sendEvent(_Overlay.afterShow); + this._writeProfilerMark("show,StopTM"); // Overlay writes the stop profiler mark for all of its derived classes. + + // If we had something queued, do that + WinJS.Utilities.Scheduler.schedule(this._checkDoNext, WinJS.Utilities.Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext"); + + }, + + _endShow: function _Overlay_endShow() { + // Nothing by default + }, + + _baseHide: function _Overlay_baseHide() { + // If we are already animating, just remember this for later + if (this._animating || this._keyboardShowing) { + this._doNext = "hide"; + return false; + } + + // In the unlikely event we're between the hiding keyboard and the resize events, just snap it away: + if (this._keyboardHiding) { + // use the "uninitialized" flag + this._element.style.visibility = ""; + } + + // "showing" would need to queue up. + if (this._element.style.visibility !== "hidden") { + // Let us know we're hiding, accessibility as well. + this._element.winAnimating = "hiding"; + this._element.setAttribute("aria-hidden", "true"); + + // Send our "beforeHide" event + this._sendEvent(_Overlay.beforeHide); + + // If our visibility is empty, then this is the first time, just hide it + if (this._element.style.visibility === "") { + // Initial hiding, just hide it + this._element.style.opacity = 0; + this._baseEndHide(); + } else { + // Make sure it's hidden, and fully transparent. + var that = this; + this._animationPromise = this._currentAnimateOut(). + then(function () { + that._baseEndHide(); + }, function (err) { + that._baseEndHide(); + }); + } + return true; + } + this._fakeHide = false; + + return false; + }, + + _baseEndHide: function _Overlay_baseEndHide() { + if (this._disposed) { + return; + } + + // Make sure animation is finished. + this._element.style.visibility = "hidden"; + this._element.style.display = "none"; + this._element.winAnimating = ""; + + // In case their event is going to manipulate commands, see if there + // are any queued command animations we can handle now we're hidden. + if (this._queuedCommandAnimation) { + this._showAndHideFast(this._queuedToShow, this._queuedToHide); + this._queuedToShow = []; + this._queuedToHide = []; + } + + // We're hidden now + if (this._doNext === "hide") { + this._doNext = ""; + } + + // After hiding, send our "afterHide" event + this._sendEvent(_Overlay.afterHide); + this._writeProfilerMark("hide,StopTM"); // Overlay writes the stop profiler mark for all of its derived classes. + + + // If we had something queued, do that. This has to be after + // the afterHide event in case it triggers a show() and they + // have something to do in beforeShow that requires afterHide first. + WinJS.Utilities.Scheduler.schedule(this._checkDoNext, WinJS.Utilities.Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext"); + }, + + _checkDoNext: function _Overlay_checkDoNext() { + // Do nothing if we're still animating + if (this._animating || this._keyboardShowing || this._keyboardHiding || this._disposed) { + return; + } + + if (this._doNext === "hide") { + // Do hide first because animating commands would be easier + this._hide(); + this._doNext = ""; + } else if (this._queuedCommandAnimation) { + // Do queued commands before showing if possible + this._showAndHideQueue(); + } else if (this._doNext === "show") { + // Show last so that we don't unnecessarily animate commands + this._show(); + this._doNext = ""; + } + }, + + // Default animations + _baseAnimateIn: function _Overlay_baseAnimateIn() { + this._element.style.opacity = 0; + this._element.style.visibility = "visible"; + // touch opacity so that IE fades from the 0 we just set to 1 + window.getComputedStyle(this._element, null).opacity; + return WinJS.UI.Animation.fadeIn(this._element); + }, + + _baseAnimateOut: function _Overlay_baseAnimateOut() { + this._element.style.opacity = 1; + // touch opacity so that IE fades from the 1 we just set to 0 + window.getComputedStyle(this._element, null).opacity; + return WinJS.UI.Animation.fadeOut(this._element); + }, + + _animating: { + get: function _Overlay_animating_get() { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return !!this._element.winAnimating; + } + }, + + // Send one of our events + _sendEvent: function _Overlay_sendEvent(eventName, detail) { + if (this._disposed) { + return; + } + var event = document.createEvent("CustomEvent"); + event.initEvent(eventName, true, true, (detail || {})); + this._element.dispatchEvent(event); + }, + + // Show commands + _showCommands: function _Overlay_showCommands(commands, immediate) { + var showHide = this._resolveCommands(commands); + this._showAndHideCommands(showHide.commands, [], immediate); + }, + + // Hide commands + _hideCommands: function _Overlay_hideCommands(commands, immediate) { + var showHide = this._resolveCommands(commands); + this._showAndHideCommands([], showHide.commands, immediate); + }, + + // Hide commands + _showOnlyCommands: function _Overlay_showOnlyCommands(commands, immediate) { + var showHide = this._resolveCommands(commands); + this._showAndHideCommands(showHide.commands, showHide.others, immediate); + }, + + _showAndHideCommands: function _Overlay_showAndHideCommands(showCommands, hideCommands, immediate) { + // Immediate is "easy" + if (immediate || (this.hidden && !this._animating)) { + // Immediate mode (not animated) + this._showAndHideFast(showCommands, hideCommands); + // Need to remove them from queues, but others could be queued + this._removeFromQueue(showCommands, this._queuedToShow); + this._removeFromQueue(hideCommands, this._queuedToHide); + } else { + + // Queue Commands + this._updateAnimateQueue(showCommands, this._queuedToShow, this._queuedToHide); + this._updateAnimateQueue(hideCommands, this._queuedToHide, this._queuedToShow); + } + }, + + _removeFromQueue: function _Overlay_removeFromQueue(commands, queue) { + // remove commands from queue. + var count; + for (count = 0; count < commands.length; count++) { + // Remove if it was in queue + var countQ; + for (countQ = 0; countQ < queue.length; countQ++) { + if (queue[countQ] === commands[count]) { + queue.splice(countQ, 1); + break; + } + } + } + }, + + _updateAnimateQueue: function _Overlay_updateAnimateQueue(addCommands, toQueue, fromQueue) { + if (this._disposed) { + return; + } + + // Add addCommands to toQueue and remove addCommands from fromQueue. + var count; + for (count = 0; count < addCommands.length; count++) { + // See if it's already in toQueue + var countQ; + for (countQ = 0; countQ < toQueue.length; countQ++) { + if (toQueue[countQ] === addCommands[count]) { + break; + } + } + if (countQ === toQueue.length) { + // Not found, add it + toQueue[countQ] = addCommands[count]; + } + // Remove if it was in fromQueue + for (countQ = 0; countQ < fromQueue.length; countQ++) { + if (fromQueue[countQ] === addCommands[count]) { + fromQueue.splice(countQ, 1); + break; + } + } + } + // If we haven't queued the actual animation + if (!this._queuedCommandAnimation) { + // If not already animating, we'll need to call _checkDoNext + if (!this._animating) { + WinJS.Utilities.Scheduler.schedule(this._checkDoNext, WinJS.Utilities.Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext"); + } + this._queuedCommandAnimation = true; + } + }, + + // show/hide commands without doing any animation. + _showAndHideFast: function _Overlay_showAndHideFast(showCommands, hideCommands) { + var count; + var command; + for (count = 0; count < showCommands.length; count++) { + command = showCommands[count]; + if (command && command.style) { + command.style.visibility = ""; + command.style.display = ""; + } + } + for (count = 0; count < hideCommands.length; count++) { + command = hideCommands[count]; + if (command && command.style) { + command.style.visibility = "hidden"; + command.style.display = "none"; + } + } + + this._contentChanged(); + + }, + + // show and hide the queued commands, perhaps animating if overlay isn't hidden. + _showAndHideQueue: function _Overlay_showAndHideQueue() { + // Only called if not currently animating. + // We'll be done with the queued stuff when we return. + this._queuedCommandAnimation = false; + + // Shortcut if hidden + if (this.hidden) { + this._showAndHideFast(this._queuedToShow, this._queuedToHide); + // Might be something else to do + WinJS.Utilities.Scheduler.schedule(this._checkDoNext, WinJS.Utilities.Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext"); + } else { + // Animation has 3 parts: "hiding", "showing", and "moving" + // PVL has "addToList" and "deleteFromList", both of which allow moving parts. + // So we'll set up "add" for showing, and use "delete" for "hiding" + moving, + // then trigger both at the same time. + var showCommands = this._queuedToShow; + var hideCommands = this._queuedToHide; + var siblings = this._findSiblings(showCommands.concat(hideCommands)); + + // Filter out the commands queued for animation that don't need to be animated. + var count; + for (count = 0; count < showCommands.length; count++) { + // If this one's not real or not attached, skip it + if (!showCommands[count] || + !showCommands[count].style || + !document.body.contains(showCommands[count])) { + // Not real, skip it + showCommands.splice(count, 1); + count--; + } else if (showCommands[count].style.visibility !== "hidden" && showCommands[count].style.opacity !== "0") { + // Don't need to animate showing this one, already visible, so now it's a sibling + siblings.push(showCommands[count]); + showCommands.splice(count, 1); + count--; + } + } + for (count = 0; count < hideCommands.length; count++) { + // If this one's not real or not attached, skip it + if (!hideCommands[count] || + !hideCommands[count].style || + !document.body.contains(hideCommands[count]) || + hideCommands[count].style.visibility === "hidden" || + hideCommands[count].style.opacity === "0") { + // Don't need to animate hiding this one, not real, or it's hidden, + // so don't even need it as a sibling. + hideCommands.splice(count, 1); + count--; + } + } + + // Start command animations. + var commandsAnimationPromise = this._baseBeginAnimateCommands(showCommands, hideCommands, siblings); + + // Hook end animations + var that = this; + if (commandsAnimationPromise) { + // Needed to animate + commandsAnimationPromise.done( + function () { that._baseEndAnimateCommands(hideCommands); }, + function () { that._baseEndAnimateCommands(hideCommands); } + ); + } else { + // Already positioned correctly + WinJS.Utilities.Scheduler.schedule(function () { that._baseEndAnimateCommands([]); }, + WinJS.Utilities.Scheduler.Priority.normal, null, + "WinJS.UI._Overlay._endAnimateCommandsWithoutAnimation"); + } + } + + // Done, clear queues + this._queuedToShow = []; + this._queuedToHide = []; + }, + + _baseBeginAnimateCommands: function _Overlay_baseBeginAnimateCommands(showCommands, hideCommands, siblings) { + // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay. + // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show. + // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE shceduled to hide. + // 3) siblings[]: i. All VISIBLE win-command elements that ARE NOT scheduled to hide. + // ii. All HIDDEN win-command elements that ARE NOT scheduled to hide OR show. + this._beginAnimateCommands(showCommands, hideCommands, this._getVisibleCommands(siblings)); + + var showAnimated = null, + hideAnimated = null; + + // Hide commands first, with siblings if necessary, + // so that the showing commands don't disrupt the hiding commands position. + if (hideCommands.length > 0) { + hideAnimated = WinJS.UI.Animation.createDeleteFromListAnimation(hideCommands, showCommands.length === 0 ? siblings : undefined); + } + if (showCommands.length > 0) { + showAnimated = WinJS.UI.Animation.createAddToListAnimation(showCommands, siblings); + } + + // Update hiding commands + for (var count = 0, len = hideCommands.length; count < len; count++) { + // Need to fix our position + var rectangle = hideCommands[count].getBoundingClientRect(), + style = window.getComputedStyle(hideCommands[count]); + + // Use the bounding box, adjusting for margins + hideCommands[count].style.top = (rectangle.top - parseFloat(style.marginTop)) + "px"; + hideCommands[count].style.left = (rectangle.left - parseFloat(style.marginLeft)) + "px"; + hideCommands[count].style.opacity = 0; + hideCommands[count].style.position = "fixed"; + } + + // Mark as animating + this._element.winAnimating = "rearranging"; + + // Start hiding animations + // Hide needs extra cleanup when done + var promise = null; + if (hideAnimated) { + promise = hideAnimated.execute(); + } + + // Update showing commands, + // After hiding commands so that the hiding ones fade in the right place. + for (count = 0; count < showCommands.length; count++) { + showCommands[count].style.visibility = ""; + showCommands[count].style.display = ""; + showCommands[count].style.opacity = 1; + } + + // Start showing animations + if (showAnimated) { + var newPromise = showAnimated.execute(); + if (promise) { + promise = WinJS.Promise.join([promise, newPromise]); + } else { + promise = newPromise; + } + } + + return promise; + }, + + _beginAnimateCommands: function _Overlay_beginAnimateCommands(showCommands, hideCommands, siblings) { + // Nothing by default + }, + + _getVisibleCommands: function _Overlay_getVisibleCommands(commandSubSet) { + var command, + commands = commandSubSet, + visibleCommands = []; + + if (!commands) { + // Crawl the inner HTML for the commands. + commands = this.element.querySelectorAll(".win-command"); + } + + for (var i = 0, len = commands.length; i < len; i++) { + command = commands[i].winControl || commands[i]; + if (!command.hidden) { + visibleCommands.push(command); + } + } + + return visibleCommands; + }, + + // Once animation is complete, ensure that the commands are display:none + // and check if there's another animation to start. + _baseEndAnimateCommands: function _Overlay_baseEndAnimateCommands(hideCommands) { + if (this._disposed) { + return; + } + + // Update us + var count; + for (count = 0; count < hideCommands.length; count++) { + // Force us back into our appbar so that we can show again correctly + hideCommands[count].style.position = ""; + hideCommands[count].getBoundingClientRect(); + // Now make us really hidden + hideCommands[count].style.visibility = "hidden"; + hideCommands[count].style.display = "none"; + hideCommands[count].style.opacity = 1; + } + // Done animating + this._element.winAnimating = ""; + + this._endAnimateCommands(); + + // Might be something else to do + this._checkDoNext(); + }, + + _endAnimateCommands: function _Overlay_endAnimateCommands() { + // Nothing by default + }, + + // Resolves our commands + _resolveCommands: function _Overlay_resolveCommands(commands) { + // First make sure they're all DOM elements. + commands = _resolveElements(commands); + + // Now make sure they're all in this container + var result = {}; + result.commands = []; + result.others = []; + var allCommands = this.element.querySelectorAll(".win-command"); + var countAll, countIn; + for (countAll = 0; countAll < allCommands.length; countAll++) { + var found = false; + for (countIn = 0; countIn < commands.length; countIn++) { + if (commands[countIn] === allCommands[countAll]) { + result.commands.push(allCommands[countAll]); + commands.splice(countIn, 1); + found = true; + break; + } + } + if (!found) { + result.others.push(allCommands[countAll]); + } + } + return result; + }, + + // Find siblings, all DOM elements now. + // Returns all .win-commands in this Overlay that are NOT in the passed in 'commands' array. + _findSiblings: function _Overlay_findSiblings(commands) { + // Now make sure they're all in this container + var siblings = []; + var allCommands = this.element.querySelectorAll(".win-command"); + var countAll, countIn; + for (countAll = 0; countAll < allCommands.length; countAll++) { + var found = false; + for (countIn = 0; countIn < commands.length; countIn++) { + if (commands[countIn] === allCommands[countAll]) { + commands.splice(countIn, 1); + found = true; + break; + } + } + if (!found) { + siblings.push(allCommands[countAll]); + } + } + return siblings; + }, + + _baseResize: function _Overlay_baseResize(event) { + // Avoid the cost of a resize if the Overlay is hidden. + if (this._currentDocumentWidth !== undefined) { + if (this._element.style.visibility === "hidden") { + this._currentDocumentWidth = undefined; + } else { + // Overlays can light dismiss on horizontal resize. + var newWidth = document.documentElement.offsetWidth; + if (this._currentDocumentWidth !== newWidth) { + this._currentDocumentWidth = newWidth + if (!this._sticky) { + this._hideOrDismiss(); + } + } + } + } + + // Call specific resize + this._resize(event); + }, + + _hideOrDismiss: function _Overlay_hideOrDismiss() { + var element = this._element; + if (element && WinJS.Utilities.hasClass(element, "win-settingsflyout")) { + this._dismiss(); + } else { + this.hide(); + } + }, + + _resize: function _Overlay_resize(event) { + // Nothing by default + }, + + _contentChanged: function _Overlay_contentChanged(needToReMeasure) { + // Nothing by default + }, + + _checkScrollPosition: function _Overlay_checkScrollPosition(event) { + // Nothing by default + }, + + _showingKeyboard: function _Overlay_showingKeyboard(event) { + // Nothing by default + }, + + _hidingKeyboard: function _Overlay_hidingKeyboard(event) { + // Nothing by default + }, + + // Verify that this HTML AppBar only has AppBar/MenuCommands. + _verifyCommandsOnly: function _Overlay_verifyCommandsOnly(element, type) { + var children = element.children; + var commands = new Array(children.length); + for (var i = 0; i < children.length; i++) { + // If constructed they have win-command class, otherwise they have data-win-control + if (!WinJS.Utilities.hasClass(children[i], "win-command") && + children[i].getAttribute("data-win-control") !== type) { + // Wasn't tagged with class or AppBar/MenuCommand, not an AppBar/MenuCommand + throw new WinJS.ErrorFromName("WinJS.UI._Overlay.MustContainCommands", strings.mustContainCommands); + } else { + // Instantiate the commands. + WinJS.UI.processAll(children[i]); + commands[i] = children[i].winControl; + } + } + return commands; + }, + + // Sets focus on what we think is the last tab stop. If nothing is focusable will + // try to set focus on itself. + _focusOnLastFocusableElementOrThis: function _Overlay_focusOnLastFocusableElementOrThis() { + if (!this._focusOnLastFocusableElement()) { + // Nothing is focusable. Set focus to this. + _Overlay._trySetActive(this._element); + } + }, + + // Sets focus to what we think is the last tab stop. This element must have + // a firstDiv with tabIndex equal to the lowest tabIndex in the element + // and a finalDiv with tabIndex equal to the highest tabIndex in the element. + // Also the firstDiv must be its first child and finalDiv be its last child. + // Returns true if successful, false otherwise. + _focusOnLastFocusableElement: function _Overlay_focusOnLastFocusableElement() { + if (this._element.firstElementChild) { + var oldFirstTabIndex = this._element.firstElementChild.tabIndex; + var oldLastTabIndex = this._element.lastElementChild.tabIndex; + this._element.firstElementChild.tabIndex = -1; + this._element.lastElementChild.tabIndex = -1; + + var tabResult = WinJS.Utilities._focusLastFocusableElement(this._element); + + if (tabResult) { + _Overlay._trySelect(document.activeElement); + } + + this._element.firstElementChild.tabIndex = oldFirstTabIndex; + this._element.lastElementChild.tabIndex = oldLastTabIndex; + + return tabResult; + } else { + return false; + } + }, + + + // Sets focus on what we think is the first tab stop. If nothing is focusable will + // try to set focus on itself. + _focusOnFirstFocusableElementOrThis: function _Overlay_focusOnFirstFocusableElementOrThis() { + if (!this._focusOnFirstFocusableElement()) { + // Nothing is focusable. Set focus to this. + _Overlay._trySetActive(this._element); + } + }, + + // Sets focus to what we think is the first tab stop. This element must have + // a firstDiv with tabIndex equal to the lowest tabIndex in the element + // and a finalDiv with tabIndex equal to the highest tabIndex in the element. + // Also the firstDiv must be its first child and finalDiv be its last child. + // Returns true if successful, false otherwise. + _focusOnFirstFocusableElement: function _Overlay__focusOnFirstFocusableElement() { + if (this._element.firstElementChild) { + var oldFirstTabIndex = this._element.firstElementChild.tabIndex; + var oldLastTabIndex = this._element.lastElementChild.tabIndex; + this._element.firstElementChild.tabIndex = -1; + this._element.lastElementChild.tabIndex = -1; + + var tabResult = WinJS.Utilities._focusFirstFocusableElement(this._element); + + if (tabResult) { + _Overlay._trySelect(document.activeElement); + } + + this._element.firstElementChild.tabIndex = oldFirstTabIndex; + this._element.lastElementChild.tabIndex = oldLastTabIndex; + + return tabResult; + } else { + return false; + } + }, + + _addOverlayEventHandlers: function _Overlay_addOverlayEventHandlers(isFlyoutOrSettingsFlyout) { + // Set up global event handlers for all overlays + if (!_Overlay._flyoutEdgeLightDismissEvent) { + // Dismiss on blur & resize + window.addEventListener("blur", _Overlay._checkBlur, false); + + var that = this; + + // Be careful so it behaves in designer as well. + if (WinJS.Utilities.hasWinRT) { + // Catch edgy events too + var commandUI = Windows.UI.Input.EdgeGesture.getForCurrentView(); + commandUI.addEventListener("starting", _Overlay._hideAllFlyouts); + commandUI.addEventListener("completed", _edgyMayHideFlyouts); + + // React to Soft Keyboard events + var inputPane = Windows.UI.ViewManagement.InputPane.getForCurrentView(); + inputPane.addEventListener("showing", function (event) { + that._writeProfilerMark("_showingKeyboard,StartTM"); + _allOverlaysCallback(event, "_showingKeyboard"); + that._writeProfilerMark("_showingKeyboard,StopTM"); + }); + inputPane.addEventListener("hiding", function (event) { + that._writeProfilerMark("_hidingKeyboard,StartTM"); + _allOverlaysCallback(event, "_hidingKeyboard"); + that._writeProfilerMark("_hidingKeyboard,StopTM"); + }); + // Document scroll event + document.addEventListener("scroll", function (event) { + that._writeProfilerMark("_checkScrollPosition,StartTM"); + _allOverlaysCallback(event, "_checkScrollPosition"); + that._writeProfilerMark("_checkScrollPosition,StopTM"); + }); + } + // Window resize event + window.addEventListener("resize", function (event) { + that._writeProfilerMark("_baseResize,StartTM"); + _allOverlaysCallback(event, "_baseResize"); + that._writeProfilerMark("_baseResize,StopTM"); + }); + + _Overlay._flyoutEdgeLightDismissEvent = true; + } + + // Individual handlers for Flyouts only + if (isFlyoutOrSettingsFlyout) { + this._handleEventsForFlyoutOrSettingsFlyout(); + } + }, + + _handleEventsForFlyoutOrSettingsFlyout: function _Overlay_handleEventsForFlyoutOrSettingsFlyout() { + var that = this; + // Need to hide ourselves if we lose focus + this._element.addEventListener("focusout", function (e) { _Overlay._hideIfLostFocus(that, e); }, false); + + // Attempt to flag right clicks that may turn into edgy + this._element.addEventListener("pointerdown", _Overlay._checkRightClickDown, true); + this._element.addEventListener("pointerup", _Overlay._checkRightClickUp, true); + }, + + _writeProfilerMark: function _Overlay_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI._Overlay:" + this._id + ":" + text); + } + }); + + // Statics + _Overlay._clickEatingAppBarDiv = false; + _Overlay._clickEatingFlyoutDiv = false; + _Overlay._flyoutEdgeLightDismissEvent = false; + + _Overlay._hideFlyouts = function (testElement, notSticky) { + var elements = testElement.querySelectorAll(".win-flyout"); + var len = elements.length; + for (var i = 0; i < len; i++) { + var element = elements[i]; + if (element.style.visibility !== "hidden") { + var flyout = element.winControl; + if (flyout && (!notSticky || !flyout._sticky)) { + flyout._hideOrDismiss(); + } + } + } + }; + + _Overlay._hideSettingsFlyouts = function (testElement, notSticky) { + var elements = testElement.querySelectorAll(".win-settingsflyout"); + var len = elements.length; + for (var i = 0; i < len; i++) { + var element = elements[i]; + if (element.style.visibility !== "hidden") { + var settingsFlyout = element.winControl; + if (settingsFlyout && (!notSticky || !settingsFlyout._sticky)) { + settingsFlyout._hideOrDismiss(); + } + } + } + }; + + _Overlay._hideAllFlyouts = function () { + _Overlay._hideFlyouts(document, true); + _Overlay._hideSettingsFlyouts(document, true) + }; + + _Overlay._createClickEatingDivTemplate = function (divClass, hideClickEatingDivFunction) { + var clickEatingDiv = document.createElement("section"); + WinJS.Utilities.addClass(clickEatingDiv, divClass); + clickEatingDiv.addEventListener("pointerup", function (event) { _Overlay._checkSameClickEatingPointerUp(event, true); }, true); + clickEatingDiv.addEventListener("pointerdown", function (event) { _Overlay._checkClickEatingPointerDown(event, true); }, true); + clickEatingDiv.addEventListener("click", hideClickEatingDivFunction, true); + // Tell Aria that it's clickable + clickEatingDiv.setAttribute("role", "menuitem"); + clickEatingDiv.setAttribute("aria-label", strings.closeOverlay); + // Prevent CED from removing any current selection + clickEatingDiv.setAttribute("unselectable", "on"); + document.body.appendChild(clickEatingDiv); + return clickEatingDiv; + }; + + // Used by AppBar, and Settings Pane + _Overlay._createClickEatingDivAppBar = function () { + if (!_Overlay._clickEatingAppBarDiv) { + _Overlay._clickEatingAppBarDiv = _Overlay._createClickEatingDivTemplate(_Overlay._clickEatingAppBarClass, _Overlay._handleAppBarClickEatingClick); + } + }; + + // Used by Flyout and Menu + _Overlay._createClickEatingDivFlyout = function () { + if (!_Overlay._clickEatingFlyoutDiv) { + _Overlay._clickEatingFlyoutDiv = _Overlay._createClickEatingDivTemplate(_Overlay._clickEatingFlyoutClass, _Overlay._handleFlyoutClickEatingClick); + } + }; + + // All click-eaters eat "down" clicks so that we can still eat + // the "up" click that'll come later. + _Overlay._checkClickEatingPointerDown = function (event, stopPropogation) { + var target = event.currentTarget; + if (target) { + try { + // Remember pointer id and remember right mouse + target._winPointerId = event.pointerId; + // Cache right mouse if that was what happened + target._winRightMouse = (event.button === 2); + } catch (e) { } + } + + if (stopPropogation && !target._winRightMouse) { + event.stopPropagation(); + event.preventDefault(); + } + }; + + // Make sure that if we have an up we had an earlier down of the same kind + _Overlay._checkSameClickEatingPointerUp = function (event, stopPropogation) { + var result = false, + rightMouse = false, + target = event.currentTarget; + + // Same pointer we were watching? + try { + if (target && target._winPointerId === event.pointerId) { + // Same pointer + result = true; + rightMouse = target._winRightMouse; + // For click-eaters, don't count right click the same because edgy will dismiss + if (rightMouse && stopPropogation) { + result = false; + } + } + } catch (e) { } + + + if (stopPropogation && !rightMouse) { + event.stopPropagation(); + event.preventDefault(); + } + + return result; + }; + + // If they click on a click eating div, even with a right click, + // touch or anything, then we want to light dismiss that layer. + _Overlay._handleAppBarClickEatingClick = function (event) { + event.stopPropagation(); + event.preventDefault(); + + thisWinUI.AppBar._hideLightDismissAppBars(null, false); + _Overlay._hideClickEatingDivAppBar(); + _Overlay._hideAllFlyouts(); + }; + + // If they click on a click eating div, even with a right click, + // touch or anything, then we want to light dismiss that layer. + _Overlay._handleFlyoutClickEatingClick = function (event) { + event.stopPropagation(); + event.preventDefault(); + + // Don't light dismiss AppBars because edgy will do that as needed, + // so flyouts only. + _Overlay._hideClickEatingDivFlyout(); + _Overlay._hideFlyouts(document, true); + }; + + _Overlay._checkRightClickDown = function (event) { + _Overlay._checkClickEatingPointerDown(event, false); + }; + + _Overlay._checkRightClickUp = function (event) { + if (_Overlay._checkSameClickEatingPointerUp(event, false)) { + // It was a right click we may want to eat. + _Overlay._rightMouseMightEdgy = true; + setImmediate(function () { _Overlay._rightMouseMightEdgy = false; }); + } + }; + + _Overlay._showClickEatingDivAppBar = function () { + WinJS.Utilities.Scheduler.schedule(function () { + _Overlay._clickEatingAppBarDiv.style.display = "block"; + }, WinJS.Utilities.Scheduler.Priority.high, null, "WinJS.UI._Overlay._showClickEatingDivAppBar"); + }; + + _Overlay._hideClickEatingDivAppBar = function () { + WinJS.Utilities.Scheduler.schedule(function () { + _Overlay._clickEatingAppBarDiv.style.display = "none"; + }, WinJS.Utilities.Scheduler.Priority.high, null, "WinJS.UI._Overlay._hideClickEatingDivAppBar"); + }; + + _Overlay._showClickEatingDivFlyout = function () { + WinJS.Utilities.Scheduler.schedule(function () { + _Overlay._clickEatingFlyoutDiv.style.display = "block"; + }, WinJS.Utilities.Scheduler.Priority.high, null, "WinJS.UI._Overlay._showClickEatingDivFlyout"); + }; + + _Overlay._hideClickEatingDivFlyout = function () { + WinJS.Utilities.Scheduler.schedule(function () { + _Overlay._clickEatingFlyoutDiv.style.display = "none"; + }, WinJS.Utilities.Scheduler.Priority.high, null, "WinJS.UI._Overlay._hideClickEatingDivFlyout"); + }; + + _Overlay._isFlyoutVisible = function () { + if (!_Overlay._clickEatingFlyoutDiv) { + return false; + } + return (_Overlay._clickEatingFlyoutDiv.style.display === "block"); + }; + + _Overlay._hideIfLostFocus = function (overlay, focusEvent) { + // If we're still showing we haven't really lost focus + if (overlay.hidden || overlay.element.winAnimating === "showing" || overlay._sticky) { + return; + } + // If the active thing is within our element, we haven't lost focus + var active = document.activeElement; + if (overlay._element && overlay._element.contains(active)) { + return; + } + // SettingFlyouts don't dismiss if they spawned a flyout + if (WinJS.Utilities.hasClass(overlay._element, "win-settingsflyout")) { + var settingsFlyout = overlay; + var flyoutControl = _Overlay._getParentControlUsingClassName(active, "win-flyout"); + if (flyoutControl && flyoutControl._previousFocus && settingsFlyout.element.contains(flyoutControl._previousFocus)) { + flyoutControl.element.addEventListener('focusout', function focusOut(event) { + // When the Flyout closes, hide the SetingsFlyout if it didn't regain focus. + _Overlay._hideIfLostFocus(settingsFlyout, event); + flyoutControl.element.removeEventListener('focusout', focusOut, false); + }, false); + return; + } + } + // Do not hide focus if focus moved to a CED. Let the click handler on the CED take care of hiding us. + if (active && + (WinJS.Utilities.hasClass(active, _Overlay._clickEatingFlyoutClass) || + WinJS.Utilities.hasClass(active, _Overlay._clickEatingAppBarClass))) { + return; + } + + overlay._hideOrDismiss(); + }; + + // Want to hide flyouts on blur. + // We get blur if we click off the window, including to an iframe within our window. + // Both blurs call this function, but fortunately document.hasFocus is true if either + // the document window or our iframe window has focus. + _Overlay._checkBlur = function (focusEvent) { + if (!document.hasFocus()) { + // The document doesn't have focus, so they clicked off the app, so light dismiss. + _Overlay._hideAllFlyouts(); + thisWinUI.AppBar._hideLightDismissAppBars(null, false); + } else { + if ((_Overlay._clickEatingFlyoutDiv && + _Overlay._clickEatingFlyoutDiv.style.display === "block") || + (_Overlay._clickEatingAppBarDiv && + _Overlay._clickEatingAppBarDiv.style.display === "block")) { + // We were trying to unfocus the window, but document still has focus, + // so make sure the iframe that took the focus will check for blur next time. + // We don't have to do this if the click eating div is hidden because then + // there would be no flyout or appbar needing light dismiss. + var active = document.activeElement; + if (active && active.tagName === "IFRAME" && !active.msLightDismissBlur) { + // This will go away when the IFRAME goes away, and we only create one + active.msLightDismissBlur = active.addEventListener("blur", _Overlay._checkBlur, false); + } + } + } + }; + + // Try to set us as active + _Overlay._trySetActive = function (element) { + if (!element || !element.setActive || !document.body || !document.body.contains(element)) { + return false; + } + try { + element.setActive(); + } catch (err) { + return false; + } + return (element === document.activeElement); + }; + + // Try to select the text so keyboard can be used. + _Overlay._trySelect = function (element) { + try { + if (element && element.select) { + element.select(); + } + } catch (e) { } + }; + + // Prevent the document.activeElement from showing focus + _Overlay._addHideFocusClass = function (element) { + if (element) { + WinJS.Utilities.addClass(element, hideFocusClass); + element.addEventListener("focusout", _Overlay._removeHideFocusClass, false); + } + }; + + // Allow the event.target (element that is losing focus) to show focus next time it gains focus + _Overlay._removeHideFocusClass = function (event) { + // Make sure we really lost focus and was not just an App switch + var target = event.target; + if (target && target !== document.activeElement) { + WinJS.Utilities.removeClass(target, hideFocusClass); + event.target.removeEventListener("focusout", _Overlay._removeHideFocusClass, false); + } + }; + + _Overlay._getParentControlUsingClassName = function (element, className) { + while (element && element !== document.body) { + if (WinJS.Utilities.hasClass(element, className)) { + return element.winControl; + } + element = element.parentNode; + } + return null; + }; + + // Global keyboard hiding offset + _Overlay._keyboardInfo = { + // Determine if the keyboard is visible or not. + get _visible() { + try { + return (WinJS.Utilities.hasWinRT && Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height > 0); + } catch (e) { + return false; + } + }, + + // See if we have to reserve extra space for the IHM + get _extraOccluded() { + var occluded; + if (WinJS.Utilities.hasWinRT) { + try { + occluded = Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height; + } catch (e) { + } + } + + // Nothing occluded if not visible. + if (occluded && !_Overlay._keyboardInfo._isResized) { + // View hasn't been resized, need to return occluded height. + return occluded; + } + + // View already has space for keyboard or there's no keyboard + return 0; + }, + + // See if the view has been resized to fit a keyboard + get _isResized() { + // Compare ratios. Very different includes IHM space. + var heightRatio = document.documentElement.clientHeight / window.innerHeight, + widthRatio = document.documentElement.clientWidth / window.innerWidth; + + // If they're nearly identical, then the view hasn't been resized for the IHM + // Only check one bound because we know the IHM will make it shorter, not skinnier. + return (widthRatio / heightRatio < 0.99); + }, + + // Get the top of our visible area in terms of document.documentElement. + get _visibleDocTop() { + return window.pageYOffset - document.documentElement.scrollTop; + }, + + // Get the bottom of our visible area. + get _visibleDocBottom() { + return _Overlay._keyboardInfo._visibleDocTop + _Overlay._keyboardInfo._visibleDocHeight; + }, + + // Get the height of the visible document, e.g. the height of the visual viewport minus any IHM occlusion. + get _visibleDocHeight() { + return _Overlay._keyboardInfo._visualViewportHeight -_Overlay._keyboardInfo._extraOccluded; + }, + + // Get the visual viewport height. window.innerHeight doesn't return floating point values which are present with high DPI. + get _visualViewportHeight() { + var boundingRect = _Overlay._keyboardInfo._visualViewportSpace; + return boundingRect.bottom - boundingRect.top; + }, + + // Get the visual viewport width. window.innerHeight doesn't return floating point values which are present with high DPI. + get _visualViewportWidth() { + var boundingRect = _Overlay._keyboardInfo._visualViewportSpace; + return boundingRect.right - boundingRect.left; + }, + + get _visualViewportSpace() { + var className = "win-visualviewport-space" + var visualViewportSpace = document.body.querySelector("." + className); + if (!visualViewportSpace) { + visualViewportSpace = document.createElement("DIV"); + visualViewportSpace.className = className; + document.body.appendChild(visualViewportSpace); + } + + return visualViewportSpace.getBoundingClientRect(); + }, + + // Get offset of visible window from bottom. + get _visibleDocBottomOffset() { + // If the view resizes we can return 0 and rely on appbar's -ms-device-fixed css positioning. + return (_Overlay._keyboardInfo._isResized) ? 0 : _Overlay._keyboardInfo._extraOccluded; + }, + + // Get total length of the IHM showPanel animation + get _animationShowLength() { + if (!WinJS.Utilities.hasWinRT) { + return 0; + } + + var a = Windows.UI.Core.AnimationMetrics, + animationDescription = new a.AnimationDescription(a.AnimationEffect.showPanel, a.AnimationEffectTarget.primary); + var animations = animationDescription.animations; + var max = 0; + for (var i = 0; i < animations.size; i++) { + var animation = animations[i]; + max = Math.max(max, animation.delay + animation.duration); + } + return max; + } + }; + + // Classes other objects use + _Overlay._clickEatingAppBarClass = "win-appbarclickeater"; + _Overlay._clickEatingFlyoutClass = "win-flyoutmenuclickeater"; + + // Padding for IHM timer to allow for first scroll event + _Overlay._scrollTimeout = 150; + + // Events + _Overlay.beforeShow = BEFORESHOW; + _Overlay.beforeHide = BEFOREHIDE; + _Overlay.afterShow = AFTERSHOW; + _Overlay.afterHide = AFTERHIDE; + + _Overlay.commonstrings = { + get cannotChangeCommandsWhenVisible() { return WinJS.Resources._getWinJSString("ui/cannotChangeCommandsWhenVisible").value; }, + get cannotChangeHiddenProperty() { return WinJS.Resources._getWinJSString("ui/cannotChangeHiddenProperty").value; } + }; + + var strings = { + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get mustContainCommands() { return WinJS.Resources._getWinJSString("ui/mustContainCommands").value; }, + get closeOverlay() { return WinJS.Resources._getWinJSString("ui/closeOverlay").value; }, + }; + + WinJS.Class.mix(_Overlay, WinJS.UI.DOMEventMixin); + + return _Overlay; + }) + }); + +})(WinJS); + + +// Glyph Enumeration +/// Segoe +(function appBarIconInit(WinJS) { + "use strict"; + + var glyphs = ["previous", + "next", + "play", + "pause", + "edit", + "save", + "clear", + "delete", + "remove", + "add", + "cancel", + "accept", + "more", + "redo", + "undo", + "home", + "up", + "forward", + "right", + "back", + "left", + "favorite", + "camera", + "settings", + "video", + "sync", + "download", + "mail", + "find", + "help", + "upload", + "emoji", + "twopage", + "leavechat", + "mailforward", + "clock", + "send", + "crop", + "rotatecamera", + "people", + "closepane", + "openpane", + "world", + "flag", + "previewlink", + "globe", + "trim", + "attachcamera", + "zoomin", + "bookmarks", + "document", + "protecteddocument", + "page", + "bullets", + "comment", + "mail2", + "contactinfo", + "hangup", + "viewall", + "mappin", + "phone", + "videochat", + "switch", + "contact", + "rename", + "pin", + "musicinfo", + "go", + "keyboard", + "dockleft", + "dockright", + "dockbottom", + "remote", + "refresh", + "rotate", + "shuffle", + "list", + "shop", + "selectall", + "orientation", + "import", + "importall", + "browsephotos", + "webcam", + "pictures", + "savelocal", + "caption", + "stop", + "showresults", + "volume", + "repair", + "message", + "page2", + "calendarday", + "calendarweek", + "calendar", + "characters", + "mailreplyall", + "read", + "link", + "accounts", + "showbcc", + "hidebcc", + "cut", + "attach", + "paste", + "filter", + "copy", + "emoji2", + "important", + "mailreply", + "slideshow", + "sort", + "manage", + "allapps", + "disconnectdrive", + "mapdrive", + "newwindow", + "openwith", + "contactpresence", + "priority", + "uploadskydrive", + "gototoday", + "font", + "fontcolor", + "contact2", + "folder", + "audio", + "placeholder", + "view", + "setlockscreen", + "settile", + "cc", + "stopslideshow", + "permissions", + "highlight", + "disableupdates", + "unfavorite", + "unpin", + "openlocal", + "mute", + "italic", + "underline", + "bold", + "movetofolder", + "likedislike", + "dislike", + "like", + "alignright", + "aligncenter", + "alignleft", + "zoom", + "zoomout", + "openfile", + "otheruser", + "admin", + "street", + "map", + "clearselection", + "fontdecrease", + "fontincrease", + "fontsize", + "cellphone", + "reshare", + "tag", + "repeatone", + "repeatall", + "outlinestar", + "solidstar", + "calculator", + "directions", + "target", + "library", + "phonebook", + "memo", + "microphone", + "postupdate", + "backtowindow", + "fullscreen", + "newfolder", + "calendarreply", + "unsyncfolder", + "reporthacked", + "syncfolder", + "blockcontact", + "switchapps", + "addfriend", + "touchpointer", + "gotostart", + "zerobars", + "onebar", + "twobars", + "threebars", + "fourbars", + "scan", + "preview"]; + + // Provide properties to grab resources for each of the icons + /// + /// The AppBarIcon enumeration provides a set of glyphs for use with the AppBarCommand icon property. + /// + WinJS.Namespace.define("WinJS.UI.AppBarIcon", + glyphs.reduce(function (fixedIcons, item) { + fixedIcons[item] = { get: function () { return WinJS.Resources._getWinJSString("ui/appBarIcons/" + item).value; } }; + return fixedIcons; + }, {})); +})(WinJS); +// AppBarCommand +/// appbar,appbars,Flyout,Flyouts,onclick,Statics +(function appBarCommandInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Represents a command to display in an AppBar. + /// + /// + /// + /// ]]> + /// The AppBarCommand control itself. + /// The AppBarCommand's icon box. + /// The AppBarCommand's icon's image formatting. + /// The AppBarCommand's icon's ring. + /// The AppBarCommand's label + /// + /// + /// + AppBarCommand: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + // Class Names + var appBarCommandClass = "win-command", + appBarCommandGlobalClass = "win-global", + appBarCommandSelectionClass = "win-selection", + reducedClass = "win-reduced", + typeSeparator = "separator", + typeButton = "button", + typeToggle = "toggle", + typeFlyout = "flyout", + typeContent = "content", + sectionSelection = "selection", + sectionGlobal = "global"; + + function _handleClick(event) { + var command = this.winControl; + if (command) { + if (command._type === typeToggle) { + command.selected = !command.selected; + } else if (command._type === typeFlyout && command._flyout) { + var parentAppBar = thisWinUI._Overlay._getParentControlUsingClassName(this, "win-appbar"); + var placement = "top"; + if (parentAppBar && parentAppBar.placement === "top") { + placement = "bottom"; + } + var flyout = command._flyout; + // Flyout may not have processAll'd, so this may be a DOM object + if (typeof flyout === "string") { + flyout = document.getElementById(flyout); + } + if (!flyout.show) { + flyout = flyout.winControl; + } + if (flyout && flyout.show) { + flyout.show(this, placement); + } + } + if (command.onclick) { + command.onclick(event); + } + } + } + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/appBarCommandAriaLabel").value; }, + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get badClick() { return WinJS.Resources._getWinJSString("ui/badClick").value; }, + get badDivElement() { return WinJS.Resources._getWinJSString("ui/badDivElement").value; }, + get badHrElement() { return WinJS.Resources._getWinJSString("ui/badHrElement").value; }, + get badButtonElement() { return WinJS.Resources._getWinJSString("ui/badButtonElement").value; } + }; + + return WinJS.Class.define(function AppBarCommand_ctor(element, options) { + /// + /// + /// Creates a new AppBarCommand control. + /// + /// + /// The DOM element that will host the control. AppBarCommand will create one if null. + /// + /// + /// The set of properties and values to apply to the new AppBarCommand. + /// + /// + /// The new AppBarCommand control. + /// + /// + + // Check to make sure we weren't duplicated + if (element && element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.DuplicateConstruction", strings.duplicateConstruction); + } + + this._disposed = false; + + // Don't blow up if they didn't pass options + if (!options) { + options = {}; + } + + // Need a type before we can create our element + if (!options.type) { + this._type = typeButton; + } + + // Go ahead and create it, separator and content types look different than buttons + // Don't forget to use passed in element if one was provided. + this._element = element; + + if (options.type === typeContent) { + this._createContent(); + } + else if (options.type === typeSeparator) { + this._createSeparator(); + } else { + // This will also set the icon & label + this._createButton(); + } + WinJS.Utilities.addClass(this._element, "win-disposable"); + + // Remember ourselves + this._element.winControl = this; + + // Attach our css class + WinJS.Utilities.addClass(this._element, appBarCommandClass); + + if (options.onclick) { + this.onclick = options.onclick; + } + // We want to handle some clicks + options.onclick = _handleClick; + + WinJS.UI.setOptions(this, options); + + if (!options.section) { + this._setSection(options.section); + } + + if (this._type === typeToggle && !options.selected) { + this.selected = false; + } + + // Set up pointerdown handler and clean up ARIA if needed + if (this._type !== typeSeparator) { + + // Hide the modern focus rect on click or touch + var that = this; + this._element.addEventListener("pointerdown", function () { thisWinUI._Overlay._addHideFocusClass(that._element); }, false); + + // Make sure we have an ARIA role + var role = this._element.getAttribute("role"); + if (role === null || role === "" || role === undefined) { + if (this._type === typeToggle) { + role = "menuitemcheckbox"; + } else if (this._type === typeContent) { + role = "group"; + } else { + role = "menuitem"; + } + this._element.setAttribute("role", role); + if (this._type === typeFlyout) { + this._element.setAttribute("aria-haspopup", true); + } + } + // Label should've been set by label, but if it was missed for some reason: + var label = this._element.getAttribute("aria-label"); + if (label === null || label === "" || label === undefined) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + } + }, { + /// + /// Gets or sets the ID of the AppBarCommand. + /// + id: { + get: function () { + return this._element.id; + }, + + set: function (value) { + // we allow setting first time only. otherwise we ignore it. + if (value && !this._element.id) { + this._element.id = value; + } + } + }, + + /// + /// Gets or sets the type of the AppBarCommand. Possible values are "button", "toggle", "flyout", or "separator". + /// + type: { + get: function () { + return this._type; + }, + set: function (value) { + // we allow setting first time only. otherwise we ignore it. + if (!this._type) { + if (value !== typeContent && value !== typeFlyout && value !== typeToggle && value !== typeSeparator) { + this._type = typeButton; + } else { + this._type = value; + } + } + } + }, + + /// + /// Gets or sets the label of the AppBarCommand. + /// + label: { + get: function () { + return this._label; + }, + set: function (value) { + this._label = value; + if (this._labelSpan) { + this._labelSpan.innerText = this.label; + } + + // Ensure that we have a tooltip, by updating already-constructed tooltips. Separators won't have these: + if (!this.tooltip && this._tooltipControl) { + this._tooltip = this.label; + this._tooltipControl.innerHTML = this.label; + } + + // Update aria-label + this._element.setAttribute("aria-label", this.label); + + // Check if we need to suppress the tooltip + this._testIdenticalTooltip(); + } + }, + + /// + /// Gets or sets the icon of the AppBarCommand. + /// + icon: { + get: function () { + return this._icon; + }, + set: function (value) { + if (value) { + this._icon = (WinJS.UI.AppBarIcon[value] || value); + } else { + this._icon = value; + } + + if (this._imageSpan) { + // If the icon's a single character, presume a glyph + if (this._icon && this._icon.length === 1) { + // Set the glyph + this._imageSpan.innerText = this._icon; + this._imageSpan.style.backgroundImage = ""; + this._imageSpan.style.msHighContrastAdjust = ""; + } else { + // Must be an image, set that + this._imageSpan.innerText = ""; + this._imageSpan.style.backgroundImage = this._icon; + this._imageSpan.style.msHighContrastAdjust = "none"; + } + } + } + }, + + /// + /// Gets or sets the function to invoke when the command is clicked. + /// + onclick: { + get: function () { + return this._onclick; + }, + set: function (value) { + if (value && typeof value !== "function") { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.BadClick", WinJS.Resources._formatString(strings.badClick, "AppBarCommand")); + } + this._onclick = value; + } + }, + + /// + /// For flyout-type AppBarCommands, this property returns the WinJS.UI.Flyout that this command invokes. + /// When setting this property, you may also use the String ID of the flyout to invoke, the DOM object + /// for the flyout, or the WinJS.UI.Flayout object itself. + /// + flyout: { + get: function () { + // Resolve it to the flyout + var flyout = this._flyout; + if (typeof flyout === "string") { + flyout = document.getElementById(flyout); + } + // If it doesn't have a .element, then we need to getControl on it + if (flyout && !flyout.element) { + flyout = flyout.winControl; + } + + return flyout; + }, + set: function (value) { + // Need to update aria-owns with the new ID. + var id = value; + if (id && typeof id !== "string") { + // Our controls have .element properties + if (id.element) { + id = id.element; + } + // Hope it's a DOM element, get ID from DOM element + if (id) { + if (id.id) { + id = id.id; + } else { + // No id, have to fake one + id.id = id.uniqueID; + id = id.id; + } + } + } + if (typeof id === "string") { + this._element.setAttribute("aria-owns", id); + } + + // Remember it + this._flyout = value; + } + }, + + /// + /// Gets or sets the section that the AppBarCommand is in. Possible values are "selection" and "global". + /// + section: { + get: function () { + return this._section; + }, + set: function (value) { + // we allow settings section only one time + if (!this._section || (window.Windows && Windows.ApplicationModel && Windows.ApplicationModel.DesignMode && Windows.ApplicationModel.DesignMode.designModeEnabled)) { + this._setSection(value); + } + } + }, + + /// Gets or sets the tooltip text of the AppBarCommand. + tooltip: { + get: function () { + return this._tooltip; + }, + set: function (value) { + this._tooltip = value; + + // Update already-constructed tooltips. Separators and content commands won't have these: + if (this._tooltipControl) { + this._tooltipControl.innerHTML = this._tooltip; + } + + // Check if we need to suppress the tooltip + this._testIdenticalTooltip(); + } + }, + + /// Set or get the selected state of a toggle button. + selected: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return this._element.getAttribute("aria-checked") === "true"; + }, + set: function (value) { + this._element.setAttribute("aria-checked", value); + } + }, + + /// + element: { + get: function () { + return this._element; + } + }, + + /// + /// Gets or sets a value that indicates whether the AppBarCommand is disabled. A value of true disables the AppBarCommand, and a value of false enables it. + /// + disabled: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return !!this._element.disabled; + }, + set: function (value) { + this._element.disabled = value; + } + }, + + /// + hidden: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return this._element.style.visibility === "hidden"; + }, + set: function (value) { + var appbarControl = thisWinUI._Overlay._getParentControlUsingClassName(this._element, "win-appbar"); + if (appbarControl && !appbarControl.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.CannotChangeHiddenProperty", WinJS.Resources._formatString(thisWinUI._Overlay.commonstrings.cannotChangeHiddenProperty, "AppBar")); + } + + if (value === this.hidden) { + // No changes to make. + return; + } + + var style = this._element.style; + + if (value) { + style.visibility = "hidden"; + style.display = "none"; + } else { + style.visibility = ""; + style.display = "inline-block"; + } + if (appbarControl) { + appbarControl._contentChanged(); + } + } + }, + + /// + /// Gets or sets the HTMLElement within a "content" type AppBarCommand that should receive focus whenever focus moves via Home or the arrow keys, + /// from the previous AppBarCommand to the this AppBarCommand. Returns the AppBarCommand object's host element by default. + /// + firstElementFocus: { + get: function () { + return this._firstElementFocus || this._lastElementFocus || this._element; + }, + set: function (element) { + // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set. + this._firstElementFocus = (element === this.element) ? null : element; + this._updateTabStop(); + } + }, + + /// + /// Gets or sets the HTMLElement within a "content" type AppBarCommand that should receive focus whenever focus would move, via End or arrow keys, + /// from the next AppBarCommand to this AppBarCommand. Returns this AppBarCommand object's host element by default. + /// + lastElementFocus: { + get: function () { + return this._lastElementFocus || this._firstElementFocus || this._element; + }, + set: function (element) { + // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set. + this._lastElementFocus = (element === this.element) ? null : element; + this._updateTabStop(); + } + }, + + dispose: function () { + /// + /// + /// Disposes this control. + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; + + if (this._tooltipControl) { + this._tooltipControl.dispose(); + } + + if (this._type === typeContent) { + WinJS.Utilities.disposeSubTree(this.element); + } + }, + + addEventListener: function (type, listener, useCapture) { + /// + /// + /// Registers an event handler for the specified event. + /// + /// + /// Required. The name of the event to register. It must be "beforeshow", "beforehide", "aftershow", or "afterhide". + /// + /// Required. The event handler function to associate with this event. + /// + /// Optional. Set to true to register the event handler for the capturing phase; otherwise, set to false to register the event handler for the bubbling phase. + /// + /// + return this._element.addEventListener(type, listener, useCapture); + }, + + removeEventListener: function (type, listener, useCapture) { + /// + /// + /// Removes an event handler that the addEventListener method registered. + /// + /// Required. The name of the event to remove. + /// Required. The event handler function to remove. + /// + /// Optional. Set to true to remove the capturing phase event handler; otherwise, set to false to remove the bubbling phase event handler. + /// + /// + return this._element.removeEventListener(type, listener, useCapture); + }, + + /// Adds an extra CSS class during construction. + extraClass: { + get: function () { + return this._extraClass; + }, + set: function (value) { + if (this._extraClass) { + WinJS.Utilities.removeClass(this._element, this._extraClass); + } + this._extraClass = value; + WinJS.Utilities.addClass(this._element, this._extraClass); + } + }, + + // Private + _testIdenticalTooltip: function AppBarCommand_testIdenticalToolTip() { + this._hideIfFullSize = (this._label === this._tooltip); + }, + + _createContent: function AppBarCommand_createContent() { + // Make sure there's an element + if (!this._element) { + this._element = document.createElement("div"); + } else { + // Verify the element was a div + if (this._element.tagName !== "DIV") { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.BadDivElement", strings.badDivElement); + } + } + + // If a tabIndex isnt set, default to 0; + if (parseInt(this._element.getAttribute("tabIndex"), 10) !== this._element.tabIndex) { + this._element.tabIndex = 0; + } + }, + + _createSeparator: function AppBarCommand_createSeparator() { + // Make sure there's an element + if (!this._element) { + this._element = document.createElement("hr"); + } else { + // Verify the element was an hr + if (this._element.tagName !== "HR") { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.BadHrElement", strings.badHrElement); + } + } + }, + + _createButton: function AppBarCommand_createButton() { + // Make sure there's an element + if (!this._element) { + this._element = document.createElement("button"); + } else { + // Verify the element was a button + if (this._element.tagName !== "BUTTON") { + throw new WinJS.ErrorFromName("WinJS.UI.AppBarCommand.BadButtonElement", strings.badButtonElement); + } + // Make sure it has a type="button" + var type = this._element.getAttribute("type"); + if (type === null || type === "" || type === undefined) { + this._element.setAttribute("type", "button"); + } + this._element.innerHTML = ""; + } + + // AppBarCommand buttons need to look like this: + //// + this._element.type = "button"; + this._iconSpan = document.createElement("span"); + this._iconSpan.setAttribute("aria-hidden", "true"); + this._iconSpan.className = "win-commandicon win-commandring"; + this._iconSpan.tabIndex = -1; + this._element.appendChild(this._iconSpan); + this._imageSpan = document.createElement("span"); + this._imageSpan.setAttribute("aria-hidden", "true"); + this._imageSpan.className = "win-commandimage"; + this._imageSpan.tabIndex = -1; + this._iconSpan.appendChild(this._imageSpan); + this._labelSpan = document.createElement("span"); + this._labelSpan.setAttribute("aria-hidden", "true"); + this._labelSpan.className = "win-label"; + this._labelSpan.tabIndex = -1; + this._element.appendChild(this._labelSpan); + // 'win-global' or 'win-selection' are added later by caller. + // Label and icon are added later by caller. + + // Attach a tooltip - Note: we're going to stomp on it's setControl so we don't have to make another DOM element to hang it off of. + // This private _tooltipControl attribute is used by other pieces, changing the name could break them. + this._tooltipControl = new WinJS.UI.Tooltip(this._element); + var that = this; + this._tooltipControl.addEventListener("beforeopen", function () { + if (that._hideIfFullSize && !thisWinUI._Overlay._getParentControlUsingClassName(that._element.parentElement, reducedClass)) { + that._tooltipControl.close(); + } + }, false); + }, + + _setSection: function AppBarCommand_setSection(section) { + if (!section) { + section = sectionGlobal; + } + if (this._section) { + // Remove the old section class + if (this._section === sectionGlobal) { + WinJS.Utilities.removeClass(this._element, appBarCommandGlobalClass); + } else if (this.section === sectionSelection) { + WinJS.Utilities.removeClass(this._element, appBarCommandSelectionClass); + } + } + // Add the new section class + this._section = section; + if (section === sectionGlobal) { + WinJS.Utilities.addClass(this._element, appBarCommandGlobalClass); + } else if (section === sectionSelection) { + WinJS.Utilities.addClass(this._element, appBarCommandSelectionClass); + } + }, + + _updateTabStop: function AppBarCommand_updateTabStop() { + // Whenever the firstElementFocus or lastElementFocus properties are set for content type AppBarCommands, + // the containing command element is no longer a tabstop. + + if (this._firstElementFocus || this._lastElementFocus ) { + this.element.tabIndex = -1; + } else { + this.element.tabIndex = 0; + } + }, + + _isFocusable: function AppBarCommand_isFocusable() { + return (!this.hidden && this._type !== typeSeparator && !this.element.disabled && + (this.firstElementFocus.tabIndex >= 0 || this.lastElementFocus.tabIndex >= 0)) + }, + }); + }) + }); + +})(WinJS); + +// AppBar +/// appbar,appBars,Flyout,Flyouts,iframe,Statics,unfocus,WinJS +(function appBarInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Represents an application toolbar for display commands. + /// + /// + /// + /// + /// + /// ]]> + /// Raised just before showing the AppBar. + /// Raised immediately after the AppBar is fully shown. + /// Raised just before hiding the AppBar. + /// Raised immediately after the AppBar is fully hidden. + /// The AppBar control itself. + /// Style for a custom layout AppBar. + /// + /// + /// + AppBar: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + // Class Names + var commandClass = "win-commandlayout", + appBarClass = "win-appbar", + reducedClass = "win-reduced", + settingsFlyoutClass = "win-settingsflyout", + topClass = "win-top", + bottomClass = "win-bottom", + appBarCommandClass = "win-command"; + + var firstDivClass = "win-firstdiv", + finalDivClass = "win-finaldiv"; + + // Constants for placement + var appBarPlacementTop = "top", + appBarPlacementBottom = "bottom"; + + // Constants for layout + var appBarLayoutCustom = "custom", + appBarLayoutCommands = "commands"; + + // Constants for AppBarCommands + var typeSeparator = "separator", + typeContent = "content", + separatorWidth = 60, + buttonWidth = 100; + + // Hook into event + var appBarCommandEvent = false; + var edgyHappening = null; + + // Handler for the edgy starting/completed/cancelled events + function _completedEdgy(e) { + // If we had a right click on a flyout, ignore it. + if (thisWinUI._Overlay._rightMouseMightEdgy && + e.kind === Windows.UI.Input.EdgeGestureKind.mouse) { + return; + } + if (edgyHappening) { + // Edgy was happening, just skip it + edgyHappening = null; + } else { + // Edgy wasn't happening, so toggle + var keyboardInvoked = e.kind === Windows.UI.Input.EdgeGestureKind.keyboard; + WinJS.UI.AppBar._toggleAppBarEdgy(keyboardInvoked); + } + } + + function _startingEdgy() { + if (!edgyHappening) { + // Edgy wasn't happening, so toggle & start it + edgyHappening = WinJS.UI.AppBar._toggleAppBarEdgy(false); + } + } + + function _canceledEdgy() { + // Shouldn't get here unless edgy was happening. + // Undo whatever we were doing. + var bars = _getDynamicBarsForEdgy(); + if (edgyHappening === "showing") { + _hideAllBars(bars, false); + } else if (edgyHappening === "hiding") { + _showAllBars(bars, false); + } + edgyHappening = null; + } + + function _allManipulationChanged(event) { + var elements = document.querySelectorAll("." + appBarClass); + if (elements) { + var len = elements.length; + for (var i = 0; i < len; i++) { + var element = elements[i]; + var appbar = element.winControl; + if (appbar && !element.disabled) { + appbar._manipulationChanged(event); + } + } + } + } + + // Get all the non-sticky bars and return them. + // Returns array of AppBar objects. + // The array also has _hidden and/or _visible set if ANY are hidden or visible. + function _getDynamicBarsForEdgy() { + var elements = document.querySelectorAll("." + appBarClass); + var len = elements.length; + var AppBars = []; + AppBars._visible = false; + AppBars._hidden = false; + for (var i = 0; i < len; i++) { + var element = elements[i]; + if (element.disabled) { + // Skip disabled AppBars + continue; + } + var AppBar = element.winControl; + if (AppBar) { + AppBars.push(AppBar); + // Middle of animation is different than animated + if (AppBar._element.winAnimating) { + // If animating, look at showing/hiding + if (AppBar._element.winAnimating === "hiding") { + AppBars._hidden = true; + } else { + AppBars._visible = true; + } + } else { + // Not animating, so check visibility + if (AppBar._element.style.visibility === "hidden") { + AppBars._hidden = true; + } else { + AppBars._visible = true; + } + } + } + } + + return AppBars; + } + + // Show or hide all bars + function _hideAllBars(bars, keyboardInvoked) { + var len = bars.length; + var allBarsAnimationPromises = new Array(len); + for (var i = 0; i < len; i++) { + bars[i]._keyboardInvoked = keyboardInvoked; + bars[i].hide(); + allBarsAnimationPromises[i] = bars[i]._animationPromise; + } + return WinJS.Promise.join(allBarsAnimationPromises); + } + + function _showAllBars(bars, keyboardInvoked) { + var len = bars.length; + var allBarsAnimationPromises = new Array(len); + for (var i = 0; i < len; i++) { + bars[i]._keyboardInvoked = keyboardInvoked; + bars[i]._doNotFocus = false; + bars[i]._show(); + allBarsAnimationPromises[i] = bars[i]._animationPromise; + } + return WinJS.Promise.join(allBarsAnimationPromises); + } + + // Sets focus to the last AppBar in the provided appBars array with given placement. + // Returns true if focus was set. False otherwise. + function _setFocusToPreviousAppBarHelper(startIndex, appBarPlacement, appBars) { + for (var i = startIndex; i >= 0; i--) { + if (appBars[i].winControl + && appBars[i].winControl.placement === appBarPlacement + && !appBars[i].winControl.hidden + && appBars[i].winControl._focusOnLastFocusableElement + && appBars[i].winControl._focusOnLastFocusableElement()) { + return true; + } + } + return false; + } + + // Sets focus to the last AppBar in the provided appBars array with other placement. + // Returns true if focus was set. False otherwise. + function _setFocusToPreviousAppBarHelperNeither(startIndex, appBars) { + for (var i = startIndex; i >= 0; i--) { + if (appBars[i].winControl + && appBars[i].winControl.placement != appBarPlacementBottom + && appBars[i].winControl.placement != appBarPlacementTop + && !appBars[i].winControl.hidden + && appBars[i].winControl._focusOnLastFocusableElement + && appBars[i].winControl._focusOnLastFocusableElement()) { + return true; + } + } + return false; + } + + // Sets focus to the last tab stop of the previous AppBar + // AppBar tabbing order: + // 1) Bottom AppBars + // 2) Top AppBars + // 3) Other AppBars + // DOM order is respected, because an AppBar should not have a defined tabIndex + function _setFocusToPreviousAppBar() { + var appBars = document.querySelectorAll("." + appBarClass); + if (!appBars.length) { + return; + } + + var thisAppBarIndex = 0; + for (var i = 0; i < appBars.length; i++) { + if (appBars[i] === this.parentElement) { + thisAppBarIndex = i; + break; + } + } + + var appBarControl = this.parentElement.winControl; + if (appBarControl.placement === appBarPlacementBottom) { + // Bottom appBar: Focus order: (1)previous bottom appBars (2)other appBars (3)top appBars (4)bottom appBars + if (thisAppBarIndex && _setFocusToPreviousAppBarHelper(thisAppBarIndex - 1, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToPreviousAppBarHelperNeither(appBars.length - 1, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementTop, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementBottom, appBars)) { return; } + } else if (appBarControl.placement === appBarPlacementTop) { + // Top appBar: Focus order: (1)previous top appBars (2)bottom appBars (3)other appBars (4)top appBars + if (thisAppBarIndex && _setFocusToPreviousAppBarHelper(thisAppBarIndex - 1, appBarPlacementTop, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToPreviousAppBarHelperNeither(appBars.length - 1, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementTop, appBars)) { return; } + } else { + // Other appBar: Focus order: (1)previous other appBars (2)top appBars (3)bottom appBars (4)other appBars + if (thisAppBarIndex && _setFocusToPreviousAppBarHelperNeither(thisAppBarIndex - 1, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementTop, appBars)) { return; } + if (_setFocusToPreviousAppBarHelper(appBars.length - 1, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToPreviousAppBarHelperNeither(appBars.length - 1, appBars)) { return; } + } + } + + // Sets focus to the first AppBar in the provided appBars array with given placement. + // Returns true if focus was set. False otherwise. + function _setFocusToNextAppBarHelper(startIndex, appBarPlacement, appBars) { + for (var i = startIndex; i < appBars.length; i++) { + if (appBars[i].winControl + && appBars[i].winControl.placement === appBarPlacement + && !appBars[i].winControl.hidden + && appBars[i].winControl._focusOnFirstFocusableElement + && appBars[i].winControl._focusOnFirstFocusableElement()) { + return true; + } + } + return false; + } + + // Sets focus to the first AppBar in the provided appBars array with other placement. + // Returns true if focus was set. False otherwise. + function _setFocusToNextAppBarHelperNeither(startIndex, appBars) { + for (var i = startIndex; i < appBars.length; i++) { + if (appBars[i].winControl + && appBars[i].winControl.placement != appBarPlacementBottom + && appBars[i].winControl.placement != appBarPlacementTop + && !appBars[i].winControl.hidden + && appBars[i].winControl._focusOnFirstFocusableElement + && appBars[i].winControl._focusOnFirstFocusableElement()) { + return true; + } + } + return false; + } + + // Sets focus to the first tab stop of the next AppBar + // AppBar tabbing order: + // 1) Bottom AppBars + // 2) Top AppBars + // 3) Other AppBars + // DOM order is respected, because an AppBar should not have a defined tabIndex + function _setFocusToNextAppBar() { + var appBars = document.querySelectorAll("." + appBarClass); + + var thisAppBarIndex = 0; + for (var i = 0; i < appBars.length; i++) { + if (appBars[i] === this.parentElement) { + thisAppBarIndex = i; + break; + } + } + + var appBarControl = this.parentElement.winControl; + if (this.parentElement.winControl.placement === appBarPlacementBottom) { + // Bottom appBar: Focus order: (1)next bottom appBars (2)top appBars (3)other appBars (4)bottom appBars + if (_setFocusToNextAppBarHelper(thisAppBarIndex + 1, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementTop, appBars)) { return; } + if (_setFocusToNextAppBarHelperNeither(0, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementBottom, appBars)) { return; } + } else if (this.parentElement.winControl.placement === appBarPlacementTop) { + // Top appBar: Focus order: (1)next top appBars (2)other appBars (3)bottom appBars (4)top appBars + if (_setFocusToNextAppBarHelper(thisAppBarIndex + 1, appBarPlacementTop, appBars)) { return; } + if (_setFocusToNextAppBarHelperNeither(0, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementTop, appBars)) { return; } + } else { + // Other appBar: Focus order: (1)next other appBars (2)bottom appBars (3)top appBars (4)other appBars + if (_setFocusToNextAppBarHelperNeither(thisAppBarIndex + 1, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementBottom, appBars)) { return; } + if (_setFocusToNextAppBarHelper(0, appBarPlacementTop, appBars)) { return; } + if (_setFocusToNextAppBarHelperNeither(0, appBars)) { return; } + } + } + + // Updates the firstDiv & finalDiv of all visible AppBars + function _updateAllAppBarsFirstAndFinalDiv() { + var appBars = document.querySelectorAll("." + appBarClass); + + for (var i = 0; i < appBars.length; i++) { + if (appBars[i].winControl + && !appBars[i].winControl.hidden + && appBars[i].winControl._updateFirstAndFinalDiv) { + appBars[i].winControl._updateFirstAndFinalDiv(); + } + } + } + + // Returns true if a visible non-sticky (light dismiss) AppBar is found in the document + function _isThereVisibleNonStickyBar() { + var appBars = document.querySelectorAll("." + appBarClass); + for (var i = 0; i < appBars.length; i++) { + var appBarControl = appBars[i].winControl; + if (appBarControl && !appBarControl.sticky && + (!appBarControl.hidden || appBarControl._element.winAnimating === "showing")) { + return true; + } + } + + return false; + } + + // Hide all light dismiss AppBars if what has focus is not part of a AppBar or flyout. + function _hideIfAllAppBarsLostFocus() { + if (!thisWinUI.AppBar._isAppBarOrChild(document.activeElement)) { + thisWinUI.AppBar._hideLightDismissAppBars(null, false); + // Ensure that sticky appbars clear cached focus after light dismiss are dismissed, which moved focus. + thisWinUI.AppBar._ElementWithFocusPreviousToAppBar = null; + } + } + + // If the previous focus was not a AppBar or CED, store it in the cache + // (_isAppBarOrChild tests CED for us). + function _checkStorePreviousFocus(focusEvent) { + if (focusEvent.relatedTarget + && focusEvent.relatedTarget.focus + && !thisWinUI.AppBar._isAppBarOrChild(focusEvent.relatedTarget)) { + _storePreviousFocus(focusEvent.relatedTarget); + } + } + + // Cache the previous focus information + function _storePreviousFocus(element) { + if (element) { + thisWinUI.AppBar._ElementWithFocusPreviousToAppBar = element; + } + } + + // Try to return focus to what had focus before. + // If successfully return focus to a textbox, restore the selection too. + function _restorePreviousFocus() { + thisWinUI._Overlay._trySetActive(thisWinUI.AppBar._ElementWithFocusPreviousToAppBar); + } + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/appBarAriaLabel").value; }, + get requiresCommands() { return WinJS.Resources._getWinJSString("ui/requiresCommands").value; }, + get nullCommand() { return WinJS.Resources._getWinJSString("ui/nullCommand").value; }, + get cannotChangePlacementWhenVisible() { return WinJS.Resources._getWinJSString("ui/cannotChangePlacementWhenVisible").value; }, + get badLayout() { return WinJS.Resources._getWinJSString("ui/badLayout").value; }, + get cannotChangeLayoutWhenVisible() { return WinJS.Resources._getWinJSString("ui/cannotChangeLayoutWhenVisible").value; } + }; + + var AppBar = WinJS.Class.derive(WinJS.UI._Overlay, function AppBar_ctor(element, options) { + /// + /// + /// Creates a new AppBar control. + /// + /// + /// The DOM element that will host the control. + /// + /// + /// The set of properties and values to apply to the new AppBar control. + /// + /// + /// The new AppBar control. + /// + /// + + this._initializing = true; + + // Simplify checking later + options = options || {}; + + // Make sure there's an input element + this._element = element || document.createElement("div"); + this._id = this._element.id || this._element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + // validate that if they didn't set commands, but want command + // layout that the HTML only contains commands. Do this first + // so that we don't leave partial AppBars in the DOM. + if (options.layout !== appBarLayoutCustom && !options.commands && this._element) { + // Shallow copy object so we can modify it. + options = WinJS.Utilities._shallowCopy(options); + options.commands = this._verifyCommandsOnly(this._element, "WinJS.UI.AppBarCommand"); + } + + // Call the base overlay constructor helper + this._baseOverlayConstructor(this._element, options); + + this._initializing = false; + + // Make a click eating div + thisWinUI._Overlay._createClickEatingDivAppBar(); + + // Attach our css class, + WinJS.Utilities.addClass(this._element, appBarClass); + // Also may need a command class if not a custom layout appbar + if (options.layout !== appBarLayoutCustom) { + WinJS.Utilities.addClass(this._element, commandClass); + } + + if (!options.placement) { + // Make sure we have default placement + this.placement = appBarPlacementBottom; + } + + // Make sure we have an ARIA role + var role = this._element.getAttribute("role"); + if (!role) { + this._element.setAttribute("role", "menubar"); + } + var label = this._element.getAttribute("aria-label"); + if (!label) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + + // Handle key down (esc) and key pressed (left & right) + this._element.addEventListener("keydown", this._handleKeyDown.bind(this), false); + + // Attach event handler + if (!appBarCommandEvent) { + // We'll trigger on invoking. Could also have invoked or canceled + // Eventually we may want click up on invoking and drop back on invoked. + // Check for namespace so it'll behave in the designer. + if (WinJS.Utilities.hasWinRT) { + var commandUI = Windows.UI.Input.EdgeGesture.getForCurrentView(); + commandUI.addEventListener("starting", _startingEdgy); + commandUI.addEventListener("completed", _completedEdgy); + commandUI.addEventListener("canceled", _canceledEdgy); + } + + // Need to know if the IHM is done scrolling + document.addEventListener("MSManipulationStateChanged", _allManipulationChanged, false); + + appBarCommandEvent = true; + } + + // Make sure _Overlay event handlers are hooked up (this aids light dismiss) + this._addOverlayEventHandlers(false); + + // Need to store what had focus before + this._element.addEventListener("focusin", function (event) { _checkStorePreviousFocus(event); }, false); + + // Need to hide ourselves if we lose focus + this._element.addEventListener("focusout", function (event) { _hideIfAllAppBarsLostFocus(); }, false); + + // Commands layout AppBar measures and caches its content synchronously in setOptions through the .commands property setter. + // Remove the commands layout AppBar from the layout tree at this point so we don't cause unnecessary layout costs whenever + // the window resizes or when CSS changes are applied to the commands layout AppBar's parent element. + if (this.layout === appBarLayoutCommands) { + this._element.style.display = "none"; + } + + this._writeProfilerMark("constructor,StopTM"); + + return this; + }, { + // Public Properties + + /// The placement of the AppBar on the display. Values are "top" or "bottom". + placement: { + get: function () { + return this._placement; + }, + set: function (value) { + // In designer we may have to move it + var wasShown = false; + if (window.Windows && Windows.ApplicationModel && Windows.ApplicationModel.DesignMode && Windows.ApplicationModel.DesignMode.designModeEnabled && !this.hidden) { + this._hide(); + wasShown = true; + } + + if (!this.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.CannotChangePlacementWhenVisible", strings.cannotChangePlacementWhenVisible); + } + + // Set placement + this._placement = value; + + // Clean up win-top, win-bottom styles + if (this._placement === appBarPlacementTop) { + WinJS.Utilities.addClass(this._element, topClass); + WinJS.Utilities.removeClass(this._element, bottomClass); + } else if (this._placement === appBarPlacementBottom) { + WinJS.Utilities.removeClass(this._element, topClass); + WinJS.Utilities.addClass(this._element, bottomClass); + } else { + WinJS.Utilities.removeClass(this._element, topClass); + WinJS.Utilities.removeClass(this._element, bottomClass); + } + + // Make sure our animations are correct + this._assignAnimations(); + + // Show again if we hid ourselves for the designer + if (wasShown) { + this._show(); + } + } + }, + + /// + /// Gets or sets the layout of the AppBar contents to either "commands" or "custom". + /// + layout: { + get: function () { + // Defaults to commands if not set + return this._layout ? this._layout : appBarLayoutCommands; + }, + set: function (value) { + if (value !== appBarLayoutCommands && value !== appBarLayoutCustom) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.BadLayout", strings.badLayout); + } + + // In designer we may have to redraw it + var wasShown = false; + if (window.Windows && Windows.ApplicationModel && Windows.ApplicationModel.DesignMode && Windows.ApplicationModel.DesignMode.designModeEnabled && !this.hidden) { + this._hide(); + wasShown = true; + } + + if (!this.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.CannotChangeLayoutWhenVisible", strings.cannotChangeLayoutWhenVisible); + } + + // Set layout + this._layout = value; + + // Update our classes + if (this._layout === appBarLayoutCommands) { + // Add the appbar css class back + WinJS.Utilities.addClass(this._element, commandClass); + } else { + // Remove the appbar css class + WinJS.Utilities.removeClass(this._element, commandClass); + } + + // Show again if we hid ourselves for the designer + if (wasShown) { + this._show(); + } + }, + configurable: true + }, + + /// + /// Gets or sets value that indicates whether the AppBar is sticky. + /// This value is true if the AppBar is sticky; otherwise, it's false. + /// + sticky: { + get: function () { + return this._sticky; + }, + set: function (value) { + // If it doesn't change, do nothing + if (this._sticky === !!value) { + return; + } + + this._sticky = !!value; + + // Note: caller has to call .show() if they also want it visible + + // Show or hide the click eating div based on sticky value + if (!this.hidden && this._element.style.visibility === "visible") { + // May have changed sticky state for keyboard navigation + _updateAllAppBarsFirstAndFinalDiv(); + + // Ensure that the click eating div is in the correct state + if (this._sticky) { + if (!_isThereVisibleNonStickyBar()) { + thisWinUI._Overlay._hideClickEatingDivAppBar(); + } + } else { + thisWinUI._Overlay._showClickEatingDivAppBar(); + + if (this._shouldStealFocus()) { + _storePreviousFocus(document.activeElement); + this._setFocusToAppBar(); + } + } + } + } + }, + + /// + /// Sets the commands for the AppBar. This property accepts an array of AppBarCommand objects. + /// + commands: { + set: function (value) { + // Fail if trying to set when visible + if (!this.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.CannotChangeCommandsWhenVisible", WinJS.Resources._formatString(thisWinUI._Overlay.commonstrings.cannotChangeCommandsWhenVisible, "AppBar")); + } + + // Start from scratch + if (!this._initializing) { + // AppBarCommands defined in markup don't want to be disposed during initialization. + this._disposeChildren(); + } + WinJS.Utilities.empty(this._element); + + // In case they had only one... + if (!Array.isArray(value)) { + value = [value]; + } + + // Add commands + var len = value.length; + for (var i = 0; i < len; i++) { + this._addCommand(value[i]); + } + + // Need to measure all content commands after they have been added to the AppBar to make sure we allow + // user defined CSS rules based on the ancestor of the content command to take affect. + this._needToMeasure = true; + + // In case this is called from the constructor we wait for the AppBar to get added to the DOM. + // It should be added in the synchronous block in which the constructor was called. + WinJS.Utilities.Scheduler.schedule(this._layoutCommands, WinJS.Utilities.Scheduler.Priority.idle, this, "WinJS.AppBar._layoutCommands"); + } + }, + + getCommandById: function (id) { + /// + /// + /// Retrieves the command with the specified ID from this AppBar. + /// If more than one command is found, this method returns them all. + /// + /// Id of the command to return. + /// + /// The command found, an array of commands if more than one have the same ID, or null if no command is found. + /// + /// + var commands = this.element.querySelectorAll("#" + id); + for (var count = 0; count < commands.length; count++) { + // Any elements we generated this should succeed for, + // but remove missing ones just to be safe. + commands[count] = commands[count].winControl; + if (!commands[count]) { + commands.splice(count, 1); + } + } + + if (commands.length === 1) { + return commands[0]; + } else if (commands.length === 0) { + return null; + } + + return commands; + }, + + + showCommands: function (commands) { + /// + /// + /// Show the specified commands of the AppBar. + /// + /// + /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands. + /// + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.RequiresCommands", strings.requiresCommands); + } + + this._showCommands(commands); + }, + + + hideCommands: function (commands) { + /// + /// + /// Hides the specified commands of the AppBar. + /// + /// Required. Command or Commands to hide, either String, DOM elements, or WinJS objects. + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.RequiresCommands", strings.requiresCommands); + } + + this._hideCommands(commands); + }, + + + showOnlyCommands: function (commands) { + /// + /// + /// Show the specified commands, hiding all of the others in the AppBar. + /// + /// + /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands. + /// + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.RequiresCommands", strings.requiresCommands); + } + + this._showOnlyCommands(commands); + }, + + + show: function () { + /// + /// + /// Shows the AppBar, if hidden, regardless of other state + /// + /// + // Just wrap the private one, turning off keyboard invoked flag + this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow(). + this._keyboardInvoked = false; + this._doNotFocus = !!this.sticky; + this._show(); + }, + + _show: function AppBar_show() { + // Don't do anything if disabled + if (this.disabled) { + return; + } + + // Make sure everything fits before showing + this._layoutCommands(); + + this._scaleAppBar(); + + // If we're covered by a keyboard we look hidden, so we may have to jump up + if (this._keyboardObscured) { + // just make us look hidden so that show() gets called. + this._fakeHide = true; + this._keyboardObscured = false; + } + + // Regardless we're going to be in a CED state + if (!this.sticky) { + // Need click-eating div to be visible ASAP. + thisWinUI._Overlay._showClickEatingDivAppBar(); + } + + // If we are already animating, just remember this for later + if (this._element.winAnimating) { + this._doNext = "show"; + return false; + } + + // We call our base _baseShow because AppBar may need to override show + // "hiding" would need to cancel. + this._baseShow(); + + // Clean up tabbing behavior by making sure first and final divs are correct after showing. + if (!this.sticky && _isThereVisibleNonStickyBar()) { + _updateAllAppBarsFirstAndFinalDiv(); + } else { + this._updateFirstAndFinalDiv(); + } + + // Check if we should steal focus + if (!this._doNotFocus && this._shouldStealFocus()) { + // Store what had focus if nothing currently is stored + if (!thisWinUI.AppBar._ElementWithFocusPreviousToAppBar) { + _storePreviousFocus(document.activeElement); + } + + this._setFocusToAppBar(); + } + }, + + hide: function () { + /// + /// + /// Hides the AppBar. + /// + /// + // Just wrap the private one + this._writeProfilerMark("hide,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndHide(). + this._hide(); + }, + + _hide: function AppBar_hide() { + // If we're covered by a keyboard we already look hidden + if (this._keyboardObscured && !this._animating) { + this._keyboardObscured = false; + this._baseEndHide(); + } else { + // We call our base "_baseHide" because AppBar may need to override hide + this._baseHide(); + } + + // Determine if there are any AppBars that are visible. + // Set the focus to the next visible AppBar. + // If there are none, set the focus to the control stored in the cache, which + // is what had focus before the AppBars were given focus. + var appBars = document.querySelectorAll("." + appBarClass); + var areOtherAppBars = false; + var areOtherNonStickyAppBars = false; + var i; + for (i = 0; i < appBars.length; i++) { + var appBarControl = appBars[i].winControl; + if (appBarControl && !appBarControl.hidden && (appBarControl !== this)) { + areOtherAppBars = true; + + if (!appBarControl.sticky) { + areOtherNonStickyAppBars = true; + break; + } + } + } + + var settingsFlyouts = document.querySelectorAll("." + settingsFlyoutClass); + var areVisibleSettingsFlyouts = false; + for (i = 0; i < settingsFlyouts.length; i++) { + var settingsFlyoutControl = settingsFlyouts[i].winControl; + if (settingsFlyoutControl && !settingsFlyoutControl.hidden) { + areVisibleSettingsFlyouts = true; + break; + } + } + + if (!areOtherNonStickyAppBars && !areVisibleSettingsFlyouts) { + // Hide the click eating div because there are no other AppBars showing + thisWinUI._Overlay._hideClickEatingDivAppBar(); + } + + var that = this; + if (!areOtherAppBars) { + // Set focus to what had focus before showing the AppBar + if (thisWinUI.AppBar._ElementWithFocusPreviousToAppBar && + (!document.activeElement || thisWinUI.AppBar._isAppBarOrChild(document.activeElement))) { + _restorePreviousFocus(); + } + // Always clear the previous focus (to prevent temporary leaking of element) + thisWinUI.AppBar._ElementWithFocusPreviousToAppBar = null; + } else if (thisWinUI.AppBar._isWithinAppBarOrChild(document.activeElement, that.element)) { + // Set focus to next visible AppBar in DOM + + var foundCurrentAppBar = false; + for (i = 0; i <= appBars.length; i++) { + if (i === appBars.length) { + i = 0; + } + + var appBar = appBars[i]; + if (appBar === this.element) { + foundCurrentAppBar = true; + } else if (foundCurrentAppBar && !appBar.winControl.hidden) { + appBar.winControl._keyboardInvoked = !!this._keyboardInvoked; + appBar.winControl._setFocusToAppBar(); + break; + } + } + } + + // If we are hiding the last lightDismiss AppBar, + // then we need to update the tabStops of the other AppBars + if (!this.sticky && !_isThereVisibleNonStickyBar()) { + _updateAllAppBarsFirstAndFinalDiv(); + } + + // Reset these values + this._keyboardInvoked = false; + this._doNotFocus = false; + }, + + _dispose: function AppBar_dispose() { + WinJS.Utilities.disposeSubTree(this.element); + this._hide(); + }, + + _disposeChildren: function AppBar_disposeChildren() { + var appBarFirstDiv = this._element.querySelectorAll("." + firstDivClass); + appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null; + var appBarFinalDiv = this._element.querySelectorAll("." + finalDivClass); + appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null; + + var children = this.element.children; + var length = children.length; + for (var i = 0; i < length; i++) { + var element = children[i]; + if (element === appBarFirstDiv || element === appBarFinalDiv) { + continue; + } + if (this.layout === appBarLayoutCommands) { + element.winControl.dispose(); + } else { + WinJS.Utilities.disposeSubTree(element); + } + } + }, + + _handleKeyDown: function AppBar_handleKeyDown(event) { + // On Left/Right arrow keys, moves focus to previous/next AppbarCommand element. + // On "Esc" key press hide all flyouts and light dismiss AppBars. + + // Esc closes light-dismiss AppBars in all layouts but if the user has a text box with an IME + // candidate window open, we want to skip the ESC key event since it is handled by the IME. + // When the IME handles a key it sets event.keyCode to 229 for an easy check. + if (event.key === "Esc" && event.keyCode !== 229) { + event.preventDefault(); + event.stopPropagation(); + thisWinUI._Overlay._hideAllFlyouts(); + thisWinUI.AppBar._hideLightDismissAppBars(null, true); + } + + // Commands layout only. + if (this.layout === appBarLayoutCommands && !event.altKey) { + if (event.srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + return; //ignore left, right, home & end keys if focused element has win-interactive class. + } + var rtl = getComputedStyle(this._element).direction === "rtl"; + var leftKey = rtl ? "Right" : "Left"; + var rightKey = rtl ? "Left" : "Right"; + + if (event.key === leftKey || event.key == rightKey || event.key === "Home" || event.key === "End") { + + var focusableCommands = this._getFocusableCommandsInLogicalOrder(); + var targetCommand; + + if (focusableCommands.length) { + switch (event.key) { + case leftKey: + // Arrowing past the last command wraps back around to the first command. + var index = Math.max(-1, focusableCommands.focusedIndex - 1) + focusableCommands.length; + targetCommand = focusableCommands[index % focusableCommands.length].winControl.lastElementFocus; + break; + + case rightKey: + // Arrowing previous to the first command wraps back around to the last command. + var index = focusableCommands.focusedIndex + 1 + focusableCommands.length; + targetCommand = focusableCommands[index % focusableCommands.length].winControl.firstElementFocus; + break; + + case "Home": + var index = 0; + targetCommand = focusableCommands[index].winControl.firstElementFocus; + break; + + case "End": + var index = focusableCommands.length - 1; + targetCommand = focusableCommands[index].winControl.lastElementFocus; + break; + } + } + + if (targetCommand) { + targetCommand.focus(); + // Prevent default so that Trident doesn't resolve the keydown event on the newly focused element. + event.preventDefault(); + } + } + } + }, + + _getFocusableCommandsInLogicalOrder: function AppBar_getCommandsInLogicalOrder() { + // Function returns an array of all the contained AppBarCommands which are reachable by left/right arrows. + // + if (this.layout === appBarLayoutCommands) { + var selectionCommands = [], + globalCommands = [], + children = this._element.children, + globalCommandHasFocus = false, + focusedIndex = -1; + + var categorizeCommand = function (element, isGlobalCommand, containsFocus) { + // Helper function to categorize the element by AppBarCommand's section property. The passed in element could be the + // AppBarCommand, or the element referenced by a content AppBarCommands's firstElementFocus/lastElementFocus property. + // + if (isGlobalCommand) { + globalCommands.push(element); + if (containsFocus) { + focusedIndex = globalCommands.length - 1; + globalCommandHasFocus = true; + } + } else { + selectionCommands.push(element); + if (containsFocus) { + focusedIndex = selectionCommands.length - 1; + } + } + } + + // Separate commands into global and selection arrays. Find the current command with focus. + // Skip the first and last indices to avoid "firstDiv" and "finalDiv". + for (var i = 1, len = children.length; i < len - 1; i++) { + var element = children[i]; + if (element && element.winControl) { + var containsFocus = element.contains(document.activeElement); + // With the inclusion of content type commands, it may be possible to tab to elements in AppBarCommands that are not reachable by arrow keys. + // Regardless, when an AppBarCommand contains the element with focus, we just include the whole command so that we can determine which + // Commands are adjacent to it when looking for the next focus destination. + if (element.winControl._isFocusable() || containsFocus) { + var isGlobalCommand = (element.winControl.section === "global"); + categorizeCommand(element, isGlobalCommand, containsFocus); + } + } + } + + var focusableCommands = selectionCommands.concat(globalCommands); + focusableCommands.focusedIndex = globalCommandHasFocus ? focusedIndex + selectionCommands.length : focusedIndex; + return focusableCommands; + } + }, + + _assignAnimations: function AppBar_assignAnimations() { + // Make sure the animations are correct for our current placement + if (this._placement === appBarPlacementTop || this._placement === appBarPlacementBottom) { + // Top or Bottom + this._currentAnimateIn = this._animateSlideIn; + this._currentAnimateOut = this._animateSlideOut; + } else { + // Default for in the middle of nowhere + this._currentAnimateIn = this._baseAnimateIn; + this._currentAnimateOut = this._baseAnimateOut; + } + }, + + // AppBar animations + _animateSlideIn: function AppBar_animateSlideIn() { + var where, + height = this._element.offsetHeight; + // Get top/bottoms + this._checkPosition(); + // Get animation direction and clear other value + if (this._placement === appBarPlacementTop) { + // Top Bar + where = { top: "-" + height + "px", left: "0px" }; + this._element.style.bottom = "auto"; + } else { + // Bottom Bar + where = { top: height + "px", left: "0px" }; + this._element.style.top = "auto"; + } + + this._element.style.opacity = 1; + this._element.style.visibility = "visible"; + return WinJS.UI.Animation.showEdgeUI(this._element, where, { mechanism: "transition" }); + }, + + _animateSlideOut: function AppBar_animateSlideOut() { + var where, + height = this._element.offsetHeight; + if (this._placement === appBarPlacementTop) { + // Top Bar + where = { top: "-" + height + "px", left: "0px" }; + // Adjust for scrolling or soft keyboard positioning + this._element.style.top = (this._getTopOfVisualViewport()) + "px"; + } else { + // Bottom Bar + where = { top: height + "px", left: "0px" }; + // Adjust for scrolling or soft keyboard positioning + this._element.style.bottom = (this._getAdjustedBottom()) + "px"; + } + + return WinJS.UI.Animation.hideEdgeUI(this._element, where, { mechanism: "transition" }); + }, + + _isABottomAppBarInTheProcessOfShowing: function AppBar_isABottomAppBarInTheProcessOfShowing() { + var appbars = document.querySelectorAll("." + appBarClass + "." + bottomClass); + for (var i = 0; i < appbars.length; i++) { + if (appbars[i].winAnimating === "showing") { + return true; + } + } + + return false; + }, + + // Returns true if + // 1) This is a bottom appbar + // 2) No appbar has focus and a bottom appbar is not in the process of showing + // 3) What currently has focus is neither a bottom appbar nor a top appbar + // AND a bottom appbar is not in the process of showing. + // Otherwise Returns false + _shouldStealFocus: function AppBar_shouldStealFocus() { + var activeElementAppBar = thisWinUI.AppBar._isAppBarOrChild(document.activeElement); + if (this._element === activeElementAppBar) { + // This appbar already has focus and we don't want to move focus + // from where it currently is in this appbar. + return false; + } + if (this._placement === appBarPlacementBottom) { + // This is a bottom appbar + return true; + } + + var isBottomAppBarShowing = this._isABottomAppBarInTheProcessOfShowing(); + if (!activeElementAppBar) { + // Currently no appbar has focus. + // Return true if a bottom appbar is not in the process of showing. + return !isBottomAppBarShowing; + } + if (!activeElementAppBar.winControl) { + // This should not happen, but if it does we want to make sure + // that an AppBar ends up with focus. + return true; + } + if ((activeElementAppBar.winControl._placement !== appBarPlacementBottom) + && (activeElementAppBar.winControl._placement !== appBarPlacementTop) + && !isBottomAppBarShowing) { + // What currently has focus is neither a bottom appbar nor a top appbar + // -and- + // a bottom appbar is not in the process of showing. + return true; + } + return false + }, + + // Set focus to the passed in AppBar + _setFocusToAppBar: function AppBar_setFocusToAppBar() { + if (this._focusOnFirstFocusableElement()) { + // Prevent what is gaining focus from showing that it has focus, + // but only in the non-keyboard scenario. + if (!this._keyboardInvoked) { + thisWinUI._Overlay._addHideFocusClass(document.activeElement); + } + } else { + // No first element, set it to appbar itself + thisWinUI._Overlay._trySetActive(this._element); + } + }, + + _contentChanged: function AppBar_contentChanged() { + this._updateCommandsWidth(); + this._scaleAppBar(); + }, + + _scaleAppBar: function AppBar_scaleAppBar() { + // For commands layout AppBars only. If the total width of all AppBarCommands is greater than the + // width of the AppBar, add the win-reduced class to the AppBar element. + + if (this.layout === appBarLayoutCommands) { + // Measure AppBar's contents width, AppBar offsetWidth and AppBar padding: + var widthOfVisibleContent = this._getCommandsWidth(); + if (this._appBarTotalKnownWidth !== +this._appBarTotalKnownWidth) { + this._appBarTotalKnownWidth = this._scaleAppBarHelper(); + } + + if (widthOfVisibleContent <= this._appBarTotalKnownWidth) { + // Full size commands + WinJS.Utilities.removeClass(this._element, reducedClass); + } + else { + // Reduced size commands + WinJS.Utilities.addClass(this._element, reducedClass); + } + } + }, + + _scaleAppBarHelper: function AppBar_scaleAppBarHelper() { + // This exists as a single line function so that unit tests can + // overwrite it since they can't resize the WWA window. + return document.documentElement.clientWidth; + }, + + _updateCommandsWidth: function AppBar_updateCommandsWidth(commandSubSet) { + // Whenever Commands are hidden/shown in the Commands layout AppBar, this function is called + // to update the cached width measurement of all visible AppBarCommands in the AppBar. + if (this.layout === appBarLayoutCommands) { + var buttonsCount = 0; + var separatorsCount = 0; + var command; + var commands = commandSubSet; + + this._widthOfAllCommands = 0; + if (!commands) { + // Crawl the AppBar's inner HTML for the commands. + commands = this._getVisibleCommands(); + } + this._widthOfAllCommands = this._getCommandsWidth(commands); + } + }, + + _getCommandsWidth: function AppBar_getCommandsWidth(commandSubSet) { + if (!commandSubSet) { + // Return the cached width of all previously visible commands in the AppBar. + return this._widthOfAllCommands; + } else { + // Return the width of the specified subset. + var separatorsCount = 0; + var buttonsCount = 0; + var widthOfCommandSubSet = 0; + var command; + for (var i = 0, len = commandSubSet.length; i < len; i++) { + command = commandSubSet[i].winControl || commandSubSet[i]; + if (command._type === typeSeparator) { + separatorsCount++ + } else if (command._type !== typeContent) { + // button, toggle, and flyout types all have the same width. + buttonsCount++; + } else { + widthOfCommandSubSet += command._fullSizeWidth; + } + } + } + return widthOfCommandSubSet += (separatorsCount * separatorWidth) + (buttonsCount * buttonWidth); + }, + + _beginAnimateCommands: function AppBar_beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands) { + // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay. + // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show. + // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide. + // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide. + if (this.layout === appBarLayoutCommands) { + this._scaleCommandsAfterAnimations = false; + // Update our command counts now, to what they will be after we complete the animations. + var visibleCommandsAfterAnimations = otherVisibleCommands.concat(showCommands); + this._updateCommandsWidth(visibleCommandsAfterAnimations) + var changeInWidth = this._getCommandsWidth(showCommands) - this._getCommandsWidth(hideCommands); + if (changeInWidth > 0) { + // Width of contents is going to increase. If there won't be enough room to fit them all on a single row, + // reduce size of commands before the new content appears. + this._scaleAppBar(); + } else if (changeInWidth < 0) { + // Width of contents is going to decrease. Once animations are complete, check if + // there is enough available space to make the remaining commands full size. + this._scaleCommandsAfterAnimations = true; + } + } + }, + + _endAnimateCommands: function AppBar_endAnimateCommands() { + if (this._scaleCommandsAfterAnimations) { + this._scaleAppBar(); + } + }, + + _addCommand: function AppBar_addCommand(command) { + if (!command) { + throw new WinJS.ErrorFromName("WinJS.UI.AppBar.NullCommand", strings.nullCommand); + } + // See if it's a command already + if (!command._element) { + // Not a command, so assume it is options for the command's constructor. + command = new WinJS.UI.AppBarCommand(null, command); + } + // If we were attached somewhere else, detach us + if (command._element.parentElement) { + command._element.parentElement.removeChild(command._element); + } + // Reattach us + this._element.appendChild(command._element); + }, + + _measureContentCommands: function AppBar_measureContentCommands() { + // AppBar measures the width of content commands when they are first added + // and then caches that value to avoid additional layouts in the future. + + // Can't measure unless We're in the document body + if (document.body.contains(this.element)) { + this._needToMeasure = false; + + // Remove the reducedClass from AppBar to ensure fullsize measurements + var hadReducedClass = WinJS.Utilities.hasClass(this.element, reducedClass); + WinJS.Utilities.removeClass(this._element, reducedClass); + + // Make sure AppBar and children have width dimensions. + var prevAppBarDisplay = this.element.style.display; + var prevCommandDisplay; + this.element.style.display = ""; + + var commandElements = this._element.children; + var element; + for (var i = 0, len = commandElements.length; i < len; i++) { + element = commandElements[i]; + if (element.winControl && element.winControl._type === typeContent) { + // Make sure command has width dimensions before we measure. + prevCommandDisplay = element.style.display; + element.style.display = ""; + element.winControl._fullSizeWidth = WinJS.Utilities.getTotalWidth(element) || 0; + element.style.display = prevCommandDisplay; + } + } + + // Restore state to AppBar. + this.element.display = prevAppBarDisplay; + if (hadReducedClass) { + WinJS.Utilities.addClass(this._element, reducedClass); + } + } + }, + + // Performs any pending measurements on "content" type AppBarCommands and scales the AppBar to fit all AppBarCommand types accordingly. + _layoutCommands: function AppBar_layoutCommands() { + if (this._needToMeasure && this.layout === appBarLayoutCommands) { + this._measureContentCommands(); + this._contentChanged(); + } + }, + + // Get the top of the top appbars, this is always 0 because appbar uses + // -ms-device-fixed positioning. + _getTopOfVisualViewport: function AppBar_getTopOfVisualViewPort() { + return 0; + }, + + // Get the bottom of the bottom appbars, Bottom is just 0, if there's no IHM. + // When the IHM appears, the default behavior is to resize the view. If a resize + // happens, we can rely on -ms-device-fixed positioning and leave the bottom + // at 0. However if resize doesn't happen, then the keyboard obscures the appbar + // and we will need to adjust the bottom of the appbar by distance of the keyboard. + _getAdjustedBottom: function AppBar_getAdjustedBottom() { + // Need the distance the IHM moved as well. + return thisWinUI._Overlay._keyboardInfo._visibleDocBottomOffset; + }, + + _showingKeyboard: function AppBar_showingKeyboard(event) { + // Remember keyboard showing state. + this._keyboardObscured = false; + this._keyboardHiding = false; + + // If we're already moved, then ignore the whole thing + if (thisWinUI._Overlay._keyboardInfo._visible && this._alreadyInPlace()) { + return; + } + + this._keyboardShowing = true; + // If focus is in the appbar, don't cause scrolling. + if (!this.hidden && this._element.contains(document.activeElement)) { + event.ensuredFocusedElementInView = true; + } + + // Check if appbar moves or is obscured + if (!this.hidden && this._placement !== appBarPlacementTop && thisWinUI._Overlay._isFlyoutVisible()) { + // Remember that we're obscured + this._keyboardObscured = true; + } else { + // If not obscured, tag as showing and set timeout to restore us. + this._scrollHappened = false; + } + + // Also set timeout regardless, so we can clean up our _keyboardShowing flag. + var that = this; + setTimeout(function (e) { that._checkKeyboardTimer(e); }, thisWinUI._Overlay._keyboardInfo._animationShowLength + thisWinUI._Overlay._scrollTimeout); + }, + + _hidingKeyboard: function AppBar_hidingKeyboard(event) { + // We won't be obscured + this._keyboardObscured = false; + this._keyboardShowing = false; + this._keyboardHiding = true; + + // We'll either just reveal the current space or resize the window + if (!thisWinUI._Overlay._keyboardInfo._isResized) { + // If we're visible or only fake hiding under keyboard, or already animating, + // then snap us to our final position. + if (!this.hidden || this._fakeHide || this._animating) { + // Not resized, update our final position immediately + this._checkScrollPosition(); + this._element.style.display = ""; + this._fakeHide = false; + } + this._keyboardHiding = false; + } + // Else resize should clear keyboardHiding. + }, + + _resize: function AppBar_resize(event) { + // If we're hidden by the keyboard, then hide bottom appbar so it doesn't pop up twice when it scrolls + if (this._keyboardShowing) { + // Top is allowed to scroll off the top, but we don't want bottom to peek up when + // scrolled into view since we'll show it ourselves and don't want a stutter effect. + if (!this.hidden) { + if (this._placement !== appBarPlacementTop && !this._keyboardObscured) { + // If viewport doesn't match window, need to vanish momentarily so it doesn't scroll into view, + // however we don't want to toggle the visibility="hidden" hidden flag. + this._element.style.display = "none"; + } + } + // else if we're top we stay, and if there's a flyout, stay obscured by the keyboard. + } else if (this._keyboardHiding) { + this._keyboardHiding = false; + if (!this.hidden || this._animating) { + // Snap to final position + this._checkScrollPosition(); + this._element.style.display = ""; + this._fakeHide = false; + } + } + + // Check for horizontal window resizes. + this._appBarTotalKnownWidth = null; + if (!this.hidden) { + this._scaleAppBar(); + } + }, + + _checkKeyboardTimer: function AppBar_checkKeyboardTimer() { + if (!this._scrollHappened) { + this._mayEdgeBackIn(); + } + }, + + _manipulationChanged: function AppBar_manipulationChanged(event) { + // See if we're at the not manipulating state, and we had a scroll happen, + // which is implicitly after the keyboard animated. + if (event.currentState === 0 && this._scrollHappened) { + this._mayEdgeBackIn(); + } + }, + + _mayEdgeBackIn: function AppBar_mayEdgeBackIn(event) { + // May need to react to IHM being resized event + if (this._keyboardShowing) { + // If not top appbar or viewport isn't still at top, then need to show again + this._keyboardShowing = false; + // If obscured (flyout showing), don't change. + // If hidden, may be because _fakeHide was set in _resize. + // If bottom we have to move, or if top scrolled off screen. + if (!this._keyboardObscured && (!this.hidden || this._fakeHide) && + (this._placement !== appBarPlacementTop || thisWinUI._Overlay._keyboardInfo._visibleDocTop !== 0)) { + this._doNotFocus = true; + this._fakeHide = true; + this._show(); + } else { + // Ensure any animation dropped during the showing keyboard are caught up. + this._checkDoNext(); + } + } + this._scrollHappened = false; + }, + + // _checkPosition repositions the AppBar when the soft keyboard shows up + _checkPosition: function AppBar_checkPosition() { + // Bottom's the only one needing movement + if (this._placement === appBarPlacementBottom) { + this._element.style.bottom = this._getAdjustedBottom() + "px"; + } else if (this._placement === appBarPlacementTop) { + this._element.style.top = this._getTopOfVisualViewport() + "px"; + } + // else we don't touch custom positions + }, + + _checkScrollPosition: function AppBar_checkScrollPosition(event) { + // If keyboard's animating, then remember we may come in + if (this._keyboardShowing) { + // Tag that it's OK to edge back in. + this._scrollHappened = true; + return; + } + + // We only need to update if we're visible + if (!this.hidden || this._animating) { + this._checkPosition(); + // Ensure any animation dropped during the showing keyboard are caught up. + this._checkDoNext(); + } + }, + + _alreadyInPlace: function AppBar_alreadyInPlace() { + // See if we're already where we're supposed to be. + if (this._placement === appBarPlacementBottom) { + if (parseInt(this._element.style.bottom) === this._getAdjustedBottom()) { + return true; + } + } else if (this._placement === appBarPlacementTop) { + if (parseInt(this._element.style.top) === this._getTopOfVisualViewport()) { + return true; + } + } + // else we don't understand custom positioning + return false; + }, + + // If there is a visible non-sticky AppBar then it sets the firstDiv tabIndex to + // the minimum tabIndex found in the AppBars and finalDiv to the max found. + // Otherwise sets their tabIndex to -1 so they are not tab stops. + _updateFirstAndFinalDiv: function AppBar_updateFirstAndFinalDiv() { + var appBarFirstDiv = this._element.querySelectorAll("." + firstDivClass); + appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null; + + var appBarFinalDiv = this._element.querySelectorAll("." + finalDivClass); + appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null; + + // Remove the firstDiv & finalDiv if they are not at the appropriate locations + if (appBarFirstDiv && (this._element.children[0] != appBarFirstDiv)) { + appBarFirstDiv.parentNode.removeChild(appBarFirstDiv); + appBarFirstDiv = null; + } + if (appBarFinalDiv && (this._element.children[this._element.children.length - 1] != appBarFinalDiv)) { + appBarFinalDiv.parentNode.removeChild(appBarFinalDiv); + appBarFinalDiv = null; + } + + // Create and add the firstDiv & finalDiv if they don't already exist + if (!appBarFirstDiv) { + // Add a firstDiv that will be the first child of the appBar. + // On focus set focus to the previous appBar. + // The div should only be focusable if there are visible non-sticky AppBars. + appBarFirstDiv = document.createElement("div"); + // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus + appBarFirstDiv.style.display = "inline"; + appBarFirstDiv.className = firstDivClass; + appBarFirstDiv.tabIndex = -1; + appBarFirstDiv.setAttribute("aria-hidden", "true"); + appBarFirstDiv.addEventListener("focus", _setFocusToPreviousAppBar, true); + this._element.insertAdjacentElement("AfterBegin", appBarFirstDiv); + } + if (!appBarFinalDiv) { + // Add a finalDiv that will be the last child of the appBar. + // On focus set focus to the next appBar. + // The div should only be focusable if there are visible non-sticky AppBars. + appBarFinalDiv = document.createElement("div"); + // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus + appBarFinalDiv.style.display = "inline"; + appBarFinalDiv.className = finalDivClass; + appBarFinalDiv.tabIndex = -1; + appBarFinalDiv.setAttribute("aria-hidden", "true"); + appBarFinalDiv.addEventListener("focus", _setFocusToNextAppBar, true); + this._element.appendChild(appBarFinalDiv); + } + + // Update the tabIndex of the firstDiv & finalDiv + if (_isThereVisibleNonStickyBar()) { + var elms = this._element.getElementsByTagName("*"); + + if (appBarFirstDiv) { + appBarFirstDiv.tabIndex = WinJS.Utilities._getLowestTabIndexInList(elms); + } + if (appBarFinalDiv) { + appBarFinalDiv.tabIndex = WinJS.Utilities._getHighestTabIndexInList(elms); + } + } else { + if (appBarFirstDiv) { + appBarFirstDiv.tabIndex = -1; + } + if (appBarFinalDiv) { + appBarFinalDiv.tabIndex = -1; + } + } + }, + + _writeProfilerMark: function AppBar_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI.AppBar:" + this._id + ":" + text); + } + }); + + // Statics + AppBar._ElementWithFocusPreviousToAppBar = null; + + // Returns appbar element (or CED/sentinal) if the element or what had focus before the element (if a Flyout) is either: + // 1) an AppBar, + // 2) OR in the subtree of an AppBar, + // 3) OR an AppBar click eating div. + // Returns null otherwise. + AppBar._isAppBarOrChild = function (element) { + // If it's null, we can't do this + if (!element) { + return null; + } + + // click eating divs and sentinals should not have children + if (WinJS.Utilities.hasClass(element, thisWinUI._Overlay._clickEatingAppBarClass) || + WinJS.Utilities.hasClass(element, thisWinUI._Overlay._clickEatingFlyoutClass) || + WinJS.Utilities.hasClass(element, firstDivClass) || + WinJS.Utilities.hasClass(element, finalDivClass)) { + return element; + } + + while (element && element !== document) { + if (WinJS.Utilities.hasClass(element, appBarClass)) { + return element; + } + if (WinJS.Utilities.hasClass(element, "win-flyout") + && element != element.winControl._previousFocus) { + var flyoutControl = element.winControl; + // If _previousFocus was in a light dismissable AppBar, then this Flyout is considered of an extension of it and that AppBar will not close. + // Hook up a 'focusout' listener to this Flyout element to make sure that light dismiss AppBars close if focus moves anywhere other than back to an AppBar. + var appBarElement = thisWinUI.AppBar._isAppBarOrChild(flyoutControl._previousFocus); + if (appBarElement) { + flyoutControl.element.addEventListener('focusout', function focusOut(event) { + // Hides any open AppBars if the new activeElement is not in an AppBar. + _hideIfAllAppBarsLostFocus(); + flyoutControl.element.removeEventListener('focusout', focusOut, false); + }, false); + } + return appBarElement; + } + + element = element.parentNode; + } + + return null; + }; + + // Returns true if the element or what had focus before the element (if a Flyout) is either: + // 1) the appBar or subtree + // 2) OR in a flyout spawned by the appBar + // Returns false otherwise. + AppBar._isWithinAppBarOrChild = function (element, appBar) { + if (!element || !appBar) { + return false; + } + if (appBar.contains(element)) { + return true; + } + var flyout = thisWinUI._Overlay._getParentControlUsingClassName(element, "win-flyout"); + return (flyout && appBar.contains(flyout._previousFocus)); + }; + + // Overlay class calls this for global light dismiss events + AppBar._hideLightDismissAppBars = function (event, keyboardInvoked) { + var elements = document.querySelectorAll("." + appBarClass); + var len = elements.length; + var AppBars = []; + for (var i = 0; i < len; i++) { + var AppBar = elements[i].winControl; + if (AppBar && !AppBar.sticky && !AppBar.hidden) { + AppBars.push(AppBar); + } + } + + _hideAllBars(AppBars, keyboardInvoked); + }; + + var appBarSynchronizationPromise = WinJS.Promise.as(); + + // Callback for AppBar Edgy Event Command + AppBar._toggleAppBarEdgy = function (keyboardInvoked) { + var bars = _getDynamicBarsForEdgy(); + + // If they're all visible hide them, otherwise show them all + if (bars._visible && !bars._hidden) { + appBarSynchronizationPromise = appBarSynchronizationPromise.then(function () { + return _hideAllBars(bars, keyboardInvoked); + }); + return "hiding"; + } else { + appBarSynchronizationPromise = appBarSynchronizationPromise.then(function () { + return _showAllBars(bars, keyboardInvoked); + }); + return "showing"; + } + }; + + return AppBar; + }) + }); + +})(WinJS); + + +/// appbar,Flyout,Flyouts,Statics +(function flyoutInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Displays lightweight UI that is either informational, or requires user interaction. + /// Unlike a dialog, a Flyout can be light dismissed by clicking or tapping off of it. + /// + /// + /// + /// Flyout + /// + /// + /// ]]> + /// Raised just before showing a flyout. + /// Raised immediately after a flyout is fully shown. + /// Raised just before hiding a flyout. + /// Raised immediately after a flyout is fully hidden. + /// The Flyout control itself. + /// + /// + /// + Flyout: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + // Class Names + var appBarCommandClass = "win-command"; + var flyoutClass = "win-flyout"; + var flyoutLightClass = "win-ui-light"; + var menuClass = "win-menu"; + var scrollsClass = "win-scrolls"; + + var finalDivClass = "win-finaldiv"; + var firstDivClass = "win-firstdiv"; + + function getDimension(element, property) { + return parseFloat(element, window.getComputedStyle(element, null)[property]); + } + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/flyoutAriaLabel").value; }, + get noAnchor() { return WinJS.Resources._getWinJSString("ui/noAnchor").value; }, + get badPlacement() { return WinJS.Resources._getWinJSString("ui/badPlacement").value; }, + get badAlignment() { return WinJS.Resources._getWinJSString("ui/badAlignment").value; } + }; + + var Flyout = WinJS.Class.derive(WinJS.UI._Overlay, function Flyout_ctor(element, options) { + /// + /// + /// Creates a new Flyout control. + /// + /// + /// The DOM element that hosts the control. + /// + /// + /// The set of properties and values to apply to the new Flyout. + /// + /// The new Flyout control. + /// + /// + + // Simplify checking later + options = options || {}; + + // Make sure there's an input element + this._element = element || document.createElement("div"); + this._id = this._element.id || this._element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + this._baseFlyoutConstructor(this._element, options); + + var _elms = this._element.getElementsByTagName("*"); + var firstDiv = this._addFirstDiv(); + firstDiv.tabIndex = WinJS.Utilities._getLowestTabIndexInList(_elms); + var finalDiv = this._addFinalDiv(); + finalDiv.tabIndex = WinJS.Utilities._getHighestTabIndexInList(_elms); + + // Handle "esc" & "tab" key presses + this._element.addEventListener("keydown", this._handleKeyDown, true); + + this._writeProfilerMark("constructor,StopTM"); + return this; + }, { + _lastMaxHeight: null, + + _baseFlyoutConstructor: function Flyout_baseFlyoutContstructor(element, options) { + // Flyout constructor + + // We have some options with defaults + this._placement = "auto"; + this._alignment = "center"; + + // Call the base overlay constructor helper + this._baseOverlayConstructor(element, options); + + // Make a click eating div + thisWinUI._Overlay._createClickEatingDivFlyout(); + + // Start flyouts hidden + this._element.style.visibilty = "hidden"; + this._element.style.display = "none"; + + // Attach our css class + WinJS.Utilities.addClass(this._element, flyoutClass); + WinJS.Utilities.addClass(this._element, flyoutLightClass); + + // Make sure we have an ARIA role + var role = this._element.getAttribute("role"); + if (role === null || role === "" || role === undefined) { + if (WinJS.Utilities.hasClass(this._element, menuClass)) { + this._element.setAttribute("role", "menu"); + } else { + this._element.setAttribute("role", "dialog"); + } + } + var label = this._element.getAttribute("aria-label"); + if (label === null || label === "" || label === undefined) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + + // Base animation is popIn, but our flyout has different arguments + this._currentAnimateIn = this._flyoutAnimateIn; + this._currentAnimateOut = this._flyoutAnimateOut; + + // Make sure _Overlay event handlers are hooked up + this._addOverlayEventHandlers(true); + }, + + /// + /// Gets or sets the Flyout control's anchor. The anchor element is the HTML element which the Flyout originates from and is positioned relative to. + /// (This setting can be overridden when you call the show method.) + /// + /// + anchor: { + get: function () { + return this._anchor; + }, + set: function (value) { + this._anchor = value; + } + }, + + /// + /// Gets or sets the default placement of this Flyout. (This setting can be overridden when you call the show method.) + /// + /// + placement: { + get: function () { + return this._placement; + }, + set: function (value) { + if (value !== "top" && value !== "bottom" && value !== "left" && value !== "right" && value !== "auto") { + // Not a legal placement value + throw new WinJS.ErrorFromName("WinJS.UI.Flyout.BadPlacement", strings.badPlacement); + } + this._placement = value; + } + }, + + /// + /// Gets or sets the default alignment for this Flyout. (This setting can be overridden when you call the show method.) + /// + /// + alignment: { + get: function () { + return this._alignment; + }, + set: function (value) { + if (value !== "right" && value !== "left" && value !== "center") { + // Not a legal alignment value + throw new WinJS.ErrorFromName("WinJS.UI.Flyout.BadAlignment", strings.badAlignment); + } + this._alignment = value; + } + }, + + _dispose: function Flyout_dispose() { + WinJS.Utilities.disposeSubTree(this.element); + this._hide(); + this.anchor = null; + }, + + show: function (anchor, placement, alignment) { + /// + /// + /// Shows the Flyout, if hidden, regardless of other states. + /// + /// + /// The DOM element, or ID of a DOM element to anchor the Flyout, overriding the anchor property for this time only. + /// + /// + /// The placement of the Flyout to the anchor: 'auto' (default), 'top', 'bottom', 'left', or 'right'. This parameter overrides the placement property for this show only. + /// + /// + /// For 'top' or 'bottom' placement, the alignment of the Flyout to the anchor's edge: 'center' (default), 'left', or 'right'. + /// This parameter overrides the alignment property for this show only. + /// + /// + /// + this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow(). + // Just call private version to make appbar flags happy + this._show(anchor, placement, alignment); + }, + + _show: function Flyout_show(anchor, placement, alignment) { + this._baseFlyoutShow(anchor, placement, alignment); + }, + + hide: function () { + /// + /// + /// Hides the Flyout, if visible, regardless of other states. + /// + /// + /// + // Just wrap the private one, turning off keyboard invoked flag + this._writeProfilerMark("hide,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndHide(). + this._keyboardInvoked = false; + this._hide(); + }, + + _hide: function Flyout_hide() { + if (this._baseHide()) { + // Return focus if this or the flyout CED has focus + var active = document.activeElement; + if (this._previousFocus + && active + && (this._element.contains(active) + || WinJS.Utilities.hasClass(active, thisWinUI._Overlay._clickEatingFlyoutClass)) + && this._previousFocus.focus !== undefined) { + + // _isAppBarOrChild may return a CED or sentinal + var appBar = thisWinUI.AppBar._isAppBarOrChild(this._previousFocus); + if (!appBar || (appBar.winControl && !appBar.winControl.hidden && !appBar.winAnimating)) { + // Don't move focus back to a appBar that is hidden + // We cannot rely on element.style.visibility because it will be visible while animating + var role = this._previousFocus.getAttribute("role"); + var fHideRole = thisWinUI._Overlay._keyboardInfo._visible && !this._keyboardWasUp; + if (fHideRole) { + // Convince IHM to dismiss because it only came up after the flyout was up. + // Change aria role and back to get IHM to dismiss. + this._previousFocus.setAttribute("role", ""); + } + + if (this._keyboardInvoked) { + this._previousFocus.focus(); + } else { + thisWinUI._Overlay._trySetActive(this._previousFocus); + } + active = document.activeElement; + + if (fHideRole) { + // Restore the role so that css is applied correctly + var previousFocus = this._previousFocus; + if (previousFocus) { + setImmediate(function () { + previousFocus.setAttribute("role", role); + }); + } + } + } + + // If the anchor gained focus we want to hide the focus in the non-keyboarding scenario + if (!this._keyboardInvoked && (this._previousFocus === active) && appBar && active) { + thisWinUI._Overlay._addHideFocusClass(active); + } + } + + this._previousFocus = null; + + // Need click-eating div to be hidden if there are no other visible flyouts + if (!this._isThereVisibleFlyout()) { + thisWinUI._Overlay._hideClickEatingDivFlyout(); + } + } + }, + + _baseFlyoutShow: function Flyout_baseFlyoutShow(anchor, placement, alignment) { + // Don't do anything if disabled + if (this.disabled) { + return; + } + // Pick up defaults + if (!anchor) { + anchor = this._anchor; + } + if (!placement) { + placement = this._placement; + } + if (!alignment) { + alignment = this._alignment; + } + + // Dereference the anchor if necessary + if (typeof anchor === "string") { + anchor = document.getElementById(anchor); + } else if (anchor && anchor.element) { + anchor = anchor.element; + } + + // We expect an anchor + if (!anchor) { + // If we have _nextLeft, etc., then we were continuing an old animation, so that's OK + if (!this._retryLast) { + throw new WinJS.ErrorFromName("WinJS.UI.Flyout.NoAnchor", strings.noAnchor); + } + // Last call was incomplete, so use the previous _current values. + this._retryLast = null; + } else { + // Remember the anchor so that if we lose focus we can go back + this._currentAnchor = anchor; + // Remember current values + this._currentPlacement = placement; + this._currentAlignment = alignment; + } + + // Need click-eating div to be visible, no matter what + if (!this._sticky) { + thisWinUI._Overlay._showClickEatingDivFlyout(); + } + + // If we're animating (eg baseShow is going to fail), then don't mess up our current state. + // Queue us up to wait for current animation to finish first. + if (this._element.winAnimating) { + this._doNext = "show"; + this._retryLast = true; + return; + } + + // We call our base _baseShow to handle the actual animation + if (this._baseShow()) { + // (_baseShow shouldn't ever fail because we tested winAnimating above). + if (!WinJS.Utilities.hasClass(this.element, "win-menu")) { + // Verify that the firstDiv is in the correct location. + // Move it to the correct location or add it if not. + var _elms = this._element.getElementsByTagName("*"); + var firstDiv = this.element.querySelectorAll(".win-first"); + if (this.element.children.length && !WinJS.Utilities.hasClass(this.element.children[0], firstDivClass)) { + if (firstDiv && firstDiv.length > 0) { + firstDiv.item(0).parentNode.removeChild(firstDiv.item(0)); + } + + firstDiv = this._addFirstDiv(); + } + firstDiv.tabIndex = WinJS.Utilities._getLowestTabIndexInList(_elms); + + // Verify that the finalDiv is in the correct location. + // Move it to the correct location or add it if not. + var finalDiv = this.element.querySelectorAll(".win-final"); + if (!WinJS.Utilities.hasClass(this.element.children[this.element.children.length - 1], finalDivClass)) { + if (finalDiv && finalDiv.length > 0) { + finalDiv.item(0).parentNode.removeChild(finalDiv.item(0)); + } + + finalDiv = this._addFinalDiv(); + } + finalDiv.tabIndex = WinJS.Utilities._getHighestTabIndexInList(_elms); + } + + // Hide all other flyouts + this._hideAllOtherFlyouts(this); + + // Store what had focus before showing the Flyout. + // This must happen after we hide all other flyouts so that we store the correct element. + this._previousFocus = document.activeElement; + } + }, + + _endShow: function Flyout_endShow() { + // Remember if the IHM was up since we may need to hide it when the flyout hides. + // This check needs to happen after the IHM has a chance to hide itself after we force hide + // all other visible Flyouts. + this._keyboardWasUp = thisWinUI._Overlay._keyboardInfo._visible; + + if (!WinJS.Utilities.hasClass(this.element, "win-menu")) { + // Put focus on the first child in the Flyout + this._focusOnFirstFocusableElementOrThis(); + + // Prevent what is gaining focus from showing that it has focus + thisWinUI._Overlay._addHideFocusClass(document.activeElement); + } else { + // Make sure the menu has focus, but don't show a focus rect + thisWinUI._Overlay._trySetActive(this._element); + } + }, + + // Find our new flyout position. + _findPosition: function Flyout_findPosition() { + this._nextHeight = null; + this._keyboardMovedUs = false; + this._hasScrolls = false; + this._keyboardSquishedUs = 0; + + // Make sure menu toggles behave + if (this._checkToggle) { + this._checkToggle(); + } + + // Update margins for this alignment and remove old scrolling + this._updateAdjustments(this._currentAlignment); + + // Set up the new position, and prep the offset for showPopup + this._getTopLeft(); + // Panning top offset is calculated top + this._scrollTop = this._nextTop; + + // Adjust position + if (this._nextTop < 0) { + // Need to attach to bottom + this._element.style.bottom = "0px"; + this._element.style.top = "auto"; + } else { + // Normal, attach to top + this._element.style.top = this._nextTop + "px"; + this._element.style.bottom = "auto"; + } + if (this._nextLeft < 0) { + // Overran right, attach to right + this._element.style.right = "0px"; + this._element.style.left = "auto"; + } else { + // Normal, attach to left + this._element.style.left = this._nextLeft + "px"; + this._element.style.right = "auto"; + } + + // Adjust height/scrollbar + if (this._nextHeight !== null) { + WinJS.Utilities.addClass(this._element, scrollsClass); + this._lastMaxHeight = this._element.style.maxHeight; + this._element.style.maxHeight = this._nextHeight + "px"; + this._nextBottom = this._nextTop + this._nextHeight; + this._hasScrolls = true; + } + + // May need to adjust if the IHM is showing. + if (thisWinUI._Overlay._keyboardInfo._visible) { + // Use keyboard logic + this._checkKeyboardFit(); + + if (this._keyboardMovedUs) { + this._adjustForKeyboard(); + } + } + }, + + // This determines our positioning. We have 5 modes, the 1st four are explicit, the last is automatic: + // * top - position explicitly on the top of the anchor, shrinking and adding scrollbar as needed. + // * bottom - position explicitly below the anchor, shrinking and adding scrollbar as needed. + // * left - position left of the anchor, shrinking and adding a vertical scrollbar as needed. + // * right - position right of the anchor, shrinking and adding a vertical scroolbar as needed. + // * auto - Automatic placement. + // Auto tests the height of the anchor and the flyout. For consistency in orientation, we imagine + // that the anchor is placed in the vertical center of the display. If the flyout would fit above + // that centered anchor, then we will place the flyout vertically in relation to the anchor, otherwise + // placement will be horizontal. + // Vertical auto placement will be positioned on top of the anchor if room, otherwise below the anchor. + // - this is because touch users would be more likely to obscure flyouts below the anchor. + // Horizontal auto placement will be positioned to the left of the anchor if room, otherwise to the right. + // - this is because right handed users would be more likely to obscure a flyout on the right of the anchor. + // Auto placement will add a vertical scrollbar if necessary. + _getTopLeft: function Flyout_getTopLeft() { + var anchorRawRectangle = this._currentAnchor.getBoundingClientRect(), + flyout = {}, + anchor = {}; + + // Adjust for the anchor's margins. + anchor.top = anchorRawRectangle.top; + anchor.bottom = anchorRawRectangle.bottom; + anchor.left = anchorRawRectangle.left; + anchor.right = anchorRawRectangle.right; + anchor.height = anchor.bottom - anchor.top; + anchor.width = anchor.right - anchor.left; + + // Get our flyout and margins, note that getDimension calls + // window.getComputedStyle, which ensures layout is updated. + flyout.marginTop = getDimension(this._element, "marginTop"); + flyout.marginBottom = getDimension(this._element, "marginBottom"); + flyout.marginLeft = getDimension(this._element, "marginLeft"); + flyout.marginRight = getDimension(this._element, "marginRight"); + flyout.width = WinJS.Utilities.getTotalWidth(this._element); + flyout.height = WinJS.Utilities.getTotalHeight(this._element); + flyout.innerWidth = WinJS.Utilities.getContentWidth(this._element); + flyout.innerHeight = WinJS.Utilities.getContentHeight(this._element); + this._nextMarginPadding = (flyout.height - flyout.innerHeight); + + // Check fit for requested this._currentPlacement, doing fallback if necessary + switch (this._currentPlacement) { + case "top": + if (!this._fitTop(anchor, flyout)) { + // Didn't fit, needs scrollbar + this._nextTop = 0; + this._nextHeight = anchor.top - this._nextMarginPadding; + } + this._centerHorizontally(anchor, flyout, this._currentAlignment); + break; + case "bottom": + if (!this._fitBottom(anchor, flyout)) { + // Didn't fit, needs scrollbar + this._nextTop = -1; + this._nextHeight = thisWinUI._Overlay._keyboardInfo._visibleDocHeight - anchor.bottom - this._nextMarginPadding; + } + this._centerHorizontally(anchor, flyout, this._currentAlignment); + break; + case "left": + if (!this._fitLeft(anchor, flyout)) { + // Didn't fit, just shove it to edge + this._nextLeft = 0; + } + this._centerVertically(anchor, flyout); + break; + case "right": + if (!this._fitRight(anchor, flyout)) { + // Didn't fit,just shove it to edge + this._nextLeft = -1; + } + this._centerVertically(anchor, flyout); + break; + case "auto": + // Auto, if the anchor was in the vertical center of the display would we fit above it? + if (this._sometimesFitsAbove(anchor, flyout)) { + // It will fit above or below the anchor + if (!this._fitTop(anchor, flyout)) { + // Didn't fit above (preferred), so go below. + this._fitBottom(anchor, flyout); + } + this._centerHorizontally(anchor, flyout, this._currentAlignment); + } else { + // Won't fit above or below, try a side + if (!this._fitLeft(anchor, flyout) && + !this._fitRight(anchor, flyout)) { + // Didn't fit left or right either, is top or bottom bigger? + if (this._topHasMoreRoom(anchor)) { + // Top, won't fit, needs scrollbar + this._nextTop = 0; + this._nextHeight = anchor.top - this._nextMarginPadding; + } else { + // Bottom, won't fit, needs scrollbar + this._nextTop = -1; + this._nextHeight = thisWinUI._Overlay._keyboardInfo._visibleDocHeight - anchor.bottom - this._nextMarginPadding; + } + this._centerHorizontally(anchor, flyout, this._currentAlignment); + } else { + this._centerVertically(anchor, flyout); + } + } + break; + default: + // Not a legal this._currentPlacement value + throw new WinJS.ErrorFromName("WinJS.UI.Flyout.BadPlacement", strings.badPlacement); + } + + // Remember "bottom" in case we need to consider keyboard later, only tested for top-pinned bars + this._nextBottom = this._nextTop + flyout.height; + }, + + // If the anchor is centered vertically, would the flyout fit above it? + _sometimesFitsAbove: function Flyout_sometimesFitsAbove(anchor, flyout) { + return ((thisWinUI._Overlay._keyboardInfo._visibleDocHeight - anchor.height) / 2) >= flyout.height; + }, + + _topHasMoreRoom: function Flyout_topHasMoreRoom(anchor) { + return anchor.top > thisWinUI._Overlay._keyboardInfo._visibleDocHeight - anchor.bottom; + }, + + // See if we can fit in various places, fitting in the main view, + // ignoring viewport changes, like for the IHM. + _fitTop: function Flyout_fitTop(anchor, flyout) { + this._nextTop = anchor.top - flyout.height; + this._nextAnimOffset = { top: "50px", left: "0px", keyframe: "WinJS-showFlyoutTop" }; + return (this._nextTop >= 0 && + this._nextTop + flyout.height <= thisWinUI._Overlay._keyboardInfo._visibleDocBottom); + }, + + _fitBottom: function Flyout_fitBottom(anchor, flyout) { + this._nextTop = anchor.bottom; + this._nextAnimOffset = { top: "-50px", left: "0px", keyframe: "WinJS-showFlyoutBottom" }; + return (this._nextTop >= 0 && + this._nextTop + flyout.height <= thisWinUI._Overlay._keyboardInfo._visibleDocBottom); + }, + + _fitLeft: function Flyout_fitLeft(anchor, flyout) { + this._nextLeft = anchor.left - flyout.width; + this._nextAnimOffset = { top: "0px", left: "50px", keyframe: "WinJS-showFlyoutLeft" }; + return (this._nextLeft >= 0 && this._nextLeft + flyout.width <= thisWinUI._Overlay._keyboardInfo._visualViewportWidth); + }, + + _fitRight: function Flyout_fitRight(anchor, flyout) { + this._nextLeft = anchor.right; + this._nextAnimOffset = { top: "0px", left: "-50px", keyframe: "WinJS-showFlyoutRight" }; + return (this._nextLeft >= 0 && this._nextLeft + flyout.width <= thisWinUI._Overlay._keyboardInfo._visualViewportWidth); + }, + + _centerVertically: function Flyout_centerVertically(anchor, flyout) { + this._nextTop = anchor.top + anchor.height / 2 - flyout.height / 2; + if (this._nextTop < 0) { + this._nextTop = 0; + } else if (this._nextTop + flyout.height >= thisWinUI._Overlay._keyboardInfo._visibleDocBottom) { + // Flag to put on bottom + this._nextTop = -1; + } + }, + + _centerHorizontally: function Flyout_centerHorizontally(anchor, flyout, alignment) { + if (alignment === "center") { + this._nextLeft = anchor.left + anchor.width / 2 - flyout.width / 2; + } else if (alignment === "left") { + this._nextLeft = anchor.left; + } else if (alignment === "right") { + this._nextLeft = anchor.right - flyout.width; + } else { + throw new WinJS.ErrorFromName("WinJS.UI.Flyout.BadAlignment", strings.badAlignment); + } + if (this._nextLeft < 0) { + this._nextLeft = 0; + } else if (this._nextLeft + flyout.width >= document.documentElement.clientWidth) { + // flag to put on right + this._nextLeft = -1; + } + }, + + _updateAdjustments: function Flyout_updateAdjustments(alignment) { + // Move to 0,0 in case it is off screen, so that it lays out at a reasonable size + this._element.style.top = "0px"; + this._element.style.bottom = "auto"; + this._element.style.left = "0px"; + this._element.style.right = "auto"; + + // Scrolling may not be necessary + WinJS.Utilities.removeClass(this._element, scrollsClass); + if (this._lastMaxHeight !== null) { + this._element.style.maxHeight = this._lastMaxHeight; + this._lastMaxHeight = null; + } + // Alignment + if (alignment === "center") { + WinJS.Utilities.removeClass(this._element, "win-leftalign"); + WinJS.Utilities.removeClass(this._element, "win-rightalign"); + } else if (alignment === "left") { + WinJS.Utilities.addClass(this._element, "win-leftalign"); + WinJS.Utilities.removeClass(this._element, "win-rightalign"); + } else if (alignment === "right") { + WinJS.Utilities.addClass(this._element, "win-rightalign"); + WinJS.Utilities.removeClass(this._element, "win-leftalign"); + } + }, + + _showingKeyboard: function Flyout_showingKeyboard(event) { + if (this.hidden) { + return; + } + + // The only way that we can be showing a keyboard when a flyout is up is because the input was + // in the flyout itself, in which case we'll be moving ourselves. There is no practical way + // for the application to override this as the focused element is in our flyout. + event.ensuredFocusedElementInView = true; + + // See if the keyboard is going to force us to move + this._checkKeyboardFit(); + + if (this._keyboardMovedUs) { + // Pop out immediately, then move to new spot + this._element.style.opacity = 0; + var that = this; + setTimeout(function () { that._adjustForKeyboard(); that._baseAnimateIn(); }, thisWinUI._Overlay._keyboardInfo._animationShowLength); + } + }, + + _resize: function Flyout_resize(event) { + // If hidden and not busy animating, then nothing to do + if (this.hidden && !this._animating) { + return; + } + + // This should only happen if the IHM is dismissing, + // the only other way is for viewstate changes, which + // would dismiss any flyout. + if (this._keyboardHiding) { + // Hiding keyboard, update our position, giving the anchor a chance to update first. + var that = this; + setImmediate(function () { that._findPosition(); }); + this._keyboardHiding = false; + } + }, + + _checkKeyboardFit: function Flyout_checkKeyboardFit() { + // Check for moving to fit keyboard: + // - Too Tall, above top, or below bottom. + var height = WinJS.Utilities.getTotalHeight(this._element); + var viewportHeight = thisWinUI._Overlay._keyboardInfo._visibleDocHeight - this._nextMarginPadding; + if (height > viewportHeight) { + // Too Tall, pin to top with max height + this._keyboardMovedUs = true; + this._scrollTop = 0; + this._keyboardSquishedUs = viewportHeight; + } else if (this._nextTop === -1) { + // Pinned to bottom counts as moved + this._keyboardMovedUs = true; + } else if (this._nextTop < 0) { + // Above the top of the viewport + this._scrollTop = 0; + this._keyboardMovedUs = true; + } else if (this._nextBottom > thisWinUI._Overlay._keyboardInfo._visibleDocBottom) { + // Below the bottom of the viewport + this._scrollTop = -1; + this._keyboardMovedUs = true; + } + }, + + _adjustForKeyboard: function Flyout_adjustForKeyboard() { + // Keyboard moved us, update our metrics as needed + if (this._keyboardSquishedUs) { + // Add scrollbar if we didn't already have scrollsClass + if (!this._hasScrolls) { + WinJS.Utilities.addClass(this._element, scrollsClass); + this._lastMaxHeight = this._element.style.maxHeight; + } + // Adjust height + this._element.style.maxHeight = this._keyboardSquishedUs + "px"; + } + + // Update top/bottom + this._checkScrollPosition(true); + }, + + _hidingKeyboard: function Flyout_hidingKeyboard(event) { + // If we aren't visible and not animating, or haven't been repositioned, then nothing to do + // We don't know if the keyboard moved the anchor, so _keyboardMovedUs doesn't help here + if (this.hidden && !this._animating) { + return; + } + + // Snap to the final position + // We'll either just reveal the current space or resize the window + if (thisWinUI._Overlay._keyboardInfo._isResized) { + // Flag resize that we'll need an updated position + this._keyboardHiding = true; + } else { + // Not resized, update our final position, giving the anchor a chance to update first. + var that = this; + setImmediate(function () { that._findPosition(); }); + } + }, + + _checkScrollPosition: function Flyout_checkScrollPosition(showing) { + if (this.hidden && !showing) { + return; + } + + // May need to adjust top by viewport offset + if (this._scrollTop < 0) { + // Need to attach to bottom + this._element.style.bottom = thisWinUI._Overlay._keyboardInfo._visibleDocBottomOffset + "px"; + this._element.style.top = "auto"; + } else { + // Normal, attach to top + this._element.style.top = "0px"; + this._element.style.bottom = "auto"; + } + }, + + // AppBar flyout animations + _flyoutAnimateIn: function Flyout_flyoutAnimateIn() { + if (this._keyboardMovedUs) { + return this._baseAnimateIn(); + } else { + this._element.style.opacity = 1; + this._element.style.visibility = "visible"; + return WinJS.UI.Animation.showPopup(this._element, this._nextAnimOffset); + } + }, + + _flyoutAnimateOut: function Flyout_flyoutAnimateOut() { + if (this._keyboardMovedUs) { + return this._baseAnimateOut(); + } else { + this._element.style.opacity = 0; + return WinJS.UI.Animation.hidePopup(this._element, this._nextAnimOffset); + } + }, + + // Hide all other flyouts besides this one + _hideAllOtherFlyouts: function Flyout_hideAllOtherFlyouts(thisFlyout) { + var flyouts = document.querySelectorAll(".win-flyout"); + for (var i = 0; i < flyouts.length; i++) { + var flyoutControl = flyouts[i].winControl; + if (flyoutControl && !flyoutControl.hidden && (flyoutControl !== thisFlyout)) { + flyoutControl.hide(); + } + } + }, + + // Returns true if there is a flyout in the DOM that is not hidden + _isThereVisibleFlyout: function Flyout_isThereVisibleFlyout() { + var flyouts = document.querySelectorAll(".win-flyout"); + for (var i = 0; i < flyouts.length; i++) { + var flyoutControl = flyouts[i].winControl; + if (flyoutControl && !flyoutControl.hidden) { + return true; + } + } + + return false; + }, + + _handleKeyDown: function Flyout_handleKeyDown(event) { + // Escape closes flyouts but if the user has a text box with an IME candidate + // window open, we want to skip the ESC key event since it is handled by the IME. + // When the IME handles a key it sets event.keyCode to 229 for an easy check. + if (event.key === "Esc" && event.keyCode !== 229) { + // Show a focus rect on what we move focus to + event.preventDefault(); + event.stopPropagation(); + this.winControl._keyboardInvoked = true; + this.winControl._hide(); + } else if ((event.key === "Spacebar" || event.key === "Enter") + && (this === document.activeElement)) { + event.preventDefault(); + event.stopPropagation(); + this.winControl.hide(); + } else if (event.shiftKey && event.key === "Tab" + && this === document.activeElement + && !event.altKey && !event.ctrlKey && !event.metaKey) { + event.preventDefault(); + event.stopPropagation(); + this.winControl._focusOnLastFocusableElementOrThis(); + } + }, + + // Create and add a new first div as the first child + _addFirstDiv: function Flyout_addFirstDiv() { + var firstDiv = document.createElement("div"); + firstDiv.className = firstDivClass; + firstDiv.style.display = "inline"; + firstDiv.setAttribute("role", "menuitem"); + firstDiv.setAttribute("aria-hidden", "true"); + + this._element.insertAdjacentElement("AfterBegin", firstDiv); + var that = this; + firstDiv.addEventListener("focus", function () { that._focusOnLastFocusableElementOrThis(); }, false); + + return firstDiv; + }, + + // Create and add a new final div as the last child + _addFinalDiv: function Flyout_addFinalDiv() { + var finalDiv = document.createElement("div"); + finalDiv.className = finalDivClass; + finalDiv.style.display = "inline"; + finalDiv.setAttribute("role", "menuitem"); + finalDiv.setAttribute("aria-hidden", "true"); + + this._element.appendChild(finalDiv); + var that = this; + finalDiv.addEventListener("focus", function () { that._focusOnFirstFocusableElementOrThis(); }, false); + + return finalDiv; + }, + + _writeProfilerMark: function Flyout_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI.Flyout:" + this._id + ":" + text); + } + }); + return Flyout; + }) + }); + +})(WinJS); + +// Menu +/// Menu,Menus,Flyout,Flyouts,Statics +(function menuInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Represents a menu flyout for displaying commands. + /// + /// + /// Menu + /// + /// + /// + /// + /// ]]> + /// Raised just before showing a menu. + /// Raised immediately after a menu is fully shown. + /// Raised just before hiding a menu. + /// Raised immediately after a menu is fully hidden. + /// The Menu control itself + /// + /// + /// + Menu: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + // Class Names + var menuClass = "win-menu"; + var menuToggleClass = "win-menu-toggle"; + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/menuAriaLabel").value; }, + get requiresCommands() { return WinJS.Resources._getWinJSString("ui/requiresCommands").value; }, + get nullCommand() { return WinJS.Resources._getWinJSString("ui/nullCommand").value; }, + }; + + var Menu = WinJS.Class.derive(WinJS.UI.Flyout, function Menu_ctor(element, options) { + /// + /// + /// Creates a new Menu control. + /// + /// + /// The DOM element that will host the control. + /// + /// + /// The set of properties and values to apply to the control. + /// + /// The new Menu control. + /// + /// + + // We need to be built on top of a Flyout, so stomp on the user's input + options = options || {}; + + // Make sure there's an input element + this._element = element || document.createElement("div"); + this._id = this._element.id || this._element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + // validate that if they didn't set commands, in which + // case any HTML only contains commands. Do this first + // so that we don't leave partial Menus in the DOM. + if (!options.commands && this._element) { + // Shallow copy object so we can modify it. + options = WinJS.Utilities._shallowCopy(options); + options.commands = this._verifyCommandsOnly(this._element, "WinJS.UI.MenuCommand"); + } + + // Remember aria role in case base constructor changes it + var role = this._element ? this._element.getAttribute("role") : null; + var label = this._element ? this._element.getAttribute("aria-label") : null; + + // Call the base overlay constructor helper + this._baseFlyoutConstructor(this._element, options); + + // Make sure we have an ARIA role + if (role === null || role === "" || role === undefined) { + this._element.setAttribute("role", "menu"); + } + if (label === null || label === "" || label === undefined) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + + // Handle "esc" & "up/down" key presses + this._element.addEventListener("keydown", this._handleKeyDown, true); + + // Attach our css class + WinJS.Utilities.addClass(this._element, menuClass); + + // Need to set our commands, making sure we're hidden first + this.hide(); + this._writeProfilerMark("constructor,StopTM"); + }, { + // Public Properties + + /// + /// Sets the MenuCommand objects that appear in the Menu. You can set this to a single MenuCommand or an array of MenuCommand objects. + /// + /// + commands: { + set: function (value) { + // Fail if trying to set when visible + if (!this.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.Menu.CannotChangeCommandsWhenVisible", WinJS.Resources._formatString(thisWinUI._Overlay.commonstrings.cannotChangeCommandsWhenVisible, "Menu")); + } + + // Start from scratch + WinJS.Utilities.empty(this._element); + + // In case they had only one... + if (!Array.isArray(value)) { + value = [value]; + } + + // Add commands + var len = value.length; + for (var i = 0; i < len; i++) { + this._addCommand(value[i]); + } + } + }, + + getCommandById: function (id) { + /// + /// + /// Retrieve the command with the specified ID from this Menu. If more than one command is found, all are returned. + /// + /// The ID of the command to find. + /// + /// The command found, an array of commands if more than one have the same ID, or null if no command is found. + /// + /// + /// + var commands = this.element.querySelectorAll("#" + id); + for (var count = 0; count < commands.length; count++) { + // Any elements we generated this should succeed for, + // but remove missing ones just to be safe. + commands[count] = commands[count].winControl; + if (!commands[count]) { + commands.splice(count, 1); + } + } + + if (commands.length === 1) { + return commands[0]; + } else if (commands.length === 0) { + return null; + } + + return commands; + }, + + + showCommands: function (commands) { + /// + /// + /// Shows the specified commands of the Menu. + /// + /// + /// The commands to show. The array elements may be Menu objects, or the string identifiers (IDs) of commands. + /// + /// + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands); + } + + this._showCommands(commands, true); + }, + + hideCommands: function (commands) { + /// + /// + /// Hides the Menu. + /// + /// + /// Required. Command or Commands to hide, either String, DOM elements, or WinJS objects. + /// + /// + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands); + } + + this._hideCommands(commands, true); + }, + + showOnlyCommands: function (commands) { + /// + /// + /// Shows the specified commands of the Menu while hiding all other commands. + /// + /// + /// The commands to show. The array elements may be MenuCommand objects, or the string identifiers (IDs) of commands. + /// + /// + /// + if (!commands) { + throw new WinJS.ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands); + } + + this._showOnlyCommands(commands, true); + }, + + show: function (anchor, placement, alignment) { + /// + /// + /// Shows the Menu, if hidden, regardless of other states. + /// + /// + /// The DOM element, or ID of a DOM element, to anchor the Menu. This parameter overrides the anchor property for this method call only. + /// + /// + /// The placement of the Menu to the anchor: 'auto' (default), 'top', 'bottom', 'left', or 'right'. This parameter overrides the placement + /// property for this method call only. + /// + /// + /// For 'top' or 'bottom' placement, the alignment of the Menu to the anchor's edge: 'center' (default), 'left', or 'right'. This parameter + /// overrides the alignment property for this method call only. + /// + /// + /// + // Just call private version to make appbar flags happy + this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow(). + this._show(anchor, placement, alignment); + }, + + _show: function Menu_show(anchor, placement, alignment) { + // Before we show, we also need to check for children flyouts needing anchors + this._checkForFlyoutCommands(); + + // Call flyout show + this._baseFlyoutShow(anchor, placement, alignment); + + // We need to check for toggles after we send the beforeshow event, + // so the developer has a chance to show or hide more commands. + // Flyout's _findPosition will make that call. + }, + + _addCommand: function Menu_addCommand(command) { + if (!command) { + throw new WinJS.ErrorFromName("WinJS.UI.Menu.NullCommand", strings.nullCommand); + } + // See if it's a command already + if (!command._element) { + // Not a command, so assume it's options for a command + command = new WinJS.UI.MenuCommand(null, command); + } + // If we were attached somewhere else, detach us + if (command._element.parentElement) { + command._element.parentElement.removeChild(command._element); + } + + // Reattach us + this._element.appendChild(command._element); + }, + + // Called by flyout's _findPosition so that application can update it status + // we do the test and we can then fix this last-minute before showing. + _checkToggle: function Menu_checkToggle() { + var toggles = this._element.querySelectorAll(".win-command[aria-checked]"); + var hasToggle = false; + if (toggles) { + for (var i = 0; i < toggles.length; i++) { + if (toggles[i] && toggles[i].winControl && !toggles[i].winControl.hidden) { + // Found a visible toggle control + hasToggle = true; + break; + } + } + } + if (hasToggle) { + WinJS.Utilities.addClass(this._element, menuToggleClass); + } else { + WinJS.Utilities.removeClass(this._element, menuToggleClass); + } + }, + + _checkForFlyoutCommands: function Menu_checkForFlyoutCommands() { + var commands = this._element.querySelectorAll(".win-command"); + for (var count = 0; count < commands.length; count++) { + if (commands[count].winControl) { + // Remember our anchor in case it's a flyout + commands[count].winControl._parentFlyout = this; + } + } + }, + + _handleKeyDown: function Menu_handleKeyDown(event) { + if (event.key === "Esc") { + // Show a focus rect on what we move focus to + this.winControl._keyboardInvoked = true; + this.winControl._hide(); + } else if ((event.key === "Spacebar" || event.key === "Enter") + && (this === document.activeElement)) { + event.preventDefault(); + this.winControl.hide(); + } else if (event.key === "Up") { + var that = this; + thisWinUI.Menu._focusOnPreviousElement(that); + + // Prevent the page from scrolling + event.preventDefault(); + } else if (event.key === "Down") { + that = this; + thisWinUI.Menu._focusOnNextElement(that); + + // Prevent the page from scrolling + event.preventDefault(); + } else if (event.key === "Tab") { + event.preventDefault(); + } + }, + + _writeProfilerMark: function Menu_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI.Menu:" + this._id + ":" + text); + } + }); + + // Statics + + // Set focus to next focusable element in the menu (loop if necessary). + // Note: The loop works by first setting focus to the menu itself. If the menu is + // what had focus before, then we break. Otherwise we try the first child next. + // Focus remains on the menu if nothing is focusable. + Menu._focusOnNextElement = function (menu) { + var _currentElement = document.activeElement; + + do { + if (_currentElement === menu) { + _currentElement = _currentElement.firstElementChild; + } else { + _currentElement = _currentElement.nextElementSibling; + } + + if (_currentElement) { + _currentElement.focus(); + } else { + _currentElement = menu; + } + + } while (_currentElement !== document.activeElement) + }; + + // Set focus to previous focusable element in the menu (loop if necessary). + // Note: The loop works by first setting focus to the menu itself. If the menu is + // what had focus before, then we break. Otherwise we try the last child next. + // Focus remains on the menu if nothing is focusable. + Menu._focusOnPreviousElement = function (menu) { + var _currentElement = document.activeElement; + + do { + if (_currentElement === menu) { + _currentElement = _currentElement.lastElementChild; + } else { + _currentElement = _currentElement.previousElementSibling; + } + + if (_currentElement) { + _currentElement.focus(); + } else { + _currentElement = menu; + } + + } while (_currentElement !== document.activeElement) + }; + + return Menu; + }) + }); + +})(WinJS); + + +// Menu Command +/// appbar,appbars,Flyout,Flyouts,onclick,Statics +(function menuCommandInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Represents a command to be displayed in a Menu. MenuCommand objects provide button, toggle button, flyout button, + /// or separator functionality for Menu controls. + /// + /// + /// + /// + /// + /// ]]> + /// The MenuCommand control itself + /// + /// + /// + MenuCommand: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + // Class Names + var menuCommandClass = "win-command"; + var typeSeparator = "separator"; + var typeButton = "button"; + var typeToggle = "toggle"; + var typeFlyout = "flyout"; + + function _handleMenuClick(event) { + var command = this.winControl; + if (command) { + var hideParent = true; + if (command._type === typeToggle) { + command.selected = !command.selected; + } else if (command._type === typeFlyout && command._flyout) { + var flyout = command._flyout; + // Flyout may not have processAll'd, so this may be a DOM object + if (typeof flyout === "string") { + flyout = document.getElementById(flyout); + } + if (!flyout.show) { + flyout = flyout.winControl; + } + if (flyout && flyout.show) { + if (command._parentFlyout) { + hideParent = false; + flyout.show(command._parentFlyout._currentAnchor, command._parentFlyout._currentPlacement, command._parentFlyout._currentAlignment); + } else { + flyout.show(this); + } + } + } + if (command.onclick) { + command.onclick(event); + } + // Dismiss parent flyout + if (hideParent && command._parentFlyout) { + command._parentFlyout.hide(); + } + } + } + + function _handleMouseOver(event) { + if (this && this.focus) { + this.focus(); + + this.addEventListener("mousemove", _handleMouseMove, false); + } + } + + function _handleMouseMove(event) { + if (this && this.focus && this !== document.activeElement) { + this.focus(); + } + } + + function _handleMouseOut(event) { + var that = this; + var parentFlyout = _getParentFlyout(that); + if (parentFlyout + && this === document.activeElement + && WinJS.Utilities.hasClass(parentFlyout, "win-menu") + && parentFlyout.focus) { + // Menu gives focus to the menu itself + parentFlyout.focus(); + } else if (parentFlyout + && this === document.activeElement + && parentFlyout.children + && parentFlyout.children.length > 0 + && parentFlyout.children[0] + && WinJS.Utilities.hasClass(parentFlyout.children[0], "win-firstdiv") + && parentFlyout.children[0].focus) { + // Flyout gives focus to firstDiv + parentFlyout.children[0].focus(); + } + + this.removeEventListener("mousemove", _handleMouseMove, false); + } + + function _getParentFlyout(element) { + while (element && !WinJS.Utilities.hasClass(element, "win-flyout")) { + element = element.parentElement; + } + + return element; + } + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/menuCommandAriaLabel").value; }, + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get badClick() { return WinJS.Resources._getWinJSString("ui/badClick").value; }, + get badHrElement() { return WinJS.Resources._getWinJSString("ui/badHrElement").value; }, + get badButtonElement() { return WinJS.Resources._getWinJSString("ui/badButtonElement").value; } + }; + + return WinJS.Class.define(function MenuCommand_ctor(element, options) { + /// + /// + /// Creates a new MenuCommand object. + /// + /// + /// The DOM element that will host the control. + /// + /// + /// The set of properties and values to apply to the new MenuCommand. + /// + /// + /// A MenuCommand control. + /// + /// + /// + + // Check to make sure we weren't duplicated + if (element && element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.MenuCommand.DuplicateConstruction", strings.duplicateConstruction); + } + + this._disposed = false; + + // Don't blow up if they didn't pass options + if (!options) { + options = {}; + } + + // Need a type before we can create our element + if (!options.type) { + this._type = typeButton; + } + + // Go ahead and create it, separator types look different than buttons + // Don't forget to use passed in element if one was provided. + this._element = element; + if (options.type === typeSeparator) { + this._createSeparator(); + } else { + // This will also set the icon & label + this._createButton(); + } + WinJS.Utilities.addClass(this._element, "win-disposable"); + + // Remember ourselves + this._element.winControl = this; + + // Attach our css class + WinJS.Utilities.addClass(this._element, menuCommandClass); + + if (!options.selected && options.type === typeToggle) { + // Make sure toggle's have selected false for CSS + this.selected = false; + } + if (options.onclick) { + this.onclick = options.onclick; + } + options.onclick = _handleMenuClick; + + WinJS.UI.setOptions(this, options); + + // Set our options + if (this._type !== typeSeparator) { + // Make sure we have an ARIA role + var role = this._element.getAttribute("role"); + if (role === null || role === "" || role === undefined) { + role = "menuitem"; + if (this._type === typeToggle) { + role = "menuitemcheckbox"; + } + this._element.setAttribute("role", role); + if (this._type === typeFlyout) { + this._element.setAttribute("aria-haspopup", true); + } + } + var label = this._element.getAttribute("aria-label"); + if (label === null || label === "" || label === undefined) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + } + + this._element.addEventListener("mouseover", _handleMouseOver, false); + this._element.addEventListener("mouseout", _handleMouseOut, false); + }, { + /// + /// Gets the ID of the MenuCommand. + /// + /// + id: { + get: function () { + return this._element.id; + }, + set: function (value) { + // we allow setting first time only. otherwise we ignore it. + if (!this._element.id) { + this._element.id = value; + } + } + }, + + /// + /// Gets the type of the MenuCommand. Possible values are "button", "toggle", "flyout", or "separator". + /// + /// + type: { + get: function () { + return this._type; + }, + set: function (value) { + // we allow setting first time only. otherwise we ignore it. + if (!this._type) { + if (value !== typeButton && value !== typeFlyout && value !== typeToggle && value !== typeSeparator) { + this._type = typeButton; + } else { + this._type = value; + } + } + } + }, + + /// + /// The label of the MenuCommand + /// + /// + label: { + get: function () { + return this._label; + }, + set: function (value) { + this._label = value; + this._element.innerText = this.label; + + // Update aria-label + this._element.setAttribute("aria-label", this.label); + } + }, + + /// + /// Gets or sets the function to invoke when the command is clicked. + /// + /// + onclick: { + get: function () { + return this._onclick; + }, + set: function (value) { + if (value && typeof value !== "function") { + throw new WinJS.ErrorFromName("WinJS.UI.MenuCommand.BadClick", WinJS.Resources._formatString(strings.badClick, "MenuCommand")); + } + this._onclick = value; + } + }, + + /// + /// For flyout type MenuCommands, this property returns the WinJS.UI.Flyout that this command invokes. When setting this property, you can set + /// it to the string ID of the Flyout, the DOM object that hosts the Flyout, or the Flyout object itself. + /// + /// + flyout: { + get: function () { + // Resolve it to the flyout + var flyout = this._flyout; + if (typeof flyout === "string") { + flyout = document.getElementById(flyout); + } + // If it doesn't have a .element, then we need to getControl on it + if (flyout && !flyout.element) { + flyout = flyout.winControl; + } + + return flyout; + }, + set: function (value) { + // Need to update aria-owns with the new ID. + var id = value; + if (id && typeof id !== "string") { + // Our controls have .element properties + if (id.element) { + id = id.element; + } + // Hope it's a DOM element, get ID from DOM element + if (id) { + if (id.id) { + id = id.id; + } else { + // No id, have to fake one + id.id = id.uniqueID; + id = id.id; + } + } + } + if (typeof id === "string") { + this._element.setAttribute("aria-owns", id); + } + + // Remember it + this._flyout = value; + } + }, + + /// + /// Gets or sets the selected state of a toggle button. This property is true if the toggle button is selected; otherwise, it's false. + /// + /// + selected: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return this._element.getAttribute("aria-checked") === "true"; + }, + set: function (value) { + this._element.setAttribute("aria-checked", !!value); + } + }, + + /// + element: { + get: function () { + return this._element; + } + }, + + /// + /// Gets or sets a value that indicates whether the MenuCommand is disabled. This value is true if the MenuCommand is disabled; otherwise, false. + /// + /// + disabled: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return !!this._element.disabled; + }, + set: function (value) { + this._element.disabled = !!value; + } + }, + + /// + hidden: { + get: function () { + // Ensure it's a boolean because we're using the DOM element to keep in-sync + return this._element.style.visibility === "hidden"; + }, + set: function (value) { + var menuControl = thisWinUI._Overlay._getParentControlUsingClassName(this._element, "win-menu"); + if (menuControl && !menuControl.hidden) { + throw new WinJS.ErrorFromName("WinJS.UI.MenuCommand.CannotChangeHiddenProperty", WinJS.Resources._formatString(thisWinUI._Overlay.commonstrings.cannotChangeHiddenProperty, "Menu")); + } + + var style = this._element.style; + if (value) { + style.visibility = "hidden"; + style.display = "none"; + } else { + style.visibility = ""; + style.display = "block"; + } + } + }, + + /// + /// Gets or sets the extra CSS class that is applied to the host DOM element. + /// + /// + extraClass: { + get: function () { + return this._extraClass; + }, + set: function (value) { + if (this._extraClass) { + WinJS.Utilities.removeClass(this._element, this._extraClass); + } + this._extraClass = value; + WinJS.Utilities.addClass(this._element, this._extraClass); + } + }, + + + dispose: function () { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; + + if (this._flyout) { + this._flyout.dispose(); + } + }, + + addEventListener: function (type, listener, useCapture) { + /// + /// + /// Registers an event handler for the specified event. + /// + /// The name of the event to register. + /// The function that handles the event. + /// + /// Set to true to register the event handler for the capturing phase; otherwise, set to false to register the event handler for the bubbling phase. + /// + /// + /// + return this._element.addEventListener(type, listener, useCapture); + }, + + removeEventListener: function (type, listener, useCapture) { + /// + /// + /// Removes the specified event handler that the addEventListener method registered. + /// + /// The name of the event to remove. + /// The event handler function to remove. + /// + /// Set to true to remove the capturing phase event handler; set to false to remove the bubbling phase event handler. + /// + /// + /// + return this._element.removeEventListener(type, listener, useCapture); + }, + + // Private properties + _createSeparator: function MenuCommand_createSeparator() { + // Make sure there's an input element + if (!this._element) { + this._element = document.createElement("hr"); + } else { + // Verify the input was an hr + if (this._element.tagName !== "HR") { + throw new WinJS.ErrorFromName("WinJS.UI.MenuCommand.BadHrElement", strings.badHrElement); + } + } + }, + + _createButton: function MenuCommand_createButton() { + // Make sure there's an input element + if (!this._element) { + this._element = document.createElement("button"); + } else { + // Verify the input was a button + if (this._element.tagName !== "BUTTON") { + throw new WinJS.ErrorFromName("WinJS.UI.MenuCommand.BadButtonElement", strings.badButtonElement); + } + this._element.innerHTML = ""; + } + + // MenuCommand buttons need to look like this: + //// + this._element.type = "button"; + + // 'innertext' label is added later by caller + } + }); + }) + }); + +})(WinJS); + + +(function searchboxInit(global) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Enables the user to perform search queries and select suggestions. + /// + /// + /// + /// + /// + /// ]]> + /// Raised when user or app changes the query text. + /// Raised when user clicks on search glyph or presses Enter. + /// Raised when user clicks one of the displayed suggestions. + /// Raised when the system requests search suggestions from this app. + /// + /// Raised when the app automatically redirects focus to the search box. This event can only be raised when the focusOnKeyboardInput property is set to true. + /// + /// Styles the entire Search box control. + /// Styles the query input box. + /// Styles the search button. + /// Styles the result suggestions flyout. + /// Styles the result type suggestion. + /// Styles the query type suggestion. + /// + /// Styles the separator type suggestion. + /// + /// + /// Styles the currently selected suggestion. + /// + /// + /// + /// + SearchBox: WinJS.Namespace._lazy(function () { + var utilities = WinJS.Utilities; + var createEvent = WinJS.Utilities._createEventProperty; + + // Enums + var ClassName = { + searchBox: "win-searchbox", + searchBoxInput: "win-searchbox-input", + searchBoxButton: "win-searchbox-button", + searchBoxFlyout: "win-searchbox-flyout", + searchBoxSuggestionResult: "win-searchbox-suggestion-result", + searchBoxSuggestionQuery: "win-searchbox-suggestion-query", + searchBoxSuggestionSeparator: "win-searchbox-suggestion-separator", + searchBoxSuggestionSelected: "win-searchbox-suggestion-selected", + searchBoxFlyoutHighlightText: "win-searchbox-flyout-highlighttext", + searchBoxButtonInputFocus: "win-searchbox-button-input-focus", + searchBoxInputFocus: "win-searchbox-input-focus", + searchBoxSuggestionResultText: "win-searchbox-suggestion-result-text", + searchBoxSuggestionResultDetailedText: "win-searchbox-suggestion-result-detailed-text", + searchboxDisabled: "win-searchbox-disabled", + searchboxHitHighlightSpan: "win-searchbox-hithighlight-span", + }; + + var EventName = { + querychanged: "querychanged", + querysubmitted: "querysubmitted", + resultsuggestionchosen: "resultsuggestionchosen", + suggestionsrequested: "suggestionsrequested", + receivingfocusonkeyboardinput: "receivingfocusonkeyboardinput" + }; + + var SearchSuggestionKind = { + Query: 0, + Result: 1, + Separator: 2 + }; + + var strings = { + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get invalidSearchBoxSuggestionKind() { return WinJS.Resources._getWinJSString("ui/invalidSearchBoxSuggestionKind").value; }, + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabel").value; }, + get ariaLabelInputNoPlaceHolder() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelInputNoPlaceHolder").value; }, + get ariaLabelInputPlaceHolder() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelInputPlaceHolder").value; }, + get ariaLabelButton() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelButton").value; }, + get ariaLabelQuery() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelQuery").value; }, + get ariaLabelSeparator() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelSeparator").value; }, + get ariaLabelResult() { return WinJS.Resources._getWinJSString("ui/searchBoxAriaLabelResult").value; } + }; + + var SearchBox = WinJS.Class.define(function SearchBox_ctor(element, options) { + /// + /// + /// Creates a new SearchBox. + /// + /// + /// The DOM element that hosts the SearchBox. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. + /// Each property of the options object corresponds to one of the control's properties or events. + /// Event names must begin with "on". For example, to provide a handler for the querychanged event, + /// add a property named "onquerychanged" to the options object and set its value to the event handler. + /// This parameter is optional. + /// + /// + /// The new SearchBox. + /// + /// + /// + + element = element || document.createElement("div"); + + if (element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.SearchBox.DuplicateConstruction", strings.duplicateConstruction); + } + element.winControl = this; + + // Elements + this._domElement = null; + this._inputElement = null; + this._buttonElement = null; + this._flyout = null; + this._flyoutDivElement = null; + this._repeaterDivElement = null; + this._repeater = null; + + // Variables + this._disposed = false; + this._focusOnKeyboardInput = false; + this._chooseSuggestionOnEnter = false; + this._lastKeyPressLanguage = ""; + + // These are used to eliminate redundant query submitted events + this._prevQueryText = ""; + this._prevLinguisticDetails = this._createSearchQueryLinguisticDetails([], 0, 0, "", ""); + this._prevCompositionStart = 0; + this._prevCompositionLength = 0; + this._isProcessingDownKey = false; + this._isProcessingUpKey = false; + this._isProcessingTabKey = false; + this._isProcessingEnterKey = false; + this._isFlyoutPointerDown = false; + this._reflowImeOnPointerRelease = false; + + // Focus and selection related variables + this._currentFocusedIndex = -1; + this._currentSelectedIndex = -1; + + this._suggestionRendererBind = this._suggestionRenderer.bind(this); + this._requestingFocusOnKeyboardInputHandlerBind = this._requestingFocusOnKeyboardInputHandler.bind(this); + this._suggestionsRequestedHandlerBind = this._suggestionsRequestedHandler.bind(this); + this._suggestionsChangedHandlerBind = this._suggestionsChangedHandler.bind(this); + + // Find out if we are in local compartment and if search APIs are available. + this._searchSuggestionManager = null; + this._searchSuggestions = null; + + // Get the search suggestion provider if it is available + if ((window.Windows) && (Windows.ApplicationModel) && (Windows.ApplicationModel.Search) && (Windows.ApplicationModel.Search.Core) && (Windows.ApplicationModel.Search.Core.SearchSuggestionManager)) { + this._searchSuggestionManager = new Windows.ApplicationModel.Search.Core.SearchSuggestionManager(); + this._searchSuggestions = this._searchSuggestionManager.suggestions; + } + + this._hitFinder = null; + this._setElement(element); + WinJS.UI.setOptions(this, options); + this._setAccessibilityProperties(); + WinJS.Utilities.addClass(element, "win-disposable"); + }, { + + /// + element: { + get: function () { + return this._domElement; + } + }, + + /// + /// Gets or sets the placeholder text for the SearchBox. This text is displayed if there is no + /// other text in the input box. + /// + /// + placeholderText: { + get: function () { + return this._inputElement.placeholder; + }, + set: function (value) { + this._inputElement.placeholder = value; + this._updateInputElementAriaLabel(); + } + }, + + /// + /// Gets or sets the query text for the SearchBox. + /// + /// + queryText: { + get: function () { + return this._inputElement.value; + }, + set: function (value) { + this._inputElement.value = value; + } + }, + + /// + /// Gets or sets a value that specifies whether search history is disabled for the SearchBox. The default value is false. + /// + /// + searchHistoryDisabled: { + get: function () { + if (this._searchSuggestionManager) { + return !this._searchSuggestionManager.searchHistoryEnabled; + } else { + return true; + } + }, + set: function (value) { + if (this._searchSuggestionManager) { + this._searchSuggestionManager.searchHistoryEnabled = !value; + } + } + }, + + /// + /// Gets or sets the search history context for the SearchBox. The search history context string is used as a secondary key for storing search history. + /// (The primary key is the AppId.) An app can use the search history context string to store different search histories based on the context of the application. + /// If you don't set this property, the system assumes that all searches in your app occur in the same context. + /// If you update this property while the search pane is open with suggestions showing, the changes won't take effect until the user enters the next character. + /// + /// + searchHistoryContext: { + get: function () { + if (this._searchSuggestionManager) { + return this._searchSuggestionManager.searchHistoryContext; + } else { + return ""; + } + }, + set: function (value) { + if (this._searchSuggestionManager) { + this._searchSuggestionManager.searchHistoryContext = value; + } + } + }, + + /// + /// Enable automatically focusing the search box when the user types into the app window (off by default) While this is enabled, + /// input on the current thread will be intercepted and redirected to the search box. Only textual input will trigger the search box to focus. + /// The caller will continue to receive non-text keys (such as arrows, tab, etc + /// This will also not affect WIN/CTRL/ALT key combinations (except for Ctrl-V for paste). + /// If the client needs more to happen than just set focus in the box (make control visible, etc.), they will need to handle the event. + /// If enabled, the app must be sure to disable this if the user puts focus in some other edit field. + /// + /// + focusOnKeyboardInput: { + get: function () { + return this._focusOnKeyboardInput; + }, + set: function (value) { + if (this._focusOnKeyboardInput && !value) { + if (this._searchSuggestionManager) { + this._searchSuggestionManager.removeEventListener("requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind); + } + } else if (!this._focusOnKeyboardInput && !!value) { + if (this._searchSuggestionManager) { + this._searchSuggestionManager.addEventListener("requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind); + } + } + this._focusOnKeyboardInput = !!value; + } + }, + + /// + /// Gets or sets whether the first suggestion is chosen when the user presses Enter. + /// When set to true, as the user types in the search box, a focus rectangle is drawn on the first search suggestion + /// (if present and no IME composition in progress). Pressing enter will behave the same as if clicked on the focused suggestion, + /// and the down arrow key press will put real focus to the second suggestion and the up arrow key will remove focus. + /// + /// + chooseSuggestionOnEnter: { + get: function () { + return this._chooseSuggestionOnEnter; + }, + set: function (value) { + this._chooseSuggestionOnEnter = !!value; + this._updateSearchButtonClass(); + } + }, + + /// + /// Gets or sets a value that specifies whether the SearchBox is disabled. + /// + /// + disabled: { + get: function () { + return this._inputElement.disabled; + }, + set: function (value) { + if (this._inputElement.disabled === !!value) { + return; + } + + if (!value) { + // Enable control + this._inputElement.disabled = false; + this._buttonElement.disabled = false; + this._domElement.disabled = false; + utilities.removeClass(this.element, ClassName.searchboxDisabled); + if (document.activeElement === this.element) { + try { + this._inputElement.setActive(); + } catch (e) { + } + } + } else { + // Disable control + if (this._isFlyoutShown) { + this._hideFlyout(); + } + utilities.addClass(this.element, ClassName.searchboxDisabled); + this._inputElement.disabled = true; + this._buttonElement.disabled = true; + this._domElement.disabled = true; + } + } + }, + + // Methods + setLocalContentSuggestionSettings: function SearchBox_setLocalContentSuggestionSettings(settings) { + /// + /// + /// Specifies whether suggestions based on local files are automatically displayed in the search pane, and defines the criteria that + /// the system uses to locate and filter these suggestions. + /// + /// + /// The new settings for local content suggestions. + /// + /// + /// + if (this._searchSuggestionManager) { + this._searchSuggestionManager.setLocalContentSuggestionSettings(settings); + } + }, + + dispose: function SearchBox() { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + + // Cancel pending promises. + if (this._flyoutOpenPromise) { + this._flyoutOpenPromise.cancel(); + } + + // Detach winrt events. + if (this._focusOnKeyboardInput) { + if (this._searchSuggestionManager) { + this._searchSuggestionManager.removeEventListener("requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind); + } + } + + if (this._searchSuggestions) { + this._searchSuggestions.removeEventListener("vectorchanged", this._suggestionsChangedHandlerBind); + } + + if (this._searchSuggestionManager) { + this._searchSuggestionManager.removeEventListener("suggestionsrequested", this._suggestionsRequestedHandlerBind); + } + + this._searchSuggestionManager = null; + this._searchSuggestions = null; + this._hitFinder = null; + + this._disposed = true; + + }, + + /// + /// Raised when user or app changes the query text. + /// + /// + onquerychanged: createEvent(EventName.querychanged), + + /// + /// Raised when user clicks on search glyph or presses enter button. + /// + /// + onquerysubmitted: createEvent(EventName.querysubmitted), + + /// + /// Raised when user clicks on one of the suggestions displayed. + /// + /// + onresultsuggestionchosen: createEvent(EventName.resultsuggestionchosen), + + /// + /// Raised when Windows requests search suggestions from the app. + /// + /// + onsuggestionsrequested: createEvent(EventName.suggestionsrequested), + + // Private methods + _isFlyoutShown: function SearchBox_isFlyoutShown() { + return (this._flyoutDivElement.style.display !== "none"); + }, + + _isFlyoutBelow: function SearchBox_isFlyoutBelow() { + if (this._flyoutDivElement.getBoundingClientRect().top > this._inputElement.getBoundingClientRect().top) { + return true; + } + return false; + }, + + _getFlyoutTop: function SearchBox_getFlyoutTop() { + if (this._isFlyoutBelow()) { + return this._inputElement.getBoundingClientRect().bottom; + } + var popupHeight = this._flyoutDivElement.getBoundingClientRect().bottom - this._flyoutDivElement.getBoundingClientRect().top; + return this._inputElement.getBoundingClientRect().top - popupHeight; + }, + + _getFlyoutBottom: function SearchBox_getFlyoutBottom() { + if (this._isFlyoutBelow()) { + var popupHeight = this._flyoutDivElement.getBoundingClientRect().bottom - this._flyoutDivElement.getBoundingClientRect().top; + return this._inputElement.getBoundingClientRect().bottom + popupHeight; + } + return this._inputElement.getBoundingClientRect().top; + }, + + _updateFlyoutTopAndTouchAction: function SearchBox_updateFlyoutTopAndTouchAction() { + var popupHeight = this._flyoutDivElement.getBoundingClientRect().bottom - this._flyoutDivElement.getBoundingClientRect().top; + if (!this._isFlyoutBelow()) { + this._flyoutDivElement.style.top = "-" + popupHeight + "px"; + } + + // ms-scroll-chaining:none will still chain scroll parent element if child div does + // not have a scroll bar. Prevent this by setting and updating touch action + if (this._flyoutDivElement.scrollHeight > popupHeight) { + this._flyoutDivElement.style.touchAction = "pan-y"; + } else { + this._flyoutDivElement.style.touchAction = "none"; + } + }, + + _showFlyout: function SearchBox_showFlyout() { + + if (this._isFlyoutShown()) { + return; + } + + if (this._suggestionsData.length === 0) { + return; + } + + this._flyoutDivElement.style.display = "block"; + + // Display above vs below + var minPopupHeight = this._flyoutDivElement.clientHeight; + if (minPopupHeight < WinJS.UI.SearchBox._Constants.MIN_POPUP_HEIGHT) { + minPopupHeight = WinJS.UI.SearchBox._Constants.MIN_POPUP_HEIGHT; + } + var flyoutRect = this._flyoutDivElement.getBoundingClientRect(); + var searchBoxRect = this.element.getBoundingClientRect(); + var popupHeight = flyoutRect.bottom - flyoutRect.top; + var popupWidth = flyoutRect.right - flyoutRect.left; + var searchBoxWidth = searchBoxRect.right - searchBoxRect.left; + var documentClientHeight = document.documentElement.clientHeight; + var documentClientWidth = document.documentElement.clientWidth; + var searchBoxClientHeight = this.element.clientHeight; + var searchBoxClientLeft = this.element.clientLeft; + + var flyoutBelowSearchBox = true; + if ((searchBoxRect.bottom + minPopupHeight) <= documentClientHeight) { + // There is enough space below. Show below + this._flyoutDivElement.style.top = searchBoxClientHeight + "px"; + } else if ((searchBoxRect.top - minPopupHeight) >= 0) { + // There is enough space above. Show above + this._flyoutDivElement.style.top = "-" + popupHeight + "px"; + flyoutBelowSearchBox = false; + } else { + // Not enough space above or below. Show below. + this._flyoutDivElement.style.top = searchBoxClientHeight + "px"; + } + + // Align left vs right edge + var alignRight; + if (window.getComputedStyle(this._flyoutDivElement).direction === "rtl") { + // RTL: Align to the right edge if there is enough space to the left of the search box's + // right edge, or if there is not enough space to fit the flyout aligned to either edge. + alignRight = ((searchBoxRect.right - popupWidth) >= 0) || ((searchBoxRect.left + popupWidth) > documentClientWidth); + + } else { + // LTR: Align to the right edge if there isn't enough space to the right of the search box's + // left edge, but there is enough space to the left of the search box's right edge. + alignRight = ((searchBoxRect.left + popupWidth) > documentClientWidth) && ((searchBoxRect.right - popupWidth) >= 0); + } + + if (alignRight) { + this._flyoutDivElement.style.left = (searchBoxWidth - popupWidth - searchBoxClientLeft) + "px"; + } else { + this._flyoutDivElement.style.left = "-" + searchBoxClientLeft + "px"; + } + + // ms-scroll-chaining:none will still chain scroll parent element if child div does + // not have a scroll bar. Prevent this by setting and updating touch action + if (this._flyoutDivElement.scrollHeight > popupHeight) { + this._flyoutDivElement.style.touchAction = "pan-y"; + } else { + this._flyoutDivElement.style.touchAction = "none"; + } + + this._addFlyoutIMEPaddingIfRequired(); + + if (this._flyoutOpenPromise) { + this._flyoutOpenPromise.cancel(); + this._flyoutOpenPromise = null; + } + var animationKeyframe = flyoutBelowSearchBox ? "WinJS-flyoutBelowSearchBox-showPopup" : "WinJS-flyoutAboveSearchBox-showPopup"; + this._flyoutOpenPromise = WinJS.UI.Animation.showPopup(this._flyoutDivElement, { top: "0px", left: "0px", keyframe: animationKeyframe }); + }, + + _hideFlyout: function SearchBox_hideFlyout() { + if (this._isFlyoutShown()) { + this._flyoutDivElement.style.display = "none"; + this._updateSearchButtonClass(); + } + }, + + _addNewSpan: function SearchBox_addNewSpan(element, innerText, insertBefore) { + // Adds new span element with specified inner text as child to element, placed before insertBefore + var spanElement = document.createElement("span"); + spanElement.innerText = innerText; + spanElement.setAttribute("aria-hidden", "true"); + utilities.addClass(spanElement, ClassName.searchboxHitHighlightSpan); + element.insertBefore(spanElement, insertBefore) + return spanElement; + }, + + _addHitHighlightedText: function SearchBox_addHitHighlightedText(element, item, text) { + if (text) { + // Remove any existing hit highlighted text spans + utilities.query("." + ClassName.searchboxHitHighlightSpan, element).forEach(function (childElement) { + childElement.parentNode.removeChild(childElement); + }); + + // Insert spans at the front of element + var firstChild = element.firstChild; + + var hitsProvided = item.hits; + if ((!hitsProvided) && (this._hitFinder !== null) && (item.kind !== SearchSuggestionKind.Separator)) { + hitsProvided = this._hitFinder.find(text); + } + + var hits = WinJS.UI.SearchBox._sortAndMergeHits(hitsProvided); + + var lastPosition = 0; + for (var i = 0; i < hits.length; i++) { + var hit = hits[i]; + + // Add previous normal text + this._addNewSpan(element, text.substring(lastPosition, hit.startPosition), firstChild); + + lastPosition = hit.startPosition + hit.length; + + // Add hit highlighted text + var spanHitHighlightedText = this._addNewSpan(element, text.substring(hit.startPosition, lastPosition), firstChild); + utilities.addClass(spanHitHighlightedText, ClassName.searchBoxFlyoutHighlightText); + } + + // Add final normal text + if (lastPosition < text.length) { + this._addNewSpan(element, text.substring(lastPosition), firstChild); + } + } + }, + + _findSuggestionElementIndex: function SearchBox_findSuggestionElementIndex(curElement) { + if (curElement) { + for (var i = 0; i < this._suggestionsData.length; i++) { + if (this._repeater.elementFromIndex(i) === curElement) { + return i; + } + } + } + return -1; + }, + + _isSuggestionSelectable: function SearchBox_isSuggestionSelectable(suggestion) { + return ((suggestion.kind === SearchSuggestionKind.Query) || + (suggestion.kind === SearchSuggestionKind.Result)); + }, + + _findNextSuggestionElementIndex: function SearchBox_findNextSuggestionElementIndex(curIndex) { + // Returns -1 if there are no focusable elements after curIndex + // Returns first element if curIndex < 0 + var startIndex = curIndex + 1; + if (startIndex < 0) { + startIndex = 0; + } + + for (var i = startIndex; i < this._suggestionsData.length; i++) { + if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) { + return i; + } + } + return -1; + }, + + _findPreviousSuggestionElementIndex: function SearchBox_findPreviousSuggestionElementIndex(curIndex) { + // Returns -1 if there are no focusable elements before curIndex + // Returns last element if curIndex >= suggestionsdata.length + var startIndex = curIndex - 1; + if (startIndex >= this._suggestionsData.length) { + startIndex = this._suggestionsData.length - 1; + } + + for (var i = startIndex; i >= 0; i--) { + if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) { + return i; + } + } + return -1; + }, + + _trySetFocusOnSuggestionIndex: function SearchBox_trySetFocusOnSuggestionIndex(index) { + try { + this._repeater.elementFromIndex(index).focus(); + } catch (e) { + } + }, + + _updateFakeFocus: function SearchBox_updateFakeFocus() { + var firstElementIndex; + if (this._isFlyoutShown() && (this._chooseSuggestionOnEnter)) { + firstElementIndex = this._findNextSuggestionElementIndex(-1); + } else { + // This will clear the fake focus. + firstElementIndex = -1; + } + + this._selectSuggestionAtIndex(firstElementIndex); + }, + + _updateSearchButtonClass: function SearchBox_updateSearchButtonClass() { + if ((this._currentSelectedIndex !== -1) || (document.activeElement !== this._inputElement)) { + // Focus is not in input. remove class + utilities.removeClass(this._buttonElement, ClassName.searchBoxButtonInputFocus); + } else if (document.activeElement === this._inputElement) { + utilities.addClass(this._buttonElement, ClassName.searchBoxButtonInputFocus); + } + }, + + _selectSuggestionAtIndex: function SearchBox_selectSuggestionAtIndex(indexToSelect) { + // Sets focus on the specified element and removes focus from others. + // Clears selection if index is outside of suggestiondata index range. + var curElement = null; + for (var i = 0; i < this._suggestionsData.length; i++) { + curElement = this._repeater.elementFromIndex(i); + if (i !== indexToSelect) { + utilities.removeClass(curElement, ClassName.searchBoxSuggestionSelected); + curElement.setAttribute("aria-selected", "false"); + } else { + utilities.addClass(curElement, ClassName.searchBoxSuggestionSelected); + this._scrollToView(curElement); + curElement.setAttribute("aria-selected", "true"); + } + } + this._updateSearchButtonClass(); + this._currentSelectedIndex = indexToSelect; + if (curElement) { + this._inputElement.setAttribute("aria-activedescendant", this._repeaterDivElement.id + indexToSelect); + } else if (this._inputElement.hasAttribute("aria-activedescendant")) { + this._inputElement.removeAttribute("aria-activedescendant"); + } + }, + + _scrollToView: function SearchBox_scrollToView(targetElement) { + var popupHeight = this._flyoutDivElement.getBoundingClientRect().bottom - this._flyoutDivElement.getBoundingClientRect().top; + if ((targetElement.offsetTop + targetElement.offsetHeight) > (this._flyoutDivElement.scrollTop + popupHeight)) { + // Element to scroll is below popup visible area + var scrollDifference = (targetElement.offsetTop + targetElement.offsetHeight) - (this._flyoutDivElement.scrollTop + popupHeight); + this._flyoutDivElement.msZoomTo({ contentX: 0, contentY: (this._flyoutDivElement.scrollTop + scrollDifference), viewportX: 0, viewportY: 0 }); + } else if (targetElement.offsetTop < this._flyoutDivElement.scrollTop) { + // Element to scroll is above popup visible area + this._flyoutDivElement.msZoomTo({ contentX: 0, contentY: targetElement.offsetTop, viewportX: 0, viewportY: 0 }); + } + }, + + _querySuggestionRenderer: function SearchBox_querySuggestionRenderer(item) { + var root = document.createElement("div"); + + this._addHitHighlightedText(root, item, item.text); + root.title = item.text; + + utilities.addClass(root, ClassName.searchBoxSuggestionQuery); + + var that = this; + root.addEventListener('click', function (ev) { + that._inputElement.focus(); + that._processSuggestionChosen(item, ev); + }); + + root.setAttribute("role", "option"); + var ariaLabel = WinJS.Resources._formatString(strings.ariaLabelQuery, item.text); + root.setAttribute("aria-label", ariaLabel); + return root; + }, + + _separatorSuggestionRenderer: function SearchBox_separatorSuggestionRenderer(item) { + var root = document.createElement("div"); + if (item.text.length > 0) { + var textElement = document.createElement("div"); + textElement.innerText = item.text; + textElement.title = item.text; + textElement.setAttribute("aria-hidden", "true"); + root.appendChild(textElement); + } + root.insertAdjacentHTML("beforeend", "
"); + utilities.addClass(root, ClassName.searchBoxSuggestionSeparator); + root.setAttribute("role", "separator"); + var ariaLabel = WinJS.Resources._formatString(strings.ariaLabelSeparator, item.text); + root.setAttribute("aria-label", ariaLabel); + return root; + }, + + _resultSuggestionRenderer: function SearchBox_resultSuggestionRenderer(item) { + var root = document.createElement("div"); + var image = new Image; + image.style.opacity = 0; + var loadImage = function (url) { + function onload() { + image.removeEventListener("load", onload, false); + WinJS.UI.Animation.fadeIn(image); + } + image.addEventListener("load", onload, false); + image.src = url; + }; + + if (item.image !== null) { + item.image.openReadAsync().then(function (streamWithContentType) { + if (streamWithContentType !== null) { + loadImage(URL.createObjectURL(streamWithContentType, { oneTimeOnly: true })); + } + }); + } else if (item.imageUrl != null) { + loadImage(item.imageUrl); + } + image.setAttribute("aria-hidden", "true"); + root.appendChild(image); + + var divElement = document.createElement("div"); + utilities.addClass(divElement, ClassName.searchBoxSuggestionResultText); + this._addHitHighlightedText(divElement, item, item.text); + divElement.title = item.text; + divElement.setAttribute("aria-hidden", "true"); + root.appendChild(divElement); + + var brElement = document.createElement("br"); + divElement.appendChild(brElement); + + var divDetailElement = document.createElement("span"); + utilities.addClass(divDetailElement, ClassName.searchBoxSuggestionResultDetailedText); + this._addHitHighlightedText(divDetailElement, item, item.detailText); + divDetailElement.title = item.detailText; + divDetailElement.setAttribute("aria-hidden", "true"); + divElement.appendChild(divDetailElement); + + utilities.addClass(root, ClassName.searchBoxSuggestionResult); + + var that = this; + root.addEventListener('click', function (ev) { + that._inputElement.focus(); + that._processSuggestionChosen(item, ev); + }); + + root.setAttribute("role", "option"); + var ariaLabel = WinJS.Resources._formatString(strings.ariaLabelResult, item.text, item.detailText); + root.setAttribute("aria-label", ariaLabel); + return root; + }, + + _suggestionRenderer: function SearchBox_suggestionRenderer(item) { + var root = null; + if (!item) { + return root; + } + if (item.kind === SearchSuggestionKind.Query) { + root = this._querySuggestionRenderer(item); + } else if (item.kind === SearchSuggestionKind.Separator) { + root = this._separatorSuggestionRenderer(item); + } else if (item.kind === SearchSuggestionKind.Result) { + root = this._resultSuggestionRenderer(item); + } else { + throw new WinJS.ErrorFromName("WinJS.UI.SearchBox.invalidSearchBoxSuggestionKind", strings.invalidSearchBoxSuggestionKind); + } + + return root; + }, + + _setElement: function SearchBox_setElement(element) { + this._domElement = element; + utilities.addClass(this._domElement, ClassName.searchBox); + + this._inputElement = document.createElement("input"); + this._inputElement.type = "search"; + utilities.addClass(this._inputElement, ClassName.searchBoxInput); + + this._buttonElement = document.createElement("div"); + this._buttonElement.tabIndex = -1; + utilities.addClass(this._buttonElement, ClassName.searchBoxButton); + + this._flyoutDivElement = document.createElement('div'); + utilities.addClass(this._flyoutDivElement, ClassName.searchBoxFlyout); + + this._repeaterDivElement = document.createElement('div'); + this._suggestionsData = new WinJS.Binding.List(); + this._repeater = new WinJS.UI.Repeater(this._repeaterDivElement, { data: this._suggestionsData, template: this._suggestionRendererBind }); + + this._domElement.appendChild(this._inputElement); + this._domElement.appendChild(this._buttonElement); + this._domElement.appendChild(this._flyoutDivElement); + this._flyoutDivElement.appendChild(this._repeaterDivElement); + this._hideFlyout(); + + this._wireupUserEvents(); + this._wireupWinRTEvents(); + this._wireupRepeaterEvents(); + }, + + _setAccessibilityProperties: function Searchbox_setAccessibilityProperties() { + // Set up accessibility properties + var label = this._domElement.getAttribute("aria-label"); + if (!label) { + this._domElement.setAttribute("aria-label", strings.ariaLabel); + } + this._domElement.setAttribute("role", "group"); + this._updateInputElementAriaLabel(); + this._inputElement.setAttribute("role", "textbox"); + this._buttonElement.setAttribute("role", "button"); + this._buttonElement.setAttribute("aria-label", strings.ariaLabelButton); + this._repeaterDivElement.setAttribute("role", "listbox"); + WinJS.UI._ensureId(this._repeaterDivElement); + this._inputElement.setAttribute("aria-controls", this._repeaterDivElement.id); + this._repeaterDivElement.setAttribute("aria-live", "polite"); + }, + + _updateInputElementAriaLabel: function Searchbox_updateInputElementAriaLabel() { + var ariaLabel = strings.ariaLabelInputNoPlaceHolder; + if (this._inputElement.placeholder && this._inputElement.placeholder) { + ariaLabel = WinJS.Resources._formatString(strings.ariaLabelInputPlaceHolder, this._inputElement.placeholder); + } + this._inputElement.setAttribute("aria-label", ariaLabel); + }, + + _submitQuery: function Searchbox_submitQuery(queryText, fillLinguisticDetails, event) { + if (this._disposed) { + return; + } + + // get the most up to date value of the input langauge from WinRT if available + if ((window.Windows) && (Windows.Globalization) && (Windows.Globalization.Language)) { + this._lastKeyPressLanguage = Windows.Globalization.Language.currentInputMethodLanguageTag; + } + + this._fireEvent(WinJS.UI.SearchBox._EventName.querysubmitted, { + language: this._lastKeyPressLanguage, + linguisticDetails: this._getLinguisticDetails(true /*useCache*/, fillLinguisticDetails), // allow caching, but generate empty linguistic details if suggestion is used + queryText: queryText, + keyModifiers: WinJS.UI.SearchBox._getKeyModifiers(event) + }); + + if (this._searchSuggestionManager) { + this._searchSuggestionManager.addToHistory( + this._inputElement.value, + this._lastKeyPressLanguage + ); + } + }, + + _processSuggestionChosen: function Searchbox_processSuggestionChosen(item, event) { + this.queryText = item.text; + if (item.kind === SearchSuggestionKind.Query) { + this._submitQuery(item.text, false /*fillLinguisticDetails*/, event); // force empty linguistic details since explicitly chosen suggestion from list + } else if (item.kind === SearchSuggestionKind.Result) { + this._fireEvent(WinJS.UI.SearchBox._EventName.resultsuggestionchosen, { + tag: item.tag, + keyModifiers: WinJS.UI.SearchBox._getKeyModifiers(event), + storageFile: null + }); + } + this._hideFlyout(); + }, + + _buttonClickHandler: function SearchBox_buttonClickHandler(event) { + this._inputElement.focus(); + this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event); + this._hideFlyout(); + }, + + _inputOrImeChangeHandler: function SearchBox_inputImeChangeHandler(event) { + var isButtonDown = this._buttonElement.msMatchesSelector(":active"); + // swallow the IME change event that gets fired when composition is ended due to keyboarding down to the suggestion list & mouse down on the button + if (!this._isProcessingImeFocusLossKey() && !isButtonDown && !this._isFlyoutPointerDown) { + var linguisticDetails = this._getLinguisticDetails(false /*useCache*/, true /*createFilled*/); // never cache on explicit user changes + var hasLinguisticDetailsChanged = this._hasLinguisticDetailsChanged(linguisticDetails); // updates this._prevLinguisticDetails + + // Keep the previous composition cache up to date, execpt when composition ended with no text change and alternatives are kept. + // In that case, we need to use the cached values to correctly generate the query prefix/suffix for substituting alternatives, but still report to the client that the composition has ended (via start & length of composition of 0) + if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength == 0) || (linguisticDetails.queryTextCompositionLength > 0)) { + this._prevCompositionStart = linguisticDetails.queryTextCompositionStart; + this._prevCompositionLength = linguisticDetails.queryTextCompositionLength; + } + + if ((this._prevQueryText === this._inputElement.value) && !hasLinguisticDetailsChanged) { + // Sometimes the input change is fired even if there is no change in input. + // Swallow event in those cases. + return; + } + this._prevQueryText = this._inputElement.value; + + // get the most up to date value of the input langauge from WinRT if available + if ((window.Windows) && (Windows.Globalization) && (Windows.Globalization.Language)) { + this._lastKeyPressLanguage = Windows.Globalization.Language.currentInputMethodLanguageTag; + } + + if ((window.Windows) && (Windows.Data) && (Windows.Data.Text) && (Windows.Data.Text.SemanticTextQuery)) { + if (this._inputElement.value !== "") { + this._hitFinder = new Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._lastKeyPressLanguage); + } else { + this._hitFinder = null; + } + } + + this._fireEvent(WinJS.UI.SearchBox._EventName.querychanged, { + language: this._lastKeyPressLanguage, + queryText: this._inputElement.value, + linguisticDetails: linguisticDetails + }); + var queryTextCompositionStart = null; + var queryTextCompositionLength = null; + var queryTextAlternatives = null; + if (this._searchSuggestionManager) { + this._searchSuggestionManager.setQuery( + this._inputElement.value, + this._lastKeyPressLanguage, + linguisticDetails + ); + } + } + }, + + _createSearchQueryLinguisticDetails: function SearchBox_createSearchQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix) { + var linguisticDetails = null; + + // The linguistic alternatives we receive are only for the composition string being composed. We need to provide the linguistic alternatives + // in the form of the full query text with alternatives embedded. + var fullCompositionAlternatives = []; + for (var i = 0; i < compositionAlternatives.length; i++) { + fullCompositionAlternatives[i] = queryTextPrefix + compositionAlternatives[i] + queryTextSuffix; + } + + if ((window.Windows) && (Windows.ApplicationModel) && (Windows.ApplicationModel.Search) && (Windows.ApplicationModel.Search.SearchQueryLinguisticDetails)) { + linguisticDetails = new Windows.ApplicationModel.Search.SearchQueryLinguisticDetails(fullCompositionAlternatives, compositionStartOffset, compositionLength); + } + else { + // If we're in web compartment, create a script version of the WinRT SearchQueryLinguisticDetails object + linguisticDetails = { + queryTextAlternatives: fullCompositionAlternatives, + queryTextCompositionStart: compositionStartOffset, + queryTextCompositionLength: compositionLength + }; + } + return linguisticDetails; + }, + + _getLinguisticDetails: function SearchBox_getLinguisticDetails(useCache, createFilled) { // createFilled=false always creates an empty linguistic details object, otherwise generate it or use the cache + var linguisticDetails = null; + if ((this._inputElement.value === this._prevQueryText) && useCache && this._prevLinguisticDetails && createFilled) { + linguisticDetails = this._prevLinguisticDetails; + } + else { + var compositionAlternatives = []; + var compositionStartOffset = 0; + var compositionLength = 0; + var queryTextPrefix = ""; + var queryTextSuffix = ""; + if (createFilled && this._inputElement.msGetInputContext && this._inputElement.msGetInputContext().getCompositionAlternatives) { + var context = this._inputElement.msGetInputContext(); + compositionAlternatives = context.getCompositionAlternatives(); + compositionStartOffset = context.compositionStartOffset; + compositionLength = context.compositionEndOffset - context.compositionStartOffset; + + if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength == 0) || (compositionLength > 0)) { + queryTextPrefix = this._inputElement.value.substring(0, compositionStartOffset); + queryTextSuffix = this._inputElement.value.substring(compositionStartOffset + compositionLength); + } + else { + // composition ended, but alternatives have been kept, need to reuse the previous query prefix/suffix, but still report to the client that the composition has ended (start & length of composition of 0) + queryTextPrefix = this._inputElement.value.substring(0, this._prevCompositionStart); + queryTextSuffix = this._inputElement.value.substring(this._prevCompositionStart + this._prevCompositionLength); + } + } + linguisticDetails = this._createSearchQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix); + } + return linguisticDetails; + }, + + _handleTabKeyDown: function SearchBox_handleTabKeyDown(event) { + var closeFlyout = true; + if (event.shiftKey) { + // If focus is not in input + if (this._currentFocusedIndex !== -1) { + // Remove selection. + this._currentFocusedIndex = -1; + this._selectSuggestionAtIndex(this._currentFocusedIndex); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + closeFlyout = false; + } + } else if (this._currentFocusedIndex === -1) { + if (this._isFlyoutBelow()) { + // Move to first element + this._currentFocusedIndex = this._findNextSuggestionElementIndex(this._currentFocusedIndex); + } else { + // Move to last element + this._currentFocusedIndex = this._findPreviousSuggestionElementIndex(this._suggestionsData.length); + } + if (this._currentFocusedIndex != -1) { + this._selectSuggestionAtIndex(this._currentFocusedIndex); + this._updateQueryTextWithSuggestionText(this._currentFocusedIndex); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + closeFlyout = false; + } + } + + if (closeFlyout) { + this._hideFlyout(); + } + }, + + _keyDownHandler: function SearchBox_keyDownHandler(event) { + this._lastKeyPressLanguage = event.locale; + if (event.key === "Tab") { + this._isProcessingTabKey = true; + } + else if (event.key === "Up") { + this._isProcessingUpKey = true; + } + else if (event.key === "Down") { + this._isProcessingDownKey = true; + } + else if ((event.key === "Enter") && (event.locale === "ko")) { + this._isProcessingEnterKey = true; + } + // Ignore keys handled by ime. + if (event.keyCode !== WinJS.UI.SearchBox._Constants.IME_HANDLED_KEYCODE) { + if (event.key === "Tab") { + this._handleTabKeyDown(event); + } else if (event.key === "Esc") { + // If focus is not in input + if (this._currentFocusedIndex !== -1) { + this.queryText = this._prevQueryText; + this._currentFocusedIndex = -1; + this._selectSuggestionAtIndex(this._currentFocusedIndex); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + } else if (this.queryText !== "") { + this.queryText = ""; + this._inputOrImeChangeHandler(null); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + } + } else if (event.key === "Up") { + var prevIndex; + if (this._currentSelectedIndex !== -1) { + prevIndex = this._findPreviousSuggestionElementIndex(this._currentSelectedIndex); + // Restore user entered query when user navigates back to input. + if (prevIndex === -1) { + this.queryText = this._prevQueryText; + } + } else { + prevIndex = this._findPreviousSuggestionElementIndex(this._suggestionsData.length); + } + this._currentFocusedIndex = prevIndex; + this._selectSuggestionAtIndex(prevIndex); + this._updateQueryTextWithSuggestionText(this._currentFocusedIndex); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + } else if (event.key === "Down") { + var nextIndex = this._findNextSuggestionElementIndex(this._currentSelectedIndex); + // Restore user entered query when user navigates back to input. + if ((this._currentSelectedIndex !== -1) && (nextIndex === -1)) { + this.queryText = this._prevQueryText; + } + this._currentFocusedIndex = nextIndex; + this._selectSuggestionAtIndex(nextIndex); + this._updateQueryTextWithSuggestionText(this._currentFocusedIndex); + this._updateSearchButtonClass(); + event.preventDefault(); + event.stopPropagation(); + } else if (event.key === "Enter") { + if (this._currentSelectedIndex === -1) { + this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event); + } else { + this._processSuggestionChosen(this._suggestionsData.getAt(this._currentSelectedIndex), event); + } + this._hideFlyout(); + } else if (WinJS.UI.SearchBox._isTypeToSearchKey(event)) { + // Type to search on suggestions scenario. + if (this._currentFocusedIndex !== -1) { + this._currentFocusedIndex = -1; + this._selectSuggestionAtIndex(-1); + this._updateFakeFocus(); + } + } + } + }, + + _keyPressHandler: function SearchBox_keyPressHandler(event) { + this._lastKeyPressLanguage = event.locale; + }, + + _keyUpHandler: function SearchBox_keyUpHandler(event) { + if (event.key === "Tab") { + this._isProcessingTabKey = false; + } + else if (event.key === "Up") { + this._isProcessingUpKey = false; + } + else if (event.key === "Down") { + this._isProcessingDownKey = false; + } + else if (event.key === "Enter") { + this._isProcessingEnterKey = false; + } + }, + + _searchBoxFocusInHandler: function SearchBox__searchBoxFocusInHandler(event) { + // Refresh hit highlighting if text has changed since focus was present + // This can happen if the user committed a suggestion previously. + if (this._inputElement.value !== this._prevQueryText) { + if ((window.Windows) && (Windows.Data) && (Windows.Data.Text) && (Windows.Data.Text.SemanticTextQuery)) { + if (this._inputElement.value !== "") { + this._hitFinder = new Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._inputElement.lang); + } else { + this._hitFinder = null; + } + } + } + + // If focus is returning to the input box from outside the search control, show the flyout and refresh the suggestions + if ((event.target === this._inputElement) && !this._isElementInSearchControl(event.relatedTarget)) { + this._showFlyout(); + // If focus is not in input + if (this._currentFocusedIndex !== -1) { + this._selectSuggestionAtIndex(this._currentFocusedIndex); + } else { + this._updateFakeFocus(); + } + + if (this._searchSuggestionManager) { + this._searchSuggestionManager.setQuery( + this._inputElement.value, + this._lastKeyPressLanguage, + this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/) + ); + } + } + + utilities.addClass(this.element, ClassName.searchBoxInputFocus); + this._updateSearchButtonClass(); + }, + + _searchBoxFocusOutHandler: function SearchBox_searchBoxFocusOutHandler(event) { + this._hideFlyoutIfLeavingSearchControl(event.relatedTarget); + utilities.removeClass(this.element, ClassName.searchBoxInputFocus); + this._updateSearchButtonClass(); + this._isProcessingDownKey = false; + this._isProcessingUpKey = false; + this._isProcessingTabKey = false; + this._isProcessingEnterKey = false; + }, + + _isIMEOccludingFlyout: function SearchBox_isIMEOccludingFlyout(imeRect) { + var flyoutTop = this._getFlyoutTop(); + var flyoutBottom = this._getFlyoutBottom(); + if (((imeRect.top >= flyoutTop) && (imeRect.top <= flyoutBottom)) || + ((imeRect.bottom >= flyoutTop) && (imeRect.bottom <= flyoutBottom))) { + return true; + } + return false; + }, + + _addFlyoutIMEPaddingIfRequired: function SearchBox_addFlyoutIMEPaddingIfRequired() { + if (this._isFlyoutShown() && this._isFlyoutBelow() && this._inputElement.msGetInputContext && this._inputElement.msGetInputContext()) { + var context = this._inputElement.msGetInputContext(); + var rect = context.getCandidateWindowClientRect(); + if (this._isIMEOccludingFlyout(rect)) { + var animation = WinJS.UI.Animation.createRepositionAnimation(this._flyoutDivElement.children); + this._flyoutDivElement.style.paddingTop = (rect.bottom - rect.top) + "px"; + animation.execute(); + } + } + }, + + _msCandidateWindowShowHandler: function SearchBox_msCandidateWindowShowHandler(event) { + this._addFlyoutIMEPaddingIfRequired(); + this._reflowImeOnPointerRelease = false; + }, + + _msCandidateWindowHideHandler: function SearchBox_msCandidateWindowHideHandler(event) { + if (!this._isFlyoutPointerDown) { + var animation = WinJS.UI.Animation.createRepositionAnimation(this._flyoutDivElement.children); + this._flyoutDivElement.style.paddingTop = ""; + animation.execute(); + } + else { + this._reflowImeOnPointerRelease = true; + } + }, + + _wireupUserEvents: function SearchBox_wireupUserEvents() { + var inputOrImeChangeHandler = this._inputOrImeChangeHandler.bind(this); + this._buttonElement.addEventListener("click", this._buttonClickHandler.bind(this)); + this._inputElement.addEventListener("input", inputOrImeChangeHandler); + this._inputElement.addEventListener("keydown", this._keyDownHandler.bind(this)); + this._inputElement.addEventListener("keypress", this._keyPressHandler.bind(this)); + this._inputElement.addEventListener("keyup", this._keyUpHandler.bind(this)); + this._inputElement.addEventListener("pointerdown", this._inputPointerDownHandler.bind(this)); + this._flyoutDivElement.addEventListener("pointerdown", this._flyoutPointerDownHandler.bind(this)); + this._flyoutDivElement.addEventListener("pointerup", this._flyoutPointerReleasedHandler.bind(this)); + this._flyoutDivElement.addEventListener("pointercancel", this._flyoutPointerReleasedHandler.bind(this)); + this._flyoutDivElement.addEventListener("pointerout", this._flyoutPointerReleasedHandler.bind(this)); + this.element.addEventListener("focusin", this._searchBoxFocusInHandler.bind(this)); + this.element.addEventListener("focusout", this._searchBoxFocusOutHandler.bind(this)); + + this._inputElement.addEventListener("compositionstart", inputOrImeChangeHandler); + this._inputElement.addEventListener("compositionupdate", inputOrImeChangeHandler); + this._inputElement.addEventListener("compositionend", inputOrImeChangeHandler); + + if (this._inputElement.msGetInputContext && this._inputElement.msGetInputContext()) { + var context = this._inputElement.msGetInputContext(); + context.addEventListener("MSCandidateWindowShow", this._msCandidateWindowShowHandler.bind(this)); + context.addEventListener("MSCandidateWindowHide", this._msCandidateWindowHideHandler.bind(this)); + } + }, + + _repeaterChangedHandler: function SearchBox_repeaterChangedHandler(ev) { + this._updateFlyoutTopAndTouchAction(); + if (this._isFlyoutShown()) { + this._repeaterDivElement.style.display = "none"; + this._repeaterDivElement.style.display = "block"; + } + }, + + _wireupRepeaterEvents: function SearchBox_wireupRepeaterEvents() { + var repeaterChangeHandler = this._repeaterChangedHandler.bind(this); + this._repeater.addEventListener("itemchanged", repeaterChangeHandler); + this._repeater.addEventListener("iteminserted", repeaterChangeHandler); + this._repeater.addEventListener("itemremoved", repeaterChangeHandler); + this._repeater.addEventListener("itemsreloaded", repeaterChangeHandler); + }, + + _inputPointerDownHandler: function SearchBox_inputPointerDownHandler(ev) { + if ((document.activeElement === this._inputElement) && (this._currentSelectedIndex !== -1)) { + this._currentFocusedIndex = -1; + this._selectSuggestionAtIndex(this._currentFocusedIndex); + } + }, + + _flyoutPointerDownHandler: function SearchBox_flyoutPointerDownHandler(ev) { + this._isFlyoutPointerDown = true; + var srcElement = ev.srcElement; + while (srcElement && (srcElement.parentNode !== this._repeaterDivElement)) { + srcElement = srcElement.parentNode; + } + var index = this._findSuggestionElementIndex(srcElement); + if ((index >= 0) && (index < this._suggestionsData.length) && (this._currentFocusedIndex !== index)) { + if (this._isSuggestionSelectable(this._suggestionsData.getAt(index))) { + this._currentFocusedIndex = index; + this._selectSuggestionAtIndex(index); + this._updateQueryTextWithSuggestionText(this._currentFocusedIndex); + } + } + // Prevent default so focus does not leave input element. + ev.preventDefault(); + }, + + _flyoutPointerReleasedHandler: function SearchBox_flyoutPointerReleasedHandler(ev) { + this._isFlyoutPointerDown = false; + + if (this._reflowImeOnPointerRelease) { + this._reflowImeOnPointerRelease = false; + var animation = WinJS.UI.Animation.createRepositionAnimation(this._flyoutDivElement.children); + this._flyoutDivElement.style.paddingTop = ""; + animation.execute(); + } + }, + + _isElementInSearchControl: function SearchBox_isElementInSearchControl(targetElement) { + return this.element.contains(targetElement) || (this.element === targetElement); + }, + + _hideFlyoutIfLeavingSearchControl: function SearchBox__hideFlyoutIfLeavingSearchControl(targetElement) { + if (!this._isFlyoutShown()) { + return; + } + if (!this._isElementInSearchControl(targetElement)) { + this._hideFlyout(); + } + }, + + _wireupWinRTEvents: function SearchBox_wireupWinRTEvents() { + if (this._searchSuggestions) { + this._searchSuggestions.addEventListener("vectorchanged", this._suggestionsChangedHandlerBind); + } + if (this._searchSuggestionManager) { + this._searchSuggestionManager.addEventListener("suggestionsrequested", this._suggestionsRequestedHandlerBind); + } + }, + + _suggestionsChangedHandler: function SearchBox_suggestionsChangedHandler(event) { + var collectionChange = event.collectionChange; + if (collectionChange === Windows.Foundation.Collections.CollectionChange.reset) { + if (this._isFlyoutShown()) { + this._hideFlyout(); + } + this._suggestionsData.splice(0, this._suggestionsData.length); + } else if (collectionChange === Windows.Foundation.Collections.CollectionChange.itemInserted) { + var index = event.index; + var suggestion = this._searchSuggestions[index]; + this._suggestionsData.splice(index, 0, suggestion); + + this._showFlyout(); + + } else if (collectionChange === Windows.Foundation.Collections.CollectionChange.itemRemoved) { + if ((this._suggestionsData.length === 1)) { + try { + this._inputElement.setActive(); + } catch (e) { + } + this._hideFlyout(); + } + var index = event.index; + this._suggestionsData.splice(index, 1); + } else if (collectionChange === Windows.Foundation.Collections.CollectionChange.itemChanged) { + var index = event.index; + var suggestion = this._searchSuggestions[index]; + if (suggestion !== this._suggestionsData.getAt(index)) { + this._suggestionsData.setAt(index, suggestion); + } else { + // If the suggestions manager gives us an identical item, it means that only the hit highlighted text has changed. + var existingElement = this._repeater.elementFromIndex(index); + if (utilities.hasClass(existingElement, ClassName.searchBoxSuggestionQuery)) { + this._addHitHighlightedText(existingElement, suggestion, suggestion.text); + } + else { + var resultSuggestionDiv = existingElement.querySelector("." + ClassName.searchBoxSuggestionResultText); + if (resultSuggestionDiv) { + this._addHitHighlightedText(resultSuggestionDiv, suggestion, suggestion.text); + var resultSuggestionDetailDiv = existingElement.querySelector("." + ClassName.searchBoxSuggestionResultDetailedText); + if (resultSuggestionDetailDiv) { + this._addHitHighlightedText(resultSuggestionDetailDiv, suggestion, suggestion.detailText); + } + } + } + } + } + + if (document.activeElement === this._inputElement) { + this._updateFakeFocus(); + } + }, + + _suggestionsRequestedHandler: function SearchBox_suggestionsRequestedHandler(event) { + // get the most up to date value of the input langauge from WinRT if available + if ((window.Windows) && (Windows.Globalization) && (Windows.Globalization.Language)) { + this._lastKeyPressLanguage = Windows.Globalization.Language.currentInputMethodLanguageTag; + } + + var suggestionsRequestedEventDetail = event; + var deferral; + this._fireEvent(WinJS.UI.SearchBox._EventName.suggestionsrequested, { + setPromise: function (promise) { + deferral = suggestionsRequestedEventDetail.request.getDeferral(); + promise.then(function () { + deferral.complete(); + }); + }, + searchSuggestionCollection: suggestionsRequestedEventDetail.request.searchSuggestionCollection, + language: this._lastKeyPressLanguage, + linguisticDetails: this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/), + queryText: this._inputElement.value + }); + }, + + _fireEvent: function SearchBox_fireEvent(type, detail) { + // Returns true if ev.preventDefault() was not called + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, true, detail); + return this.element.dispatchEvent(event); + }, + + _requestingFocusOnKeyboardInputHandler: function SearchBox_requestingFocusOnKeyboardInputHandler(event) { + this._fireEvent(WinJS.UI.SearchBox._EventName.receivingfocusonkeyboardinput, null); + if (document.activeElement !== this._inputElement) { + try { + this._inputElement.focus(); + } catch (e) { + } + } + }, + + _hasLinguisticDetailsChanged: function SearchBox_hasLinguisticDetailsChanged(newLinguisticDetails) { + var hasLinguisticDetailsChanged = false; + if ((this._prevLinguisticDetails.queryTextCompositionStart !== newLinguisticDetails.queryTextCompositionStart) || + (this._prevLinguisticDetails.queryTextCompositionLength !== newLinguisticDetails.queryTextCompositionLength) || + (this._prevLinguisticDetails.queryTextAlternatives.length !== newLinguisticDetails.queryTextAlternatives.length)) { + hasLinguisticDetailsChanged = true; + } + this._prevLinguisticDetails = newLinguisticDetails; + return hasLinguisticDetailsChanged; + }, + + _isProcessingImeFocusLossKey: function SearchBox_isProcessingImeFocusLossKey() { + return this._isProcessingDownKey || this._isProcessingUpKey || this._isProcessingTabKey || this._isProcessingEnterKey; + }, + + _updateQueryTextWithSuggestionText: function SearchBox_updateQueryTextWithSuggestionText(suggestionIndex) { + if ((suggestionIndex >= 0) && (suggestionIndex < this._suggestionsData.length)) { + this.queryText = this._suggestionsData.getAt(suggestionIndex).text; + } + } + + }, { + _EventName: { + querychanged: EventName.querychanged, + querysubmitted: EventName.querysubmitted, + resultsuggestionchosen: EventName.resultsuggestionchosen, + suggestionsrequested: EventName.suggestionsrequested, + receivingfocusonkeyboardinput: EventName.receivingfocusonkeyboardinput + }, + + _Constants: { + MIN_POPUP_HEIGHT: 152, + IME_HANDLED_KEYCODE: 229 + }, + + _getKeyModifiers: function SearchBox_getKeyModifiers(ev) { + + // Returns the same value as http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.system.virtualkeymodifiers + var VirtualKeys = { + ctrlKey: 1, + altKey: 2, + shiftKey: 4 + }; + + var keyModifiers = 0; + if (ev.ctrlKey) { + keyModifiers |= VirtualKeys.ctrlKey; + } + if (ev.altKey) { + keyModifiers |= VirtualKeys.altKey; + } + if (ev.shiftKey) { + keyModifiers |= VirtualKeys.shiftKey; + } + return keyModifiers; + }, + + _sortAndMergeHits: function searchBox_sortAndMergeHits(hitsProvided) { + var reducedHits = []; + if (hitsProvided) { + // Copy hitsprovided array as winrt objects are immutable. + var hits = new Array(hitsProvided.length); + for (var i = 0; i < hitsProvided.length; i++) { + hits.push({ startPosition: hitsProvided[i].startPosition, length: hitsProvided[i].length }); + } + hits.sort(WinJS.UI.SearchBox._hitStartPositionAscendingSorter); + hits.reduce(WinJS.UI.SearchBox._hitIntersectionReducer, reducedHits); + } + return reducedHits; + }, + + _hitStartPositionAscendingSorter: function searchBox_hitStartPositionAscendingSorter(firstHit, secondHit) { + var returnValue = 0; + if (firstHit.startPosition < secondHit.startPosition) { + returnValue = -1; + } else if (firstHit.startPosition > secondHit.startPosition) { + returnValue = 1; + } + return returnValue; + }, + + _hitIntersectionReducer: function searchBox_hitIntersectionReducer(reducedHits, nextHit, currentIndex, originalList) { + if (currentIndex === 0) { + reducedHits.push(nextHit); + } else { + var curHit = reducedHits[reducedHits.length - 1]; + var curHitEndPosition = curHit.startPosition + curHit.length; + //#DBG _ASSERT(nextHit.startPosition >= curHit.startPosition); + if (nextHit.startPosition <= curHitEndPosition) { + // The next hit intersects or is next to current hit. Merge it. + var nextHitEndPosition = nextHit.startPosition + nextHit.length; + if (nextHitEndPosition > curHitEndPosition) { + curHit.length = nextHitEndPosition - curHit.startPosition; + } + } else { + // No intersection, simply add to reduced list. + reducedHits.push(nextHit); + } + } + return reducedHits; + }, + + _isTypeToSearchKey: function searchBox__isTypeToSearchKey(event) { + if (event.shiftKey || event.ctrlKey || event.altKey) { + return false; + } + return true; + } + }); + WinJS.Class.mix(SearchBox, WinJS.UI.DOMEventMixin); + return SearchBox; + }) + }); + +})(this, WinJS); + +/// appbar,Flyout,Flyouts,registeredforsettings,SettingsFlyout,Statics,Syriac +(function settingsFlyoutInit(WinJS) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Provides users with fast, in-context access to settings that affect the current app. + /// + /// + /// Settings Flyout + /// + /// + /// + ///
+ /// + ///
Custom Settings
+ ///
+ ///
+ /// {Your Content Here} + ///
+ /// ]]>
+ /// Raised just before showing a SettingsFlyout. + /// Raised immediately after a SettingsFlyout is fully shown. + /// Raised just before hiding a SettingsFlyout. + /// Raised immediately after a SettingsFlyout is fully hidden. + /// The SettingsFlyout control itself. + /// + /// + /// + SettingsFlyout: WinJS.Namespace._lazy(function () { + var thisWinUI = WinJS.UI; + + var focusHasHitSettingsPaneOnce; + + // Class Names + var settingsFlyoutClass = "win-settingsflyout", + fullSettingsFlyoutClassName = "." + settingsFlyoutClass, + settingsFlyoutLightClass = "win-ui-light", + narrowClass = "win-narrow", + wideClass = "win-wide"; + + var firstDivClass = "win-firstdiv"; + var finalDivClass = "win-finaldiv"; + + // Constants for width + var settingsNarrow = "narrow", + settingsWide = "wide"; + + // Determine if the settings pane (system language) is RTL or not. + function _shouldAnimateFromLeft() { + if (WinJS.Utilities.hasWinRT && Windows.UI.ApplicationSettings.SettingsEdgeLocation) { + var appSettings = Windows.UI.ApplicationSettings; + return (appSettings.SettingsPane.edge === appSettings.SettingsEdgeLocation.left); + } else { + return false; + } + }; + + // Get the settings control by matching the settingsCommandId + // if no match we'll try to match element id + function _getChildSettingsControl(parentElement, id) { + var settingElements = parentElement.querySelectorAll(fullSettingsFlyoutClassName); + var retValue, + control; + for (var i = 0; i < settingElements.length; i++) { + control = settingElements[i].winControl; + if (control) { + if (control.settingsCommandId === id) { + retValue = control; + break; + } + if (settingElements[i].id === id) { + retValue = retValue || control; + } + } + } + + return retValue; + } + + var SettingsFlyout = WinJS.Class.derive(WinJS.UI._Overlay, function SettingsFlyout_ctor(element, options) { + /// + /// Creates a new SettingsFlyout control. + /// + /// The DOM element that will host the control. + /// + /// + /// The set of properties and values to apply to the new SettingsFlyout. + /// + /// The new SettingsFlyout control. + /// + /// + + // Make sure there's an input element + this._element = element || document.createElement("div"); + this._id = this._element.id || this._element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + // Call the base overlay constructor helper + this._baseOverlayConstructor(this._element, options); + + this._addFirstDiv(); + this._addFinalDiv(); + + // Handle "esc" & "tab" key presses + this._element.addEventListener("keydown", this._handleKeyDown, true); + + // Make a click eating div + thisWinUI._Overlay._createClickEatingDivAppBar(); + + // Start settings hidden + this._element.style.visibilty = "hidden"; + this._element.style.display = "none"; + + // Attach our css class + WinJS.Utilities.addClass(this._element, settingsFlyoutClass); + + // apply the light theme styling to the win-content elements inside the SettingsFlyout + WinJS.Utilities.query("div.win-content", this._element). + forEach(function (e) { + if (!e.msMatchesSelector('.win-ui-dark, .win-ui-dark *')) { + WinJS.Utilities.addClass(e, settingsFlyoutLightClass); + } + }); + + // Make sure we have an ARIA role + var role = this._element.getAttribute("role"); + if (role === null || role === "" || role === undefined) { + this._element.setAttribute("role", "dialog"); + } + var label = this._element.getAttribute("aria-label"); + if (label === null || label === "" || label === undefined) { + this._element.setAttribute("aria-label", strings.ariaLabel); + } + + // Make sure _Overlay event handlers are hooked up + this._addOverlayEventHandlers(true); + + // Make sure animations are hooked up + this._currentAnimateIn = this._animateSlideIn; + this._currentAnimateOut = this._animateSlideOut; + this._writeProfilerMark("constructor,StopTM"); + }, { + // Public Properties + + /// + /// Width of the SettingsFlyout, "narrow", or "wide". + /// + /// SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class. + /// + /// + /// + width: { + get: function () { + return this._width; + }, + + set: function (value) { + WinJS.Utilities._deprecated(strings.widthDeprecationMessage); + if (value === this._width) { + return; + } + // Get rid of old class + if (this._width === settingsNarrow) { + WinJS.Utilities.removeClass(this._element, narrowClass); + } else if (this._width === settingsWide) { + WinJS.Utilities.removeClass(this._element, wideClass); + } + this._width = value; + + // Attach our new css class + if (this._width === settingsNarrow) { + WinJS.Utilities.addClass(this._element, narrowClass); + } else if (this._width === settingsWide) { + WinJS.Utilities.addClass(this._element, wideClass); + } + } + }, + + /// + /// Define the settings command Id for the SettingsFlyout control. + /// + /// + settingsCommandId: { + get: function () { + return this._settingsCommandId; + }, + + set: function (value) { + this._settingsCommandId = value; + } + }, + + show: function () { + /// + /// + /// Shows the SettingsFlyout, if hidden. + /// + /// + /// + // Just call private version to make appbar flags happy + + // Don't do anything if disabled + if (this.disabled) { + return; + } + this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow(). + this._show(); + }, + + _dispose: function SettingsFlyout_dispose() { + WinJS.Utilities.disposeSubTree(this.element); + this._dismiss(); + }, + + _show: function SettingsFlyout_show() { + // We call our base "_baseShow" because SettingsFlyout overrides show + this._baseShow(); + // Need click-eating div to be visible, + // (even if now hiding, we'll show and need click eater) + thisWinUI._Overlay._showClickEatingDivAppBar(); + }, + + _endShow: function SettingsFlyout_endShow() { + // Clean up after showing + this._initAfterAnimation(); + }, + + _initAfterAnimation: function SettingsFlyout_initAfterAnimation() { + focusHasHitSettingsPaneOnce = 0; + + // Verify that the firstDiv and finalDiv are in the correct location. + // Move them to the correct location or add them if they are not. + if (!WinJS.Utilities.hasClass(this.element.children[0], firstDivClass)) { + var firstDiv = this.element.querySelectorAll(".win-first"); + if (firstDiv && firstDiv.length > 0) { + firstDiv.item(0).parentNode.removeChild(firstDiv.item(0)); + } + + this._addFirstDiv(); + } + + // Set focus to the firstDiv + if (this.element.children[0]) { + this.element.children[0].addEventListener("focusout", function () { focusHasHitSettingsPaneOnce = 1; }, false); + this.element.children[0].focus(); + } + + if (!WinJS.Utilities.hasClass(this.element.children[this.element.children.length - 1], finalDivClass)) { + var finalDiv = this.element.querySelectorAll(".win-final"); + if (finalDiv && finalDiv.length > 0) { + finalDiv.item(0).parentNode.removeChild(finalDiv.item(0)); + } + + this._addFinalDiv(); + } + + this._setBackButtonsAriaLabel(); + }, + + _setBackButtonsAriaLabel: function SettingsFlyout_setBackButtonsAriaLabel() { + var backbuttons = this.element.querySelectorAll(".win-backbutton"); + var label; + for (var i = 0; i < backbuttons.length; i++) { + label = backbuttons[i].getAttribute("aria-label"); + if (label === null || label === "" || label === undefined) { + backbuttons[i].setAttribute("aria-label", strings.backbuttonAriaLabel); + } + } + }, + + hide: function () { + /// + /// + /// Hides the SettingsFlyout, if visible, regardless of other state. + /// + /// + /// + // Just call private version to make appbar flags happy + this._writeProfilerMark("hide,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndHide(). + this._hide(); + }, + + _hide: function SettingsFlyout_hide() { + if (this._baseHide()) { + // Need click-eating div to be hidden + thisWinUI._Overlay._hideClickEatingDivAppBar(); + } + }, + + // SettingsFlyout animations + _animateSlideIn: function SettingsFlyout_animateSlideIn() { + var animateFromLeft = _shouldAnimateFromLeft(); + var offset = animateFromLeft ? "-100px" : "100px"; + WinJS.Utilities.query("div.win-content", this._element). + forEach(function (e) { WinJS.UI.Animation.enterPage(e, { left: offset }) }); + + var where, + width = this._element.offsetWidth; + // Slide in from right side or left side? + if (animateFromLeft) { + // RTL + where = { top: "0px", left: "-" + width + "px" }; + this._element.style.right = "auto"; + this._element.style.left = "0px"; + } else { + // From right side + where = { top: "0px", left: width + "px" }; + this._element.style.right = "0px"; + this._element.style.left = "auto"; + } + + this._element.style.opacity = 1; + this._element.style.visibility = "visible"; + + return WinJS.UI.Animation.showPanel(this._element, where); + }, + + _animateSlideOut: function SettingsFlyout_animateSlideOut() { + var where, + width = this._element.offsetWidth; + if (_shouldAnimateFromLeft()) { + // RTL + where = { top: "0px", left: width + "px" }; + this._element.style.right = "auto"; + this._element.style.left = "-" + width + "px"; + } else { + // From right side + where = { top: "0px", left: "-" + width + "px" }; + this._element.style.right = "-" + width + "px"; + this._element.style.left = "auto"; + } + + return WinJS.UI.Animation.showPanel(this._element, where); + }, + + _fragmentDiv: { + get: function SettingsFlyout_fragmentDiv_get() { + return this._fragDiv; + }, + + set: function SettingsFlyout_fragmentDiv_set(value) { + this._fragDiv = value; + } + }, + + _unloadPage: function SettingsFlyout_unloadPage(event) { + var settingsControl = event.currentTarget.winControl; + settingsControl.removeEventListener(thisWinUI._Overlay.afterHide, this._unloadPage, false); + + WinJS.Promise.as().then(function () { + if (settingsControl._fragmentDiv) { + document.body.removeChild(settingsControl._fragmentDiv); + settingsControl._fragmentDiv = null; + } + }); + }, + + _dismiss: function SettingsFlyout_dismiss() { + this.addEventListener(thisWinUI._Overlay.afterHide, this._unloadPage, false); + this._hide(); + }, + + _handleKeyDown: function SettingsFlyout_handleKeyDown(event) { + if (event.key === "Esc") { + event.preventDefault(); + event.stopPropagation(); + this.winControl._dismiss(); + } else if ((event.key === "Spacebar" || event.key === "Enter") + && (this.children[0] === document.activeElement)) { + event.preventDefault(); + event.stopPropagation(); + this.winControl._dismiss(); + } else if (event.shiftKey && event.key === "Tab" + && this.children[0] === document.activeElement) { + event.preventDefault(); + event.stopPropagation(); + var _elms = this.getElementsByTagName("*"); + + for (var i = _elms.length - 2; i >= 0; i--) { + _elms[i].focus(); + + if (_elms[i] === document.activeElement) { + break; + } + } + } + }, + + _focusOnLastFocusableElementFromParent: function SettingsFlyout_focusOnLastFocusableElementFromParent() { + var active = document.activeElement; + if (!focusHasHitSettingsPaneOnce || !active || !WinJS.Utilities.hasClass(active, firstDivClass)) { + return; + } + + var _elms = this.parentElement.getElementsByTagName("*"); + + // There should be at least 1 element in addition to the firstDiv & finalDiv + if (_elms.length <= 2) { + return; + } + + // Get the tabIndex set to the finalDiv (which is the highest) + var _highestTabIndex = _elms[_elms.length - 1].tabIndex; + + // If there are positive tabIndices, set focus to the element with the highest tabIndex. + // Otherwise set focus to the last focusable element in DOM order. + if (_highestTabIndex) { + for (var i = _elms.length - 2; i > 0; i--) { + if (_elms[i].tabIndex === _highestTabIndex) { + _elms[i].focus(); + break; + } + } + } else { + for (i = _elms.length - 2; i > 0; i--) { + // Skip
with undefined tabIndex (To work around Win8 bug #622245) + if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) { + _elms[i].focus(); + + if (_elms[i] === document.activeElement) { + break; + } + } + } + } + }, + + _focusOnFirstFocusableElementFromParent: function SettingsFlyout_focusOnFirstFocusableElementFromParent() { + var active = document.activeElement; + if (!active || !WinJS.Utilities.hasClass(active, finalDivClass)) { + return; + } + var _elms = this.parentElement.getElementsByTagName("*"); + + // There should be at least 1 element in addition to the firstDiv & finalDiv + if (_elms.length <= 2) { + return; + } + + // Get the tabIndex set to the firstDiv (which is the lowest) + var _lowestTabIndex = _elms[0].tabIndex; + + // If there are positive tabIndices, set focus to the element with the lowest tabIndex. + // Otherwise set focus to the first focusable element in DOM order. + if (_lowestTabIndex) { + for (var i = 1; i < _elms.length - 1; i++) { + if (_elms[i].tabIndex === _lowestTabIndex) { + _elms[i].focus(); + break; + } + } + } else { + for (i = 1; i < _elms.length - 1; i++) { + // Skip
with undefined tabIndex (To work around Win8 bug #622245) + if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) { + _elms[i].focus(); + + if (_elms[i] === document.activeElement) { + break; + } + } + } + } + }, + + // Create and add a new first div to the beginning of the list + _addFirstDiv: function SettingsFlyout_addFirstDiv() { + var _elms = this._element.getElementsByTagName("*"); + var _minTab = 0; + for (var i = 0; i < _elms.length; i++) { + if ((0 < _elms[i].tabIndex) && (_minTab === 0 || _elms[i].tabIndex < _minTab)) { + _minTab = _elms[i].tabIndex; + } + } + var firstDiv = document.createElement("div"); + firstDiv.className = firstDivClass; + firstDiv.style.display = "inline"; + firstDiv.setAttribute("role", "menuitem"); + firstDiv.setAttribute("aria-hidden", "true"); + firstDiv.tabIndex = _minTab; + firstDiv.addEventListener("focus", this._focusOnLastFocusableElementFromParent, false); + + this._element.insertAdjacentElement("AfterBegin", firstDiv); + }, + + // Create and add a new final div to the end of the list + _addFinalDiv: function SettingsFlyout_addFinalDiv() { + var _elms = this._element.getElementsByTagName("*"); + var _maxTab = 0; + for (var i = 0; i < _elms.length; i++) { + if (_elms[i].tabIndex > _maxTab) { + _maxTab = _elms[i].tabIndex; + } + } + var finalDiv = document.createElement("div"); + finalDiv.className = finalDivClass; + finalDiv.style.display = "inline"; + finalDiv.setAttribute("role", "menuitem"); + finalDiv.setAttribute("aria-hidden", "true"); + finalDiv.tabIndex = _maxTab; + finalDiv.addEventListener("focus", this._focusOnFirstFocusableElementFromParent, false); + + this._element.appendChild(finalDiv); + }, + + _writeProfilerMark: function SettingsFlyout_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI.SettingsFlyout:" + this._id + ":" + text); + } + }); + + // Statics + SettingsFlyout.show = function () { + /// + /// + /// Shows the SettingsPane UI, if hidden, regardless of other states. + /// + /// + /// + if (WinJS.Utilities.hasWinRT) { + Windows.UI.ApplicationSettings.SettingsPane.show(); + } + // And hide the WWA one + var elements = document.querySelectorAll('div[data-win-control="WinJS.UI.SettingsFlyout"]'); + var len = elements.length; + for (var i = 0; i < len; i++) { + var settingsFlyout = elements[i].winControl; + if (settingsFlyout) { + settingsFlyout._dismiss(); + } + } + }; + + var _settingsEvent = { event: undefined }; + SettingsFlyout.populateSettings = function (e) { + /// + /// + /// Loads a portion of the SettingsFlyout. Your app calls this when the user invokes a settings command and the WinJS.Application.onsettings event occurs. + /// + /// + /// An object that contains information about the event, received from the WinJS.Application.onsettings event. The detail property of this object contains + /// the applicationcommands sub-property that you set to an array of settings commands. + /// + /// + /// + _settingsEvent.event = e.detail; + + if (_settingsEvent.event.applicationcommands) { + var n = Windows.UI.ApplicationSettings; + Object.keys(_settingsEvent.event.applicationcommands).forEach(function (name) { + var setting = _settingsEvent.event.applicationcommands[name]; + if (!setting.title) { setting.title = name; } + var command = new n.SettingsCommand(name, setting.title, thisWinUI.SettingsFlyout._onSettingsCommand); + _settingsEvent.event.e.request.applicationCommands.append(command); + }); + } + }; + + SettingsFlyout._onSettingsCommand = function (command) { + var id = command.id; + if (_settingsEvent.event.applicationcommands && _settingsEvent.event.applicationcommands[id]) { + thisWinUI.SettingsFlyout.showSettings(id, _settingsEvent.event.applicationcommands[id].href); + } + }; + + SettingsFlyout.showSettings = function (id, path) { + /// + /// + /// Show the SettingsFlyout using the settings element identifier (ID) and the path of the page that contains the settings element. + /// + /// + /// The ID of the settings element. + /// + /// + /// The path of the page that contains the settings element. + /// + /// + /// + var control = _getChildSettingsControl(document, id); + if (control) { + control.show(); + } else if (path) { + var divElement = document.createElement("div"); + divElement = document.body.appendChild(divElement); + WinJS.UI.Pages.render(path, divElement).then(function () { + control = _getChildSettingsControl(divElement, id); + if (control) { + control._fragmentDiv = divElement; + control.show(); + } else { + document.body.removeChild(divElement); + } + }); + } else { + throw new WinJS.ErrorFromName("WinJS.UI.SettingsFlyout.BadReference", strings.badReference); + } + }; + + var strings = { + get ariaLabel() { return WinJS.Resources._getWinJSString("ui/settingsFlyoutAriaLabel").value; }, + get badReference() { return WinJS.Resources._getWinJSString("ui/badReference").value; }, + get backbuttonAriaLabel() { return WinJS.Resources._getWinJSString("ui/backbuttonarialabel").value; }, + get widthDeprecationMessage() { return WinJS.Resources._getWinJSString("ui/settingsFlyoutWidthIsDeprecated").value; }, + }; + + return SettingsFlyout; + }) + }); + + +})(WinJS); + + +(function itemContainerInit(global, WinJS, undefined) { + "use strict"; + + var utilities = WinJS.Utilities; + var createEvent = utilities._createEventProperty; + var eventNames = { + invoked: "invoked", + selectionchanging: "selectionchanging", + selectionchanged: "selectionchanged" + }; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Defines an item that can be pressed, swiped, and dragged. + /// + /// + /// + /// HTML content
+ /// ]]> + /// Raised when the user taps or clicks the item. + /// Raised before the item is selected or deselected. + /// Raised after the item is selected or deselected. + /// Main container for the selection item control. + /// The background of a selection checkmark. + /// A selection checkmark. + /// Used to display an outline when the main container has keyboard focus. + /// + /// + /// + ItemContainer: WinJS.Namespace._lazy(function () { + var strings = { + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; } + }; + + var ItemContainer = WinJS.Class.define(function ItemContainer_ctor(element, options) { + /// + /// + /// Creates a new ItemContainer control. + /// + /// + /// The DOM element that hosts the ItemContainer control. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. + /// Each property of the options object corresponds to one of the control's properties or events. + /// Event names must begin with "on". For example, to provide a handler for the selectionchanging event, + /// add a property named "onselectionchanging" to the options object and set its value to the event handler. + /// + /// + /// The new ItemContainer control. + /// + /// + element = element || document.createElement("DIV"); + this._id = element.id || element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + options = options || {}; + + if (element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.ItemContainer.DuplicateConstruction", strings.duplicateConstruction); + } + + // Attaching JS control to DOM element + element.winControl = this; + + this._element = element; + WinJS.Utilities.addClass(element, "win-disposable"); + this._selectionMode = WinJS.UI.SelectionMode.single; + this._draggable = false; + this._pressedEntity = { type: WinJS.UI.ObjectType.item, index: WinJS.UI._INVALID_INDEX }; + + this.tapBehavior = WinJS.UI.TapBehavior.invokeOnly; + this.swipeOrientation = WinJS.UI.Orientation.vertical; + this.swipeBehavior = WinJS.UI.SwipeBehavior.select; + + WinJS.Utilities.addClass(this.element, WinJS.UI.ItemContainer._ClassName.itemContainer + " " + WinJS.UI._containerClass); + + this._setupInternalTree(); + + this._selection = new WinJS.UI._SingleItemSelectionManager(element, this._itemBox); + this._setTabIndex(); + + WinJS.UI.setOptions(this, options); + + this._mutationObserver = new MutationObserver(this._itemPropertyChange.bind(this)); + this._mutationObserver.observe(element, { attributes: true, attributeFilter: ["aria-selected"] }); + this._setAriaRole(); + + var that = this; + if (!this.selectionDisabled) { + setImmediate(function () { + that._setDirectionClass(); + }); + } + this._itemEventsHandler = new WinJS.UI._ItemEventsHandler(Object.create({ + containerFromElement: function (element) { + return that.element; + }, + indexForItemElement: function (element) { + return that.element.uniqueID; + }, + indexForHeaderElement: function () { + return WinJS.UI._INVALID_INDEX; + }, + itemBoxAtIndex: function (index) { + return that._itemBox; + }, + itemAtIndex: function (index) { + return that.element; + }, + headerAtIndex: function (index) { + return null; + }, + containerAtIndex: function (index) { + return that.element; + }, + isZombie: function () { + return this._disposed; + }, + getItemPosition: function (index) { + return that._getItemPosition(); + }, + rtl: function () { + return that._rtl(); + }, + fireInvokeEvent: function (itemIndex, itemElement) { + that._fireInvokeEvent(); + }, + verifySelectionAllowed: function (index) { + return that._verifySelectionAllowed(); + }, + changeFocus: function (newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused) { }, + selectRange: function (firstIndex, lastIndex, additive) { + return that._selection.set({ firstIndex: firstIndex, lastIndex: lastIndex }); + } + }, { + pressedEntity: { + get: function () { + return that._pressedEntity; + }, + set: function (value) { + that._pressedEntity = value; + } + }, + pressedElement: { + enumerable: true, + set: function (value) { + that._pressedElement = value; + } + }, + eventHandlerRoot: { + enumerable: true, + get: function () { + return that.element; + } + }, + swipeBehavior: { + enumerable: true, + get: function () { + return that._swipeBehavior; + } + }, + selectionMode: { + enumerable: true, + get: function () { + return that._selectionMode; + } + }, + accessibleItemClass: { + enumerable: true, + get: function () { + // CSS class of the element with the aria role + return WinJS.UI._containerClass; + } + }, + canvasProxy: { + enumerable: true, + get: function () { + return that._captureProxy; + } + }, + tapBehavior: { + enumerable: true, + get: function () { + return that._tapBehavior; + } + }, + draggable: { + enumerable: true, + get: function () { + return that._draggable; + } + }, + selection: { + enumerable: true, + get: function () { + return that._selection; + } + }, + horizontal: { + enumerable: true, + get: function () { + return that._swipeOrientation === WinJS.UI.Orientation.vertical; + } + }, + customFootprintParent: { + enumerable: true, + get: function () { + // Use the main container as the footprint + return null; + } + }, + skipPreventDefaultOnPointerDown: { + enumerable: true, + get: function () { + return true; + } + } + })); + + function eventHandler(eventName, caseSensitive, capture) { + return { + name: (caseSensitive ? eventName : eventName.toLowerCase()), + handler: function (eventObject) { + that["_on" + eventName](eventObject); + }, + capture: capture + }; + } + var events = [ + eventHandler("MSManipulationStateChanged", true, true), + eventHandler("PointerDown"), + eventHandler("Click"), + eventHandler("PointerUp"), + eventHandler("PointerCancel"), + eventHandler("LostPointerCapture"), + eventHandler("ContextMenu"), + eventHandler("MSHoldVisual", true), + eventHandler("Focus"), + eventHandler("Blur"), + eventHandler("DragStart"), + eventHandler("DragEnd"), + eventHandler("KeyDown") + ]; + events.forEach(function (eventHandler) { + that.element.addEventListener(eventHandler.name, eventHandler.handler, !!eventHandler.capture); + }); + + this._writeProfilerMark("constructor,StopTM"); + }, { + /// + element: { + get: function () { + return this._element; + } + }, + + /// + /// Gets or sets a value that specifies whether the item can be dragged. The default value is false. + /// + /// + draggable: { + get: function () { + return this._draggable; + }, + + set: function (value) { + if (this._draggable !== value) { + this._draggable = value; + this._updateDraggableAttribute(); + } + } + }, + + /// + /// Gets or sets a value that specifies whether the item is selected. + /// + selected: { + get: function () { + return this._selection.selected; + }, + + set: function (value) { + if (this._selection.selected !== value) { + this._selection.selected = value; + } + } + }, + + /// + /// Gets or sets the swipe orientation of the ItemContainer control. + /// The default value is "vertical". + /// + swipeOrientation: { + get: function () { + return this._swipeOrientation; + }, + set: function (value) { + if (value === WinJS.UI.Orientation.vertical) { + WinJS.Utilities.removeClass(this.element, WinJS.UI.ItemContainer._ClassName.horizontal); + WinJS.Utilities.addClass(this.element, WinJS.UI.ItemContainer._ClassName.vertical); + } else { + value = WinJS.UI.Orientation.horizontal; + WinJS.Utilities.removeClass(this.element, WinJS.UI.ItemContainer._ClassName.vertical); + WinJS.Utilities.addClass(this.element, WinJS.UI.ItemContainer._ClassName.horizontal); + } + this._swipeOrientation = value; + } + }, + + /// + /// Gets or sets how the ItemContainer control reacts when the user taps or clicks an item. + /// The tap or click can invoke the item, select it and invoke it, or have no effect. + /// Possible values: "toggleSelect", "invokeOnly", and "none". The default value is "invokeOnly". + /// + tapBehavior: { + get: function () { + return this._tapBehavior; + }, + set: function (value) { + this._tapBehavior = value; + this._setAriaRole(); + } + }, + + /// + /// Gets or sets how the ItemContainer control reacts to the swipe interaction. + /// The swipe gesture can select the item or it can have no effect on the current selection. + /// Possible values: "select", "none". The default value is: "select". + /// + /// + swipeBehavior: { + get: function () { + return this._swipeBehavior; + }, + set: function (value) { + this._swipeBehavior = value; + this._setSwipeClass(); + } + }, + + /// + /// Gets or sets whether the item selection is disabled. The default value is false. + /// + selectionDisabled: { + get: function () { + return this._selectionMode === WinJS.UI.SelectionMode.none; + }, + + set: function (value) { + if (value) { + this._selectionMode = WinJS.UI.SelectionMode.none; + } else { + this._setDirectionClass(); + this._selectionMode = WinJS.UI.SelectionMode.single; + } + this._setSwipeClass(); + this._setAriaRole(); + } + }, + + /// + /// Raised when the item is invoked. You can use the tapBehavior property to specify whether taps and clicks invoke the item. + /// + oninvoked: createEvent(eventNames.invoked), + + /// + /// Raised just before the item is selected or deselected. + /// + onselectionchanging: createEvent(eventNames.selectionchanging), + + /// + /// Raised after the item is selected or deselected. + /// + onselectionchanged: createEvent(eventNames.selectionchanged), + + forceLayout: function () { + /// + /// + /// Forces the ItemContainer control to update its layout. + /// Use this function when the reading direction of the app changes after the control has been initialized. + /// + /// + this._forceLayout(); + }, + + dispose: function () { + /// + /// + /// Disposes this control. + /// + /// + + if (this._disposed) { + return; + } + this._disposed = true; + + this._itemEventsHandler.dispose(); + WinJS.Utilities.disposeSubTree(this.element); + }, + + _onMSManipulationStateChanged: function ItemContainer_onMSManipulationStateChanged(eventObject) { + this._itemEventsHandler.onMSManipulationStateChanged(eventObject); + }, + + _onPointerDown: function ItemContainer_onPointerDown(eventObject) { + this._itemEventsHandler.onPointerDown(eventObject); + }, + + _onClick: function ItemContainer_onClick(eventObject) { + this._itemEventsHandler.onClick(eventObject); + }, + + _onPointerUp: function ItemContainer_onPointerUp(eventObject) { + if (utilities.hasClass(this._itemBox, WinJS.UI._itemFocusClass)) { + this._onBlur(eventObject); + } + this._itemEventsHandler.onPointerUp(eventObject); + }, + + _onPointerCancel: function ItemContainer_onPointerCancel(eventObject) { + this._itemEventsHandler.onPointerCancel(eventObject); + }, + + _onLostPointerCapture: function ItemContainer_onLostPointerCapture(eventObject) { + this._itemEventsHandler.onLostPointerCapture(eventObject); + }, + + _onContextMenu: function ItemContainer_onContextMenu(eventObject) { + this._itemEventsHandler.onContextMenu(eventObject); + }, + + _onMSHoldVisual: function ItemContainer_onMSHoldVisual(eventObject) { + this._itemEventsHandler.onMSHoldVisual(eventObject); + }, + + _onFocus: function ItemContainer_onFocus(eventObject) { + if (this._itemBox.querySelector("." + WinJS.UI._itemFocusOutlineClass) || !WinJS.UI._keyboardSeenLast) { + return; + } + utilities.addClass(this._itemBox, WinJS.UI._itemFocusClass); + var outline = document.createElement("div"); + outline.className = WinJS.UI._itemFocusOutlineClass; + this._itemBox.appendChild(outline); + }, + + _onBlur: function ItemContainer_onBlur(eventObject) { + utilities.removeClass(this._itemBox, WinJS.UI._itemFocusClass); + var outline = this._itemBox.querySelector("." + WinJS.UI._itemFocusOutlineClass); + if (outline) { + outline.parentNode.removeChild(outline); + } + }, + + _onDragStart: function ItemContainer_onDragStart(eventObject) { + // Drag shouldn't be initiated when the user holds down the mouse on a win-interactive element and moves. + // The problem is that the dragstart event's srcElement+target will both be an itembox (which has draggable=true), so we can't check for win-interactive in the dragstart event handler. + // The itemEventsHandler sets our _pressedElement field on PointerDown, so we use that instead when checking for interactive. + if (this._pressedElement && this._itemEventsHandler._isInteractive(this._pressedElement)) { + eventObject.preventDefault(); + } else { + this._dragging = true; + var that = this; + // We delay setting the win-dragsource CSS class so that IE has time to create a thumbnail before me make it opaque + setImmediate(function () { + if (that._dragging) { + utilities.addClass(that._itemBox, WinJS.UI._dragSourceClass); + } + }); + } + }, + + _onDragEnd: function ItemContainer_onDragEnd(eventObject) { + this._dragging = false; + utilities.removeClass(this._itemBox, WinJS.UI._dragSourceClass); + this._itemEventsHandler.resetPointerDownState(); + }, + + _onKeyDown: function ItemContainer_onKeyDown(eventObject) { + if (!this._itemEventsHandler._isInteractive(eventObject.srcElement)) { + var Key = utilities.Key, + keyCode = eventObject.keyCode, + swipeEnabled = this._swipeBehavior === WinJS.UI.SwipeBehavior.select; + + var handled = false; + if (!eventObject.ctrlKey && keyCode === Key.enter) { + var allowed = this._verifySelectionAllowed(); + if (allowed.canTapSelect) { + this.selected = !this.selected; + } + this._fireInvokeEvent(); + handled = true; + } else if (eventObject.ctrlKey && keyCode === Key.enter || + (swipeEnabled && eventObject.shiftKey && keyCode === Key.F10) || + (swipeEnabled && keyCode === Key.menu) || + keyCode === Key.space) { + if (!this.selectionDisabled) { + this.selected = !this.selected; + try { + this.element.setActive(); + } catch (e) { } + handled = true; + } + } else if (keyCode === Key.escape && this.selected) { + this.selected = false; + handled = true; + } + + if (handled) { + eventObject.stopPropagation(); + eventObject.preventDefault(); + } + } + }, + + _setTabIndex: function ItemContainer_setTabIndex() { + var currentTabIndex = this.element.getAttribute("tabindex"); + if (!currentTabIndex) { + // Set the tabindex to 0 only if the application did not already + // provide a tabindex + this.element.setAttribute("tabindex", "0") + } + }, + + _rtl: function ItemContainer_rtl() { + if (typeof this._cachedRTL !== "boolean") { + this._cachedRTL = window.getComputedStyle(this.element, null).direction === "rtl"; + } + return this._cachedRTL; + }, + + _setDirectionClass: function ItemContainer_setDirectionClass() { + utilities[this._rtl() ? "addClass" : "removeClass"](this.element, WinJS.UI._rtlListViewClass); + }, + + _forceLayout: function ItemContainer_forceLayout() { + this._cachedRTL = window.getComputedStyle(this.element, null).direction === "rtl"; + this._setDirectionClass(); + }, + + _getItemPosition: function ItemContainer_getItemPosition() { + var container = this.element; + if (container) { + return WinJS.Promise.wrap({ + left: (this._rtl() ? + container.offsetParent.offsetWidth - container.offsetLeft - container.offsetWidth : + container.offsetLeft), + top: container.offsetTop, + totalWidth: utilities.getTotalWidth(container), + totalHeight: utilities.getTotalHeight(container), + contentWidth: utilities.getContentWidth(container), + contentHeight: utilities.getContentHeight(container) + }); + } else { + return WinJS.Promise.cancel; + } + }, + + _itemPropertyChange: function ItemContainer_itemPropertyChange(list) { + if (this._disposed) { return; } + + var container = list[0].target; + var ariaSelected = container.getAttribute("aria-selected") === "true"; + + // Only respond to aria-selected changes coming from UIA. This check + // relies on the fact that, in renderSelection, we update the selection + // visual before aria-selected. + if (ariaSelected !== WinJS.UI._isSelectionRendered(this._itemBox)) { + if (this.selectionDisabled) { + // Revert the change made by UIA since the control has selection disabled + WinJS.UI._setAttribute(container, "aria-selected", !ariaSelected); + } else { + this.selected = ariaSelected; + // Revert the change because the update was prevented on the selectionchanging event + if (ariaSelected !== this.selected) { + WinJS.UI._setAttribute(container, "aria-selected", !ariaSelected); + } + } + } + }, + + _setSwipeClass: function ItemContainer_setSwipeClass() { + // We apply an -ms-touch-action style to block panning and swiping from occurring at the same time. + if ((this._swipeBehavior === WinJS.UI.SwipeBehavior.select && this._selectionMode !== WinJS.UI.SelectionMode.none) || this._draggable) { + utilities.addClass(this._element, WinJS.UI._swipeableClass); + } else { + utilities.removeClass(this._element, WinJS.UI._swipeableClass); + } + }, + + _updateDraggableAttribute: function ItemContainer_setSwipeClass() { + this._setSwipeClass(); + this._itemBox.setAttribute("draggable", this._draggable); + }, + + _verifySelectionAllowed: function ItemContainer_verifySelectionAllowed() { + if (this._selectionMode !== WinJS.UI.SelectionMode.none && (this._tapBehavior === WinJS.UI.TapBehavior.toggleSelect || this._swipeBehavior === WinJS.UI.SwipeBehavior.select)) { + var canSelect = this._selection.fireSelectionChanging(); + return { + canSelect: canSelect, + canTapSelect: canSelect && this._tapBehavior === WinJS.UI.TapBehavior.toggleSelect + }; + } else { + return { + canSelect: false, + canTapSelect: false + }; + } + }, + + _setupInternalTree: function ItemContainer_setupInternalTree() { + var item = document.createElement("div"); + item.className = WinJS.UI._itemClass; + this._captureProxy = document.createElement("div"); + this._itemBox = document.createElement("div"); + this._itemBox.className = WinJS.UI._itemBoxClass; + var child = this.element.firstChild; + while (child) { + var sibling = child.nextSibling; + item.appendChild(child); + child = sibling; + } + this.element.appendChild(this._itemBox); + this._itemBox.appendChild(item); + this.element.appendChild(this._captureProxy); + }, + + _fireInvokeEvent: function ItemContainer_fireInvokeEvent() { + if (this.tapBehavior !== WinJS.UI.TapBehavior.none) { + var eventObject = document.createEvent("CustomEvent"); + eventObject.initCustomEvent(eventNames.invoked, true, false, {}); + this.element.dispatchEvent(eventObject); + } + }, + + _setAriaRole: function ItemContainer_setAriaRole() { + if (!this.element.getAttribute("role") || this._usingDefaultItemRole) { + this._usingDefaultItemRole = true; + var defaultItemRole; + if (this.tapBehavior === WinJS.UI.TapBehavior.none && this.selectionDisabled) { + defaultItemRole = "listitem"; + } else { + defaultItemRole = "option"; + } + WinJS.UI._setAttribute(this.element, "role", defaultItemRole); + } + }, + + _writeProfilerMark: function ItemContainer_writeProfilerMark(text) { + var message = "WinJS.UI.ItemContainer:" + this._id + ":" + text; + msWriteProfilerMark(message); + WinJS.log && WinJS.log(message, null, "itemcontainerprofiler"); + } + }, { + // Names of classes used by the ItemContainer. + _ClassName: { + itemContainer: "win-itemcontainer", + vertical: "win-vertical", + horizontal: "win-horizontal", + } + }); + WinJS.Class.mix(ItemContainer, WinJS.UI.DOMEventMixin); + return ItemContainer; + }), + + _SingleItemSelectionManager: WinJS.Namespace._lazy(function () { + return WinJS.Class.define(function SingleItemSelectionManager_ctor(element, itemBox) { + this._selected = false; + this._element = element; + this._itemBox = itemBox; + }, { + selected: { + get: function () { + return this._selected; + }, + set: function (value) { + value = !!value; + if (this._selected !== value) { + if (this.fireSelectionChanging()) { + this._selected = value; + WinJS.UI._ItemEventsHandler.renderSelection(this._itemBox, this._element, value, true, this._element); + this.fireSelectionChanged(); + } + } + } + }, + + count: function SingleItemSelectionManager_count() { + return this._selected ? 1 : 0; + }, + + getIndices: function SingleItemSelectionManager_getIndices() { + // not used + }, + + getItems: function SingleItemSelectionManager_getItems() { + // not used + }, + + getRanges: function SingleItemSelectionManager_getRanges() { + // not used + }, + + isEverything: function SingleItemSelectionManager_isEverything() { + return false; + }, + + set: function SingleItemSelectionManager_set(items) { + this.selected = true; + }, + + clear: function SingleItemSelectionManager_clear() { + this.selected = false; + }, + + add: function SingleItemSelectionManager_add(items) { + this.selected = true; + }, + + remove: function SingleItemSelectionManager_remove(items) { + this.selected = false; + }, + + selectAll: function SingleItemSelectionManager_selectAll() { + // not used + }, + + fireSelectionChanging: function SingleItemSelectionManager_fireSelectionChanging() { + var eventObject = document.createEvent("CustomEvent"); + eventObject.initCustomEvent(eventNames.selectionchanging, true, true, {}); + return this._element.dispatchEvent(eventObject); + }, + + fireSelectionChanged: function ItemContainer_fireSelectionChanged() { + var eventObject = document.createEvent("CustomEvent"); + eventObject.initCustomEvent(eventNames.selectionchanged, true, false, {}); + this._element.dispatchEvent(eventObject); + }, + + _isIncluded: function SingleItemSelectionManager_isIncluded(index) { + return this._selected; + }, + + _getFocused: function SingleItemSelectionManager_getFocused(index) { + return { type: WinJS.UI.ObjectType.item, index: WinJS.UI._INVALID_INDEX }; + } + }) + }) + }); + +})(this, WinJS); + +(function KeyboardBehaviorInit(global, WinJS, undefined) { + "use strict"; + + // not supported in WebWorker + if (!global.document) { + return; + } + + WinJS.UI._keyboardSeenLast = false; + + window.addEventListener("pointerdown", function (ev) { + if (WinJS.UI._keyboardSeenLast) { + WinJS.UI._keyboardSeenLast = false; + } + }, true); + + window.addEventListener("keydown", function (ev) { + if (!WinJS.UI._keyboardSeenLast) { + WinJS.UI._keyboardSeenLast = true; + } + }, true); + + WinJS.Namespace.define("WinJS.UI", { + _WinKeyboard: function (element) { + // Win Keyboard behavior is a solution that would be similar to -ms-keyboard-focus. + // It monitors the last input (keyboard/mouse) and adds/removes a win-keyboard class + // so that you can style .foo.win-keyboard:focus vs .foo:focus to add a keyboard rect + // on an item only when the last input method was keyboard. + // Reminder: Touch edgy does not count as an input method. + element.addEventListener("pointerdown", function (ev) { + // In case pointer down came on the active element. + WinJS.Utilities.removeClass(ev.srcElement, "win-keyboard"); + }, true); + element.addEventListener("keydown", function (ev) { + WinJS.Utilities.addClass(ev.srcElement, "win-keyboard"); + }, true); + element.addEventListener("focusin", function (ev) { + WinJS.UI._keyboardSeenLast && WinJS.Utilities.addClass(ev.srcElement, "win-keyboard"); + }, true); + element.addEventListener("focusout", function (ev) { + WinJS.Utilities.removeClass(ev.srcElement, "win-keyboard"); + }, true); + }, + _KeyboardBehavior: WinJS.Namespace._lazy(function () { + return WinJS.Class.define(function KeyboardBehavior_ctor(element, options) { + // KeyboardBehavior allows you to easily convert a bunch of tabable elements into a single tab stop with + // navigation replaced by keyboard arrow (Up/Down/Left/Right) + Home + End + Custom keys. + // + // Example use cases: + // + // 1 Dimensional list: FixedDirection = height and FixedSize = 1; + // [1] [ 2 ] [ 3 ] [4] [ 5 ]... + // + // 2 Dimensional list: FixedDirection = height and FixedSize = 2; + // [1] [3] [5] [7] ... + // [2] [4] [6] [8] + // + // 1 Dimensional list: FixedDirection = width and FixedSize = 1; + // [ 1 ] + // - - + // | | + // | 2 | + // | | + // - - + // [ 3 ] + // [ 4 ] + // ... + // + // 2 Dimensional list: FixedDirection = width and FixedSize = 2; + // [1][2] + // [3][4] + // [5][6] + // ... + // + // Currently it is a "behavior" instead of a "control" so it can be attached to the same element as a + // winControl. The main scenario for this would be to attach it to the same element as a repeater. + // + // It also blocks "Portaling" where you go off the end of one column and wrap around to the other + // column. It also blocks "Carousel" where you go from the end of the list to the beginning. + // + // Keyboarding behavior supports nesting. It supports your tab stops having sub tab stops. If you want + // an interactive element within the tab stop you need to use the win-interactive classname or during the + // keydown event stop propogation so that the event is skipped. + // + // If you have custom keyboarding the getAdjacent API is provided. This can be used to enable keyboarding + // in multisize 2d lists or custom keyboard commands. PageDown and PageUp are the most common since this + // behavior does not detect scrollers. + // + // It also allows developers to show/hide keyboard focus rectangles themselves. + // + // It has an API called currentIndex so that Tab (or Shift+Tab) or a developer imitating Tab will result in + // the correct item having focus. + // + // It also allows an element to be represented as 2 arrow stops (commonly used for a split button) by calling + // the _getFocusInto API on the child element's winControl if it exists. + + element = element || document.createElement("DIV"); + options = options || {}; + + element._keyboardBehavior = this; + this._element = element; + + this._fixedDirection = WinJS.UI._KeyboardBehavior.FixedDirection.width; + this._fixedSize = 1; + this._currentIndex = 0; + + WinJS.UI.setOptions(this, options); + + this._element.addEventListener('keydown', this._keyDownHandler.bind(this)); + this._element.addEventListener('pointerdown', this._MSPointerDownHandler.bind(this)); + this._element.addEventListener("beforeactivate", this._beforeActivateHandler.bind(this)); + }, { + element: { + get: function () { + return this._element; + } + }, + + fixedDirection: { + get: function () { + return this._fixedDirection; + }, + set: function (value) { + this._fixedDirection = value; + } + }, + + fixedSize: { + get: function () { + return this._fixedSize; + }, + set: function (value) { + if (+value === value) { + value = Math.max(1, value); + this._fixedSize = value; + } + } + }, + + currentIndex: { + get: function () { + if (this._element.children.length > 0) { + return this._currentIndex; + } + return -1; + }, + set: function (value) { + if (+value === value) { + var length = this._element.children.length; + value = Math.max(0, Math.min(length - 1, value)); + this._currentIndex = value; + } + } + }, + + getAdjacent: { + get: function () { + return this._getAdjacent + }, + set: function (value) { + this._getAdjacent = value; + } + }, + + _keyDownHandler: function _KeyboardBehavior_keyDownHandler(ev) { + if (!ev.altKey) { + if (ev.srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + return; + } + var blockScrolling = false; + + var newIndex = this.currentIndex; + var maxIndex = this._element.children.length - 1; + var minIndex = 0; + + var rtl = getComputedStyle(this._element).direction === "rtl"; + var leftStr = rtl ? "Right" : "Left"; + var rightStr = rtl ? "Left" : "Right"; + + var targetIndex = this.getAdjacent && this.getAdjacent(newIndex, ev.key); + if (+targetIndex === targetIndex) { + blockScrolling = true; + newIndex = targetIndex; + } else { + var modFixedSize = newIndex % this.fixedSize; + + if (ev.key === leftStr) { + blockScrolling = true; + if (this.fixedDirection === WinJS.UI._KeyboardBehavior.FixedDirection.width) { + if (modFixedSize !== 0) { + newIndex--; + } + } else { + if (newIndex >= this.fixedSize) { + newIndex -= this.fixedSize; + } + } + } else if (ev.key === rightStr) { + blockScrolling = true; + if (this.fixedDirection === WinJS.UI._KeyboardBehavior.FixedDirection.width) { + if (modFixedSize !== this.fixedSize - 1) { + newIndex++; + } + } else { + if (newIndex + this.fixedSize - modFixedSize <= maxIndex) { + newIndex += this.fixedSize; + } + } + } else if (ev.key === "Up") { + blockScrolling = true; + if (this.fixedDirection === WinJS.UI._KeyboardBehavior.FixedDirection.height) { + if (modFixedSize !== 0) { + newIndex--; + } + } else { + if (newIndex >= this.fixedSize) { + newIndex -= this.fixedSize; + } + } + } else if (ev.key === "Down") { + blockScrolling = true; + if (this.fixedDirection === WinJS.UI._KeyboardBehavior.FixedDirection.height) { + if (modFixedSize !== this.fixedSize - 1) { + newIndex++; + } + } else { + if (newIndex + this.fixedSize - modFixedSize <= maxIndex) { + newIndex += this.fixedSize; + } + } + } else if (ev.key === "Home") { + blockScrolling = true; + newIndex = 0; + } else if (ev.key === "End") { + blockScrolling = true; + newIndex = this._element.children.length - 1; + } else if (ev.key === "PageUp") { + blockScrolling = true; + } else if (ev.key === "PageDown") { + blockScrolling = true; + } + } + + newIndex = Math.max(0, Math.min(this._element.children.length - 1, newIndex)); + + if (newIndex !== this.currentIndex) { + this._focus(newIndex, ev.key); + + // Allow KeyboardBehavior to be nested + if (ev.key === leftStr || ev.key === rightStr || ev.key === "Up" || ev.key === "Down") { + ev.stopPropagation(); + } + } + + if (blockScrolling) { + ev.preventDefault(); + } + } + }, + + _focus: function _KeyboardBehavior_focus(index, key) { + index = (+index === index) ? index : this.currentIndex; + + var elementToFocus = this._element.children[index]; + if (elementToFocus) { + if (elementToFocus.winControl && elementToFocus.winControl._getFocusInto) { + elementToFocus = elementToFocus.winControl._getFocusInto(key); + } + + this.currentIndex = index; + + try { + elementToFocus.setActive(); + } catch (e) { + } + } + }, + + _MSPointerDownHandler: function _KeyboardBehavior_MSPointerDownHandler(ev) { + var srcElement = ev.srcElement; + if (srcElement === this.element) { + return; + } + + while (srcElement.parentNode !== this.element) { + srcElement = srcElement.parentNode; + } + + var index = -1; + while (srcElement) { + index++; + srcElement = srcElement.previousElementSibling; + } + + this.currentIndex = index; + }, + + _beforeActivateHandler: function _KeyboardBehavior_beforeActivateHandler(ev) { + var allowActivate = false; + if (this._element.children.length) { + var currentItem = this._element.children[this.currentIndex]; + if (currentItem === ev.srcElement || currentItem.contains(ev.srcElement)) { + allowActivate = true; + } + } + + if (!allowActivate) { + ev.stopPropagation(); + ev.preventDefault(); + } + } + }, { + FixedDirection: { + height: "height", + width: "width" + } + }) + }) + }); + +})(this, WinJS); +(function NavBarInit(global, WinJS, undefined) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Displays navigation commands in a toolbar that the user can show or hide. + /// + /// + /// + /// + /// + /// + ///
+ ///
+ ///
+ ///
]]> + /// Raised just before showing the NavBar. + /// Raised immediately after an NavBar is fully shown. + /// Raised just before hiding the NavBar. + /// Raised immediately after the NavBar is fully hidden. + /// Fired when children of NavBar control have been processed from a WinJS.UI.processAll call. + /// Styles the entire NavBar. + /// + /// + /// + NavBar: WinJS.Namespace._lazy(function () { + var childrenProcessedEventName = "childrenprocessed"; + var createEvent = WinJS.Utilities._createEventProperty; + + return WinJS.Class.derive(WinJS.UI.AppBar, function NavBar_ctor(element, options) { + /// + /// + /// Creates a new NavBar. + /// + /// + /// The DOM element that will host the new NavBar control. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to one of the control's + /// properties or events. + /// + /// + /// The new NavBar control. + /// + /// + /// + + options = options || {}; + + // Shallow copy object so we can modify it. + options = WinJS.Utilities._shallowCopy(options); + + // Default to Placement = Top and Layout = Custom + options.placement = options.placement || "top"; + options.layout = "custom"; + + WinJS.UI.AppBar.call(this, element, options); + + this._element.addEventListener("beforeshow", this._handleBeforeShow.bind(this)); + + WinJS.Utilities.addClass(this.element, WinJS.UI.NavBar._ClassName.navbar); + + if (window.Windows && Windows.ApplicationModel && Windows.ApplicationModel.DesignMode && Windows.ApplicationModel.DesignMode.designModeEnabled) { + this._processChildren(); + } else { + WinJS.Utilities.Scheduler.schedule(this._processChildren.bind(this), WinJS.Utilities.Scheduler.Priority.idle, null, "WinJS.UI.NavBar.processChildren"); + } + }, { + // Block others from setting the layout property. + + /// + /// The layout of the NavBar contents. + /// + /// + layout: { + value: "custom", + writable: false + }, + + /// + /// Raised when children of NavBar control have been processed by a WinJS.UI.processAll call. + /// + /// + onchildrenprocessed: createEvent(childrenProcessedEventName), + + _processChildren: function NavBar_processChildren() { + // The NavBar control schedules processAll on its children at idle priority to avoid hurting startup + // performance. If the NavBar is shown before the scheduler gets to the idle job, the NavBar will + // immediately call processAll on its children. If your app needs the children to be processed before + // the scheduled job executes, you may call processChildren to force the processAll call. + if (!this._processed) { + this._processed = true; + + this._writeProfilerMark("processChildren,StartTM"); + var that = this; + var processed = WinJS.Promise.as(); + if (this._processors) { + this._processors.forEach(function (processAll) { + for (var i = 0, len = that.element.children.length; i < len; i++) { + (function (child) { + processed = processed.then(function () { + processAll(child); + }); + }(that.element.children[i])); + } + }); + } + return processed.then( + function () { + that._writeProfilerMark("processChildren,StopTM"); + that._fireEvent(WinJS.UI.NavBar._EventName.childrenProcessed); + }, + function () { + that._writeProfilerMark("processChildren,StopTM"); + that._fireEvent(WinJS.UI.NavBar._EventName.childrenProcessed); + } + ); + } + return WinJS.Promise.wrap(); + }, + + _show: function NavBar_show() { + // Override _show to call processChildren first. + // + if (this.disabled) { + return; + } + var that = this; + this._processChildren().then(function () { + WinJS.UI.AppBar.prototype._show.call(that); + }); + }, + + _handleBeforeShow: function NavBar_handleBeforeShow() { + // Navbar needs to ensure its elements to have their correct height and width after AppBar changes display="none" + // to display="" and AppBar needs the elements to have their final height before it measures its own element height + // to do the slide in animation over the correct amount of pixels. + if (this._disposed) { + return; + } + + var navbarcontainerEls = this.element.querySelectorAll('.win-navbarcontainer'); + for (var i = 0; i < navbarcontainerEls.length; i++) { + navbarcontainerEls[i].winControl.forceLayout(); + } + }, + + _fireEvent: function NavBar_fireEvent(type, detail) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, false, detail || {}); + this.element.dispatchEvent(event); + }, + + _writeProfilerMark: function NavBar_writeProfilerMark(text) { + msWriteProfilerMark("WinJS.UI.NavBar:" + this._id + ":" + text); + } + }, { + _ClassName: { + navbar: "win-navbar" + }, + _EventName: { + childrenProcessed: childrenProcessedEventName + }, + isDeclarativeControlContainer: WinJS.Utilities.markSupportedForProcessing(function (navbar, callback) { + if (navbar._processed) { + for (var i = 0, len = navbar.element.children.length; i < len; i++) { + callback(navbar.element.children[i]); + } + } else { + navbar._processors = navbar._processors || []; + navbar._processors.push(callback); + } + }) + }); + }) + }); + +})(this, WinJS); + +(function NavBarContainerInit(global, WinJS, undefined) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Contains a group of NavBarCommand objects in a NavBar. + /// + /// + /// + /// + /// + /// + ///
+ /// ]]>
+ /// Raised when a NavBarCommand is invoked. + /// Raised when the split button on a NavBarCommand is toggled. + /// Styles the entire NavBarContainer control. + /// + /// Styles the page indication for the NavBarContainer. + /// + /// Styles the page indication for each page. + /// + /// Styles the indication of the current page. + /// + /// Styles the area that contains items for the NavBarContainer. + /// Styles left and right navigation arrows. + /// Styles the left navigation arrow. + /// Styles the right navigation arrow. + /// + /// + /// + NavBarContainer: WinJS.Namespace._lazy(function () { + var buttonFadeDelay = 3000; + var PT_TOUCH = MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch"; + var MS_MANIPULATION_STATE_STOPPED = 0; + + var createEvent = WinJS.Utilities._createEventProperty; + var eventNames = { + invoked: "invoked", + splittoggle: "splittoggle" + }; + + var strings = { + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; }, + get navBarContainerViewportAriaLabel() { return WinJS.Resources._getWinJSString("ui/navBarContainerViewportAriaLabel").value; } + }; + + var NavBarContainer = WinJS.Class.define(function NavBarContainer_ctor(element, options) { + /// + /// + /// Creates a new NavBarContainer. + /// + /// + /// The DOM element that will host the NavBarContainer control. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. + /// Each property of the options object corresponds to one of the control's properties or events. + /// Event names must begin with "on". + /// + /// + /// The new NavBarContainer. + /// + /// + /// + + element = element || document.createElement("DIV"); + this._id = element.id || element.uniqueID; + this._writeProfilerMark("constructor,StartTM"); + + options = options || {}; + + if (element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.NavBarContainer.DuplicateConstruction", strings.duplicateConstruction); + } + + // Attaching JS control to DOM element + element.winControl = this; + this._element = element; + WinJS.Utilities.addClass(this.element, WinJS.UI.NavBarContainer._ClassName.navbarcontainer); + WinJS.Utilities.addClass(this.element, "win-disposable"); + + this._currentManipulationState = MS_MANIPULATION_STATE_STOPPED; + + this._fixedSize = false; + this._maxRows = 1; + this._sizes = {}; + + this._setupTree(); + + this._duringConstructor = true; + + this._dataChangingBound = this._dataChanging.bind(this); + this._dataChangedBound = this._dataChanged.bind(this); + + this._navigatedBound = this._navigated.bind(this); + + WinJS.Navigation.addEventListener('navigated', this._navigatedBound); + + // Don't use set options for the properties so we can control the ordering to avoid rendering multiple times. + this.layout = options.layout || WinJS.UI.Orientation.horizontal; + if (options.maxRows) { + this.maxRows = options.maxRows; + } + if (options.template) { + this.template = options.template; + } + if (options.data) { + this.data = options.data; + } + if (options.fixedSize) { + this.fixedSize = options.fixedSize; + } + + // Events only + WinJS.UI._setOptions(this, options, true); + + this._duringConstructor = false; + + if (options.currentIndex) { + this.currentIndex = options.currentIndex; + } + + this._updatePageUI(); + + this._writeProfilerMark("constructor,StopTM"); + }, { + /// + element: { + get: function () { + return this._element; + } + }, + + /// + /// Gets or sets a Template or custom rendering function that defines the HTML of each item within the NavBarContainer. + /// + /// + template: { + get: function () { + return this._template; + }, + set: function (value) { + this._template = value; + if (this._repeater) { + var hadFocus = this.element.contains(document.activeElement); + + if (!this._duringConstructor) { + this._closeSplitIfOpen(); + } + + // the repeater's template is wired up to this._render() so just resetting it will rebuild the tree. + this._repeater.template = this._repeater.template; + + if (!this._duringConstructor) { + this._measured = false; + this._sizes.itemMeasured = false; + this._reset(); + if (hadFocus) { + this._keyboardBehavior._focus(0); + } + } + } + } + }, + + _render: function NavBarContainer_render(item, wrapperElement) { + var navbarCommandEl = document.createElement('div'); + + var template = this._template; + if (template) { + if (template.render) { + template.render(item, navbarCommandEl); + } else if (template.winControl && template.winControl.render) { + template.winControl.render(item, navbarCommandEl); + } else { + navbarCommandEl.appendChild(template(item)); + } + } + + // Create the NavBarCommand after calling render so that the reparenting in navbarCommand works. + var navbarCommand = new WinJS.UI.NavBarCommand(navbarCommandEl, item); + return navbarCommandEl; + }, + + /// + /// Gets or sets the WinJS.Binding.List that provides the NavBarContainer with items to display. + /// + /// + data: { + get: function () { + return this._repeater && this._repeater.data; + }, + set: function (value) { + if (!value) { + value = new WinJS.Binding.List(); + } + + if (!this._duringConstructor) { + this._closeSplitIfOpen(); + } + + this._removeDataChangingEvents(); + this._removeDataChangedEvents(); + + var hadFocus = this.element.contains(document.activeElement); + + if (!this._repeater) { + this._surfaceEl.innerHTML = ""; + this._repeater = new WinJS.UI.Repeater(this._surfaceEl, { + template: this._render.bind(this) + }); + } + + this._addDataChangingEvents(value); + this._repeater.data = value; + this._addDataChangedEvents(value); + + if (!this._duringConstructor) { + this._measured = false; + this._sizes.itemMeasured = false; + this._reset(); + if (hadFocus) { + this._keyboardBehavior._focus(0); + } + } + } + }, + + /// + /// Gets or sets the number of rows allowed to be used before items are placed on additional pages. + /// + /// + maxRows: { + get: function () { + return this._maxRows; + }, + set: function (value) { + value = (+value === value) ? value : 1; + this._maxRows = Math.max(1, value); + + if (!this._duringConstructor) { + this._closeSplitIfOpen(); + + this._measured = false; + this._reset(); + } + } + }, + + /// + /// Gets or sets a value that specifies whether the NavBarContainer has a horizontal or vertical layout. The default is "horizontal". + /// + /// + layout: { + get: function () { + return this._layout; + }, + set: function (value) { + if (value === WinJS.UI.Orientation.vertical) { + this._layout = WinJS.UI.Orientation.vertical; + WinJS.Utilities.removeClass(this.element, WinJS.UI.NavBarContainer._ClassName.horizontal); + WinJS.Utilities.addClass(this.element, WinJS.UI.NavBarContainer._ClassName.vertical); + } else { + this._layout = WinJS.UI.Orientation.horizontal; + WinJS.Utilities.removeClass(this.element, WinJS.UI.NavBarContainer._ClassName.vertical); + WinJS.Utilities.addClass(this.element, WinJS.UI.NavBarContainer._ClassName.horizontal); + } + + this._viewportEl.style.msScrollSnapType = ""; + this._zooming = false; + + if (!this._duringConstructor) { + this._measured = false; + this._sizes.itemMeasured = false; + this._ensureVisible(this._keyboardBehavior.currentIndex, true); + this._updatePageUI(); + this._closeSplitIfOpen(); + } + } + }, + + /// + currentIndex: { + get: function () { + return this._keyboardBehavior.currentIndex; + }, + set: function (value) { + if (value === +value) { + var hadFocus = this.element.contains(document.activeElement); + + this._keyboardBehavior.currentIndex = value; + if (this._surfaceEl.children.length > 0) { + this._surfaceEl.children[this._keyboardBehavior.currentIndex].winControl._splitButtonActive = false; + } + + this._ensureVisible(this._keyboardBehavior.currentIndex, true); + + if (hadFocus) { + this._keyboardBehavior._focus(); + } + } + } + }, + + /// + /// Gets or sets a value that specifies whether child NavBarCommand objects should be a fixed width when there are multiple pages. A value of true indicates + /// that the NavBarCommand objects use a fixed width; a value of false indicates that they use a dynamic width. + /// + /// + fixedSize: { + get: function () { + return this._fixedSize; + }, + set: function (value) { + this._fixedSize = !!value; + + if (!this._duringConstructor) { + this._closeSplitIfOpen(); + + if (!this._measured) { + this._measure(); + } else if (this._surfaceEl.children.length > 0) { + this._updateGridStyles(); + } + } + } + }, + + /// + /// Raised when a NavBarCommand has been invoked. + /// + /// + oninvoked: createEvent(eventNames.invoked), + + /// + /// Raised when the split button on a NavBarCommand is toggled. + /// + /// + onsplittoggle: createEvent(eventNames.splittoggle), + + forceLayout: function NavBarContainer_forceLayout() { + /// + /// + /// Forces the NavBarContainer to update scroll positions and if there are internal pending measurements, it will also re-measure. + /// Use this function when making the NavBarContainer visible again after you set its style.display property to "none". + /// + /// + /// + if (this._measured) { + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._scrollPosition = this._viewportEl.scrollLeft; + } else { + this._scrollPosition = this._viewportEl.scrollTop; + } + } + + this._duringForceLayout = true; + this._ensureVisible(this._keyboardBehavior.currentIndex, true); + this._updatePageUI(); + this._duringForceLayout = false; + }, + + _navigated: function NavBarContainer_navigated() { + this._closeSplitIfOpen(); + this._reset(); + }, + + _dataChanging: function NavBarContainer_dataChanging(ev) { + // Store the element that was active so that we can detect + // if the focus went away because of the data change. + this._elementHadFocus = document.activeElement; + + if (this._currentSplitNavItem && this._currentSplitNavItem.splitOpened) { + if (ev.type === "itemremoved") { + if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) { + this._closeSplitIfOpen(); + } + } else if (ev.type === "itemchanged") { + if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) { + this._closeSplitIfOpen(); + } + } else if (ev.type === "itemmoved") { + if (this._surfaceEl.children[ev.detail.oldIndex].winControl === this._currentSplitNavItem) { + this._closeSplitIfOpen(); + } + } else if (ev.type === "reload") { + this._closeSplitIfOpen(); + } + } + }, + + _dataChanged: function NavBarContainer_dataChanged(ev) { + this._measured = false; + + if (ev.type === "itemremoved") { + if (ev.detail.index < this._keyboardBehavior.currentIndex) { + this._keyboardBehavior.currentIndex--; + } else if (ev.detail.index === this._keyboardBehavior.currentIndex) { + // This clamps if the item being removed was the last item in the list + this._keyboardBehavior.currentIndex = this._keyboardBehavior.currentIndex; + if (document.activeElement === null && this._elementHadFocus) { + this._keyboardBehavior._focus(); + } + } + } else if (ev.type === "itemchanged") { + if (ev.detail.index === this._keyboardBehavior.currentIndex) { + if (document.activeElement === null && this._elementHadFocus) { + this._keyboardBehavior._focus(); + } + } + } else if (ev.type === "iteminserted") { + if (ev.detail.index <= this._keyboardBehavior.currentIndex) { + this._keyboardBehavior.currentIndex++; + } + } else if (ev.type === "itemmoved") { + if (ev.detail.oldIndex === this._keyboardBehavior.currentIndex) { + this._keyboardBehavior.currentIndex = ev.detail.newIndex; + if (document.activeElement === null && this._elementHadFocus) { + this._keyboardBehavior._focus(); + } + } + } else if (ev.type === "reload") { + this._keyboardBehavior.currentIndex = 0; + if (document.activeElement === null && this._elementHadFocus) { + this._keyboardBehavior._focus(); + } + } + + this._ensureVisible(this._keyboardBehavior.currentIndex, true); + this._updatePageUI(); + }, + + _reset: function NavBarContainer_reset() { + this._keyboardBehavior.currentIndex = 0; + if (this._surfaceEl.children.length > 0) { + this._surfaceEl.children[this._keyboardBehavior.currentIndex].winControl._splitButtonActive = false; + } + + if (this.element.contains(document.activeElement)) { + this._keyboardBehavior._focus(0); + } + + this._viewportEl.style.msScrollSnapType = ""; + this._zooming = false; + + this._ensureVisible(0, true); + this._updatePageUI(); + }, + + _removeDataChangedEvents: function NavBarContainer_removeDataChangedEvents() { + if (this._repeater) { + this._repeater.data.removeEventListener("itemchanged", this._dataChangedBound); + this._repeater.data.removeEventListener("iteminserted", this._dataChangedBound); + this._repeater.data.removeEventListener("itemmoved", this._dataChangedBound); + this._repeater.data.removeEventListener("itemremoved", this._dataChangedBound); + this._repeater.data.removeEventListener("reload", this._dataChangedBound); + } + }, + + _addDataChangedEvents: function NavBarContainer_addDataChangedEvents(bindingList) { + if (this._repeater) { + this._repeater.data.addEventListener("itemchanged", this._dataChangedBound); + this._repeater.data.addEventListener("iteminserted", this._dataChangedBound); + this._repeater.data.addEventListener("itemmoved", this._dataChangedBound); + this._repeater.data.addEventListener("itemremoved", this._dataChangedBound); + this._repeater.data.addEventListener("reload", this._dataChangedBound); + } + }, + + _removeDataChangingEvents: function NavBarContainer_removeDataChangingEvents() { + if (this._repeater) { + this._repeater.data.removeEventListener("itemchanged", this._dataChangingBound); + this._repeater.data.removeEventListener("iteminserted", this._dataChangingBound); + this._repeater.data.removeEventListener("itemmoved", this._dataChangingBound); + this._repeater.data.removeEventListener("itemremoved", this._dataChangingBound); + this._repeater.data.removeEventListener("reload", this._dataChangingBound); + } + }, + + _addDataChangingEvents: function NavBarContainer_addDataChangingEvents(bindingList) { + bindingList.addEventListener("itemchanged", this._dataChangingBound); + bindingList.addEventListener("iteminserted", this._dataChangingBound); + bindingList.addEventListener("itemmoved", this._dataChangingBound); + bindingList.addEventListener("itemremoved", this._dataChangingBound); + bindingList.addEventListener("reload", this._dataChangingBound); + }, + + _mouseleave: function NavBarContainer_mouseleave(ev) { + if (this._mouseInViewport) { + this._mouseInViewport = false; + this._updateArrows(); + } + }, + + _MSPointerDown: function NavBarContainer_MSPointerDown(ev) { + if (ev.pointerType === PT_TOUCH) { + if (this._mouseInViewport) { + this._mouseInViewport = false; + this._updateArrows(); + } + } + }, + + _MSPointerMove: function NavBarContainer_MSPointerMove(ev) { + if (ev.pointerType !== PT_TOUCH) { + if (!this._mouseInViewport) { + this._mouseInViewport = true; + this._updateArrows(); + } + } + }, + + _setupTree: function NavBarContainer_setupTree() { + this._animateNextPreviousButtons = WinJS.Promise.wrap(); + this._element.addEventListener('mouseleave', this._mouseleave.bind(this)); + this._element.addEventListener('pointerdown', this._MSPointerDown.bind(this)); + this._element.addEventListener('pointermove', this._MSPointerMove.bind(this)); + this._element.addEventListener("focus", this._focusHandler.bind(this), true); + + this._pageindicatorsEl = document.createElement('div'); + WinJS.Utilities.addClass(this._pageindicatorsEl, WinJS.UI.NavBarContainer._ClassName.pageindicators); + this._element.appendChild(this._pageindicatorsEl); + + this._ariaStartMarker = document.createElement("div"); + this._element.appendChild(this._ariaStartMarker); + + this._viewportEl = document.createElement('div'); + WinJS.Utilities.addClass(this._viewportEl, WinJS.UI.NavBarContainer._ClassName.viewport); + this._element.appendChild(this._viewportEl); + this._viewportEl.setAttribute("role", "group"); + this._viewportEl.setAttribute("aria-label", strings.navBarContainerViewportAriaLabel); + + this._boundResizeHandler = this._resizeHandler.bind(this); + window.addEventListener("resize", this._boundResizeHandler); + this._viewportEl.addEventListener("mselementresize", this._resizeHandler.bind(this)); + this._viewportEl.addEventListener("scroll", this._scrollHandler.bind(this)); + this._viewportEl.addEventListener("MSManipulationStateChanged", this._MSManipulationStateChangedHandler.bind(this)); + + this._ariaEndMarker = document.createElement("div"); + this._element.appendChild(this._ariaEndMarker); + + this._surfaceEl = document.createElement('div'); + WinJS.Utilities.addClass(this._surfaceEl, WinJS.UI.NavBarContainer._ClassName.surface); + this._viewportEl.appendChild(this._surfaceEl); + + this._surfaceEl.addEventListener("_invoked", this._navbarCommandInvokedHandler.bind(this)); + this._surfaceEl.addEventListener("_splittoggle", this._navbarCommandSplitToggleHandler.bind(this)); + this._surfaceEl.addEventListener("focus", this._itemsFocusHandler.bind(this), true); + this._surfaceEl.addEventListener("keydown", this._keyDownHandler.bind(this)); + + // Reparent NavBarCommands which were in declarative markup + var tempEl = this.element.firstElementChild; + while (tempEl !== this._pageindicatorsEl) { + this._surfaceEl.appendChild(tempEl); + WinJS.UI.process(tempEl); + tempEl = this.element.firstElementChild; + } + + this._leftArrowEl = document.createElement('div'); + WinJS.Utilities.addClass(this._leftArrowEl, WinJS.UI.NavBarContainer._ClassName.navleftarrow); + WinJS.Utilities.addClass(this._leftArrowEl, WinJS.UI.NavBarContainer._ClassName.navarrow); + this._element.appendChild(this._leftArrowEl); + this._leftArrowEl.addEventListener('click', this._goLeft.bind(this)); + this._leftArrowEl.style.opacity = 0; + this._leftArrowEl.style.visibility = 'hidden'; + this._leftArrowFadeOut = WinJS.Promise.wrap(); + + this._rightArrowEl = document.createElement('div'); + WinJS.Utilities.addClass(this._rightArrowEl, WinJS.UI.NavBarContainer._ClassName.navrightarrow); + WinJS.Utilities.addClass(this._rightArrowEl, WinJS.UI.NavBarContainer._ClassName.navarrow); + this._element.appendChild(this._rightArrowEl); + this._rightArrowEl.addEventListener('click', this._goRight.bind(this)); + this._rightArrowEl.style.opacity = 0; + this._rightArrowEl.style.visibility = 'hidden'; + this._rightArrowFadeOut = WinJS.Promise.wrap(); + + this._keyboardBehavior = new WinJS.UI._KeyboardBehavior(this._surfaceEl); + this._winKeyboard = new WinJS.UI._WinKeyboard(this._surfaceEl); + }, + + _goRight: function NavBarContainer_goRight() { + if (this._sizes.rtl) { + this._goPrev(); + } else { + this._goNext(); + } + }, + + _goLeft: function NavBarContainer_goLeft() { + if (this._sizes.rtl) { + this._goNext(); + } else { + this._goPrev(); + } + }, + + _goNext: function NavBarContainer_goNext() { + this._measure(); + var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage; + var targetPage = Math.min(Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) + 1, this._sizes.pages - 1); + this._keyboardBehavior.currentIndex = Math.min(itemsPerPage * targetPage, this._surfaceEl.children.length); + this._keyboardBehavior._focus(); + }, + + _goPrev: function NavBarContainer_goPrev() { + this._measure(); + var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage; + var targetPage = Math.max(0, Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) - 1); + this._keyboardBehavior.currentIndex = Math.max(itemsPerPage * targetPage, 0); + this._keyboardBehavior._focus(); + }, + + _currentPage: { + get: function () { + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._measure(); + if (this._sizes.viewportOffsetWidth > 0) { + return Math.min(this._sizes.pages - 1, Math.round(this._scrollPosition / this._sizes.viewportOffsetWidth)); + } + } + return 0; + } + }, + + _resizeHandler: function NavBarContainer_resizeHandler() { + if (this._disposed) { + return; + } + if (this._measured) { + this._measured = false; + + if (!this._pendingResize) { + this._pendingResize = true; + + this._resizeImplBound = this._resizeImplBound || this._resizeImpl.bind(this); + + if (!this._appBarEl || !this._appBarEl.contains(this.element)) { + if (this._appBarEl) { + this._appBarEl.removeEventListener('beforeshow', this._resizeImplBound); + } + + var appBarEl = this.element.parentNode; + while (appBarEl && !WinJS.Utilities.hasClass(appBarEl, 'win-appbar')) { + appBarEl = appBarEl.parentNode; + } + + this._appBarEl = appBarEl; + } + + if (this._appBarEl && this._appBarEl.winControl && this._appBarEl.winControl.hidden) { + // Do resize lazily. + WinJS.Utilities.Scheduler.schedule(this._resizeImplBound, WinJS.Utilities.Scheduler.Priority.idle, null, "WinJS.UI.NavBarContainer._resizeImpl"); + this._appBarEl.addEventListener('beforeshow', this._resizeImplBound); + } else { + // Do resize now + this._resizeImpl(); + } + } + } + }, + + _resizeImpl: function NavBarContainer_resizeImpl() { + if (!this._disposed && this._pendingResize) { + this._pendingResize = false; + if (this._appBarEl) { + this._appBarEl.removeEventListener('beforeshow', this._resizeImplBound); + } + + this._keyboardBehavior.currentIndex = 0; + if (this._surfaceEl.children.length > 0) { + this._surfaceEl.children[0].winControl._splitButtonActive = false; + } + if (this.element.contains(document.activeElement)) { + this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex); + } + this._closeSplitIfOpen(); + this._ensureVisible(this._keyboardBehavior.currentIndex, true); + this._updatePageUI(); + } + }, + + _keyDownHandler: function NavBarContainer_keyDownHandler(ev) { + var key = ev.key + if (!ev.altKey && (key === "PageUp" || key === "PageDown")) { + var srcElement = ev.srcElement; + if (srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + return; + } + + var index = this._keyboardBehavior.currentIndex; + this._measure(); + + var sizes = this._sizes; + var page = Math.floor(index / (sizes.columnsPerPage * sizes.rowsPerPage)); + + var scrollPositionTarget = null; + if (key === "PageUp") { + if (this.layout === WinJS.UI.Orientation.horizontal) { + var indexOfFirstItemOnPage = page * sizes.columnsPerPage * sizes.rowsPerPage; + if (index === indexOfFirstItemOnPage && this._surfaceEl.children[index].winControl._buttonEl === document.activeElement) { + // First item on page so go back 1 page. + index = index - sizes.columnsPerPage * sizes.rowsPerPage; + } else { + // Not first item on page so go to the first item on page. + index = indexOfFirstItemOnPage; + } + } else { + var currentItem = this._surfaceEl.children[index]; + var top = currentItem.offsetTop; + var bottom = top + currentItem.offsetHeight; + var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition; + + if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) { + // current item is fully on screen. + while (index > 0 && + this._surfaceEl.children[index - 1].offsetTop > scrollPosition) { + index--; + } + } + + if (this._keyboardBehavior.currentIndex === index) { + var scrollPositionForOnePageAboveItem = bottom - sizes.viewportOffsetHeight; + index = Math.max(0, index - 1); + while (index > 0 && + this._surfaceEl.children[index - 1].offsetTop > scrollPositionForOnePageAboveItem) { + index--; + } + if (index > 0) { + scrollPositionTarget = this._surfaceEl.children[index].offsetTop - this._sizes.itemMarginTop; + } else { + scrollPositionTarget = 0; + } + } + } + + index = Math.max(index, 0); + this._keyboardBehavior.currentIndex = index; + + var element = this._surfaceEl.children[index].winControl._buttonEl; + this._surfaceEl.children[index].winControl._splitButtonActive = false; + + if (scrollPositionTarget !== null) { + this._scrollTo(scrollPositionTarget); + } + + try { + element.setActive(); + } catch (e) { + } + } else { + if (this.layout === WinJS.UI.Orientation.horizontal) { + var indexOfLastItemOnPage = (page + 1) * sizes.columnsPerPage * sizes.rowsPerPage - 1; + + if (index === indexOfLastItemOnPage) { + // Last item on page so go forward 1 page. + index = index + sizes.columnsPerPage * sizes.rowsPerPage; + } else { + // Not Last item on page so go to last item on page. + index = indexOfLastItemOnPage; + } + } else { + var currentItem = this._surfaceEl.children[this._keyboardBehavior.currentIndex]; + var top = currentItem.offsetTop; + var bottom = top + currentItem.offsetHeight; + var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition; + + if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) { + // current item is fully on screen. + while (index < this._surfaceEl.children.length - 1 && + this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPosition + sizes.viewportOffsetHeight) { + index++; + } + } + + if (index === this._keyboardBehavior.currentIndex) { + var scrollPositionForOnePageBelowItem = top + sizes.viewportOffsetHeight; + index = Math.min(this._surfaceEl.children.length - 1, index + 1); + while (index < this._surfaceEl.children.length - 1 && + this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPositionForOnePageBelowItem) { + index++; + } + + if (index < this._surfaceEl.children.length - 1) { + scrollPositionTarget = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight; + } else { + scrollPositionTarget = this._scrollLength - this._sizes.viewportOffsetHeight; + } + } + } + + index = Math.min(index, this._surfaceEl.children.length - 1); + this._keyboardBehavior.currentIndex = index; + + var element = this._surfaceEl.children[index].winControl._buttonEl; + this._surfaceEl.children[index].winControl._splitButtonActive = false; + + if (scrollPositionTarget !== null) { + this._scrollTo(scrollPositionTarget); + } + + try { + element.setActive(); + } catch (e) { + } + } + } + }, + + _focusHandler: function NavBarContainer_focusHandler(ev) { + var srcElement = ev.srcElement; + if (!this._surfaceEl.contains(srcElement)) { + // Forward focus from NavBarContainer, viewport or surface to the currentIndex. + this._skipEnsureVisible = true; + this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex); + } + }, + + _itemsFocusHandler: function NavBarContainer_itemsFocusHandler(ev) { + // Find the item which is being focused and scroll it to view. + var srcElement = ev.srcElement; + if (srcElement === this._surfaceEl) { + return; + } + + while (srcElement.parentNode !== this._surfaceEl) { + srcElement = srcElement.parentNode; + } + + var index = -1; + while (srcElement) { + index++; + srcElement = srcElement.previousSibling; + } + + if (this._skipEnsureVisible) { + this._skipEnsureVisible = false; + } else { + this._ensureVisible(index); + } + }, + + _ensureVisible: function NavBarContainer_ensureVisible(index, withoutAnimation) { + this._measure(); + + if (this.layout === WinJS.UI.Orientation.horizontal) { + var page = Math.floor(index / (this._sizes.rowsPerPage * this._sizes.columnsPerPage)); + this._scrollTo(page * this._sizes.viewportOffsetWidth, withoutAnimation); + } else { + var element = this._surfaceEl.children[index]; + var maxScrollPosition; + if (index > 0) { + maxScrollPosition = element.offsetTop - this._sizes.itemMarginTop; + } else { + maxScrollPosition = 0; + } + var minScrollPosition; + if (index < this._surfaceEl.children.length - 1) { + minScrollPosition = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight; + } else { + minScrollPosition = this._scrollLength - this._sizes.viewportOffsetHeight; + } + + var newScrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition; + newScrollPosition = Math.max(newScrollPosition, minScrollPosition); + newScrollPosition = Math.min(newScrollPosition, maxScrollPosition); + this._scrollTo(newScrollPosition, withoutAnimation); + } + }, + + _scrollTo: function NavBarContainer_scrollTo(targetScrollPosition, withoutAnimation) { + this._measure(); + if (this.layout === WinJS.UI.Orientation.horizontal) { + targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetWidth, targetScrollPosition)); + } else { + targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetHeight, targetScrollPosition)); + } + + if (withoutAnimation) { + if (Math.abs(this._scrollPosition - targetScrollPosition) > 1) { + this._zooming = false; + + this._scrollPosition = targetScrollPosition; + this._updatePageUI(); + if (!this._duringForceLayout) { + this._closeSplitIfOpen(); + } + + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._viewportEl.scrollLeft = targetScrollPosition; + } else { + this._viewportEl.scrollTop = targetScrollPosition; + } + } + } else { + if ((!this._zooming && Math.abs(this._scrollPosition - targetScrollPosition) > 1) || (this._zooming && Math.abs(this._zoomPosition - targetScrollPosition) > 1)) { + this._zoomPosition = targetScrollPosition; + + this._zooming = true; + + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._viewportEl.style.msScrollSnapType = "none"; + this._viewportEl.msZoomTo({ contentX: targetScrollPosition, contentY: 0, viewportX: 0, viewportY: 0 }); + } else { + this._viewportEl.msZoomTo({ contentX: 0, contentY: targetScrollPosition, viewportX: 0, viewportY: 0 }); + } + + this._closeSplitIfOpen(); + } + } + }, + + _MSManipulationStateChangedHandler: function NavBarContainer_MSManipulationStateChangedHandler(e) { + this._currentManipulationState = e.currentState; + + if (e.currentState === e.MS_MANIPULATION_STATE_ACTIVE) { + this._viewportEl.style.msScrollSnapType = ""; + this._zooming = false; + } + + clearTimeout(this._manipulationStateTimeoutId); + // The extra stop event is firing when an msZoomTo is called during another msZoomTo and + // also the first msZoomTo after a resize. + if (e.currentState === e.MS_MANIPULATION_STATE_STOPPED) { + this._manipulationStateTimeoutId = setTimeout(function () { + this._viewportEl.style.msScrollSnapType = ""; + this._zooming = false; + this._updateCurrentIndexIfPageChanged(); + }.bind(this), 100); + } + }, + + _scrollHandler: function NavBarContainer_scrollHandler() { + this._measured = false; + if (!this._checkingScroll) { + var that = this; + this._checkingScroll = requestAnimationFrame(function () { + that._checkingScroll = null; + + var newScrollPosition; + if (that.layout === WinJS.UI.Orientation.horizontal) { + newScrollPosition = that._viewportEl.scrollLeft; + } else { + newScrollPosition = that._viewportEl.scrollTop; + } + if (newScrollPosition !== that._scrollPosition) { + that._scrollPosition = newScrollPosition; + that._closeSplitIfOpen(); + } + that._updatePageUI(); + + if (!that._zooming && this._currentManipulationState === MS_MANIPULATION_STATE_STOPPED) { + that._updateCurrentIndexIfPageChanged(); + } + }); + } + }, + + _updateCurrentIndexIfPageChanged: function NavBarContainer_updateCurrentIndexIfPageChanged() { + // If you change pages via pagination arrows, mouse wheel, or panning we need to update the current + // item to be the first item on the new page. + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._measure(); + var currentPage = this._currentPage; + var firstIndexOnPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage; + var lastIndexOnPage = (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1; + + if (this._keyboardBehavior.currentIndex < firstIndexOnPage || this._keyboardBehavior.currentIndex > lastIndexOnPage) { + // Page change occurred. + this._keyboardBehavior.currentIndex = firstIndexOnPage; + if (this._surfaceEl.children.length > 0) { + this._surfaceEl.children[this._keyboardBehavior.currentIndex].winControl._splitButtonActive = false; + } + + if (this.element.contains(document.activeElement)) { + this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex); + } + } + } + }, + + _measure: function NavBarContainer_measure() { + if (!this._measured) { + this._resizeImpl(); + this._writeProfilerMark("measure,StartTM"); + + var sizes = this._sizes; + + sizes.rtl = getComputedStyle(this._element).direction === "rtl"; + + var itemCount = this._surfaceEl.children.length; + if (itemCount > 0) { + if (!this._sizes.itemMeasured) { + this._writeProfilerMark("measureItem,StartTM"); + + var elementToMeasure = this._surfaceEl.firstElementChild; + // Clear inline margins set by NavBarContainer before measuring. + elementToMeasure.style.margin = ""; + elementToMeasure.style.width = ""; + var elementComputedStyle = getComputedStyle(elementToMeasure); + sizes.itemOffsetWidth = parseFloat(getComputedStyle(elementToMeasure).width); + if (elementToMeasure.offsetWidth === 0) { + sizes.itemOffsetWidth = 0; + } + sizes.itemMarginLeft = parseFloat(elementComputedStyle.marginLeft); + sizes.itemMarginRight = parseFloat(elementComputedStyle.marginRight); + sizes.itemWidth = sizes.itemOffsetWidth + sizes.itemMarginLeft + sizes.itemMarginRight; + sizes.itemOffsetHeight = parseFloat(getComputedStyle(elementToMeasure).height); + if (elementToMeasure.offsetHeight === 0) { + sizes.itemOffsetHeight = 0; + } + sizes.itemMarginTop = parseFloat(elementComputedStyle.marginTop); + sizes.itemMarginBottom = parseFloat(elementComputedStyle.marginBottom); + sizes.itemHeight = sizes.itemOffsetHeight + sizes.itemMarginTop + sizes.itemMarginBottom; + if (sizes.itemOffsetWidth > 0 && sizes.itemOffsetHeight > 0) { + sizes.itemMeasured = true; + } + this._writeProfilerMark("measureItem,StopTM"); + } + + sizes.viewportOffsetWidth = parseFloat(getComputedStyle(this._viewportEl).width); + if (this._viewportEl.offsetWidth === 0) { + sizes.viewportOffsetWidth = 0; + } + sizes.viewportOffsetHeight = parseFloat(getComputedStyle(this._viewportEl).height); + if (this._viewportEl.offsetHeight === 0) { + sizes.viewportOffsetHeight = 0; + } + + if (sizes.viewportOffsetWidth === 0 || sizes.itemOffsetHeight === 0) { + this._measured = false; + } else { + this._measured = true; + } + + if (this.layout === WinJS.UI.Orientation.horizontal) { + this._scrollPosition = this._viewportEl.scrollLeft; + + sizes.leadingEdge = this._leftArrowEl.offsetWidth + parseInt(getComputedStyle(this._leftArrowEl).marginLeft) + parseInt(getComputedStyle(this._leftArrowEl).marginRight); + var usableSpace = sizes.viewportOffsetWidth - sizes.leadingEdge * 2; + sizes.maxColumns = sizes.itemWidth ? Math.max(1, Math.floor(usableSpace / sizes.itemWidth)) : 1; + sizes.rowsPerPage = Math.min(this.maxRows, Math.ceil(itemCount / sizes.maxColumns)); + sizes.columnsPerPage = Math.min(sizes.maxColumns, itemCount); + sizes.pages = Math.ceil(itemCount / (sizes.columnsPerPage * sizes.rowsPerPage)); + sizes.trailingEdge = sizes.leadingEdge; + sizes.extraSpace = usableSpace - (sizes.columnsPerPage * sizes.itemWidth); + + this._scrollLength = sizes.viewportOffsetWidth * sizes.pages; + + this._keyboardBehavior.fixedSize = sizes.rowsPerPage; + this._keyboardBehavior.fixedDirection = WinJS.UI._KeyboardBehavior.FixedDirection.height; + + this._surfaceEl.style.height = (sizes.itemHeight * sizes.rowsPerPage) + "px"; + this._surfaceEl.style.width = this._scrollLength + "px"; + } else { + this._scrollPosition = this._viewportEl.scrollTop; + + sizes.leadingEdge = 0; + sizes.rowsPerPage = itemCount; + sizes.columnsPerPage = 1; + sizes.pages = 1; + sizes.trailingEdge = 0; + + // Reminder there is margin collapsing so just use scrollHeight instead of itemHeight * itemCount + this._scrollLength = this._viewportEl.scrollHeight; + + this._keyboardBehavior.fixedSize = sizes.columnsPerPage; + this._keyboardBehavior.fixedDirection = WinJS.UI._KeyboardBehavior.FixedDirection.width; + + this._surfaceEl.style.height = ""; + this._surfaceEl.style.width = ""; + } + + this._updateGridStyles(); + } else { + sizes.pages = 1; + this._hasPreviousContent = false; + this._hasNextContent = false; + this._surfaceEl.style.height = ""; + this._surfaceEl.style.width = ""; + } + + this._writeProfilerMark("measure,StopTM"); + } + }, + + _updateGridStyles: function NavBarContainer_updateGridStyles() { + var sizes = this._sizes; + var itemCount = this._surfaceEl.children.length; + + for (var index = 0; index < itemCount; index++) { + var itemEl = this._surfaceEl.children[index]; + + var marginRight; + var marginLeft; + var cssRow; + var cssColumn; + var width = ""; + + if (this.layout === WinJS.UI.Orientation.horizontal) { + var row = Math.floor(index % sizes.rowsPerPage); + var column = Math.floor(index / sizes.rowsPerPage); + var isFirstColumnOnPage = column % sizes.columnsPerPage === 0; + var isLastColumnOnPage = column % sizes.columnsPerPage === sizes.columnsPerPage - 1; + + var extraTrailingMargin = sizes.trailingEdge; + if (this.fixedSize) { + extraTrailingMargin += sizes.extraSpace; + } else { + var spaceToDistribute = sizes.extraSpace - (sizes.maxColumns - sizes.columnsPerPage) * sizes.itemWidth; + width = (sizes.itemOffsetWidth + (spaceToDistribute / sizes.maxColumns)) + "px"; + } + + cssRow = row + 1; + cssColumn = column + 1; + var extraMarginRight; + var extraMarginLeft; + + if (sizes.rtl) { + extraMarginRight = (isFirstColumnOnPage ? sizes.leadingEdge : 0); + extraMarginLeft = (isLastColumnOnPage ? extraTrailingMargin : 0); + } else { + extraMarginRight = (isLastColumnOnPage ? extraTrailingMargin : 0); + extraMarginLeft = (isFirstColumnOnPage ? sizes.leadingEdge : 0); + } + + marginRight = extraMarginRight + sizes.itemMarginRight + "px"; + marginLeft = extraMarginLeft + sizes.itemMarginLeft + "px"; + } else { + cssRow = ""; + cssColumn = ""; + marginRight = ""; + marginLeft = ""; + } + + if (itemEl.style.msGridRow !== cssRow) { + itemEl.style.msGridRow = cssRow; + } + if (itemEl.style.msGridColumn !== cssColumn) { + itemEl.style.msGridColumn = cssColumn; + } + if (itemEl.style.marginRight !== marginRight) { + itemEl.style.marginRight = marginRight; + } + if (itemEl.style.marginLeft !== marginLeft) { + itemEl.style.marginLeft = marginLeft; + } + if (itemEl.style.width !== width) { + itemEl.style.width = width; + } + } + }, + + _updatePageUI: function NavBarContainer_updatePageUI() { + this._measure(); + var currentPage = this._currentPage; + + this._hasPreviousContent = (currentPage !== 0); + this._hasNextContent = (currentPage < this._sizes.pages - 1); + this._updateArrows(); + + // Always output the pagination indicators so they reserves up space. + if (this._indicatorCount !== this._sizes.pages) { + this._indicatorCount = this._sizes.pages; + this._pageindicatorsEl.innerHTML = new Array(this._sizes.pages + 1).join(''); + } + + for (var i = 0; i < this._pageindicatorsEl.children.length; i++) { + if (i === currentPage) { + WinJS.Utilities.addClass(this._pageindicatorsEl.children[i], WinJS.UI.NavBarContainer._ClassName.currentindicator); + } else { + WinJS.Utilities.removeClass(this._pageindicatorsEl.children[i], WinJS.UI.NavBarContainer._ClassName.currentindicator); + } + } + + if (this._sizes.pages > 1) { + this._viewportEl.style.overflowX = ""; + this._pageindicatorsEl.style.visibility = ""; + } else { + this._viewportEl.style.overflowX = "hidden"; + this._pageindicatorsEl.style.visibility = "hidden"; + } + + if (this._sizes.pages <= 1 || this._layout !== WinJS.UI.Orientation.horizontal) { + this._ariaStartMarker.removeAttribute("aria-flowto"); + this._ariaEndMarker.removeAttribute("x-ms-aria-flowfrom"); + } else { + var firstIndexOnCurrentPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage; + var firstItem = this._surfaceEl.children[firstIndexOnCurrentPage].winControl._buttonEl; + WinJS.UI._ensureId(firstItem); + this._ariaStartMarker.setAttribute("aria-flowto", firstItem.id); + + var lastIndexOnCurrentPage = Math.min(this._surfaceEl.children.length - 1, (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1); + var lastItem = this._surfaceEl.children[lastIndexOnCurrentPage].winControl._buttonEl; + WinJS.UI._ensureId(lastItem); + this._ariaEndMarker.setAttribute("x-ms-aria-flowfrom", lastItem.id); + } + }, + + _closeSplitIfOpen: function NavBarContainer_closeSplitIfOpen() { + if (this._currentSplitNavItem) { + if (this._currentSplitNavItem.splitOpened) { + this._currentSplitNavItem._toggleSplit(); + } + this._currentSplitNavItem = null; + } + }, + + _updateArrows: function NavBarContainer_updateArrows() { + var hasLeftContent = this._sizes.rtl ? this._hasNextContent : this._hasPreviousContent; + var hasRightContent = this._sizes.rtl ? this._hasPreviousContent : this._hasNextContent; + + var that = this; + // Previous and next are the arrows, not states. On mouse hover the arrows fade in immediately. If you + // mouse out the arrows fade out after a delay. When you reach the last/first page, the corresponding + // arrow fades out immediately as well. + if (this._mouseInViewport && hasLeftContent) { + this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel(); + this._leftArrowWaitingToFadeOut = null; + this._leftArrowFadeOut && this._leftArrowFadeOut.cancel(); + this._leftArrowFadeOut = null; + this._leftArrowEl.style.visibility = ''; + this._leftArrowFadeIn = this._leftArrowFadeIn || WinJS.UI.Animation.fadeIn(this._leftArrowEl); + } else { + if (hasLeftContent) { + // If we need a delayed fade out and we are already running a delayed fade out just use that one, don't extend it. + // Otherwise create a delayed fade out. + this._leftArrowWaitingToFadeOut = this._leftArrowWaitingToFadeOut || WinJS.Promise.timeout(buttonFadeDelay); + } else { + // If we need a immediate fade out and already have a delayed fade out cancel that one and create an immediate one. + this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel(); + this._leftArrowWaitingToFadeOut = WinJS.Promise.wrap(); + } + this._leftArrowWaitingToFadeOut.then(function () { + // After the delay cancel any fade in if running. If we already were fading out continue it otherwise start the fade out. + this._leftArrowFadeIn && this._leftArrowFadeIn.cancel(); + this._leftArrowFadeIn = null; + this._leftArrowFadeOut = this._leftArrowFadeOut || WinJS.UI.Animation.fadeOut(this._leftArrowEl).then(function () { + that._leftArrowEl.style.visibility = 'hidden'; + }); + }.bind(this)); + } + + // Same pattern for Next arrow. + if (this._mouseInViewport && hasRightContent) { + this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel(); + this._rightArrowWaitingToFadeOut = null; + this._rightArrowFadeOut && this._rightArrowFadeOut.cancel(); + this._rightArrowFadeOut = null; + this._rightArrowEl.style.visibility = ''; + this._rightArrowFadeIn = this._rightArrowFadeIn || WinJS.UI.Animation.fadeIn(this._rightArrowEl); + } else { + if (hasRightContent) { + this._rightArrowWaitingToFadeOut = this._rightArrowWaitingToFadeOut || WinJS.Promise.timeout(buttonFadeDelay); + } else { + this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel(); + this._rightArrowWaitingToFadeOut = WinJS.Promise.wrap(); + } + this._rightArrowWaitingToFadeOut.then(function () { + this._rightArrowFadeIn && this._rightArrowFadeIn.cancel(); + this._rightArrowFadeIn = null; + this._rightArrowFadeOut = this._rightArrowFadeOut || WinJS.UI.Animation.fadeOut(this._rightArrowEl).then(function () { + that._rightArrowEl.style.visibility = 'hidden'; + }); + }.bind(this)); + } + }, + + _navbarCommandInvokedHandler: function NavBarContainer_navbarCommandInvokedHandler(ev) { + var srcElement = ev.srcElement; + var index = -1; + while (srcElement) { + index++; + srcElement = srcElement.previousSibling; + } + + this._fireEvent(WinJS.UI.NavBarContainer._EventName.invoked, { + index: index, + navbarCommand: ev.srcElement.winControl, + data: this._repeater ? this._repeater.data.getAt(index) : null + }); + }, + + _navbarCommandSplitToggleHandler: function NavBarContainer_navbarCommandSplitToggleHandler(ev) { + var srcElement = ev.srcElement; + var index = -1; + while (srcElement) { + index++; + srcElement = srcElement.previousSibling; + } + + var navbarCommand = ev.srcElement.winControl; + + this._closeSplitIfOpen(); + + if (navbarCommand.splitOpened) { + this._currentSplitNavItem = navbarCommand; + } + + this._fireEvent(WinJS.UI.NavBarContainer._EventName.splitToggle, { + opened: navbarCommand.splitOpened, + index: index, + navbarCommand: navbarCommand, + data: this._repeater ? this._repeater.data.getAt(index) : null + }); + }, + + _fireEvent: function NavBarContainer_fireEvent(type, detail) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, false, detail); + this.element.dispatchEvent(event); + }, + + _writeProfilerMark: function NavBarContainer_writeProfilerMark(text) { + var message = "WinJS.UI.NavBarContainer:" + this._id + ":" + text; + msWriteProfilerMark(message); + WinJS.log && WinJS.log(message, null, "navbarcontainerprofiler"); + }, + + dispose: function NavBarContainer_dispose() { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; + + if (this._appBarEl) { + this._appBarEl.removeEventListener('beforeshow', this._resizeImplBound); + } + + WinJS.Navigation.removeEventListener('navigated', this._navigatedBound); + + this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel(); + this._leftArrowFadeOut && this._leftArrowFadeOut.cancel(); + this._leftArrowFadeIn && this._leftArrowFadeIn.cancel(); + this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel(); + this._rightArrowFadeOut && this._rightArrowFadeOut.cancel(); + this._rightArrowFadeIn && this._rightArrowFadeIn.cancel(); + + window.removeEventListener("resize", this._boundResizeHandler); + + this._removeDataChangingEvents(); + this._removeDataChangedEvents(); + } + }, { + // Names of classes used by the NavBarContainer. + _ClassName: { + navbarcontainer: "win-navbarcontainer", + pageindicators: "win-navbarcontainer-pageindicator-box", + indicator: "win-navbarcontainer-pageindicator", + currentindicator: "win-navbarcontainer-pageindicator-current", + vertical: "win-navbarcontainer-vertical", + horizontal: "win-navbarcontainer-horizontal", + viewport: "win-navbarcontainer-viewport", + surface: "win-navbarcontainer-surface", + navarrow: "win-navbarcontainer-navarrow", + navleftarrow: "win-navbarcontainer-navleft", + navrightarrow: "win-navbarcontainer-navright" + }, + _EventName: { + invoked: eventNames.invoked, + splitToggle: eventNames.splittoggle + } + }); + WinJS.Class.mix(NavBarContainer, WinJS.UI.DOMEventMixin); + return NavBarContainer; + }) + }); + +})(this, WinJS); + +(function NavBarCommandInit(global, WinJS, undefined) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + _WinPressed: WinJS.Namespace._lazy(function () { + return WinJS.Class.define(function _WinPressed_ctor(element) { + // WinPressed is the combination of :hover:active + // :hover is delayed by trident for touch by 300ms so if you want :hover:active to work quickly you need to + // use this behavior. + // :active does not bubble to its parent like :hover does so this is also useful for that scenario. + this._element = element; + this._element.addEventListener("pointerdown", this._MSPointerDownButtonHandler.bind(this)); + }, { + _MSPointerDownButtonHandler: function _WinPressed_MSPointerDownButtonHandler(ev) { + if (!this._pointerUpBound) { + this._pointerUpBound = this._MSPointerUpHandler.bind(this); + this._pointerCancelBound = this._MSPointerCancelHandler.bind(this); + this._pointerOverBound = this._MSPointerOverHandler.bind(this); + this._pointerOutBound = this._MSPointerOutHandler.bind(this); + } + + if (ev.isPrimary) { + if (this._pointerId) { + this._resetPointer(); + } + + if (!ev.srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + this._pointerId = ev.pointerId; + + window.addEventListener("pointerup", this._pointerUpBound, true); + window.addEventListener("pointercancel", this._pointerCancelBound), true; + this._element.addEventListener("pointerover", this._pointerOverBound, true); + this._element.addEventListener("pointerout", this._pointerOutBound, true); + + WinJS.Utilities.addClass(this._element, WinJS.UI._WinPressed.winPressed); + } + } + }, + + _MSPointerOverHandler: function _WinPressed_MSPointerOverHandler(ev) { + if (this._pointerId === ev.pointerId) { + WinJS.Utilities.addClass(this._element, WinJS.UI._WinPressed.winPressed); + } + }, + + _MSPointerOutHandler: function _WinPressed_MSPointerOutHandler(ev) { + if (this._pointerId === ev.pointerId) { + WinJS.Utilities.removeClass(this._element, WinJS.UI._WinPressed.winPressed); + } + }, + + _MSPointerCancelHandler: function _WinPressed_MSPointerCancelHandler(ev) { + if (this._pointerId === ev.pointerId) { + this._resetPointer(); + } + }, + + _MSPointerUpHandler: function _WinPressed_MSPointerUpHandler(ev) { + if (this._pointerId === ev.pointerId) { + this._resetPointer(); + } + }, + + _resetPointer: function _WinPressed_resetPointer() { + this._pointerId = null; + + window.removeEventListener("pointerup", this._pointerUpBound, true); + window.removeEventListener("pointercancel", this._pointerCancelBound, true); + this._element.removeEventListener("pointerover", this._pointerOverBound, true); + this._element.removeEventListener("pointerout", this._pointerOutBound, true); + + WinJS.Utilities.removeClass(this._element, WinJS.UI._WinPressed.winPressed); + }, + + dispose: function _WinPressed_dispose() { + if (this._disposed) { + return; + } + this._disposed = true; + + this._resetPointer(); + } + }, { + winPressed: "win-pressed" + }) + }), + /// + /// + /// Represents a navigation command in an NavBarContainer. + /// + /// + /// + /// + /// + /// ]]> + /// Styles the entire NavBarCommand control. + /// Styles the main button in a NavBarCommand. + /// Styles the split button in a NavBarCommand + /// Styles the icon in the main button of a NavBarCommand. + /// Styles the label in the main button of a NavBarCommand. + /// + /// + /// + NavBarCommand: WinJS.Namespace._lazy(function () { + var strings = { + get duplicateConstruction() { return WinJS.Resources._getWinJSString("ui/duplicateConstruction").value; } + }; + + var NavBarCommand = WinJS.Class.define(function NavBarCommand_ctor(element, options) { + /// + /// + /// Creates a new NavBarCommand. + /// + /// + /// The DOM element that will host the new NavBarCommand control. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. + /// Each property of the options object corresponds to one of the control's properties or events. + /// Event names must begin with "on". + /// + /// + /// The new NavBarCommand. + /// + /// + /// + element = element || document.createElement("DIV"); + options = options || {}; + + if (element.winControl) { + throw new WinJS.ErrorFromName("WinJS.UI.NavBarCommand.DuplicateConstruction", strings.duplicateConstruction); + } + + // Attaching JS control to DOM element + element.winControl = this; + this._element = element; + WinJS.Utilities.addClass(this.element, WinJS.UI.NavBarCommand._ClassName.navbarcommand); + WinJS.Utilities.addClass(this.element, "win-disposable"); + + this._tooltip = null; + this._splitOpened = false; + this._buildDom(); + element.addEventListener('keydown', this._keydownHandler.bind(this)); + + WinJS.UI.setOptions(this, options); + }, { + /// + element: { + get: function () { + return this._element; + } + }, + + /// + /// Gets or sets the label of the NavBarCommand. + /// + /// + label: { + get: function () { + return this._label; + }, + set: function (value) { + this._label = value; + this._labelEl.textContent = value; + } + }, + + /// + /// Gets or sets the tooltip of the NavBarCommand. + /// + /// + tooltip: { + get: function () { + return this._tooltip; + }, + set: function (value) { + this._tooltip = value; + if (this._tooltip || this._tooltip === "") { + this._element.setAttribute('title', this._tooltip); + } else { + this._element.removeAttribute('title'); + } + } + }, + + /// + /// Gets or sets the icon of the NavBarCommand. This value is either one of the values of the AppBarIcon enumeration or the path of a custom PNG file. + /// + /// + icon: { + get: function () { + return this._icon; + }, + set: function (value) { + this._icon = (WinJS.UI.AppBarIcon[value] || value); + + // If the icon's a single character, presume a glyph + if (this._icon && this._icon.length === 1) { + // Set the glyph + this._imageSpan.innerText = this._icon; + this._imageSpan.style.backgroundImage = ""; + this._imageSpan.style.msHighContrastAdjust = ""; + this._imageSpan.style.display = ""; + } else if (this._icon && this._icon.length > 1) { + // Must be an image, set that + this._imageSpan.innerText = ""; + this._imageSpan.style.backgroundImage = this._icon; + this._imageSpan.style.msHighContrastAdjust = "none"; + this._imageSpan.style.display = ""; + } else { + this._imageSpan.innerText = ""; + this._imageSpan.style.backgroundImage = ""; + this._imageSpan.style.msHighContrastAdjust = ""; + this._imageSpan.style.display = "none"; + } + } + }, + + /// + /// Gets or sets the command's target location. + /// + /// + location: { + get: function () { + return this._location; + }, + set: function (value) { + this._location = value; + } + }, + + /// + /// Gets or sets the state value used for navigation. The command passes this object to the WinJS.Navigation.navigate function. + /// + /// + state: { + get: function () { + return this._state; + }, + set: function (value) { + this._state = value; + } + }, + + /// + /// Gets or sets a value that specifies whether the NavBarCommand has a split button. + /// + /// + splitButton: { + get: function () { + return this._split; + }, + set: function (value) { + this._split = value; + if (this._split) { + this._splitButtonEl.style.display = "flex"; + } else { + this._splitButtonEl.style.display = "none"; + } + } + }, + + /// + splitOpened: { + get: function () { + return this._splitOpened; + }, + set: function (value) { + if (this._splitOpened !== !!value) { + this._toggleSplit(); + } + } + }, + + _toggleSplit: function NavBarCommand_toggleSplit() { + this._splitOpened = !this._splitOpened; + if (this._splitOpened) { + WinJS.Utilities.addClass(this._splitButtonEl, WinJS.UI.NavBarCommand._ClassName.navbarcommandsplitbuttonopened); + this._splitButtonEl.setAttribute("aria-expanded", "true"); + } else { + WinJS.Utilities.removeClass(this._splitButtonEl, WinJS.UI.NavBarCommand._ClassName.navbarcommandsplitbuttonopened); + this._splitButtonEl.setAttribute("aria-expanded", "false"); + } + this._fireEvent(WinJS.UI.NavBarCommand._EventName._splitToggle); + }, + + _rtl: { + get: function () { + return window.getComputedStyle(this.element).direction === "rtl"; + } + }, + + _keydownHandler: function NavBarCommand_keydownHandler(ev) { + if (ev.srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + return; + } + + var leftStr = this._rtl ? "Right" : "Left"; + var rightStr = this._rtl ? "Left" : "Right"; + + if (!ev.altKey && (ev.key === leftStr || ev.key === "Home" || ev.key === "End") && ev.srcElement === this._splitButtonEl) { + this._splitButtonActive = false; + try { + this._buttonEl.setActive(); + } catch (e) { + } + if (ev.key === leftStr) { + ev.stopPropagation(); + } + ev.preventDefault(); + } else if (!ev.altKey && ev.key === rightStr && this.splitButton && (ev.srcElement === this._buttonEl || this._buttonEl.contains(ev.srcElement))) { + this._splitButtonActive = true; + try { + this._splitButtonEl.setActive(); + } catch (e) { + } + if (ev.key === rightStr) { + ev.stopPropagation(); + } + ev.preventDefault(); + } else if ((ev.key === "Spacebar" || ev.key === "Enter") && (ev.srcElement === this._buttonEl || this._buttonEl.contains(ev.srcElement))) { + if (this.location) { + WinJS.Navigation.navigate(this.location, this.state); + } + this._fireEvent(WinJS.UI.NavBarCommand._EventName._invoked); + } else if ((ev.key === "Spacebar" || ev.key === "Enter") && ev.srcElement === this._splitButtonEl) { + this._toggleSplit(); + } + }, + + _getFocusInto: function NavBarCommand_getFocusInto(key) { + var leftStr = this._rtl ? "Right" : "Left"; + if ((key === leftStr) && this.splitButton) { + this._splitButtonActive = true; + return this._splitButtonEl; + } else { + this._splitButtonActive = false; + return this._buttonEl; + } + }, + + _buildDom: function NavBarCommand_buildDom() { + var markup = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + ''; + this.element.insertAdjacentHTML("afterBegin", markup); + + this._buttonEl = this.element.firstElementChild; + this._buttonPressedBehavior = new WinJS.UI._WinPressed(this._buttonEl); + this._contentEl = this._buttonEl.firstElementChild; + this._imageSpan = this._contentEl.firstElementChild; + this._imageSpan.style.display = "none"; + this._labelEl = this._imageSpan.nextElementSibling; + this._splitButtonEl = this._buttonEl.nextElementSibling; + this._splitButtonPressedBehavior = new WinJS.UI._WinPressed(this._splitButtonEl); + this._splitButtonEl.style.display = "none"; + + WinJS.UI._ensureId(this._buttonEl); + this._splitButtonEl.setAttribute("aria-labelledby", this._buttonEl.id); + + this._buttonEl.addEventListener("click", this._handleButtonClick.bind(this)); + this._buttonEl.addEventListener("beforeactivate", this._beforeactivateButtonHandler.bind(this)); + this._buttonEl.addEventListener("pointerdown", this._MSPointerDownButtonHandler.bind(this)); + + var mutationObserver = new MutationObserver(this._splitButtonAriaExpandedPropertyChangeHandler.bind(this)); + mutationObserver.observe(this._splitButtonEl, { attributes: true, attributeFilter: ["aria-expanded"] }); + this._splitButtonEl.addEventListener("click", this._handleSplitButtonClick.bind(this)); + this._splitButtonEl.addEventListener("beforeactivate", this._beforeactivateSplitButtonHandler.bind(this)); + this._splitButtonEl.addEventListener("pointerdown", this._MSPointerDownSplitButtonHandler.bind(this)); + + // reparent any other elements. + var tempEl = this._splitButtonEl.nextSibling; + while (tempEl) { + this._buttonEl.insertBefore(tempEl, this._contentEl); + if (tempEl.nodeName !== "#text") { + WinJS.UI.processAll(tempEl); + } + tempEl = this._splitButtonEl.nextSibling; + } + }, + + _MSPointerDownButtonHandler: function NavBarCommand_MSPointerDownButtonHandler(ev) { + this._splitButtonActive = false; + }, + + _MSPointerDownSplitButtonHandler: function NavBarCommand_MSPointerDownSplitButtonHandler(ev) { + this._splitButtonActive = true; + }, + + _handleButtonClick: function NavBarCommand_handleButtonClick(ev) { + var srcElement = ev.srcElement; + if (!srcElement.msMatchesSelector(".win-interactive, .win-interactive *")) { + if (this.location) { + WinJS.Navigation.navigate(this.location, this.state); + } + this._fireEvent(WinJS.UI.NavBarCommand._EventName._invoked); + } + }, + + _splitButtonAriaExpandedPropertyChangeHandler: function NavBarCommand_splitButtonAriaExpandedPropertyChangeHandler() { + if ((this._splitButtonEl.getAttribute("aria-expanded") === "true") !== this._splitOpened) { + this._toggleSplit(); + } + }, + + _handleSplitButtonClick: function NavBarCommand_handleSplitButtonClick(ev) { + this._toggleSplit(); + }, + + _beforeactivateSplitButtonHandler: function NavBarCommand_beforeactivateSplitButtonHandler(ev) { + if (!this._splitButtonActive) { + ev.stopPropagation(); + ev.preventDefault(); + } + }, + + _beforeactivateButtonHandler: function NavBarCommand_beforeactivateButtonHandler(ev) { + if (this._splitButtonActive) { + ev.stopPropagation(); + ev.preventDefault(); + } + }, + + _fireEvent: function NavBarCommand_fireEvent(type, detail) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, true, false, detail); + this.element.dispatchEvent(event); + }, + + dispose: function NavBarCommand_dispose() { + /// + /// + /// Disposes this control. + /// + /// + /// + if (this._disposed) { + return; + } + this._disposed = true; + + this._buttonPressedBehavior.dispose(); + this._splitButtonPressedBehavior.dispose(); + } + }, { + _ClassName: { + navbarcommand: "win-navbarcommand", + navbarcommandbutton: "win-navbarcommand-button", + navbarcommandbuttoncontent: "win-navbarcommand-button-content", + navbarcommandsplitbutton: "win-navbarcommand-splitbutton", + navbarcommandsplitbuttonopened: "win-navbarcommand-splitbutton-opened", + navbarcommandicon: "win-navbarcommand-icon", + navbarcommandlabel: "win-navbarcommand-label" + }, + _EventName: { + _invoked: "_invoked", + _splitToggle: "_splittoggle" + } + }); + WinJS.Class.mix(NavBarCommand, WinJS.UI.DOMEventMixin); + return NavBarCommand; + }) + }); + +})(this, WinJS); + +(function tooltipInit(global) { + "use strict"; + + // Tooltip control implementation + WinJS.Namespace.define("WinJS.UI", { + /// + /// + /// Displays a tooltip that can contain images and formatting. + /// + /// + /// + /// + /// + /// ]]> + /// Raised when the tooltip is about to appear. + /// Raised when the tooltip is showing. + /// Raised when the tooltip is about to become hidden. + /// Raised when the tooltip is hidden. + /// The entire Tooltip control. + /// + /// + /// + Tooltip: WinJS.Namespace._lazy(function () { + var lastCloseTime = 0; + var utilities = WinJS.Utilities; + var animation = WinJS.UI.Animation; + + // Constants definition + var DEFAULT_PLACEMENT = "top"; + var DELAY_INITIAL_TOUCH_SHORT = 400; + var DELAY_INITIAL_TOUCH_LONG = 1200; + var DEFAULT_MOUSE_HOVER_TIME = 400; // 0.4 second + var DEFAULT_MESSAGE_DURATION = 5000; // 5 secs + var DELAY_RESHOW_NONINFOTIP_TOUCH = 0; + var DELAY_RESHOW_NONINFOTIP_NONTOUCH = 600; + var DELAY_RESHOW_INFOTIP_TOUCH = 400; + var DELAY_RESHOW_INFOTIP_NONTOUCH = 600; + var RESHOW_THRESHOLD = 200; + var HIDE_DELAY_MAX = 300000; // 5 mins + var OFFSET_KEYBOARD = 12; + var OFFSET_MOUSE = 20; + var OFFSET_TOUCH = 45; + var OFFSET_PROGRAMMATIC_TOUCH = 20; + var OFFSET_PROGRAMMATIC_NONTOUCH = 12; + var SAFETY_NET_GAP = 1; // We set a 1-pixel gap between the right or bottom edge of the tooltip and the viewport to avoid possible re-layout + var PT_TOUCH = MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch"; // pointer type to indicate a touch event + + var EVENTS_INVOKE = { "keyup": "", "pointerover": "" }, + EVENTS_UPDATE = { "pointermove": "" }, + EVENTS_DISMISS = { "pointerdown": "", "keydown": "", "blur": "", "pointerout": "", "pointercancel": "", "pointerup": "" }, + EVENTS_BY_CHILD = { "pointerover": "", "pointerout": "" }; + + // CSS class names + var msTooltip = "win-tooltip", + msTooltipPhantom = "win-tooltip-phantom"; + + // Global attributes + var mouseHoverTime = DEFAULT_MOUSE_HOVER_TIME, + nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime, + infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime, + messageDuration = DEFAULT_MESSAGE_DURATION, + isLeftHanded = false; + + var hasInitWinRTSettings = false; + + var createEvent = WinJS.Utilities._createEventProperty; + + return WinJS.Class.define(function Tooltip_ctor(anchorElement, options) { + /// + /// + /// Creates a new Tooltip. + /// + /// + /// The DOM element that hosts the Tooltip. + /// + /// + /// An object that contains one or more property/value pairs to apply to the new control. + /// Each property of the options object corresponds to one of the control's properties or events. + /// Event names must begin with "on". For example, to provide a handler for the opened event, + /// add a property named "onopened" to the options object and set its value to the event handler. + /// This parameter is optional. + /// + /// + /// The new Tooltip. + /// + /// + /// + anchorElement = anchorElement || document.createElement("div"); + + var tooltip = utilities.data(anchorElement).tooltip; + if (tooltip) { + return tooltip; + } + + // Set system attributes if it is in WWA, otherwise, use the default values + if (!hasInitWinRTSettings && WinJS.Utilities.hasWinRT) { // in WWA + var uiSettings = new Windows.UI.ViewManagement.UISettings(); + mouseHoverTime = uiSettings.mouseHoverTime; + nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime; + infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime; + messageDuration = uiSettings.messageDuration * 1000; // uiSettings.messageDuration is in seconds. + var handedness = uiSettings.handPreference; + isLeftHanded = (handedness == Windows.UI.ViewManagement.HandPreference.leftHanded); + } + hasInitWinRTSettings = true; + + // Need to initialize properties + this._disposed = false; + this._placement = DEFAULT_PLACEMENT; + this._infotip = false; + this._innerHTML = null; + this._contentElement = null; + this._extraClass = null; + this._lastContentType = "html"; + this._anchorElement = anchorElement; + this._domElement = null; + this._phantomDiv = null; + this._triggerByOpen = false; + this._eventListenerRemoveStack = []; + + // To handle keyboard navigation + this._lastKeyOrBlurEvent = null; + this._currentKeyOrBlurEvent = null; + + // Remember ourselves + anchorElement.winControl = this; + WinJS.Utilities.addClass(anchorElement, "win-disposable"); + + // If anchor element's title is defined, set as the default tooltip content + if (anchorElement.title) { + this._innerHTML = this._anchorElement.title; + this._anchorElement.removeAttribute("title"); + } + + WinJS.UI.setOptions(this, options); + this._events(); + utilities.data(anchorElement).tooltip = this; + }, { + /// + /// Gets or sets the HTML content of the Tooltip. + /// + /// + innerHTML: { + get: function () { + return this._innerHTML; + }, + set: function (value) { + this._innerHTML = value; + if (this._domElement) { + // If we set the innerHTML to null or "" while tooltip is up, we should close it + if (!this._innerHTML || this._innerHTML === "") { + this._onDismiss(); + return; + } + this._domElement.innerHTML = value; + this._position(); + } + this._lastContentType = "html"; + } + }, + + /// + element: { + get: function () { + return this._anchorElement; + } + }, + + /// + /// Gets or sets the DOM element that is the content for the ToolTip. + /// + /// + contentElement: { + get: function () { + return this._contentElement; + }, + set: function (value) { + this._contentElement = value; + if (this._domElement) { + // If we set the contentElement to null while tooltip is up, we should close it + if (!this._contentElement) { + this._onDismiss(); + return; + } + this._domElement.innerHTML = ""; + this._domElement.appendChild(this._contentElement); + this._position(); + } + this._lastContentType = "element"; + } + }, + + /// + /// Gets or sets the position for the Tooltip relative to its target element: top, bottom, left or right. + /// + /// + placement: { + get: function () { + return this._placement; + }, + set: function (value) { + if (value !== "top" && value !== "bottom" && value !== "left" && value !== "right") { + value = DEFAULT_PLACEMENT; + } + this._placement = value; + if (this._domElement) { + this._position(); + } + } + }, + + /// + /// Gets or sets a value that specifies whether the Tooltip is an infotip, a tooltip that contains + /// a lot of info and should be displayed for longer than a typical Tooltip. + /// The default value is false. + /// + /// + infotip: { + get: function () { + return this._infotip; + }, + set: function (value) { + this._infotip = !!value; //convert the value to boolean + } + }, + + /// + /// Gets or sets additional CSS classes to apply to the Tooltip control's host element. + /// + /// + extraClass: { + get: function () { + return this._extraClass; + }, + set: function (value) { + this._extraClass = value; + } + }, + + /// + /// Raised just before the Tooltip appears. + /// + /// + onbeforeopen: createEvent("beforeopen"), + + /// + /// Raised when the Tooltip is shown. + /// + /// + onopened: createEvent("opened"), + + /// + /// Raised just before the Tooltip is hidden. + /// + /// + onbeforeclose: createEvent("beforeclose"), + + /// + /// Raised when the Tooltip is no longer displayed. + /// + /// + onclosed: createEvent("closed"), + + dispose: function () { + /// + /// + /// Disposes this Tooltip. + /// + /// + /// + if (this._disposed) { + return; + } + + this._disposed = true; + WinJS.Utilities.disposeSubTree(this.element); + for (var i = 0, len = this._eventListenerRemoveStack.length; i < len; i++) { + this._eventListenerRemoveStack[i](); + } + this._onDismiss(); + var data = utilities.data(this._anchorElement); + if (data) { + delete data.tooltip; + } + }, + + addEventListener: function (eventName, eventCallBack, capture) { + /// + /// + /// Registers an event handler for the specified event. + /// + /// The name of the event. + /// The event handler function to associate with this event. + /// Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase. + /// + /// + + if (this._anchorElement) { + this._anchorElement.addEventListener(eventName, eventCallBack, capture); + + var that = this; + this._eventListenerRemoveStack.push(function () { + that._anchorElement.removeEventListener(eventName, eventCallBack, capture); + }); + } + }, + + removeEventListener: function (eventName, eventCallBack, capture) { + /// + /// + /// Unregisters an event handler for the specified event. + /// + /// The name of the event. + /// The event handler function to remove. + /// Set to true to unregister the event handler for the capturing phase; otherwise, set to false to unregister the event handler for the bubbling phase. + /// + /// + + if (this._anchorElement) { + this._anchorElement.removeEventListener(eventName, eventCallBack, capture); + } + }, + + open: function (type) { + /// + /// + /// Shows the Tooltip. + /// + /// The type of tooltip to show: "touch", "mouseover", "mousedown", or "keyboard". The default value is "mousedown". + /// + /// + + // Open takes precedence over other triggering events + // Once tooltip is opened using open(), it can only be closed by time out(mouseover or keyboard) or explicitly by close(). + this._triggerByOpen = true; + + if (type !== "touch" && type !== "mouseover" && type !== "mousedown" && type !== "keyboard") { + type = "default"; + } + + switch (type) { + case "touch": + this._onInvoke("touch", "never"); + break; + case "mouseover": + this._onInvoke("mouse", "auto"); + break; + case "keyboard": + this._onInvoke("keyboard", "auto"); + break; + case "mousedown": + case "default": + this._onInvoke("nodelay", "never"); + break; + } + + }, + + close: function () { + /// + /// + /// Hids the Tooltip. + /// + /// + /// + + this._onDismiss(); + }, + + _cleanUpDOM: function () { + if (this._domElement) { + WinJS.Utilities.disposeSubTree(this._domElement); + document.body.removeChild(this._domElement); + this._domElement = null; + + document.body.removeChild(this._phantomDiv); + this._phantomDiv = null; + } + }, + + _createTooltipDOM: function () { + this._cleanUpDOM(); + + this._domElement = document.createElement("div"); + + var id = this._domElement.uniqueID; + this._domElement.setAttribute("id", id); + + // Set the direction of tooltip according to anchor element's + var computedStyle = document.defaultView.getComputedStyle(this._anchorElement, null); + var elemStyle = this._domElement.style; + elemStyle.direction = computedStyle.direction; + elemStyle.writingMode = computedStyle["writing-mode"]; // must use CSS name, not JS name + + // Make the tooltip non-focusable + this._domElement.setAttribute("tabindex", -1); + + // Set the aria tags for accessibility + this._domElement.setAttribute("role", "tooltip"); + this._anchorElement.setAttribute("aria-describedby", id); + + // Set the tooltip content + if (this._lastContentType === "element") { // Last update through contentElement option + this._domElement.appendChild(this._contentElement); + } else { // Last update through innerHTML option + this._domElement.innerHTML = this._innerHTML; + } + + document.body.appendChild(this._domElement); + utilities.addClass(this._domElement, msTooltip); + + // In the event of user-assigned classes, add those too + if (this._extraClass) { + utilities.addClass(this._domElement, this._extraClass); + } + + // Create a phantom div on top of the tooltip div to block all interactions + this._phantomDiv = document.createElement("div"); + this._phantomDiv.setAttribute("tabindex", -1); + document.body.appendChild(this._phantomDiv); + utilities.addClass(this._phantomDiv, msTooltipPhantom); + var zIndex = document.defaultView.getComputedStyle(this._domElement, null).zIndex + 1; + this._phantomDiv.style.zIndex = zIndex; + }, + + _raiseEvent: function (type, eventProperties) { + if (this._anchorElement) { + var customEvent = document.createEvent("CustomEvent"); + customEvent.initCustomEvent(type, false, false, eventProperties); + this._anchorElement.dispatchEvent(customEvent); + } + }, + + // Support for keyboard navigation + _captureLastKeyBlurOrPointerOverEvent: function (event, listener) { + listener._lastKeyOrBlurEvent = listener._currentKeyOrBlurEvent; + switch (event.type) { + case "keyup": + if (event.key === "Shift") { + listener._currentKeyOrBlurEvent = null; + } else { + listener._currentKeyOrBlurEvent = "keyboard"; + } + break; + case "blur": + //anchor elment no longer in focus, clear up the stack + listener._currentKeyOrBlurEvent = null; + break; + default: + break; + + } + }, + + _registerEventToListener: function (element, eventType, listener) { + var handler = function (event) { + listener._captureLastKeyBlurOrPointerOverEvent(event, listener); + listener._handleEvent(event); + }; + element.addEventListener(eventType, handler, false); + + this._eventListenerRemoveStack.push(function () { + element.removeEventListener(eventType, handler, false); + }); + }, + + _events: function () { + for (var eventType in EVENTS_INVOKE) { + this._registerEventToListener(this._anchorElement, eventType, this); + } + for (var eventType in EVENTS_UPDATE) { + this._registerEventToListener(this._anchorElement, eventType, this); + } + for (eventType in EVENTS_DISMISS) { + this._registerEventToListener(this._anchorElement, eventType, this); + } + + + }, + + _handleEvent: function (event) { + var eventType = event.type; + if (!this._triggerByOpen) { + // If the anchor element has children, we should ignore events that are caused within the anchor element + // Please note that we are not using event.target here as in bubbling phases from the child, the event target + // is usually the child + if (eventType in EVENTS_BY_CHILD) { + var elem = event.relatedTarget; + + while (elem && elem !== this._anchorElement && elem !== document.body) { + try { + elem = elem.parentNode; + } + catch (e) { + if (e instanceof Error && e.message === 'Permission denied') { + //Permission denied error, if we can't access the node's + //information, we should not handle the event + //Put this guard prior Bug 484666 is fixed + return; + } + else { + throw e; + } + } + } + if (elem === this._anchorElement) { + return; + } + } + if (eventType in EVENTS_INVOKE) { + if (event.pointerType == PT_TOUCH) { + this._onInvoke("touch", "never", event); + this._showTrigger = "touch"; + } else { + var type = eventType.substring(0, 3) === "key" ? "keyboard" : "mouse"; + this._onInvoke(type, "auto", event); + this._showTrigger = type; + } + } else if (eventType in EVENTS_UPDATE) { + this._contactPoint = { x: event.clientX, y: event.clientY }; + } else if (eventType in EVENTS_DISMISS) { + var eventTrigger; + if (event.pointerType == PT_TOUCH) { + if (eventType == "pointerdown") { + return; + } + eventTrigger = "touch"; + } + else { + eventTrigger = eventType.substring(0, 3) === "key" ? "keyboard" : "mouse"; + } + if (eventType != "blur" && eventTrigger != this._showTrigger) { + return; + } + this._onDismiss(); + } + } + }, + + _onShowAnimationEnd: function () { + if (this._shouldDismiss || this._disposed) { + return; + } + this._raiseEvent("opened"); + if (this._domElement) { + if (this._hideDelay !== "never") { + var that = this; + var delay = this._infotip ? Math.min(3 * messageDuration, HIDE_DELAY_MAX) : messageDuration; + this._hideDelayTimer = setTimeout(function () { + that._onDismiss(); + }, delay); + } + } + }, + + + _onHideAnimationEnd: function () { + document.body.removeEventListener("DOMNodeRemoved", this._removeTooltip, false); + this._cleanUpDOM(); + // Once we remove the tooltip from the DOM, we should remove the aria tag from the anchor + if (this._anchorElement) { + this._anchorElement.removeAttribute("aria-describedby"); + } + lastCloseTime = (new Date()).getTime(); + this._triggerByOpen = false; + if (!this._disposed) { + this._raiseEvent("closed"); + } + }, + + _decideOnDelay: function (type) { + var value; + this._useAnimation = true; + + if (type == "nodelay") { + value = 0; + this._useAnimation = false; + } + else { + var curTime = (new Date()).getTime(); + // If the mouse is moved immediately from another anchor that has + // tooltip open, we should use a shorter delay + if (curTime - lastCloseTime <= RESHOW_THRESHOLD) { + if (type == "touch") { + value = this._infotip ? DELAY_RESHOW_INFOTIP_TOUCH : DELAY_RESHOW_NONINFOTIP_TOUCH; + } + else { + value = this._infotip ? DELAY_RESHOW_INFOTIP_NONTOUCH : DELAY_RESHOW_NONINFOTIP_NONTOUCH; + } + this._useAnimation = false; + } else if (type == "touch") { + value = this._infotip ? DELAY_INITIAL_TOUCH_LONG : DELAY_INITIAL_TOUCH_SHORT; + } else { + value = this._infotip ? infoTooltipNonTouchShowDelay : nonInfoTooltipNonTouchShowDelay; + } + } + return value; + }, + + // This function returns the anchor element's position in the Window coordinates. + _getAnchorPositionFromElementWindowCoord: function () { + var rect = this._anchorElement.getBoundingClientRect(); + + return { + x: rect.left, + y: rect.top, + width: rect.width, + height: rect.height + }; + }, + + _getAnchorPositionFromPointerWindowCoord: function (contactPoint) { + return { + x: contactPoint.x, + y: contactPoint.y, + width: 1, + height: 1 + }; + }, + + _canPositionOnSide: function (placement, viewport, anchor, tip) { + var availWidth = 0, availHeight = 0; + + switch (placement) { + case "top": + availWidth = tip.width + this._offset; + availHeight = anchor.y; + break; + case "bottom": + availWidth = tip.width + this._offset; + availHeight = viewport.height - anchor.y - anchor.height; + break; + case "left": + availWidth = anchor.x; + availHeight = tip.height + this._offset; + break; + case "right": + availWidth = viewport.width - anchor.x - anchor.width; + availHeight = tip.height + this._offset; + break; + } + return ((availWidth >= tip.width + this._offset) && (availHeight >= tip.height + this._offset)); + }, + + _positionOnSide: function (placement, viewport, anchor, tip) { + var left = 0, top = 0; + + switch (placement) { + case "top": + case "bottom": + // Align the tooltip to the anchor's center horizontally + left = anchor.x + anchor.width / 2 - tip.width / 2; + + // If the left boundary is outside the window, set it to 0 + // If the right boundary is outside the window, set it to align with the window right boundary + left = Math.min(Math.max(left, 0), viewport.width - tip.width - SAFETY_NET_GAP); + + top = (placement == "top") ? anchor.y - tip.height - this._offset : anchor.y + anchor.height + this._offset; + break; + case "left": + case "right": + // Align the tooltip to the anchor's center vertically + top = anchor.y + anchor.height / 2 - tip.height / 2; + + // If the top boundary is outside the window, set it to 0 + // If the bottom boundary is outside the window, set it to align with the window bottom boundary + top = Math.min(Math.max(top, 0), viewport.height - tip.height - SAFETY_NET_GAP); + + left = (placement == "left") ? anchor.x - tip.width - this._offset : anchor.x + anchor.width + this._offset; + break; + } + + // Actually set the position + this._domElement.style.left = left + "px"; + this._domElement.style.top = top + "px"; + + // Set the phantom's position and size + this._phantomDiv.style.left = left + "px"; + this._phantomDiv.style.top = top + "px"; + this._phantomDiv.style.width = tip.width + "px"; + this._phantomDiv.style.height = tip.height + "px"; + }, + + _position: function (contactType) { + var viewport = { width: 0, height: 0 }; + var anchor = { x: 0, y: 0, width: 0, height: 0 }; + var tip = { width: 0, height: 0 }; + + viewport.width = document.documentElement.clientWidth; + viewport.height = document.documentElement.clientHeight; + if (document.defaultView.getComputedStyle(document.body, null)["writing-mode"] === "tb-rl") { + viewport.width = document.documentElement.clientHeight; + viewport.height = document.documentElement.clientWidth; + } + + if (this._contactPoint && (contactType === "touch" || contactType === "mouse")) { + anchor = this._getAnchorPositionFromPointerWindowCoord(this._contactPoint); + } + else { + // keyboard or programmatic is relative to element + anchor = this._getAnchorPositionFromElementWindowCoord(); + } + tip.width = this._domElement.offsetWidth; + tip.height = this._domElement.offsetHeight; + var fallback_order = { + "top": ["top", "bottom", "left", "right"], + "bottom": ["bottom", "top", "left", "right"], + "left": ["left", "right", "top", "bottom"], + "right": ["right", "left", "top", "bottom"] + }; + if (isLeftHanded) { + fallback_order.top[2] = "right"; + fallback_order.top[3] = "left"; + fallback_order.bottom[2] = "right"; + fallback_order.bottom[3] = "left"; + } + + // Try to position the tooltip according to the placement preference + // We use this order: + // 1. Try the preferred placement + // 2. Try the opposite placement + // 3. If the preferred placement is top or bottom, we should try left + // and right (or right and left if left handed) + // If the preferred placement is left or right, we should try top and bottom + var order = fallback_order[this._placement]; + var length = order.length; + for (var i = 0; i < length; i++) { + if (i == length - 1 || this._canPositionOnSide(order[i], viewport, anchor, tip)) { + this._positionOnSide(order[i], viewport, anchor, tip); + break; + } + } + return order[i]; + }, + + _showTooltip: function (contactType) { + // Give a chance to dismiss the tooltip before it starts to show + if (this._shouldDismiss) { + return; + } + this._isShown = true; + this._raiseEvent("beforeopen"); + + // If the anchor is not in the DOM tree, we don't create the tooltip + if (!document.body.contains(this._anchorElement)) { + return; + } + if (this._shouldDismiss) { + return; + } + + // If the contentElement is set to null or innerHTML set to null or "", we should NOT show the tooltip + if (this._lastContentType === "element") { // Last update through contentElement option + if (!this._contentElement) { + this._isShown = false; + return; + } + } else { // Last update through innerHTML option + if (!this._innerHTML || this._innerHTML === "") { + this._isShown = false; + return; + } + } + + var that = this; + this._removeTooltip = function (event) { + var current = that._anchorElement; + while (current) { + if (event.target == current) { + document.body.removeEventListener("DOMNodeRemoved", that._removeTooltip, false); + that._cleanUpDOM(); + break; + } + current = current.parentNode; + } + }; + + document.body.addEventListener("DOMNodeRemoved", this._removeTooltip, false); + this._createTooltipDOM(); + var pos = this._position(contactType); + var that = this; + if (this._useAnimation) { + animation.fadeIn(this._domElement) + .then(this._onShowAnimationEnd.bind(this)); + } else { + this._onShowAnimationEnd(); + } + }, + + _onInvoke: function (type, hide, event) { + // Reset the dismiss flag + this._shouldDismiss = false; + + // If the tooltip is already shown, ignore the current event + if (this._isShown) { + return; + } + + // To handle keyboard support, we only want to display tooltip on the first tab key event only + if (event && event.type === "keyup") { + if (this._lastKeyOrBlurEvent == "keyboard" || + !this._lastKeyOrBlurEvent && event.key !== "Tab") { + return; + } + } + + // Set the hide delay, + this._hideDelay = hide; + + this._contactPoint = null; + if (event) { // Open through interaction + this._contactPoint = { x: event.clientX, y: event.clientY }; + // Tooltip display offset differently for touch events and non-touch events + if (type == "touch") { + this._offset = OFFSET_TOUCH; + } else if (type === "keyboard") { + this._offset = OFFSET_KEYBOARD; + } else { + this._offset = OFFSET_MOUSE; + } + } else { // Open Programmatically + if (type == "touch") { + this._offset = OFFSET_PROGRAMMATIC_TOUCH; + } else { + this._offset = OFFSET_PROGRAMMATIC_NONTOUCH; + } + } + + clearTimeout(this._delayTimer); + clearTimeout(this._hideDelayTimer); + + // Set the delay time + var delay = this._decideOnDelay(type); + if (delay > 0) { + var that = this; + this._delayTimer = setTimeout(function () { + that._showTooltip(type); + }, delay); + } else { + this._showTooltip(type); + } + }, + + _onDismiss: function () { + // Set the dismiss flag so that we don't miss dismiss events + this._shouldDismiss = true; + + // If the tooltip is already dismissed, ignore the current event + if (!this._isShown) { + return; + } + + this._isShown = false; + + // Reset tooltip state + this._showTrigger = "mouse"; + + if (this._domElement) { + this._raiseEvent("beforeclose"); + if (this._useAnimation) { + animation.fadeOut(this._domElement) + .then(this._onHideAnimationEnd.bind(this)); + } else { + this._onHideAnimationEnd(); + } + } else { + this._raiseEvent("beforeclose"); + this._raiseEvent("closed"); + } + } + }); + }) + }); + +})(this, WinJS); +// ViewBox control +(function viewboxInit(global, undefined) { + "use strict"; + + WinJS.Namespace.define("WinJS.UI", { + /// + /// Scales a single child element to fill the available space without + /// resizing it. This control reacts to changes in the size of the container as well as + /// changes in size of the child element. For example, a media query may result in + /// a change in aspect ratio. + /// + /// View Box + /// + /// + ///
ViewBox
]]>
+ /// + /// + /// + ViewBox: WinJS.Namespace._lazy(function () { + var Scheduler = WinJS.Utilities.Scheduler; + + var strings = { + get invalidViewBoxChildren() { return WinJS.Resources._getWinJSString("ui/invalidViewBoxChildren").value; }, + }; + + function onresize(control) { + if (control && !control._resizing) { + control._resizing = control._resizing || 0; + control._resizing++; + try { + control._updateLayout(); + } finally { + control._resizing--; + } + } + } + + function onresizeBox(ev) { + if (ev.srcElement) { + onresize(ev.srcElement.winControl); + } + } + + function onresizeSizer(ev) { + if (ev.srcElement) { + onresize(ev.srcElement.parentElement.winControl); + } + } + + var ViewBox = WinJS.Class.define(function ViewBox_ctor(element, options) { + /// + /// Initializes a new instance of the ViewBox control + /// + /// The DOM element that functions as the scaling box. This element fills 100% of the width and height allotted to it. + /// + /// + /// The set of options to be applied initially to the ViewBox control. + /// + /// A constructed ViewBox control. + /// + this._disposed = false; + + this._element = element || document.createElement("div"); + var box = this.element; + box.winControl = this; + WinJS.Utilities.addClass(box, "win-disposable"); + WinJS.Utilities.addClass(box, "win-viewbox"); + this.forceLayout(); + }, { + _sizer: null, + _element: null, + + /// + element: { + get: function () { return this._element; } + }, + + _rtl: { + get: function () { + return window.getComputedStyle(this.element).direction === "rtl"; + } + }, + + _initialize: function () { + var box = this.element; + if (box.firstElementChild !== this._sizer) { + if (WinJS.validation) { + if (box.childElementCount != 1) { + throw new WinJS.ErrorFromName("WinJS.UI.ViewBox.InvalidChildren", strings.invalidViewBoxChildren); + } + } + if (this._sizer) { + this._sizer.onresize = null; + } + var sizer = box.firstElementChild; + this._sizer = sizer; + if (sizer) { + box.addEventListener("mselementresize", onresizeBox); + sizer.addEventListener("mselementresize", onresizeSizer); + } + if (box.clientWidth === 0 && box.clientHeight === 0) { + var that = this; + // Wait for the viewbox to get added to the DOM. It should be added + // in the synchronous block in which _initialize was called. + Scheduler.schedule(function () { + that._updateLayout(); + }, Scheduler.Priority.normal, null, "WinJS.UI.ViewBox._updateLayout") + } + } + }, + _updateLayout: function () { + var sizer = this._sizer; + if (sizer) { + var box = this.element; + var w = sizer.clientWidth; + var h = sizer.clientHeight; + var bw = box.clientWidth; + var bh = box.clientHeight; + var wRatio = bw / w; + var hRatio = bh / h; + var mRatio = Math.min(wRatio, hRatio); + var transX = Math.abs(bw - (w * mRatio)) / 2; + var transY = Math.abs(bh - (h * mRatio)) / 2; + var rtl = this._rtl; + this._sizer.style["transform"] = "translate(" + (rtl ? "-" : "") + transX + "px," + transY + "px) scale(" + mRatio + ")"; + this._sizer.style["transform-origin"] = rtl ? "top right" : "top left"; + } + }, + + dispose: function () { + /// + /// + /// Disposes this ViewBox. + /// + /// + if (this._disposed) { + return; + } + + this._disposed = true; + WinJS.Utilities.disposeSubTree(this._element); + }, + + forceLayout: function () { + this._initialize(); + this._updateLayout(); + } + }); + WinJS.Class.mix(ViewBox, WinJS.UI.DOMEventMixin); + return ViewBox; + }) + }); + +}(this)); + +msWriteProfilerMark("Microsoft.WinJS.2.0 1.0.9600.17018.winblue_gdr.140204-1946 ui.js,StopTM"); +