From 236871f5bcf788ccc6f181c67225509591b2e87e Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 11 Feb 2026 18:20:59 -0600 Subject: [PATCH] Signed-off-by: Matt Bruce --- BusinessCard.xcodeproj/project.pbxproj | 8 + .../xcschemes/BusinessCardClip.xcscheme | 96 ++++++ .../xcschemes/xcschememanagement.plist | 14 +- .../ClipAccent.colorset/Contents.json | 38 +++ .../ClipBackground.colorset/Contents.json | 38 +++ .../ClipError.colorset/Contents.json | 38 +++ .../ClipSuccess.colorset/Contents.json | 38 +++ .../ClipSurface.colorset/Contents.json | 38 +++ .../ClipTextPrimary.colorset/Contents.json | 38 +++ .../ClipTextSecondary.colorset/Contents.json | 38 +++ .../DebugAvatar.imageset/Contents.json | 21 ++ .../DebugAvatar.imageset/DebugAvatar.jpg | Bin 0 -> 179656 bytes BusinessCardClip/BusinessCardClipApp.swift | 48 ++- .../Design/ClipDesignConstants.swift | 43 ++- .../Models/SharedCardSnapshot.swift | 292 +++++++++++++++++- BusinessCardClip/State/ClipCardStore.swift | 11 +- .../Views/ClipDebugHarnessView.swift | 183 +++++++++++ BusinessCardClip/Views/ClipRootView.swift | 2 +- .../Views/Components/ClipCardPreview.swift | 257 +++++++++++---- .../Views/Components/ClipErrorView.swift | 22 +- .../Views/Components/ClipLoadingView.swift | 7 +- .../Views/Components/ClipPrimaryButton.swift | 31 ++ .../Views/Components/ClipSuccessView.swift | 30 +- 23 files changed, 1220 insertions(+), 111 deletions(-) create mode 100644 BusinessCard.xcodeproj/xcshareddata/xcschemes/BusinessCardClip.xcscheme create mode 100644 BusinessCardClip/Assets.xcassets/ClipAccent.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipBackground.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipError.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipSuccess.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipSurface.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipTextPrimary.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/ClipTextSecondary.colorset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/Contents.json create mode 100644 BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/DebugAvatar.jpg create mode 100644 BusinessCardClip/Views/ClipDebugHarnessView.swift create mode 100644 BusinessCardClip/Views/Components/ClipPrimaryButton.swift diff --git a/BusinessCard.xcodeproj/project.pbxproj b/BusinessCard.xcodeproj/project.pbxproj index 895dca1..6aed681 100644 --- a/BusinessCard.xcodeproj/project.pbxproj +++ b/BusinessCard.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ EA69DC822F3C199C00592220 /* Bedrock in Frameworks */ = {isa = PBXBuildFile; productRef = EA69DC812F3C199C00592220 /* Bedrock */; }; + EA69E9272F3D4B5700592220 /* Bedrock in Frameworks */ = {isa = PBXBuildFile; productRef = EA69E9262F3D4B5700592220 /* Bedrock */; }; EA837E672F107D6800077F87 /* Bedrock in Frameworks */ = {isa = PBXBuildFile; productRef = EA837E662F107D6800077F87 /* Bedrock */; }; EAAE892A2F12DE110075BC8A /* BusinessCardWatch Watch App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = EA837F982F11B16400077F87 /* BusinessCardWatch Watch App.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; EACLIP0012F200000000001 /* BusinessCardClip.app in Embed App Clips */ = {isa = PBXBuildFile; fileRef = EACLIP0012F200000000002 /* BusinessCardClip.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -165,6 +166,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + EA69E9272F3D4B5700592220 /* Bedrock in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -329,6 +331,7 @@ ); name = BusinessCardClip; packageProductDependencies = ( + EA69E9262F3D4B5700592220 /* Bedrock */, ); productName = BusinessCardClip; productReference = EACLIP0012F200000000002 /* BusinessCardClip.app */; @@ -987,6 +990,11 @@ isa = XCSwiftPackageProductDependency; productName = Bedrock; }; + EA69E9262F3D4B5700592220 /* Bedrock */ = { + isa = XCSwiftPackageProductDependency; + package = EA69DC802F3C199C00592220 /* XCLocalSwiftPackageReference "../Bedrock" */; + productName = Bedrock; + }; EA837E662F107D6800077F87 /* Bedrock */ = { isa = XCSwiftPackageProductDependency; productName = Bedrock; diff --git a/BusinessCard.xcodeproj/xcshareddata/xcschemes/BusinessCardClip.xcscheme b/BusinessCard.xcodeproj/xcshareddata/xcschemes/BusinessCardClip.xcscheme new file mode 100644 index 0000000..bc3a632 --- /dev/null +++ b/BusinessCard.xcodeproj/xcshareddata/xcschemes/BusinessCardClip.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BusinessCard.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist b/BusinessCard.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist index 2643284..cfbae5b 100644 --- a/BusinessCard.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/BusinessCard.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,17 +7,25 @@ BusinessCard.xcscheme_^#shared#^_ orderHint - 2 + 1 BusinessCardClip.xcscheme_^#shared#^_ orderHint - 1 + 3 BusinessCardWatch Watch App.xcscheme_^#shared#^_ orderHint - 3 + 2 + + + SuppressBuildableAutocreation + + EACLIP0012F200000000004 + + primary + diff --git a/BusinessCardClip/Assets.xcassets/ClipAccent.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipAccent.colorset/Contents.json new file mode 100644 index 0000000..c2d07cf --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipAccent.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.860", + "green" : "0.470", + "red" : "0.220" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.950", + "green" : "0.650", + "red" : "0.350" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipBackground.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipBackground.colorset/Contents.json new file mode 100644 index 0000000..84488e5 --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.975", + "green" : "0.965", + "red" : "0.960" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.150", + "green" : "0.130", + "red" : "0.120" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipError.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipError.colorset/Contents.json new file mode 100644 index 0000000..dbf4fcc --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipError.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.220", + "green" : "0.220", + "red" : "0.820" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.350", + "green" : "0.350", + "red" : "0.950" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipSuccess.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipSuccess.colorset/Contents.json new file mode 100644 index 0000000..625e07e --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipSuccess.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.360", + "green" : "0.640", + "red" : "0.190" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.450", + "green" : "0.750", + "red" : "0.300" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipSurface.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipSurface.colorset/Contents.json new file mode 100644 index 0000000..ce79407 --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipSurface.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.995", + "green" : "0.988", + "red" : "0.985" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.220", + "green" : "0.190", + "red" : "0.180" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipTextPrimary.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipTextPrimary.colorset/Contents.json new file mode 100644 index 0000000..a0030ea --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipTextPrimary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.170", + "green" : "0.150", + "red" : "0.140" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.975", + "green" : "0.965", + "red" : "0.960" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/ClipTextSecondary.colorset/Contents.json b/BusinessCardClip/Assets.xcassets/ClipTextSecondary.colorset/Contents.json new file mode 100644 index 0000000..218d339 --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/ClipTextSecondary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.440", + "green" : "0.390", + "red" : "0.360" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.750", + "green" : "0.720", + "red" : "0.700" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/Contents.json b/BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/Contents.json new file mode 100644 index 0000000..687f101 --- /dev/null +++ b/BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "DebugAvatar.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/DebugAvatar.jpg b/BusinessCardClip/Assets.xcassets/DebugAvatar.imageset/DebugAvatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3aad8c5a0eca0d45537c445962357e04752ebc49 GIT binary patch literal 179656 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�vu-^u2UfP86kYu*eMQp!_GTJh>dF1%G(oA+$6jf=Qf1G- zq!~%&z2;7PFO_V5KFwO{iz`){lhmi6hiRTtmT_Kbep1@GqiLa1lC?rPyx}Vc;3FcsP7%V%f zVzM1AVdj&pAuE1<_bef+_fl^&+pQvB;xbdM(hbfcwA4cA_6uP!8ex1M!n~5qbgRtT zp3F(B@7)iw%&Z?wv1LbpJhwrfS7|E->ORT?v}3uB9!k`=bB;XTvDD<)dwdo!$^PS! zB5j}j#iLgBa<+y?kKxN~6^~vkM}+Ph2ty(fCcH(Mua&Ll(N|}f?c?#QyE5mJr~XuU zF1Odi4b=iRZ%~8tHAA;R3v(3ulR7^yHS{;@$Gj(Dkf2iTau|t>Pi|D$MKzgR?J#Pi z+}x*Obk=PMJxLLUh9XRqLRi3?p|2I^!a?E@UI(Lg~MM#eJPkp z0wW{^=}GxCyanb-scdWo_miT9?&TjQg~&$aw1udnb9>@aKCad3ilU z7*>EV=@G(0DF0K^r+RFDW>Wh1;{w{`i_=ksmy-84PZyV`0e`tDpa`@RMK(n?G&x1D zi(a$M6v-CJ3STI?S9I@bbP+=lgGPGM`J(eCN<~CPM7EiQa3TB&jW8UKFj*Jj-~TmW zifD^ydzy<}id<&y7wZ=5Zkm^NmUe(f)-+Q<5J8DZKfgeAHN8&}I4`CA4Xm8TRwzVNv0%M*D5|WnYVTR9s<7OSD^dCrLD;5;aJUcQf-%CK zn~h5_2@IG2xH<|VAoi1i5sVrP1YPp00sSdf=^87r^Xg&E1E69g)$2gT?pJ>WDn?v= zAE;PZRX0$vjVdjmV)T{EAf6d>B~Z7f3zcFZDi~MgC!k{eVCWy(HLS%UDpqms8u&(8 z_zeQ3Rb>QiAN|=%FWLsq?8^7F8DeggO0=I8k1N?}wRPnyU|LRdr-~k$eYfz6NSd0E zFBO_Jj)`6sG&DSg`sIVv%VAlG*wkyS)nvn^|_vRX`!lu1x;z0s*LM$X^rZ`pxM$URl&I3(hgOwyz8ak zRd3X4mt9ij=^~V2R2`=1D(KX%Y&@#YPzQ=!Ri_^TYGt3nB`Tqc-v*zU{VT2+9Ppi# zs~Z|fPM3W*EPg3hmT%aiZ;#Mo9-&(>!r(Uu<6j}nGb_t6Y_1I~TQdC7by6N^^k|Bx zV$A4d{kTTT7Dx8K!u?72bEXl`__R5 zUlCdkBXrk67($0I{up82pYos9{&i#(?A8U{?<(3pQckH<5q(_T;HZ_iy9C2E?H-|^ zrm%XTsYRdi|tB(87=>9n*-_)h9!2(shQ(#6miCWXUA5y|vZJ z=hZQ_Hp!Qb)oNvvX>8(aA0^Xzl_3m2gD@!!VWCv*!(^HU`dXu8fgYaP$>fCTrn=b_ z_syH=#Iz+4H)yq}1+4t4D5{~UX!ulA$hOm87aFRMD~jvcZ-9ypXI?d|6_0KPG?|y(13O}) z8l!+8?b+x_%hzbuXvQAfsMe?^f@&0R6qiFcvNp169yMNVy!v*y@oeK+dyPh@5&9gB zhSBhsY=kMx2#a4KM8l2bjpV(9jk=Axvwt;lG;wUgnD-dq^)-L&w+B%do%(fXbDKT; zB{&3{{razq^fZU}!SW@|v3;}Jmz&f3noR#{F6_&4C~25A zup|y))Ai>1zJR{g=Dog-*zBb0u!x<2{fESk4t%(CK<6pEc>rf8A6_{+tn(%QNoGT*I{tBaKf;!)2nPcZ;#fPcZNd1Y zE*%0`JKDvEs92XfP%)A&pj=!pyP1KCId^{sD)ys$6{uM2_oqO`1ixnk6?@qOysIFl z9z~#H#XY`2#YlRRK?}lxuuU7`a3jJ6C4@Vu?*|}w1l-zA1NvAU#usma{mK+z@3VFn znC)T??P>?Rl%=~uz+N(&E;+Cod%Y8sc=KPKpwH!A(Fy8Un0N;mZ%mHucnwr+pnV;v z*it)~5gV{-*8x!{nL9vRzuWO0g{WBT$_+3x(&BRKCFN>+0(}G>NBaz23P)Re8(o0d z#rAAEQ^m=4Z#qd`gLX|i8uO-h7TOheR2zXdFO;>dl=gj+NSh@sTaic`I}NUpz15Y* zqc5p-pGIr$NjnG4^X=&_EKLnavk_! z%R1}aY+aimD@>5+JYs7CR-E{OGPiOGMqE{CIVVhf=R@<7$eRaMEet|^kCa+yg&Lke zX}Kzt{o1jGLMX(1yoFTA(oLy_NJuew46`r9obV2_E_hUM3NtO(Tc3(~C+PfruH}lL z@65AS8^Qjq>P`uv6<}pg5Q z&&uB1bm$m(8URXi$ji47)aIb_h>E<`S(S)cuf;*Njc*DQu4XIQ)V!m%^HKyup*F6s ziJ?*(u-L#bsCBqCU~Z{31lM6W)JozfF}!N2`4kvoweULa=2f+q-I|zWwa6*=Rx)+A zjf4)222kV<83R!F+g})xQ+c&n8b&eyYV|g{#UI>~Ym_Aw+Cuz>Lgfag>5Z^~9zx4{ zgzm2qhVWuAZ-f%qF>P=7^F=Y8Z+PpBFpfrWw{#2Z8`UYPRv%-s4S`N36QE+9j8?!? z>X5g-OZBVW*E)zLqOH=JAfVVv_^2dp)++ZgS(UD3<>RoSc?<62xK$=X4`zfRScC~^ zg!%Od>jqjPK4x`iwDQ`VpZe71Vl%!W--)*a<6~WyJ*7dEHA7EdYKx8r&lXm`4l=LP zf>+yhyrg7Q+giLl)NZt?dKDOjv_0^uv#v$xc^P47F2Y1hgasN1>$O_(UV-14+dg^i zPHnW;f9l+b=sxX33d7yEk;u_q-@;E(Z**M>XJ(!1bPHD$#CB|k+sHoZFbR)U=V(6; zuYFV54jRypd+m+k{a&{ahD9Mv5=U5g0b%`NyJvXHcXS77#M$XLo!k*WHhz4663Gw4 z-&K-*K&@X-{zjwK?UkIx=GuKRxmqZ@D=xYFDOVSF@~nnH=U_6y7}pt=4BHBKx~H7_ zq=_&*4Pi1X!oq2U4aJ=b$x}TaI@?l2rwLtysnnYfdkWIcV7Mo}SP<;L(JU6C>F>E% zEX+>#y{=eT*zCJ;v8deD?^lb(H6M2O7C(M_wmY&|#?H0du2|l?xZAc^K4Ji2$~}Zd zEeO%B-Or0Tdhc~t6noDEe$On?*v#pBRF($AeODSm@3nWS@dvG3Z&l+2du6Xz<988G zu!^El?sqRuW0}^Ip0&o@cdR{_#&r9-o~*_cpL0D)jVWIl5vHmlEN(;CsNWOV7}9sX zXS#86R=796DRJvs{|V+hh~bygp9)5sLi$5!bNZe7ojIiYjrxs5mira@737Ed`TF^^ z#rtpe-!y&HPti}|u-$*U|Fo}0AKV8=dLvAWLRf-B*rbiH4@SN<`=@`Qe_<lp0BrhcOs?7=2v+(uX?i?BHZ;Q;4gGd2R-GbA;44bMEhf*S{F&`m&t=)+5dWICG> zB7z6!=aCx(Eis3Y#{^!*$`NA%*(=i#fBcURWh43cCg+Ti9(-zm;>apKFuG#o2=AJ? zG790H%MTE?JU}>@iV!C-GJ==K*Nt5!fHA+Zd_={@Kr29ZJpLC@F}ZOmpkn6ZUO>gB z$D4tQHB6v@irt?O2P*b#!U3q*^$GB;*y4#1pkn7H)_{uLMcAf-aJUfR!hM9>(-W^? zZ5SS1W&p}FA%6vo#!RPy_4fADz943I+ceN7A*X2$pkn+}8=x6k7jW2 zCSgb2*#8vGj=p4XXdE47W_RgtA9iD#!ZMFcvHd3GO?+ps1Xi2{zeCXIec`C9%OmGS znVF@A=EREm21YDI+#k)3n2MOcxG-WQqM_$Bq9Y=1Nj9P^a^1anL|XVb^v#H%@JQ0_ z5mw>s!qt(h!j9^5`8 zu&vxRe#xPa@+?wH!vb=O%H_jCauWI;!y!_u=Bdc$%D9kR91M@YRsrM3V^XT?RH37f)mmBTM((R; z^7ju5Y1m5Pha5GjRFa13G^Px4hMF}7tdxg3G}=7GhWa$BL)C^xHL?>UhGsOP3RZ@G zXm~X|A6nCR-_tc1tzI#;K73I_aswXQ*4zMA_6@gzl|M!aRD?0|H=-CndEzf2w`b`4)P5iZyrrZwSd zxIcWugr&!K5NB*P6+NtE!nol+e(4=C3{Rwe=E`94HetcOjVDZvz^

NgkQ!qSpx8w#I>LY~369^k)5cWAvd@W&|X`BowS>OCV!&eSwd1j@Xdcgi3 z;->Gkb~EUvZub2d%cd?7-1`k*iF+m4fsq=pKTh7 zJdH3-7-2~s!X|ly{p3@=P5QGRrnQ@|ZHdoTwE*46S`Em6_17{3qO^@zh5;T9huQUk z+oH^~l>^iYth1j6$h6aEUk*T~wX-z^?IA%Jo-3Fu04odP=Hlqi&H2swap32y=d48==CtOt6ei}L z%stUDpW~Y2dLKJSH%I4WHFtjQygzD=c#innb1aO7Gd>_J^F`P^g>XO%Ar_u1fu}r`imt%#fBEajF@i4;xEBu_ zk zXI5i5K(BW#Uc?YsQ5Tb=YFXhD|IPAgY5!rafceV0So7oMl^1E5&l^)TdUy$|talEx%LP6c}83sdQcD!LpIUtcu>Up+cYGN5DGko@E1t z3@?>seTBgAqvh8M<|#GH+6sy#e#>eK?9GPD&lFA#$}G#sPtNl$e3N^*rM#Rkp9{n5 z!s@TUFArSTFrijjrPS166Rw56>G0##qqxuVv%_j{cas6rvsI z)xPva+c|=6DMtHUO88Quwo1vZr8I4^rmm%I?OOxxOL^L7agP>QHT5?QmN~RefRz;E z=fFym$rb9%)m)P<)}ocPw*i8K%Ng&aWHpw$->s;BSQ0W-HNLa-(p17GVoAeP=+m1e zT~po&+odv#^CZrQ*s#IxMB;+ z;5wHb0}bigbGsBa)>S=w9wDO@8+-IqqUBTv2@RIzGY%=n+e_aa+HGwRdS68taey$D zbg9RotwemO&!M#`bZO9`xqokI)S+R{d?DLzXCrg@wF7uA8{ysuz)I(5Z5pHXGoNeO zGS}|bqnT3;|~y-EEQjOcHeeJ!U!ueW~PXJ=U_iWo_s%&Q(5f4<%Nf5n>tii{MOCejw)~Y2BP{bmh~YyxNRAM9dX1|&Ys+vWyaian z+YSP694|OHOGmWzdvJ(Br-={` zZ*y&PfqluK^#@~eL_oz>c7adBCAfPUsMyP0Fq@^+x=RXFEN2(=(af245fyv9O9@nr zdY2BUSl;dppkilt?*J9MkFZS&;jj*YKU0j z05fJV%pE}k`b;e68OlHe`bG9dzdl-J`j#zmdNCVO?`Gy^M7}D}0PrxUZ(jYC5Um+_R9!r~myM4^zzzRs__Y1@< zT#5moKdR470}QJ31k~zz4R~u-3|w;!PYaj_|2*In1wKD`#$X%<>{pa6e>t7eWK|D zz;H)kSKre=4A49VTt{CsrxEZ`Ehv}z%-yd5NvAr&71lN+06UJF_bhcTAXYw5B33^9 zq;&y%pxZc}fl`|#DhhTge^T%Uac5+8K)zYdzQ+J&J0$`p2ap0r#eh^>2IPbTy3`;v z>nZ@$o}2@eUB3m$`^RpN?mf6yu=~v$vEsr?TMO96kq&BwrDy`!t4gl`dbe&>I^f>i z1wM!Yx;noFbPVtUw2N5>{Fnnq;oU826an9L-3K(71o`Q%wFYv}{rTbhJ#NPn#7f{9 z#7dwmEzq>U9gYJ~>nugVUxIcNb-+se_pd;i3?BJV4fg#oI4=RR2Y@^bVUMLjnB#}A z<~G94d4vvKvj1nk~d8c*H0zNVWSIDz)>wz!_l*YXH>Q026_YjVQ zwB*IFfEt$FNMCId{Pr z^C|J`fb>eSfDd#*`RPEA{ODV3x8^dPa#$o|5lP0J?VzQdsi-y-bF`oaL z*#+JOpd#HQ;3F<}!29AFfOnMo0I76A{_mbM2f4d*?D`&XH%Ja}BX%8dB?r{mo#iT! zqMhY7aQ@Enh$O;=MT9$ME{1v^_5OA$z&Y@O*NA2xzEA?aJ#dsNf?iw# z5%8dh!K(h#U^NLiC6EF{uLAwHkJrEq7bE!D)*C=UZ-O-&Ob~SHHrSyHY!&c<-X9pH zI3oo?s$iDl;WM!ISs7eQ73>rMPbORg#M1&RPeQbT*1iUwGq?v~1E9^uV5OW1_&u$6 z$ck*Rhu{PFJw*%P^8&w@$p*xP1R8k79<0@O0M`J!;O1RHRC#x>`_u!>w1aYW-v`+C zg&-Dx5EU>G+yfZD><0e7WH^{32kRH^eg!)cqQQEs7?8R+p#Sk;9diQkcM?Gylw`0T z2IPx<2FRyO@O!h_;PV^^`kDtujtarP4KTK|P!3{&fmLI}RUlo!PkPY+Mr_ewrDr3E z*xL-!4(jR8b`S-l6ZC7lfNd~_LN*9~qi+PHeH4POjsp*40<1fl0lAF@vAE{I>Qfx} zsm*y1x%>y%=duWTcS|6;{0ca46^x6mfpt8fg>l#fGd)`nL_+{ENw&fFcfj|5g75zV z-`_)a;Xu$5go3h(P!IzN3X&m1K|&W$kUu#Jn!JdDzyeW7k`@Ie)1jaq1{6el69pCC zMnNxFQBVOJ3OZp&L5iFxi0J_eTI5GTB|<1DQW6DOfC6w$4FzRtqCkXc6jb#V1)ViT zLBkd(sM;C@>D!{9d}kE+r9c#v8i;~4B2duLS8yNE;Jj26q@D(@k&A-hd=x}gjDi^J zP|#8<3i{p$u0Mo=o{pj*G!6xkFQ6d1brjURiGnKdDCo%!3MxH9K}~0fAcJ#6kQx~g zRQ4AUq)9^r<KYLwdxHq-Vj_Yn?+`&;Y(&swP9jK<3w zgX13uiiCuOjFjv$Dd}Y{Mp{O$fBJxDpi_`C+z3&eCA)u`g&1`cBBDSMQ=s4$6exnI z)2P24f4^n$ejr_Yd_Jx5A*5h6kn6BC^xK7IPsDexB;@Hglb#pz2o?mawn`MDm+ zP0K4h9%0F6nI084QN9=;+~U=@@;pa+m5Q2%_VyiS7FM?V5BT^61ce?yk(82_k$tNC zQbkn_{3Nk~q0t*-leh1zKib&Z**iFTee(Y77fAWAv$%6_!J3}9u$!sl30pUr*GUlbLru85Gh z2jp=7zw`57SeD4)fq&=czcfDw|DB)z()=9yC-T#@=1I`4Pi)sancX4$&jPKJ%ji>X z{nm;w)R=`n$N|5VTcG@ZeI||*CP*KX+{Yi02EdSi(uD&5Yy&rg?8)@4co93k9b?0= zyC2`v)AMXMQRjYyo=Yk>40C*}RjVI14xT*Q-g7IELVDhWXpwSRmr&8b;D9wg84s{4 znBapUtd{Lb`OJi_#yizchs+*^mP_aJ!itQT#)DaiMy{xeWzPRaBKa{yeV8*Z=HZvi zU15>L{r9e*iY2WQ3GoL^CtfjjC#NN0sP#Dvd_hm~6~RomxtF>}Dv-@b6;AONL*-g} zcInftHmKWALThRaZD_QE**2joYMk?KH1=*y+f%ZIih5evB2@(M8XIO}cY%WNbIH}- zT%0q8{*vc|(OZ7olD(6wrz6}!HZJb8EO(gRU`K62&~kD(#| zOacro@Wn20N|;oRqF>ir$Uk;H_|e!2;bh+1wwu*w5l?2N_(LrJ>t8V&6l9f>G)Gye zVO7+an#kk!F&N6%dM01mT*@qU1;u&gxy0!!s#k00U5GK@8NMAe*Drg#|2Q!kJ@YWq zyz$wYP0HQg{69|)tVRMIMZH_M1f~~XKmPfr=XX|tEI9wKXO&w&?I~T(=P8|dihqS% zj3u3$^!~^+s&i$h@^IUFzHUGHZKQilT5pVTqpZ6;Z>!FMm#oM9^!(wV^pj-k@-`p0564Ur>9kl!WI8L)+XZo>eeZ>Ew385AKgFbKdy)GCJY_Sn3{-Fi`|?xjl60nl(CXg{h434w2>!oj-ustuqX@h7Abp=Tjeje z-{9on!h`3>=v)};Ge5F%Yjzi9^WW8*|4Zw{$!#I`gwhJzvL9CT=TTn3245oKn1#4L zC0A3Y$q7mz{wkhXuJPY`1my7W|G4&(M(wrjG|vynDBoA2W=@)}D*WPxi+g}RB%N}@ zlIv;@NH8+FVFXOweo|JzP{Xx4>o(V`F!V`S>%+ONh1$qls-Z1s&-Qe@a#|qSE<}r{ z%+u+T9=PIlYMZo7c5;WD5-6mH=hRwt$?ub)eG`N)uO-&|%9wMj|J17$cAHc12$5e% zhg|ds1$U1l?7yIgdIPYcm=bs0K4Kmo5<;*9r@?NjB#)dV1{tT7jtV74STV3p|&1{%n z7|MrS$gQnU$Cp*wDKdS&0;1YVs?ad6K!u)l&*v4~<}(AB%FEAp-fB?!T7-K}ZapQi zICY59RdqHTHXLeTSW`HMQDpKWgf*HU+1;$8+p`~Hs@~R_O}|dEVVlNW+SOzwK6k@s zL4twIwP)Au&6bXy>rADvbK>+?`^-$Ot>`ukp$fSOcK+pk-Y0BM!u_43-9NBe*B(Bz z(2(ADUzAxB4RYDlr8?<%G*nIC@jSUsGWCHXac1E*FAO<*GkQZVQKts9o1-q?wg2&K z1(W=O=j>jqv&SFFzS>qzm%^jn;=f?XrDFkxj0&9(q_aA+orMSAd|ONjN;8|1b< zLb)s5o_z#EzT_8|J1ahme+Lh9B8%8S{y5R5UQVHWSnWk+pf-j+nUqh>@pIGRn?mI2 zC;rFNucvDfr#X5sHyCp|jyr2wBL#Ea_mdwf#D^E`yoMqEnRiUS_nENxt9fdjPx)4UfTg|owPgK91-XQ{1+Vz%DVIR!XXU0NHJjAXsS zBXm*a%g^h<_mrQJJeWt5z7@MS$S5-s!R8Pw`Da`Fjq>JiidJVl4o_j4c-AIj4oyuJ zA)P30TrGdH!N1*p(zhRxlOT;ADc@}mI8wpoJGIt?VBBbKw!Zz=(C&Db_FT+ukpv90 z*HH075{b9-Q^K2kT#xdf7p6YLc@Kz}w6LY-JVZRimHWj*#q=Q$moF-b=5<=W-@FnQ z+Oc9=64vi2q~Gwlq`vmR!Hye~=v(Yki5ZLDdDC&AFMgl~#^ zD_VP8C|mnGpKI*2hD?VlQ_%R)*&mJ&c}fGBvrOH#JkNofPQ>?yawQ%?B@KOQ61zWg z?V?S45AZg>{}3XNe}V_4Der4>`%5!s_-VR$H09xG(9j}{?f=G?+Jkv+>I2heQ#yOk zU!2a<8!u?Sd8}leYsX12a6T5$LON)^Pxo8xFP$E6iUJI2PyK#I@|RBV zR~WiRaU%YGjNw1u_n+|w8N?`Zq;N2B&5NUfkx(#U9>MyciAF}0_R-ZSh^7Uy*p)hXt z1_||!zYZC_k0=RIPd+@|957UA84C}Y6%=oFH*|Npc_NrZ9{ZEqBSCPK;!RC3Cm-MP z@$Cj@w<-_cL%zwa)ZP==;Cxz+UthRSUXlGJYygPTjbFr<7OUnlq8`)BRCX`LI{XYY_9Jol2MeQ!O^ z?V`Q@!p7w0m&iQVRlOblKLtGb2eiL985j10^0eLF2DnIx;rgE(?A@Cq|MO$4UyODe z?|H&JAr@qP>345+c-If&IJ?IK#cOw^wMn7heT|INzxqgJ89wLrWxb8#Y7-2<0YmcR zdyF$8j`|G)gAYCk>kK82lx3?ry&ba>I#CA^jZWDX#+EZq%!&IMeBj%VPL;8f$+N!y z+KtHabDzGWU9aGw+|$9l`wBt~>~emuD=Kx0Q+^U3DZOxtf%;SYS%~Kn108=Hj)j+&ZI*Huewg;7T@ftYgF*c*m^7!AVE`VR0Eq&OXwg2YJe1Db8QbG77S zg3_3H%HF+@8T-?E!S(stx%Le9o+GyOI;C{Bzz8QZ2!<*GBpA)!(pnCic{2Wb+ns2x z)K+^h$z(IW*qGjB35IC%M9}1`f&#q!Ys-hE#keKoA+PFAu9n0$caa~z($YoWvJhtw zS~1f0qcDWI`Ey_Qq};B2X_gU&Ld(Pn+{dTJBs14a8}j)Q?@iZEGgnM+|0ac2SN`x8X|?BBMd{5~8p;kxUsoG+8=-x6*p2Ju2MS;QM;g3e416wzrDA- z-6lly%^5gCkn-<1+rrleyg2d$DUsU@BV8ZrhWGlo9CHlz-yU#_wS?*N9Ptrm+C%Cr zO4b}=u2?%bZXW6K*(UB!1v(lJHter9CK07xYF%=;F=kIQ6&B~h^6jaf<(X5liqk)P z1q%D}`JZn0Z`aAv^ULK0gnr+kv-mJwdM);bV`3yC^X!@u$3w5vzP~lAu9XAHvXE;PmuxU;$N69$uzmkj0mF0EnmS9PV|bs zHAd6buWel&T$yZvOM0YKSJ-}izAyNQY5q?SJ!f@=zXaiPK%}=j`>yd&;GsYCOZS2^ z13}S8KXe8xuCxr9Rj}YUdv9Itx)$;4x4A;*ez#KivhPYCX)IHx#0}b6&BLNV}oCJ#x@qx z6zNpPbSx>(eW3ZJw~JofIkEZ03B5$4O9nR}b zI}zd5*Fvz9;A7%QF-*g3nuQcL3EGQcNpUCr z-}c%Or#N~?u=`xDQD*wJrYd2kLUzx7IHzbc>f`F>t7_diF+ms#o6>=yqM)&ppm)$8 zOw$Qp|B<=T?JeIvU-esIU9~#0G&E3{*VLH?{o|BqG>*4K2}k?UkUXyhhP-VUOLY~T z-NrIcMhn#T{J_OV`%apQVQ6JFi}>3C%XjppvLb==T&P2bON^_!W~Of2D`nxsD@t?sUM-jtsBlO39IT|Rc@5}h^~ryDNU!RswZx*Y zsvoF2C6Zh>O}k!A{4wCdg$3H590EtY9&u`ob}?XDLYuDkPqy*5IDA+){}O0^$StkqBiGu^xMFN&l(M8VnJaCYH`m<3Y~ejxr3Y^ zn7c50-&Y-8s5WUSxDhFlao2+P8idP@-IflnGsri6G4sw&c~b83*Q?v5Ek%?ICh`Pn z=iPN3HPD3mM$Voa&MY0-Jx+9~bjs@V8%up{C3WF~Xz>sw-VyELdeweu_v8|V4UL1v zplE(GTZ4FmVAHR*zaX6h{=zj^R)XU3$5)BcB5`-L!XMqW@MJS!HzKC_ZU?&F4&IeN;x;rhf?(K@k= zIVy4AI`PQ19)m+SE-26Mii+_JnaK&6dE}xdQtC*5-j-o~IxC5&ZegAr^MSd& zBI}KLsjkGmznTNLkK5_Zbh{a9mj}SLea%kJI6oOGARoU(7bLG+U<)(35j zrI^*uYq(wI--Q(yYMV9uE?T@3QlK>0fJt%Z`Kd#vNH~c;6O#Vq25_0PQh(jrzqOpmq?n^GfqUjo|4z=XcK%i(KhGg_(7bIZom8*$)d8S}AQ_DM_Rxb1cM( z+q&NOL#W@9r@h-=RJzw8cBC}%Wshlx$$zKM`%o!Fgt0*TKw8yzdZjp3_VgHmwGSme zyA>b8gq{6gI)~SwwH?*yVy(W-uvMHgtLbb0=53dv4vj|d5+j=clVJPP!*G9SC&XL# zLV+{Nz`k;yqR-l~L#wN|RlR8vb^Y>wh@Lu{vf&E$VC`f~bNe%y%6l`Eudx zb^mHf$olz81pb;q0rou*ppP%Ehw}ygd@a4Kl;SSvl{~%dBkwAX(>a~T_{QT#udRQ= ze-0e8H#!>=crYzON17F3LgSLcOM7?gT{N!?oOkkScQe2bKRcu9m-05@+R%-``@T>3 z2?Ptp>8>_5l_0)vPQc%hci6u_^v-)j=n`;etY{6i@)ka5mUMLg4N?kFtR`Ofx9 z81Iuq?MgNw(MtSRpDeOn@)q)RS9dT(7{}b$z(?<<_fGtPj2nh7gCWzi{6TIjr$I=s zxm(yH1=kSdEJlKt{n&}SX2=N<=)kv(_W6iVEl`U*&gkI_$dabFv*6{`?4o=r(8+8D z5uqPuC6Tk9^bU(JPwM`e16jg2G3j&kM-B{yF%k+@Q`|+;-q!r%gWQV4GwH&R!Oqyo z!LiU-+JMBBkH=yRLgaV2lvK@?)w2G3FGd_5`=2*U|H9dt|G&<1|9jT?U)%cqd)E11 zouB`nb^cejJ>>8|Gwb}XeU|^qbo_6*)_*&X7yK2+ctwoMt(lkizzx%6I81c1XYg5_ zxBv8t?zK8{SFe`$be!1@{V- z3nSf3&<95YZtHO{)Wbq6o#!li5Sw|h+gG_G*6Kjg^MgjDXW-{_=DVLF6u|<8iiJJ- zmo?CYlk79a8RAi*wPwoWhuPOYSxBe5AWjISx_$d&ANAtja?T~Kv#ca4;zPsw;dH7( z{=YFVj+4-(<#h4le=fUCq}x}z;PM7~Elq?GL{+7+zLLJhljc zp@&y4v;~2=7tent760YAeIwjs3MEb{Jkq41va7E?(3)Pm5nUwzZ9U?XuA${*R9kAyW2j3PqNLvV<8e_N>|0vSbU{WgC)x859*|mwnAn2pN*>lqFlT z@7tKo@9uoQ=Xsp-oadZ6r|Pw>)&50L! zL{*Dapo*(ydag(EwUuSARL_5iTaFp_yZ8@Sz#pW!f5u__Ub?$f@^a2T$ka+_xSo(% z>E0PK&*Ne8;82DF&l!x}t#etENA+8Y`8nfbm(=@<4YR=-g3{oV-sjgAkmIej#Fw5G?#-u~e5nC2g{nKl$QoJF^f^~rwwj+c5cP@l1Cy5te1~+4# z%sLv2l&wi_??KV`1sWl5;=0&2a-vbI5n4c?A>ePcUNykBpu#~_HtHeK=-QO}heT<;Y2?`T_Ki1nHlV+#N_>-48Mi(6B*ULEp-B6XGH-0FVs^JQ0a z7%91q9$70%HLHB#)?7o3x%M=@1+j&zFfaue$R5vWg$lJ zL}%8>S)f4KK%LHlWf*#j0j&)tdYxVkDKgW$UG5SFYCQHJ@=fFR9KmwuA^E0CGi-qFTZ|c%1qQo##q)T!f<)${&`X12NLk%D97SwtAJnOv@CPopWdt$NebAoC2 zCNu=h#E%iZcP4Zasj;%bQK1KhXxd>%&yk;BZ6nMo-b_Xsnw)THdR&tkMsCS*$iOm^ zbW3|0HI#_tY8i$FU0hur(`Z@HU{5})6gYAU>OEt?Nin@yWKoaAW-hon&F`WJ5{~qz zryEkxLU-QBXm3b8Z1jcnVqCMzc5-jl1RU~m6X#6|RCSe#BI&IY*a-nt1<)r4G6tI6 zQ+2>=rYI%Vkodd9pJiNLUR&&cwDGYKdL@0Mu=$toRPW}$?L$A&wRd961Whswq+v4) ztFoRW}Kyzc$OSc2TBq~ z`oNscQ*7MaBW_AbzS-y#1Q)HLz|zXj$yAcI_a>xZ-jnr+v(!e-5iEp}jj(&r7M(iZ zE|U#jlYP(-P(J9fHk@r;4NfFS_Q}F$pzCO+sNj@GR6Pw)eX@qD^N9v|UL#gT{Hzv1 z7F5hdr{aPxg9CkCJPz88SCtc4EzqUKz%}0zF4To(T*z{-I5SRfA5??LO84U=k~HdJOAHa#q`OTVWR?5&Qh@D`NtfHl{$VFZ{fFGS_Z?Qe=RjP(us%dkEm zU%&At%vHjze`T8M)W9>j80@=S9$WggX&6PItXwWoY7?t^Np}2I*{e|lws+%~9Q#7|F5N&}v<~$>Z+_I@)-st{Ir{2c|$Sy#JV=Z&_Ji;eEvXNB}hn zx7)Mr*KE&F-O!lrtYBBH#G3@pOZ5qex6kkDh*^!KpG910z&f__PAek*pcEAfx2n)wj>-i_PL3-VtN+PVD$~L)r`V zJ%VVPj1e>Pa+s~~RH)`js$DDM^pb6#%y*&{#h(mVdsM>N!CJSXVLW@_sa5#J4;TxP z=cx*%iqvlws=%PzB+dB%feM&$#d#0juB?O_X$q`pt2!GwA5m~N;+)vqrps7 zgyA*lFns1FBv%f*X$XGv+*FksiCW;j(^ipRp_aX(HtC0|zCbygw7Mogwhw4A+>BL!A>`upOv}+Vtrm zwMVW8R)jD5aqh|oEy2bOU_8?h0uPNQoI%406WP_RdGgWoAQ5kd9Re;`4wO?pnKf6-X_lW& zgR44!@YPyhdAZJos28Z;;6KL|YKU7HL^!R_Z+LehaaU?!@S3tAU;bdlF*HCn*aYAN z1>PYx$oF(AyxGy*jTFpo+{0kzYpT|AuUSvrNlxD=#f^!V=zkI zB`RtoKqZ1~L^~Rj6%#JQcP7r%^C4YR4Lsnjo^B64MWt7|*irfNCJx=pZwOc;d9e;t z?&0n>2(+x#CHPCuG$J-XS&{XQX6SV4p-wCl+TJN7Q+^;pA?De&crjtl-Cho#?TOpg*EyN`@tUGz%q zf3=3G2}+oWx7CiPSIH2vkY5G-QbNPJb&Dz4PaN?m%^M-OLGzQ~9ryJ;osSKq=h$W^ z2On*)#Od8wQ!tYI3@T*a2?i>9?m!Z<=;b~rt@Dt+mG?;MII`wFc_N40D3f zhK2OX2XVqh6GdcJE9__;e-Wz+_V~137?cm2bbccjb)xC)a{E}+B^}~yT#pD+a6Umo zO!D@-^Xf&b25dLNG&NLC?Y)_XyEGGqLy3ml#ehJ((ks5{PFdl6ekM4Z_ z8NgE2J{x+0G|)kY4DZBI4C&{Ti)t^t?G$}Hv#NHPRb&|>s0XEmeok2ca0&ykE#ji; zE!ZB>N8kyQHf&K}R!+E}E+c$C?SHD2Un`Y=<_D;$T+Dy0e}gpW`W-M~_g$FcXGy6- znatJulSd-oy9=m!x@;Ax7W$%_^(`iah|gEAJfrH!1X=6bXwx@i=`5VFpMp0e2NpKQ zZZubV>ifJ9J$|ifFPPXzY#&6nASsZm>_a#*`n-$sJR;}D;?^6Gu->}BhZiDl*7aJG z;glrBtc%RJ<3>&c0Y=wElHLWvI1FlDl%#(&Cb6np%x)dc1`CuxXK4enJ%VO$l*Q7N zv8l6E@>jAVK@@5vc3C#(7vhtxD)&^cWFeKEwb?l8ebimh+mW)**i?b{RUe-`a$XB~`#IUW&Lv*kTLrvWJ=i1| z?P7UUh}h(|J=ILtjGixL>2U0LF?zgKHDwVC~9ammMXdMKOP3oFG3}4l6e>NR;Wp*WLOiH-l!*=KXhMmU98*SAK zA%e3bb{$wVyA*ILqPQsQqgH>qpJv1{Pt&?tEu``Uzwzy=L}gub`xj#g03gphha9EB zgY6OpKwnly7xYU#+*O}uaggmAsMG97sFgUpkkLd+2^mVzpVs1#NPVx3m1~GfYle_3nOVg@@wA3zv zNI+`zMpQxNd#1hhyhcXI(y^=x<;xkdLc;Zj#%miTX-6U`A5iF&d1Osf1s#5X5)Gg& zv|mX_OP*!nXOgS4n>bd@0p(U7d}Y#7PqsD`9&@WoLwahcPsaw!%FHbhw0+G?`{ ziHGrov9;UPWx|Zol9ev#<(?N}CSNzxa6%6`lF z*)2x78#4D%3BHVgNpQFhm;^ECmj2MY@iHhTc&iJw?SQ2i8mJiT{x~9IeW#W^knVzU zl@&cM9^_ujmPeb_%OAsnX#7!j`VEyZVSTiL6GlYo8<=73&lCc@tZ`VS^9)SIw+y zPgO>mMmnkVOVi4#N)qV$o?HtK!rWkbQES2aT0PKLTZYYlh=QcTQToh1%9m*AIciV%<&}9sJ7MLLC3SMKGz=;TA zo?oTkP?jKaAc)RNf!J6`R=5$7#bZ01g`AuqU6!2Vvy3$r3vZ9Sx5Zxz@)6!DG9AQ7 zqzt}_ixjjN(n3ms`wdj4iSN-Ts#qRaXN+Jr<=wBr$T9BpkyAC+ zW!q&{We%^7`!1#XbThM@XQ3X?-eS9fz6NWvR0N)vJCMZ6Tabb(7x&s}Agn!qgzH^9dktb9>UR&(_Llp&=R>40?i!XJ_j;!Rb=EdBcTn36 zOjDwkEShXo?j=}n*$snB^JbfG9GuMu~_gSX`q zUv(en8a8WKd+hXa-wm;y6<&CK$NaE=i|WTkoQy3HwqceYD-#2i=Z0NM}E{H8XO1dzP)80uZRdO_-*^4ZSo>|WcFyfH4Kf(j$xi4SPd?PSjE34r-uaL% zd&pu@70%G5D5?-b?tLw2Nmb&*W z=Q_eLJ0jMT4JUkpO)560ORGORQt`f`E&jm4DmMmI#Gde1yv!s@tVxI@+b9YdCtLEq zb2$C>RNoC5GERqNG;j9A~Q6qxWr1BHi9ljos}tAWeup#s!L zVnr<}pX(4miEth+#_?H!*P=bxcesaK1_PGWeN54fJ~!?bCO3UzDO*blJ{)Yp8H*r= zUI^xV*xopoE(Myse6d@HEYTBfX#HJb=IA@bQ@3p2GnzPc0H-OtWm*jMv~$B z=Sbp|a45y-;the$?2dBhPu#xhKn{Wqlh?LgbpMlRxK1rxz7Ml_ig%A{_DVGzDnKz2 zC6%|hN@Y!L#Y7t)NhxSeCKog2w+ElPml6ID!cphd5R^>K<#l>iwF-7tRW?XwPi`uL zS9S7m2#$SylwK4n>84lrC}}C{GsZm{Mz-w`VRCeP_4uN84I*e+ruhOyt8tvggBxIl zDxEz!4PO~jUvq9m!5>`6t1hp)MnB}_|I(@cLpoT1TmJJyl={v3;8FlK&?c!gT^|g| znk4Gyf9%-z;1Y%`c)UXyOZ)X?7zB5}y+^ zF;<{)mhFC*+Vfgln~{i(l%uy^Z#}uuYi@3|sIb|h94o^(`g$g1|pfX`SBINmZllk zcdTE0-kLi3N~NjOz0=WBQoT^Rqs~Ipe1Z~2wpTj|Z#H249tJkkB;0=`vUHO0(6km+RrrvT}d-b5vJI8|t=tfPy1LN5O2k8T8 z_Elotd8QVKO#d09`Dz2^%-bxfKxljPjz?{?i0`>>`wJ4y#fk(`(n4l2zKaA1Rh8+m z%l&IbA6IqyQp)?wo_>*EVbYAF4k3PQ-&Z-r@a0uj>m?xR?C{{Ck%3~Iv4O6hR{E(5 z`MZZ5$DAm6KQAjyRKoM^nRvY})FD0bjI>(#Gf^ZsDsaLtwk82;joq!c5hIS1d@_*URwu-*mauil+Iee~eEWKj) zz1UV!Hx=DHRgs6Kde2m2?3b|~;XYr8Nk7@1k{VKUn%RL`(ZxrsKA9D?`*eYH zmA$gkC?vfY04aTX%Fi*`6|PnXJ+^J(I52%{%PKky&C%?8s>i|mqD8ihJ85`Zgy6Y! zGh$GlWhzO8&NGY_QU@CTLfQF>xzd($tn5CB`>EVmvkS!~=hqDLVQU@WfPK)h`tjom zFZOJrGHR9Rx(Rm7P#V0l@M@sCWd7?a+xNa^NZ8&U3k;3#m1(08HOS|4}j3%<}#LqhM>b1awZBjkiX1fq0{=so6!FQfxaLLC*F^zAbro=AGO_M z>wBuay3CeULZHsOv&@gi=`NJ&ZH?_Rvr0enyK4CCd=(40H+KA5AHSJL+5=M=o|cEP zR794QlhP~=_i@;v9%z9J=Z}1*owpC->nGe^MGbJf9A!Te?~y{#{h77%HOi8< zM4AmY)hVJ`#q^AWyO9I|bZJ7bYt;(S%zrs1U^;S=B~I-!5E?I&<(<_A1++?N)6_Hd z%-G>nx^@)^H|C`o1wE36y^zaO71$0;HKOZbpZ{UCm;IFYVU8OLGTE&-p|ik z57_)h;4k@p;}`#P;=|8wmv&!4(RvVQ>FotBJM^5M}BgKhI~r5vK#=H1G% z;fD4X^=AIlU9F-z20&-tSZ@J^@2eNbhn^#oE>l)J2r`m}d|-PAunX}fub+NI&t(2k zjCqndt`-Z414_R~;vQqx9&Y8=VsCF66RP%2@Z`&`e8zeaNHc$;fBvN>tN~Mc`|?&J zbgw4})3kh97pwW1S@X`yU{xX)##oP_g`F6tr9(U2tArM&-(qd4T6E?>$t=T-`3 zr=)7S#L}kxE{`-$t0uoNwflaCIdvaxu$pl%`Zaune-YQLTKFGOM{QG;hdg@@z-yP zknMo6W_`3D5O*s*t*VWQVl3I7xulSq4!X3bcs+V@&oP=IS|?dW8q1U6d!}a$({Q1v zT7%dT$I|=oMoecr;f7dhpGig#uQGM4aUMcj*FlVcY!lC1~`2z4VZuy_j8}XuSQaU>h5J} z=7K37Mia{f)v6ot83U1BkzL17yJwd?!`>=$U6HRV;$au;k5-)>tPUiU9x_w19CLsW zFm@3E{wXU?lVA>jGyl|6_qDI?@AxAFMa84kNlz0g!7zWF-~jjKEt89 zfIix*8hv)#5-@hh2&eo@IfZ&ICe$CP&b*ytsCAC;C1L@#h1Z)(N4c!<>yaD9ja%gJ zVVTzRYf=@VEJ76LLq2<&Thhj5d059z7%!CWZA3{g2wgHyYEWFr)L0jyT#%cWW^oUI zP7hCGw{cp-I?ze%nQ6r^-4#ZL+Cw6i#k+@U$Uu{IU|jt!ju10kx{_}P5BXftPtNI7 za`UY;dNe9M%VwdBm2Fljc5;Q0^s)WegPpEywsHrZo`P*FKUnNFbfJV7HITr!kosF%%|GiYT>WZeHD2R#d>@TG3{jobxF*O1za>qT_D@(D z;jfa)WNxz^ZV#|BhS_I=-w`|xVm%vrm!w_vtqe#%Em|n)0h9iJ0Hf$Xo7ew;Ga4Cu zdHw!cNfY2$@RM#rONd!M@AgHflprvly}j;s&fGy*AK|YFv=iE*&Np9J;69X77G5F4 z^^yK1Q>6?@6D@$g4F~vRDs0AR2yQGjEGIxZa3Awr)QDBTp0)aVy`V>$_Uqa7ub1&R z;RS(T5&vtphQMy5L7E>=xO}i-LUDG;`E;6ve}VTB;>q8Ch}-eAn?iLkQ}Y+xn4kaN z-~IQ$w&9=6p9}aRmO`Sgr967|g)-OhP$?6rQbrT4gFXx|hZS2L8l%0jY_h}z8Nj_x zA$QSI{d)52RX_e7t*%A{~ks_n_qWZuod5=K;TArY@R)0)@^ryOKf2S?t zKk@G!%S}pQ%HNsrUc+Q)<#Hb)wb(p7I2o*dV?Z1czbJ$~YWNG|_ltbQ)3Ysid~&vF z#upOjrH@uH1lo88jbjzDJT~}<>{n~|_oBZ0pKqU74vXb@(vK!H-v=!i%qx+gGEu)y zLLW>=d_#Q)?^*m};r^DF^sR}Y12k#hl!D`-ueuLV571Jjo>U|1*K(-P17=@X?SocR z0f3pdnzWyY8fv!%zV{KiL>wb0^g0ZAm?Phk zFVjDNMrX2rUH;qwfTrR8=g}ek1CoIr%wK%VGpk#DLw%&Y!$XyzhknzPw}-b&Qknft z;Rw)g<9b}k*S`}4JijJJ%YBg4XG|b?E$Hhby$3y|(=f@?vkw9)KD(W&c2oR93oey` ziC)jB9@7xOREm{F2JARYUn_`1wmri(+v+ao`4oET?t@?)g7S~8nkKd z$WgJAJ{}Ah-j{u=X8rsewc&ovF>`W6K=U4N+<+^;RuSywg{rW6A@h?iJ6#}cm)SS^ z`aXqvbXG(0EXPQy8iC0(?yg;*tRHVKbbo4ww3)T)a8;_2sMuar>gVWR8k{-Y*YmhL zY9Kg!L8sVuXHZ?Cf>FfYkkUzhs}p1gG>mSL*8u%Ks+c@*6L^CRx;@YkT@Y!4yX+y}Fk8!nNEV0!gFQBlAaB#YlpKALwm`Fg{M~r1ETh(>SE1SjV>8X&Mv7{=5lxkgp^4UJ3`M0k7;Y}4OgcbWCGY_t4fokzzEh(NDUK*75}nk0Y<#W`KEj>)Yr z0-7}d7AK$~zB^KNq6@j54A55R9yP(qCPLA`Mo(n|Ex5w=h{s?xEitI(eUR@Eh8x$>2b~=Rqjwr6b>>n?Q}2_zY%EXf4iz3F z21mbmV{1qF^i(KyVvZIl`E3>u7~Cf}u)Py*70b8%A=Me4sVW2F;Hi0Zmn`N!)pgCg zBd_n&@=xpbZ$2Q9o7Vu+*M)oq=Njn+IiJi|xuDdE<1%v}Rfckq6m}oB>7*f`5Es^Ba0}TcXPqjk_T!_E&!TtvKo;oF~3Q{BXN=Lt{f055Uoa%F!C++q<@8(^d%wK0a z4g}qRIw3kq9nhP*cl??&!F2aP4fmm}=a;Z^04F4*7dHF!r?ThIndG0Uop8jG zC&=<<6;8E~BXTmly9DAP3)^`%sj@UT$v}CZ-;aA<_u)nh?t_wo@DL|F)(a1M`_D%I zAWwXUxI`KV<2Lp2DrL4 z`ki694w)bsE2w*I|3CshJpSIOl0bjXch!AYS@%X9Nx!BJctQU;6;Ki-1H~Rl>il9} z#J6P158V5+6~+Jlr4{|wgwTNrxp>L{VVdn*R@t{o{y;|JTO?ooO4T3%aUk@PN$Vl{eCAT$YDsTU{PpZ zLpp}NA@SL4h2Z>lp}%5jkOrv~>Aaz61at^soNa7K=q7QMp-pi05i`O*PMVd77_wn88z`kI+m8Tk#q3bj1aylDG~q3tc_xb^G1fce zt{bHg;wx=oaoyUNr;he!L8n94H%iw7Mj&aWbpRPD+YorQXrr*#59o>hb>pkndN2wN zMbdBTn~(qun6CgLrG1dd3y&^{#fwi>-mvL1g3KaYWdbJqLHY&oNCR-hE1Hs&1DQxHR87S7Q5al|$+kq`YU2skpzutqlgFrXOv^$ETY|g{aSs)gD<+R+F;6xXd=I89TQ8kw)g( z3a2aLI^n$0X<+a$uSl@#;rxsI{OQv7Tui0K7sN;cP&!(_Obh+GZuNJ2{VjF6p6^=} zc(?2i9f)sr4i2O+e%_8h)#?5Z2Lvvy@jp8ce@hmJ&hCTyD|&0(1l_J>R1 zA0xkF%zYkXU&?)ija(qG56jsx+35rW{>z0>nZA$yc|^cZqy7)6fWNmD8F&_y!mY6NMF-p-POEQze1obI=nq%e2c?94 zkpy~b*#OwUYVwQ`1fUW>iH4y*C!wjv$hZ$DU@HT4?qxfwv-)RWzN4#6Yq9<6|xPU)Ra7kLjbvW!Z02HRp$^V z085ZDC?p$K8!YFJ9g$Z($E~i`=GYGM+y|XfIK3OPC8sA)a)EQY1bp2;Mw)e-R{#A9 z^P+i;AEpp0;Lw!ceb~6%^|+L*KYspCpS5-AHQCw zz5a&R!9tDPGy2jXeW*iW8CqYq+e^-_G4LKEYKU4At`@(I)_loBZXr5 zszz<)5dR(1o9vIyP5O_d1*{t(7-(H>h;A=>wYO~^EF*uNc8@efb_?;cb zcP@p3yWz7l3_xJW47nQenQVwR01eS;izRinL9HKGEX6dz$tg4hx5FmQ>ekuHu2+av z28faPqo%pmrUG(p6F9Rks+|d}8WluQ!`r@sbmVACx{h~Jk46!Y3}^hIR`^ejh5p@V z|5i~rD8JcaU zP;_L{)$<3YOm`0JQtbp$AqU3)2?NsFl8`94s%Gc5?FQewE#=XOD5f=QHQAsF$JM~G zMBRtKz$xxpyR|b+v=$(X+w(-D5stQ;$NjV(1>k)0B74jGGMnNrr3v|^v`$#gNWz=v zx3X;NPb+2nzRBbjR@#V1n6=V)b`#+!Vj}a`lWPh|F>=7iuH|{t?K0TMN8|*{cdo|1 zY9KJsBzTX^!bxwy>Kfh`Sb;Z408QhL>hr#8cl!Oq3yu`U%^>JUNnBi)74G!QvcBo^ zDxGogTM_^J!iY?e(fVUdz!adVfJXky7klP`=}?mn03pFc;3e&Qj}F}Bb=Z(Ppv4mA zwt#^RYyVJcpwAZt_L%u$6X3zx+zE`#7u`jX;iR!1zlMY)xfvt2=Y@I;&J6qkGdhl= zAl4vm!lZDVoG1piWu!bU&SEgq0$CJ3fh2&>s=Wc&2oiBn)VZ3YUe_-@4~>Fu$2@Px zfg?e;MiwuX9h0NDWVQrAVMH$@wS45%2FjV`${s4mTs0%Hy(>3)!#e4-fqY<8ZUmgF zqn0(;R4UiDh>o|kIrCa?n+oI>qMM)-WaD8k5mJ^BHp9rs=tpthG2zpTYwy?dmc>)+FGAE@wu%O=iN&YT~j`l9T>ELzx;&>#c4dbEzNeP*P!q$tggWc~&) zUO;dlJ{>Z5HUb6+im3(ti_KgIV1;N}X*xIx*sD=Vwi9#iLsi4#1cM)mir5#O`p zw~V-YLB6eynCCns=~0Id4)Y{h4|^$mDX)`3&ED+V$a|zl zBy2D;%B>VKD8u6SmK1BFr6oh^2RaO50TJ`lfZExA`V9R$w_^4*&+85A$J(XJw=b3h z12}Gnf&BDGj@0+EtBRu0va2c$ia<^6P{EtX=bs>bWC~G%ew}nXB5uj+%VcsZDTLbD zf6Mjr)i`{sA^6uW`rn<<@{?zaPhv&M6)N@nc<4JPrPjmgj*G^{cJN^B3U9&fw?o{A~si{RRGl19=HNf5Bf0i+>KE zzmdP-U(*u!gwS8Jir<=wJCK?9mUJ%OfBr-N`CBD_AS3ZDl7Grs(##mIO&TW7<#%?w zadGIxLPCZof5{$=pO2_ntj{Ag;=E+K0Ir8G8ZD$kSGUwVrM=|}nAU7^zzq7mN!{d7QMwDCAV0 zL&-h?U$~`uo${d#&Oo_3*qpgR{f&OCOwamsF!z z%ze=EC>f|Pt@uRCutfXJUWQw{2C>bkiN5}obLTjPOjPo7m3|+~D;T>TmW_h|cEc$JX!D~rWpREXG!(?xU z=~aO&H}c!cp9@*B&75H~G(XHqJKGlxRRr~?6?3eMM6J&3W%|60=JgON4Z0C6D=WoK zV3m)S(rCp#<>wr2@4s0HJ+DTqf!V%SA;Z_ske4$iT_-0XQ-Q5(8u@V*QfW$ zUaw2r+Fj{VZ&g1JrLp^va@33JsP$m6zoe7R`um}dmlKF`UU?g62S}hV? zIZNvlQJ+3otx9D*t^JrjLZ4ZS;rjX}Te9L-1v+cqQ1$*kXkg6e2CAEQ*;2Z%^Fi#$ zHTKxkd}O<1m#DY$*ywA#o}axIeCCYc?1!81?y2%}@E*x1K-UfcK5UcL+%W+FAfyn0 zJY3cX%{uT~yjtfRjIJ0LELKH}5#jFF>Uv9M$Q%oA)0xh5Qr+7r)HIT_o*Ih1@qkY= z`FbI-=V{Qrf$f(_%Nt=U-O21%cYSJ$kUA;y;f{o|4B4)&niCPgl} zyUDYLPRiKZ>cr0LtIYWV)9IO#RW9MK`0)?aSw6b{5uvh?0HKBH0!|NOy7_s9iVg=+9vOL93B+)S!#f z`Z3)XF;m@SFs}fE)XN24iPyUt3U(JWk~dl+>tDY_%o_#X{Y147G687!32=7O)JDJ{ zb9jrji`f0?q8H4ozH$jGnK7qAU-;6}l%NQ7eL0KK_6hF-W`k!MAXX)ZX;``_!JQll=gd1~oMB9RJK_St4BEW2goRx&uec*i)w}w(+H= z$ptDtk0e`}OQG~qTw8vT&}0d5X-=p1gWNA)<(sIlw6zU}czGeASoe3ZnnuiZ#! z?w)0d81}r3vfX52V(6Rq<5Hfrj$SeOx~GI^?c+ zE6EIEQe)V_uqf=s^E5}svEX61Emo9{r8G+`e6q(vbVLCBKDjalQn!7v5@tr3ZZr7O zMT&HRbWX-F%}>n3CHaJ&z{mWR8*i7F_X6NeiO!P}Pj6D3(L1MCy7JjS!i9xtB|C*| z>I_;Srq#`EXFd$EhI{CkDZ}SZ5n<%dEd0UC--sAs4iQh8+r4D?nCfoZwOY3&t_mON z?ZT)qkW}8gJ1!qG*O?8jZeFDbg!g#)deC++c*ehCZK;TN%SfH%BvmEy+{*K1>jf+O zXH)@OPvFyP8D&2~&w*a|pM#43=HCbFiT|F_=zEb=e=U~yy~6W<%e8Oy+7ILwe|Bl` z#3KJPD)+YtME>2mZzC2tkeb00iyVL^|5;bz8;C^?BxQiGpY&Hl=kdfMfKQDlOTn|o z{1?*a{5fKg1F1xOn(z z@ix$fV=@FqUCi5p{Q6XmP>N6Iq%HHAwbn8B9cQr%0R^0Wify6`j~pK?gunw za0EQlv!T&}w(FjqEQ5{3r6g$gsMIdZBEqtIR!I<{C#6J)Irhv(4dAf(>~Sk1o5na;h(QXEw3r6AmY6wKoLH=1XF_r#If7 z$GlGAOG3=qd0dBqy)SZhfQsun&Kt)}CqZ8U|HasC@Ub~J&wfI3*W>j)?+0aySrU1cj&Esea-GGd2SJA-ZeRa zqq{uOVO1Wl4i_Q-||RDi^oyEC-1wxK!QmU6JB201#7~uhuoCu z;!l@W5q^%Akgr~@HjwlYl-`m{_i%XQNgvMF`6c-78O=r)4%^f%3rV>Br??)SMy7Ll zc^Juc%f!f+dWyHILcnp|ESJy$AFxM#HXS5Iwb#cCimhg3TyAyeQ3UL%Js1ehP75_d`&5;KyDvrDTDsjSGP-a5Q zg-~epZRa+F$!FqwtINcxZ!3pkA?X@s9-a9QC~2b~tD@(C&c}KiL}L-d2mPziz>AF9 z^sy$FK2$fFHXgpdMdByD+DXuja;g_V&QPd(EPpyL%wNWb+-5ZSoL1lZ>eb7>0^=Q= z=6%v2z0p85-ic&3WTd3dRBfj*#U5po*yVjtlGULc#GPrew(ALZwYq+JDT?;=r8cFQ==ALS6@*dYv@^&v3mZ7X&?twS? zJ}71mHk99h=2u#u(t$Cvi^?xeX`$?$u{L0T*oG7pYWwj%$f7WB=YG#=B`mZ>Jx8#e zx;)yysq{ENY3y?ty4!g!&{Y!MgyTiR)2(?eCo`UWT)Ax&pT|Awi5a1UU7CYU-o)I- z&2-^FMf)J;!o>;I@O;X6+=;q4)9NVg*ik{m6L`B8&?~H>B1Oe|)Q9{+_sF%r(Mt#x zGro6Ma{WgiHqsnv;FvgS+}x_ak}gt^Gry~0sB+nj?p;bWXfBuJ^1R6%k7I@c0WKjc zG3l`q^6BP|iCn_}4qm8qVSDkdqSU2O{sqXucI`;mYMKHSKD zq5Q7ER;CYg`Gs&mh!pSV)#Kij>ncwrAVKu%6@CU)o$sxNL2K9+fuf-0@63BJGBrxt;+XqeL^g6H)dTY+}bw{s_$U22J zr#kyTb0dU1_tpoc#Rb2kUFQUo`ku=C>{RhMP>=A$?CWkYYTm@I=eoiN-mZGCInS(+ zI#%aQtF^sdAxW7VPA{%hamAl>p`E*+#_`1@5KQH5GFe0$sbo-smTHJ$ci1$AJuUHn z;N<10(_Ql^Jj)|k324;k*yNuzJU=IU>6q6sPwfI4%2@;(2NFD0aBecAyJ2Kh`)dr34Sr) zw*g)=;B_M28vGX<$o<|O8}77xzqGKwM5XZWC>H*1=Lz@w{vXTp$p)Vp|5jEvfeek> z|Dzv7j2WXtCNSmi$GNEA5*`3J+&?SZO&|9u?dK_rk*TV-e6gn@95iZu?~-C(O0&iM z39%6yG;EtKYUdV=qe`~(G{2n`$oNLSw{Gv2kIJ-C{Ci6;OTl=JDzUBnaio#HC3e$(NB4_K7ajHMQZd4S0XQr+!a8lQN zqs`lsaAeWYICLGXHXwOZ^5W@y1^VX~yk1L`95a<_2=Xgg><4BY(R}9*t@bKb7d4QZ z=Z?$wu{t#HUCbXkiO8=4pOU)eV(X=6>PF!%Xy_dvl}*^ooo#Qaq-1TMiH_kAM{#%F zHKs*|T1>r?pRaIxcuhl?Ln5w`kg&3vhG5R+J3sNkZwT8T_;YKeD9)FCAJl#|5xWS( z67VkM?&(YkU>=D#d;&7J-Nzp?L2}c=&W8Lt1Mo+$f0CljfL853NE=cPkVbxEy-(b$ zf!ISE^+l=U6-4~>qZK#tcIb19aU^*YwQd)u=bg*(TqiN3$Lib*H*#!DHjY*UY^?O$-a(tFf*QmO6tD4?(4qp`~E)P-|zMO;br#oJdfkEf8OuU89#pQP-u(# zT|*yp-O@b8caKOb#F&?Qad6@u@F9H!ZVA`ngJ%Y1&1B1!IV6Efbj9v5i@ijPlRzk|q8e}K(gF0em1zbeqk&GmsFS`{DTws`I{<^`nvz!H;_X&AX4{dh}2$`LV z?6+igIScK~>kx4d&XWH?fgF$Es*rT22v(gT_rtU9Z$Dj#;y<+CF83B(gH`^TK=E57 zw{+$L8T}B7s_1qPSB^8Uv`Mcv7w3UpwDEmnG>rj~{38-4o_hQhE12B921$Wx2FbdOl!D)oKAGX=Lup#(xHQfqG7qZ1L5 z&@)bTCPKy&*8NZ)GbV>mDa7`8Cpq{@ne!;{r+hffFt9 z1R);3ep|xd%($1{*1CUs;=Ly7iXqKej>bD_p97{uNdg>}qU|L8?Byzk56PnG`aMK4 zA`$&cezu;gZW)QPi{X+tvre61E5CaeXEmx5k4kX}>#rzWWQi#i`RMq_kpIJe;*rUQ zo08sdUapHzjE7PB^?(7|f-`iYC=GV@`6T0iNrTtg|9@djDB_ZkRYJqWH)x`V$)sv4 z`U{IS7*h#)=4Vfn%pu=pEHlTiK{AAadSfyYOo#aHA!Y>?*C5wG_xnX9;&QX}4Fs2i zQ$5eLPm1M9O0-2Jwrk1xvs(%R-cjSWcMbA55xuZr4=juPC7Ok!w^92hWAkTpi8H5| zsLVFrK416y~3@LX}d%J4suhrbY zSY{F=6I9<=B6a{-g1$H@xeHktpFqSTKBRczg3MX-0^=TIl|Bufl#@+1*D%u~w8*6= zWNEv|&FqORvJ35acG&0K;RgmK8cd{9>Xie?yHDv&Ki{hm4@csBP4FjX#1i#iAE9}4 zzF7~t)W(PBZrF}&2uAjf!f?qq8?jLGp3aZ>^PbrWbuaVw$v~NERrUGE*?L1oo3vB#3y3Y8OY!*&Abf)-;5`G!9G60%l95sW&`*tc395xBsl^qHL|7(Q>@*_tjqK#li_2qWBquIx>(e(@$Zuh26s zJyt%(%1c(cTK0{&GPw_aAGp`8q7ngz4u(r(PrVCvcw8+Zt*G0P8|@z{UbQmG);9~I z8NKGM7dIMl-Jr$%Mh>-qDO0;RCf@FDbA~c`of{)A&b5Esped*3RwOU+{K3f(2*#K^ zU6kr+TADWITuz~E%vFKvvTgEJr2riP&&U&;hzPhFV^RxM&GPDZFENz5LY<+NX3(#+ z$GAT0lW{w?U^ZjWqijU!@S}P0*#1CITSK%YcZc}<)e5>Wu}D6}dLKPYQ zzci@sdt~;_Q$uq8mAnAKjXwbtXozp=7BFgxt{PW03#h#HL<+KA<$9<*7rz}NEa3=Y zCSlG7A??rVX*DxUJf9{^03(tcI}4t5pHggXQ&Y+D8dM9Ry^v1ca$6*6GA%8&Puo=F zF;lRoTq}2AG}AVBj*L(u4YI0#4Pr5iytwi>Yhs?4R_WO!0|P_*tRBmN56vrQ1F2}5 zB!mRs9PD4+DPn#NzPS{N;d~0=XoFUnV%XD?j#f`4Qq`oBkiL~GXw83q{Gq_;$ zS{-Lq$|yClNA@1BJYYgkBSn!c0wF1Z*d_f-MFP^b#=obc|4MYU<+Iyz8f*2~a&G+( zmNJq%r1>8@wMG0(>++u{ijb}~{g1Bgf8w0~H~$9d|0{(3M`ieHAuPpC6F~N!A6ktK zo=-VwCiJ?2m~=b=w)?06%7-2n1 z9eAFY7(dVd!s~~cEo5!*Ymk+;rY4!vN_N3ifVLQCB<;x2O#c*e#r(!2XE=|u<)U#l zb%7)FqOng*B%Nx@-Y*w|JPv-Cr+2j}j6dLsNCNkS=zN`{ZRB2A>xLzUSj1y8>(?Oq zI%^O|*eN0%^6MkSOuDb{39$pyi!u#M!3*F^u&fivA`}>9FC)Xa``>;&9Q@))VobkY zg!ze4SrY9LBtheBQ>=M_P*7*##Uw|QJbs$Mr>-pou1lI{M2{JB->0`=;qj^Xa!o>M zTYO8}{n;t2*#yf$UE#}Q92G(JdpL&M)=wY(V-rFu^&*K?`NUZ_bieH8Wo#VuKlS=^ zQN^kebpkaIio_br)8zZoVIg*>Kd{RyS6~h{-Oha9r1tsT_3#)8bjVqCIrX6TN9uBq zes)cw+5Jjp>@t~c`^?dzo2T(gX&k$lc;a+v>YH#tki<4c%0^u^U-L}wgdb{}bNrXR zVfYWfK7=fdbrl%hA+={-utfz37@c}jXW4eU_zs1{&eY8P>MkQNew{W|j(0NjnQ@(| z_v9CW!c0h?~I+#^}061tUVA^&yp*%U*0Lh$#M8v!~I98o<$lHU=i(wq#poYbk0HOrm#I_v4y z^Q49Lf-RlOC25b)L+bh~6vYt+EtHQK$B?Btr^hvX5Aje(R(|2R7y=aHH!2Nh{V!Oi zpDmx+C|t@ao3Kau@v%eZStnX_Bc-jj>0Ho5maM4U&a6~XvfGbVm*nUdSMEraLrUk3 znGRE;&MKy-*SDF+kV5%aD_2yvKh$WRdU}W6EdhUQ4YFaKYJrab4{P?*PTl5!ZF!(I zzLFBR?w)wR+1hYjgTds_XPhw2d1m3QUEGNc2jf6e+|Nm?1Qx@J@zl)ig_8mB^2Kb z^-?9STkl^99Mlf+Nk!K1;TY%R@7Ib(kc49pnxqSfCeD_)Wk13K(e`|#C!LD&mEYWS zfu!=XP{ZMXTG?^s)+HErj&F4mKSq&7ogPx)uGUZO&TT|dr_eBps!;_q@eHo-nRcjFFpsu3A zF>uv#H~t_M+;*}$WPvH2qtI#KSa~RYt8pxY@ib~!=dG=lJ>IbrcpgzR8arREB(ANs zf$xubLRxp6`0NS`vDK(CL14kBy=Unf!!P8V4tf?mk+1?zZxo81>77EVs9zN2=8B1a z^@nSlrsLMH6pOsrmiktkC=o`$;{A7C8U{zny8P)v8-*C9YLm>_KRW&OMj<&*BIPwX z^1Rt(4QCZ_&6RlAqhvv&dzP{Xs$3!T`Bx%@@i~B_0sL`SlEFdH^`QKI{#*Z-wUhIs z5{Vi<+7XrbtTo789XVtopm9>cJjJf0^6X2{oO8@Arz-v^J!$e6i zz1h z`J7;g<^zLCVIqtjj|{ODtT9Gom!TMZO46U~AJ2pIo;SW$M?HT??x1OM3mQ`ot6Xlm z?gvU1@@M}*14wjo!ITMTAP#v*SMg3~7~T!mkM}&yp^~P{PLyOJG>q|Z=hy_|aF$E3 z#AN;0m>6H~-5Vv$U(1~}ZD`CVWG}R;JkN8>$RUf5#LzOa3kQDsuJG7QMpt8SAj zN=gFPsE10NHSGfh%@qcO%atYy8K{{X7I_4TkQcdOK*OO=QJ0+HpRUo*6o>ThVdI5f ze8?TmriU2{!PeyE6Ua$@AX!^zB7+xZ=M?8YuAe;`v0pv5qL1D{0^D_t7iW%DQ^J-bt`}YX-uSqh#M?Xl2}Uv5M}&pTIWj7^UkyJXw%s@#frZ4$k1lHN+y#9JbBJ3@IGW zlb;-%0Zq?-6G$h{FkOBCN;(?hU+yJel);G|>J0T7 zer6nM1D&WYyex57slE77H1%^gNryu9CgkhWkqon@XI}P-r)~FVF=tZWuS&J6yE5l0 zj(nh7R_AqVcG|5e?fl7Z4*y|m_6e(OcWq7zbvN6=9#Qg2#Qq%*?q~CeYl_>d`-LOf zi(1@Ryf~zD z?p2>NkQ$q<)GV^z{@&)J>w z=H_glk74*1-O8amr27PR^wt*#X7J$nW087zSmyCU{kOa}Ymmjpei*hSXY9#3oPwls zi*a;D;g-V)i$q(ptK?ghNGl}lhem0IP`(5zL`pFi=x5(iU|80DdFgVLf-z=RNS>C? zwibKOONZu>)qI9*1~0B<4RWLbM96ta0#|^$q|OXD7^661cnwl2mN+JiF!%&|-3fGE zXfZdu-}6Zc2_9fv?kg+;@<3E)Adzxi5#buEf;Js%kV)`krtnr95^Na$Fd~~8zu1bL zxrxR*72m~aB;d*vXC`JGKE<21*i1yZl-kYa9%Q;+clXifTWC#3(2qeWiGsop_-+C*_SFb&E;cB_=Y|7zeF+fhKXBwC-QCa%m{3NhD4cYr_uXwA zdzqE-1WDnuecd9{hoCmlspvj8*YV=7a}Kf=EOCp7rOH{sq^nMOcxS#<%rf)d@Oluz z=|=+7y^$u63_}^FGi(~X3nHf?#Y0;vznDGd;2ICdkW;>4KZqHL{IvS z`}J~86eCbP@~`cmMHc#0+!l3$J7N=v@=HkUs9zJdWsM>|iWb`s9L^)C{(m78bLoeb{F+ zpFWO( z%T@a|NVCHT>9om~@QeSu+Y9mD8og`p`|u-X*Kz$31RdiCIo>f!9@=urL(N5eaSEy9 z`y7>JMg(drV-ly7EN9XRaFv(@AB%+s22Rh(U8b%ulbs#7sUxJEV4XcN#DcA08r7pb??G#5^Hsu8b47ncAR(6p7f8~Nc>GjbBM z2Dx}7ni}5(&l+ZLnSO#h-Iqr z9mmk6-TBm3V>>6#_64-1Ao$(tMT;7Cq`Z)`K5#+oLFEgV6e5(nqa}L-I0+X^0m};d zzHeaR>AruEuz@!JpTxL4oQMJ;W_rSGWPDG%F$rt#Ay{)x3T=6Nuh~pbf??o7yEUkH zxn7WgxLD6HSBN!0D^L3sPK35xDz1Dm2ON3FXF)7q$?mv3?DXSuQY*vb*PR||V3&`& z=4|XFREXHL$X^^7X9DgVna*}#Rqh!G;sfAUXV@mw-JsGmXI2Hvo2YL*0!e&j$}>W& zMUc2y{FUH21v`DxPLV2DC|0`{V*ZegWS<_J>*t1LG9^N&yF}J{g18xVhU8t@OrDJ{ zl_h=GzE=7l8A!}!kW?lf=gt{?DZFTXeMDFD1!_0n`Z!LWzcw{ zp0d=LlXV9!pnoNvyuJ8+8()8Oc30$O3_&-Q?-a6-c?wotERKt$br2i)EIKc3c1PaQ z1u}gv_bl!SEYdl!qT9-**Sn>1_nuC_N{jnQ+hRLBMH18>;xJrdE^2OB(b03XaM?fA zVh}x=^MM_phk8|9tXtwifDkY#u3#|B@-o1{a>d+2iU7H|fO2=@TeS2*W=C3a#EN|Y zcP_&aIsNoKpafD&4E5rd#ehk)_x`C1 zNmrTzw}jCs?>USM*>Tsn=G-H#gOfv-?2!|FZuFCAQrpaA2Pzh076IdCi9*9wv?~mf zc6UBwAI=Fi6OPvp)4oy6G!(Tul5F>WnL(-AU9uu8+gmBiqxADl9*5>5Y`*SX1Tp~1 z+lWXoQ%KAZVySBxEPn&urG~hQ6!l2G7rUjv^asTzM@zsK=Wxm+0CeQ&dD}6KK{PY+ zOZZst;xveeX&TAvVLOWt8%2>2TZkXM1`xT+Y=}>7ENt-b=TkPsnF^jy=>8aST7deE z2qdfk{6;`WsLS3NxR=WfLdF_o7kxsfTg{>+&(dSrJY;wwLHmStwrz$JD1Y+Iv=Hwi zmieuK1agr+U4wW%m{G#7n823C_=sZH^7{k#esai=&g+=}@>t}A{lrx%DxovdkK(*F z7Djd8_+tn!)H>hzgI^%=j4shHW;BYeC zf5~`jI%ilKK@~gT>eeOQY#?W0Aw1!@KjcEW;Ti5-2aX+}SX9C(_tGFoI1RxhOAw@E z)JYbi;*v)TBvP)8h0%1KyLa@<^;rBW1x~v{G!;!-e8{{>IpmE^c20xMHDT1*wzr;l zdXCOaCG=v*zI@Al=h5etW0y4wzJcH0_)d;LNZ5A;u91MOe2xs9 zOV=z&6C;Xa@W@D^orPO-dzXFaS>VQ}K+&kHV70S&7h;(gxx|m0>~@{}QK{UlrGNs? zPsPFS#gx?KHXw@q=+DHMq{jii>sDdCAjeZFDS)FT?n8qPn$btuNZHF|7>M-|-D|M1 zVhm}TGbw zl)Yhw2tHCdUF~W&51lk@E{YvU4>x>?Kig(zwpV87V_^zW(&O^%dW{x(cRP!hT26OK zK$Y$(v|wnoyAD?}2fUM=TZrD>`Yp(z4@*H-g7RQ7EGX^bX2qxRe*GO^u9PE_Bj1W< zAl?5dJ1Z(&G#LfL)|EhP&rtdOd(qU1;3pun4gQE(MM1=Rw9|y`cQ>q`QW~ zrV!=hfwNf;_asH7;n#J0)JM=^WqHUqGB zj_+mf+_9^2VBw`Vidr~Mj4b|1o%Tkk7bUvBySOHhXPx?*XL5o(a}m_?zSqS`H*1Pl zZ1cYr##2S(GLQc#D%#Okey=K~mj*L$=ua`t%tPZ0{7nz}HHgE}*7!HW#PF~u$PvLM zTbHAK9J(wRvg{LfJEzlmmlv*MNtT~0lXqu>9iX2Zo}|}1P)z@-Rfss-GjoADMxMoR zK_(-5yaa9J_tNiOduTYzP_cC2qN;Gi7rE#?PjvG3z-_52K?ZGW2+x+U0`9RzvY#R0DSSGvb z_j>EHHq>(AD$YRvC^_Tva6Talp!?J;9GpcxPbL- zm=}AYsEso|nEr9~^L$?K*=H~zXKb^(d6iEJ^rz7}EVNiz#HDWVXO~IHJ)ze_p6@So9z1}Un zg!L^KX)fXUX`jb?;5tE82fW0L8j>!(CSKKAamuohpjDcg3bBkewgTzXc#f>~m{JmF zuvY6|i);Wo>Q5pYE+8)u98@c}2#3HP|13>I)2Ty<>2@N|yK_5w4N~|-a-evqSJ!bmWZ3pbt0?YDVESuD? z4#3}y=lQ&FFpnha2f5T-mBVnCxyunp$(iaPu7(%_{Jj=~$4aH=i@bbi%P5Bg*_$^> zLlpyxGE^l*ZHB$T8QC~g8)v6EUe7L8*7vKft~_$xrNrV^8Q-(k7e&60DQ1cJV&9K4Zyod?L_ZS>kPh-2r9tc)S)Cj_15~(zguU zdRi_o=Y39Yz00Qq{_ow=JlUd25jPy9&#^JjRG?m93);!xmC}a>t5z}v=cY^e$VV8h z^87fT>L9e`^yEZ$yNTQp3x(RuL$9IKzA~bI1Xo?Dih9JW08Jcsn&U?6VlNh;>c>GN z>4(;-aDsk`I>UN##ie)kf>F;pi2{gT%W3MsscM1zMKXRI7|u2R{*FU})J(j;h0BK< z+2y{X;dzb})Wz%#c#7g2Twu%^#L|IXqovIr_Q>ENGLL$ijyg#PUJ2WojhIA3jhnKD z#59GKCJqfEv4j|R$>Bzu#CeH*HL`vz<_7}~1gz3+L(f(qcN02OoGh+OU_k!nsx;x2ScRLf z6rPK;G4a0}4~4na>4GB5DyaQ+wk@!_Ie~c{C-VBBpy#AlX3p2;0?dIC+{{rsGfyvJ z$=@D5(6k z0F45DOUZVM>Ou_~Z^~NhIj2VQcu+mtC^Bv-uXF!PJro>IUk3ikTTWsRY(DDZYI`xo zKi1T?1Pkj61zcEgzUlMxsvaB72`C!A6d`0lV}f zn))qQY8@jyt0OzbTu;foQTM_TC9_4zz8TrXG|_*lytdI1e79a1%peZ&5ehTjru2pU zR07+uY3oY|=S@OxbY0d%yzf0A#a&NK;p@#gP@l72@vYwM0&$0P0hrK_mKe2%+bIzL zU1~#4_O3zXG3y6H0b2};6dP{4* zSCb4q*?J@90KD9s!`!lDCHI+G;h@9rn3e4FBBY-u2Z{}FBm+FUoaIZ*GF>}6)O<7r z9Clo(*Ff&oX2a1hy1E2nh5LpQZXo#{;8}Kse(I`qHbS7@5 z2na&5sUM`76`f-AroWqy4myxv>vbx!a;$^|x1x@Cof|Be;5D6N3^(biXMow>*Mlk6 z%JyG7+mH4x7Q}_6L>gW*j>!$Wr)YnB=W%qmkKAy;jvY-a@XiR$Fuj=3Mq@3rn>^0? zyO^m;kZPYB$yWZq5yKqDRmODVv_V?lm20Bsi*24FC%r46=dj|%f~G-ObR5MfksC(| zH6dhM@7!mdsgAY?I9tNrYRCR&e!%_c4AR$3{6=)wxaJXq)?Iq!9LLCeq~|BcPMRiW z+>dVteh=Dqv@mC%EQ#19Y(}`bK)|y%C5z;gVsK0IRoU@f3|((IdgS?+VuKzTjz}X# zAuFB5?6|stR;;)0i{{hF-mZ_gc0NQ3KRbQjqAMWwAXjAqtBHj5KwhAWV&b`TYPn4f%W z%#zn2vlH+ou*qp)FFTU(3_xoQUxLN0BtDV9c6Ie4vX+$C0~##;PN;X5AVpOo6d^~? zKOq@A{Vg_McXt20*9h>&e-^C(XK^g>z?~NX8k7khJF8%xlD?4P!5NgNVQ?KvF4G=b z-j1bRo=oB^5_~bnEWSe79&|LabkYc;eDC8!s-5EZKDH0ik<8iOlcWQ6h8|90OY^i@ zeCBbzP+>>`+gBr*KLgxLy725x%Utho6U;j4ibs!e_(W2Kp+XQeJ6Ubgz zm1dm5kB8FhxDcuJY+vfQ@^;8erze~Zag2%;ltsPWy=&}rlGB940a7d z{pHvT0sl>02{<{>Ju5@z6J*qmveN$!dZT#_)W_Lsh&bYfoUOL_9POEEFg74KZ);ay zU^-iZQC%!YjKwte;Vq-bmn9^xo1`Up7V#&%d0ct%b)LZ&rau3j_;bEJKTo^;yGhqC zSN%83*&v65n11KmT+-Z5q?w7U@v*S++s|Zg>fl4rEMVr^78w{UHeM$t{`hW(NG@GTSwb$5QvSlg}j5 zhyMg%slM_``^|@i%Hj96w#V1|yT8F)(03MYzo6GhNz{1%i?T>QE$QTfmdeGyV+LRU z3qY2z3FfJD5?0GrAfOrlDWH)!=FzR!CI_G_FMqo}n}v<`IDM0e?Oai5s4C_A^=@Bl z9Pt(Jny%O!WVZc1CTk0#CEw*;`WN;NXc+zFw7uVfN~RXCvh7H|C@E79YUliZNtiav z$z^G2H@t8yjkH80_j`cL+C(&bgtP449>O$FNj<0=@)rRuLbs@SUX5Idu%bQub6S7e zi%lUR)^H9=Ffo(s_^nm?(dTZ03n#x4z5*?cRy%jgfKEkSetmETd$F$Q7*DvveH3rQ zlC%x%?lxcjpqH6XU+&jrV((17m%p7Rs5!K#dbdAPh7BOjQf@5i1t$kefl`4)@(4B{ zu}D7d3~T}<`vZ!KzWF0`a1u~C1@@A#?I7_v2CE$=pX!r>8NL)7qDLUp2^-nJy z0_Xc#Hcmux0*MQfai9JG0gQDk0mO+|Ti#lo(u5ii6g%*#Ee9`aURq)%W{al`Kr;6gmx?2b2(8rSq z9jvlAXU#~*)Wy60g%7@ z4a$JVdmg<6YFHQ>WT_!?4I<@(oQ_?CRE)f;C;Ilm`cI+% zv{+kL4weh*{@r?>zE2Gr`7emEiBZeTiSR@AZ^8!`?+YC&*_j^b>4ZNC41Ky30S@H>C+7t zV~X$&HLBNGCk zU6z5RH>K5|&JwHokta_nMMHLwLxA2MNIPy7eq+DG%$UT*S#r!nxSoNdWujJGcjo5+ z7@yu0&*Ri!sUc(X%*wIV zy7_IHJfh9@`XL#Xai>1Nd8gM%Ei+Fas~$wjJr(5ks3#Z2U-?|P+*OXr0Pik%G5Oln zN=L@f@|0uMC&yme9Cnv|p>oZVA#cE3#8K^BSfZ#%e+gMK%QPkVUV^#^({aUr`np&yK1vA!St!objAf5$EcteZQ1<+<65 z9#_5CF6Fa%=2!M#jbT+#jkL%~BH4N8QNm|6t=8tFp8Qk(J_?NjuU;J|Uvd)uLS;O^ zcjvp&OR|P^nGMW!yLVjJuPRET3V-^ZkQvJ_Dz@t&r{wua^3}K8BUrc8=L&JJp^NgB zVBUe5M#I@(P4F+Oa{Sak80lX>@s||rZy3i>SieAP;I5ZdlBr1CT^aXz3e0py^CGAX z4vF1(^=d?C0qVXj^Hyt-d~uEFrbaFG;S|X?s~NG#+Y4Rk6%t8^`vaht+Q4cBeB()Jho<% z6L)M?MyR2~IUHW$quFp&Ak&y%d4yUpu?9*!(!6fTws_3ZE3yCAB|6=G!0D6ooT#}@VED7cY7)B@tQk)x&0=6ZyIYC+M0GWG|3m&a zADU}0L7ddad{_=o`#(CMuQ#eI6r30zck4CP5k#muaXcUvFOl*r^~0p)!8gRlW`kKn zc1m<|NttGg@r$X%C(v(;c46=7fLVTzjCGbrCMa>XaBo};Ud6M@I$bjMyU(7i&KsSN zKVshsk0?uW2$n}2J=c2O0`%eRa|I0euqU5(= zIKavaT7KD=Ve>Q~@-+w*VKPRo++X@EFYU)MV-OG0)YW^S~$ti(c zzfE@92lQ&xX#W0KxXpI#_oVdy{rBY}{q5+qINxI&=9wpya<1uej|A8O#t_%;{ZBMA zHu=EcY0ZGP79wNvoi(|YxW>49zxu!V1y{8>SiekZg$BKy_U=Tlfqc@Ih`4X?iQ>`> z+4yd`Q+Y;91MXZZT3;E=wE!gZomL5mZq+e4$Zz~>mG3l2KhKBBJn&8C-M{ha?E2t4 zqUJE^HAs81YF8aec}m{0GQ**-6_AK;B-zAm%sk4*!kh(xpbGwjjOqSgT(%9q`PYp> z>VIBI02JjEMFT6y=kdzKQK>6{gtFc&9aJsneuz3NwI?Q9?NY&w$J+=>ICaz}(~?Aw z+qdl>dEh4)1QOE_|G=yU?AyQlaYH<}aLb8D`jB2}sVns{&%e>98`s-ZBr;lF)dN=f zjDcz;Dbn)!3rg!7Orm$<0CyV}rvM(fF zp82Ae@ctbr8HiO&DVXN~E5j!En{qI!hgQ61?=(IoE#S1zcB_XZI>g7P z?zn<*;o`_vz}42`yF_A)`qv#I>YpGTndaG6g%N z(`}b5l&JDixx({zRmxL2EE=Kg+<}qgqdIkVwE}UjGFBRLp+}8I+e-&@8d#T zZ0@dl!6xG;{T6TnI(ZD8=W*74ULOQeLintK+#2=;Wl*IZ!op{;Ui?}`xYqS2+{ zBx7z)~gn&UkC>_a$5JPQdWt8z5rb;2487P%##KLjveWM=z8f7t z0G$9l&2JsR>J4!FdIwPOJBD)|>HeK28}ldZ+|7nU#~EF=%~o7~^-BeYLX!d0+?Sul~er%Y4OzvM?2qw7Q-9^UM*ER|4 zO*H@uw~fWdgB^GR;Ik=he{45^Eg_`^#E%Uk_Bv>C4YDy#U>!9{`F8!=18$o{ zvHTMcU#^#b)O*?%3hLNwmN+E8PMWP&Al~uA#zWPko_0dtb~q&<9@;+<)a0cwt~OnV zJcNR}nw0fXB@~cM88=rQm&@2E5#!@DCicer-^{glH6V|im@JhD@5(!%$I3J9%BPao zHs58g+Bn3L_*i`nVq0?9o$nj=38KL(OBDZthdoWnQBVQ9at1~{#3gknTSew7`3-Zh zI!(wo=<0+-UNokYZ;5ePePIJ;Lq-RGj90-uqrS_lmz^bpQp?wEigm4OiC?M^dq~nd z6HToZQ_PapEO{KSTpxWaNx36wD zIhamZQ+05jz0)1~&E=7A@JPO^THCq+53cu6+cmTfMHI;5U4&Ort#Hs#1qt;>yW1J40+S%$>%dobHNA-lS_wzL>>mh4&VsOWs7$^Y~RwZ(ylVE4Aj)E z0{qnL>L!b>LG$|NQxBiRLq`e>D*%;pG{}@$VklN3b+ssO)j?f0_u(`;5ZG%1!|@}C5>n7x-$e;d3rzIs0fl`9>q88l5kS|A=lR$E;4OgI zU!gFg`9X2l043hcrU{PLg=3n#O>KMG^Q6dIW+AR*F5UyEhf%!PYcZWLk7jLcN2;n& zvTj?x;tLlEj7)%}nw6O0qlXj3!md8lF(FfV@R_WwVu&Ez*CvLh!fWGfP@Vh|wI}&{ z9`_)G4w5f5>XQ&>2izrxVv1P$kriBc4S^BKL+W|0a)egDQl)^8M8?GtXT3P*x(zT0 zz^4Nf@&lm$-Ttj3)KdXy|J!(ng_|AUhdx~8M0`hz(!oEVS@8-3ye#kAa|$EGNi46#?B(&AVU#AX8k8mXG&bGv;Q@iZhxY=( zwMfv<1#U1Z8{5|)xqRt-E~uRqoW8}5a>D@mQVXIM3J?)_?c&o zh4HLDD7eomUJ31H^|r3OgsCp39hDTr+J3|`yiFZD7FV&XzIr}o(VIM)#GU3|2Xra` z2U!6tzk%MN_+kJ5(G^UuJNw_d0=Tb>eOrzqOQ}$vsLbc~J2`lxYrB|*xNkn0tPZM> z!gPl9T}VqdW!qbj-!>Ir6k_>BYOYZ3-FcP0(V61%AiS!}{j^_zn)*lMAOGByU=aa5hlv$4H(CyvDJ6^C*UNZeXzLqX}ib!hP8*YmhMFQ^VCe z&#f07UbFSacQ-7+sR{>a}+trkIF>XxhA)((adbr`n3d)GL)O z`xdI_0KRDO4DsfDavm@e&7fUr{lmD! zA0s7pP$8LD3yKjq%*?QIF@P1{uax#o7e1(6)o9>VvaO2l&V{CX0Z++0Aka&lUD}_t zWsQye=uRe{mtmqvJ_%W&h$`luK~^g5b+BvaJq5pO%VQ*U{%BEtkSxUF9VNNh!_|)b z5%d8(d2&d=kg?4&HPaiVFxWIlA9)8IiPAtq>9fECx}7FYJY8M77t#()o*0~C^hen$ z@l>t2@-*V9V@=%HW^w|2Qfdx#Fg(!Xqd9ufOAPXvr2n?4UAjjFu~IEh`>m+M)D4Tr z=ijvwdERSp;?BO}&Hhfb382%RoJ3h|*y;{YgNnVC@!Is4SE8wtT&UL|hc!LdAlJv0 z2>Wtc;e36_<$c+FtK?e9k&twdby4qk;E}y zT~NsjwHKBpNSnp^^lA@>o8rrUedyHiZCLk8N4EynaFQ(Hy)nip~o~`um8gR@M+0`6|59n;P-S~N71gWyv67E#SH?CNNyUV%WC^^km_r6jUSVuDC28|a!?(?Qm13L*>Q2983!(Fr-Uf!PZMS>R zyG{fvM|l-=c;l}`gn6W%(9aDsFGuM6yj&Gec2vn`jTPZprV3fez3Xh7I1&o)Xngy& zypdgj&R6B}C6{XTzK6^m-vE4nKT(hrAjBZQ*uGwayfQGtooTjd_Ya7Q1oo|Ix+l5xnu^EE(_PUA#8m@o(WU7pK* z)YH1iUKH^yBY^0K^?YE(b-!w1s6KhtQPtk`43PAl$LoBU&(*t|DI$0r_9rzm=+W0 zy)MoP4zzN@YB#k%+|@R9AuO^s#PA`j;B{#7BE2{VP8lpiN@8TKTh*&`RLt=5k18V) zN;hy6gEl^hfxz;euzsGmdwIJs0Xy1OU&(y3ZZuqwkP=0Z;MlL=5;E!r0%;3#0>i^! zitm4ltl=WiQBjFfk>`C{Y;Rw*!**&_WJ>S5fBvi|xHT<=6_RK}kgU0w<$bv&<_d40 za!|!R5~-9Y-?;`Po4E;3NP5cmJcTDD`TVOb>6umAN5GUTLQL_^zPK+BeCozjFzW5= z0(Nm-z#bx3I7|?qx`^kWp;vc)0MqAhy!^8_qp6)X0<&*?z4UYA8&kVn!1j)h|8UdK z&sWcbF-#x>|Ec&!{zs#P|I|10i_51;_jhkw(nhhEA2No(%1c~QaJghIGBYjZS`0xL z4lK-%!zJd!Vfu4}31J>`Z12$r;5lxM#KWs6f(-hfvQRq^T}qG*BE=(;??IC7-e&3D zONKv{;&8D>6HBR@)7BaODvNHL5UjAzDV-W4#R_!B(i=60g%NNj%Vh)T2lz7sFk0yW z=6FJ(Ay=Mz_7!d{rLAgslcsZQw~mSNkqX!5E&xK%(EOrzzd@w3#- zp<}xijz8tZ);Ut;uZkK!P6{q7co;g_DfZ}yQv6`26n>8@Cm65eRvjgRlN}(_tuq$x zVYxiQdA9QML&-PnA3M6-_Fx6ke)uz{8QK|P!^fzhx{r@_)+`4|WL}e4y&!*GTsT37 zL$cjsZtwKqgRWZqsn_#q8SZ=Q7~TCoEEyDqv=AEUkr5G)MNkO&$~;}4RR>?6RcD}? zo&l0no(+C=aueky-M4^y_(uUL?rV7?<00AzwajX^2AN=i68$5J>wbO3T{3P4hWF88 zB-~4b&0p+L(LsYrMqe&Aq9<65fi7qk0P-+Ksgn)Mf%S}w+3VJz|IB@&e#&b3X7THe zoJqbiE&YPr41u!k(r8VI5Lr73PZ#-EZ4)Sc@ln@w2eiGFNK_wnA#1h+i#2g%r^E>9 zBy3lgYhY=o;tQsepR^MQbIiUYTo97GUvc-FL*7h5mI%_*Z}c9WLDi#vAd?jAQoXSk zj2WR@H=ZteTlfnaIM*4yGPdJ0o&o4Yot{dGhG+RV9ZL5+&Z6AmA1K2*)-ic(4RVrt z)frIA1jmqM=r7@;uthB3-|tf<2X9f1_hl^OTanXWVE9|vr%~=inx-5D#cQ2Ygt*rc zXBx%cXJ?x+ZQCw|2`Go>ev3rcqfu~DaN5g9GI`dA0DMCC5`PR1zJ z%G8Bo)EW+b3>rUniuThr<>7h3C36?Y)w2#3+I)M@4j8c$-p`vJ2oT*B%d~&Knj~;Z z(Up9rt3s1_YNnR)S!LHj75Y}kL46hfkMl12Zn}x2@z|rD6)FAQ3JR|e-73hAV5&I) znLVWOfpv$XOBk5_3?1Oa6SR=M%P^eps;DmnPr!z`Jh;{QxFHBJKLV$0 z);1O)TQa@v+Nh9yu&mXP;`Td2M@wqJU6+AC^Chs zf=?ntC*CL>CDpri>UkC>gN~%D=}IwcN2<6|toC@st?AdFJ>U)`UhUjxA~C z#yS|&?;fSp>73`B=X;*zcU{jPbItf*hWm3b@8z{%QT}r&F9N@ao$6}+D2wC}^kaNs zMKlMmKojZO&1hbOtSh>9HBIi z^(0g`S?cto7t!{_Ld) zzAgRI!OxHvO@7<&^<_A&Tk2LI$gmj|s~zPqhO@}n0y0|$vr!2KnD@!WQgL-#W=z-` zby);oOQCVp+2l^ASX`iVg#IJz%j?vZ-jK=huNn9Eqo%e)l~DaBl>BLH+t}6N288k_ zhEV>@o&0ECGSo|`e_kp-*t)sK-CV#-JOoCxQwFxaPl*5HG{}+^`_}JY19RtC^B;b< zk+f)QDi1$k4R(3~08U4STQ7dAC0}GWbl{3kc(gSN0k41QF8PO%g(NLTv9e^Z3ojFs z8sDxQ-Wz+M6}x12RdjnetOb+lXS)+(uF9xAvZpr^-C#iCVo-e&1CgR8!KB;l zqY(CX+Igiakc;PZ6-{B2$}uY$uSvViLm+9&zL?eLRPdLRyb~r|#Df;pI1>!o-GEW% z6?tzg^l*3N8!;lBI4G9%oerA-IhoPA#sIHgtkkZj1F=D|h_&JEcmZ*SIUd; zC?bnajkjL_E+-o8_}#PN&%F2qAJRX)O|DfLzn}@h4k^rb_)8w0GEFqOu9WeZb|zLQ zO%}SWuS-;OwZ!Wa!el&OI{0pEw^5hFv|Iae#v3nd?#w80_GXFQ`cD7)JJWEZNa_a* zXn$7zriB8`9c`@JXQ=}EB?P-J~&QakWPlx1AWF^#Q9?-r-yPNj^Qa zNViuQme}qd927Uv{5f0jgwy&9hhC|6$)jA;O3##Rt(#$+n=uJgg^!HBMW9x;lDz~K7h)gA%Up8`y z(*H9=rXHbbXN#9!7snSJ0N8vIv!;zq5i0lxrxQHkYuxhB)r8^CaZ0oDm>Q3;>dwSo zt(U+7Y8SP$l8 z4QkKS(q3Z+omhw4A1HmstL1G{%Tz@!o%ncS!h3DUXNW?JkX)r^c=Aa(u_Hj~&1Dzm z<vMxqT2qS6+EwVfzv?`oC8Di|x4g$el{7aS z(?|P-*wu73e4DdAwUGs0fgL+I58WH8j{#y&WJVV9QDw?LvwE?6@Si_ z8D5R2#q7wL4XjpqKdGGRrG3^OGCqMj8qv@Eaz^A6!oKM=?GcMtLgFIU6g%mRI8S5p z7kC^twS)fo(z6}s^geLrsG`>I0|r3T33x*>CHCbYjCkUn^2Z#cX-fD zIx@#%vYgjID2)KBc9cWNm8F)?kWZ~BoQ*%$$btz(Oxd8w;Sviv9$8E7G(^4w^=Hhr zD!Oha-KI4x$aJ$MI~En|bG%e^h|~N1*VFSa)~bKu+xv&77NM*E!{hsD{TCC%-yl4R zH)w}nJA)e{@N=6Y@b%w>tAW_E95}2zHlz&36Sv6x{Pc$jd=sh!jrDKh1Sz*)?yVv; z-=|+5djL**?;rk`&9?yE`;^1a<@LXJ+8yP(HUy~eJT0xclj^JWShIdw`Xnl z4uW*s3f{V-V@r%B;uQo&Bl^rwv~B8NVP2DhchSuVI9sk@u1t#R$_3WnHyo-+Smb>N zJ5R*YL#tLhN3nLTAX_}3S~e$VKrQjt>gEltoqSQOvE+>@aJ3S7^kt>{V{cYQIMO)C zOM;a~&TI=J^yoS?j+v^z#*YKC=k>gLs&$IG7w0Vx-f%!>`Zhq%2CTqkf6o~~_DGu4 zKE)H;&oLZafLtP#_{yqOGnZv)LF_N$Fbd7#l6Z8hByvY=(m6(l%Ov?Vi2*u?ZlSHr z&g(on}k6~q^@}BcNqCF(0bmYv{cQBLd3PDWf^$ADzT~iC^_X!7Ij~-_IFsy zL@8yv)5dooc?PFUwM!JV^i1NHJ75LUOECLlSG7X`oMFW%PJO7QDPzSSpLJ(ZD2RZV zzZ0IOy@{AtnmD`NM)3D&z8Z`LMC6=FH|A*3+Sb#n2t?s6<|;Gcn=BNlLRdc=xzPoW zICr-TJ`Ou}M89|)7h}kLO+O(pFFM02Tt?!2{S9U@Tsr@Q}rtrVoQa9P$f_+ zyqcZ9Z~cRdlWN$QP~C#s!wU~a<;iS`vC8)A7fHx=UmK$l0l zfCJV&Mu~x{>|j8$k)5@+t|{q9kTHG= z=W5AbRGb!qZtA$D9*z8vs9Pt>_IKYVwoW2$P)$FX~4eH3)D3i{zlo0Sw=x zxtUig8OhGIr`*88vpbp>D&yaM$J=u5h7k6IWmiH(2 z7U(GbNKR|>=1QjkJ=Z^CKu=cDXpsC(qnLv`tQjyM7)sg(ZrE;~}_F9^&_Hq?wx>m+tvk^^t;TAP(#!16{ocjdcOCv(W~T51fZzfXcupS z=1vdQk_K7{8lq4jGOEaC&qcRNvQ|)xWkrn%8QIlc)`foMY!eon_&>g{$^WLAPuQn^ zyEk0Ex$o=Vur0Ys+HLe&m%o>g-f*rKJ$3K<<<|?JAtFh^?M<3zQqLSqy4-X@ijW&= zw|8VOLoJ#Q&Aos*D}4aWe{}@yR4Oh<%;=FH<}oS09*CKg5$^p~2HtOOTimrjF+6|U zwEuB?4aD!0kj)O{B*-avXGqggJh_J1?`1(6Vrmo&);H6f?3n+EbWq6q9EB61Hv&Tf z@=^FK-RP$&gy7{$VTRulKi^y|a}rge>=_>VEcCvKirV0VMN&-wk4-)M3P`*Vmf3@~ zt_!GpfJztgJX&-~ zCe8T_Nz60?b2~2lxs9cniiTI+@yVL@S53edTDd5F?cy7~JG(G;$x7ZVq0h-6@U z?1JCg+p2k4kz(Sv;}QKl2<(N$Jst9a1f>sYjsMy`^1E4WS$l3IC) zW6W}eoQQ)@u)T2bZXTyh``4sxL+LhndFLl zap1K-hnZC1IM3>Y?FG@UlFNA7tQ#iTO+@}r7lr=Q=FuTr$)YJ;X^RS~+)MZAIX*da zzu=_@QPgn~9q;l{k33S~-2HDdjh;b)`nBfEdQ*v#)vD6P zX&q+{p7d$p;0-vil}&1&`0(|jQp-vl6RJF31|));-c@Cc#Mz`>KyIxk*g1e(wh- zT+8)1N^b)dnH=29+`7?9C<)~3G2+XkQ~O7cS*Z_%}LUCgsd^ zP?|a6sHt-?RA!y)%k?+WepmJj6%)SuWaB#TVQvx-etU9#6L#rgDS!yY;Tk%aLad)zQqUmHQXPxmY&rO_8AV8abt=YN9 z;|e+7DQ36FHAf(y@-}?XMKgq?fS-l}MFe`kbCsVaTvB zLyC<|B?3l3J~KA>A)zGYT3-d%unOQCIWZe2l2%xcM7;Z$f+og^}*yNIO>yQ|JeGRpLBO zSCZ?-tOpviMr@iaA`AC0!yZp|I}4C1nLs*!3Z9AiLG9xk=*{X|t9XnjfIuSFCro|u zEtA$9+|93SykC-x2>}*CS#jly1?-Pgc#DMPcvASLZ%97RcSDvRh6W7VUtyblM?h@6 z3+Q+yc>yn!Eq$!7R;MS|K>zykRp0Z!Q~ZZ~Z@C0`Z$--xaLo-6XV zPS(prCKPr#aJ>STK%#&@fA9{lz%=uk!_IK9>4@FXvDU&fj|3P&xVU&Cnv6=XmxoLH)OQhpSSDbyE-PHO0!FJxGY$R2A zFhTR_$@nyUA^Z*^OqUfyl{Db2#%CZKQX9sy zR^Yr$Z*QU_6hMbqz+C*oxP^;v zicVXpepRov+h1LOvP#Xyco0o#0?)>r-lkKweU6<3&#>(!#306?b4ln^7ENQt9g6OE zcZUMbi>1Eiks;$~p&=TClDHg@A9OyR$)ay?IPO{={7!Hf^wYkckf^1yMYI*#-AOOf z1hw;&B~?t!WI4GuiWE2kEA2 zq}ePu{B0z|1%YyZFLL)J2FoOMSpDjgBju7#Q$GDN$6F5!L3>xpmr))OJMNYCvMR`u zcXZG{o|NjrloPMFj>Go#x{71<)ep#BNh6Dr(${!E%pCYeaulf3{WaE8R9>z}bFV^@ z$9ozsordUyH!#;oY7wkIhF5Wx<>>>i+}3#QGSaJJ7I)s?>3%sbA^SE!7pH-ZyIpU5 zs513s&5Zy1>A-FnPvBymnoFp80^rtqJ`-A>~TCGU?bzT3tUYKB$=gESGUdNJ{6-vCoiDh)Wi0D28beR`E*CxR^sD zg&k33ZYO`p*&rlvfh}kWojv7?>A07C$~3b6g$}z{n}U{tpMD_oZf9y4mYRXnjFR*i z;h@23cD@^O&P}k|T05f;)-o&)@Y;U7QRqNP(r&wgiU`gSh1SgOZbzoh&J*(6A2Qa_ z*JcmqG8;P2NhD2ub;J1cnh26-u|-LC73HiawZdUn3KhiT6rSqO56|7zWf2~ufBo*b z4>P>YK{DPVc|t8e3%#0@tD?F@MN~7;T=;OP!4sB+V-`|}pD@0?({5@+k`_o%_DLtA z03!DRGP96Z*pv6Vj(|1@qF$(sgv^;&On5_XYc!rR4ko`<6em^8!_u5R#b`@M`kRn~^#zORyd3J+qs61i{QHcB8AtCr#!a4owY@P_ zJfEBRKvDK1veiqZ(AkDTp&b9riBqquiq=z3VMAsfIf&iBUKF#zCAF9i!dz7@Mo8?W zvXMxRzF^fQ47MzPBE-!vWAo4PzV5gjk8nhgnVuAW*Q7w}UKbP9Ra>`j_Z7eUtWVM2 zr?`Q8t0rBZMS_W#d(V1ec!rc<1AFF;6k_HbEK>NOr4T>luzUydBa=0tXlNGG%qra* z!^FLdihrMd)I3>tl;q>gW0?Z#Hubxo{91`t_vs;x6E)5zbjlsd$(1^Ivxq#PN(=qi zh170w;n`5Xv$6Nt6R7l%p}J>2$hHR)gAx6|T;_Jk`MNvA0ryc<+gO-mB0W#N5Ft)DjiI z;x;KF_+8$W%!vZ0iB2)4btYPfbI8|p;Gcu$AtD%WR9Y}htojx$gcVJfOReI9#fK*w_lUQJ=nZv#5eiuP0=4J5Ty zQY^9X4;u&RAJE-4^PM*(pCQ_?o^RGWBj_^s)^5*frtX!0 zk9?2NTWxQZ7K|(R@OL#%bGz-3y=v*^>@LecPqpq3&H#5_3lNvee1?>803UHc z&UghRXqfOgfBey+>WnN!t&2@&U2B&^_1qm%!;s;15;!~U`yqfrhy&@*I9K2DFcM>3 zJ{fisJ=;)8H?O5_?_J@Lj*C7=y342VGvv8`@$(iTaTfhriL)0UDeOX7yVhJhey_O@ zHl&1eoqdmI8}d7G zFhDW>gE*L{sHZ2(Ju@Wa@sVTYaXlXfRAp5Z)zSWv5_TnOxgCAwTo;7tl9}kilg(CbI)aAv|(YXiC>0ePAyP#=5-mV`7k;O;HnIKE zY4>59@x+*e9aZ}~#2Ts_pm9anXp^tAd5$mD+Y#}hRMUB{65sF!adsfOg5&8#E@ z`s7*+fD0wtIpuM2)SXt8CO`vxO{D%$sWR2c8W-veOpfP^X3p{pl8*LDxQr)M)Qt<0 zeeO;Mk=VK_809h!PGiR&Mx= z{f*X~F)|v@*<2ijCc-iewY6tP4Jb<2bPFzQ+lCy8r6`4}uR0$eH|eMC3+|O>tt&h^ zPrLXdgpjtf!(3ZYrrk+AR6=%6FJ{Rhm>0u0C^)Dsn0* zpkFm-@?2~C7(|&>C>)IG(n^qvl0K*0$m2tVB@g=oZvN-F^QUsat`;cq#cVWMY^4V9 zr4;v-!ho&c?hgt}eH?XbVlf7_^C!aJp?c}7oLPRPbb%e5n#Ar#HM9%tuK}9Q@gGaB z&z0C8bhKT0R??O}CN8T9S)^N!cB0!qoYA`T<1S0;^(1Y6FT9XRG5_5{p#k1~CKjZ@ z&2{Wv(TgjY0*tz}S$5UJydiND&TYMC~p8DLmS*zZE zTs05p3o&;(gf%<0FTMyLleH*bMO4e2Y`I7lU!q?Ve_Dh=vJ64*B!LNeAPKe0v=gs9 zTK)PRU#wU6t-D_3g*VdYcGi&CSDSuZ-B{5)n>C(96N1v%@E4^q$WQ{%#iNQ>{9dT^ z`^L$;Lgxm`TvS>$Fc7_zEKw4o7e2&Mmv?=0V!gEVNix^a*o%T!c$t$W+xPiC2JF%p7Gf))3D{m_F>um9usV#) z8{@eY^l0ZTSTW4wG_32>xO1BBGe<+yg!grNj`YDh8*A84%Baz^7eiZ<7g26_n8HKF zX00)+bF-Y;2J;*?ug9IqNLjdur#?eikgo$%z#j)*N((s^t%(8F&^SNak|nA@z$&Ra4K@5)@*(p2 zE~ED08-`n@bHl|M14Q$56n|5tg;$n9V&t7Hj;JJDbKDv9WPvSx7ra{)Bl{81E;+gZ zr}Rn5>fTGlRg8<+(_^NcpP1Xu8l=%`aV= z-9twAKI1#F$yx^^uc^vHWdBZ0jZ^XiIIp|&hrAqyt*w@q(B{eJwmL01iTL8E1j#mC zTG?KMP9nAD)PNB@9X9^Pde|)1*ITt#w!k19k?egpDpCJ*v z;UP+GI0I+LWMj1h2HFKj49F!slN`wxp&qRKEsx)y60-3!6$>0mrQaI}=0O&2Rn53h zM(0)9l%{0hji`wx<6w$xE{`1!fgezJbUDF}CArYBdRQwAml=(nUV2JZRa3~FjR%?ef>dHlfGI#DDJ%yw_|BgrGi zj5pnfp7orNyK6ojqkg`+Xvg@Ih~mXnVg#AfO~5M-NI>R+_%~X`^;8()k1L*>t*PKA z>b0{_D9mrxv%j9@Fbcnx z>8*6QO}57dFY2F7%IYndwHSXN#~p8{RMCiaX*wH?{`Ay;F{NTmUt-lDwRBn+J_{QF zZj4kQ@z^Qzl9eAFxXe@WH1d>xluL01aeL96t0WWVlSdZRJwouFdZU-$`@V(@mpcEF zol6YW;xAV_I*O?=ivB)U6wWtm{EwLjOJZJ^*i*OUB$Oo-nhuEbGhkhu={}LaJy~`b z)>d0$T^#P8LpuknK+_^{0vM+*;rv}{>GH$6G7d5o?oS-4Zzclu#pOdZt%lZA_XSd4 zb40PWPX3jeBTqz>!H#%6%NISns_yJ7A6gI5iC;*1a*4Feg}g1rg&ue2*c7=khfPKS zYd{)QWNAAuwQ_UutcQBM7w6qzxt_DU+$85C?(eDQt(N3<;z2OPFSYxfbBN{6F)o#F zbKsVEirhKTiE%qcaSk(933Z>Nq+8vw`>;({?}5@~Uk@tD`{*o)bCZTcZ<^k~I?s@L z>vLI>^!)}?<1rs1An2#irAMuA#r2y8G%S~WlHvFja#;AS4tU>Qm*a?o6if=+gwMzn zt0wED%MZa+v{Dx$sjp*=F#Zq{j3UIt(AkBg}#mt7(yoth+YUkwX zjT-aZ-R6P`!dgtF+QiU?EcO8$ztix0HPP0Lp=zK?Fuw-NMvV#chzy%?%tUGziE z#mneW7aAv);^r(eC#Av6J$2L#=BCfnOKt=*@3K+uOF8bnYVsvY-x5{+75!S`U`zwf zOYGD7y_+Qq3h+8qMh?y|2h_?45m*I689RnQ7jBC$%R#IjN*ZYZ+C;Ki4Qr(GK#EN- zk~)L;F7{#nGYe)r2SwP3R_>ic$)4D2H9fG8IcKq~DlWfTita5dFm?PB-dn&dkCJmsVLQv z5o~xj5G%}|kQ))Mx2t4b^cRHVKc~5i_J-Z~w8GklFN_26(c|KdpDwscmSA@Hnh&z< zoj+Ib83MQ6CySbSEU5;adA?@>9VEGPD$ovIy}x%)+iUlmC#%c+wrOjP%|cQJR^Xl1 zn3@_Ch2jfr1pn?%nO?P66hQY}_aTuGyQ%FW8o6uz5Yu2zReRx+{b}+}gVa*y7Ovj1 zpoqi;`^31WTez=(zxy-!+2OABW^ckCmyb zQe(aH)Nl0oTBv2?Ds)L{LS?88RJC5_t0A7~|ES#N$DV z36jw+F5+Ql=#o`?{l^=+C0PoWq%6&JdR#xAWG6!DT23G|%C@UD%9?Mx?{|pITZ}~6 z6-K1e^iB5dZ>h6w6o9t?aQ-iX$UoL=2m}3BbRlRpC*QqWg7GZTk15T(j`AD^sCie> ztXYfudzFL)O-b(H&U67V!njal4YMViHyDv)v@#IZ(#zxDbS=024@&Z{fs%}zy4=6c zU!^v1v?fG=y63IyO@xKzwC))IE;uDi9AJR7$VlTmcwIJg`Z|bOeVf41gQ|wjuY+9`36A6;>jguayxl9I-+prO>rZx^9Voev(klkJgHEnI z?!~UuN~-3H7o%pD)80$@+;a!+fT@3FgW&m!4~7NrTmSVr)Qk)iZFvP62yBG!E7@#( z)9(0@?RQ<=1CF&w7j4zBUsL7@ zm7^aN{^Pzeu7A`S?|o8sGi@>!F0bzi$0onlWt->)c&Yjs z>CXWj=M8btO|ZqcXCS>DlX~um0}-k=H~%+M|57ojb2<`Cu&1C<0kBs7RJU zAcm#cln~C-oLCg5Fp_<_EzdiafHB?R&F*>zNTe0(U2$-JP`x6;zs6@>%+lIjzS&jV zvZ?;C$!cmMF?iZ%nqo*e6u_4>L(K$@!Qh0-5_JCeu2^+HO)(tY>y$^meAa+;md%Cc z@bBsb#Ef*H~V&xyqi`oaf@~Sdbd&q|MKU+K7rJERg!occu8#n|OV*6Kw5F ziukYhbpxBik8H)?_3ahk>c9M_td(_<;LU?yd^jA)wweaaok>)mDPs;Np9-NcAX@8| zTmei@8g-faUy%AeBEPd@zrm-8FP|+rGdJ=0xjaKJYMSFtP2;eOYEwtJ?tABig8`!6 zc6ol%ld#p+0IX+a_Sw4pEQLszuL$SdX9&?{{Xhvu@A=P=ubi+A16Gxv3B&&-2FX7S z^rWbvH(8kRQ+BpDoRQmdIR@8tu$~Hru<3pNplrsyBP}`CT<`uZ?$>UTL^Wto@0^P+ z&x`+!jKo*tU%8rm;Y0kVYs*Vhp*`b$k3>_txD6tN!svGS2mtHa+;Sp%30`*oXc6w5{*- zR$ENdii!V!Y%!aW<%TbFelP$=TQsk(54n!=>Sf#-*IoxjLn4Tp;2+Vw71^~oH>FF$ zrH`{54NRzcsgXS7i3pb7uw&&tU)XGF+U@9{GqHE&GPF2;MuaswncsV{(?u&>P)^qF z4e@8l^_OXI392ua*RV|k`=9hL{0w1d0vONISzdH%mzuUa8 zS;i_SEBhwKK&Z-5!2TV5P=2&r05j0)5Htpjvk`_rLUbP@n7<216qS$Z#{QUtf<`)}{18xxxlyyRxWPFd=g=oFZI+)|ZF(j8u^u#9Qv+1l&G!i< z`P)7$W~rbUtVM_*#?~pnt$QfDqc*&W1Vw$pY4Hvf?CW2 zYcFPF8dDkrlY~;@)R$())PUR}gZz~v%CEAW|6SwyIZOW4*Tmmc?4utWMX!yqwvl#6 zEx>}r$?~LC2>ijX48iD9o#>a}S%s_0SC2Mb*}^I0O5Jaih_LW%DmgE?!8BB-$W-Oe zsTl8zgKk_sLej+((mk+X(d@r*m2TTKtpb5qI3c@n^&ydscieZn;e@nn!GGZ&0CQ*Z=+WDnPaV`&@JXH{O4Cyf00hDOn>mIc;78VdBFlf-FJiD)M^OQis;wI^jwT{|z-^=Lq)~5oOXeYG+{teyPVG;;=*oTI#Zz zOQfCD;;TKOVe*`uuMW|u#R6pV4}CI1uk0^BL|Fpv@o&Fu6iMaAxmSkSHoi@K-x?|^ zDJYODY}0Q#Wz%nZY140df`@^ic>Bvn41w4CAAQKE8g^B%EyaP(ns^;D-Q{itf=v69tc9;97xRwTkRhd;V@=eZ(|U`G(50g`?P0LDM2^q@`Dzv!Npow zgU~`>rMxC|hsn`G!#&6y0r1t1H?*rt+xiDSPU?rXFX?J>1nypvlBR+8JqNe!mu&wZ z>f-<4XSTO5@9Vl4BAj9nEWn^~k&L6cICoa*fxlNK{inFn2m$@4R67=HI3~$paZdMi zS7tTUgjb)l1VsV1^R`{ECCwF9fwJ-!Bps&eS~Cvnz4tPc9i3^E5s$;;KLd)!yH?me z3_d7Eqsw#F1=gJ9H)>W78cAo)5O8;Y!-LY4dXaPe(>TwxO6q5b3bGgPmePJ9)&vMd z%=OJ6m33(E5Zq>SHr!?})q!FArLe)b77plj{HI=T?XmoT{=J3T3k-tfT4B@vc)#;2 zlEtZ5(D!4P0STZPa^W`o&EjefF*3ISr!?nP^#JSU&4tc5_P4BtWeYddJl$tV4s!ja z?mpe=*~@tSz9o?2XYr2Nq4Cnz$mzayZpJ2T(@dtaw2Oc(ih$?*>-U_;w>SPpr$F3d ztMG`&>3}u?iF9d*ZuFzwr#Ye~lp9Xbr7_H0Q;*S29_I0{#GKySq@9oLD7WB$EF|vS zBe_I6)|`LEDu7PzDFH9{NH&WN3i>|CSH_IGJ7R1p^CY(WB`P&CUNvsg5N2HRN<0}7 zuUjULv}RFo(J|Hh!;M2I8P+z zOn#um55X|7T24BSK`^z7-p8^3&@?_iS#%!#EM1s#jno6JXYKSR`O)n`_SW)$rV zZ;f|?LWV-J& z#035hgTQ$MF@WxpRTZHaOiYhav^VbBCl~>D@>gdgwJ4^<_o&s*=%&nv29^mrY)07H zgo6pC%xOb+TUOwn*oxB~f|;3Zr=(%eY!etL4v2E?yGbMgdl=bo;Ju3eNQbq+P_<#Mc8!jXE?uy_9dqu}a_F8bsF&MbCV7doB4OqJ zJLOHTdWfPM ztL4Z@Ns%SeyCsUgQYdV}@M^fJydtT#1 zg|HbaZKs{m^_&Gr^IQz6$6$V;c)XX7z{zFrA<{Vxp(@kf7(^kK#j z=_?Ip5!g?DV$@19vmu^=6^sWp)se@`_&KPEY^MD6N}=Z!oOdj>PJnsw1&{uVqvzjw zl)zo5N|?ObP-kZ)Lk?%0x^|C!hR0^shJD-Hn6(eoFYTX zON@oTMv^<}#o>fottIwVwKr=j@u$XZ8z&gbmRNkk`bo)(?GjFk!!KczVUq(_hHM*QK zUJjFtN;0)^YwZ$LuGqytDldMX$(2moz=AV=oR|I6kdoh#jy0K~^2cTIi+${GW1x$T zk%;Cz==DOs%>Cfw*K^DVn|+YQ-uo9)=0WqP>eY$r9K~4e?r@m$ zB{{EWw{sCisr}4;ld?+M%r_M=uz{WjyTkQ6x6^MslJ6=`>FVRmJLapT(`b$G4ZD~& zpmG0EgG74mq%Z3=gOQS5G;_HPG(=0xEoaRsK3psp8B%%o_7?4xYmXfvykoB}4<&av zJe-Kw(KOO_{>JjtJGoR-jNInMW6<+m*p=jl7g%nySKY>~N9p$0KnpHu`&TAF&reFy z+L_cQ2_hE$E?C%sbDcVFv-E-a92u_QJ|- zh}<+K2* zJxptPkYJ0eB8v^Qul;@T+)X3CIE{f&bMsgcDmpnoiNdN1sG0Xj@h;O|vc|p3Iv9yL z*+eDoa{@^jN9;(R?v4*JXlO2qzk&^zMQgN-HZSsBWOy~RJ0?nA45}39CeGSQ)Hkj< z8ak+Wl*K^qiK4}^{slHa@_`7VZY_<=kMU6Npsd z@1OoQwSpsOOU`@3F~um0Tg0+Vf^W(CSI%q5w%nri;N8P4!O#)h1Yh%{wKd3UblG(( zOn(y3SE6(D@TFdjE(WQIqNnbcryB;E6HQ?|r!~vXWy>5g#qzt|n$P(7vMH~(FtDM_ zs4dRl8@gCxn_%~9!F*VAV$wT7a>C})+s?%?sJng2-B-O>TeY0Fg=OA@yQoNsLh@1i zBIxk4=C@N#enK4?CX;m9+2aMcRVIZ1NiEi8OsYWzBbj8$nxbjdDb4{(L^Y#lr(hg} zZHETpzOUnrsZR1`gug)S>fr!Er1gjm^vpe)2$rYV6a8=e7ULo`99Y-L~)WZ1b)s85iRlJtM)MNBC`>VHM3W}N8?d+!lowC#VHFrGCZ_hD| zJ+X3T=9;G+LwDib=a$VyH$U|kX0HxugiGnQT)lfZZ0Q;qO~J9w7@M6d&ZnV4w_Iql zgrU1Lr|3kFnQ$|}X5{@Rbb~Ns8bxAR5w0m}ZERW|Ql&Sp8#1ht3{7bnVANk4Oz7Rp z81aej?FKcWkkj`KYP+Q$;3@5HsNJpcz?}&>QJu#|Kcc(-|6QIS+K5LFLUmh3xu?>UVe4v(9sO@%9vl>wtu3g~lxJ<`qoH z-7F-D?!l95hHly`C*pg|tm!|>#*b(lIwKN|HQQrmT}&-#%ikdN7y>kEGX{x+%-rm` zgCy2EYH2?XYxtyD#U^Hskk)p+@4oIcc{XSqM4gV;!E*aCll~#uDL3sYCP%*AVE8V@ zIenr9bk7v@dI7L9<f167ig$R3``hGksC}G?|CPg_*Ts>u%{mxM?kp^uS)mkT+*`9_6RtJ`d z@<-bWTa|GJ^oFe1Vdvx8@gBw8on7x`U)VhsWy{Up#y)VHOxgdbwc6qkjytEx>u7a{ z7oOSZvT=*fc;mYF+;#yO{e#@R@5pc>9Q5nlpyGv7utyu8&@$m4ZMarjthe^okLtsk z&z`U<41blPuolCSQ(}*mEJcoc@@8E*R(*O>DY6Euwp_u#tH%y0``B@DZiZh&yV@a| zYej0|RG?pL@GA9-_&5L>yypHpbuGqr=%mtGU!!VQoE|>*Go)ypL?<~^j^GJAQt|;G z{lyb_#bOzjkm4N`407?6$$?%Y$a}<5Fd%{d*c6;EvAy zN`5EPSPnb8F!0fvA3bDv$U*OckLXZBW$oa5QJB(+yVxsz zv||MrSY`c*(&dws7V)DbrTugvNd{47PDv4{a7Snb+M~N89 zmM1PHj~Gh!;`d7pA$c#ijM6#0%6FHivJt!Y=#`($&H+!Qi%%hq=~&q8Os$Y~^J5iK zKHh@BncJN>SK5BYVOG`*?EBbGyPI55IoWxce$t*Z_EB>^;y$j<)x7yxvxpj|OvdXm zgY?tWl2dZ%Vx5wYkGzN1)vr|ahqwQ~_O3h->UI4ODsnI>gfK;A8AX=M2{X!xN+M+6 zB{Y?koeU{TmMo=+$xa$u_H9JW$r8qvec!S(7-mfOb@Sy>Y}=Pp+jH*L(QVfy1A;B!IVI0?TMq2Y zEDccIG;SHPD<00o3VdWq3h#WxttBoyPo7Cy2CGS?XJ@>ol1I*YIPGQ9pf7W|`|_~$ zE#f0btnsp8rI%Acmgp7QpwYs+vD-N&j;N4&abO_CG>Z=Umr|=1do}#0nHrDv?jUFV_t$pj5TVFc%~!2cDFvX4mT5b za5kP*kuSAB4eg7&RDda;yl5Rrd#a5b#2O3T%TW=|a!HTM zh=J>nama*m;72N4UkY4&>NksDWZClHvs!BB?RhNt61Tct8cGJaoA}T&^^9kTePF8r z^~znab)NeR*FCZ2eKV5pAUh~=_7;fUAd)&&_nRCOS=SdQqSQiV}DO^Z3}-eY^v z^HYqAPqohn`owM&5%u3tfMdA)^!#@`p%PGYA_wawTd5M`E8Nb3f@O{fwY9xj`4^ww zG+)}}`Ganht-+<@=o5B{c!y)e}RQ; zxAuLZH#4~8lXWc!eix)tZY0bvQn%xBlBVyB1|2_U=G=47Cr~9*IqxdVag88GJ?94Y zbHtJ6A7&>A)!6}tqh)?)=X=@n8gtwo$XP%Bi17E)oVbGXr!pX-&E#vN6m`uei@4tN{_f5HFk;6Z`Qvv>|AvX!7%?iu|H}#ruB!mW-~Rw zs$dtZBvRWY7fz>Mj1GCARY#sKeG2ff()_>g#6v zTwiwmdkz|D3vp}SkJn|>pE(+tSgF1}Q(0irUElf2)tOD(Y&HFA8D}vW{nGHeDa&c@ zP}Sg-;d)0vEP)%o>O(C7o4heEb=BtK zRc_7!j-(}HiSI4%93X7p&xpN$UV;6gWr*>Tc$j`PcUEx0lO{&hkofRMa0MpkY z*EloIlK?Zso>CcVY1BK2QU)tw#xlDFYqxJx!VVRI&6BsxP9JvDed3`$pA<12DL-yJOeZR_)4bdomgIO99~pM=-pBTSzM2XgC%aVGG5{1Efwy^^STXAjIYTpOI;m(u9;P7 zGznvKghEwQjny62v{Q6W?6L{G7k$&IKL%cx)*|mbe{ixYbAOmQB&(TUfR)K=dA;Wi z1R^KY?>-+amJwHz+7fv1LQcF|S;#bD`K_g#sWMovZs&e;?sCt6p}u+--G!sJWNgiF zA_4E?kR90>DBIs(ECDDk{vzD+EHymPhGMf~AQXq=l55x~JNSpa!4#7TxATe5$;xfJ zFk*7@Z(5hfxT^c@8-Y?74TO;vgdrht4s~XitGc#U&7wWsp><{f;Ow%{*26~Q1FDAd zeUanrpa{ro9%RR*MfrH=)^pMn@}h0oZeLBm$DbY2y-gMyDXd4El?#R1xTU#928K)G zRvvAcZNOe^I>n@htaM`ur(VWbZW3ExI#RqiY3T6f4Bx-eBl??nl#;Bpce`?_{&Cpt zR3Og0gCx_h;QoU3Eh?SCyI7o)lHWtk@Vr)z?`5A3|MH#xW{^MQ^Zoid&iC}g*m`TK zKDr#2Xx@6@w)NI|G3pP2O4K(1138=#HaQ9X)sa8#iVQgbVAVnS>tns(4aRJ;<{usy1G)SN?sM{pz_dyDwfy>cfgYQ&jbJn{SC^^Msw?#cptYLEgJa_a@JB~ zr8cFz_S#PI8v`c3O!z}blR z&}vj}T+n$A74{FVSLp;f@4w%MbZ3)_0cY>8E4@fyex@h-=fYTcxr6EI0biK0g)t ze_YS|%|5TeZr}}&Q5%J48zczd>;t(Dqssila=yR6zJdd!l?N4sUw{k+*n78&gfC96 zH7?B7bawG&;amM;0Tcy#0x+yP-xK)RGteI?{HvVYe*2$35^Di|kqs34#~V(A+) z)owBwc1e>wS(85iTaa89pYp(dbODe+z#5VPxTaqY9e7>q7;-5?3hes0RZ;Yh3ITF3 zIJ%;!6<3I)(&dxDH2L^ntE{z0q8s`s50Jxr)x5z#jNAA^UpEFoWVuyb|hVc{1rivS91am7V?8$P;VoJ09(PL`YIVv6XGd8Zz{7E@;`hg*a!VcFR8Ji zv98G!5W{(8Nj)-U{$|yX%HD=ue+6~`UL4Sz`LLt4B!6UENi)?G900Qbwf65@4>oCH z`woIcFX#cjA9qeCgwBUni2tywvedZXZ?^trQ2*7oPK_hkr)E{ETtQFYFK({y59 zXJcq^3_p#Gyly3qiE`(Gd+S0A+Qrwyjp+*Rb!jB0W&RzrTSwy{PwCA>PQvjo2PZA8 zr{OhIO?z`TKn3Cr8@ODdxMyBpnV0(NAjSV^e{>s|*KhXxLuHJAWbV*ypf(Q-hc3$YTn(wl;=kaR-dK*ue8GonJ1i2CR|D3f` zMk0l_y^`E?rX^;xIf}~vyfL>-yEsB}R~Dsa7J0DX9Z9{^wDI63@16EKsC zJORk0dWUUZ)rDj<|JmEJIffWqIgJ2Bs<*v zo-)Jo6BdCNo_oS{@=-@as5m?XqpeJltH+KWMr1`m5E8XWR z@t;N8>G&yUy1#N2xM`|01ve-$tX>O<49YCJ$n#8Ak=_|O#zv!ZqFJoO@To#oGw-9i z;Bh&jj7!;Bxy{pUZB4ZN%j_yg2=N4|H`r|+Z)!0*(wWEU1igg4&KSK!h&AmmBh#ub zTH9RoNLV{xmFCduPGCjxNB5x5&-xk8SY$j7DE=fT93~xLJH}T#D^lbWkd5Wc3mL)E9V5Vj9uwbD`*8s0%*E zLD7U3`0o!V9ur((A1LF#OIELfi-N8}ZGz-&tHsc;VMkI!u(l3ROh4+Ftm{(CT_!Gzn*$WXm! zr}nYX3?<36H-)6?wW@1Ck|BlNkVL>tYtUPz)oj6$C0|ORk=MBj`KI9~s2^>blsTQT(4jZaapIxV)TfhJH-)BgW!l+5L z>l4V(_N4a59xAtU1D{pK$wBL&b5B?@Doqz?vVnF0oRU`e!DMWYcTu*&R4yl?Z#kj+ z8$ zH)1lpOnZ+{>*pz)8z_rbm(iaPB`1!e9c#G1tnzeDWJGy4^|PeIEWi3S@f7sXE@d;XRJ`NZ~56S_O} zF9Ad|l`#{pfmN2U!TbKE5o0#NLnhNE(nHuoQ;yOt{ha!lSLF^j(-qH0N1512+~hjM zDmY?v{_cR9jD9nJNp69QH4jqBm#^ERc$!Yz&xoL-{NhsaK2r~~_Hfi1fXMo0bWHDc z>AyF^wH4-#PlPyP=I)Z7HdEyt57ZpqVoABpADl%w8ti=~5LA_;Z`o_O;9iO|eHU8U zU?8J921bB|GYXP!3MP9Ktp1W%+jh;eD^h7pvg}@*jx5{wg99_qEux4+gO45p{ zxtE1$9C~T;FKG736&{6Vn(-%M3v4vGgX%1{MZ5_po($<0toLJ@;6%5ikjqlje7##` z7vgr|L>8e8HW3E7Z{HSqTl)*#KX|RsuRSvzUmaO9QDmNbo4VG23F2fj2805mZM^`1 zUEf`*T8YR$%RUN&I>e>z#|n}A_M%UZmLfK4_x^ludUKbsQ-{+-q@O|`GryuP0KGMx zX*QbSUfMQ}Hd`rFe7nwm)y_8^`4sEkRV3ggi@>Lw`DaLCg!I#_~i8+PN85Y4KkKKuJeJ{AzDKBzQI0?Nq zUddA^YJc)#un+pW&@jQ&dKDeLgOp!6cTkNWlkL%0<0X|-da(U?j-lMKilF2|L{dpR zKC-+dMuEF=cA-lwXtohr5&g_%#=ZO^QLjVBzGQut#K0>8(gBoxqT2&?bzmiLLt^kP zJ#)knQ%JI)34WOTkX*}yOJmsUC6s)e>F8)Q2uM$&RR>MK=0h&VSN@dO$r}-U%kQqbW7lmG^ZN z&=(qOxS4sHAShJXtwm?8L%Qy`gG(x6d-BRIUl^fqYYy}IEnWK(;;FRu#=X(=Y@4^H zzGzs9e+Qv67B!KXoATLj5mN;vY0!rllCBvQnq?WBSc2zxTKms9*!hj!QO=Jgf7BeS`tYX40=H=Pu zs%Uj%v=limU5b64ud27DC15k%gjUnB-T&3z_&;+J!M8Xt3u=!pY(B6)Q0ZwA{d6+Y zDImpexC1xiwN>7o5s)n0oUFtxw&G^N?!X8HZL|gsAeEb`JvOt^15SAiV~9#Z^Z=S+ zVy*0Pe*5KBQRUWh9{UL`(({*V%Gku~p|3hHbviFJWg*Qa!h?YVCkZ-)`Hpi;c$yRa z81qvsjn~;1Bd5kDNA~cMK%kNL?+u$#iFZ=P*BG4NPA``nr<{3<`6)66NPqanUO>VpA! zhB+!GebdfZ@8FqmS>);aK46}#9Hj!><4Pl_u|yTddC7uYK+(<>kmV@z14sstzUcXm z+zj$qzz4sRKI#t{zzvv;oAzR;YcPtM-FW8~K#hUDckxwV6%cl#hv>9^k)nX+Tlnk` zhI&3ej(l#6={Bl*KH<@Q?)q=vf7z~dUkZ@@$=@GeGj~24-}z?CuX+!>XIlL7JpP)o L`ZKnnd)M(-O*OKX literal 0 HcmV?d00001 diff --git a/BusinessCardClip/BusinessCardClipApp.swift b/BusinessCardClip/BusinessCardClipApp.swift index 60566e9..13993f7 100644 --- a/BusinessCardClip/BusinessCardClipApp.swift +++ b/BusinessCardClip/BusinessCardClipApp.swift @@ -3,12 +3,20 @@ import SwiftUI @main struct BusinessCardClipApp: App { @State private var recordName: String? + @State private var launchErrorMessage: String? + @State private var debugState: ClipDebugState? var body: some Scene { WindowGroup { Group { - if let recordName { + if let debugState { + ClipDebugHarnessView(initialState: debugState) + } else if let recordName { ClipRootView(recordName: recordName) + } else if let launchErrorMessage { + ClipErrorView(message: launchErrorMessage) { + self.launchErrorMessage = nil + } } else { ClipLoadingView() } @@ -19,6 +27,11 @@ struct BusinessCardClipApp: App { .onOpenURL { url in handleURL(url) } + .task { + #if DEBUG + debugState = parseDebugStateArgument() + #endif + } } } @@ -28,10 +41,39 @@ struct BusinessCardClipApp: App { } private func handleURL(_ url: URL) { - guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true), - let id = components.queryItems?.first(where: { $0.name == "id" })?.value else { + guard let id = extractRecordName(from: url) else { + launchErrorMessage = ClipError.invalidRecord.localizedDescription return } + + launchErrorMessage = nil recordName = id } + + private func extractRecordName(from url: URL) -> String? { + if let components = URLComponents(url: url, resolvingAgainstBaseURL: true), + let id = components.queryItems? + .first(where: { $0.name == ClipDesign.URL.recordQueryName })? + .value, + !id.isEmpty { + return id + } + + // Fallback for path-based links (e.g. /clip/{recordName}). + let candidate = url.lastPathComponent.trimmingCharacters(in: .whitespacesAndNewlines) + guard !candidate.isEmpty, candidate != "/" else { return nil } + return candidate + } + + #if DEBUG + private func parseDebugStateArgument() -> ClipDebugState? { + let prefix = "--clip-debug=" + guard let argument = ProcessInfo.processInfo.arguments.first(where: { $0.hasPrefix(prefix) }) else { + return nil + } + + let value = String(argument.dropFirst(prefix.count)) + return ClipDebugState(rawValue: value) + } + #endif } diff --git a/BusinessCardClip/Design/ClipDesignConstants.swift b/BusinessCardClip/Design/ClipDesignConstants.swift index 202e9c4..b72fd4e 100644 --- a/BusinessCardClip/Design/ClipDesignConstants.swift +++ b/BusinessCardClip/Design/ClipDesignConstants.swift @@ -1,7 +1,7 @@ import SwiftUI /// Design constants for the App Clip. -/// Mirrors main app design but with minimal footprint for size constraints. +/// Mirrors the main app's centralized constant patterns. enum ClipDesign { // MARK: - Spacing @@ -28,8 +28,17 @@ enum ClipDesign { enum Size { static let avatar: CGFloat = 80 - static let avatarLarge: CGFloat = 120 + static let avatarLarge: CGFloat = 112 static let buttonHeight: CGFloat = 50 + static let previewBannerHeight: CGFloat = 132 + static let previewAvatarSize: CGFloat = 96 + static let previewAvatarOverlap: CGFloat = 48 + static let previewMaxWidth: CGFloat = 460 + static let previewCardMinHeight: CGFloat = 320 + static let avatarFallbackSymbolSize: CGFloat = 42 + static let avatarStrokeWidth: CGFloat = 4 + static let cardStrokeWidth: CGFloat = 1 + static let contactRowIconSize: CGFloat = 14 } // MARK: - Opacity @@ -38,6 +47,22 @@ enum ClipDesign { static let subtle: Double = 0.3 static let medium: Double = 0.5 static let strong: Double = 0.7 + static let faint: Double = 0.12 + } + + // MARK: - Shadow + + enum Shadow { + static let radius: CGFloat = 14 + static let y: CGFloat = 8 + } + + // MARK: - URLs + + enum URL { + static let appStore = "https://apps.apple.com/app/id1234567890" + static let contactsScheme = "contacts://" + static let recordQueryName = "id" } } @@ -46,12 +71,12 @@ enum ClipDesign { extension Color { enum Clip { - static let background = Color(red: 0.12, green: 0.13, blue: 0.15) - static let cardBackground = Color(red: 0.18, green: 0.19, blue: 0.22) - static let text = Color(red: 0.96, green: 0.96, blue: 0.97) - static let secondaryText = Color(red: 0.70, green: 0.72, blue: 0.75) - static let accent = Color(red: 0.35, green: 0.65, blue: 0.95) - static let success = Color(red: 0.30, green: 0.75, blue: 0.45) - static let error = Color(red: 0.95, green: 0.35, blue: 0.35) + static let background = Color("ClipBackground") + static let cardBackground = Color("ClipSurface") + static let text = Color("ClipTextPrimary") + static let secondaryText = Color("ClipTextSecondary") + static let accent = Color("ClipAccent") + static let success = Color("ClipSuccess") + static let error = Color("ClipError") } } diff --git a/BusinessCardClip/Models/SharedCardSnapshot.swift b/BusinessCardClip/Models/SharedCardSnapshot.swift index ca8a159..a78e714 100644 --- a/BusinessCardClip/Models/SharedCardSnapshot.swift +++ b/BusinessCardClip/Models/SharedCardSnapshot.swift @@ -1,13 +1,48 @@ import Foundation +import Contacts /// Represents a shared card fetched from CloudKit for display in the App Clip. struct SharedCardSnapshot: Sendable { + struct ContactInfoRow: Identifiable, Sendable { + enum Kind: Sendable { + case phone + case email + case website + case address + case social + case note + } + + let id = UUID() + let kind: Kind + let value: String + let label: String + + var systemImage: String { + switch kind { + case .phone: + return "phone.fill" + case .email: + return "envelope.fill" + case .website: + return "globe" + case .address: + return "location.fill" + case .social: + return "link" + case .note: + return "note.text" + } + } + } + let recordName: String let vCardData: String let displayName: String let role: String let company: String let photoData: Data? + let contactInfoRows: [ContactInfoRow] init( recordName: String, @@ -22,7 +57,7 @@ struct SharedCardSnapshot: Sendable { // Parse display fields from vCard let lines = vCardData.components(separatedBy: .newlines) - let parsedDisplayName = Self.parseField("FN:", from: lines) ?? "Contact" + let parsedDisplayName = Self.parseField("FN:", from: lines) ?? String(localized: "Contact") let parsedRole = Self.parseField("TITLE:", from: lines) ?? "" let parsedCompany = Self.parseField("ORG:", from: lines)? .components(separatedBy: ";").first ?? "" @@ -33,6 +68,7 @@ struct SharedCardSnapshot: Sendable { self.role = role ?? parsedRole self.company = company ?? parsedCompany self.photoData = photoData ?? parsedPhotoData + self.contactInfoRows = Self.parseContactInfoRows(from: lines, vCardData: vCardData) } private static func parseField(_ prefix: String, from lines: [String]) -> String? { @@ -42,12 +78,258 @@ struct SharedCardSnapshot: Sendable { } private static func parsePhoto(from lines: [String]) -> Data? { - // Find line that starts with PHOTO; and contains base64 data - guard let photoLine = lines.first(where: { $0.hasPrefix("PHOTO;") }), - let base64Start = photoLine.range(of: ":")?.upperBound else { + // Handles PHOTO on a single line. Folded/multiline photos are out of scope here. + guard let photoLine = lines.first(where: { $0.uppercased().hasPrefix("PHOTO") }), + let base64Start = photoLine.firstIndex(of: ":") else { return nil } - let base64String = String(photoLine[base64Start...]) + let valueStart = photoLine.index(after: base64Start) + let base64String = String(photoLine[valueStart...]).trimmingCharacters(in: .whitespacesAndNewlines) return Data(base64Encoded: base64String) } + + private static func parseContactInfoRows(from lines: [String], vCardData: String) -> [ContactInfoRow] { + var rows = parseContactRowsWithContactsFramework(vCardData: vCardData) + var existingKeys = Set(rows.map { dedupeKey(for: $0) }) + let useManualFallback = rows.isEmpty + + for line in lines { + guard let separatorIndex = line.firstIndex(of: ":") else { continue } + let metadata = String(line[.. [ContactInfoRow] { + guard let data = vCardData.data(using: .utf8), + let contact = try? CNContactVCardSerialization.contacts(with: data).first else { + return [] + } + + var rows: [ContactInfoRow] = [] + + for phone in contact.phoneNumbers { + let value = phone.value.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) + guard !value.isEmpty else { continue } + rows.append( + ContactInfoRow( + kind: .phone, + value: value, + label: normalizeLabel(localizedLabel(phone.label)) + ) + ) + } + + for email in contact.emailAddresses { + let value = String(email.value).trimmingCharacters(in: .whitespacesAndNewlines) + guard !value.isEmpty else { continue } + rows.append( + ContactInfoRow( + kind: .email, + value: value, + label: normalizeLabel(localizedLabel(email.label, fallback: "Email")) + ) + ) + } + + for address in contact.postalAddresses { + let value = CNPostalAddressFormatter.string(from: address.value, style: .mailingAddress) + .replacingOccurrences(of: "\n", with: ", ") + .trimmingCharacters(in: .whitespacesAndNewlines) + guard !value.isEmpty else { continue } + rows.append( + ContactInfoRow( + kind: .address, + value: value, + label: normalizeLabel(localizedLabel(address.label, fallback: "Address")) + ) + ) + } + + for urlAddress in contact.urlAddresses { + let value = String(urlAddress.value).trimmingCharacters(in: .whitespacesAndNewlines) + guard !value.isEmpty else { continue } + rows.append( + ContactInfoRow( + kind: .website, + value: value, + label: normalizeLabel(localizedLabel(urlAddress.label, fallback: "Website")) + ) + ) + } + + let noteValue = contact.note.trimmingCharacters(in: .whitespacesAndNewlines) + if !noteValue.isEmpty { + rows.append( + ContactInfoRow( + kind: .note, + value: noteValue, + label: "Note" + ) + ) + } + + return rows + } + + private static func localizedLabel(_ label: String?, fallback: String = "Work") -> String { + guard let label else { return fallback } + return CNLabeledValue.localizedString(forLabel: label) + } + + private static func dedupeKey(for row: ContactInfoRow) -> String { + "\(row.kind)-\(row.value.lowercased())" + } + + private static func extractType(from metadata: String) -> String? { + let parameters = metadata.components(separatedBy: ";") + for parameter in parameters { + let parts = parameter.components(separatedBy: "=") + guard parts.count == 2, parts[0].uppercased() == "TYPE" else { continue } + let rawType = parts[1].components(separatedBy: ",").first ?? parts[1] + return rawType.trimmingCharacters(in: .whitespacesAndNewlines) + } + return nil + } + + private static func normalizeLabel(_ raw: String) -> String { + switch raw.uppercased() { + case "CELL": + return "Cell" + case "WORK": + return "Work" + case "HOME": + return "Home" + case "PERSONAL": + return "Personal" + default: + return raw.capitalized + } + } + + private static func normalizeSocialLabel(_ raw: String) -> String { + switch raw.lowercased() { + case "linkedin": + return "LinkedIn" + case "twitter": + return "X" + case "tiktok": + return "TikTok" + case "youtube": + return "YouTube" + case "cashapp": + return "Cash App" + default: + return raw.capitalized + } + } + + private static func formatAddress(_ adrValue: String) -> String { + let parts = adrValue + .split(separator: ";", omittingEmptySubsequences: false) + .map { String($0).trimmingCharacters(in: .whitespacesAndNewlines) } + + guard parts.count >= 7 else { return adrValue } + + let street = parts[2] + let city = parts[3] + let state = parts[4] + let postalCode = parts[5] + let country = parts[6] + + let locality = [city, state, postalCode] + .filter { !$0.isEmpty } + .joined(separator: " ") + + return [street, locality, country] + .filter { !$0.isEmpty } + .joined(separator: ", ") + } } diff --git a/BusinessCardClip/State/ClipCardStore.swift b/BusinessCardClip/State/ClipCardStore.swift index b847d84..82febb2 100644 --- a/BusinessCardClip/State/ClipCardStore.swift +++ b/BusinessCardClip/State/ClipCardStore.swift @@ -39,7 +39,7 @@ final class ClipCardStore { let snapshot = try await cloudKit.fetchSharedCard(recordName: recordName) state = .loaded(snapshot) } catch { - state = .error(error.localizedDescription) + state = .error(userMessage(for: error, fallback: ClipError.fetchFailed)) } } @@ -52,7 +52,14 @@ final class ClipCardStore { try? await cloudKit.deleteSharedCard(recordName: snapshot.recordName) state = .saved } catch { - state = .error(error.localizedDescription) + state = .error(userMessage(for: error, fallback: ClipError.contactSaveFailed)) } } + + private func userMessage(for error: Error, fallback: ClipError) -> String { + if let clipError = error as? ClipError { + return clipError.localizedDescription + } + return fallback.localizedDescription + } } diff --git a/BusinessCardClip/Views/ClipDebugHarnessView.swift b/BusinessCardClip/Views/ClipDebugHarnessView.swift new file mode 100644 index 0000000..0dc300e --- /dev/null +++ b/BusinessCardClip/Views/ClipDebugHarnessView.swift @@ -0,0 +1,183 @@ +import SwiftUI +import Bedrock + +#if DEBUG +enum ClipDebugState: String, CaseIterable { + case loading + case preview + case success + case error +} + +enum ClipDebugFixtureVariant: String, CaseIterable { + case standard + case long +} + +/// Debug-only harness to preview all App Clip states without CloudKit. +struct ClipDebugHarnessView: View { + @State private var selectedState: ClipDebugState + @State private var selectedFixture: ClipDebugFixtureVariant = .standard + + init(initialState: ClipDebugState = .preview) { + _selectedState = State(initialValue: initialState) + } + + private var mockSnapshot: SharedCardSnapshot { + SharedCardSnapshot( + recordName: "debug-record", + vCardData: selectedFixture == .standard + ? ClipDebugFixtures.fullCoverageVCard + : ClipDebugFixtures.longCoverageVCard + ) + } + + var body: some View { + ZStack { + Color.Clip.background + .ignoresSafeArea() + + VStack(spacing: ClipDesign.Spacing.medium) { + Picker("State", selection: $selectedState) { + ForEach(ClipDebugState.allCases, id: \.rawValue) { state in + Text(state.rawValue.capitalized).tag(state) + } + } + .pickerStyle(.segmented) + .padding(.horizontal, ClipDesign.Spacing.large) + .padding(.top, ClipDesign.Spacing.large) + + Picker("Fixture", selection: $selectedFixture) { + ForEach(ClipDebugFixtureVariant.allCases, id: \.rawValue) { variant in + Text(variant.rawValue.capitalized).tag(variant) + } + } + .pickerStyle(.segmented) + .padding(.horizontal, ClipDesign.Spacing.large) + + if selectedState == .preview { + Text("Rows: \(mockSnapshot.contactInfoRows.count)") + .styled(.caption) + .foregroundStyle(Color.Clip.secondaryText) + } + + Group { + switch selectedState { + case .loading: + ClipLoadingView() + case .preview: + ScrollView(showsIndicators: false) { + ClipCardPreview(snapshot: mockSnapshot) { + selectedState = .success + } + } + case .success: + ClipSuccessView() + case .error: + ClipErrorView(message: String(localized: "This card has expired")) { + selectedState = .loading + } + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + } +} + +private enum ClipDebugFixtures { + // Embedded debug photo bytes for deterministic preview rendering. + private static let base64PhotoJPEG = "/9j/4AAQSkZJRgABAQAASABIAAD/4QGmRXhpZgAATU0AKgAAAAgABwEOAAIAAAALAAAAYgESAAMAAAABAAEAAAEaAAUAAAABAAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAEyAAIAAAAUAAAAfodpAAQAAAABAAAAkgAAAABTY3JlZW5zaG90AAAAAABIAAAAAQAAAEgAAAABMjAyNjowMTowOCAxOTowNTowMgAAD5AAAAcAAAAEMDIyMZADAAIAAAAUAAABTJAEAAIAAAAUAAABYJAQAAIAAAAHAAABdJARAAIAAAAHAAABfJASAAIAAAAHAAABhJEBAAcAAAAEAQIDAJKGAAcAAAASAAABjJKQAAIAAAAEMDAwAJKRAAIAAAAEMDAwAJKSAAIAAAAEMDAwAKAAAAcAAAAEMDEwMKACAAQAAAABAAAAgKADAAQAAAABAAAAgKQGAAMAAAABAAAAAAAAAAAyMDI2OjAxOjA4IDE5OjA1OjAyADIwMjY6MDE6MDggMTk6MDU6MDIALTA2OjAwAAAtMDY6MDAAAC0wNjowMAAAQVNDSUkAAABTY3JlZW5zaG90/+0AVlBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAeHAFaAAMbJUccAgAAAgACHAJ4AApTY3JlZW5zaG90OEJJTQQlAAAAAAAQNAczILALmNlLfKXzP4BZ8f/idjxJQ0NfUFJPRklMRQABAQAAdixhcHBsBAAAAHNjbnJSR0IgWFlaIAfgAAEAAQAAAAAAAGFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAmnK895bPNUO2GnfxrjiswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGRlc2MAAADkAAAAXGNwcnQAAAFAAAAAUHd0cHQAAAGQAAAAFEEyQjIAAAGkAAB0TGNoYWQAAHXwAAAALGFhcHkAAHYcAAAADkEyQjAAAAGkAAB0TEEyQjEAAAGkAAB0TG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAQAAAABwAQQBwAHAAbABlACAAVwBpAGQAZQAgAEMAbwBsAG8AcgAgAFMAaABhAHIAaQBuAGcAIABQAHIAbwBmAGkAbABlbWx1YwAAAAAAAAABAAAADGVuVVMAAAA0AAAAHABDAG8AcAB5AHIAaQBnAGgAdAAgAEEAcABwAGwAZQAgAEkAbgBjAC4ALAAgADIAMAAxADZYWVogAAAAAAAA9tYAAQAAAADTOm1BQiAAAAAAAwMAAAAAACAAAABQAAAAgAAAAOAAAHQcY3VydgAAAAAAAAACAAD//2N1cnYAAAAAAAAAAgAA//9jdXJ2AAAAAAAAAAIAAP//AABA7gAAJo8AABPuAAAeowAAWOwAAAhyAAAADwAABhEAAGN6AAAAAAAAAAAAAAAAcGFyYQAAAAAAAwAAAAJmZgAA8qoAAA1WAAAT0AAAChBwYXJhAAAAAAADAAAAAmZmAADyqgAADVYAABPQAAAKEHBhcmEAAAAAAAMAAAACZmYAAPKqAAANVgAAE9AAAAoQERERAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAADvMAAAAAHmUAAAAALdcAAAAAPUkAAAAATLsAAAAAXC0AAAAAa58AAQAAexAAAQAAioIAAQAAmfQAAQAAqWYAAQAAuNwAAQAAyKoAAgAA2R8AAgAA6qoAAwAA//8B1Q/uAAAAABA0EHAAAA/BIWgAAA9EMWEAAA7WQNcAAA6AUBAAAA5AXzYAAA4RblkAAA3ufYMAAA3UjLQAAA3Am+4AAA2xqzAAAA2lunsAAA2nyiYAAA2+2nsAAA3x6+sAAA6F//8FGR/mAAAAACCjDb8AACBSIK0AAB/iMeAAAB9lQkQAAB7oUiQAAB52YawAAB4TcQAAAB2/gDYAAB16j10AAB1BnoAAAB0SraQAABztvM4AABzgzFcAABz03IsAAB027dsAAB4O//8KbC/eAAAAADEAB/sAADDFHmcAADBvMOoAADACQj0AAC+IUuQAAC8JYxIAAC6NcuYAAC4ZgnkAAC2vkd8AAC1RoSYAACz+sFsAACy3v4cAACyRzwcAACya3ysAACzi8GYAAC31//8QvT/WAAAA+UFAAAAAAEEpGnkAAEDlLtUAAECMQScAAEAhUo4AAD+qY2IAAD8sc8kAAD6tg9oAAD4yk6gAAD28o0MAAD1PsrUAADzrwg4AADyu0aoAADyq4dwAADz08xoAAD48//8XDk/OAAAMBVDaAAAAAFGDFAwAAFFNK5sAAFEEPy4AAFCpUWMAAFA/YtoAAE/Lc84AAE9PhF8AAE7QlKEAAE5SpKEAAE3WtGsAAE1hxA0AAE0V0+EAAE0I5D0AAE1X9ZUAAE7Q//8dX1/GAAAVh2CYAAAAAGHZB/IAAGGtJvUAAGFwPFQAAGEjT34AAGDGYaAAAGBecyEAAF/rhC4AAF9xlOEAAF70pUgAAF51tXIAAF34xWkAAF2k1YQAAF2W5hkAAF3u95sAAF+Y//8jsG++AAAdl3BqAAAKYnG6AAAAAHIHID4AAHHTOHcAAHGRTN8AAHFBX8gAAHDjcd0AAHB7g2YAAHAKlIcAAG+TpVQAAG8WtdsAAG6ZxikAAG5F1pAAAG4652MAAG6e+RYAAHB4//8qAH+2AAAlCIBGAAAYeoFZAAAAAIJdFboAAIIxM1UAAIH3SXcAAIGxXVMAAIFecA8AAIEBghoAAICZk6kAAIAppNoAAH+ztbwAAH86xmAAAH7p1xEAAH7k6CIAAH9W+gQAAIFZ//8wUY+tAAAsI5ApAAAinZERAAAAHJKwAAAAAJKKLHAAAJJYRSIAAJIaWjcAAJHRbbgAAJF8gFMAAJEeklcAAJC3o+sAAJBItSkAAI/VxiAAAI+I1xgAAI+J6GMAAJAI+m8AAJIr//82op+lAAAzCqARAAArVqDZAAAXfqI3AAAAAKLhIqsAAKK1P6cAAKJ+VmAAAKI8atMAAKHwfhQAAKGakJYAAKE7opQAAKDUtC0AAKBoxXYAAKAf1rMAAKAk6DIAAKCs+mIAAKLj//8886+dAAA5z6/8AAAzV7CrAAAk6bHZAAAAALM2Ej0AALMOOKEAALLdUa4AALKhZ1IAALJde1gAALIOjmkAALG3oNgAALFYstEAALDzxG4AALCs1e0AALCy550AALE9+eoAALN5//9DRL+WAABAfL/rAAA668CGAAAvcMGPAAAQmsMoAAAAAMNmL0oAAMM6S/AAAMMEYyQAAMLGeBcAAMJ+i84AAMIunrsAAMHWsRoAAMF2ww4AAMEu1M8AAMEw5q0AAMG2+RAAAMPm//9JpM+0AABHJtAAAABCRNCLAAA4sdF2AAAkRNLdAAAAANPiIbIAANO5ROAAANOIXjoAANNPdFoAANMNiNcAANLEnFYAANJyrykAANIZwX4AANGn018AANGd5WcAANIX990AANQm//9QHuATAABN3eBYAABJhODWAABBSuGpAAAxfOLpAAAAAOSfBGEAAOR6O+0AAORNWG8AAOQYcBUAAOPchYYAAOOYmbIAAONMrQsAAOL5v80AAOKf0h8AAOH649IAAOJc9lUAAOQ1//9WwvDdAABUtPEdAABQyfGPAABJj/JPAAA8h/NvAAAf6PUHAAAAAPWmL9oAAPV8UYYAAPVMazkAAPUUgdsAAPTUltkAAPSOqtAAAPRAvhIAAPPs0NAAAPOR4yYAAPKD9HwAAPQQ//9d6v//AABcBf//AABYcf//AABR+P//AABGy///AAAxpv//AAAAAP//HLIAAP//SUIAAP//Ze4AAP//fioAAP//lDgAAP//qPsAAP//vOIAAP//0CoAAP//4voAAP//9WwAAP////8OgwBGAAAOvQAAECUOTQAAH7kN/gAALwgNzAAAPksNrgAATZMNmwAAXOMNjgAAbDoNhgAAe5cNgAAAivgNewAAmlwNeAAAqcMNdgAAuS4NgQAAyPUNnQAA2WMN1gAA6ugObgAA//8QFBAUAAAP/g/+D/4P/g/+HvoP/g/+LjkP/g/+PZAP/g/+TPIP/g/+XFkP/g/+a8MP/g/+ey8P/g/+ip0P/w/+mgwP/w/+qXsP/w/+uO4QDBALyLoQLRAs2SwQbBBr6rMRExER//8SYB/6AAATXB+eEWYTUR+gH9ATQx+fLuATKx+ZPjcTCR+NTbMS3h95XUESrh9fbNMSfB9BfGESSR8hi+gSGR8Bm2gR6x7iquERwh7GulcRqR6+yiERqR7V2o0Ryh8a7AsSWh/6//8Vqy/rAAAXiy90Et0WzS+UIJcWrC+JL98Wfy94P2MWRi9fTwIWAS9AXqsVtS8ablYVYy7uffwVDi6+jZgUui6NnSoUZy5brLAUGC4rvC8T2y4Vy/0TuC4p3GgTuy557eEUMS+V//8ZwT/fAAAcJT9jFBcZ6D/AIEkZxD+vMCgZkz+WQBAZVD91T/gZCT9NX9sYsz8eb7UYVD7of4IX7z6uj0EXiD5wnvAXHj4xrpEWtz3zviUWXz3TzgIWIj3k3nYWCj5B7/IWbT+Z//8ebU/VAAAhFE9bFSUcsVAEHp0cj0/wL3ocYE/UP/ocI0+wUE4b2U+EYIMbhE9QcKAbJE8VgKYau07UkJcaTE6PoHMZ2U5HsDsZZU3+v/MY/03Xz+wYsU3q4HQYiU5T8fwY3k/l//8jg1/LAAAmRV9WFhEg5GAaHTEfGmA+Lbge7mAiPxEet1/9T/IecV/QYJAeIF+bcQAdxF9egU0dYF8bkXsc8l7SoY8cfV6FsYkcBV42wW4bmV4M0YwbRl4h4jEbFF6Z880bYGBh//8o5G/CAAArq29TFuMmaXAMHL8hb3CSKrghR3B3PUghE3BTTuIg1nAnYAAgim/zcNQgN2+2gXIf1W9zkecfbm8qojke/W7bsmwehm6JwoUeHW5e0s4dw25445Ydkm7/9Ugd3HD4//8ue3+5AAAxOX9QF6AsPH/7HIMjmIDoJiMjc4DOOoYjRICsTRUjDICCXtQiy4BQcB0ieYAWgRgiIn/Ukdwhv3+MonIhVX8+suMg5X7swzQge37C06wgKX7g5JYf9H909mIgRYGX//80OI+xAAA25o9NGEsyP4/qHHApApDrI18leZEnNp8lUpEHSn8lH5DfXQck35Cwbtwkl5B4gEMkSJA5kV0j7I/0oj4jh4+osvEjII9Xw30iuo8t1CYiaI9Q5TUiP4/v9xQig5Iw//86Ep+oAAA8rZ9JGOs4WZ/aHHIwBKDHImQnY6F/MUQnP6FhRwUnDaE8Wo8m06EQbQ4mkqDbfvImSaCgkG8l+qBdoaElmKAUspslM5/Gw2ck2Z+c1EAkjJ+/5XEkW6Bl92UkpqK4//9AAq+gAABChq9FGX0+ha/KHIw2/7CkIbUpLrHXKdMpD7G7Qnoo47GZV10orLFvaq4ob7E+fSUoKrEGjxIn37DGoJ8nj7CAseUnMLA1wvQm0rAK1AEmiLAq5VQmYrDQ91QmrLMl//9GA7+ZAABIcL9DGgJEu7+9HLE95cCFITIxjcGqJ9sqv8IWPJMqm8H2U1UqcMHOZ7IqOsGgetkp98FrjUcprMEwnzopXMDusNQpB8Ckwioot8B002ood8CN5NwoRMEs9ukofsNy//9MIM+1AABOds9kGoVLA8/UHN9Ew9COINI56dGcJrQsZdKVNNgsQtJ2TlssGNJSZBQr59ImeBcrr9H0iyErctG7nYsrL9F8r4Yq3NE4wS0qedDa0oEqL9Dm5BQqBNF19icqPNOY//9SYeAUAABUp9/FGx1RbOAuHSNLr+DaIKZB/eHVJdcwv+MoLSgt++M3SEEt0uMVX88tn+LsdOMtZuK+iKgtJuKIm58s4OJNrgosleILwA8sReHE0cYr4OEy4vkrueGn9Q8r6uOR//9Y1fDdAABbBPCSG55YCvDyHZVSs/GTIJlJ/fJ8JVg7OPO4K80vl/RmQHwvc/RFWrIvSfQfcS8vGfPyheAu4/PAmYIuqPOHrHMuaPNIvuYuJPME0Pst0/K64sYtSfHA86gtVvNc//9f1f//AABh8f//HEhfH///HgNaNf//IPZSKP//JQZFL///KuoxjP//NoIxbf//VN8xSv//bUgxIf//gy0w7v//l6swrP//q0cwZP//vkgwF///0NgvxP//4xEvbv//9QQusf////8dugDEAAAeggAAEBAeEwAAIDodnwAAL+IdPAAAP0gc8QAATpEcuwAAXdQckwAAbRgcdgAAfGAcYAAAi64cUAAAmwIcRAAAqlkcOwAAubgcRgAAyXMcbgAA2dYcwgAA61IdqAAA//8etBBiAAAd6xCqEFYd6xCqHywd6xCqLlsd6xCqPakd6xClTQ0d6RCcXH8d5RCQa/Yd3hCDe2wd1xB3iuAd0BBrmlIdyhBhqcQdxBBYuTcd0hBdyQId/BB32XIeUxCv6vcfQRFR//8gICAgAAAf/x//Eakf/h/+H/4f/h/+Lugf/h/+PhAf/h/+TVQf/h/+XKgf/h/+bAUf/h/+e2cf/h/+is0f/h/+mjUf/h/+qaAf/x//uQ8gEyASyNYgRSBE2UIgpCCj6sIhoSGg//8iPTACAAAi5i+uEv4jHi+WIUkjHi+WL8kjHi+WPrYjHS+WTdYjFy+VXRwjCS+RbH4i9C+Ie/Ui2i97i3givC9pmwAimi9VqokieS8/uhMiai9AyfEiey9p2m0ivC/N6/YjoDEA//8lCT/wAAAmTz+IFConCT9QIuAm0D9bMOAmvj9ZP7Umpj9VTtomhz9NXi4mYT9BbaAmND8xfSYmAT8bjLclyT8BnE4ljj7jq+YlUT7Cu4AlJj69y2olHD7n2+8lQz9Z7X0mEkDI//8oc0/hAAAqJk91FTArSE8sJE4qQ09eMXEqKU9WQHwqB09LT80p3U87X0Upq08obtUpcU8PfnMpME7yjhoo6U7QncMonU6qrW0oTk6BvRYoEE54zQ0n806m3ZsoBk8p7y0oxlDU//8sZF/VAAAuXV9pFhgvzV8YJZQtc1+FMSotVl95QKItMV9oUEMtA19TX/oszV86b7wsjV8bf4QsRl73j04r+F7PnxYrpF6irtorS15zvpsrAl5nzqQq2V6Z3z4q4F8s8NYrlWEO//8ww2/KAAAy529hFug0j28MJrgwjW+6MBEwS2+xQAkwJm+eUB4v+G+FYCsvwW9ocDIvgG9FgDIvOG8dkCwu6G7xoB0ukW6/sAYuNG6Lv+gt5m590Aottm6z4LUtt29U8lQuZXFn//81e3/AAAA3tX9bF6M5hX8FJ8I1FX+6L9MzDn/2Pp8y6n/iT1Ayvn/HX80yiH+ocCoySX+DgHAyBH9ZkKQxtH8qoMgxXX71sN0xAX6+wOcwsn6u0Scwf37n4ecwe3+U848xJIHP//86eo+3AAA8vY9WGE0+p48AKLY6CI+1L7Q1pZBDPEs1g5AuTc41WpATXto1Jo/zb6A064/NgDk0p4+ikLE0Wo9yoRA0B488sVkzrY8EwZAzXY7x0fQzKo8r4skzJY/h9Hszx5I5//8/sZ+tAABB9Z9RGOxD8J78KZg/SZ+sL7E4FqCTOOY396B+S4k30KBkXUk3n6BEbpA3ZqAff4s3KJ/0kFM23p/EoPQ2j5+OsXc2N59VweI16p8/0mo1tZ9441g1r6Ay9RE2SqKZ//9FFq+kAABHVK9MGX5JV675KmdEw6+hL8U9UrCPN5I6SLDSSGY6JLC5WxE5+bCZbPY5wrB1fmU5hbBLj4k5QrAboHY49q/msTg4oq+twds4WK+U0ow4Iq/H45I4GbB/9VA4rLLm//9Kn7+dAABM0r9IGgNO2r73KypKaL+XL+pDPMB7Nto8f8EpREI8W8EQWCE8MMDyask7/8DPfMQ7x8CljlI7isB3n5U7P8BDsJ8678AKwX46p7/q0lo6ccAT43c6YsDD9To65sMY//9QVc+5AABSe89oGoVUhc8YK+pQOs+wMCVJX9CJNlc+o9GkPuQ+gtGMVG4+W9FvaBE+LtFNerg9+9EljMU9wdD4nmw9etDGr8k9L9CPwO882dBA0dY8pNBa4ws8j9D49M08/NMo//9WPeAVAABYW9/IGx1aX996LLBWP+AKMHpPuODZNgtFi+HrPZtAqOJLT9tAg+IvZMdAWeIOeEJAKeHoiuo/8+G8nQg/tOGMrsY/auFWwD4/HOEc0X8+tOCY4k8+n+Ea9A4++OMQ//9cZfDcAABecvCSG51gd/BGLYFcg/DOMPBWTvGTNfVMyfKYPM1C2PN0SjNCtfNaYNpCjPM6dWNCXvMViMhCKvLrm3ZB8fK8ralBs/KIv4JBaPJQ0RdBFfIS4ndAi/En8v9AyfLM//9jJP//AABlI///HEZnKP//Lo1jXP//MbBddP//NkpUgP//PIVGpf//RKVFOf//XHRFEP//cmlE4v//hsVEr///mi9Edv//rPlEN///v1ND9f//0VhDrf//4xxDYv//9KpChP////8s8QGRAAAuNgAAD4ot2wAAID0taAAAME8s8wAAQAIsiAAAT3ssLgAAXtMr5QAAbhsrrAAAfV0rfgAAjKArWgAAm+UrPgAAqy4rKAAAun4rLwAAyiwrXgAA2oMryQAA6/Ms+gAA//8toxDpAAAsXRG3EOMsXxG2H34sYxGxLpgsaRGlPeksbRGSTVYsbBF6XNEsZxFfbFEsXRFDe84sUhEoi0ksRhEOmr8sORD2qjMsLhDhuaYsPBDayXEscRDq2d8s4BEZ62AuFxG0//8uqiBkAAAt3yCSEgQtyCCZIE4tyCCZLx0tyCCZPjctyCCZTXMtyCCZXMEtyCCZbBktxyCYe3stxiCTiuctwyCNmlgtvyCGqcotuyB+uUAt0CCKyQ0uCyC12X0ugSEN6v8vwiIE//8wLDAsAAAwCTAJEzEv/i/+IZUv/i/+L/4v/i/+Pt0v/i/+TfMv/i/+XSgv/i/+bG8v/i/+e8Ev/i/+ixsv/i/+mnkv/i/+qdwv/y//uUQwGTAZyQUwWzBa2Wgw2TDY6twyKDIo//8yMkAMAAAyoz/EFEcy6j+bIxIy/T+SMTky/T+SP8cy/T+STqoy/T+SXbwy/T+SbOoy/T+SfCky+z+Ri3ky8z+Omtwy5j+Hqk4y1T9/ucwy2j+RyaMzBT/S2hwzbUBb66E0qUHi//80vE/3AAA1pE+eFUI2RE9iJG42sU89Mso2p08/QPQ2n09AT6A2lU9AXpQ2hk8+bbg2c087fP42Wk81jF42PU8sm882Gk8fq0819U8Quts15U8gyr01+09m2z02T1AA7MY3elHE//83w1/mAAA5A1+HFiQ5819AJak6vl8GNFY6Sl8fQfI6OF8cUKE6Il8YX586Bl8RbtA55V8JfiQ5vl79jZE5kl7unQ85YV7brJo5LF7GvDA5DF7UzBk5El8f3Jw5Vl/L7iI6c2HG//87PG/YAAA8vG94FvA9628rJsc/BG7kNb89uG8oQmA9oW8hUT49hG8YYGY9Ym8Nb7o9Om7+fyw9C27tjrI81m7Ynkc8nG6/reU8XW6lvYw8M26wzX88Lm7/3gY8Z2+574c9d3Hl//8/GX/MAABAxX9tF6dCJ38dJ81Df37ONwpA8n9MQh5A2X9CUVFAu381YLtAlX8mcEZAaX8Tf+VAN378j5E//n7jn0c/v37FrwI/e36mvsI/Sn6tzsU/PX7+31M/bn/D8NJAc4IV//9DTY/AAABFF49lGFFGn48TKL1IKY7AODxEvY9eQepD5Y91UMlDxo9lYI9DoI9TcGFDc489gDtDQI8jkBlDBY8Gn/lCxI7lr9lCfo7Bv7lCSY7Fz9RCNo8V4GxCYI/h8elDWZJO//9HzJ+2AABJp59dGO5LTJ8MKZ1M/Z62OVhJIZ9fQfpGyZ+zT5lGqZ+iX9VGhJ+OcANGV592gCZGJJ9akEFF6p87oFRFq58XsGBFY57xwGhFK57v0JxFFZ884UJFN6AK8r1GIaKE//9Mia+sAABOb69WGYFQJq8GKmtR9q6vOl9N1q9dQhlJia/5TbBJaa/oXodJRK/TbyZJGq+5f6FI6K+ckANIr697oFJIcK9WsJJIK68uwMZH8a8m0RlH1K9r4c5H8LA180ZIyrKt//9Rfb+jAABTZb9RGgNVK78CKy1XEb6rO1dSy79YQkVMoMA1S3ZMCcA0XJhL5sAfbcRLvsAFfqlLjL/oj19LVb/Gn/NLGr+gsG5K1b91wNRKmL9l0UlKd7+e4g1KisBd84BLTsLB//9Wrc++AABYlM9vGoZaY88hK+xcW87KPE1YBc91Qo1RvtBRSuNOmdCnWglOeNCSa+ZOUdB4fU1OJNBajmlN7tA4n09Ns9ASsA9Nc8/owLFNJM+o0SlM+8/Q4f5NB9B782pNrtK4//9cH+AYAABeBt/MGx9f19+ALLFh298qPUddhN/QQvBXPeCqSoZRK+FdVs5RCeFIaY1Q4uEue5RQteERjSpQhODvnnRQTeDJr4ZQD+CfwG9PyeBy0TZPZd/94aBPZeCL8wNP6+KM//9h3fDbAABju/CSG5tllPBHLYJnoe/yPlFjVfCUQ3tdHvFoSmlUQ/JwU0hTpPJpZq9TgPJQeYJTV/Izi69TKfISnXFS8/HsruZStfHDwCNSc/GW0TRSLfFk4iNRpfCI8k1SBvI3//9oQ///AABqGf//HERr9///LotuDf//P6lpzf//RGZjrv//SshbAP//UvdWnf//Y4pWe///d2tWVP//imBWKP//nL9V9P//rrZVuP//wGRVeP//0dpVNP//4yNU7P//9ElUAv////88KAK3AAA94AAADqQ9lwAAH+s9MgAAMF48vgAAQGQ8RwAAUB472AAAX6Y7dQAAbws7IAAAfl062QAAjaQ6ngAAnOc6bQAArCk6RQAAu3A6QgAAyxI6dAAA21468gAA7MI8agAA//88rxGvAAA7HBMNEYs7OhLsH+07QRLcLwQ7RhLDPlg7RxKkTco7RBKAXUo7OxJXbM87LhItfFM7HhIEi9I7DBHbm006+RG1qsM66BGSujg69RF/ygI7MxGC2m07uRGo6+w9OhI6//89fSDNAAA8UCFSEm48CiFzIL88CiFzL2o8CiFzPnA8CiFzTZ88CiFzXOQ8DCFvbD88DSFme6k8DSFZixw8CiFKmpU8BCE5qg47/yEpuYs8FiEryVw8XCFN2dA86yGd61M+dSKN//8+qTBsAAA+AzCCE3A9tTCRIfw9szCRMEk9szCRPxU9szCRTh89szCRXUs9szCRbIw9szCRe9o9szCRizA9szCRmow9szCRqe49szCPuVo90DClyR8+HTDi2Yc+sjFb6v9ARjKm//9AOEA4AABAFkAWFG5AA0ADI1M//j/+MYI//j/+P/4//j/+TtU//j/+Xd8//j/+bQc//j/+fEI//j/+i4o//j/+mts//j/+qjJAAD//uZFAH0AeyUdAb0Bv2Z1BCkEK6wFCpkKm//9CMFAXAABCf0/YFVpCuU+tJJhC5U+RMwhC6k+PQS9C6k+PT8ZC6k+PXqJC6k+PbapC6k+PfMxC6k+PjAFC6k+Pm0NC6k+Pqo9C6k+QueZDBE+yyZtDTFAK2fVD3FC4611FbVKP//9Ekl//AABFPV+zFjNFwV94JcZGNV9INIBGa180QqpGa180UPJGa180X5dGal80bndGZl80fYBGYF80jKZGVV8zm+ZGR18wqzpGNV8suqFGPV9MymFGc1+q2sFG8mBp7ClIc2J4//9HWm/sAABITm+aFvpJE29WJtxJzG8YNd1KWG7sREhKLG73UipKIW73YLBKE272b4JKAW70fodJ7G7xjbFJ027snPZJtm7lrFJJlm7du8FJjm77y4VJtW9d2+NKJXAr7UFLlXJr//9Kg3/cAABLrn+IF69MqX8/J9xNoX74NyFOdn69RclNwX7lUwJNsH7iYZZNm37ecHZNgX7Yf4tNY37QjsRNQX7HnhlNG367rYJM8H6uvP1M3n7JzMZM938t3SJNWoAG7nNOuYJr//9OBY/PAABPWY96GFZQgY8vKMhRro7hOE1SwY6cRzBRLI7yU1dRF47sYhZQ/o7kcRxQ4I7agFFQvY7Pj6dQlY7BnxVQaY6wrpVQOI6fviRQHI61zfhQLI8X3lNQg4/275lRz5J0//9R1p/CAABTSZ9vGPFUlZ8jKaRV7p7SOWRXNp6FSH9Uq58HU1tUV58LYh5UO58AcVxUG570gMFT9Z7lkEBTy57Tn9FTm56/r29TZ56pvxlTRJ65zvxTSp8W31xTlp/28JdUzqJ///9V76+3AABXeK9lGYVY368ZKnJaXa7GOmpb0K51SblYvq8JU55Xca85YaJXVa8tcSxXNK8egM5XDq8MkIBW4a74oD5WsK7hsANWeq7Iv85WUq7Pz8ZWUK8k4CtWkK/98VpXrrKD//9aSL+tAABb3r9eGgRdXL8SKzNe976+O19gj75qSuBdFr8KU+Naa790YJtaTr9mcIRaLb9WgHJaB79CkGNZ2r8soFZZqb8SsElZcr71wDtZRb7z0EtZOL864LdZbcAH8dtabcJ2//9e6c/FAABgiM95GohiFc8uK/Bjyc7aPFNlf86ETARhvM8qVD9dVM/YXwpdOc/Jb29dGM+3f71c8c+jj/xcxs+LoC9cls9wsFpcXs9SwH1cHM8g0IhcBc9U4P1cKtAM8hNdCdJS//9j1+AcAABlf9/SGyBnFt+ILLJo2980PUpqqt7dTS9mtN+GVLhhaeBSXi5gI+BwbfBgAuBefrVf3OBJj1NfsuAwn9Zfg+AUsEVfTd/1wKNfEt/T0PRet99t4PleyOAG8gBfgeIP//9pH/DaAABqxfCTG5lsafBKLYNuPe/2PlNwIu+eTnBsCfBIVVxmiPEXXhpjHPGDbAdi/vFwfWNi2PFbjndirvFCn1tif/ElsBxiTfEFwMJiE/Dj0VNh1PC94dNhS+/y8aFh1fGn//9vGv//AABwv///HEFybf//Loh0UP//P6d2SP//UAlyFv//VnFscv//XpRmff//afpmX///fB5mPf//jdBmFv//nzdl6P//sGdltP//wW9lfP//0lllQP//4ylk////8+VkBf////9LXgQ/AABNhAAADVNNSQAAH1hM8wAAMCpMiQAAQHtMFAAAUHlLnQAAYDhLKwAAb8tKwgAAfzxKZQAAjphKEwAAnedJzQAArS5JkgAAvHRJgwAAzBJJtAAA3FZKQgAA7bFL/gAA//9LyhKwAABKFxSJEitKbRQeIEdKbhQIL25KbBPpPs9KZhPDTkxKXBOWXdRKTRNkbWBKOhMwfOtKIxL7jHFKChLGm/BJ8BKTq2tJ2BJjuuJJ4xJDyq1KKRI72xdKxhJW7JNMjhLf//9McyFcAABLECI3Et5KhyKOIVNKhyKOL9BKiSKMPrxKjiKGTeFKlCJ8XSlKmiJubIlKnSJbe/hKnSJFi3FKmiIsmu9KlSIRqm5KjiH3ue9KqCHwycVK+yIH2jtLoyJP679NdiM4//9NaDDGAABMcDEZE7lL5zFLInBL0zFTMK1L0zFTP19L0zFTTllL0zFTXXpL0zFTbLNL0zFTe/tL0zFTi0xL0zFSmqhL0zFNqg9L1DFGuYFL9jFWyUtMUDGN2bhNADIA6zNO2zNG//9OrEB1AABOJUB+FJxNzUCHI6FNpUCNMeNNpUCNQEdNpUCNTw9NpUCNXg5NpUCNbS5NpUCNfGNNpUCNi6ZNpUCNmvRNpUCNqkhNpkCOuaVNykCtyVhOKED92axO3EGX6w5QvEMx//9QQ1BEAABQJFAkFXlQDlAOJM5QAFAAM1NP/k/+QXdP/k/+T/5P/k/+XtBP/k/+bdBP/k/+fO1P/k/+jB5P/k/+m1xP/k/+qqVQAFAAufhQI1AjyZ9QgVCB2eRRNlE26zFTF1MX//9SM2AhAABSbF/rFkhSmV/BJetSw1+eNLZS3F+NQvBS3F+NUSlS3F+NX8VS3V+NbpxS3V+NfZtS3V+NjLRS3V+Nm+BS3V+NqxpS3l+PumBTAV+2yfpTXWAf2i1UEmDr62RV72MI//9UenAIAABU/W/FFwdVaG+OJvZV0G9bNgVWI283RHxWOW8uUpFWOW8uYOxWOW8ub5RWOW8ufm9WOW8ujWxWOW8unIFWOW8uq6pWNm8vuudWUW9YyntWoW/G2qtXRnCh695ZEHLu//9XF3/zAABX1n+rF7lYeX9sJ+9ZG38uNz5Zqn76RfBaBX7cVC5Z+n7fYj1Z9X7fcLVZ7X7gf3BZ5H7gjlpZ2H7fnWdZyX7erJFZuH7du9NZw38Ey2haAn9125NalYBc7LhcSYLO//9aCI/iAABa9o+XGF1byI9TKNdcoI8NOGNdaI7PR05eB46fVcFdq461Y1hdn460ccZdj46zgH1dfY6xj2ldaI6tnnpdT46prapdNI6kvPNdMo7HzIldYo833Kxd5pAk7b5fgZKv//9dRp/TAABeWp+HGPVfVJ9BKa9gWp72OXVhVZ6vSJZiMJ50VzxhN56sZBBhJ56pcpBhEp6lgVlg+p6fkFVg356Zn3dgwJ6QrrZgnp6Ivg1gkp6kzahgtJ8P3cVhKJ/87sRiqKKR//9gza/FAABiAK96GYpjGa8yKntkR67kOnhlb66ZSctmfq5UWKFkqa65ZF5kjK61cvtkda6vgeVkWq6mkQBkO66coD1kF66Rr5Vj8a6EvwFj3K6YzqVj8q753sBkVa/f76tltrJv//9kl7+6AABl3r9wGgZnFL8oKzpoZL7YO2pps76ISu9q774+WfNojr66ZNJn0b7VcvxnuL7Mghdnm77BkVxner60oL5nVb6msDZnKr6Uv75nDb6ez3FnFr7x34lnaL/J8GFopMJA//9or8/PAABqB8+GGoprUs8/K/Rsvs7uPFpuL86cTA9vks5NW0JsvM7aZVBrB88hcp1q7s8Wgfpq0M8JkXdqrc77oQlqh87qsKtqXM7XwFlqJM6xz/5qH87w4BhqX8+y8NtrcdH///9tHOAhAABug9/aGyNv3N+TLLVxYN9CPU9y7t7uTTd0c96cXJlxPt81ZehuP9+0ceNuJd+ogZVuB9+akVlt5N+JoShtvN92sQBtkd9hwN1tYd9K0L5tDd7y4GRtN9+U8RFuGuGj//9x6vDYAABzVfCTG5d0wvBMLYR2WO/8PlV4AO+mTnR5o+9RXgl2I+/yZqpxwPCqcQpxcPClgPJxUfCWkRBxLvCEoStxB/BwsUZw3fBZwV9wq/BA0XZwd/Al4Ytv8e9r8QFwn/El//93d///AAB46P//HD16Yv//LoR8C///P6R9yv//UAd/iP//X+B7zP//Z+53EP//cal1MP//gG11Ef//kQV07v//oYt0x///sgJ0nf//wm90bP//0tN0N///4y9z////84VzAP////9alQYwAABdJQAAC39c9AAAHodcqwAAL79cTAAAQFlb3wAAUJVbaQAAYI5a8gAAcFFafgAAf+xaEgAAj2hZrwAAns5ZVgAAriRZCAAAvXRY7QAAzRVZHQAA3VlZuAAA7rBbtQAA//9a7RPpAABZMhYmEsBZ1BVCIHJZzhUqL7pZxRUJPzRZuBTfTsJZphSuXllZjxR3bfFZdRQ8fYZZVxP/jRVZNhPBnJ1ZFBOErB5Y9BNKu5pY/RMfy2dZShMN29NZ/BMd7U1cChOe//9beyIUAABZ/SM+E09ZNCPaIftZSSPHMEdZTyO9PyZZVyOvTkhZXiOcXZFZZCOFbPNZZyNpfGZZZiNKi+FZYiMpm2JZWyMFquVZUiLhumtZcCLQykNZziLf2rtajyMd7EBcqiP///9cSzE8AABbITHLFAhaaDImIuxaMDJEMStaMDJEP7xaMDJETqJaMDJEXbVaMDJEbORaMDJDfCZaMzI/i3laNTI3mttaNzIrqkhaOTIeub9aYTInyY1ayTJX2f1blDLE63pdtjQD//9dXEDHAABckED9FNJcA0EkI/lbrUE/MltbrEFAQKNbrEFAT1dbrEFAXkhbrEFAbV9brEFAfIxbrEFAi8pbrEFAmxNbrEFAqmRbrUFBub5b10FgyW9cQUGt2cRdEEJD6ydfNEPa//9esVB/AABeQVCBFZ1d7VCDJQxdrFCHM6tdm1CKQdFdm1CKUEZdm1CKXwpdm1CKbgFdm1CKfRZdm1CKjEFdm1CKm3tdm1CKqsFdnVCLuhBdxVCvybVeL1EM2fZe/VHA6z1hIFOh//9gT2BPAABgMmAyFmBgGmAaJhdgCGAINPZf/l/+Q0Nf/l/+UXBf/l/+X/5f/l/+bsxf/l/+fcRf/l/+jNhf/l/+m/9f/l/+qzZgAGAAunlgJ2Anyg9gj2CP2j5hWmFa629jeGN3//9iOHAtAABiYm/9FxpihW/UJxZiqG+vNjRix2+URLpi02+MUtZi02+MYSVi02+Mb8Ri02+Mfphi02+MjY9i02+MnKFi02+Mq8Vi1W+Nuvli+m+3yn1jX3Ao2pdkJ3EG66tmPHNX//9kbIASAABk03/XF8hlK3+kKAdlhX9xN2Jl1n9GRiBmDn8sVGpmFX8qYoBmFX8qcOhmFX8qf5JmFX8qjmlmFX8qnWBmFX8qrG5mFn8ru5FmOn9WywFmm3/M2wBnXYC66/VpYYMy//9m64/8AABnhI+7GGdoC4+BKOlomI9EOH5pHY8OR3Npio7kVe9pvo7SZA5pvY7ScjppvY7SgLRpu47Tj2ZpuI7TnkJps47TrT1prY7VvFRpxI7+y7lqFI92261qwZBq7I9sp5L7//9psp/pAABqdJ+lGPprJZ9mKb1r4J8jOYtslZ7kSLNtNp6uV2Ftq56KZa5tgp6Uc4Ntep6UgeBtcJ6VkIBtY56Un1BtVZ6TrkdtRZ6TvV1tTZ64zLxtjJ8r3KFuJqAh7Wpv6qK8//9svq/YAABtoq+TGZFudq9SKodvWq8LOohwPa7FSeJxDa6GWL9xuq5UZzhxKK53dH9xGq52gtxxCq50kX9w+K5yoFVw465ur1JwzK5rvm9wyK6Izcxw9q7y3aRxfK/h7lFzGrJ2//9wDL/LAABxCr+GGghx/b9DK0NzBr75O3l0EL6uSwF1Db5oWgt17L4taK90rr51dR50nb5yg450ir5ukkN0c75ooSt0Wb5isDl0Pb5av2R0Lr5tzsV0TL7I3pN0u7+p7yV2L8Il//9zqc/cAAB0vc+YGo11yM9UK/t28M8IPGR4H866TB55Q85vW1R6Ts4saiN4gc6Qdch4FM6fg/13/s6YktN35c6Rodl3yc6IsQN3qc5+wEh3fM5jz5N3ic6q31h34c9z7855JNHE//93neAoAAB4xd/kGyB549+hLLd7J99UPVZ8dN8ETUJ9vN61XKd+795sa6N8q97kdot7jt8VhC17dt8NkzR7XN8DomV7Pd74sbV7HN7rwR569t7d0Jl6rN6S3+h669878EF79+FM//97+PDVAAB9KvCUG5N+X/BQLYZ/uPADPliBIu+xTniCie9fXhGD4O8RbTyBM++Zd3R/Hu/3hCl/Bu/tk3F+6u/iotx+y+/VsmB+p+/Gwfh+gu+20Z5+Vu+j4VB91+778HV+pfC2//+BG///AACCV///HDiDnP//Ln+FDP//P6CGj///UAWIFP//X9+JjP//b0mGhf//eOODLf//hE6DFP//k/WC9///o7OC1///s4SCtP//w2GCjP//00iCYP//4zeCMv//8yuBL//8//9pzAiSAABsxAAACP1smwAAHXVsXAAALyZsCAAAQAlrpAAAUIBrNQAAYK5qvwAAcKJqRwAAgGlp0wAAkAppZAAAn49o/QAArv5onwAAvl9oegAAzg1oqQAA3lZpUgAA769rjQAA//9qFhVWAABoXhfgE0lpWBZVIGRpThY9L9xpQBYbP3dpLBXxTyBpExW/Xsto9hWGbnRo1BVIfhdorxUGjbNohxTDnUZoXRR/rNBoNRQ8vFVoOxQJzChojhPu3JdpVBP17hFrphRw//9qjyL0AABpBiRkE71oEyVCIqFoUiUAMLNoVyTyP5JoXCTeTrhoYCTFXgZoYiSnbW1oYiSFfONoXiRfjGNoVyQ2m+hoTSQLq25oQSPfuvdoYSPFytNoyiPM20xpoyQC7NBsBCTc//9rQzHPAABp/DKYFFppHzMfI2xosDNlMcNosTNlQC5osjNkTvxotTNhXgFouTNcbSpovzNTfG5oxTNHi8VoyjM3mytozTMkqptozzMQuhVo/TMSyeZpczM72lhqWDOh69RswTTa//9sL0EuAABrNkGRFQxqgEHZJFhp/kIRMt1p7kIZQRNp7kIZT69p7kIZXpBp7kIZbZpp7kIZfL9p7kIZi/Zp7kIZmzpp7kIZqoZp8EIYueBqIEIyyZRqmEJ72etrgUMM609t60Se//9tVlDLAABsrFDvFcZsKFEMJVFrulEnNAxrjlEzQj9rjlEzUJ1rjlEzX1JrjlEzbjxrjlEzfUlrjlE0jG1rjlE0m6JrjlE0quNrkFE1ui9rvVFYyc9sM1G12gttGVJp60tvfVRI//9uuWCKAABuWmCHFn5uDGCFJkptxmCENT9tmWCHQ6FtlGCIUcVtlGCIYERtlGCIbwdtlGCIffZtlGCIjQNtlGCInCZtlGCIq1dtlWCJupdtwWCwyiluNGEX2lNvFmHh631xcWP8//9wW3BbAABwQHBAFy1wKHAoJzxwE3ATNmtwA3ADRQJv/m/+Uypv/m/+YWpv/m/+b/5v/m/+fspv/m/+jbtv/m/+nMdv/m/+q+ZwAHAAuxdwKXApypdwmHCY2qxxdnF167lzw3PD//9yP4A4AAByXoANF9RyeX/nKCNyln/BN4tysn+iRldyyH+OVK9yzH+LYsRyzH+LcSJyzH+Lf8NyzH+LjpRyzH+LnYZyzH+LrJByzn+Mu69y9H+2yxtzXoAr2xV0NYEX7AF2cYOM//90ZZAcAAB0t4/nGHV1AI+4KP51TY+GOJ91l49aR5511o83ViZ1+Y8mZFB1+o8mcnN1+o8mgOV1+o8mj5B1+o8mnmR1+o8mrVZ1+48nvGB2Ho9Ry7N2go/I25B3UJC97FR5dpNM//92zKAEAAB3SZ/LGQJ3u5+UKc94NZ9bOaR4rZ8kSNZ5GZ71V4x5a57UZeJ5g57Mc/F5g57Mgi95g57MkLB5g57Mn2J5g57Mrjh5hJ7NvSt5oZ70zGR5+59p3CB6uaBh7L18vaL8//95c6/wAAB6FK+zGZN6q695KpJ7Tq85Opx78a77Sf58ia7CWOJ9Cq6VZ2N9Wq57dZN9Tq5+g5F9Sa5/kep9Q65/oH99O66Ar0B9M66BviV9Qa6jzU19hq8R3PN+K7AE7W2AA7KZ//98Wb/gAAB9F7+hGgt9zr9kK05+lr8gO4h/Yb7cSxiAI76cWieA0L5laNKBV748dyqBBr5RhMCA/L5QkwuA8L5QoZaA4r5PsFOA0r5NvzaA0r5lzlOBBL7G3eKBkL+r7jmDNsIo//9/i8/sAACAY8+tGpKBNM9uLAOCHc8oPHCDDc7fTC+D9c6ZW2uEzM5aaj+Fg84neL+Etc5ZhbOEp85XlAWEl85VopmEhc5SsWCEcM5OwE2ET848z0uEbM6I3siE3c9W7vqGTNGn//+DFeAwAACEAt/xGx2E6t+yLLuF8d9pPV+HAd8eTU6IDt7UXLeJC96Oa7eJ7t5SemCImN6hhqGIWd6olNqIRd6ko4aIMN6fsmOIF96ZwWaH/d6S0IeHvd5U34qIEN8B75eJQuER//+HB/DTAACIA/CVG5CJA/BULYmKIvALPlyLUO+9Tn6Mfe9vXhmNnu8lbUiOqe7ifB+M3+9Gh7uMI+9nlZSMD+9hpGaL9u9as2eL3O9SwoyLvu9J0c2Lnu8+4SWLJu6n8AOME/Bh//+Lxv//AACMz///HDKN4v//LnqPGf//P5yQY///UAKRr///X9yS8v//b0iUIf//flqR7P//iV2QdP//lpeQXv//pamQRP//tOWQKP//xEKQCf//07iP5f//40KPwf//8t2OwP+Q//95AwteAAB8YQAABet8PgAAHBt8CAAALl57vgAAP5F7ZAAAUEN6/AAAYKN6igAAcMZ6FAAAgLd5nQAAkIB5KAAAoCd4twAAr7N4TgAAvy14IQAAzux4UQAA30J5CAAA8KF7gAAA//95QRbyAAB3lBm2E8h47hdXIBd44RdAL9B4zxcfP5V4txb2T114mhbEXyJ4dxaMbuB4TxZNfpV4IxYJjkF39BXDneJ3xBV7rXl3lBU0vQl3lxT6zOR38BTZ3Vh4yhTZ7tV7XRVO//95qyP6AAB4ICWmFCh3EybBIz93jSYzMQN3jyYhP+93jyYKTyF3jyXuXnh3jCXMbed3hyWlfWV3fyV6jOp3cyVMnHR3ZSUarAB3VSTou453diTIy2x36STH2+d42ST37Wp7fSXL//96SDKBAAB48zN9FK13+zQwI+x3VDSsMmt3YzSgQKx3aTSZT2h3cDSPXmZ3dzSDbY13fzRzfNF3hjRgjCp3izRKm5J3jjQwqwR3kTQVuoF3wzQQylN4RTQz2sR5RDSS7D978TXG//97GUGsAAB6A0I6FUt5LkKlJLx4hUL+M2N4V0MXQZh4V0MXUBh4V0MXXuZ4V0MXbeJ4V0MXfPx4V0MXjCt4WEMWm2p4W0MRqrl4YEMLuhd4lkMfyc95HUNi2id6IEPu64l8zUV5//98HFEpAAB7SlFwFfN6oVGoJZ16DVHcNHR5vFH8QsB5u1H8UQR5u1H8X6Z5u1H8boN5u1H8fYV5u1H8jKF5u1H8m9B5u1H8qwt5vVH9ulN57lIgye56cFJ82iR7blMv615+ElUK//99U2DSAAB8xGDrFp18TGD/JoN722EUNY97iWEmRAh7d2ErUit7eGErYJh7eGErb057eGErfjJ7eGErjTd7eGErnFN7eGErq4B7eWEsurx7qWFSykl8J2G52mx9IGKC645/tmSZ//9+wXCVAAB+b3CPF0R+KXCKJ2Z95HCGNql9rHCFRVJ9jnCGU4x9jnCGYb19jnCGcER9jnCGfwV9jnCGje59jnCGnPR9jnCGrA99kHCIuzt9vHCwyrd+NnEe2sV/KHH668qBrXRC//+AZ4BnAACATYBNF+OANoA2KEOAH4AfN7uADIAMRpaAAYABVP1//n/+YxV//n/+cWZ//n/+f/5//n/+jsd//n/+nbN//n/+rLiAAIAAu9OAKYApyzqAnYCd2y6BhoGG7BKD9YP1//+CR5BDAACCX5AdGH6CdI/5KRiCio/UOMSCoY+yR9CCt4+YVmSCxo+LZJuCx4+KcraCx4+KgR+Cx4+Kj8OCx4+KnpGCx4+KrX6CyI+LvISC7Y+0y9KDWZAp26iEOJEb7GWGjJOk//+EYqAmAACEpJ/3GQyE4Z/LKeCFI5+bOcKFZZ9uSP6Fop9HV7+F0p8sZh+F5Z8jdDOF5Z8jgmiF5Z8jkOOF5Z8jn4+F5Z8jrmCF5p8kvU+GBp9KzIGGaJ+93DSHOqCy7MOJbaNG//+Gt7AOAACHHq/ZGZaHf6+nKqCH6q9wOrSIVa86Sh6Iuq8JWQqJEa7hZ5SJTK7Jdc2JVK7Gg9qJVK7GkiaJVK7GoK2JVK7Gr2CJVa7HvjSJb67nzUeJxq9U3NKKh7BF7S2MlLLT//+JRr/5AACJzL/CGhCKTr+MK1eK3b9PO5qLb78SSzKL/L7ZWkmMe76naPuM4b6Cd1qNEr5xhXSNEb5yk46NEL5yoeyNDr5ysH2NCr5zvzaNGb6LziqNXL7s3Y6OAr/R7biP2MJJ//+MHdAAAACMv8/GGpeNXc+NLA6ODc9NPH+Ow88LTEOPdc7LW4WQG86Ral+Qq85ieOWREc5ChySQ6s5MlPOQ485MozmQ2s5NsbmQ0c5NwGeQvc5Azy2Q6M6P3nGRb89e7muTB9Gq//+PSuA7AACQA+AAGxmQud/GLMCRiN+DPWmSX989TVyTNd74XMmUAN63a86Ut95/enyVTN5UiOKUy950ljmUwN5zpH2Us95ysv+UpN5xwbGUlN5w0IqUYN4831CUxd7q7xyWGOD2//+S3/DQAACTqfCWG4uUefBZLYqVYfAVPmCWV+/MToWXTu+DXiOYPO89bVaZGO7+fDCZ1+7JisGY4O8El4GYu+8Ipb+Yq+8FtFKYmO8CwxeYhO7+0gKYbe764Q2YAO5077CZCPAp//+XQv//AACYHP//HCuY////LnOaAv//P5ebFf//T/6cKv//X9mdOv//b0eeOv//flqfIP//jSKdvf//mVqdQP//p2OdLf//tiCdGf//xQ2dAf//1CCc6P//41Gcy///8pyb1P89//+IOQ48AACL/gAAAlKL4AAAGm2LsAAALWiLbwAAPvOLHQAAT+KKvQAAYHOKUgAAcMKJ4AAAgN2JagAAkMyI8gAAoJeIfQAAsEOIDQAAv9iH2wAAz62IDgAA4BSI1AAA8X2LiAAA//+IcBi3AACGzxulFD6IjxhJH4eIgRgzL5OIbBgUP4yIURftT3iIMBe9X1qICReGbzCH3RdIfvuHrBcFjrmHeBa+nmyHQRZ0rhKHCxYrva+HDRXszZWHbBXG3hGIWRXD75GLKxYy//+IzCUmAACHRycFFI2GKChWI9eG6ydcMTCG6SdJQDKG5ScwT3WG4CcRXtyG2SbtbleGzibDfd+GwSaVjW6GsSZjnP+GnSYurJKGiSX3vCWGqiXRzAmHJSXL3IaIKiX17gmLDybE//+JWDNQAACH/DR6FQCG8jVZJGuGIjYJMxKGUjXbQSOGWDXQT9mGXjXCXtWGZTWxbf2GazWcfUOGcTWDjJ6GdDVnnAiGdjVIq3yGdzUnuvuGrDUdys+HOTU520CITzWT7LiLPjbA//+KEkJCAACI6kL4FYuIAEOFJSGHNUQCM+yG2kQ8QjKG2kQ8UJKG20Q8X0mG3EQ6bjaG4EQ3fUeG5EQxjHOG6kQpm7SG8EQeqwaG90QRumeHM0Qgyh+Hx0Rc2neI40Tj69aL0UZo//+K+lGaAACKC1ICFiSJR1JWJeyIk1KmNOGIG1LeQ0qID1LkUX2ID1LkYAmID1LkbtWID1LkfcyID1LkjN+ID1LknAWID1LkqzuIEVLlun6IRlMIyhOI1VNh2kaJ7FQP632MzlXk//+MD2EqAACLW2FdFsKKwmGJJsCKL2G0NeWJu2HZRHaJkmHoUqGJkmHoYPqJkmHob6CJkmHofniJkmHojXSJkmHonImJkmHoq6+JlGHpuuaJx2IPym2KUGJ02oqLXmM866KOLmVP//+NVHDbAACM2HDrF2GMbHD5J5aMAHEINuyLo3EXRaqLanEjU/iLZXEkYh2LZXEkcJWLZXEkf0qLZXEkjiuLZXEknSmLZXEkrD6LZ3Emu2WLl3FNytuMGnG62uKNIHKT696P23TW//+OyoCgAACOg4CYF/iOQoCRKGiOAICKN/CNxYCGRtyNmYCEVVONioCFY3ONioCFcbaNioCFgEONioCFjwONioCFneiNioCFrOeNi4CGu/2Nt4Cvy16OM4Eg20uPL4IH7CWRz4Rv//+Qc5BzAACQW5BbGIqQRJBEKTKQLZAtOO6QGJAYSAiQCJAIVqqP/4//ZO6P/o/+cwWP/o/+gWOP/o/+j/6P/o/+nsWP/o/+rayQAJAAvK6QJ5Any/aQmpCa28WRiZGJ7HiUCZQJ//+SUKBPAACSYqAsGRqScqAKKfaShJ/mOeOSlp/ESSuSqZ+mV/eSup+RZmOSwp+JdIGSwp+JgqySwp+JkR2Swp+Jn8OSw5+Jro6SxJ+KvXiS5Z+vzKWTTqAf3FGULaEQ7NaWh6Ob//+UYrAxAACUmLAGGZuUzK/dKrGVBa+wOs6VPq+DSkKVdq9aWTmVqK85Z8yVzK8ldg+V1K8hhByV1K8hkmCV1K8hoOGV1K8hr46V1K8hvl2V769AzWuWS6+q3O+XF7CW7UCZRrMb//+WqcAYAACW/7/pGhaXU7+6K2OXsL+FO7CYD79RS1CYbL8fWm+Ywb70aSmZB77Td5CZLr7DhbOZML7Ck8iZML7CoiCZML7CsKuZL77Cv12ZQr7ZzkiZjr823Z6aRcAW7bacQMKC//+ZM9AXAACZpc/kGp6aFs+yLBialM94PJGbFs89TFubl88EW6OcEc7QaoSce86leRGcyc6Ih1ec4s5/lWOc4s5/o5Cc485/sfic485/wI6c2s51zzydFM7A3mGdsM+L7jifbdHM//+cD+BHAACcmuATGxWdI9/dLMadwN+gPXWeZN9gTWufB98hXN+fpN7ma+mgMt6zepygp96KiQig8d5zlzag4953pS6g3t53s3ig2d54wfeg09550J+gq95O3z6hId757tmik+D7//+fUfDMAACf7/CXG4egkvBgLYihSvAgPmaiDO/cTo6i0O+ZXjCjju9YbWakP+8dfESk2u7sitilUe7ImS6lB+7bptCk/u7btROk9O7bw4+k6e7b0jik3O7b4Qeke+5l736lmvAR//+jYP//AACkEP//HCOkx///Lmylmv//P5Gmev//T/unXP//X9WoO///b0SpDv//flqpzf//jSOqbv//m6ypwf//qN2pq///tyipnf//xbqpjv//1Hupff//42Kpav//8miof/8K//+XcBEaAACbMwHSAACbgAAAGFqbVgAALECbGwAAPjKa0QAAT2GaeQAAYCSaFgAAcJ6ZqQAAgOCZNgAAkPSYvwAAoOGYSAAAsK2X1AAAwGCXoQAA0E6X2QAA4MeYsAAA8j6boAAA//+XoBqgAACWDB2qFKuYNhksHq+YJhkYLySYEBj7P1qX9BjWT3GX0BiqX3OXpxh0b2SXeBg5f0aXRBf3jxqXDBewnt+W0RdorpaWlhcbvkSWlhbczjaW/Baz3ruX+xas8EGbChcZ//+X8SZ1AACWdCh9FO+VSyn/JGiWYSh5MTOWXChlQFWWVShMT7CWSygtXyuWPygIbraWMCfdfkuWHietjeaWCSd5nYKV8CdArR2V1ycGvLmV+CbdzKKWeybT3SKXlCb47qWatifD//+YbzQ8AACXEjWQFVKV/DaXJOeVDTd4M7WVbjcUQYeVcjcGUD+Vdzb1Xz+VezbgbmyVfjbHfbeVgTaqjRaVgTaKnISVgDZmq/2VfjZBu3+VtTYxy1SWTDZJ28OXdzad7TiapDfE//+ZF0LwAACX5UPKFcyW6kR5JYeWBkUaNHWVeEWAQtuVg0V3URaViEVyX7uVjkVrbp2VlUVifamVnEVXjNSVo0VJnBWVqkU5q2eVs0UnusmV80UvyoKWkkVm2teXxUXm7DGa8Udl//+Z6FIeAACY51KlFlaYDlMVJj2XP1OCNVKWpVPWQ9eWf1PsUgaWf1PsYHqWf1PsbzSWf1Psfh2Wf1PsjSWWf1PsnEOWf1Prq3KWg1PqurKWv1QHykmXW1Rb2nqYilUD66+bqFbQ//+a4mGRAACaFGHfFueZYmIiJwCYsWJlNj+YHmKgROmX1GLAUymX1GLAYWmX1GLAb/6X1GLAfsmX1GLAjbqX1GLAnMaX1GLAq+aX1mLBuxeYDGLmypeYn2NK2quZwmQQ67mcyWYf//+cBnEtAACba3FTF3ua4XF1J8maVHGYNzSZ13G6RgeZgXHUVGqZcXHZYouZcXHZcPKZcXHZf5qZcXHZjnCZcXHZnWaZcXHZrHSZc3Hbu5aZpXIBywWaMXJs2wSbSnND6/WeOHWA//+dVoDkAACc64DuGBKciYD3KI+cI4ECOCqbxYENRyibeoEYVbGbV4EfY+CbV4EfchKbV4EfgJKbV4Efj0ibV4EfniSbV4EfrR2bWIEhvC2bh4FIy4icCoG322ydF4Kb7Dyf54T7//+e05CsAACelZCjGJmeWpCaKVKeG5CRORyd4JCJSEWdrpCFVvadjZCEZUmdhpCEc2CdhpCEgbKdhpCEkEOdhpCEnwKdhpCEreKdh5CFvN6dsJCrzCCeKpEc2+afKZIH7I6h05R+//+gf6B/AACgaKBoGSqgUqBSKhCgO6A7OgmgJKAkSVygEaARWDWgBKAEZq6f/5//dNif/5//gvmf/5//kWGf/5//n/+f/5//rsSgAKAAvaigIqAizM+gkKCQ3HKhfaF97Oyj/KP8//+iWrBaAACiZ7A6GaGic7AbKsWiga/4Ouyij6/VSmyin6+2WW2irq+daAqiu6+Ndliiv6+JhGiiv6+JkqOiv6+JoRyiv6+Jr8KiwK+Jvo2i26+mzZSjOrAN3Q+kErD07VamYLNs//+kZcA8AACkksAVGh6kvb/vK3Kk7r/DO8mlIb+YS3GlU79uWpqlgr9KaV2lq78vd82lxL8ghfmlxr8flAqlxr8folqlxr8fsN+lxr8fv42l2L80znCmJ7+N3b+m5sBo7cuo+sLH//+mrdAzAACm9tAHGqenPs/cLCCnkM+qPKKn5c93THWoOc9FW8Wois8Yaq2o0c7zeUKpCc7Yh4+pH87PlaGpH87Po8epH87PsiipH87PwLipGM7Gz2SpU88O3oCp9s/S7kyrydIF//+pQuBWAACppOAoGxKqB9/4LM6qdt/CPX+q7N+JTX6rYd9RXPer098cbAesO97tesCslN7JiTKszt6yl2as2N6vpXKs2N6vs7Cs2N6vwiKs2N6v0L2su96K31StPd8v7tiux+Ei//+sO/DJAACssfCZG4KtLPBnLYetuPAtPmuuTO/vTpiu4e+xXj2vc+92bXev/O9AfFqwde8TivOw1e7xmUyxBe7hp2+xAu7itYixAe7iw96w/u7j0mOw++7j4Q6wqu5973Kx3fAb//+v+///AACwhf//HBqxFf//LmWxu///P4uya///T/SzH///X9Gz0f//b0G0ev//fli1Ff//jSS1mP//m6619f//qgG1zv//t+W1yP//xje1wP//1L21uP//4261rv//8kG01f73//+mpxP3AACp8gZrAACrHwAAFciq+QAAKuGqxQAAPUyqggAATsGqMQAAX7ep1AAAcFypbQAAgMSo/wAAkPuoiwAAoQqoFQAAsPanoAAAwManbgAA0M2nrAAA4VuolgAA8uGrvwAA//+m0RynAAClTB/DFRKn4RoDHYin0RnvLoCnuhnVPv+nnBmzT0eneRmHX22nThlWb3ynHRkdf3em5xjdj2GmrBiZnzqmbRhQrwWmLhgGvsOmLxfFzsSmmhed31OnrReT8N+q9RgB//+nGifkAAClpyoPFUukeCu7JPGl6CmLMQul4Sl3QFWl1yleT8+lyik/X2GluikZbwClpyjufqalkCi+jk6ldiiJnfalWShQrZ2lPCgUvUOlXCfozTOl5Sfb3benEif97zqqbijF//+nizVFAACmMja9FaGlFDfqJV+kDzj5NFSkrThHQdKkrzg3UJSksDgjX56ksTgMbtOksjfwfiaksDfRjYykrTeunQCkqDeHrH2kozdevASk2jdKy9uleTdd3EumuDes7buqHzjP//+oJEO1AACm7kSwFg2l6EWAJe2k70ZENP2kOUbWQ4OkX0a0UZSkZUasYC+kbEahbwykc0aUfheke0aEjUGkgkZxnIOkiUZcq9akkEZFuzqk00ZIyvOlfEZ620Wmw0b17JmqKUhs//+o4lK1AACn1lNaFomm7VPmJpGmCVRwNcOlUVThRGWlBFUTUqKlBFUTYPqlBFUTb6ClBVUSfnmlB1UQjXalC1UMnI+lEFUHq72lF1UAuv6lWVUXypSmAFVk2sOnRVYG6/GqnFfK//+pxmIIAACo5mJwFxGoH2LKJ0OnV2MmNp2mqWN4RWCmPGOuU7emM2OzYeimM2OzcGimM2OzfySmM2OzjgmmM2OznQymM2OzrCSmNWO0u06mbmPYysenCWQ62tKoQGT+69OrfWcF//+q0HGNAACqHXHJF5qpenH/J/6o03I3N4CoOnJsRmmnx3KWVOGno3KlYwino3KlcVuno3Klf/Wno3Kljr+no3Klnayno3KlrLKnpXKnu82n2nLMyzWobnM12yqpmXQJ7A+st3Y+//+sAYEzAACreoFPGCWq/IFqKLqqeIGGOGip+4GiR3iplIG7VhOpWYHNZFSpVYHOcnqpVYHOgOypVYHOj5apVYHOnmmpVYHOrVupV4HPvGSph4H1y7eqEoJi25KrL4NB7FauKoWY//+tWpDuAACs/JD0GK2so5D5KXSsRJEAOU+r55EHSIerl5EQV0irXJEYZaurSpEbc8arSpEbggqrSpEbkJCrSpEbn0arSpEbrh+rTJEdvRWrdpFBzE+r9pGu3AytApKV7Kiv1JUB//+u3aC3AACupaCtGTOub6CjKiquNKCZOjGt+qCPSZOtxqCIWHmtnKCEZv+thaCDdTetg6CDg1Ctg6CDka6tg6CDoEKtg6CDrwCthKCEvd+tp6ClzP2uGqEQ3JevEqH37QWxtaRq//+wi7CLAACwdbB1GaqwYLBgKt2wSbBJOw6wMbAxSpmwHbAdWaWwDLAMaE+wArACdqev/6//hL+v/6//ku+v/6//oV+v/6//r/+v/6//vsOwGrAazcKwfbB93TSxX7Ff7W+zybPJ//+yZMBmAACybsBJGimyd8ArK4WygcAJO+OyjL/nS5eymL/HWsmypb+raZaysb+WeBGyu7+KhkayvL+IlFWyvL+Iop2yvL+IsRuyvL+Iv8Kyzr+bzp6zHr/w3eSz5cDE7eS2EMMV//+0c9BTAAC0mdAvGq60vtALLCu06M/iPLa1FM+3TJG1Qc+OW+q1bc9oatu1lM9JeXi1tc8zh821xc8plee1xc8ppAS1xc8psl+1xc8pwOm1wM8jz5K1+s9l3qW2otAj7mS4h9JG//+2yuBoAAC3COBAGw63SOAXLNe3j9/oPYy33N+2TZO4KN+FXRG4c99XbCi4uN8veui49d8PiWC5H976l5q5Kd72pae5Kd72s925Kd72wkm5Kd720N+5EN7Z33i5lN927u+7KuFY//+5f/DGAAC51PCbG366K/BvLYa6jvA7Pm+6+PAETqG7ZO/NXku7ze+YbYq8Me9ofHG8i+8/iw+80+8gmW28/O8Qp5W8/u8Ptau8/u8Pw/q8/u8P0ni8/u8P4Ru8uO6574a99vBE//+89f//AAC9Xf//HBG9yv//Lly+R///P4W+zf//T+y/V///X82/3v//bz7AYf//flfA2f//jSPBQP//m7DBjP//qgTBpv//uCjBpv//xmHBpv//1M/Bpv//42fBpv//8iLA5v8H//+15BbWAAC40AtzAAC6wwAAEom6oQAAKUe6cgAAPEG6NQAATge56wAAXzS5lQAAcAO5NAAAgJG4ywAAkOy4WwAAoRy35wAAsSe3bQAAwQ63PgAA0S63hAAA4dC4gAAA82S74QAA//+2CR7LAAC0kiHwFXK3kxrPHAi3gxq+Lam3bBqmPn+3TxqETv23KxpcX0y2/xotb3u2zRn3f5K2lhm6j5S2Whl6n4O2GRkyr2K10hjnvy210hiqzzy2RRh939e3aBh38Wi66Rjg//+2Syl1AAC04iu6FaOzsS2LJXS1gSqTMLa1eCqAQDO1bCpnT9G1XCpJX4C1SSojbza1Min5fu+1GCnJjqi0+ymTnl+02ilarhO0sikcvb+00ijvzbi1YSjg3kC2nykA78S6MSnF//+2sTZsAAC1XjgDFfC0PDlSJdWzJjqMNO+0DDl0QgK0CzljUNW0CjlOX+20CDk1bzC0BDkYfo6z/zj3jf2z+TjRnXqz8DiorP+z4Th7vIa0GDhkzGG0vThz3NC2Dji/7j25qTnc//+3PUSUAAC2B0WtFk60+UacJlKz8EeDNYWzHEg+RCuza0fyUgezcEfnYKCzdkfZb32zfEfJfoqzgke2jbazh0efnPuzjEeGrFKzjEdpu7Oz0Edoy2u0gUeU27q120gK7Qe5dEl6//+361NjAAC211QjFsK15FTJJue071VwNje0HVYBRPezo1ZYU02zq1ZRYYWzr1ZNcBmztFZIfuezulZBjd6zwVY5nPOzyFYurCCzzFYhu1y0ElYyyvC0w1Z52xu2G1cU7EK5pljP//+4vGKTAAC3z2MSFzq2+WOEJ4q2HmP4Nv61WGRjRdy0zGSxVEu0rWTEYni0rWTEcOK0rWTEf460rWTEjma0rWTEnV60rWTErG60qmTCu4y05mTkyv61jGVC2wK212X+6/26Rmf7//+5sHH+AAC46nJPF7+4NXKYKDe3d3LmN9G2xnMvRtG2OXNtVV6193OMY5W193OMcdS193OMgF2193OMjxu193OMnf2193OMrPu19HOKvAu2K3Ouy2q2xnQV21W4AnTl7Cy7THcS//+6x4GQAAC6KYG/GD25loHqKOi4+IIYOKq4YYJGR8634IJwVn23i4KOZNC3fYKTcvK3fYKTgVO3fYKTj/G3fYKTnrq3fYKTraO3e4KSvKK3rIK2y+y4PYMg2725aYP87HO8jYZI//+8ApE8AAC7ipFSGMW7GJFmKZm6nZF8OYW6JJGTSM+5uJGqV6C5ZZG9ZhO5QZHHdDu5QZHHgnC5QZHHkOq5QZHHn5W5QZHHrme5P5HGvVK5apHozIS57pJS3Da7CJM07MS9/pWU//+9YqD6AAC9D6D9GT68vaEAKke8ZKEDOl28C6EHSc67uaEMWMO7daETZ1e7SaEZdZ27QqEag7S7QqEakga7QqEaoJG7QqEar0a7QaEZvhy7ZaE4zTK72qGe3MG83qKA7SK/n6Tm//++6bDEAAC+trC6Gba+hLCvKvK+TbCjOzK+FLCYSsm94LCPWeO9srCIaJi9kbCFdv69grCEhSC9grCEk0W9grCEoay9grCEsEO9gbCDvwC9nLCczfe+ALD63V6+6rHW7YvBb7Qx///Al8CXAADAgsCCGjbAbsBuK5vAV8BXPAHAP8A/S7/AKcApWvzAFsAWadTACMAIeFnAAMAAhpm//7//lKm//7//oue//7//sV6//7//v//AD8APztLAX8Bf3g3BLMEs7f/DbMNs///CdNB4AADCe9BdGqvCgtBALDjCidAgPM3Cks//TLLCm8/eXBPCpc/Baw3Cr8+oebLCuc+XiBHCv8+PljTCwM+OpErCwM+OspzCwM+OwSDCvc+Lz8XC9s/I3s7DodB+7n/FlNKP///Ek+B8AADEsuBbGwzE0+A5LOLE9+ASPZvFHt/oTafFRt+/XS/Fbd+ZbEzFkt93exPFtN9ciZLFzt9Kl9TF1t9FpePF1t9FtBHF1t9FwnXF1t9F0QTFw98x36DGSN/F7wrH5uGV///HCvDCAADHQPCeG3nHePB3LYXHuPBKPnPH+/AbTqvIQe/rXlvIhu+9bZ/IyO+SfIvJBO9viy3JNu9TmZHJVO9Ep77JWO9DtdDJWO9DxBbJWO9D0ozJWO9D4SnJHu7/76DKXfB2///KNv//AADKgP//HAfKzf//LlTLJ///P3zLhv//T+TL6f//X8XMSv//bznMqf//flTNAf//jSPNTv//m7HNiP//qgfNof//uCzNof//xlzNof//1MDNof//40/Nof//8gHM+P8v///FxxnUAADIZxAkAADLEQAADlzK8gAAJ5DKxwAAO0fKjwAATXXKSwAAXuvJ+gAAb/XJoAAAgLbJPAAAkT/I0QAAoZvIYAAAsdHH6wAAwebHDgAA0XLHXQAA4ifIbAAA88jMAQAA///F6CEqAADEfSRUFenHnhyTGyzH3RuiLMbHxhuLPhDHqRtrTtrHhRtFX2PHWhsZb8HHKBrogAHG8BqskCnGsxpsoDzGcRoqsDzGKxnhwCvFfhmBz6DF9xlb4ETHLBlR8dzK3xm6///GIStNAADEwi2pFhPDjy+aJhnFxSu9MGDFuyuqQCfFrSuST/zFmyt1X9fFhitQb7PFbCsmf47FTyr2j2bFLirDnzrFCiqJrwnE4ypMvtLEVinxzi7E6yng3rzGOSn/8EDJ/CrB///GezfhAADFLjmTFlXECTsDJm3C5jxmNbjEHTrPQk/EGjq+UUTEFjqpYHrEETqPb9jECjpxf0/EAjpOjtfD9zonnmrD6zn8rgTD3DnOvaPDajl8zODEFDmI3VDFdTnQ7rnJQDro///G9kXHAADFwUb8FqvErkgHJtzDmUkRNjzCq0n0RQvDL0lsUq7DM0lfYVTDN0lPcEHDO0k8f17DP0kmjpvDQkkNne/DREjxrVbDRUjSvMnC6EiKy+bDnkiy3DLFCEki7XnI0UqL///Hj1RpAADGeVVCFw/FfFYCJ2HEeVbGNtvDkld2RcHC8lfyVDzDEVfYYlrDF1fRcOzDHVfIf77DJFe+jrzDLFeyndrDM1ejrRHDO1eSvFzC6VdUy1rDoVeW24DFC1gq7J7Iw1nc///ISGN4AADHUmQPF4PGcWSXJ/XFhWUkN47Eq2WoRpDEA2YRVSHDwWY7Y2HDwWY7cb3DwWY7gGDDwWY7jzPDw2Y6nivDxmY3rT3DyWYzvGXDemX/y0fEKWZW20bFh2cL7DjJI2j7///JH3LLAADITHMwF/XHiHONKJPGt3PwOE7F8HRPR27FS3ShVhvE6HTUZG/E4XTYcqfE4XTYgSfE4XTYj9/E4XTYnr/E4XTYrb3E4XTYvNHEk3Soy6bFM3UM24TGfXXY7EzJ73f8///KE4JHAADJZIKIGHDIvoLEKTbIC4MFORbHXYNGSFbGxIOBVyHGVoOuZY/GNYO8c7vGNYO8ghPGNYO8kKvGNYO8n3HGNYO8rlnGNYO8vVvF74OMzCfGhIPz2+zHvYTJ7JPLBYcK///LJZHfAADKmJIEGOzKEpInKdvJf5JOOd/I7ZJ1SULIaJKbWCzH/ZK7ZrfHwpLPdPbHwJLQgyTHwJLQkZfHwJLQoD/HwJLQrw7HwJLQvfrHgpKizL/ICpMI3GbJL5Pk7OTMRJY3///MVaGHAADL66GYGVvLg6GoKn7LEKG5OqnKnKHLSi7KL6HeWTjJ0qHwZ+HJkaH/djvJgKIEhFrJgKIEkqTJgKIEoSnJgKIEr9zJgKIEvrHJTaHbzW3JxqI93PDK0qMY7UHNrqVu///NpbE5AADNWrE6GdDNELE7KxvMvLE7O27MZ7E9SxbMFrE/WkHLzrFDaQjLlrFId37Ld7FMhbHLdrFMk9HLdrFMojHLdrFMsMTLdrFMv37LUbEszjHLtrGF3YzMp7JZ7arPQrSk///PFMDuAADO5sDkGkvOuMDZK7fOg8DMPC3OTcDAS/nOGcC0W0TN6sCrainNw8CleLzNqMCihwnNoMCilR/NoMCio1bNoMCiscbNoMCiwGLNjMCPzwzN3MDa3jvOrcGf7h7Q/sPM///QotCjAADQj9CPGqrQe9B8LEfQZdBlPOfQTdBNTNPQNtA2XD/QItAia0LQEdARefHQBdAFiFnP/8//loXP/8//pJfP/8//suHP/8//wVzP/8//z//QNtA23vvQ49Dj7p3S4NLg///SjeCUAADSkuB6GwrSl+BfLOrSnOBAPazSouAfTb/Sqd//XU3SsN/hbHLSuN/Ge0HSwd+xicjSyd+jmBHSzd+epiXSzd+etEnSzd+ewqbSzd+e0S3Swt+T383TRuAe7yfU6OHY///Uy/C/AADU5vChG3XVAvCBLYbVIfBbPnnVQ/AzTrfVZ/ALXmvViu/kbbTVre/BfKbVze+ji07V6e+MmbbV/O9+p+jWAO98tfjWAO98xDXWAO980qPWAO984TjV1e9M77zXE/Cu///Xrf//AADX3P//G/3YDf//LkvYRv//P2/Yg///T9zYwv//X77ZAf//bzTZP///flDZef//jSDZrf//m7HZ1f//qgnZ6v//uDDZ6v//xlXZ6v//1K/Z6v//4zTZ6v//8dzZXv9c///W5x0OAADZTBSNAADcpAAACHjciAAAJcbcYAAAOnvcLAAATTfb7AAAXxPboQAAcHDbTAAAgXva7QAAkknahgAAoubaGAAAs1vZpQAAw63ZLwAA0+DXNQAA4mLYVQAA9BDcGgAA///XAiPgAADVoScQFozYoB9zG0zZeByzK+vZYRyePdXZRByCTwvZIRxdX+jY9hwycI7YxBwBgQ/YjBvMkXLYThuQob7YDBtMsfXXxBsGwhjXeBq/0irVrhos4J3W8xoj8jra1BqP///XMi2OAADV2y//Fq/UqDIOJvzXSi0pMCPXPi0XQFbXLyz/UH7XHCziYJ7XBCy/cLjW6SyVgMvWySxnkNjWpiwzoN/Wfyv7sN7WVCu+wNbWJyt90MfUfyrb3yfV2yr58KzZzCu3///XfDnMAADWNDuXFufVDD0nJ0bT4D6xNtHVcDyAQt7VazxvUg7VZTxZYXvVXTw/cQvVUzwggLHVRzv9kGbVOTvVoCXVKTupr+nVFjt6v7HVATtGz3vTfDqa3cfU6jrf7yvY4Tvy///X4Ud6AADWr0jJFzLVl0nxJ6bUdkseN0XTdEwoRk/UOEtOU7XUOktAYoHUPEsucZTUPksagNbUP0sCkDjUP0rnn7HUP0rIrzzUPUqnvtPUOkqCznTS0UnQ3KnUSEo87ejYOkuc///YYFX5AADXRlbrF5DWQ1fFKBvVNFinN9DUOll2Ru/TeloXVaDTvFnbY6rTwlnRclPTyFnGgT7Tz1m5kFfT1lmpn5PT3VmXrujT5FmDvlHT6llszcrSmVi22+vUEFlF7P/X8Vrs///Y92TxAADX+2WeF/DXD2Y9KJ/WFGbkOG/VKGeCR6XUZmgHVmrT+mhSZNnUAWhOczPUBGhLgd7UCGhHkMDUDWhBn8rUE2g7rvPUGmgyvjTUIWgozYjS4Wdy25nUT2gf7IDYEmoD///ZpHQyAADYx3SsGFrX9XUdKS7XFXWVORrWO3YLSGvVf3ZzV0fU/na9ZcnU43bNdBTU43bNgpnU43bNkVrU43bNoEfU43bNr1PU43bNvnjU43bNzbDTsXYZ27nVCXbg7HLYoHj2///aaIOfAADZqoPxGNDY9oQ/KcDYMISTOc3XboTnSTnWv4U1WC/WN4VzZsjV/IWQdRfV/IWQg3LV/IWQkhHV/IWQoOLV/IWQr9fV/IWQvufV/IWQzg7U4YTZ3CHWJIWr7LbZi4ff///bQJMkAADapJNYGTTaC5OKKlLZY5PBOoHYu5P6SgvYH5QwWRzXnZRfZ83XS5R/djHXP5SEhGzXP5SEkuTXP5SEoZTXP5SEsG7XP5SEv2fXP5SEznnWQZPQ3JnXbpSl7Qfan5bp///cLqKzAADbsaLRGZ3bNaLuKuTaq6MOOzPaH6MvStzZmqNQWgjZJqNvaNLY0KOId03YraOThYfYraOTk9TYraOTol/YraOTsRrYraOTv/jYraOTzvPX0qLr3STY5qO/7WTb2aYE///dMLJEAADc0bJQGgvccbJcK3LcBrJqO+Hbl7J4S6nbLLKHWvDay7KXadTafbKleGbaTbKwhrXaRrKylN/aRrKyo0LaRrKysdnaRrKywJraRrKyz3rZlbIf3cDai7Lr7czdNrUi///eR8HNAADeA8HMGnfdv8HLK/fdccHKPIjdIMHJTG3c0MHJW9Dch8HKas3cSMHNeXfcGsHRh9vcCMHTlgXcCMHTpDvcCMHTsqzcCMHTwUzcCMHT0A/biMFi3m3cXMIe7j/euMQ3///fctFIAADfSNE9GsDfHdEyLHne69ElPSfet9EYTSnehNELXKXeVNEAa7veKtD3enzeCNDyiPXd9NDwlzPd8dDwpUrd8dDws5Ld8dDwwg3d8dDw0LDdrNCv3y3eWNFS7r7gXNM5///gruCuAADgnOCcGwngieCJLO/gc+BzPb7gW+BbTdngROBEXW/gLuAubJvgG+Abe3LgDOAMigHgA+ADmFHf/9//pm3f/9//tIjf/9//wtvf/9//0Vvf/9//3//gf+B/70jiIuIi///itPC9AADit/ClG3LiuvCLLYfivfBtPoHiwfBNTsPixfAtXnziyvAObcvi0O/yfMLi1+/ai2/i3+/Imd7i5e+9qBXi5++7tiTi5++7xFfi5++70rzi5++74Ujiz++i79zkB/Dr///lSf//AADlYP//G/Llef//LkLllP//P2Llsv//T9Pl0f//X7bl8f//by3mEP//fkrmL///jR3mS///m6/mY///qgrmcP//uDPmcf//xk7mcf//1Jzmcf//4xbmcf//8bTmCv+O///qMiCxAADsaBkKAADwbwAAAR3wVAAAI/DwLwAAOgbv/wAATYjvwwAAX/bvfAAAcc/vKgAAg0juzwAAlH3ubAAApX3uAQAAtlLtkAAAxwHtGwAA15HsowAA6APoOwAA9DzsKwAA///qRScZAADo7SpOF3DrzSLXG83tQx4TKzPtLR3/Pf3tEB3lT8/s6x3FYSjswB2ecjzskB1tgyDsWB03k+PsGhz9pInr1Ry/tRjrjBx9xZHrQBww1fnq8Bvj5k/muhrw8oHqwxtg///qaDBpAADpFzLuF5Hn4TUcKEXq+i8FMCLq7S70QPTq3C7dUZjqyC7BYiTqry6ecp7qki52gw3qcC5Jk3HqSy4Vo8vqIS3dtB3p8y2hxGXpwy1g1KTpjy0d5NvlhCvq8Qbpmyyp///qnTxkAADpWD5LF8ToLj/5KITm90GrOG/o6z7CQ+fo5D6wU3fo3D6ZYz3o0T5/cyHoxT5fgxnotj48kxzopT4ToyfokT3nszfoez22w0noYz2B01zoRz1K427kajvq75Lohjz3///q5EnvAADpsUtYGATolUyeKNfnak3tONLmVE8gSDXnZU3eVWHnZE3PZHTnZE28c83nY02mg1XnYk2MkvznYE1vorrnXE1OsonnV00rwmTnUE0E0kjnSEza4jPjmEtU7lPnrUyr///rO1heAADqIFloGE/pFVpdKTzn+ltdOUrm7lxOSL7mEl0UV8DmhVylZcPmiVyZdKPmj1yMg8fmlFx8kxvmmlxqopLmn1xVsiTmpFw+wcrmqVwk0YDmrFwI4ULjKVpi7WPnLFv+///romdRAADqoGgUGKfpq2jKKbDopGmLOdLnpmpGSVnmy2roWG3mOmtWZybmVGtAdZPmWWs6hGbmX2szk3bmZmsqorHmbmsgsg7mdWsUwYTmfWsH0Q/mhWr34KvjLGk67NLnEGsP///sFHaQAADrLncdGQrqUXeiKinpYXgyOmXodXi/SgLno3lAWSjnBnmiZ/HmzHnHdnXmzHnHhRbmzHnHk/jmzHnHowrmzXnGsj/mz3nFwZDm0nnC0Pbm1nm+4G/jqXfy7KfnYHn3///skoX4AADryYZcGWXrBoa7KqfqMIcjOv7pWoeMSrHolofuWezn9ohAaMfnm4hxd1fnlYh0hdHnlYh0lI7nlYh0o4DnlYh0sprnlYh0wdLnlYh00SHnlYh04ILkmYag7NzoGojF///tGJVyAADsbpW1Gb/rxZX3KyjrC5ZAO5fqTpaKS2LpnJbRWrLpBJcQaaDomZc/eEDofJdMhqfofJdMlTrofJdMpAjofJdMswPofJdMwh/ofJdM0VbofJdM4KHlwZV47S3pCJeq///tp6TrAADtGaUXGh3sjKVBK6Dr7qVwPC3rTKWhTA/qsKXRW3XqJqX+anbpuaYkeSfpgaY5h5bpf6Y5lfvpf6Y5pKDpf6Y5s3fpf6Y5wnXpf6Y50Y/pf6Y54MLnEqR17YnqFqan///uPLRYAADtyrRwGn/tWLSILBjs17SjPLzsUbS/TLXrzrTbXC/rVrT3a0Tq8rURegbqrrUkiITqnrUpltHqnrUppUjqnrUps/jqnrUpwtLqnrUp0c3qnrUp4OPojLOJ7fHrRLWr///u18OtAADugMO2GsnuKMO/LIHtw8PKPUHtWcPVTVHs8cPhXN/sj8PtbAbsOsP6etnr+cQGiWbr18QNl7jr1sQNpf/r1sQNtIPr1sQNwzbr1sQN0g/r1sQN4QXqLsKo7mTsksSr///vdtLgAADvOdLeGwLu+dLbLOzusNLYPbruYtLWTd/uFdLTXYDty9LSbLjtidLTe5vtVNLVijbtL9LYmJTtJtLZpsTtJtLZtRftJtLZw6DtJtLZ0lLtJtLZ4Sbr+NHL7uLt/tOa///wGOHnAADv8uHdGznvyeHRLT3vmuHEPijvaOG1Tl/vNuGoXhDvBuGbbVju2uGRfEjuteGJivDumeGEmVrui+GDp4/uiuGDtbPuiuGDxA3uiuGD0pXuiuGD4UPt6eDq72vviOJz///wuvC6AADwqfCpG2/wlvCWLYrwgPCBPorwafBpTs3wUfBRXo7wO/A7bePwJ/AnfN/wFvAWi5LwCfAJmgbwAfABqETv/+//tlPv/+//xHvv/+//0tbv/+//4Vrv/+//7//xLvEu///zAP//AADzAv//G+jzBP//LjnzBf//P1TzB///T8XzCv//X6rzDf//byPzEP//fkPzFf//jRjzG///m6zzIf//qgjzJv//uDTzJv//xkbzJv//1IfzJv//4vbzJv//8Yny7v/E/////yYHAAD//x7UAAD//wgTAAD//wAAIwn//wAAO5P//wAAUJj//wAAZD///wAAdy7//wAAiar//wAAm9j//wAArcr//wAAv4z//wAA0SX//wAA4pv//wAA8/H//wAA///8LwAA/////yw+AAD//y+TGY///ygMHbT//yDlK+X//yDQQFT//yC1U2X//yCUZdX//yBtd+n//yBBicH//yAQm2///x/XrPz//x+Tvm3//x9Nz8f//x8E4Qv//x678jz//x5u///6rhwd/////zV2AAD//zghGab//zp+K0v//zNjMlv//zLJQ97//zKyVZP//zKUZxf//zJxeH///zJJidP//zIdmxb//zHnrE3//zGuvXf//zFyzpX//zEu36r//zDo8LT//zCf///5aC2P/////0GAAAD//0OMGcr//0VmK3n//0dMPET//0NxR1T//0NeV8r//0NHaG3//0MseSn//0MLifX//0Lmmsr//0K9q6T//0KNvIL//0JbzWD//0Ik3j7//0Hq7xr//0Gs//T4LT32/////085AAD//1DFGfv//1IyK7b//1OuPIr//1USTL///1NEWfr//1M0ac7//1Mgeen//1MHijP//1Lsmpz//1LMqxz//1Kpu6z//1KDzEf//1JZ3Oz//1Ir7Zb//1H7/kX3Jk24/////13lAAD//18PGjf//2AlLAD//2FLPN///2JlTR7//2NYXOP//2KfazX//2KSer///2KCipH//2Jvmpb//2JaqsD//2JCuwX//2Iny17//2IK28n//2Hq7ED//2HI/ML2cV0O/////20VAAD//230Gn3//27GLFD//2+oPT3//3CETYX//3FJXVT//3HebMP//3Gpe5///3Ghiwr//3GXmrb//3GLqpL//3F9upL//3Fuyq7//3Fc2uD//3FJ6yT//3Ez+3f2G2we/////3yFAAD//30pGrv//33GLKX//35xPZ7//38cTfL//3+4Xcn//4A4bT7//4B+fGn//4B6i4P//4B3muv//4B0qoj//4Bwuk7//4BqyjT//4Bj2jP//4Bb6kf//4BR+mz2L3r+/////4wGAAD//4x+Gvf//4zyLPj//41xPf7//43yTl3//45sXjz//47Vbbn//48dfOb//48ri+P//48rmxn//48rqon//48ruiX//48ryeL//48r2bn//48r6aT//48r+Z/2rYm9/////5t8AAD//5vRGzT//5wkLUT//5yAPlj//5zeTsD//506Xqj//52Nbiv//53NfVz//53qjEv//53qm0r//53qqon//53pufn//53pyY///53p2UH//53p6Qn//53p+OT3eJh7/////6rOAAD//6sIG3L//6tBLYz//6uBPqj//6vDTxr//6wFXwj//6xCbo///6x2fcT//6yYjLP//6ydm4H//6ydqor//6yducn//6ydyTH//6yd2Ln//6yd6Fv//6yd+BH4YKdY/////7nsAAD//7oQG6r//7o0LcT//7pdPuv//7qIT2P//7q0X1f//7rebuL//7sEfhj//7sijQj//7stm77//7stqov//7stuZP//7styMn//7st2CP//7st55n//7st9yb5Y7ZB/////8jGAAD//8jaG7z//8jtLfP//8kEPyD//8kcT5v//8k1X5L//8lObx///8llflb//8l7jUT//8mJm/f//8mKqoz//8mKuVj//8mKyFf//8mK137//8mK5sX//8mK9iX6gsUo/////9dRAAD//9dYG8r//9dfLhb//9dnP0b//9dvT8H//9d4X7j//9eCb0T//9eNfnn//9eXjWX//9ehnBP//9elqo3//9eluRn//9elx93//9el1s3//9el5d///9el9Q77u9QE/////+WFAAD//+WCG9T//+V+LiP//+V6P1b//+V2T9P//+VyX8f//+Vvb1D//+VtfoD//+VtjWf//+VvnA///+VxqoL//+VyuNX//+Vyx1r//+Vy1g7//+Vy5Or//+Vy8+T9DuLL//////NYAAD///NOG9r///NCLiv///M0P1n///MmT8////MXX77///MJb0H///L9fmz///LzjUv///Lsm+v///LoqlT///LnuI3///Lnxs////Ln1UX///Ln4+X///Ln8qf+e/F2////////AAD/////G93/////Lij/////P0f/////T7f/////X57/////bxn/////fjr/////jRD/////m6b/////qgT/////uDH/////xj3/////1HH/////4tL/////8Vn///////8AAGN1cnYAAAAAAAAAAgAA//9jdXJ2AAAAAAAAAAIAAP//Y3VydgAAAAAAAAACAAD//3NmMzIAAAAAAAEMPQAABdz///MoAAAHjwAA/ZL///ui///9ogAAA9sAAMB9ZGF0YQAAAAABAAAACQAAAP/AABEIAIAAgAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDAAICAgICAgQCAgQGBAQEBggGBgYGCAoICAgICAoMCgoKCgoKDAwMDAwMDAwODg4ODg4QEBAQEBISEhISEhISEhL/2wBDAQMDAwUEBQgEBAgTDQsNExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExP/3QAEAAj/2gAMAwEAAhEDEQA/AP3Yopu7BAwea4fXbXW7jUXm07VbmyTy1jCJbJNGr8sXBI5JU4IOQMDHOcgFS71f4nwqTa6LZz5uCoH2rYRCMgOwKkbjgHAJwD3IIrH1XxD8aIdAW50fw1Y3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" + + // Matches the app's current vCard export patterns (BusinessCard.vCardLines). + static let fullCoverageVCard: String = [ + "BEGIN:VCARD", + "VERSION:3.0", + "N:Cost;Jon;A.;Mr.;Jr.", + "FN:Jon A. Cost", + "NICKNAME:Jon", + "PHOTO;ENCODING=b;TYPE=JPEG:\(base64PhotoJPEG)", + "ORG:Remax;Residential", + "TITLE:Sales Director", + "TEL;TYPE=CELL:+1-555-111-2222", + "TEL;TYPE=WORK:+1-555-333-4444", + "TEL;TYPE=HOME:+1-555-888-9999", + "EMAIL;TYPE=WORK:jon@remax.com", + "EMAIL;TYPE=PERSONAL:jon.cost@gmail.com", + "ADR;TYPE=WORK:;;123 Main St;Austin;TX;78701;USA", + "ADR;TYPE=HOME:;;98 Lake View Rd;Round Rock;TX;78681;USA", + "URL:https://www.remax.com", + "URL;TYPE=calendly:https://calendly.com/joncost/intro", + "URL;TYPE=portfolio:https://joncost.me", + "X-SOCIALPROFILE;TYPE=linkedin:https://linkedin.com/in/joncost", + "X-SOCIALPROFILE;TYPE=twitter:https://x.com/joncost", + "X-SOCIALPROFILE;TYPE=instagram:https://instagram.com/joncost", + "X-SOCIALPROFILE;TYPE=facebook:https://facebook.com/joncost", + "X-SOCIALPROFILE;TYPE=tiktok:https://tiktok.com/@joncost", + "X-SOCIALPROFILE;TYPE=github:https://github.com/joncost", + "X-SOCIALPROFILE;TYPE=threads:https://threads.net/@joncost", + "X-SOCIALPROFILE;TYPE=telegram:https://t.me/joncost", + "X-SOCIALPROFILE;TYPE=bluesky:https://bsky.app/profile/joncost.bsky.social", + "X-SOCIALPROFILE;TYPE=mastodon:https://mastodon.social/@joncost", + "X-SOCIALPROFILE;TYPE=youtube:https://youtube.com/@joncost", + "X-SOCIALPROFILE;TYPE=twitch:https://twitch.tv/joncost", + "X-SOCIALPROFILE;TYPE=reddit:https://reddit.com/user/joncost", + "X-SOCIALPROFILE;TYPE=snapchat:https://snapchat.com/add/joncost", + "X-SOCIALPROFILE;TYPE=pinterest:https://pinterest.com/joncost", + "X-SOCIALPROFILE;TYPE=discord:https://discord.gg/joncost", + "X-SOCIALPROFILE;TYPE=slack:https://remax.slack.com", + "X-SOCIALPROFILE;TYPE=whatsapp:https://wa.me/15551112222", + "X-SOCIALPROFILE;TYPE=signal:+15551112222", + "X-SOCIALPROFILE;TYPE=venmo:https://venmo.com/u/joncost", + "X-SOCIALPROFILE;TYPE=cashapp:https://cash.app/$joncost", + "X-SOCIALPROFILE;TYPE=paypal:https://paypal.me/joncost", + "NOTE:Top producer\\nPronouns: he/him\\nCredentials: Realtor, CRS", + "END:VCARD" + ].joined(separator: "\r\n") + + static let longCoverageVCard: String = [ + "BEGIN:VCARD", + "VERSION:3.0", + "N:Costington-Smythe;Jonathan Alexander;Maximilian Theodore;Mr.;III", + "FN:Jonathan Alexander Maximilian Theodore Costington-Smythe III", + "NICKNAME:Jonny Max The Third", + "PHOTO;ENCODING=b;TYPE=JPEG:\(base64PhotoJPEG)", + "ORG:Remax International Luxury & Commercial Advisory Group;Strategic Partnerships and High-Net-Worth Client Services Division", + "TITLE:Senior Regional Executive Director of Enterprise Business Development", + "TEL;TYPE=CELL:+1-555-111-2222 ext 987", + "TEL;TYPE=WORK:+1-555-333-4444 ext 12345", + "TEL;TYPE=HOME:+1-555-888-9999", + "EMAIL;TYPE=WORK:jonathan.alexander.costington-smythe.iii@global-remax-enterprise.com", + "EMAIL;TYPE=PERSONAL:jonny.max.the.third.personal.mailbox@examplemailprovider.com", + "ADR;TYPE=WORK:;;12345 Executive Plaza Boulevard Suite 1800;Austin;Texas;78759-1144;United States of America", + "ADR;TYPE=HOME:;;9876 Long Meadow Creek Residential Parkway Building C Apt 24B;Round Rock;Texas;78681;United States of America", + "URL:https://www.remax.com/enterprise/luxury-and-commercial/advisory-services", + "URL;TYPE=calendly:https://calendly.com/jonathan-costington-smythe-iii/enterprise-strategy-intro-call-45min", + "URL;TYPE=portfolio:https://jonathanalexandercostingtonsmythe.me/about-and-case-studies", + "X-SOCIALPROFILE;TYPE=linkedin:https://www.linkedin.com/in/jonathan-alexander-maximilian-theodore-costington-smythe-iii", + "X-SOCIALPROFILE;TYPE=twitter:https://x.com/JonathanCostingtonSmytheTheThird", + "X-SOCIALPROFILE;TYPE=instagram:https://instagram.com/jonathan.alexander.maximilian.theodore.the.third", + "X-SOCIALPROFILE;TYPE=facebook:https://facebook.com/jonathan.alexander.maximilian.theodore.costington.smythe.iii", + "X-SOCIALPROFILE;TYPE=tiktok:https://www.tiktok.com/@jonathan.alexander.maximilian.theodore.iii", + "X-SOCIALPROFILE;TYPE=github:https://github.com/jonathan-alexander-maximilian-theodore-costington-smythe", + "X-SOCIALPROFILE;TYPE=threads:https://www.threads.net/@jonathan.alexander.maximilian.theodore.iii", + "X-SOCIALPROFILE;TYPE=telegram:https://t.me/jonathan_alexander_maximilian_theodore_iii", + "X-SOCIALPROFILE;TYPE=bluesky:https://bsky.app/profile/jonathan-alexander-maximilian-theodore-iii.bsky.social", + "X-SOCIALPROFILE;TYPE=mastodon:https://mastodon.social/@jonathan_alexander_maximilian_theodore_iii", + "X-SOCIALPROFILE;TYPE=youtube:https://www.youtube.com/@JonathanAlexanderMaximilianTheodoreCostingtonSmytheIII", + "X-SOCIALPROFILE;TYPE=twitch:https://www.twitch.tv/jonathanalexandermaximiliantheodoreiii", + "X-SOCIALPROFILE;TYPE=reddit:https://www.reddit.com/user/jonathan_alexander_maximilian_iii", + "X-SOCIALPROFILE;TYPE=snapchat:https://www.snapchat.com/add/jonathan.alexander.maximilian.theodore.iii", + "X-SOCIALPROFILE;TYPE=pinterest:https://www.pinterest.com/jonathanalexandermaximiliantheodoreiii/", + "X-SOCIALPROFILE;TYPE=discord:https://discord.gg/jonathanalexandermaximiliantheodoreiiicommunity", + "X-SOCIALPROFILE;TYPE=slack:https://remax-enterprise-global-strategy.slack.com", + "X-SOCIALPROFILE;TYPE=whatsapp:https://wa.me/15551112222", + "X-SOCIALPROFILE;TYPE=signal:+15551112222", + "X-SOCIALPROFILE;TYPE=venmo:https://venmo.com/u/jonathanalexandermaximiliantheodoreiii", + "X-SOCIALPROFILE;TYPE=cashapp:https://cash.app/$jonathanalexmaxiii", + "X-SOCIALPROFILE;TYPE=paypal:https://paypal.me/jonathanalexandermaximiliantheodoreiii", + "NOTE:Top-producing advisor focused on long-cycle enterprise relationships and national account growth.\\nPronouns: he/him\\nCredentials: CRS, GRI, ABR, CIPS, SRES\\nSpeaking topics: negotiation strategy, market analytics, and leadership coaching.", + "END:VCARD" + ].joined(separator: "\r\n") +} +#endif diff --git a/BusinessCardClip/Views/ClipRootView.swift b/BusinessCardClip/Views/ClipRootView.swift index cb109b2..9e99704 100644 --- a/BusinessCardClip/Views/ClipRootView.swift +++ b/BusinessCardClip/Views/ClipRootView.swift @@ -27,7 +27,7 @@ struct ClipRootView: View { } } } - .task { + .task(id: recordName) { await store.load(recordName: recordName) } } diff --git a/BusinessCardClip/Views/Components/ClipCardPreview.swift b/BusinessCardClip/Views/Components/ClipCardPreview.swift index 1b2462c..97a2802 100644 --- a/BusinessCardClip/Views/Components/ClipCardPreview.swift +++ b/BusinessCardClip/Views/Components/ClipCardPreview.swift @@ -1,95 +1,244 @@ import SwiftUI +import Bedrock /// Displays a preview of the shared card with option to save to Contacts. struct ClipCardPreview: View { + private struct ContactSection { + let title: String + let rows: [SharedCardSnapshot.ContactInfoRow] + } + let snapshot: SharedCardSnapshot let onSave: () -> Void var body: some View { VStack(spacing: ClipDesign.Spacing.xLarge) { - Spacer() + Spacer(minLength: ClipDesign.Spacing.medium) - // Card content - VStack(spacing: ClipDesign.Spacing.large) { - // Profile photo or placeholder - if let photoData = snapshot.photoData, - let uiImage = UIImage(data: photoData) { - Image(uiImage: uiImage) - .resizable() - .scaledToFill() - .frame(width: ClipDesign.Size.avatarLarge, height: ClipDesign.Size.avatarLarge) - .clipShape(.circle) - } else { - Image(systemName: "person.crop.circle.fill") - .resizable() - .scaledToFit() - .frame(width: ClipDesign.Size.avatarLarge, height: ClipDesign.Size.avatarLarge) - .foregroundStyle(Color.Clip.secondaryText) + previewCard + .frame(maxWidth: ClipDesign.Size.previewMaxWidth) + .padding(.horizontal, ClipDesign.Spacing.large) + + VStack(spacing: ClipDesign.Spacing.medium) { + // Save button + ClipPrimaryButton( + title: String(localized: "Save to Contacts"), + systemImage: "person.crop.circle.badge.plus", + action: onSave + ) + .accessibilityLabel(Text("Save \(snapshot.displayName) to contacts")) + + // Get full app prompt + Button { + openAppStore() + } label: { + Text(String(localized: "Get the full app")) + .styled(.subheading) + .foregroundStyle(Color.Clip.accent) } + } + .padding(.horizontal, ClipDesign.Spacing.xLarge) - // Name + Spacer(minLength: ClipDesign.Spacing.large) + } + } + + private var previewCard: some View { + VStack(spacing: 0) { + previewHeader + + VStack(alignment: .leading, spacing: ClipDesign.Spacing.medium) { Text(snapshot.displayName) - .font(.title) - .bold() + .styled(.title2) .foregroundStyle(Color.Clip.text) .multilineTextAlignment(.center) + .lineLimit(2) + .minimumScaleFactor(0.8) + .frame(maxWidth: .infinity, alignment: .center) - // Role and company if !snapshot.role.isEmpty || !snapshot.company.isEmpty { VStack(spacing: ClipDesign.Spacing.xSmall) { if !snapshot.role.isEmpty { Text(snapshot.role) - .font(.headline) - .foregroundStyle(Color.Clip.secondaryText) + .styled(.headingEmphasis) + .foregroundStyle(Color.Clip.text) + .multilineTextAlignment(.center) + .lineLimit(1) + .frame(maxWidth: .infinity, alignment: .center) } + if !snapshot.company.isEmpty { Text(snapshot.company) - .font(.subheadline) + .styled(.subheading) .foregroundStyle(Color.Clip.secondaryText) + .multilineTextAlignment(.center) + .lineLimit(1) + .frame(maxWidth: .infinity, alignment: .center) } } + .frame(maxWidth: .infinity, alignment: .center) } - } - .padding(ClipDesign.Spacing.xLarge) - .frame(maxWidth: .infinity) - .background(Color.Clip.cardBackground) - .clipShape(.rect(cornerRadius: ClipDesign.CornerRadius.xLarge)) - .padding(.horizontal, ClipDesign.Spacing.large) - Spacer() + Divider() + .overlay(Color.Clip.secondaryText.opacity(ClipDesign.Opacity.faint)) - // Save button - Button(action: onSave) { - HStack(spacing: ClipDesign.Spacing.small) { - Image(systemName: "person.crop.circle.badge.plus") - Text("Save to Contacts") + if !contactSections.isEmpty { + contactSectionsView + + Divider() + .overlay(Color.Clip.secondaryText.opacity(ClipDesign.Opacity.faint)) } - .font(.headline) - .foregroundStyle(Color.Clip.background) - .frame(maxWidth: .infinity) - .frame(height: ClipDesign.Size.buttonHeight) - .background(Color.Clip.accent) - .clipShape(.capsule) + + Text(String(localized: "Shared business card")) + .styled(.caption) + .foregroundStyle(Color.Clip.secondaryText) + .frame(maxWidth: .infinity, alignment: .center) } .padding(.horizontal, ClipDesign.Spacing.xLarge) - .accessibilityLabel(Text("Save \(snapshot.displayName) to contacts")) + .padding(.bottom, ClipDesign.Spacing.xLarge) + } + .frame(minHeight: ClipDesign.Size.previewCardMinHeight) + .background(Color.Clip.cardBackground) + .clipShape(.rect(cornerRadius: ClipDesign.CornerRadius.xLarge)) + .shadow( + color: Color.Clip.text.opacity(ClipDesign.Opacity.faint), + radius: ClipDesign.Shadow.radius, + x: 0, + y: ClipDesign.Shadow.y + ) + .overlay( + RoundedRectangle(cornerRadius: ClipDesign.CornerRadius.xLarge) + .stroke(Color.Clip.secondaryText.opacity(ClipDesign.Opacity.subtle), lineWidth: ClipDesign.Size.cardStrokeWidth) + ) + } - // Get full app prompt - Button { - openAppStore() - } label: { - Text("Get the full app") - .font(.subheadline) - .foregroundStyle(Color.Clip.accent) + private var contactSectionsView: some View { + VStack(alignment: .leading, spacing: ClipDesign.Spacing.medium) { + ForEach(contactSections, id: \.title) { section in + VStack(alignment: .leading, spacing: ClipDesign.Spacing.xSmall) { + Text(section.title.uppercased()) + .styled(.caption) + .foregroundStyle(Color.Clip.secondaryText) + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(spacing: 0) { + ForEach(Array(section.rows.enumerated()), id: \.element.id) { index, row in + contactRow(row) + .padding(.horizontal, ClipDesign.Spacing.medium) + .padding(.vertical, ClipDesign.Spacing.small) + + if index < section.rows.count - 1 { + Divider() + .overlay(Color.Clip.secondaryText.opacity(ClipDesign.Opacity.faint)) + .padding(.leading, ClipDesign.Spacing.medium) + } + } + } + .background(Color.Clip.background.opacity(ClipDesign.Opacity.faint)) + .clipShape(.rect(cornerRadius: ClipDesign.CornerRadius.medium)) + .overlay( + RoundedRectangle(cornerRadius: ClipDesign.CornerRadius.medium) + .stroke(Color.Clip.secondaryText.opacity(ClipDesign.Opacity.faint), lineWidth: ClipDesign.Size.cardStrokeWidth) + ) + } } - .padding(.bottom, ClipDesign.Spacing.large) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private func contactRow(_ row: SharedCardSnapshot.ContactInfoRow) -> some View { + HStack(alignment: .top, spacing: ClipDesign.Spacing.small) { + Image(systemName: row.systemImage) + .font(.system(size: ClipDesign.Size.contactRowIconSize, weight: .semibold)) + .foregroundStyle(Color.Clip.secondaryText) + .frame(width: ClipDesign.Size.contactRowIconSize + ClipDesign.Spacing.small) + + VStack(alignment: .leading, spacing: ClipDesign.Spacing.xSmall) { + Text(row.value) + .styled(.subheading) + .foregroundStyle(Color.Clip.text) + .lineLimit(row.kind == .note ? nil : 2) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + + Text(row.label) + .styled(.caption) + .foregroundStyle(Color.Clip.secondaryText) + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private var contactSections: [ContactSection] { + let groups = Dictionary(grouping: snapshot.contactInfoRows, by: \.kind) + let order: [(SharedCardSnapshot.ContactInfoRow.Kind, String)] = [ + (.phone, String(localized: "Phone")), + (.email, String(localized: "Email")), + (.address, String(localized: "Address")), + (.website, String(localized: "Links")), + (.social, String(localized: "Social Profiles")), + (.note, String(localized: "Notes")) + ] + + return order.compactMap { kind, title in + guard let rows = groups[kind], !rows.isEmpty else { return nil } + return ContactSection(title: title, rows: rows) } } + private var previewHeader: some View { + ZStack(alignment: .bottom) { + LinearGradient( + colors: [ + Color.Clip.accent.opacity(ClipDesign.Opacity.strong), + Color.Clip.accent.opacity(ClipDesign.Opacity.subtle) + ], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .frame(height: ClipDesign.Size.previewBannerHeight) + + avatarView + .offset(y: ClipDesign.Size.previewAvatarOverlap) + } + .padding(.bottom, ClipDesign.Size.previewAvatarOverlap) + } + + private var avatarView: some View { + ZStack { + Circle() + .fill(Color.Clip.background.opacity(ClipDesign.Opacity.medium)) + + if let photoData = snapshot.photoData, let uiImage = UIImage(data: photoData) { + Image(uiImage: uiImage) + .resizable() + .scaledToFill() + } else { + Image(systemName: "person.fill") + .resizable() + .scaledToFit() + .frame(width: ClipDesign.Size.avatarFallbackSymbolSize, height: ClipDesign.Size.avatarFallbackSymbolSize) + .foregroundStyle(Color.Clip.secondaryText) + } + } + .frame(width: ClipDesign.Size.previewAvatarSize, height: ClipDesign.Size.previewAvatarSize) + .clipShape(.circle) + .overlay( + Circle() + .stroke(Color.Clip.cardBackground, lineWidth: ClipDesign.Size.avatarStrokeWidth) + ) + .shadow( + color: Color.Clip.text.opacity(ClipDesign.Opacity.faint), + radius: ClipDesign.Shadow.radius, + x: 0, + y: ClipDesign.Shadow.y + ) + } + private func openAppStore() { - // Open App Store page for the full app - // Replace with actual App Store URL when available - if let url = URL(string: "https://apps.apple.com/app/id1234567890") { + if let url = URL(string: ClipDesign.URL.appStore) { UIApplication.shared.open(url) } } diff --git a/BusinessCardClip/Views/Components/ClipErrorView.swift b/BusinessCardClip/Views/Components/ClipErrorView.swift index ce84daa..e0bacfb 100644 --- a/BusinessCardClip/Views/Components/ClipErrorView.swift +++ b/BusinessCardClip/Views/Components/ClipErrorView.swift @@ -1,4 +1,5 @@ import SwiftUI +import Bedrock /// Error state shown when card fetch or save fails. struct ClipErrorView: View { @@ -14,26 +15,21 @@ struct ClipErrorView: View { .foregroundStyle(Color.Clip.error) VStack(spacing: ClipDesign.Spacing.small) { - Text("Something went wrong") - .font(.title2) - .bold() + Text(String(localized: "Something went wrong")) + .styled(.title2) .foregroundStyle(Color.Clip.text) Text(message) - .font(.subheadline) + .styled(.subheading) .foregroundStyle(Color.Clip.secondaryText) .multilineTextAlignment(.center) } - Button(action: onRetry) { - Text("Try Again") - .font(.headline) - .foregroundStyle(Color.Clip.background) - .frame(maxWidth: .infinity) - .frame(height: ClipDesign.Size.buttonHeight) - .background(Color.Clip.accent) - .clipShape(.capsule) - } + ClipPrimaryButton( + title: String(localized: "Try Again"), + systemImage: "arrow.clockwise", + action: onRetry + ) .padding(.horizontal, ClipDesign.Spacing.xLarge) .padding(.top, ClipDesign.Spacing.large) } diff --git a/BusinessCardClip/Views/Components/ClipLoadingView.swift b/BusinessCardClip/Views/Components/ClipLoadingView.swift index 49c2a24..4a9c958 100644 --- a/BusinessCardClip/Views/Components/ClipLoadingView.swift +++ b/BusinessCardClip/Views/Components/ClipLoadingView.swift @@ -1,4 +1,5 @@ import SwiftUI +import Bedrock /// Loading state view shown while fetching the card from CloudKit. struct ClipLoadingView: View { @@ -8,12 +9,12 @@ struct ClipLoadingView: View { .scaleEffect(1.5) .tint(Color.Clip.accent) - Text("Loading card...") - .font(.headline) + Text(String(localized: "Loading card...")) + .styled(.heading) .foregroundStyle(Color.Clip.text) } .accessibilityElement(children: .combine) - .accessibilityLabel(Text("Loading business card")) + .accessibilityLabel(Text(String(localized: "Loading business card"))) } } diff --git a/BusinessCardClip/Views/Components/ClipPrimaryButton.swift b/BusinessCardClip/Views/Components/ClipPrimaryButton.swift new file mode 100644 index 0000000..a7df8e2 --- /dev/null +++ b/BusinessCardClip/Views/Components/ClipPrimaryButton.swift @@ -0,0 +1,31 @@ +import SwiftUI +import Bedrock + +/// Primary CTA button used across App Clip views. +struct ClipPrimaryButton: View { + let title: String + let systemImage: String? + let action: () -> Void + + init(title: String, systemImage: String? = nil, action: @escaping () -> Void) { + self.title = title + self.systemImage = systemImage + self.action = action + } + + var body: some View { + Button(action: action) { + HStack(spacing: ClipDesign.Spacing.small) { + if let systemImage { + Image(systemName: systemImage) + } + Text(title) + .styled(.headingEmphasis, emphasis: .custom(Color.Clip.background)) + } + .frame(maxWidth: .infinity) + .frame(height: ClipDesign.Size.buttonHeight) + .background(Color.Clip.accent) + .clipShape(.capsule) + } + } +} diff --git a/BusinessCardClip/Views/Components/ClipSuccessView.swift b/BusinessCardClip/Views/Components/ClipSuccessView.swift index 27c885c..a23e448 100644 --- a/BusinessCardClip/Views/Components/ClipSuccessView.swift +++ b/BusinessCardClip/Views/Components/ClipSuccessView.swift @@ -1,4 +1,5 @@ import SwiftUI +import Bedrock /// Success state shown after the contact has been saved. struct ClipSuccessView: View { @@ -17,29 +18,22 @@ struct ClipSuccessView: View { .animation(.spring(response: 0.5, dampingFraction: 0.6), value: showCheckmark) VStack(spacing: ClipDesign.Spacing.small) { - Text("Contact Saved!") - .font(.title2) - .bold() + Text(String(localized: "Contact Saved!")) + .styled(.title2) .foregroundStyle(Color.Clip.text) - Text("You can find this contact in your Contacts app.") - .font(.subheadline) + Text(String(localized: "You can find this contact in your Contacts app.")) + .styled(.subheading) .foregroundStyle(Color.Clip.secondaryText) .multilineTextAlignment(.center) } // Open Contacts button - Button { - openContacts() - } label: { - Text("Open Contacts") - .font(.headline) - .foregroundStyle(Color.Clip.background) - .frame(maxWidth: .infinity) - .frame(height: ClipDesign.Size.buttonHeight) - .background(Color.Clip.success) - .clipShape(.capsule) - } + ClipPrimaryButton( + title: String(localized: "Open Contacts"), + systemImage: "person.crop.circle", + action: openContacts + ) .padding(.horizontal, ClipDesign.Spacing.xLarge) .padding(.top, ClipDesign.Spacing.large) } @@ -48,11 +42,11 @@ struct ClipSuccessView: View { showCheckmark = true } .accessibilityElement(children: .combine) - .accessibilityLabel(Text("Contact saved successfully")) + .accessibilityLabel(Text(String(localized: "Contact saved successfully"))) } private func openContacts() { - if let url = URL(string: "contacts://") { + if let url = URL(string: ClipDesign.URL.contactsScheme) { UIApplication.shared.open(url) } }