From 486801909ca1b4d8b3c2f69a206ca385e2966a74 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 27 Jul 2012 02:36:06 +0000 Subject: [PATCH] Add tool to generate a VSIX package usable by Visual Studio 2012 RC. FossilOrigin-Name: 8b90e0c4dbcedaf3e61c5d49452997705be1ef98 --- manifest | 14 +- manifest.uuid | 2 +- tool/mkvsix.tcl | 365 +++++++++++++++++++++++++++++++++++++++++++ tool/win/sqlite.vsix | Bin 0 -> 34247 bytes 4 files changed, 374 insertions(+), 7 deletions(-) create mode 100644 tool/mkvsix.tcl create mode 100644 tool/win/sqlite.vsix diff --git a/manifest b/manifest index 7c1d8a6053..3444e28ebb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\sparameters\sto\ssorter\sinterfaces\sas\sconst\swhere\sappropriate. -D 2012-07-24T19:46:38.570 +C Add\stool\sto\sgenerate\sa\sVSIX\spackage\susable\sby\sVisual\sStudio\s2012\sRC. +D 2012-07-27T02:36:06.349 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 8f6d858bf3df9978ba43df19985146a1173025e4 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -982,6 +982,7 @@ F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02 F tool/mksqlite3c.tcl 589c7f44e990be1b8443cfe4808dce392b0327fa F tool/mksqlite3h.tcl 78013ad79a5e492e5f764f3c7a8ef834255061f8 F tool/mksqlite3internalh.tcl 3dca7bb5374cee003379b8cbac73714f610ef795 +F tool/mkvsix.tcl 75fb1b601d69ead76340fa15bf9813874fed240b F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 F tool/omittest.tcl 4665982e95a6e5c1bd806cf7bc3dea95be422d77 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c @@ -1005,7 +1006,8 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P d582cd890d88e873d76a23545bcd49cf093ee9d2 -R dfda5074dc19f89fe8c778d461e17987 -U drh -Z 78ad216a54a8d01eec70f561ea3dc528 +F tool/win/sqlite.vsix 84163b633f01f35cb47495c05dd2b640159677ff +P d8da26f1f43610ac83af2a5d0e170be5abaf7aaa +R e89b8d51f4ab3734c03bdfc7ca67399b +U mistachkin +Z ca7c7ef3778a69af10a33d78de2dc884 diff --git a/manifest.uuid b/manifest.uuid index 4108c28d85..364fa66bed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d8da26f1f43610ac83af2a5d0e170be5abaf7aaa \ No newline at end of file +8b90e0c4dbcedaf3e61c5d49452997705be1ef98 \ No newline at end of file diff --git a/tool/mkvsix.tcl b/tool/mkvsix.tcl new file mode 100644 index 0000000000..a5a569d475 --- /dev/null +++ b/tool/mkvsix.tcl @@ -0,0 +1,365 @@ +#!/usr/bin/tclsh +# +# This script is used to generate a VSIX (Visual Studio Extension) file for +# SQLite usable by Visual Studio. + +proc fail { {error ""} {usage false} } { + if {[string length $error] > 0} then { + puts stdout $error + if {!$usage} then {exit 1} + } + + puts stdout "usage:\ +[file tail [info nameofexecutable]]\ +[file tail [info script]] \[sourceDirectory\]" + + exit 1 +} + +proc getEnvironmentVariable { name } { + # + # NOTE: Returns the value of the specified environment variable or an empty + # string for environment variables that do not exist in the current + # process environment. + # + return [expr {[info exists ::env($name)] ? $::env($name) : ""}] +} + +proc getTemporaryPath {} { + # + # NOTE: Returns the normalized path to the first temporary directory found + # in the typical set of environment variables used for that purpose + # or an empty string to signal a failure to locate such a directory. + # + set names [list] + + foreach name [list TEMP TMP] { + lappend names [string toupper $name] [string tolower $name] \ + [string totitle $name] + } + + foreach name $names { + set value [getEnvironmentVariable $name] + + if {[string length $value] > 0} then { + return [file normalize $value] + } + } + + return "" +} + +proc appendArgs { args } { + # + # NOTE: Returns all passed arguments joined together as a single string with + # no intervening spaces between arguments. + # + eval append result $args +} + +proc readFile { fileName } { + # + # NOTE: Reads and returns the entire contents of the specified file, which + # may contain binary data. + # + set file_id [open $fileName RDONLY] + fconfigure $file_id -encoding binary -translation binary + set result [read $file_id] + close $file_id + return $result +} + +proc writeFile { fileName data } { + # + # NOTE: Writes the entire contents of the specified file, which may contain + # binary data. + # + set file_id [open $fileName {WRONLY CREAT TRUNC}] + fconfigure $file_id -encoding binary -translation binary + puts -nonewline $file_id $data + close $file_id + return "" +} + +proc substFile { fileName } { + # + # NOTE: Performs all Tcl command, variable, and backslash substitutions in + # the specified file and then re-writes the contents of that same file + # with the substituted data. + # + return [writeFile $fileName [uplevel 1 [list subst [readFile $fileName]]]] +} + +proc replacePlatform { fileName platformName } { + # + # NOTE: Returns the specified file name containing the platform name instead + # of platform placeholder tokens. + # + return [string map [list $platformName] $fileName] +} + +set script [file normalize [info script]] + +if {[string length $script] == 0} then { + fail "script file currently being evaluated is unknown" true +} + +set path [file dirname $script] +set rootName [file rootname [file tail $script]] + +############################################################################### + +# +# NOTE: Process and verify all the command line arguments. +# +set argc [llength $argv] +if {$argc != 1 && $argc != 2} then {fail} + +set binaryDirectory [lindex $argv 0] + +if {[string length $binaryDirectory] == 0} then { + fail "invalid binary directory" +} + +if {![file exists $binaryDirectory] || \ + ![file isdirectory $binaryDirectory]} then { + fail "binary directory does not exist" +} + +if {$argc == 2} then { + set sourceDirectory [lindex $argv 1] +} else { + # + # NOTE: Assume that the source directory is the parent directory of the one + # that contains this script file. + # + set sourceDirectory [file dirname $path] +} + +if {[string length $sourceDirectory] == 0} then { + fail "invalid source directory" +} + +if {![file exists $sourceDirectory] || \ + ![file isdirectory $sourceDirectory]} then { + fail "source directory does not exist" +} + +############################################################################### + +set templateFile [file join $path win sqlite.vsix] + +if {![file exists $templateFile] || \ + ![file isfile $templateFile]} then { + fail [appendArgs "template file \"" $templateFile "\" does not exist"] +} + +set currentDirectory [pwd] +set outputFile [file join $currentDirectory sqlite-output.vsix] + +if {[file exists $outputFile]} then { + fail [appendArgs "output file \"" $outputFile "\" already exists"] +} + +############################################################################### + +# +# NOTE: Make sure that a valid temporary directory exists. +# +set temporaryDirectory [getTemporaryPath] + +if {[string length $temporaryDirectory] == 0 || \ + ![file exists $temporaryDirectory] || \ + ![file isdirectory $temporaryDirectory]} then { + fail "cannot locate a usable temporary directory" +} + +# +# NOTE: Setup the staging directory to have a unique name inside of the +# configured temporary directory. +# +set stagingDirectory [file normalize [file join $temporaryDirectory \ + [appendArgs $rootName . [pid]]]] + +############################################################################### + +# +# NOTE: Configure the external zipping tool. First, see if it has already +# been pre-configured. If not, try to query it from the environment. +# Finally, fallback on the default of simply "zip", which will then +# be assumed to exist somewhere along the PATH. +# +if {![info exists zip]} then { + if {[info exists env(ZipTool)]} then { + set zip $env(ZipTool) + } + if {![info exists zip] || ![file exists $zip]} then { + set zip zip + } +} + +# +# NOTE: Configure the external unzipping tool. First, see if it has already +# been pre-configured. If not, try to query it from the environment. +# Finally, fallback on the default of simply "unzip", which will then +# be assumed to exist somewhere along the PATH. +# +if {![info exists unzip]} then { + if {[info exists env(UnZipTool)]} then { + set unzip $env(UnZipTool) + } + if {![info exists unzip] || ![file exists $unzip]} then { + set unzip unzip + } +} + +############################################################################### + +# +# NOTE: Attempt to extract the SQLite version from the "sqlite3.h" header file +# in the source directory. This script assumes that the header file has +# already been generated by the build process. +# +set pattern {^#define\s+?SQLITE_VERSION\s+?"(.*?)"$} +set data [readFile [file join $sourceDirectory sqlite3.h]] + +if {![regexp -line -- $pattern $data dummy version]} then { + fail [appendArgs "cannot locate SQLITE_VERSION value in \"" \ + [file join $sourceDirectory sqlite3.h] \"] +} + +############################################################################### + +# +# NOTE: Setup the master file list data, including the necessary flags. +# +set fileNames(source) [list "" "" "" \ + [file join $sourceDirectory sqlite3.h] \ + [file join $binaryDirectory sqlite3.lib] \ + [file join $binaryDirectory sqlite3.dll]] + +set fileNames(destination) [list \ + [file join $stagingDirectory extension.vsixmanifest] \ + [file join $stagingDirectory SDKManifest.xml] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + SQLite.WinRT.props] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + sqlite3.h] \ + [file join $stagingDirectory DesignTime CommonConfiguration \ + sqlite3.lib] \ + [file join $stagingDirectory Redist CommonConfiguration \ + sqlite3.dll]] + +set fileNames(neutral) [list 1 1 1 1 0 0] +set fileNames(subst) [list 1 1 1 0 0 0] + +############################################################################### + +# +# NOTE: Setup the list of platforms supported by this script. +# +set platformNames [list ARM x64 x86] + +############################################################################### + +# +# NOTE: Make sure the staging directory exists, creating it if necessary. +# +file mkdir $stagingDirectory + +# +# NOTE: Build the Tcl command used to extract the template package to the +# staging directory. +# +set extractCommand [list exec -- $unzip $templateFile -d $stagingDirectory] + +# +# NOTE: Extract the template package to the staging directory. +# +eval $extractCommand + +############################################################################### + +# +# NOTE: Process each file in the master file list. There are actually four +# parallel lists that contain the source file names, destination file +# names, the platform-neutral flags, and the use-subst flags. When the +# platform-neutral flag is non-zero, the file is not platform-specific. +# When the use-subst flag is non-zero, the file is considered to be a +# text file that may contain Tcl variable and/or command replacements, +# to be dynamically replaced during processing. If the source file name +# is an empty string, then the destination file name will be assumed to +# already exist in the staging directory and will not be copied; however, +# dynamic replacements may still be performed on the destination file +# prior to the package being re-zipped. +# +foreach sourceFileName $fileNames(source) \ + destinationFileName $fileNames(destination) \ + isNeutral $fileNames(neutral) useSubst $fileNames(subst) { + # + # NOTE: If the current file is platform-neutral, then only one platform will + # be processed for it, namely "neutral"; otherwise, each supported + # platform will be processed for it individually. + # + foreach platformName [expr {$isNeutral ? [list neutral] : $platformNames}] { + # + # NOTE: Does the source file need to be copied to the destination file? + # + if {[string length $sourceFileName] > 0} then { + # + # NOTE: Copy the source file to the destination file verbatim. + # + file copy [replacePlatform $sourceFileName $platformName] \ + [replacePlatform $destinationFileName $platformName] + } + + # + # NOTE: Does the destination file contain dynamic replacements that must + # be processed now? + # + if {$useSubst} then { + # + # NOTE: Perform any dynamic replacements contained in the destination + # file and then re-write it in-place. + # + substFile [replacePlatform $destinationFileName $platformName] + } + } +} + +############################################################################### + +# +# NOTE: Change the current directory to the staging directory so that the +# external archive building tool can pickup the necessary files using +# relative paths. +# +cd $stagingDirectory + +# +# NOTE: Build the Tcl command used to archive the final package in the +# output directory. +# +set archiveCommand [list exec -- $zip -r $outputFile *] + +# +# NOTE: Build the final package archive in the output directory. +# +eval $archiveCommand + +# +# NOTE: Change back to the previously saved current directory. +# +cd $currentDirectory + +# +# NOTE: Cleanup the temporary staging directory. +# +file delete -force $stagingDirectory + +############################################################################### + +# +# NOTE: Success, emit the fully qualified path of the generated VSIX file. +# +puts stdout $outputFile diff --git a/tool/win/sqlite.vsix b/tool/win/sqlite.vsix new file mode 100644 index 0000000000000000000000000000000000000000..16f7b57cd03cf43fd1c77761a25b98929305eb39 GIT binary patch literal 34247 zcmbTdV~{7o_vZU;+cu_c+qN}r+qUhV?w+=7+qP}ncK4m%|K7NZ7rPrk}Duo{CbC1_6Zz{O91&eHHkx!T;C5{Od(boGi?2RV-{w=oS9|M2`O{k>Gz!6t=Um zv9lGnvo*Cab8$3qwy?AP?GF4GaKq{-28|E6P|no6xCS*ea>e**n_VJ9Yh$mG2io480-y4lAAm zMZU_{4o3~ovkVU=jCW6)n3pp!;Xl7dCmQ~_ZvLAj(&?G8mX`IB7H40JvbmAZCNq}p zhtlYcU{Z-prq0XXa^^BZ@HjKmU#4bK+rAE>NpMU7&0Od zGO8My4%sk?B|mCYvGlBiHRBW#8NS7Dk!*I9=!H9$dIBX^rt`9we^*-8i%`V=aOzQ< zWCIKe)Z2{G2*7tmHwm~11lRv&GDQzkCo_ZbkD4h@q4$S`(;5Rqfn-n-qTp0vGO5s3 zzF-27rE1A~tWe?uu?RaJ;z5pBmz8b*Fy|?!J6b9i4F#T~t(yXA)v44bs}C$QXV)Ov z49X0j`R@CFj8LfS#vuRc>HegN`P|mzsHY&7Nizns!YU0TWiQh4e34WtR=_t1Wpa2K znthz&cB8rSZ!meOci$Oea&bZMXd2LEpa{$D`k&c^b;faw2#LU#_f z{|=z^e*m?+bk9lsgC_?R06_l-kcqpqiLKK=-057MEZl7jY%NSpoSa=$`fN8CV7m}j z`4NX>%a)#5VCDRQ@gntQ6Ijn&DIx>vEW|5lJdjbyah`7q3OL5vpA4h+e-V)0Q)U=` zN2AHkp8o+Jz_=IW=9ZybczEOqkhQVKB$GZq4pJi0Q;H#~a=F&ACoO5KP!+UdswS#g zHgG~`Jiq_kC&udX0g0CluM-%~B7JTpoJenBpbH(le5f*&>aq0VmydnC@vS{naz_9{ zb*#ZbzvmNx5ICLQ$R}s;+?%rtNEyw&7*-hR2#TkiaWunfDl#N&PBFrSHURLCbxfnP4%PG5JREnv3H zM^Y@w#^)WOiZVgLB&>6BF_|}}aBAr7_9~MFL!A_RUek9=_ky?gf zmvH$7^dJ6F0l@#ZFJqlo0Y~M4dJF^r0Qp}){-e*r=pT6Ywq`)c2v@fe3UcCb(AfXk z*x@84M3nyZg#QUh@PDn7r{^O804;AJEUchlZs%<0WNv3qC@CyVsNiU4YGG{x0JyJb zDVwP%pP}=ifPff~e^x4)G9VWepg&<`cmPnK1?ZFe9WMa?PAlW-A$IX9qkMlDhlpuqq@HI*LZ1gz2m7$ntAB>=T8fZl0Dn0f#t zEPz2VJcJSe>IKjr{q@To5S#`;6}wmGxudQ|JfZrxQfc)(Z6utc0a}o>4iM_l~99%)!i0W1i+50d~uZUWlByM6d_pN6lVo@R?}hS#G#?*acIHZ(l= zKANep7XSeEoPFoMY3LiU{kg&YZNBqKuR+aqVRBtwqD<=%1eyT3XY1+@_WxNM(Y*M! zwY8(e!&Rw4AuWS(b)Rpue!X7xFY7m7p3j%3-R^yo04ALPanRS@{>ev~BHWojP{D?q z$8qAHEigZycnidXl7?*>RHz4v$PTe0>Cq2NMZ^(8e<+7Y=YNd%cW6F9_;y$UwU&H9 zUJ10NIz}MR(&UI5&b|9D0Kk2RUEd-FB#6Ix(B6#O&kg^VcrGcx-&FFC0|1~aLPDo9 z-oQWd4@{BV0IFI+oX0*)nqF|+KCsO`m`{DSU?Gyhej!95Xk&j|M}5l5Kp~3IsaiZL zefmWKJeFQX^Uy?lc)EVoR(M`}gm(kT>^_Rl04PwwQAiX6qV;ef!$^%^v5**PA+JPz z5}?RYB!pw(sEWkW39J%~N|7prsuFnjypF(}VcKHt3EZOqrohk8PI1PhfOg~j9JG1YsyIC&i+Zauao*Qwdvy8hWRb|u>$T_^9jKJ;HIUpDV0 zPvWo|;0>@O;2W^hm^?$Q4t6|v^dlR0io!Yr0>VWG$p$HV!3k}1JOxW)F=7bO7Q@;H zBnLLbHp2yE;ABK((z55W*Xc^KZN-$u+%nuUBU6)8`BTejtQowFD@-RDCmAalJ1zQ} z?wT~srOmA-lJ$q0#lNqcJ8eTWIe!;vsA}poh*f1(kuG;sb(A2Lw8 zk2ROIVAUS2f^Sqe+cf(am>FW2wG34cTqkxV`n3DReDOlSg{{F?;A!IdIyE|?a;b4` zr%z{I^ZN`v{yn2N)0jb=S!F(GMwy@-w8&Dwzbf6Rxn{ezxDMOQnPkbK%>K>nG&?XVysLOL#}AW}%wV-s z=_@ZRA7IvW@{8VxK0&=|rM9KWt^CE{27~XJ&oSqK?|_GWn`!&E-Xwc(%V^7l{D57y zUdWEH->)CzAJ3mTK#4yokQqosfM9?Y@W-pCH&IV4Ki7uIbN$+tV03PqAevxYU{&Bz zUlo!0=w*Br(aTBdbi%X+e29YY>GCXu!LdQqfG;e0NLYw^D1WSdxCZtdV+yO=+@`S8 zj>x;nUy_lS>*|8j{x1xSVuU)oixb-8-LG z4`KUR`!EMy7^(E5I`$rU)BTSjCFo^z$TVDk1!ThIIFfD!5vfYiqe<^k+(=`gJ^Jzb z&4}se*yh4lg|(^h=jRH!A9?Rjb5W?YIxU{YaaW}!XFZRD#|HEP z8W?q`8h9m7Yh*K(&60e@m3m6GZx@-TtW|(+-*{kO6Oh#fj4Jd|h|k65%9W112L11y zCWH6TEF3wv*T^rY%Tb|y2P<&!QXjDN__19YM{)Z3R6%t(_(%W7AXI{3?Yik1FpfY}fN!O$IBk zwsY4wUY*Y@mrEO3oiAT}W8E97K&rA!rb{Ltk{=B({M8ZVXRm)hY;>yRY#gpeK;}Wd zAb!C&ue2>L;mz}^D8(&PUx>qx5OjZM-MG=hvB9avWDf8DvKR3~&%^y<>@BchipOyf-iU6LrGf$vv%o-|Bo{zj1`3-m0En z!=-0)?tISkowy)B(vjJbUfrf`)pqUK)#PRRa)y)5KE3tW<#C7pv%Hke$-C9{;A!_V z^zyWWzUAvk{xv<(vF1j8UDYYysrM*wCAcQM6}H5$^}V@zv*~Bq>z4a4w<-Pt9uhS3 zo$wTgAPg3l7B>+J7kZJ+!N4e{RkJbNKaAf!=FZHh`>6JD)#tY9hIdo2gCKwCP3TAQWByk6q&!>l zk%*O;_yY=(`tX_A>B|TJfci>`2&%ZR7o|)@;i{qz`<0ZxGhPjf?^B785Q2hY7@`N} zLXuG*P*dLl?f>iwxmAn&`covfc?Q`}B7_+pD+VVQK8T2doHiLG$s}p|$D=Xv?96$k z>!r2yJiGk-JUe?VL|S#LT!w{1U*gr5qG}$4*d= zx*}ujMK8K} zqoJW=^mc|kK?O!o!9aS0IkaD6wm{RX6aW{EB!w~xUvg?%(2CJ8&ffR#VksP{@i@fY<3R~ zzP@QZK@;ocz7rE~5KYt0MHBTNd;WXhjz4*`wN5JRE%KW&vZS6nH-KJZ+;!&?K1U`N z9&4inyhNMOKCa`BmgvM|ijkP-p)aRqw?hi%9hJ`ntOQ7r$@;}OQezoX0$d6zL*Xx2 zc78b1W)PrhHrs~J?|EKMOC?whgphL@4;{H0l*Q-lT6g|ZESPC;w`tzC#?bk{(v;(58 zzF1|`qI+gr4!eZ;E-G?Ca>U*_liqk|1xEDxsFi^(cTM65w59n?R2)@-+aiags4zSr zm*OtOR6}Xm;y}wL=;gfU-2zT<$JGKJi05uI`)_d|+=kn<_JGtY%Kb&Xtib0Egak+l z8!T)q!fmYGwx^_tu--B_W_Jj%Wzu%nHaEqu7pYnw_TU$RL#kQ?4In-M-<27b1vD3v z{{C;L>!sf2tlc;2UN)5*V0sXY_bLMmXcqD(c&a#oJZ~Hv;QM9MXfuj%&ZSmI zi)D9sjuM4Z0f*Yi_C4LbW=4Po(ddS$YZN5d9TCM$0oMS!X8dc)1p9UsG3g9cb>!>` zU%eOV=WLtI)~h`+e)x`r@{0Hj(jGxC4&hB8{2#7ViD7rcvTO{(Zyq{6IGePh8y9H8=Z3rcH4~nWFIzg09W{K-o7=30 zu}iA9pE~^|VF14JtZCnxW6F|))?(31;TS*bP_tQ0d9b4@KpuuWF7%)rDN%YcLt<~2 z;R+>Y{SCh-Sr%K4g`9IK)~7dzgeX%Wnk%Ony)ak1%$7^#HzF;*o0>am)|AbNiHZ?r zA7PI=_#65exc+AT8ycwfJf0V-6aJ6`8tXQ1jx|%0)f8rkk!7ShejntxPUmz485X-9h{6qFjNf}N(YY*R8Wq&;DcQ)7b){B@v_F$mfEA0zev?C-58* zlKM9z>$au{^m}5FR*2_;wXBa_yGHeG8dzBl6;7-(x}J7Bs#w4;4g)VHBg;eB}f*p5%! zeZbgv>UT)@qG-*}3O8L((1Pffdub0={@E=suTZc6<=XB&9~^-1(C~Zdx|)uEc)b4h z{r#8h3s%5lar))jJu-tRZtwXRGo5ud2QfDPM*q%-7@MmX{!5FNU+oX`DbtbFm(kUwkYJn+9Ol;M z|3t_siOL@dVt?#}0)JYT%@>b>0kijhq9UlMG?$rInKYM|P^6+FkZ8D9li!*dz<}!v z&hcZa@sm^UnhyE?`MvM4c~>d(_+Y7i#qUz6!$lE=aHTyFFdXwp5D7!WT#kdcJ;J)W z?>Y0x#@dA03&atTkUBxpy@bRZ2whRNimjRwW`0_$PqU>sPFW|!ulU+BWSU6p?^?9} zSBVcnqk#g5k;g!w*}`Xl$S4^Kafux=VQ&UKJw2QQzX&~G)CUS2d6qt7X(k-!Im(_W zGY{mD0Cw>vvzHR?EDjp+F&d2y4DuW3enyg99sDo|7`8Y%CKdqg3;==dSs?ZIo7M`& zKosCkgM_2t2NDQ3#HNF;-33yaDHDwZV!;F|HJu;O_IKd|6co0nf#!C@&GJV-*wgt@ty zG413oLV*45Wyh`X#BA`@49K|s_$#OX1D)1=(j*4I74*|O&*c~1Y z4*AH)h0;L(dT8P~AOCUC``7u-@=bTAUd_x$S6Cs?WIND)uH8q_f; zpzV%2M)4RH&?0ar-vjD^-Mk4~{WN6c!5!jL{pqV0wOuWq9N1kuvb0kG;56dTe1!}f zRJ0&4ApZ?$@kxk79wfE#Yqu3de*=U;5B##Pzi=R^KfHgI?7KAQ9utemP6Pxw zcT}-37-g?Ca&R8X8d*jvfhxEh*&V?u$XS#JXNI*kfEXhDNw_Yk9SQ||A4bxA)O@r`ItgX}Pd%}Xkb^(~ zC^ftiB6+ejd!ie07lIKsBXfv_#O$9+;*mTCLeG#WSf_Ym@o)xZ=Rpu@Hq;6lV*2mj zjjF_)B~_z_$-QKf>8mVtmchGH#iWH;2%OWL_*|x(!<=NEv!T5WPK zT!K6Xyg=--X6Q<^<0|Wv^a_H8Q47e`l;*1C%COYp1}+GGRDrsaOWt?c(C)=IVlq!oTDjCtl z;EN|78(@QBxmDrL)hz8AgC$Q<%TVu8aV^1{avVfUE}&;h1r@s~2_7cHDIoy_3JvY5yj8o?bfCp70i-MEaJKo zI!aqq!c;hlDw*(Pin-L1%Ph*URgqOARrgbPFPm0OIE#1m61NKn5|f5fhFU=MLE*u4icf1YMeVQJpxT{%%%xOrW5K{ZrmnJ9%sJ-Ne@PsMMC zYff`6RMoE@zFT#}a^c*_+&0)?n@x$^IdL)ZaN!K)VG05WqZvpqq$K3zV(~J3ylS{B zgEPbD*DmvYlIOI3HDee@%e3QSB$FuXC%ZVOmE!@On7W@aM$7mbr2Z?@!?xDK)n?>Aj!+j&^GhV0K zcQiYkV60}W=Hv!AcQOZd6qkfpfI|MNdRsPDZdoos(UW=V3@rv1PSVOko6hrG(^czYyQ}76 zq;?=vIQ18Ov~#F~j#pgZT3<;#(<8K}vF5dkV46MW^dUEq$hqUAc|8Owd%cEvoM5M* zlVK>>bI7d=5}u`Z8w8Z)@0r1hU|TkXd8EI{>xr@Yk&&;qSR83tG}qdXGU`G&rhM1< z#kqsQ?ht!Y#A}6W4=@kP%qwM<3-QA_NE@YW;Gd}BP!+|mmJG67r)qoiepH%CR*Q%+ z$HnKSKFmmo+GVP3EX*qlvWZ%ExN9vQJu9O@qYx2Qq;pSwPwZ5 z^;z;Pcb7V^5~>#2sP9!*&Mlg{c@MMe)qp%f5(7YJ1=La)%4f-m_)<2kR@(2eVbi^6 zLkaRYIX=yi5}Hc2FfGh|FOoK{$vF&M6Me8Y#-`9z2k^+8OruOsN;;g|)^E#_ElMnI zo9%HjrtG~er&ea@4Ygn`n3J@01gnVgM14B1wu((q8kl*2sfMWJsR*bp*`v5=L#^zZ zVc0ozx9BU?skPR(YIZ(Ry0pp#%Im33sf%;|yxMPORL|)y zK_E(lR=Xd&!~X66=Y;#!Co%Ik#WZpsmAql7(Yx~Y47NZb*8lck@`;Ta8_kt(wAwFJr?MREuLX`q$>GyMAg<-+qPb*QDzgO~-Qz>C)t;Yah33_}U>n*K3RC-g67$WtRJm&(&uR$8G2S68jIAw@!D} z7PEK5-E05g``(x11I(8nq0$f2we@ikGjurH9QVYG?IHRd`4jj1tH+@uw!ly7$2au% zhr>JPV>aJ``seUc-;ZTedKgm6+{WW)^|$7$+Sjh@-om+WH9SxDcLwjiqVHO7a}GB| zXEB1MkMPt?FZWBG7g%e`T@FZ>5tzc{CmZtP0;8(|LI=S8lg6sk-HFo|;jEkq@u60aCPO| zU2B>p7e32xP-_DuNx5(TfdEE>?-b?=KQncc!?aYbD2#-N4q+{oMN{Be(_r}TV4FZg%qnrBro?pOQ=JZsptcHt&IWtM(yS+v z0da=0vp*su`s3?%q$Bc+`8SZ%C(;fr>{L}L+epM0XLk~$oH5cf<77`MJ``E{IB5)Z z;6FU~97U52qmyEgjQYDQ5(pVuU868(eb*_O{PIH$UKbZxSgeTC0X-0%Gh`duu~4Cj zjI*vXh46k7kYSwJsasB@7|9nF=ks#djHc6QG{?cQ8bdo$MZf|jeL-6{xF|Tg$tB$s zB3uYDB3gvZ!*%J#5X!8`#Uum9K(4(vj{eLl)weF?0|uZ``k9 zTDI`Q>eqK9xz-YYr#*MzvW(c=ReSB;i^80kGjDmI`bbX4;R)NclU^3f5EL| zXQ@^YUnp#l;lQ%k%XEI*#f56^hjuE4!etR&C*iruNkq;7a}xv2fs zhgDmSo3Fzjd%UNgtD9=6bl8~f^=Sjr!n|k=L-YC@_YaYlj0Sa91&UF*ey-sq*6#yi$ zWw-eqQ`?PUu~SJU1SZohF`{!Jt!(DLAxLnX2Vp;Ok^Z_k4gMLm$`5=Sbh9H+ofSC~ zteyX$<8=D$zatQtD`H{xGyKJ_C_vXVe4PD$UE*b@j-*v>nh^ij{z~;S76n=iXym(v2eAtW*It5Hg7_MQBPTu$-#0I ziKunj(|EW6q%*I2!EWT!qrN3Db&Xw0yvdJVlMD8zQj(9Rp3X~j0pAPGW*fq~kLkUE zX~XFm>C7DC_7IxMN*r#VxhSj7OXj)96zogb}puulVKA$_^Nb9r;NC zf-ioT*wmTN+1ODR%oN9ShTiToA7+l0Lux1YE9Hd65gzFNW9Yzb55X&!+Q!!cC0fTv zVo;gv@9*gi4$2PRNrYv3z#Tf*UsYRn2v52nU?i@&*>CiXI8lcrrjxPEi(0C(ye#!v z7sZ}_=O#QJ!q-P?6Ac386XVx6uximuQPfWBA}kyCJ1U7z(5_IH7Krf#ISzW!3GxL` zGxFMxA$5)LGVmmq>)C7Ws~K&ZcYzPNw>2d1WnUP#J zE5!-5-l!yuCBc+0_e?=Q?CCP2t=8V!4(Ry+51jo7^51(^sicm-ZM=g|8rjg(38# z!`8y)uZw=iriC#57cqSZ-vzLS?Ox(-Nm-TEd=1-U98#OxKuF&Km>TPjINTsJ8DhT zSDp{913QOszCWW;){OmZaH;5@@8|C!*8EUD{LO?-nS5keZGw)%ly9cb`Iv4I>?f2e zJ61bcN zlQexk+{vllCF*Ou_#O~0(IKCwV1HS8xa*ZNgs> zBJS}!p5w3?n((C6;MlEKKQ`ol-GVmqW1%r5f_NjT$9_(!S#Yu?9PB`NmqLxI5>UtM zetWbZf!s6lCOO88Jlr_!90yIh8e|_ePm)2t0i+)L|)yAO!H^Iz%sJ zGbpto2|K<1^|&$FJSZY6$0(-;IRSmQIrOjLUQL{&e(4T;jPvTs4vj(KUX*0l;%|#N zGi}&JYY%^T$~_tlqW~ry{$dlw6S(zAxh@p+-h-_-Qpv)vrZa4mwl}t2g`TIM`d7Rq z9`D^x551<9c?!FOAF_Zzu){;muj7SniiL-}my8fK=2x%tnH7{85$?b78z492&-Hzb@iJn-ko>A7f_cE?WWaiA zQ$~0(U{K%#>QK~uXfYJ|b#ewsH>d!lmO0K>tlBlzdHMtI&RcKU>D^Vx_6|_X9eCoY zszkoU#9{!;as)}aisB!}fcrbpY16Gq4(==!@+oGzRn3PQHEs7hTdbr;kAhxoss|ym zpaUiKnNu;!75C#7h0`1h>OoIeaXQbimIdFJcKk)fRptL~B1lGy4t3AM?7ERFxls6- z<>ppr0LneNDKB@@f}Z)n41=7l?pjJFmT5WI7Xq(hve9|%(nUEBUFXLcaODhr0`7UK zWQ7w1(sBFtPB#U$&|s7yr=80HxhjP8pn$bbM3N1drioVP5EtSal08$JErkq0;gM@U z^=Ea3WEe+SOjskkJ+nTAO8F>ke zF}$%bydR*&t&O*teoqfi_;!U^HS1_lgP(g3DqOQ4#Ov<*fN@ZcqZ)8<(e9L0e}2vE zto6ZorJk!(58f(z5GtD%2Kzy93H%afxMu5vGT$Q#rQLxx$m8|{Ds2^CVh<)SaP9Zu z$Nc=!cZp(OdZJmQI*u47h09ViN^IELwm^%G#)T2ZT!1&1wo9UI4uLZJMVfgF8&JU= zH<_0xEm!NCKPE{O{1x5XW80fqj5`$7!0Kt!0B`#(?G;qO+zNyCyN0b&d$08h<;C)| z87aTKL4G2lvc@sk#`_K#NfNRiKMbTwHMQ?aN^Y4sq z?&M>L1&4dY-9LiVzcOz1R|px8YvAlMA~*vf97pa}y5NmZY_7bfof_m59z_hD17(;& zCbEUd=zfopqB3DJQyD?y>EB1~5M5J{QK$!n&;*;ouomNyl#euuA+YO17V4BnhS)^= z^&}e>wci($m@plwAfVyxGusL{1mX$lWqAE$B}Eg%5^|MZ-J;N1;G+*GHCAWU@dJDC z2KL=ntFvoR|6y<4pb%4WoWOaxP+-^SA$t@q=l9}ojzu&XWs&wJaC;Fg9ZM1^6$6)g-r z3|xbZM^PggDbn1Qhygw#hMTN&*oa^lnNv23#p(vP*}9^&y31(f8$ACL33!!)AF;*HpyJ+`4)^e~W(!YYIKR-q05 zQbv6YOuloa2+sR6!Ar}s<8F9$ie|S_X7~C+8dmQi)W&RWQZrSmDwUC z4GQ0oJ!7ADrFn#vDmhrH@Giu`qF;kDkk7mpwfWVQxLTLK^=Z*GAhxaqFlK^NML3Vt zLAYxePb_NvE7QXqPq)!_TdX}HTZok>`SN;QAuHPvzw6%yGNypGC_4^cw}00X5Pmno z3M&OyKzOa<8ByBeY@F>a!VVeFpUcA`^UoO_q?52y)Q;v#-GFV}Ap?}S+2$$DBX|Fb z7$pU@KpWe5EQu;#2j`0^dAdY?xMjtP?)c1f>2YGegn;*>I|5V|fe>Q%D-?qyLGv{3twvlsr@ysNvGH!3bX_;=k<=Wfx07P)JP z;`RVS6Qm9!JCvfN;mT%ZcwlQZi~;%lV+M!l@;Q<{&Y_nl-B9a?H6VV$w(BX;#Fw@4 zg#i#hN>Zc}OZwzRY4Emlq>Xk%`4^Gm$4MYpl+ye>hB*TszkB~~?MwMnAzPjwLH@B` z6WQ2Zy0E~*7`!tvjdv|YNm93Q8!!)s7;lwG{>-PVvaVm6%My}xhE(Pt0Us6{=Z$-P zh~*tP)93@JC_WQZ5cHI`8R0?yYVcE3_ghX8E(XfFIaV?k?hSEXY{fjs;t|VhJyPO1 zEjO6nOE;-JHumFYAc|ag{xjQIv)vwY2Abe8snN_m#i{Gf4-WA&<`@x2br!Bsze4E6 zXAT7V=-f>oP|r%w4FmF6(JS=H8!&p`10Hwl+B_WDR9BzA-?p%lG%ElOQz(NRx_@pS zJAE4FAx~Evu0_$AW zz@uI`DOv&PDm-ZTEv6v5Z=*7fBiquv_)-+|;7P72?MbFlVCYpTuYVL$+>b%qEhWTVprD zDnxp)h}ml5M}0`;?8(awu|oGNQZnXSohU>f(m7N&E_r-Xw31Uvg82aSZN!jCGpaaD zV^~xgh6Z|4{VDToM%93T;&TZb!sQP{o|F1M0Va|L0imByyG12I4~>g<0a`}cr38DS7UbUfL=B8e?PnzEe3Y=-{Yo2&mt!OosRLTEEtDHwP5E5}ywy?TRtfMf#2ptj#l4%-)x$Tg!;ueuOa&Ig-wNz$l+hn5xGyLNX)UlTCU+Cr#UD95!|0QJ_*zTx-l)16A3@-eoYv_kF>I*22#;8qF~_k<*=B@w4Wg6 z;^%gG>GpbL2rUGC#_!&U<4V`5n|!`rrH{jaUqHuXDEyj`b}(z)Uv=z*kO z;RTQf;rqp=+qS;>Tag{juUcI-sG@0Lgad`wfHHZ(WLdndN+NYxnS=2pn$~I|yG|5g zHotXl1^JKWZYB20@5^0Vbq*DN+`l7xCB_{ZHBt*@o*}eG&o}WDru2f{NFY>cDX&q! zJ0k84q_X0aQB6$3bPQGDRua!3-( zlA`9oSr4fwh4o-$^@k&~PjbGgB-VkDR zm+zYj`RDi>aOJjn$cPTL=R1hVdb_iDzn3fg?(YJe4Hyrf{cQD|i|bZEMPOTqXTOz- zI`1L%Fk<{WEya2@fF0!j(bmaV>VzE?owoUYr1`F=?u z80%;5Hf@>Z(X|!~^k-^FQlzap>qFHB;ePBAPEN!Omig4S96XnZYCX(7E!+OKG8F&&r2^hd&CN)MR7@f=We2RH7xrQ z$NklWQ!4hFu0--`z^r6&=Y6%KrTB2Op}z2=lJyf?pBS2B6N`WhQ#^;rhI2i=_l5_J z7{+%z#&bn2^R1*rJKD?wRMnPkyN^QwaMxE5bG1)+GY|94iV{`sOJJ-ke{?>jiV_zE zvp|fMnzIm(IGcjcat>W}KIDjd6k$|VB&=wK3310Y2dwYx z%^qwV82Pa!2skKsx7v$BRJ(z6O2T}0DUnV}|E*XmEy|OCRG)n>?Qweoxq?^|ny(j3 z3r&O6Tij%hc%6@w>Ew^lS58!J(+rOdlBA|LMWlXW$J;B9)Fxt za;Zo59Jh#zD*AAHn*Ui~o1x`5%M42{9JZsa`9U`Scw9f7LMGJPrqsti3_=stSe@PR zSc7N7MV@o4{vKjGJcoJq7Pi(}Ics8gww5Zy4u~aD^=fE2%GUz)#%XDuLKi&A$WAX@ z>I8MXtYA94k4#NXmYtBKt9eLvb+8OLZ!3WNc(To7#W>t-+%no+bU@s&!KS=$c4d$B z5OV`HFnlFkUxw}2VUXQ<2jGc-Go?jV)md{`ToYMZaAs zs_;$F%{1JB#H)1-sOoN`;AM@t;t3CJGYldDvHQS{yWR+G>Zw_tZ%umS(}X?H#;{IV z$fddtu+Nk3)DBHp*)s-7X}$pY_lOsMfDqhNp!ssJ*_0YzE%Dhdr?e6vHfLErrq+Uf zE!=Wh@TuP7W*VuSndJx@8}2!a&K z$giMS$KpcAha4jGr_x31I{z4}3Cneq-;DUL5*s)Cmy!_`I!LT+;IG;|#X$YL0Un!j z*VL(XCSYnS!C|kqtX2W1_Glblz|` z>Qvo|yzqCc$nEx#5MYB17@GgdzfL#cgC~7Glr1%_3+T7npxJO~Qdh16FSXq8vi=PL zMCj0qyZws&?ix(|>#dl?w5GA<_0Fd-c;Z|Kekhw$+1z_7C^^HGx|M1)gqN*JU)45j zp_brBK}cf#oVFMuqFt(CXm0e5bFPu(Fwav1Br!Azt^^`j{b_-fU;`zTu)SeQS_$e%^fo$s_f!L zBkU+4B#0haLl*fGGmff0zhd=4Lq#kF1(C<+qvaM=Hp8CvSvXZPBt%TVyS|`hN4NoA z37wX5pvzHDbFe3=q&nzs{XXwckHU+whl|5MpHM_0D3X+LJgwr!_k+qP}nwko!@gNj{Y#kOr#l8RGFzMOOK>8`$~ zyKjGc|M849#$NAl&Ua$ZvF2LqsgxMKr)s=E&B8PW#H?fH+Rrc91i#W~*+hXf_g{;< z^?Oa9wP?X2)I1`x!z=4RL&=VIY$xN z3Hj}iq8fwVLRA-)Qj>yUo?KW;rneoje9GXAY5!XKqB zf_&nQ^gGG$twcY~`dnch3e0F9e36C1l1an}Ihq=cK6%OmbS22-<-WqjNe-S%QU4@H zbS1HRW3a7UFU9#LEc?AIYS+;jv*zQG-TEMOtSt>U<}n8O^uol3)z1z0Ykpg=i_-6@ zN87c8qx`AzmXEITr(x9~cO1?id)CaEKlUgl624eXK`58D>9hD31P=AhluakrUN*I& zZ7nMS5mE6S6GLV z?ku;YwAV(006XR478QOTMCV?)Jf7l(S^^SiTPr;aCbF~HKL}RkH}(kNW!=*j3tbi@kD9X zE4%ygKL>$4)GgsS$U|!>#GWew%J>4#&1ZmnEX=WH93d4r{<-M(>SS8tBrcu3s;c_} z)Ikj)QX{*hc$i2i+JRnQT)ycCDmZO4G;`qC5reb4I(*3-zaj>X&NI&$Z^hP>SOo}H zq_Ts7t0fhAEI}vZ!B5ru#2!Wr{e?$tjo!wNeY33oX07AnQ50jHV*$3VFb3Ziq*2vM z0l}YCWQqF5sR88Z*n_s|$Zu*#FxVNw@({HNdGP@&?YD%KA6vjrB&qL2p;Y0H*BQq6 z2C~}sRulzCwxf;a!$i}exLo^FUL_d;aUpJS!QsJ@^{*KSKOJNBGg)4he$qPp$bjdW zyWQk%f-iAg3*K$=zc?)Dm<|RpNE4Az$$MI{NRIhjqYUPY<^glmuTMXhg|<5n(_+_` z_?!YYAE{@!SiN4Y&3ormggW+Bb16FFv)69@+i%}BCg@z?p4w7#DtF)WiM5F=&>M|NEGII*gpH7(rzumxsa zLlW{D*a?Xe%Y zXFhiIjD-lI)|drdlUunUh12F&ouydPu4TOC1Ytc{2Ns1g!>%xF{1;XqHC_A;pPqyD z@;3YP@s!{&+;0%fq1>lrkp#-_@*i3%)RD@8vD9rBjZExBkc<@}82IIv2Q*t=3o37} zBRC#4Y9buVsir8g?-e-odF#v%%&MMMYJO^M7S3crwv zl{Z4-abaaOR}I@##^qFW4zWfj`^F7nVoc_7kxAG6~y~L}Uer zz8z-rbcaKpoSxx(7!tu_UdWbvh^d>HjIuQFLq~}jyU39wo8hlNyZ=76(z z+HRx5Lsp}STMz6m@8hcOcqWc)I|&;*gBeiB^m*@`*#0#`LS}^HX05~zs2QPQ7oIEc zbg_0Di){9hUmU8D-lRY>a=(v-Bzld|c zZG|mJ&`FLQ7Q}Pxcb+eSQiqe}u@gq5nQzgvJqaDLfCthN#QRTEbTcdgb-6kScrLoN zmAi|TY3Di<==e+GPC)Q?P*|Nx3Qm#*A;oN%5e-oi0&&?!jV$?qJ5jY-#wgpIn&-Vg zUb9uIe!VVD^<^g&aJi z-XsmZQj{>9%@L&bg?Efv@cu~X;!DM@M)p@&0vqgD?_Ska_2I6Iz|Dd=HjFuUnw9K< z`nIk`2k;uyb@wTb7edHm4X^-=pHP)ancdD!{GWi=I(U9mL!H9cFt5$2E{+u}OG#d= zRriqqetssIU)v~s$++^Rhrs=Q)DLu05qj-Q1>&)cJZcqK(;!)i8J!c!-Sg~NDfby8 zo*RzWn`gxPG1vwT>$^$>@ieLdq=2#JYGGW?_?L?>IJ}lz;KvEEDwu%T(a-X}R8y7f z8hbuXo1H#acXpUAW~g-5?-G4|m|Gg7zz^>jnzq+7!csA!i-MRVS;6cy4P>7qIz$_A z9~RCcMf6IQ3%}D@Pb$;&EWl(#7g&R5Xg`fY7hv+HZMEJfNZ`!m_CkbEUYH6~NtV@! zhZK`@l#YJ&*A3D3+_dc;F>Y6Pg$JD!cG-l<1a=^E>>5N_1EtDMiMAa?34+XV)V(pA z&BPj8*gOQ+32j3g_2tTOTIA5+0p^;TPws`a{PYmP%MIO1EcLaLyJCmm)8K*8HdKs^ z&TR*MZ`9a@S#2oXAmFAVaS^PxSGdXAhnUj-4GF+j1>3SSuqXIX`pGk1IHf@Kk?WHFDTvlL&(GG`;~o1> z$SCgn#5a8Rta9GyAyW*B4agv!zb6ctd-W+d?;KYA%o;9Z4##LdRXIGfO%QF}ROnm8 z?Y7AW|E;P;zfR1$(dfhk{K8%xu|?i|VHm-Rh&wx`JO9enAu@b2?)@#!&3q6`kUdHQCV+po?zE>Y@qX0|eQ3M#V!Luic-hH)4GExIr)G&IlfU<-f>&ylW*?Pef#Q*Mtk!1S-ZaL}R3& ztD?%k?k3=}J(mF!U#fx#WaZ^?L>DQm_;h7%tSu(fkUY6<*1C~vus*qUk1d0?QyWG< z2g^^Krfa4lkVX{=;$}ut*z4F=?dIsXf%|8UsA@9_x)>zIro0)r1S67N zTgB5Yzhju)WuTRO1hTEXMnh`uI&yquQitHpN(%kW>Hvm_$FI^v?Nr*$0NOG7rnvko zQaP+5qGd*W96#{Zok5m|6kcRw(yzwY=p4!IO_+YowWoL2QBNxZ=YF1EURv)r8p%?P zkP0WMpc@tjoNnY?3SUf4Uvr~b$A6*$56e%V1OB|23aMmZ# z_U#*P*@6Lu#k|trtsupM#OoIYl-O0P zY?*!lm3$gculXvv7d4$NbSbvU7ds>{R3E)Y;zDR`Jx1~K6L`^alm5Kdw>${aLHT~x zgPTo(j5x|olQERkY5Jaz?TTeYnu<73k&|`b_U}MkCI!_O8flhnMskL%w_9{y#97TL zrohvX+Yz@0Ny<`*Ie6#&39e7>TMl`3bW2E~lf|!Bu?G<+d;AR`$mYnEpY2{ZkqYX! zbf2dt0z07`bXjo^vzjz!b)g;_Zyav&@$L9eb;%?xtH|r@;3}EyUj0bto=z1L$C!)i zq*2m?UbskF2IVmG0#Q5W7KbJpO@)C9fxXaPY)!X)KsbOJB(~wpFt3j z?a?xNoEVC_QAPxvpqH{xgf&@s_BOnDDK3K5u)WMc)i}m!)`|`=n)=L4%x=yw1G{el zxdFteqkoA}G0k}lqJ??bzqYv`0j#Q(!JL-I9Q5>TH$=MX8szPY$leLH*G#kYPEmT{ zz*7xQ08*@AzpBuWLm^=uqt$3@h478wVp}{Ig3SE!*+f`w3Ikv|a0gPtrWkSzWi2 zs-$ecyYVn%KhDg(&q3_kW)2LO`*U3-4BqUVnFDoaU2twyeqK_DvhP$7Ml)n-;aKLH z+4M}_lA_zKK!&NdWe$?Ogf%iiTN%1|%ZWuB{bT9?y60)j9m*?%CHHlr!=6})eE2m3MTvh3>WT*Hz}V2r!)71NGuPIKo>+*ht6lj+hZRjVx z_?#-LDOtayJB9pXb*^REvz>?az)((mOP-19Fh84&A|&mj0|c)*?E*i*Lv+&x-|37$ zJp%cV?oY2`K#ts%gdc zl&eA32CNo{+VpnD8fl}es3**NjUPW|NNKCht;gw*z&{NfXsKAF2G>eYZbChTF7U_l zoLnkAtmAt7p@EgDIjl1rKFezdvy{K#FuYf{@5GJK`=@GtReNN~ak*yyH4W!z4+qtQ zE5hgqgJRpy*Jg+EzRfFBj`qS0e?(`@eNGEF>m^ zATIHGYz{WFy=H0$*m76lywMBYw?r4y6|5;HPtzw3!U}parC#J8RtelL zfcdjGchhWG%B$5Md-vkXiNpG~p$jeh0eHsmtk|ClV>b#TYR*xII}Y=HhvK#QbV&{W z7>}Xocy05tx11DyIcIx6>pT23C`XbzUwSI)7YM=}KhZ?^@(bhy zBQ%EOx_;%k@~MS4q;POOpFz>sLRgaivd9ft@zpLzSF~ z@M(;0UmD2L)Wa)HmO)TTCft=gv8%46w%r&NWBfVG(0brXE;GZ1stH%maI?oN!AaO% zFahd-9bJg*!F`RC;VO?bBLI}|^jHmZfww2iV8T-eM(hEUX>H@ zB@9G_Z^zi-8(O(`T-&jHE1e65ZVr%BOLG$ZM`3KQrd43@Lx5bdVFsz@!DoiYJt|C! z9`_@Rr@<#Igg2O9d@t4~-zGw5Ja{x8w#0@f@nwHZ4<(d!y;T>fV}nWaxh^m$4r%w3 zr(Z6|>&(nHD4%1yOVT^MBAF6=Jj$=H_Hj)c7_qtKIi3O$7$;}B(PQpcBZPNL8|^!B zP{S(+BhUurt6%^Dy?-3xCK8wSgihRY0^9bbnTg0LmCpg?Ng?5L&{P1mQa3VwWU1S0 z>>lIG&VUzJ-sipN)Yk9XBW`wU68Zd#M}cGbhXvS9HmoPzB(;YioEH>wd?yy|%w}q@ z9J+5Tl=7i8e*9A*AfFnx^f;Z}1%N&!xbktp$4`Iu-G6{r^=abi*)WAkR6uL$11%C= z4OK}bi`mf@E>9dor4ZyaBD>CFb5w>cCuz*x&o3@dzGrW=l!@&ra}SKHxMJPAwIHRE z@TG}*5mgpIh-tq9n znoOP!#CX93OW-JV>C}obkkDn0u9s0%I-~ltvu^H!ID7#dHWub%4A#f(vqDEGGX+sbRNxZ9u$KI3hf0=sUC64LkCfa>of+0?ir3NY+mkI+Ju5ZOrn)9anLHB!il7p%b_b9Q z1us6Y*Dpsu_}E)N=8nF|B_&vygx;{FdcbFYIPs>8%x9#JEga4mx#!X?h8sD&!tlyBGoDa>Lx1#q zZw8Uw($Eo+=(d88X)}iIPB*4rzdBUtE0qm`ch^kUmdW=v^oHeO6 zPn}uB$)_L|R-tYF{H_-{DJEsSC_447oFxvHlSno%NudZ2tAy5N;ad+E=`eJ zNaY0qJy`N~nb42QYn@&vP>7t^RuxmHt2K(_^YD?K4(i6~kXth>Ry#rKg#xir)dMIb zO_Q2ORu~JEx|g4KoL0(3T>!CV4slP&2!i=6;r@0-7_7k_;9(xVaLiZ0n(jtlyLC^} ze#PJD7??W_DZAsz_?1I~N?`C#_iul3L%xwi?=5rTpY{VwaDBC2S25RKFnC!oK)Y$6 zNFNjh#YyNn;)rrUf;bLYr)I3&rEB}1lm3m^{aZpA{mC*~y*8xqxpWzoUv{Q=3=>>N zbc>98UNru2-2)_IS5S>w{so0>u(ZgFqNzW!UlxHz?m>KjF796&na?dt{&wCypW`Rnuv>kugE&T;8S*_7pC3r=J2YTt-l=Xm z@3!%_zQJn#T+%Ff#X3Px`#!;pN!-?srpE@s-$Y~!e8PIcc`^5kHliZGB0vpyG}JBv zR~@ATGq4X`#;97gq@u>8?0}ShX0Mz3TBNZ9WceP*`aE#74WaUpYbVwkQfu83(j&s8 zOpFy^!zAxHA7*pAP%xx`j}H(~3iht6Gfp$MmI^m%M~r>}D_#1y_49tTg3z%@O|=Lk zdd`*Ii})M{9aYjJdYqL3q)o;AJ82nMDsF^Q=T3-ARN&%GQZ1OUBSumPc*H=p7>}LN zR?gKOWD{_TsXeNt(TtF{aaN@L50tYRWLxc|UIJ?ZGvalm=d!@6C4tATcc?-XenhJ< z23V=ISb0$+i`-!BO|Z%}w{iM8`p$B~dGVz{#0E(L$bNK#coL#4%(5Q*<79&(%_Wf# zEJ>rnji{?lvEY*nU^}m`i!G{v{BE=Er4XqXf%~F3=rV?O$zs=N(o-Rh(P8RAz>|Yk z=6B&JT7rEcAr8BMYeA1b-k;&c>;)>+WN(IDPY9%-NOTb^15?2zH?y~GSESZDMYi^V zuPt~&59yv=O%;8-?#)xxDgN>0P1*4QN$pmixiFMyF%C|^nxJS8N zu#2hpk*6q5QQf(omc5*igXmPwx*`>KR`sc?E`aS@1&XvDz8_oDZ|VpJWhq*yCeGSh z)vSjsE9j0YOeJ#yeY_?Qk$4YN-@OZDCS|oLZ>-ij&eUljeWY;C?O`YwUZfPGUea6P z^lTx)cXV0saw6dD5(q~@y_#|kJGl8%xwfu02Qo;2VF?Z@qHNum$l5uK>W@*TrgMc@ z@0PD)GzdT~4Mn zE_tH+7m7|tkWr+3nUK)&eEhfIL_vw4cT*NWW%VI+xkXW6R%{3zag#~i^AYs=faXm0 zKd*h~m>SXK=<@l+^dwG#@XeZVSzg9m>PU=ZqU;xB7YiHpS&kxuUN=l&QNHcNA+|)g-e4;G13eY z)jUK5F%IpT;>8lAuMHg~ZVwQs6Dmjo;4Z%Zm$BF2;Y-)hBlIqL{wfKuF{WmI;{Y_l z4**~V(6wt${2*-HsnK61S&4sa*^?Kw6cD01T`1tr`dC`0B7VDc34rv3j@klgz%Jvb zO3NWqhN*+`JU}+`hE#xM;lok=RTG*6V;Stuko;!LEL|e_BfVFg`lggdw`21as3 ze13(~QnL@h6H9~gi!7gwPxqL#)chZlCHMqeCkl(8%hqvwx96#ET&Jy>f4J;i;D3 zh#nzfET%2+R)s}rZLHdP{#>wGw`~r)3HnX}7o7N&R_6O-I6rOmwTo2*hN4}K%ovhi zrOqy|Qe}fU3VmfrYuXSuTLoFE(}iC<9&59Jn&vCo4F}BzBbM$)Nf->*@}n`XKsB`M z-V8lwUVvS`A8tWb3P`IN#g9?h`dz_0M3P&{av?@=R`Gg67^Yu?VwAhp1Ut8!N?r6W z?jl(J>)j{AHKxpqd&Lq-%5SjyTUx%7#>~hlixfT-T(3>hP+6{#hIcVZ>5kpC(rF7> zuQ&z)1PKn<0J3ISpTgLYY`jGlY!=GcfF1Ce>zpLV=1a!du%jC}(US5+Td%7Fx_iSO z6XI70So@aDp~w}x3#(S;mGMFc49KJ;t0{%Fqcg%Ew}4XL*>7dJ8cXY^J7DwETM}HW>>44a@VIHkHr0jKlrU9PNZZ;L5~&K_Feri~ycyQYi!0GQ zsJ|v%?e1OeBtN}%!su^l1Q4)zkfH|AP3z(bP~`eD2+EYM7KzEO*4v1kmbv&~B5&=J z1C*o^WffrIdxwLShlN(M8R_b9W$On8V7|d))J8e?-=s4$6)@px*U0N(|zig+vXOpZHeWz4c8p z8hF$b*%4mv?WMon!&9Qd>Z^#OaCQXy zmkdmIN)iZWUh=%VFYAbt#XCQ&#Q zRazH~n{rOt7s0ArqLG;*7aYPR+;rO3E+d3phPYdNjRsDym{qU0Efoig`)rm%&{LtK z&G0WhX$O*Lk7|XN6ME$$rOr1Vxb-DoE`VXfQ-?I_pW9M=S5vq{kkp8i2IumyQ}YN0 zso?&^SQZu@vs4?({R@hy@3@}hw96o7rEWp5jl<`!&V77MW={kwZ+RJ>QFuD(JRz`B z0#2|9Us2}fODv4dn7L45q4>Xun}%Ri!&ExJ4tSI{%_>kVl3k2bJ@5{lxUxf(XlcC5 zt5AZffy`6GgfJ5WROw2Zz3TmU(R7-4T4M2`>on@$3=EBPdMZ$+(NotQ;fj`|T2a%T zKVvs%&@~jgw@Y)a2)jXDJCI7DtweZ13w4t$6&9Wwsfnn4E@WFNIh72Pvom^zKeH9| zNRc_WJ)0oV9)vfW6BwL>*jfmRHbOVyex)!;=4}Y3O~~RF4gg}(f1H=Xp_DeY!I@v& zG|{h*2jS|juqI)3vmr@^lFS>zSb7}8GlWnIF2}p~i6!$wYDK_o904u-Zb`ESoYI8@ zFvVIR+|VCoT&H?18+2@vPVO{XsgY069haeb5DK7`BO!e^+zCQS$yZCRm&{nQA)tD*MA|ByzS^VCP%; zC~u@ieJLJx4rP^B{K)MM+a`Egq9EkeiB9vDy?zga1A82VY@nyLQA(v(aUUQ!SfYC>UJ5A?GnBIIFeWILpb3)O>$;K=tycn|(BC3o^}5irsHY{R-3?dz+6 zWG(8oE%+LoRfS~)H69S<7E5RWc27~Qr*Xf?tKizT3Ya%&-&p|yWP+b`3A30@J3l70 zzZGzhyrKOvDWJk(LaU(}g=YTDu5*xEXr%FoGH+K{Dr$;j7ekof-f_-Wx)m6I_m2qQrKchNDTO zeWN*;$?Z+wT#e)iGw=MgTRnWPO@#^)1+4;gGX=-g4yXvpZfrSe5g|sU% zt{T@)veVSrju3vu_kVT(l5R(sxTU}KiXsuXi#Pqsl11+25=4XyFpsjXm?u^b2O$9` zigxpZnZ!hMxFgkJo7OnaL50j~5;NHe8uHi;VSA`qN$y5+kWwS5pyp6sV`3E<4PIE? z8j>4mezL{$ru><2+v8o6uef=0;$qQyrm9v#|)3}T(KfLz}Yf}rJi z5ijSwM4ZrGz#lGCtuEPB&2`Kl;*e$GXYeoHX5=!X=E4IyXMZIk2?4Ks`D}5gxLI-f zUTk=y$GkB~CMn#+Qmr%Yq+sTfn=$Up4TGzdE&OZ5eI+lPRI8X2_nTYC8?@P?!?V z>4^bDWzof`K3syvLXd%`{aSt^_B_l^SK?z`a@{R9VwBCH3_f9bTj*0$n_2CCn3Xk(aDo3`#GPMTigzt;QJMWHk!Y&13YgKQq!-+2U;4 zVn$shlkU0%?20opsB^5dN^r+BzT;Z*QyHN>;uzh*uDB+_iykw>6g_V(c=5W$idqjh zv^d#99vju;w^`*(35O9@Vi`vTH!m}|Pzq#fGLTrLArGW;RRO*jl~h|awWw*Y+31yt z84J2M$=M;Llx?0(Kv@#Sr`oqO9x!Y}fsT2bo0N=kReNQOst;b<+ zA#@#-t*p53B*wNwmbeK`Nt@zniaV!sZg3_T;c+DGIW(Qi7rb^{T z#ZndLR}$}ub)4;}2E0DO^@EgSXm}bW%|iXfRJ?Np{bUB_ck@i`Y@wu|>?}WnWx-(S zFD3AJB&<1q(n-O1}Mm&E?sFa#`WP;nJ5M;Y6w_dTr8%d;Q#RU~b zlxzP%_GFUE@VsXj`7LdrDPdeqxeKfkM4beHA)uih}MF&j{@z-tmf zZ)Gf4?PRw>c23~&EFcd*#;z%Xd~=JIxR53-%k*&(6KX9SK+BsRw4>&d?Ny*+%^2Uz z7WG*VK`l9O{0>8MPW7f*t73z2VcbH@XYGEQ$Gj`CGDf`l~fHeDR$ zosk{cE~!|#)C2ZrFwddhehnVa;B0#TJRLt+cp6KDzRjf01Lw<&|4jrT1SX+IpSUsBKG_*$PosHi7@;!aYLtY_1 z=j^1KKIEaaQ?v>4wVinqJC%JU@nv%RpQvn-(xSzbGqUu3-4n71#oS}Zpwanp37%WJ@FTKns~B#7&7G*b1!2Fhqqg|grxBVc=l?F>%2!`M;E${ zD0rUHJdcvF((t)rhYT!9Nu^M!4@-rYp1A#>d95}TKAl3$e?Vu=qPlI4)=4&X%qaBx5(BIkpI_62hYb`Q+2+ zymrIDU=8#!$kq!<44oa~+a}CWEq$1yq0TCLed*yz8RhSIU`-lWF3mnq>*h@xhv@F` zLt<$^1n%_j7%5KN0CS%zQFfROIGV>zR`dSJ;cIf1UVq`OnaGS~*6d*DL5M=+G-G07 zz0W={?`;P^Bm=mS^AItuq~f~{`0@=&GqrWRJs4%`qNVNAv-?ee4Zq_VH$CWP(f(Je zaV}c0vVjy2D1+Ty9lu0b>*P>+(sF)PGbXPidd>_Cv|E8uMq)LIsiWwFlAK|iPC()| zjl(j0p^_SlB*ib0mL|1qcI?Fq{UjY4aCf1$11C1{Rx5wWGn{-NJLeW-l(y&CjBc#d zLm1$zFT-e2)@~K6n^ui}i%Ad)DK?;jWK)eubka&;UPL&Qlv9+Dz*>Vw{>8>maJIH$ z0^_kZwE)>!;2!usIXu0{_2LZw`#8ZnLAz&%HG3FulJVE$)x+CYS_+~YG=KNz_b|j- zvdy}Zdn=;&RJ~>R5UD-dz{|mq<7KX^Vrms-dl@1GW@4%XTBf z3b5mnDf6U9m5W4N)AJxaNYaM}=w;^9M+zNbq#HVsK&(}o>r^(T8yJlGxqmxTL9|mn~Zdy*jeQg?1Y^Xz;pxU#_) zKp)R10p#|vE%7G3l{S72-iu5b)3als_vi!%O!9FfQNr8GU$vF(E|F zlzzVFt(*X*`Ryq^bXuwL0DVVglC=m7GsU*M*-q`1#d z%QP(1HJ_4(T~3b{DvC)hOs7j039w5DmiGno->13w?SY!|`a4B#Led?F+igG^evG#$ zf4q0|VuQke7E(=V3W|oph{j_AR=sg~sOj33JbFD33+vGGGl_e#Wu-3+)+de}4~cg) z*i36j^=K{XkphexQ3DW=)r?T^C0lT70m3WbrXPD7bXf~BcidYWX8iGT^9R=BVc(U+ z4DLhd++-H5UDcK5xd2P+qcfq#1*Gt9 z{W|svtMFlK8BZntp1oK0BCtVOzMnRU9EjPiXae!88>~K+PSwmJ@~emjiAt7l55L5zUwD-MSeH`R9LZ9gSIHJBLTq%!qkDu*u5~Q z_2B?7HA@q2iOjwyn?-R{KNhRwFhfZcmqjc*h4S)om$qiB7E^yVhZgW=u;Wj*hSV88 zviKf|>iqfl_H@AXN@t@do!(~TgNOF1p zgLDtRx9eH~lKwM1kxwuCQE3{F5~Ag2zX}Gn@}boCs}ieYcVVtP`(I}{5p5l% z(|LxIW-zYu-suI?c3_1}!}@rukgf=*KhH5CU)iMhh#SQ0kIH>IE~?jpZdfC zj~`1`l!S9ra#hJs*M+3{&j!nw6fkq<-iCRkJUS^Iz!^@qU`@ zlr8YNAjtuIx`sV1?ekD&$cPU!=U5N?>r=&K2(Q){*EUhGwZUK1jvw&Um>P@AhIj&O zL&#IduDyga>K^_5F`LW6v9y%uJ&-H7Y4{&m$h?}A!DAQGvGG}?-!`?gRB$Vi?jQ}t+!k2|LN*0{V%@KkRNUoN~R{3 z&Mv<>_e%ZCk8u9;NB@7u(|@>D|1{@=}p|J}*|#b|gh=2?IrdcRrc z!>O9!!?EVW?G;E_L|XQr?!xpQwl=DX8&)7ph@n4VeZvvGESJ!w5>M4ckiahDqq^d< zH1USXPfVHtbiNN}>Hv?ljO^?ur_!Y@G%+7wa2NKJhmjmq1D3KGJ0(pgzqQ1|cOTyc zoT5M~h;QGJjY4{Hn*0^Pi=D3dL?IHnkqIo0q*o{jO+s>u&Ljf`DUoz0Q-~2EmWnMH zJOCO7J8-B5ZHWOR_AKU_1s@M*v55+R5;YERBmjOmttS^-y`&l_v6olTCnGtgPe(0i zfk)`Ch{P8QdXbck#SB#nI0xot*O|u|7&)hn(lz*7wE!xm`pPO)J^i1) zxk_Ch9(g?TdKBu?sg;Eo56F5S|MG+9B5!wzcH$KZiop|I0=?|<4n|B(Bzv}24_(H> zS1vFf#;<~}opB4pYU5fnVawj-%C?jP#VC1*!@Lcsr*q0yLk>~7K<@y;v zL2Pp)|3G}&EZGY{v}yr8hw}jb(rzoVD-y{O+Cs5r2jw+NH}m8D=lA|Pk23n?dN`gw zzop=hUDNu`7>Cq0@4&sCYs1IKxMWqlL!LfrWc{W|GqQM33}Q#w!vr3w*HTe&R{hol zztb0UTM*bf7bmuSD=D}ita~ewTq)QaY4VeSUL8|w3XJn2U!{`esNLw+}nhxyZX7zhX$2ongA0SRxyasv1-4X6T8c77cH9{lgt z^1lbC`T+dqNdMmr+uwm#_#T*l0RPhe4)}K`@!x@F{~q|qJn=hpyKDc?TK%Qd+ckfy z<-bBHfPROT{d?$NhW5XM0}xjK1pSBpmR^3K|H=0LFEHT;^!)!0R#ud;bTOq@x3p7I zp?7eycX0l_DDSD|y;;^1zyi)Ie-`O4{k^6CH3uaBB?o|y0rqcN`j0vGcj%Ss(Vwut zG(qIwC;q=e&;Jk5kGc7GXg=u4pU}VbYtny0|4RDbt>S-AIvwc$WE}rHCjw1`E&C&* zggmEz^8V6)Wb}VB1^=A`_;5P=%Od>u$O#nv)Z-t6B)?$vPgSV<2jP#%f7Rgcj%mL~ zKK|%izxk*A9-NHGPcHeR*ud;bJb&oxq0gWCd$Ip+Wc7RS8jSy9YxR3@1z0SKKT5tW zL-3~}dU=8War}EP`}>mOui$@7R)Jpsu>|-%@Rbq{-JkQuKlLkU-JePSJ@DU`A-@MM z{m;Pvc9O~pruh^0PyPDXO#a95@34OzD+K>#tZe=7uz#JP6b|qIQJa72Hh$0FYWKeb zalQW|ZU0^E{&ipiB|rWN_)DiP`u;zGn*Rp)FN5-{;Pan=zf=Kv@IQcmb?Lt^tNv=g zKW4(z58%HnvVQL%;D1yOBJNSAwG%-g#7W1`B);8`TcS9{{TnvNsRyi literal 0 HcmV?d00001