From 224757e5374d92a2cb328ed110e2670b02b7abc4 Mon Sep 17 00:00:00 2001 From: Thibault Le Ouay Date: Mon, 7 Sep 2026 11:03:50 +0200 Subject: [PATCH] dashboard: monitor pack (#2649) * dashboard: monitor pack * minor fix --- .../monitors/(list)/nav-actions.tsx | 6 +- .../(dashboard)/settings/billing/client.tsx | 8 + .../src/components/content/billing-addons.tsx | 112 ++++++++++---- .../data-table/billing/data-table.tsx | 17 ++- .../public/assets/changelog/monitor-pack.png | Bin 0 -> 112299 bytes .../content/pages/changelog/monitor-pack.mdx | 17 +++ .../src/content/pages/unrelated/pricing.mdx | 10 +- packages/api/src/router/stripe/index.ts | 109 ++++++++++---- packages/api/src/router/stripe/utils.test.ts | 139 +++++++++++++++++- packages/api/src/router/stripe/utils.ts | 66 ++++++++- packages/db/src/schema/plan/config.ts | 24 +++ packages/db/src/schema/plan/schema.ts | 16 ++ packages/db/src/schema/plan/utils.ts | 20 +++ packages/services/src/index.ts | 1 + packages/services/src/limits.ts | 6 +- 15 files changed, 479 insertions(+), 72 deletions(-) create mode 100644 apps/web/public/assets/changelog/monitor-pack.png create mode 100644 apps/web/src/content/pages/changelog/monitor-pack.mdx diff --git a/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx b/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx index 79aecaa74..dc20300a9 100644 --- a/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx +++ b/apps/dashboard/src/app/(dashboard)/monitors/(list)/nav-actions.tsx @@ -36,7 +36,11 @@ export function NavActions() { Create Monitor )} - + ); } diff --git a/apps/dashboard/src/app/(dashboard)/settings/billing/client.tsx b/apps/dashboard/src/app/(dashboard)/settings/billing/client.tsx index c3182ef09..8c83b4c71 100644 --- a/apps/dashboard/src/app/(dashboard)/settings/billing/client.tsx +++ b/apps/dashboard/src/app/(dashboard)/settings/billing/client.tsx @@ -229,6 +229,14 @@ export function Client() { workspace={workspace} /> ) : null} + {planAddons.monitors ? ( + + ) : null} {planAddons.sso ? ( > = { + monitors: "monitors", + "status-pages": "status pages", +}; + export function BillingAddons({ label, description, @@ -62,12 +71,16 @@ export function BillingAddons({ }), ); const plan = workspace.plan; + const packSize = getAddonPackSize(addon); + const maxPacks = getAddonMaxQuantity(addon); + const unitLabel = QUANTITY_UNIT_LABEL[addon] ?? "units"; const defaultLimit = allPlans[workspace.plan].limits[addon]; const workspaceLimit = workspace.limits[addon]; const defaultValue = typeof workspaceLimit === "number" && typeof defaultLimit === "number" - ? // current value - default value to evaluate the difference - workspaceLimit - defaultLimit + ? // packs held today; floored so a hand-edited limit that is not a whole + // number of packs still renders a sane count + Math.floor((workspaceLimit - defaultLimit) / packSize) : workspaceLimit; const [value, setValue] = useState(defaultValue); const price = getAddonPriceConfig(plan, addon, currency); @@ -125,13 +138,15 @@ export function BillingAddons({
{formatPrice(price)} - {isQuantity ? "/mo./each" : "/mo."} + {getPriceSuffix(isQuantity, packSize)} {hasAddon && !isQuantity ? ( ) : null} - {hasAddon && isQuantity ? ( - +{defaultValue} + {hasAddon && isQuantity && typeof defaultValue === "number" ? ( + + +{defaultValue * packSize} + ) : null}
@@ -147,16 +162,23 @@ export function BillingAddons({ {label} - {getDialogDescription(label, price, value, hasAddon)} + {getDialogDescription( + label, + price, + value, + hasAddon, + packSize, + unitLabel, + )} - {isQuantity && - typeof value === "number" && - typeof defaultLimit === "number" ? ( + {isQuantity && typeof value === "number" ? ( ) : null} @@ -182,12 +204,17 @@ export function BillingAddons({ } // NOTE: could move to lib/formatter.ts -function formatPrice(price: PriceConfig | null) { +function formatAmount(price: PriceConfig | null, amount: number) { if (!price) return "N/A"; return new Intl.NumberFormat(price.locale, { style: "currency", currency: price.currency, - }).format(price.value); + }).format(amount); +} + +function formatPrice(price: PriceConfig | null) { + if (!price) return "N/A"; + return formatAmount(price, price.value); } function getButtonLabel( @@ -209,16 +236,23 @@ function getButtonLabel( return null; } +function getPriceSuffix(isQuantity: boolean, packSize: number) { + if (!isQuantity) return "/mo."; + return packSize > 1 ? `/mo./pack of ${packSize}` : "/mo./each"; +} + function getDialogDescription( label: string, price: PriceConfig | null, value: number | boolean, hasAddon: boolean, + packSize: number, + unitLabel: string, ) { const formattedPrice = formatPrice(price); const isBoolean = typeof value === "boolean"; const isQuantity = typeof value === "number"; - const priceSuffix = isQuantity ? "/mo./each" : "/mo."; + const priceSuffix = getPriceSuffix(isQuantity, packSize); if (isBoolean) { if (hasAddon) { @@ -228,37 +262,46 @@ function getDialogDescription( } if (isQuantity) { - return `${label} will be updated to ${value} on your next billing cycle. You will be charged ${formattedPrice}${priceSuffix} on your next billing cycle.`; + if (value === 0) { + return `${label} will be removed from your subscription. You will stop being charged for it on your next billing cycle.`; + } + const total = formatAmount(price, price ? price.value * value : 0); + return `Your workspace will get ${value * packSize} extra ${unitLabel}. You will be charged ${total}/mo., starting on your next billing cycle.`; } } function QuantityControl({ value, setValue, - defaultLimit, + maxValue, + packSize, + unitLabel, }: { value: number; setValue: (value: number) => void; - defaultLimit: number | boolean; + maxValue: number | null; + packSize: number; + unitLabel: string; }) { + const clamp = (next: number) => { + const floored = Math.max(0, next); + return maxValue === null ? floored : Math.min(maxValue, floored); + }; + const handleChange = (e: React.ChangeEvent) => { const newValue = Number.parseInt(e.target.value); - if (Number.isNaN(newValue)) { - setValue(typeof defaultLimit === "number" ? defaultLimit : 0); - } else { - setValue( - Math.max(typeof defaultLimit === "number" ? defaultLimit : 0, newValue), - ); - } + setValue(Number.isNaN(newValue) ? 0 : clamp(newValue)); }; + const atMax = maxValue !== null && value >= maxValue; + return ( -
+
+ {atMax && maxValue !== null ? ( +

+ Need more than {maxValue * packSize} extra {unitLabel}?{" "} + + Book a call + +

+ ) : null}
); } diff --git a/apps/dashboard/src/components/data-table/billing/data-table.tsx b/apps/dashboard/src/components/data-table/billing/data-table.tsx index 9eb8e43b6..4e2e7fcd2 100644 --- a/apps/dashboard/src/components/data-table/billing/data-table.tsx +++ b/apps/dashboard/src/components/data-table/billing/data-table.tsx @@ -1,8 +1,12 @@ "use client"; import type { WorkspacePlan } from "@openstatus/db/src/schema"; -import type { BillingInterval } from "@openstatus/db/src/schema/plan/schema"; +import type { + Addons, + BillingInterval, +} from "@openstatus/db/src/schema/plan/schema"; import { + getAddonPackSize, getAddonPriceConfig, getPriceConfig, } from "@openstatus/db/src/schema/plan/utils"; @@ -34,6 +38,11 @@ const BASE_URL = ? "https://app.openstatus.dev" : "http://localhost:3000"; +function getQuantitySuffix(addon: keyof Addons) { + const packSize = getAddonPackSize(addon); + return packSize > 1 ? `/mo./${packSize}` : "/mo./each"; +} + export function DataTable({ restrictTo }: { restrictTo?: WorkspacePlan[] }) { const [interval, setInterval] = useState("monthly"); const [currency] = useCookieState("x-currency", "USD"); @@ -219,7 +228,11 @@ export function DataTable({ restrictTo }: { restrictTo?: WorkspacePlan[] }) { style: "currency", currency: price.currency, }).format(price.value)} - {isNumber ? "/mo./each" : "/mo."} + {isNumber + ? getQuantitySuffix( + value as keyof typeof plan.addons, + ) + : "/mo."}
diff --git a/apps/web/public/assets/changelog/monitor-pack.png b/apps/web/public/assets/changelog/monitor-pack.png new file mode 100644 index 0000000000000000000000000000000000000000..13ed80e49a6a824898c83e128539fef51676454c GIT binary patch literal 112299 zcmeAS@N?(olHy`uVBq!ia0y~y;7nj(U{&K_V_;wqdefiHz`(#+;1OBOz#ygy!i=6l zDjyga7#NF#+?^QKos)UVz`($g?&#~tz_78O`%fY(0|NtJiEBhjaDG}zd16s2gIi{L zZsNR+(~=n&x2bu$IEGX(zPVdDA+@yj|9|Bjid~!D^YQSkexvY8L1Rbr>2P7?jGoj< zMxEYTqDh%S{}QJfhMBBXS-Q0I*wz>WDG`rF&5Jawm^QuVF<8UQ!?Rm}=fV5$zn0id zUbgf3y?6flmrp+qEPZWcdw2VL+vmmS14`$A{b%!XqPyHrUv>s4IItx53L})waKWVk zLhS6{s4TsS*Fq#HN)4*sN7_c<(;-sv>bK94m{#AGW{#efp zi3tPyzt7C~Oa6HNF`oUI9;4V9$K+=1iJ}n61BXm=1l*N$9L3JmGU?1vb_s`wGxV5# z`}|lcnR8>pJHdp5Y+?U5-pN?pYXy~+NXhB>dLy}iYPF%*8D1ux8xAcnjaydCH&#C) zlz6aB{Xi41!pEr}Kutyl28M=}0!at&EMRDi3~_hrS`Rg8hTcz}ThA|Scv$iMpw7yN zQ|rILB=UaxR6XuB*ZY3pO;FPT9fPkhb8b#JzsxnlV7G{(!Qmq?YtN_&ik;C5nT#E3pe?xrF$#y8W-b?K%v9UQ1hG0nPcZS| znV`-CCPMMhwx5CcPaWyBzH)Jh3WftpAYBjVvR*#&MH?#iY*Wp;Ty3Wrbyb_ zt>)(*{_=TUQ|1BzP)nJCfgxev2T5}ueMT{#iEG)R7R>OkImUbWv^CVB3<(nrS-F?> zGjK2SkmP|_aG>V#=DZnp_k0alyAmKm49~RZS04T%kZ@4s$8ipbSi{d#>Guq5St2fI z{1^C%Aqr8%z|cK~gL|1@18eUeWfq9oftu%=^JiEwikW=s7k~&ce4cxLU*ap4hzkeo z9iT!CEezaHW`dw`3(GP$)P^wcmHkj@9T7X`_LYJOP%kp*Br)mCkYW^rN;5bpGm4o6 z{D+1*g8-8bOs2tYlnn}t(Qp8T0t3TnI1F?+_`hR#Hql+Ka>?(j>+7zrjoP}(`tO&^ z>VJycLR%Xwedq?a1Md^S7(UD%q4i+_Jz-~aC2zTfXA-rxWC+wJn( zx!Ys6|9-c7y7cD9pXdLtDL-fVyu|!Yf%EqdhxzRvzBj-1qF(x`e(g)|yM5O0ZfyJz zTm5$HU1xsVD}TQ%w}1O?=ks}aTJydvQJ-r1<;!yWy|dMP z_B}u8|80M=^eNNpF_-UFKA(H{>Gb$}ck6z?-Fv_M&&T8CvvapaexLK)CjIYLXtAU< z{|DpebIJX-VM=Q{kNAe}`(OX>dHt#L=h}Y1+ns-i@!GQ4c~N#Z&VNq+mg2i6cK5d3 zZ@1k(Ro}n;<1y)S9ld_LUm2Yr)v9YHRT#srUAR2&+m?5l{*_*p_4c1b~aMZycq^FL>;t+$6n?2LMrhy!~j@gEd+kEwh*^=|mS zPg6Pn$1DqayY+h9UFmxt+VcMY{r*19scCif`@P$De>lXw8)TGzqO08sQW>5CiPI%4zJbowkmW!5rz=e{i-DN|oY+!Qi>n6{2lE$QsOJ>NgSKiSN0XYplD zdhQHpjp88BD7HZ(rsSgQ-B(vv?|yoEdO5p%&4*tv-7ah1zPUDH$Il7{?Fr7u4{ts zG8c8Dx2?II+;0nQ)FiwUPGIbIT6QbtQixiDYTvAPKUST3e?mo+@!F$c^(QIbhwWzP z?aGW)j_lXTE4>w}7JoHb&2Vk>_H$B@q|{L9*1)R6bu&t9JGb7B1-ENHpWW@uZ@cA= z|8nbhI~H5NTrznVyIjSBoLqx%k_*R4Xbk z`}#WF+g#7AK3;ImzZt(nH zSNNcbw%X?atny~aNMRD&up-6js_OKZOLGejao#;={r-;a-1L_jo>Owk z^KP&Cy&H!0Z?;_ad&)NX>$L5Amfn#szf*WOWo`8Kb9?S4`SbIQ{qwtWcANRs#rO2ze^u-=#pqk%Ce`TL zb(QmW=I;4;?DhQOZkx2es|((;FP3Zncza*!-=5mOiN{yoKFd4#diehQ8{eOmKKp+C zx=rL)%WE6b|46Nt_ zU$1=qc%W?>r}f69qg_SwUs`tR=IwsF?bE|LrfEmSZs+f>-F{MS_7u&4+4=h_%WovM zukGKsEbHs5t9So?zaRgoSxTX2>+^Zl)9!D6xoo!GyVsxu!6|CAROkEj*s@4YmroJ? z)weG1TD$$;uIh8e^DfKQd^mVFZFcT8P)QZL`gZ>Qy+`yT*_)jfN-4kH{eEA6cU@LS z`NLN6b^oK7CfeMSEx%*D%1w(|b$=d&KqI)0+kBWLnwgQ>-K;!keK)qc5ncT?)=UA5nCF8_Vf zzwT1)ugmk_{rwl6w{z*9f1tuIdt!Fnwc9h(=SBXT^Ev4K=dXL%UrC+#n$Rv=rt$q} z@wI#JcE7jF4UC&#bxwcZk4HtaXMfvoVpGaicx{@k`h90wy6v71t@=9er!MuLURE5+ z`{Gr$l-hdD*UHy-+=0a0411P{1B<3)Xgxd|a@Es~GwPR`=GiS$EUHU7X6NtQdFQ%- zcDz5!gzK|Al+K$UbXDq>X>alU8C9njf4XE|jqdhqACwG(7Oj+-?D+BQy4~-7?XXw( z=`zi}HsyKI^SR~IG9K>x{Z6}o;`4d->Nieid-_a!K2JfJ(T#Vf+UFSK(iiV`zkl~` z*XwnSjA2O~j{V`wKR&VS`5V<&KJUAMWjLqLr>f)s{#118f7)fNnyJJX7F%7)`=s<~ zwkgNz*<%Jzf9(x7+#q-`z;=kClJ!bM5}$yZ1}e=az<5@--jYvcB%?>eOGC9=6NJ{rj`h zzjoD~`Y(&+->PXnJooSS`}k!u_I}^{UiW;dQKMhqW&Zjfhu<}E>qW@d^i1VUtUOcW zzl<@|G{^d3i}0?KUOba;pRfD2`5kxs52yFvWvgB+ysOwQb4j-T&&Sl+y8?w4KeecT zW;|ar@ajqR`7w*8I<8;s&l_V@`np58PviKvuj}h;I}4)jDOc*n|NnKp`uc(Uf6m^Y za=-LW;qj>_o)^#m9rN?oal3CDi|oxNocVR;$cj0WZML^6ytd!&QeFAi^qjQ5V$`|J z-YIUC4;tCM3chY#U%QsYC;sQD@Kfjex|rEl3U4TydnW44&r_yJtFkhtooq~=pSmhj5@G^1Pbe~!ja`F>h&_nS+(8I`>|!~R^2{~H>4`s*$mk2vRb>FaBrYVZEO z|NmcOt6WHzwqd5?0Vc5}8-=Ucj>>b&7M;HT^qSE_^-l+@?yIZ~JfFBq=&lRX1{dy1 zxu3TdXj(0PlKx3Xc&ciPhsA{BzEh@ZEHC8>nqPJ2b;~lVotZ{LbD#cHd*Bf>DKn5e z)9I4Sl?c`6T9SgUYp}SHTPMO^!rQR`nvK(>5oqFS-%O`R_n!LDETvBuU~ zfWL}~>}}b;?L|*d37x8Wz$~xf=sdUSiV~wUFPqU-?aL8%|9_q@cb6><`F_0q&+*jk zHFuVIKiWQL`uDx>YoDIC?3+BbKzZ_+yq!;{y?eEKecb<;=*`1}{0CuHMjix8<_m>##Kufy;tYA6>D&|MQ$ts>bAt%e?RI``jJ>Cn>Ui=B#Zu zuB;WEt`ixQw8ZgxXN|3p#M6qWR;C%@*Th{r!yA^QxQjzT6BkFd6hqfk8USA~lIsg3WxNn=@9TE1|`9F7M z1|($9*fZ%QIG&p3$JzGDvBGY_`7Ki&Czl$jsvY#)S8v1^R=cLfzm_pfPXBVV5SMRy z!&LsS!iF)$XHENO7a7l;-2AD6v)YJL+wt1G>UWV&6Iqy>AN8L+ReWyA^j&lBhdhZ; z35wiZmRo+e^!n7|nJe-XSKt1XDt&g%L7C$%I;C8fN={UrdYrm9w(MqVs_mOSpU<7W z+<$C!Vp7sV$LROEVwT4&#cDT(D6RGJI`v!c`{T!le%(8N>-<-R?K0;(*R@);W-5J5 zll%T`cD~-_SwbzUC389dCFtkQmgdUy+x+%QeXHKI?9;vz_3CL}9oA*s7iUg; zJh^y+!Iu2nC*~ZUbKXb7=gN#++0QoOw^<+^i-uO0238#p>$h8ixBvh5dwPM&Mt{2( z^3p0-ZajF@t*vbQVbGd5pRNelkXa0)`nQAjnO?m0_)1YowOyN;c)wmxw zj@yMTT0Apg`zCLh&yVH*@A%zp|D*XG|NjsCyM4{?ZfS`KF8%lO`Sh0w_WysL-@WqG zwTzvrZ%(i*aOSgI@_X(5Uu*LeS6`m+@1y+xjn?n?d_EO5=UuLzFw4`jYmw(6HmJ@-sJp;dTfL8i&i+RENa zUe1%7LT{C@L_FReeOhIPhlM!j-bM2^&sl8KpLo&jT%y|R6s3^3^FF!GGfG9P-)_Aw zTvwkW6gb~UdR1_ni3c2QV zZ}Z}9f6thz_0RlXd+%`V`HgmNd-+nduWUTO*DZ@vFZsq+)BXC_oBzD~bI)hSsoZ5( zB+P>Meab(qP&zAe-NN5*Hv7-4nfia;$>)$k*#mC`5*WFIntEAeW?q?`%V4aU5zsKz zQ*-8vNt_XrCvy7zJYaj#dHxY*{py>im*vi0d&H=-X5Y81>!;qg*O(@meREUl(|`W| zp7@{ocp@yEbCpnyir(wyTDsPJ^$(sV6+?x13{?Ya$8MQ@xo1gvK_Up9B zP8+{_=dZ`t*S>$8V!iK#$?l4$+VPS1vO60#)d?Fv{agI$r26#dQ#k!1wVRdJteGA2 z|5L>8ce~%8SnGM-;&IO>ne&#<=NSE5<6paf-_Nu8df#U%NO(`z)4hH%rg@X!{-0;_ zr*XXbegA*m`{bwJpGfK+qSZHr&zkx^>+I|4~ybH z?}6l@8UI-#4m3?mP(FBiYIvOGhxfu~RNTB;Ch@-#Ugo26%k#};@%Yq3fp!t+-}@C@ z7WeZBdo;r(Xs2q_%h`Ux%a8AQB)VSXyJ^bGhXM2ao4Rek-`RXbmvgp}rdnaJQoCdH z!l&iyA~&b~)$KQ(>KRe$z3Jn5)B1JiP0t%nULeG!dc@<;oO9t^IjZ=6Lwt zSD{bObJ{KPv-M(`lst8V>T_#DzeTfMYImmk_DsJ&b^qy~=f#SI@7AsJk8{5g@D9{2 zt6$eY^T8@V?o+i+OJ-Wk->iGwFx%v~b+q-j*x9Rce$S{_rC;W4GWGSv6`FPWRTsNY z)%MC7`>u(5y-DrU56*vlc0V3$@)Ig~I%~#f+c;jcV%{@RCoQE)Y*$R)Yh% zvCUzhWj4hoTzl8ZE*G(H-`{Vyr~kGoQ`-B-a{cEM%Kb6>U9;vL-ta-^dQ;BX887pV z1rx5mO$}ccWBKKG(Hddq=UY>IpWk2l@qIodmY(S|ifvf%cE{sB)v}*Y_3LlOmfcMC z|M7d*)KI1+N9;?pw+0%WOnoC(mHgECtIt%=gvtDOUT@0}o_c)(hvwvzSJw)guT(q) zRm)G8Zp4`V z=DdH1)9ljM*QPRP1$xh4vs>mgf8B@Xr{`-IhFq)Z%Re-I&UGJ0uPHOW+Q!XooA&D;n-kE>z^Stj6q}7S73-fR9ekJ?9!hL7_zM7xH|Maf!VTs)NRBA?q*87cn`q@|`I2DRd z-+%i1lMH(-ztHw)Rg-pn7T^EF_5HQxnMbCYe)zrr|L@eda>Zv1nfI^vYq5UN!0Z(< z^|*J9sm_5@pRK=M2|oS!+KGIttM%dgzAV-MTIU}Zt+ctN0&T)RlB_46XX949~QSc|NOVF(|G2CNjozCd@Br|=%KdJ zdE1p$lberuyG-Q&#c%)T!>8wo(M_S1YdO`0*i`PEdcEuOIqT~E_7mNeHtgDZH$=AN zg5%S=H)So4pS~~hZkSY{8F*p=!|GF&Cqw4F)A4; zbmjrW#)Q7YWk#y|q_$1X=yO#%;$tAaf8J}6Ju%lmm3RLB6!Ek6XVtpUo&Ikof1bU6 z{tBBowI{t@fuChQRc*Udbh@#A{sR5uT8d%!kL>d}G5ussBy(-QY1}@0$Bf?NztkQ- zEq`wLB;xtcXAwT`cc!0=w!CKl^Q8Z&`M=}h?|w3VZ6o~mlhpETEhR|8FK%bxj<_H+ zRmIKo$b=Kh@`w1jHmuwC>(wX6zl!ZLMqfUDvMoHwD*mPJ!MyvQo5c4lV2Qn~DCk~y zeO2gcFNw?Bza}nfs=4w1+V*{0|LpY3l3LbgUirs-&qLl+?=3!;Ury%qpP4p!N6wXv zvpUT8zVv-s7os!m`OFDVc0BIWj^6gP@|)+ANddZnZcXj2Dwq3=8ndo!S$uuZGt;Mg z{8Z9bMhiWgllC^{*HusTxm)UHpZK_m?UUW9CtH4f5AIxc@8`MlY4_*u$lJH$<+9nQ zYSkuwJ-N}dWNNnCvg4_-X{TcT{RS1qzdTm?+b-i=Xq21t=c~%bKsozD|8u2DyJK#D z`Wj4scWt?R@XjC1tyzamuWl&1Cvej&K+IH5P!7!tHuZt?DlAEvCDV9Ymg45Xk zu49Rq`NAmn_Wjh=YmcyUYQMTN+i}y}7^hj&UTSf&2x+Gp`Ohnli|;*q%zk?vx2*ZP=IWaHE}D~Po-+|oIeqTM?KYFFgsIZcc5`J9VCm%Qxq)4!9x+K1hHZkgU`YaFVXt<)d6-1qAD{B_mBGuzC==JuGs ziV9Ls_`3JHk#GKuEBmruURs(etFmg=8k_Su&!;EPNuGUuR`lI(`tRHCJpcX4MqOwb z-{c<#{hA#Fm5U~RG+L^f z78&hIhgA-FXl(y}uezMu zmA7)!-{fuUUeBI0r9<_2=KjCmw4?L=+~yihd!YW>{Bk!NYeXkw@#&}&-=BQn!Vpt=})k?zGhX7<%PpY^Rlw ztLi4HEoWnSPZjA1$6o13+a$Eox9pbhq6t0+q(pzK@SNT_tM5ndx)UGIMR_S$Wc-Sn zS{kjcyw!_k@`|hwlgZB~ms(!beSGY6v9HYKO?6_MWPZo2-=rIVXwl4BeAB+?Ukhql zR5kzW)Z$sc|5Sc`b=6sZvEPAL-4lx5o+@3UFLB0YMNIjpedpGu>OOgH#HzDj+c5rG z-8#|AH51+8-yfW_e~&pRq=L6Y!ehp7&5-2AVGVLnHO71Np)p~FgTS_|Fg zm9K8$vUHo-aOL}Mp{yri%xhYBA8&V?-QglUd9KUk&l3;iTrrC))jk;*z2~gD<-JaO zx7O6o4@G>%aZ%gbeI%xHWSpI4>bze++xqpU(%$q#LDwASY5!OM7^*fwRV!*=O{ID8 zr+>Z~Q*$GW>wi9-K7DYLZ~TfJKGX%?T&hXar~iiXzn%jX?f^kL3(o8>-=o?j+L zFZ<2Y#k6kMt5u&KRynQO80>BIQDqZr%={L|o4<60H!KT&)W#yXSj{SRRY+3H$`jf1 zJY=ROC>tJHA+gF|u71%`1JTu5$G0`)W|i+jDE% zW`8;R>;!|*o4v#99{w6Y?mzx~|i zd*GC5(Uq!h$ICZfUC&x^v;6I;sI|eXp6wFV4x93P_Ty>SO>{n-dA;}RwdnRdf5AurkP&+p>{s=%C?T$Pd^sd9k1v#5i4#moyn1}<>-C)RpFxS1*QkQYE%#W zy5E_+Q!RD%F7y3A&)!|P`(0FCaOmOXIkRVJrr!U3@B69i=WV~=DVpz)u}UcF>g@&l zSHIqtfBFndbLHR9st3I0L^N+r%xW;5*uV=;fDNsVpqZ5urm4Zy6)W5Fgkzbz4UJYt&+MBeGX3*}$1_i8eDu3pWY`#;ck`Wb z;)`#$^W)VLRQH@JUE->AagY3YtJiCUVq%LBQ)3+3^cRBhxL_ zJ}VwN{qgMQH`ThyPb<`)oi*9mt+#8%p6TE2RlkR&E^m-;K%*-+pJ@jt7@bVn!xF)% zDx`O%KtX<2eBn{ir|;QW4LEg#bXDh^*p_%%R@ld6-^%D+zOHwl`8SwuPvO0yQ842r z&jusj+!<>cZI&OENVw{e6{0gWIdb`_r?ykypWo=4Gd24nxOG3x-amBFY9Hm_>;L~+ z|L)!H_wV-o|NEZ5$0yzST6SKf^x>wZFC*4(PBl8di7n#wwY9JH_WgKdG&cY`ow{KI z=Y|H?)akKhn(}S+pJ(5fu{itW-|zSO7hRmz_;lSYK5u*a$SlxU`FBI%2v7(0?xxh! zUI$F>3TdWf?+mSYCm?zzqz(1@-nCnc%8f^@KcP@S?$+ajuGqRK@(g%?^nHEd-}_o|9{T^ z*Lj_3v@kXWYlCDJ?>kJykNxe$AO77nv+7xSue)5!u5-WJRj|kEX1>JM~JfHr0OJMZ6 zr+1!Prs^8}E}AD~TKnAk{>!{QACJA87M-Vgebc@ldG~9->wZ5yU0?tE%y-kjZn+v3 zJ@q$eYVN7sbCbltb=8sVi?<2NEL(Sb&1uJMqw8y0e1bXIgt?wY&HH^MqmsAs%*XGM z>vuktvYcA5r7iq@#c}IX`_;eh`aiw?=k%v_Z(g5yeaiCW>;H$u_g#3q@AtdAACJrL zuQQSYmnIC{phkO$koVJR{Aah{&fEQN+wDAQi3HU&519%4-yWZ{e*dQSjE}n4g{cXN zYARA5Ck(PK1uPTm4K(-P?atF8@OE^IbFczn&du zD!B7nT5n4B8OQUwuebW0$eKF;EXxL)`!dZNC*OP})?q5N=Hr!+CqJJVZhD)uEqhJ0 z0AJM|neBVtwIt3AnD%@ogLb?)bhVt0j-4s1*wVk>Zm;*zkKCFS%DMK~?k|_TPq%;n zd7)h@yYRXEx^vujAuBfMPjAzQ4*n4mD)2-@EOITl1CN-JcZyEYLK% ztSbLaT|z?C`flNI+0;W`-99NRFR%Y((YcZBB+JYr4xAfvY|X2M_Np#AS$oa#-1!9t zYJy%)6aUmUO`FD`{aWGU)ddEHYv%l4Ss=X>rALMNYAsN|jbDFjamOgagHr`n&+Wcj>Q zzjmchm8ATZE19~W+P6wxx$rc2_@5iXEOq~>Pzxd3zxs`9$wEF05 zVtv>)(ZginofTV4jtII>$v%;y^5l$E#NMh>bJ6NI8{H$fM+Waa_9b#-l56M8vU`=! zIph6>+fvUyt1Y-!`F!esIhFUPV^$aQOw)_KCBw7t>)L$XZ2RCXLht%|*FS0z_S5)& z|Hm5Bq-qmP|p ze=%|G#$*3urwXV=3q0GH7Bu(9B>q32@7JDJzg(acyhcr%G3rqRi%o6xOjorXDk&23 z@*nmK7yUZtJ9UHZ@$IRr0_3c-bsN3zr>xGgmYBIM_FU+KD}#T_)%|#AV#=%&EHn2!yYsnTs5E8u)+64L;-*`q z^aD?`ipK<;Oa8a-n4<91m6kK@wiP`+_3m19{@cI%Kr6^>mamy<@#8^r^?vj7rXORs z-TrfBxt-}k(+xF0i?S1#y-j8=SpHrrR5ed(o9n}f@AswCLYey7a3&S(ARg0+xY$>1}cQr@w@M&Rx7L@2Ta}?@yy<6quYZ zzp-Vz)mHuQYd?lQx!;v|neTPA<-)M0V|HJ6rbi$1Ih{4L4LX)`2Q-$l)yM5-=JL6x zLKeBO3r{^6c{_i9?azdIE%{ge#{}JF0-a|1yzV-})qJSACFJA2?|awZ0S|mK9?RSP zHq7qL`rwSLJq4gSIR%CI_uY)3mafs-r>*)mi8EC$i?7j5i)8OKF#4$eJTstW;^R4= zi*IEvFP$D!-(|MysXF3N@d&mE}^yw=oyT0B&PiD1S zi2Sb$?WbyEjV;?N=goXH*|gxS>GdhPcR)kFMqAahSLrXSyta8>=(RuGaUYsM>n`Sg zTx%|=cYSS3#bUJ&e}5de*L(l}Fu(ntKbFB)lHN$2n6(R3Et;(KxiS01wYG`bY1g8z zxz6*xmYx@>T^ZN8uBiI4^!*#MWj7L2PsQ!Er0cL)k@0I?kvCm%5{8M^N zGJQ(G>pR8g-}bKm6nEzJx!=THKbM*BUAbqwpXJjj>NWm-H%qU_ zhOgUhsaDxn=?__;XHXAnTRhS!@;>uKLN&(Yqz=bCK!osB-+#(!7EFY0g6tvznE(Ic-@ z|Js_!;6sy+NX!(Ol5F$s_os-?$YZM}hCN!7v-{fif3H+FyO>V=p!KO*DB)?L&?c3A zC#!aTIK+MWJkRX9sisq&&oG_vAZ^p--814W+b!i6FN;oHeQM5XDbuS7n%DQlup3R( zJ(#d;S?cTqR*v~flV^VV9Qk@?!qf`w^XYF|_Uv*K>P}tT*L5^(eO&B2VRbjBWhb)F z{5td5yJD&?_vhy^`+r?gFq)Wr&pq<@X2s(QAEV-m?_cZx`Fl^F%x{*=ulE%p`42p+ zumZGtPu1f@$rR8cF(2VsC!S2dzW?9X&2matJ>KknUz@)@@9wUm`I_FG8EmZfrN4KA zrp=!2%Zm=*Z_en)!>uc%ud=7=?(4Ygvh{yHZksEucwGH*ozSE^6_0!O-k)Bfq8PJi zdW*KH*h)UD7YmA_H>G&)?EU_2`~JOuYOZB7?Xo$yz|-MtO!}j+H4z&Z-MM~0^tyxG zYX57ohh~D7me&7TULSR65{uzx)1SQug|4d3@#2~O+97GaV|0hwr%v$1!oS1v{|a`l ze;9Um)s}nxd*$A2K5utd{_jQkshnBy|2|Eh|KUbt@z1&Tzb^LgnyMXMc3ieR=KHPd z`?mS4ld7&gbL-@HwO@OFy;^-bWS!&W+pB!ax?36pw^y!RpMS%wb?3RK<>{Bg@2T&8 zv&oxNHr-glN9Fgt?|YUX$+tACeA{{a*y$rXLCuA`hR0=s=cPNXxdTmm|2Z}^xa!Kk zQFl4f{%x_^$)2hFKhmw;Rvq-_mHzZRQP8J1|K0xo|JH@tn*E&H$*fk~Beq&*bzotf z()2q;eQd44ov(zBd^y@MbJNt%lQcaJFWY`~#xl0B!%nO1O!-b{pAy;j$M56Sw&~g7 z%etR9@+>dp`tp&Kqw3bx*>yu%Jf7 zOtLa|=he)Zo$DE|=XmXzl|1Rbtxl1z#q{sheYag6#X}Q_8fZ=9)8=0_7ImQJ!-WU4 z@Bc}Azb$a$2i3TbUEw(!bZ=~$8)moS|Ciw#&WIbZK=C1CAQ06`+M*G-?*FK3@%sZ*jkvUtbKax>%Z^&_xrp*U8)f6_3W0x z#J9}swf?(NdCvEo<&%x{N=w{e z#i;*WHF!x9DG5)j#ojU0!53r~l@8%d7sqwmNIFccss>*OR}_DlmxVd$!|B zLYec5=joshyVS8~HYr6BOsDQ#Uzr4nz%%-Go~%Fqr=Ie*`(yX@O7Q#*wbvp*`S*0~ zq3OK3!C8-1n#J`>bBAF#4%> zdHswzQlG(V;3U)MT)bO$JNNGQec$)K>$86M0#s8J)qT1@GiYk2Q*f_tR>{|s{&kz~ z)c^l|U%$WhlBfFA1FHLrjrzByoSY;Sz4w{v`j=(5bGI8w>Rs%8nO+>e%=75<{ePYo z@%}!OZg&~9z&KU+%7XM6R%i74n>+4D@`Js*2`Wx;X zkT7LnSa5N&T;&tN-*XPAq-N{QcpbJjD)e1GsQ-P@UH)y}-mlk;8r6i8jIL@-?laO% z1Fckzzn#>rYb7>q&gUK9Ze^eT>uY{DL`^BxdrQpmO>CRQ%I*{%-y~La{?LZJySt1e z--9}C!GG87|M%w70*EwrXu(aa%FXD&cP3`lla1&3V1` zHE4O#_nBhTzs|}IdAC_NYh5I0`NmJ%f4<=@r#x}^< z3&R1YBqp&f#*DBnWDE-?LPsvHf-Hw#&T&H6`Bd`F!s6wRN$#bNBsxmdbVQT6F&1++8o1 z$^MtGe*dpDKJ@N)`O8Z>rSv<*L)LM1+<7l9$l|gzs@KqW^2HuCS;@EaFI===RPRv# zQvd3xBU_jzU^_Jbza$*i|*(3c0QRD$)PAC z_NYM=>hr`@lQl_mju><*i?N0APOys4U9B^Pxmo_{2A?U6%EqaWYz5fYz=DaL_xh1F zt&y{tU&qf`U-IZC+f~ILZgn-877h9OK{BBs6 zEwt0TeA(ar?#(37D9u~TwpM{diOQhxpUay1srvr!dvBJ_&bxKn#d)LaLYtRMCZ~nR zRi=Ko`?pO?&kQtptfy-r&dp%{!tTdG{&R8vK20yb$gC*CR`+T0{4=0^8hIPP{CM17 z-mS7|v7gPyBR8K;kGJDie53aLPVxCS%kBSWUavPiFyrC#^1A2cyDHbT{(Qgl`MlYG zpa1_e|NFmV>Fahp>beQ)cisf;o7?%l>eET}-5qA{4$t@qYKiZbP~UOrAp2aNO3-Q` z15k>$wtV1JetCk{3B_H~ziw&A|2*Zl-0E?U@vfauZzT7>W^9w+w^iYL zv&v3sEK+NtfAK}n?sY_4-1g2Mu@k1*yubK9>4KIlrh&FCSpO}& zJTv-G(gfC&ejS|~A*^?Q*}ktlKku(ui*NDkwcE=g8}@yk`@W>860~bF`AX^aSo7N^ zXFkTr7<)+0tNnKKoagh6$K_uCOM9ky%;cEPwbeZfkINMMZ2zXBeZlItR07)z`TswT z&ppijEhcUy_qD@oH;X<^i0!%CUX|pNnp^krsQ7tM!+yS!C`mN?8x0)iv#MODeL8M zO_|%h$$x6$>|I;zYE6IdNS(ILZsX;>Pj&NeM%4!Cr3l_VQlyx?e12V(da`0m!HkYp z%a#qBB@_>`&DRW#oRaXs@#oX};L0zHWs2m**mV4Q#5V9K%BV#g+4x|I{f3SbMp365 zu|6;T?*Bc#|Ig`n-xZ5f?p|0hfA+FE!9VkV8|Z(oeD-wu-Z!at(+@v9pc8DB^zcmk z#>#p3j-<(1$*?)5PUW4Mr4z%x*j|%6byd+_CrJY><;^*7KJI)`rP!ibsFQPC>H3C; zA08abnXlv18Yyt)G)rtRuf?;w1qKW6UR=2)HSxI9{-WSAxfAhIMZc~{t++GsdzNvd zPp72&4tHJcUD3xb-fc7sQfu-3b|dJpS>nIsoCM!f5pB*Fx8(?b?XW!-c1-8gp^B3? zbb2z+UEkBc^~;pVt}_Oq&smHU&NhFq?vYD1Y)I(ZR1he3{h3v#t`>K8$@S;KH#x%` z)s0Sd`+PKhYsoLWp`d6}?(#D`?uO5wRw#E({qe_%EBs%rySG{HvV;>yd#go4t3a8U z*@=KS{ar5>=~+Di?HKr8J|%whrw1qZ`>}l7zW?uAzn$tqQ*t=dymoxKY7-ExUGJ%`pM``Sbj%^L(!+dFZfGr@PuMrqb(ooe^vgS`#y6s+t<6?%u~+A zrQA3qF@<;E*@W3yXI$AA<(^D)yzXjf?O2ZNFTI)2i$3`OLE|@7#jyz%rw- zL;;n@Oo98==hqZ%_q1Vqre(B0Q2$lOX)_te$0mZ8Qlj?0-}if0mCEVIv+sRb_U^gM zYyb97rz;xu3RRw(x8y#o=y($@!9G3JGC?N!ZT2z-Gwm1JYdn7&MYY{+`^kIa6>rMn z2G9=_R64$B&cvrpXO`UXyl~p4Xu6J2icE*?;|Gu0w!JPlo~v{DWMSBf zY=(W!KPzt@+szkoO491avP}UqL$7{qEBJ5m?G2w*#T7HBeKtzkEx8XQIv!6no9Js@ zEiu8(OCcmiGM7%$5B6Ui<%h;=k+uSufio^L#9K*js%7bxd9wyfR#0 zefM?R?6yxyj}NSK*t;PD% zPZmx!o4Hl)H`ixI@n5><`)W3qZ$Ew9r%m9HS_g9&M`F5RsCHM>*+~JtKCkn>?JCT; z#=lZfAyD9OqI0ujb*n&`xcS33`<;95eYLI2JF(1d@AVnyTR-k#4Baf8a3boN#&*p! zlU}%;4ya^2^@de~%}`<8s`E4Z_PdGm>w2&C-(0!%I9JQpz`D%Gu@mkKZ1c3{=bx+n zQs2sTbK>G)*BkXa7}xk7EKB+KxIXxd<%v$|{h{iIIla@@6c}WF{kUqn{-W6X>lgpe zFUnc}*uuT0;Tcz8|ZuL$wY(_|)4f9J{~Z22p_{#*Ly?fbs2-Tb)E zdY!S>q>Wh`Zf6BGfBk)5U!N~Lk%M*0;m_x+*Z;PZ1l8hi*k>@GoZx7t*dy(tH;YyK zP5y=Ijst%{qvCqm!jb_6e(FZ0(KiDOoEGU9PTcBj%Qcr%mM6BS`^?f9tMj`ReV*ym z)jgT$zU#T;{KucS-><9Q&Up5Hii;BS)lC_x_kKTU<}bVN9?7zEIe)=_<8u~^wV7uI zX)6C;EF&RjsWq|cNo0r8)qtwgy4y>t9$pQPzniM_@bk?raq>^aZRgGJZ~4={ zejGAAW+vvuk!Z0d`=;}b|NnmPJ`=vi*S2q}rF?DgUzUG;&Jx+@W^L^FIPHNRf@_A3$9sNA96|^;`;`^C3+Z*2}#kco(U*XKo zd8T`7`h9iU<6b#G(#f6Cc2zndo|=8F9JzJKSmOKaZm{a!Y6+sfvJjQ>uZcDMU9@!i&I z>cuuUmt1%c8W!36%cNlOTK|6kEp{9070gc@|9D*9ezw%6rLQ&Gc-u^QHcffV?#$6X zF=C1{hjqW3iio+mO4Wz;#eG}dFGxIOT-I7zDCESU_=eqNnPI!-^rJstB{UQY9hPkK z=tCHX-cD29iZ`rm8m^Eid^uIHHJKoI_dU?_gfBM}fQ~Lb*0UzIKN1rdzxx(o#Rg^Dt zFa^Z>^3fd(9wuQO>9> zYJT1P?=1egE5E+{wQH@v{pD-Vml-8W-cg(4FCD<4C}Rd{c;65gu>G@;zjnpv8|sS= zU0IjXtYFmK!#O>!>g9v?yPwai-qpcye%Un8W~RAJ*3agA7I5Nt=u!Od=kxOQ?`xi0 zrz`rf{+c#%cl{Ul`Yq{yE^qLe#=EI1<4W$w{FH|bM!|^!e~YLjy6@JZ_V<564Eo?{N_95RHkE8I`QR{7yj#hzuUdO zJK@?wZdt+F&x^YCUMYn-b0q4d$^P2@|J(g@P7Ke?6aFz8DH*)4dFdVh%FO+|-S0Pf zcG;VkeO>tY>S2C+o8OPb_wU%Q*?HM;cEOpgDO~*Q@hkpZmdsgtjN|jq*b#?VFAD@)URR6Xr1#OAcguDK3s$XPZ&HVMadO6pO<@Zi1 zc^zQBd8Wly(Kv6Stn@FLjtcn+6S-En>lyhc-u|%YE$6xiwJ9voY+pHRzk15fDL!Xe zY=8TjdgO|eUvg_Fz2%Wq(-yaS9P)K#F5B%cGv!-7MJm5TIUa79wBZM+_=R`*puI-{ zr-+Fu2e=g9aDSNg{7zxe{(I!`jh2>)0`EV#5zv7 zrYk#5DV+Nv_Ev7B)*sL&HfeF+$NsXymA^n+7^;)623*kIX~TEWBXp6|&I+@B$s6Bf z-cIC^6MkUGd?m2t^x0$<{bVjH>BpV!Q{Gqot*%k~Z2qZvUDD6vFZgV>AK&`ert@WAN3g zi<=|&PW=1-r~UtQ_0Ri%@7}-ri}eiSlL80-^qi?$A`q#mzx&Omyn9lY@890q_v>=R zZV!R5I#yS;Z+cYaWNaqqf)4`$uG9@|oRck#v-zk94-an3&WbMCH3|E^5l^;_+& z^b41UxFf~0wx-$3bS~{Nw7cwg>Z{q;z*6Jq9l19$ZI(^n*LtSvi1hi|CAZF=xsbB& z7ihKra`TA~C;glrZltE$T=pcg?)Uck-M{~W=82Yf7an4t5X&u=y1{AM$v&6(B>TgU znKYSa_8vze2qH{5&F{$76g7J&hDbeqL`}vFP{QK?p_kYJ`fW|AzvL|%w@2fBq z*&GpHaFF%x^Zea!x4o-gTW%D#_v82uIj}?y~iR(J~vN3YQ5W1HS_!2p3p6+YyB7e3t#Jhs`wD6`kn=LC-)rtyKI&J zFBXN-JY6`}$+AOk z0grCQ@8WajH$^R;&-USRnacC@ob~%Tw*P)Sjt$`!6b3cd#apW$wu<+iGCL^wZc4vK zq>@4hPn=ln>Drz4-=F?VVSD_jIA#5V|0(SXpV~WO7v*&Njz28$&m& zxuXAkA9L=Jn_uLAU1>5n=1dg?#NP z1q<~Rz`JXgb{W@&_=kUA#(|&5l|MU{~b*?;<<}mx;z4w3b~j~BSg2V`P~htAGFZ zY5M*2DOd`aH}Y&N~x$!lbr;ld|^y&(`}l zi$ARvFgP{mS8C0|`v!3zzR$8fdB*jMXz8&Ee-+ihk1=1ejpQ!wJ8}JLc>LY7#m<>e zrx)%xTDWcM{nVSk=T$uFTz6Ji`*GD-J6G%C+DF3kXVgA3o?m(J`9#xw|8Hfle><;M zc18B9Q*V^gniF{v&c&NX%`*~8^r~OXJ2C%3`mu!P?PA9?jwjtZcV_AO%Cp&Ns}IdN zEpck^MgGQ(?|0w-oA=$gHaGaD@EJ3Yze19y|ITDS!*k)#<{z0QBI?9i^XGXKswr0efa^3yOeqHI)@6Gam9(*qGeEzQf|NH-c z@7=$0_{;>)c$fD}|6SPL^I_@#$)#;&Z%%t1k2(K)W%U=cy5;+_!W0ac#XcSSZm=vk z?$pMWX9VrcldY?|6{g3exjG+Dev_cLRPW5Z%$*a&k0~Exjk_w!YRix#{8jJW`R|+A z9?!gZ{N;bpD!Ok*lloeBxvA|?zxh?dexm+n*^Z~lu?K5+sOK7#*d8qx-1+}ve_hG@ z{1=^|^_Et(T$Ml0mG8TpDwS}ry!J#)(%wt^ds?3FoLQdvS@C!1nZ{z=^`S#u*i>r|O>vDv4tHh76uwfOCY$kuPmYfl&%q|~0aIBqr7QZ#b0 zywdMbK8M(&XT;Z7Pw01*Jl<+|F2c+Da$M0xSMkzM31Tl6Ug&>$e%i-b+3Q}u>a^Q? z$|B_8Hb=?W)w|ERmp_)`s#1NdU%U0&L(uGPY^3bzwgWpn!c2_!DDB>2oGkcB=S%iG z@4E#b?ev~^H1nMAv$2p1;9qc-Z$kJnhFc;#otLfMA8J%|LGO$BHMuj}w-jGp-(r?< zW}&~5_ly5i8h__&8&7+z^;t&Tim&w9N`^&moqscZmMQZ3CObd*>KoNF>08);X=F?P zp7Bfc`$H%7hmY=^+q^pELGqc0)u7$KW&1Dt1W^#-TYxs8tPIbk*Zec-xEz3YinM0bl8t6EJo zOW(w7_`k^i7;}k)-oN9fBF8r=mPuWZ+txRiZEwr3q`D-ZFmv`-zPlCAJKJBftNV5{ z{e9~GJ0|C{r)<6@tHJ)(Fzon-zcbS(1R5voWLvslX?g87-*=VwDxa6yZ(bKI{x11i zd@hxA9f7-8=mM*DuarvYRe^+g|$W@|u0u)IS|P`uXzl zHRnq=|GQQzek|f!jKtz=S1&qoB-#tJgDR!Ntj2CS=82Iq83yi=M;}D>Zj+M#Vc#9^ z_%QTj%#w^|md+x#jl;pFRDpQcqJAeQ&nQbT0^O;(mI2{_#bDcUkw}H-A#R zXZ^j|=?nSRl=mP1Slj(7ndgdssm;RPocjw;?S6aLYQqgR=T{4w?p!&qJ4y20!i`h5 ztv`OkG1~pw?9|7_%OsvxPG4&K?en(g+=UBIPI-OB{r0leC$1>1T2m1JK0Wp#e~iU9 z+u*w`&!2Dm`|Dlk>$A#SzWV!D#7C#U{a$IKk{frtd*AtHz8UwT51$rDZupu!`}Ktv zY98_RtK69i{lzXzOiNs|v3pbX7f08YiE9NXW<0sG_thP%)<2j0r}w_ysw@6dviAGDqMYS(dNOU&ZKrWr#x4J^dH&J& zGsa7P-7Aa9`MNjsgQba0b^o=M`N9<{hT_HZj_*6`JTqYXlOpH!?<=Crx5?bDk?TJf z<~OZ3_nT_}jfdrPkK2B_Y`9Xkd)c)6za)=m_NNv41>gTDx3;1i-oBj`;Mho zq`k|OkGv|GsgYZIv%MzF{Lihrr!wz0znZg@xz*^Q)bdyN?uozQKOwitYp!B>^1Ped zo_=1Ze#_|lLOr+I-!cYI?tLz?J@w$u0prlUtL=7|o~gb%RpWfX@rmDVK6_af8W;Z7 z__N(}!JSv;?|M67qp!QkEw0M=<@esMW|OgKzqYmW>HBKFXZiouJwC9h@KE};yA@@! zi(jTjo_}PqWlioC*A@P+TxE;pwy~C;t6kxKYPImq zO{HP;-zJ7uJ8G-fT^G6Ho1PkK-Q>sboZ>b!Z~n~v{j%E6U;fXXdw#Q|Z>ah1j@&07 zSKi8eX1lrcvElYFipM?}=3cs0zJ>d&bo-RzXHxH;{#dPi)NIa%HR4}=m`_c+DK4R2 zVfJeJ{)PH47>q@p`@K8AIs5v`uc6PQ{-u9l{C;$2i(&2xXNRl8JKFc_&+^~9{`-d6>qi8WWZpOdwc`*K$B^tGK|i&x*s)LHzi z@w}bC_;R0~)?05ho^O+}dG=OT!+Uk#?kW4_-e&C04UR9om-%wDb!b%Wrgbl`%Rc{6 zV=K2cb}|3f)n^y4(|mTfIP_Vq|9xBWzxA`f?tE3O{rzpl(#PQ(iZW^7?sNEzza1~^ zl^D)kdD1j_g`U}>jz21oLQkk1PU_2GTIAhYe5-TIqrKgW(t5&voN%|hwD+3v#pjKm zJeLTFr`HFo8S#GbQaNDMQ=qEU$Z8;HD#dy{;ch_MtM#TF=d`WAKilUf_t9FA*X4Tl zk<7y4>KsXJjlVAQHdd_vdS+37wXmb%lbWJaJ}iQP316!#%u-r7`V}YMaT1Z3=;sz9 zRBQGAP1&nP9l;Z^yHLcXldY560vBw*SCxJJy2-qR6~{L?Y_r^~@m2TT4;j!>HShOFjc;#r(fwF^#eCw0 z@R-7*aVk%3R;<>N-ZDFKdk5R2`fiyGCMJe#irahaO|@@L;81-s$4q@y_a^<@Q!Z#E zg&97P?l5~2d6v(R(sfX zzkh!^>%yZOy*b9;I0M(Yyxzv9Za(R(74wvz3YJMPS^mWTe_j9fn2+(+uZe#dcQF+? z?Vgc&!SWc#X(`FQ9Gj#9t~)=OzU%$u_;>&P|G%`KtG)jO*VDza;xDDGe6|?K8S?4e z3X$ciZTdLnms)nuY~GsxR&1uvf{sNVkC46eBDuC$dzZ+I0G_mzNOS3VMhVmWWsP>I z+b`bDd-9v1*pp_%wjSp@?Qd942mDXsb2#s?d`V8v-xqFcA71g%NaIJ$txb);%*_NZwq7{7`rO;J+q*tl`%lj)wNmP=+y*+iqdGO)aoH~! zGYRP#r!R>2TE(|KZh8Oo^OePsLXz{ZmvYQuf9zLVR`)C^=5dkpjP;}-67c*ghd z|N8%5_rJR}_l?PkBl7=0%D>+$|KfhB@cEw;EIWCX_VsTBt!sS$fLG~B)4u<$`ZWtz ze^2!@`FDPwW9{MnKh6Iyt9HE~?Pe|h*?5zu^de?Sg8*}j3}x?XX@`!Yo;vGWCpBu(O)RFP6we z4db^haR;S3cJ>Tfs}W%h5!JXdwetn&;;I|KM~q)y!4|113e zs^7JNZK1yfio^DbCtua_i+Gh=*Z1DkBPsR*}4JTp$)R42!k%>P;So6GTIt`Yy!Zl}###w+Rm(tOQK^SPFjOVwZV9lP(Et@c&z zdF65cdD9J_Zm<8neYat;&osqbEI*&_d(qeTb1idsU(~wFnb|v+-&```yJD5yFUI@M zWuYla7k4b!EGfQ=NBr$#p9SIkC*`j9-dvz>v~$t)vzK}QMrX4>-kG`C zHFDOnrouZtRidw?Wsh%t5^>^L=9prxr!?4I>2Lh!D;xN) zbW<>Q=}D{0+rrM5#-93BJon79DSM|%f1iD=R3^zL@lKAvdqU09{!jn+ZS1X!eJgwG z&$2cC#wDwaqvzLJ9TRvnJ57e=6~DFfrubF?K5NjjhBw{;|GqABUue8*xm)Y5j0C}i zEBn}@#SKsQo%>`R(h#a+dTBM!bssUkE!jsFr5fM5r4ze)*@U}hX?re4Buv>qanZh@ z>A^WRlBH?Zk;^~#h}LF&d3*X<@Me47lfME^D}3hJXnNags=0YdR@QT=!bhL4a@5S_ zUGsk7MSrR7F+RU~^y+k&yRWY7E6hIqhHdiqV-g!R9((tOtk>|@Tcf%A`=)n2L1vem zQwt84zBsl(aP7C~#piR=PcQPxJaH)?NI7}u{Y7VGZ{N{Ts|!DSudZ84So*2TqF0}jON|q5epLH>E4wQr zVC65KGuk>em(X4(a_^lwBq|z`xv*%?X8c$Hp@3* z8mqDCF1?_-Rr3;U8+YmN{~Y%<^tjP=vu%#DzgPXSoHt81>7rZfuUWsG&VE^T?_r_C z)NT8Ymd^Yyzj>a~;nr-|cin5Y<-Rk%rel$IwV=5CgjJHpi<73@9(OC&{)(L6_h{nN z-1sf`R_YtOS=W7zDt*1Juc0b@UE}-0yS66Uoh#(E*PC+f|8_O3J>-7wSFNWZJF_=? zTrG8-9h*FL@geiZ^Iny=baG8so1cFn5w*FE@xS@!tBbz&&Cf3_NImu|=ekwxrUU2*cc?HMO0WJi{X|L&XFwrbykbH_rznr3{hKfUPi`w0t{h8D_Y8gpJX4L-Z%V z{d&onEAAWeMclGGJL6Tw`@PY%Ytqs}$``Jam@Rg5wT|+qfZy}ZKa+WQCsKC*f^&k? zZW>m;u~~k2W!cIwz2~W>n`(J{Rur3lIeWEqZnkXHeP^TYZ8DtJzS;I`c0Jr`=#@tLqh3P*9l=Iht5-BKhiBfnQjE46n#d3@7g*UKBnY&G~VPKlAa+c{5JYgSJF^0{TV9&l)w zTb>O`EHS#@I44NVxYuW@&fIdAoM4bQMuHa^C;8nr-o{eLs%szx&%;X1MC* zDed)d_C3G4zV7Qh!6~PGLS0_&TSXI}zP34u~%tiMyljl{+O_}`NNKa8)%Kpp|C;10SGKX)x+^Bg%@tEnm z-a8-uOqsfoZGv~otg5J#9|}Q}>Mp1+-*U0?`P}Pw`|aMfi5huX7se~?sZ6^yx5wcM zW9iwaZVBBNW6JLo9*;AVR%qsWd>nMZ@mA4PhTaJ_(y0oUC1y-~4?0r$-d4_;?g?Cv zS-$$-e^PnIjnPJb|Kz;|f%6NC#eQa+`^g+`lXBT9UwW-Cu}3+@YR095Y1c1GxR}{L zImeNBOQurYYo=Y3j-|b_{TKe%f-@B-&Hl+_DLq@#;b&^hx?`SCr@sjZcq$&bVExul zr=PF>v+Y>utr>;)duH1!2mz=3!36a-jZkLWV38a4Sk-(=aw)0?&J)o zyUN^OT%RTIUb|xYwc%W&-hsa>g-hiBouAe8UB6gk4%3qZg>AnL|4+I*_1p5=k^@fb z7oMG2t!q4?baGYFzD0A-WPS1fchdf4oaFpF63*XF{5t;qL+!W3FA~4>iqqqxyQHgL z=%rYE@Q^zu^2_G6;g`MO{fia}))(JPeqI@W%Ax+@&NFYkelvWR=gKy@b$;98wKJVp znCso1Rb9BSeX?%%{GU8GQ%~Bp+g!YtRuRj7>-G1#_uuDDU;AeA{6A0b{a-0uVtlIV zAglPE2cOwQw)VNQxlH)j_kIh1wT#7Qv0R6{*AIx7$o&AV;Jdm#TjAB*O_$7HgeO0f zcou(*;Z|VnyzY&Cb<2}Ei^6|vWph2@sa)Mx@nZK0{l^?HBo4@QpSh5>XMW+dbcb&% z`|W=%wtsc2_l=CZlH`9)(<O>*NWQ-`Pcr!S+0b88ZZ4m0$?!?;nfm5E9JQi<6^{S> zvp>h$^tWU&$79BAd->L;riIm6>?zs`&0vAH#=u+?bs@u2jc_sPa_Cj+c` zQ@>{WxmD`i zH(rxyOIrE)q!Kez*LpXG4|{bSe%KsiKGhJE%Oc~obtYTQ{EHsbnl~lAx#*b`e0-`; zYha1gZ9|KfD;63q>^(5I=~ctg)yJ817o}ZaaIg1RMt`!QQ*X7-s`|w}p{DuZMCcn7SkC^2}#WWIg3Fch|uqsU`~cn+=}*cQy*k+;M@U@gwsN`}$(z z!Y<>Ry)!=DVD9NQRc8F;6#F&xPf1of*6<-26USr@kvbaOpt9oNHIE-3hn++To!*?MI%n<4>EX3*xURTOLea zu9IFH)_-eL-k#-rjW*oh*Un`8%lE3$a7H1!LEcZDWjCG|2g|4@m$}ZryX&c)b6T!|EYJ<)23ZLh`l z`8znx&QDB?yFc4#)26cxjHXr%+Y(PZ1di<*IRrpNS(>l{n`S^^W|SpMxMPC{`7j4tk!<#;})eR zX2*Z()b@ry&-;2gDr}ysCClQ*i~SPe8SJl^W|pj7u({>@d2Oq9$*&dsRUOBRa-+7J z2RHXMpYV^pUGcI0^g83IGlfc89@SbIZ{@q^z@5#NK{4IiC z*WOwE{>rD_d<$~Y7OissvGZl}&Gr*LuQ{)0p5XqTxp_&Yh+0v~vW>HTp4k-=A0_^J z?)z=|FRrZBv(zunJzEpD@ZQZiWqY>jPQ1UX@9N95&&>;(zcSBXeY1bZit;BXllQe> z*`4kA#q*WO%%@IlR|@M_sy|*InV!Wa{`}gj5Bc?0 z=WD+0CcCG5Us?PXeH}b^(W^J1;`7`4nAzSp*0NfLu9k7G{% zS#p+DhQH)l%9`cxO0zcmPK@8&8*-cT%9~$%{Fl2lFO}FY5r5}QSp4Iu=dHGVl#AP0 zem3E`Rm~~obz9A=?&RB^>*=mqWOFAtdYa>s6Sn`8WsDAVTkgKrU;N;LPE(qC@}Goz z3*~P8oOEAP+Dg3il-0q1Pxj=C?XtVg_VvW?Y_ZA$pQ3q1^NRT%N>;d<@tkA%t+`)0 zK6!K9#bZ{M0c_80j*EYtZ*_iUf0(q?|Lcm8mgRRoSeAM{lFTU1_0K(a)78SAXY1vN zZ&}M%eziU3w|KJr_p60|vMiMk?wxu1s{Ith{$TMJb$@zdu3hH3rLe=-;qQg{HdYcm zQHgsN)X1%kFn*i2x<>Tf`pr{!?cQbZw&hP?*xRmeqQ{$4KZovin_rY`r~i5JZ@bq) z#!H>gI_=ea#jvhB+wAVF-m1u%%g!i-=K6@9-m>a*(pK%}ZBGxUtmjc|sRTEe*C%d% z+NHg2hV7RN&aqQwa+fUHTQcQAl48a+DTS_6KI+|@jtDTeY+RalyMe#v0rT9Vypq^% z?m(rW&J&I&pZ=TDy(wWw+Qh?$imnzv+TQ8M>hhyd^6F;Im@C4){f@1_(l2Iwd7)%7 zW7CB4#kb$Dna!>mB$l%=@gV>1fyNDK0a)yTj)(HnUtj``PSB z=@Uh#miG#eW^&(57W7xq3skLXpY79K;Cxj_!foEpg+{7UlTNBRh|Id_Ya${%v+v?s z{i2mYi;Y`dZ<}6^+5G&()%Mv%E-aI$9yD9-`=Z#T;S!tkuNmiDwlE)KGwS?ub^HCL z$+M-EQ{F$C`Xb`htiraB?2(xZbN2LK-*rIk)O*lUpJU7RE#}N|Hh1cHVxBay=)>GA z#>v6+V}AFf?fdj&u40ka39GL?F+x|f=O1cl%OxW8hb9xf8(8|uW;LKzGAqu z>@j(}ex8qWTtb4iO^Z z_n`JGyNg}r@60wlZ+7^^E47>JWae+yJ>kHVc8d8IQ{ct4eOZobGoDZN-^3~LF~{Y* zz_qFIzp}LV|A~7#-Eu)%SxK?`8M~7}#s^pSf=mT5$csw?h^F*Ib^YOsqSq#%*w| zNYHd$-I3ONp0eAD*L`xCrZTU6XY+Z>??&~9Zr}U1ZSQ%7d>3c!@@=B2wbysw+xmRV zrA6;_PpzNnzI;mj^QvRb-}k<+ASjlQ>^qSDo!tS zeD0SryDD+rjV;X6BxBFodF~B+E|YrojNA#CVv!=}y@6p4VK2N>jGKSSzIq(jG?R`P#3{d&qw*06(X)V`!% zV@L~Lb}!TZnDLjaUwUPn=Eq+ePnlb0@Y-Kq&i-UX-`*otF4IIpv47u-=~Qvzt*3>|J|iVt^K4&hznEtBNp>id& zQRug`iq|IpYGPb-WAOxcS^Ls;l9PJxJzzby^8SzB`!llR7wn&DIpurO=?9im>WvM8 z*4GyEo_}R{^XjrgH`qQKZMbk?5v+1Vft$HCj8o0fxiuFqVEK& z+i%|Z?{odX^WW$E`kml=z<4opAb*d(++B-hXL`!tT20@|kt&h2objIVHNV5V=JBL# z+3sG+{Oy_RH-l1PjvdtGHp(dpP4ncuaGIW?d#1x?`zLj{cX>=F6uw2<8TFsBDj1#Z>V%(h34Xk zm8l!^O7?TDndq){?X!rJsJ~sbxVN53wpv$efqf6BTi?zK$CIfG_n!Ef9&XUxC>V2F zt2p)#&sn+TC1urly8^$OGOch6Ie+*>ws^VJ_bBJB(pJ;1zA#(7yFI1YpjhC1uT63M z=Ew~WWx_l5ez!64Hb*rbf|6+b1uMd|ScRE9#b}cgWSU)P1ky zMk}*bcQc%OZJq7US7)j}y_mkzU3Y7Nym^ge_@BER`%@o#pFMIcy=Tqmd!L`|IL$xF0zy{r>j8=Qm7K%{un+L?qmwpQZPeLw&`}+%?UL z60z&`qF+nToRz-DbTwbG>iNfl?0Hi%TFks>2VQ(2v-I(=bu!IM7M}^Yd#A_$+T34j za}8XM7s;3f3;w-nxGyc^mWmZm!GF7*xese=rDs^#^S*Si*=F@tL;drn!xFjqY^J5c z?=so?6eVTPK1kcfF1tZSTw;0lvt_O`1kd(VpH4Z}qZU_cxBYH;@3wodD_&2$=KT8Z z;)qvmt7g`%DBqWUV#m`NiE0lP?&|rzXR7qB%}*uoLDagx`))pyV&}=re9Kjv zQC#Hn>4f6bHEBFCD!)th%59&@Y+bkbx#OW#R(8Vy2FY7XuV(VhStdnHx z{m*BHm-!0^OfSrnz7@ZU*X{V})Lmz7))>n^YQM2x=K1P57sFn?JiX6ZJ%d?VqkgNa z&SA?%vCo6pp8fN^mAU1%mHo=}tHR7;iFX6e&AMA8oiW|t*PQg=Eq1rlXIU{{Tl7oDT0Qbw*_lM1Ij1=FTLivA2JN%&{4lVZa)M83hQXQS z6;}%0II$;lo)dEUqH{{+Nz#lrp5QR#n#g7C-lhvxip*E=D$QRD0G znY=MQGin#v)=gN^pVe?}hcDZTh0@VhY_ooH|J<-9#%8j67Eh!^T){!s>igEFQeqvK z_Pt)W`wLJ5BoWG-a(o$vFke)BPP%G?#( z7Iw$Jnz>D}E9|*`3RC3cpR(p!c@dc>OqrPjXPmmRDV^<@kzM*1rDHPYTE7*##IwxA z-`TtQt<2UldnA#*Q(b)jym@iVDslI32S=sU9{%e@b^U-8}L`0_u_bITw6 z`F#HUyUurPFkYMC_074u}#Tp!69i{EPRZfg|WbFE4}Sg1<# z*O3WT;qkklO!D4kIic{*;)fT1uPlGnzAc8Ww4G4xa&m*#}`YZ6EE)=@PCng#(MqeHOZSE63jpU zOsM3Yxo~Zy`R;oQYHoOyC=>`++B?@OoWHWW@3D=vRZQ&dEeX|0Yc79uWtaUWKR@{Y zLfs#~_t-6N=6nCS?u7Mw`ALTFHaPq>k_Vk08CxH>?Oyrb>YJ(4OLM#4F0zWhc<*aO zXhM&(`}6ue=aaW)aF;Ay*r)j_HcceuPKwM?&Yt(izn_R0*w5tT+aNz;2HB zOY6=wxXOOqU94aH(I`Xw8DCs`kKq+tBR{tFvuyjU4)eKHf6slf`nA#e;Pq)=Ws>|? zo(n(Ie`U6r)347FvD0_*-V9kE-)81^jNdqpxoGX>KSnlR8F!}qS=1Y`oA0RQqOF$` zf}Qi)ZXG^$BXiYdw(sHT>#7b-_*Ts4E;m#DWXo1vcAdA0FYd2NJ=xM)muq{jIBd(@ z$oP+yPx_uen0b4#=JKX8hiwx#&+^^FTDhF}#s4qLbGJNycx$tj@Wt;x?gXTtPtAy4 z$G1?nA7GM@frVsV!t?sajFo8jEzi>%r& z?zJ0cn6wD|0`1>==+Gc^vPsrC^6rT%v+wg3PstP$J~8xlws^mJ?HsS}iA| zWO1b%NAaBXx^Rd|*m;7q-?Z~9mMTUr{4>wjq0;AZzu>_s@23bl3;u2KU28ZoCO0zE z{x=uTO^ros4XbXZO<8I?DP2%1>}-pv$bIkGn)MqriY_THIumf<^Y-Irx{J;xsHSnw zxNg73|Kq&XCp1f6KU*moxZ}=+EipForAaf-xa?SE+#I?6Kt>U-q_a{^`-2&Yb2aX} z@t^DFFv*_#L3W$F?WQT;&t_-K{xCUoeK6*MSo@`=4$=4opi(9;E=KZhL$6an^U++6>mQ=@K_3q;x z3z3Y9G&?ipO9E@|n?3G+{N2px^$gXLjQcaq^JY4haIDLmBmLUVu{y+jM((wZ*X&OJ zUGaY7=g8ITukb{iHoDSrbMo;%%WvlM&%c?mdzvfft*Y&3(*8-Ue!uecm8x=EvoE`2 zy!-Z=&o{i?8!2mowg$K+n-y~bBfn^ zmwwz>tWoS9zf9rU@^w4E8|QA*e0~4xtl86bbJ=vB`#i7R7yf*e>kQ82ul~Q{JlXJ- z|3!pJ7=L*DgU_bM8?!%lWmnzq`L}5EC#_%mBY*#0^KJ6Joy9t*yk~Fht={D(-#jz0 z;KtL>=SsW#&b|4~cYNl?@5}mk@`bIR^<3h>441v1diK<>2woXcUaGUE_>4qbTE6)8 z-)qn9^QwP7vovU>?o>)A`U1L+(@t0FRNmiJ>_tCRsL_jt7Ds+U58fE=H3h)g`(;2%PwB9y1QdS z0^_OQF(F@E*IeqmvsunMp{y&^OiNR}G&l0#i^$+r{E-(fqy;Z_Ru23C+B_fkO<8=k zi_gT9E!!kNzmfQ%<@QGSVEUGqMl0SM27cAeso0@uoECgx%lj04!>(x?n@^mqtUZ<^ zz4{STY;*6X?mM50OKsMM%-qypx#UVjN6w=7%squ`vU_>1u)kgLvGbor$>SBR-!C6a zJG}7y$G=uvcUbPxOVcw6?)aYk=b7DSo(rWi2EmghH%Pdj2ze}Fc78?nF@al~_O;tN z*<1L$++*r@jYrO{bKRzy2U_149y7}0?VObRbh<{Id4AZ`_$M74`A?_6pA%Hq&vI^} zOW$H=L-!eyo2+(OUKffyE8`k=R&nCos~Qn=*Do`f^lHJS^cOMahpy$QU1>kQoH1EE z@Nx3-gr_qLxhj|4`&k$FQvbAB<=HrgWugX3zm7@g*E9z6mL9U55Nzb~PH2ndY*A

3RK4oRj6&g`&x~IfT(K@%zuEF@AJ3+Jacp1BpWV<)>`At9)@L%F6ePEKu1-_> z(|zx2-&d#a?)k;}Sa>Ge#X!(89JcP}iEEqw_11ab)n|@eF!xGwZgc3I%$L?ToFty- z?RvTFUH%E?x6OM3|0za3Et5QE{^YLZmB%(`HJ(r0uDj;q%I00y7Os<2&v1SoaeZrT zf&7!%mU~|PPuqSn?U}v9U#Sqw61hZ~C&pKlYumRO-4^`2V% z8}MCSd=!$eFHAH`UA{4Pb+LiM@{~xK*&o}_XNuo8V>4dVJwbN1slnd~R;lL{j05h^ z@|i6o`MM!Jp{MHq@B8=v-ka`NADZERi}mM%yt~gg{IfmTux-(wl;?}ro;c+xzs&d7 zm)1%nvnLhrH}04pJePZU*@3KPpJh$&SF7`eEI(YCx-uu}UAgVEKackwzou!`%c%LF zs_0&YtP@B3M9{`}J{Gqv$pQx#Hngft|4_cTE>b{0+Tnb6R-F2$3mw&>8H;_6EvvK@ zS|hb}kKVS`6U(=8&zAozru6TAZ)xzqECbU|*IW6y{d*SwS#Kv_zg{r&l+*mgo4r@1 z4o2Lr(mCZ7eLvY)J11#l8)J{JfY}5?y^Meby(V@uZl>^DTkU4G_~?xz&n+v;lpB8L zy-T${C^FG8ZDG{Wisaehl@|*v#GbBP)@0^%=}pbDJI79h8Sm4SuDv)X;B<0WL+H~Z z|1!gxD!*PkwYDv%FGJ?F%VWd3ua%`1kMpep)^ty-vzof|=DR>8iSX?ITjEwPye9I- zZQpOXeckU@MrLK*y|}HE=d!|@#M0Z3KTKS*{=dfd)oDzZH`s@~`~Bp)vRnAn__=IT z;x}visP4agq(?;}-_T_9!Y3D(q=_*c%X>9vU$b6Y;=1=c_E%o{e)YuNR~h^Dwv}d! z%v}`wYDZk6kGb~^tz!O9A^rXr6jNr-dvK@Wvv@)Qdup(H+;g*g+q-F88uZ~ zwrfsx?Nr?h#~2KgMR(+m10Dt>j5 zop|-E?V+G8qF2s@9w=Y%_(QE}wT#u0*J>-?KKS_fYT=~cGefKQTfN9_pOq9u3i6`DQOuD0#`gMfUBZjpyZjJ3ou<-+sLFSMlt^-uH8=_AT0T>+zoNBHP}* zI&!=3XYj>WiMPJpvWt7YIj!in%L4Y)mDRFurP4KWr+t>0D&xeVucEy};83H(;fD01 z_CFpppD#X;^zhLCju(`!Jz%Ek7J zEk_lShoK!Hy(eJCL!jd9=~`~Z^xH8l`p%Wt#Feu=&HQh zlbE++>({q}EzZ1mg41;#|19{i^Z&o!*2+q=k2&3cq-1?itBvXPRioKQ!ROqjH2nVL zb&QKg`vl8Zmn}C!GS^M)HRNLy?T=q0U3_Bo#PbFzj<1)Q&rf#DK4uf&8}PVX{L@v9 zNZA9wdfKjT$e0=KTlg;Rol(@zrEwa^bGP3$tD3m}a>`rg(!+O>1+E{}uunO}>%RHI zLz}B&>H$&-Z*j_xc%U zo&4pt+`U&G3*DI!C%$jB++8KPi`(9PG^p9Wt5YF9h3oO|LJf)Tz6+^t@pFoO%zdV5|L?e} z>!fUvJH6uar&aFHUsWu>cSs^XZJDC(@Nwj@^0U z3>LA|J^8zWQ?QqRqlqT<0HGh1{L<|LU3KfAhCGUe(@cxq;1~;BZ~K+V(1!ITzgS z9JX6(`_SOk|I-ONPRnCTZ61H_yL-jDxF*{?v;Xts^b&@YgF0c!7Z_Kh$uQooo~wLZ zC;Rn@mt&+dUjVxWN4f$`<1|H zsf_nTuGlA=PLKR~(#C6U-K*gFx46p~-=6;#xw$s^H;ZiT@`3}0-fcW#*k;&krTp32 zEZivJV&58nM%$im+5NSl^RwrwPF%jSM1TL~16QivmtKE%pxokE^tY8y+c#aeGh6@W zT6*=Av~25$_SCPIWqZ_^r}?c*SoSD(vv`ZZp@}M>RRhdN_qa-PKQxry_SL7VfN^6V z^Ca%1ske4TZq%qgli2<%>0rcM@rVUddlzp!_?R=&V}>e+$s#GwV}}G6x43_K@nX^E zc^|%K2^gN*&XnC> zUm2=d1ZG`$zB5z#b#ql}@Raj2a=Xh?FP?bc$DDjIV_TLG9O4vRAR}0&%@!YmSS~a7^z=+$42GX0loB64&elR~#84C8Mv)m0q&b-hbJAS(%XQ zJez-QM#gzxQctYpQ@3IyGS>8#$m!_`?PwX+$!-!I|`wv>=5o3eA^rt7EH z&(yd!@qSpHnd<)8Ema9UhZ@e^Ntm)mdb5?_=e%7ltsHvyNu;=O z@0MNnS6%!sdV5D{Ptj$bFvA~GE2E7qEA}hyc=+PkI`>Bnzr-I4f2|hy8geYs{QS;2 z*^;w=&Mz*Q+dXw+mB_PoR*z&dmvwE(%ltZR-#$~*-zO(7KPwW@-w`*pjMpUJXSNh` zdclTIH=H+@7QAeE{%ckx$Im36$5TI^&N;Csy=!OE+26938*(f( z&8cNM$2D?KSwtnTPx)NK-d*vFRCB-m*m}v2+@x_7acRQEg{&7JeAo23FqrXn7&%g84^i|QB&(Z7O z*L~l;J6!2VhVrcg9SJMGU)$jld-<5e#+wTgA8zkrp4K;O^*3j`c=0!R4Ig zp4WXQ>5B1Jiz_$RNzH7_`4?un^xw6KmlrDRFSRMHS^Kvnw&cK^ES}Oc>P>UEUC?aY zc$}wds?^1dBfG>mR61E-p0BH&d;a^zok6l2D&#NjyvF}OnI}fw=+}ac>o(^0%-QlO zd&|2ipSpW|HTU0cc<%o0BvZljx#jy3K40}QUp~L?*Bj7D*h&@GPd>P?yk2sp*WRmk zTeNc7bYx@Zc3(eQ7jO9aP{<6yoEOKMzb+H5dfm{vaqh?LxjY+o^Aw$#1S6ydN$$ME6v`=?3|^!zeWC@P_Dbaa4!GO<7S)QzY$koQj2^XoI=@AYRSfm7^&ER)BUh{IB2r!polv`fjw%b$j7%kr&b)Hh0hU znTsX2^Io{CnpJsbonKnwGhrhSW3kx!zhA41wQAmG$G?tSzw6bi=d!+gI7=jsY4#W; zupd|Ksq8XSayE9?h$}j&x_RI8p#RqxPjCGx5>mTu-RU#Sw!N#(YPhIooDeF#FE#(^ z7CFbPWfn7xn8RYHuMM8RjeS$lTZtRIP8^Ch^FiGbC;qfsnNyRdJ_{A8Ro1#AvO3aY znU&L9g+omo?5sTurh7MXmv5G>bZMUb*sZ$S#MgEk3-h+wJ!yuS=Gs54@8{2cykl!d zvHQ#d!^?897GlPWLyyl|=)TXlQ}giDz*pD5+}grjy5!*L70$0@+*j;teQIS`>VbtUU_@rW2N+` z(`xtCo|Fr}FgYc2>LQEW!$dcQ{?mzvCvZQHIQFsh_{@FErBhp18ns()U%|hoI3--Z zws^bYxF-rAmdXTWlNUDcNb0rF>j^Nzfk{>IRG!Q9F;vnxAqq&TcIEwldqD~s*6 zmAbNcP2a{@{|W>)?f2=OS@gy^*KJK`=IdV`FOKi_+1)o+sX1?U;?Zq)!}e~jdwg#V z|BK};Ix|EiYeMzQ;*xlh|19D+Hh($iY2amc+3QN{)K_la_c*xy(ssMAa_pL?`K-8$ zH_vpqQhP$fgNbtz7=mu=Pq2N(z4PhbwU4)EGe5ar<(j7HY?QE9;Ffdxwv9#C zZ)MJT936Yf&~G`%m#tO4M?zigb9du-bx`I(+4!smWG zQ`KzCd3hfkE9HL+mZT+Lf5R`Taw+uUPzX79H!Z2oMquP-$=`knw!SMJwU zp|X1}x>mdk_Oo32JFbtBWq#w&)?K%jFi(qkzGd&tp9gJuP8~m=yG-Tx4EJ}J_?K_e zpQX8L>+JybG~sCWeT%=@zun1JFJWq&H~uU)*S>g|Qa``Rzat<}Ev{DPhT z%{AI7&btpg^4{Q5Y$*i|N-KW3kY-)L_}-~(>d_S!+4A09Nq+Y2@)VJ}|pA*;TAGNjjiC#Y{1o<($3TdFK|9w+$1y7k`Xk?#eBFyY+fm>B;iK z`hC;ypFH3iEvT3yTNr4jC&SdCcI?M7HC`iwl8-sxCWrP+Sr)VY?bF)deI5_&rhVUb zJFhzKh_r-dFEjJ{6S{#{}W{;{@0I&3r%RZcDLQ#n;+y z$s9IcQCM^V2^VA#E+ZLS*@P@Tys;* z4L;|7h6KG<_4zfQSpO&c9deZTd4yws{HEhPjT`^Gj{je^Ji4HB*UsV%v+tkTdxGh+ zc<$0*o!SQ8(qmsN6827bwTI2ha^38cTd$UHE1dJGZc*vK?=S9@nmxQ55`6A?Z|3Yn zhHrPhUiUgKvi?KNi;MsG*1eZG9%&vB_G{x_x$rZ<_zUq%hsm%pSgPNz>Y>?mTb#)D`zAfuDTc4d~PRuq`f11vdylK z$E0`vyP0+>aJ!nce(kh&>AHX=^@r#9q%&n|n1d_3D|!Jr}QbmI_P!csYmROyiZ?T5nU?9%ZlFxh&gQb_2`I zC)Jt#zK^9k>>O`zFgwzC_h)ao-mP`F%wiWC$5+)n4f&RJ?By;q@&0LX;qNcp-cwzhoOP-pFFC+>Rp>WZ{5ZAZ`oh@=hbViIe(2Wt(I@=N`>iGPM7niGWs3jP;B{7 zv+1$C6Nl}JjPI7d2ei7i7f&>4nDH=e-lJIKl*T}_WbrApEsodR4sgF>$>zKGa)lm` zUf!z(e?IT#77=UHX}P^3P&pvix!-36ciCnB>m~ao^2J;iC>iT*$ax)lSvO`Eh(TC*?rl-2sxrzT%abhDTI`z~#D^7Nu;V}_!9GtFgP3g0}Yto+UP>G4J0 zGy#UqYb1L!S`-46QB%bX^R@prJf4d>`w9<&<+5Igt*6Sof zz2(hs-w}xVS=u)vsP5-K-xKerTsUsKuJ>`!U6(5tr!21BDe?KHLCjIca>2fbuYCIK z&zNpGymI+Gt7uW#-kISQdUKacHfKK9G@JT7H(>X{Ky4#V@fRGAh5A9JA~@Yxr5U zSfX$Gp6^G5{qL+^-rRFOWB1I|%&Q5LcU==S*SuYse(z6wzn;vY8Q=X_&mXQiz9&IU zWxl*E$J~}m#<`R3-<5HTPuI&ou3YN&TctRl_5Rti#02s8&wmT8`0kX!{wiD6GVJHHqY>T zd|Cf2)6Vq8=eNGjD0L})zfgnw)sxwC^tTurr4|45VOjPnWb>)2d4;XN%&nI@9%ZTc za?|FF+e+X5U8~D>l$Ipf-JX8(qR!jg%96a}it{!pG+zNt#%<}Fta<-vRDAnwDUIfu zb=Gx3->w}znPB`xVD_<93)(NK-!2rfe7NuPt&Zo5{G}2W`~fM_ZrY`E7Y&!J3KN&ogG1ZuLm9#$+GL1-_4$X`GLdVs&_W~lNVfI?Djss`j>6@ zf;Y<&(O$kfZ%MKL zyZ6P_Z_;fy9sGB?)^v`Bf7lZq>$xa`%sJzU&{>ERcKVer=uX zhMt-we3F;fsLw4aJz&-IqT=fF2Gg*zGdCI(d%j7%nsMjU`Zw%9=L)@=yK{QszeaYs z8@GF|NU|TFyZOA`?#YGbhn63)bJ&0B!kW$RcfEbUCVDLISlYwtnTMC1dUf%+%A#a3 zw|l-3}Tgb@3hqZaw0>}z)I+{Lx7_YdFPylt`X*Y%#wx@6@f z!Qu4H?o{`@)VAnn|J&v3cHGVZ-Kl4N_t6H6gq?N|r|w_-YR95;@yBh9w|+V4G~d>B z_OS~_Kkn^n+?jdCYvts&@8+)!{y(2t`l{ULGUMv2(l>6HEN0un7ZLiOJy*Ux^nZMt zWOMk$Waek9n8jZ2y%zUS;`%8Wqm90`xg4KmHawFxHx7=DuSI?a9v#;fg`20)%@1#!|lNaB6vG~l< z*H#H%Sto8g{-ld9!r|`ghNIfamv`|w``doK!Y#8wqJ4SMfvneEI~%Jnv0p1a@JZs0 z)?}-Mvzzq`?rZ)3y5jB1SDQ-@NJY=@2{bK;biclm>Ae%jLj^(5IpQxEm)_8rH0$s2 zl8<>a_z!CMi}7l#(vyoQ&^xu@qSSfck5*-lorm_n3ar@8^0iU0;iyJ88)(odV80IA zYr~w+G8;++5+5Eq6n|Lg{^{>8zl5C6C=WEs-{>rTaoRM`=LWaJl3&j_s@N?#cc#`9 zarY(4f}Gy-6B1jS1-JuynNR80I;mTn>R7cbZ8Fr6~6z-Y2vme ze>0UA$rv`hn6tc*Ve!!m$#Z-Bj4t1~z`A61r$zJ4>lwwjR!_C>-FNjN|Ah6A`|bBl zzBy}Btz=q`WLAdpq=}n?#1?N0pBVh^^b8N#&zq$qbK*94=KsC;?auU8yYC-=@GUkz zF0t}V7K2;QEYAYra|Si`Z@u?B%T3JQeCR@*RrZa(WoO*=qS;yhwQp=aZ@FHByXSJB z<2k{vCp<0Au<<^RnXB8oYw^An?^F4vT`{d~4f$15=95yOy}yP(cW2+9YaXGe)-ylT zYwof8bV7OVncbXSK0)R^pJV#sXFL3SE+^-|TF2tvdZ~}zvnRPuOkZ>1TdnlU)zjv0 zGITQvTeN~+=(sY z@nnCy%5CxwDzwo_L__mu$ zKlr{p*~b4$;`J7-wGa6S=#mh1U4>#ujGZ|yQO zh~98h*l}<3`!D%yMK5Zm@}3oM@>`dDC*akt?vG2;mcEbPJe#$*FqmDw?wa7%^E(R! z*ClQ-R`_32$E9w4U3kjO^uYbjX_C(2wvVKK^PFFOZb|I(KcCOfm(ASLU8OUtc(VJ^ z{>XlVeJ}QG@s%*HWP6s9;wXI_bfWdTKR33=*q?FUtvcUzdw#!pY}?HIDC=Io+p{-Z z{!q;u60-c+y&ILQ*A{Y|SYCW&+1!#$?pv#0t(zwMTPpdxRh8@f!=LsP_Wk^GI{x3M zd2u~9ivPcq|9++QVQ-q?+KkN^r*BLboUrY{yQH@N8(;i5dE>Pw`-5Ev-%NRZuHVYh zYPocb*Ugvw$vKB~U(CF*JiB12x{c1JmzV2mx7{s$b$RFUUm^X@X=j*hRd$@RYm4ih zqcMB+6wMX^K5o$A04;J6A(c82sc)LZLdr~UWZIMjC*5mnJpOLyi>oVB-l+9+U;5j} z7jdn9_B5BRJ71(se7tCOtIPeg4Uttpthx2X!t~xn1ngR|VO}otJ?nhKv;QMCb{Z_n zktmE%`1DsU+*m}+MW^SN%!XxFe3?2rBKJQ{+g{Qan6gjk$@QcA+zd|TN9CCvfBn%` zH}6@^*VXZF>&hFmLjLYKVa2 z_R{#-u9x@HBAn$`MyHhZC{N^za8{09%{cAbqs>z?MJ=Ch?zjCGF}<;^JALWg$cAwB zP~L+QR~pW;nO{C8wc%{Zvt{h5*BZ8Kvg;HmPd0Q{R{wteM8;p~+B?%#C!W7<@;pt! zIO;O*%U2CcgyqX^J?#jm*9v{N$dSAu3*Y$>k z*4gHjOn1~P+-G>`PWrO^4UPwH1SuyhUuKnH7`L!Lu;0oySnt^SP?-%g{u^d(bex2OB0Xw^39QU*!$wy?EH7X1m2#noxpf2 z!QMKdQpM%&634p21B-Iowz%HaDGD~-BXBJJ)wQjC(w^ta(<&vqj{9%ti@2jKx#1t< zlNnYQHwN7miCn5{bFYdcZ-vqKt5wfG-$@SU^Xakgu}*pU_+Q?J#qaft?gaOzzWHV$ zFXOqIS?uw;$Il$y*_C8#uO^lpkP2qMl79bJNcx^K-o&&u`_|Z;xD*iU!`_{1olwbR zv5WWoI_9w1jkBK@1m8+nc`dW?*UD|GuQymFTNDG&af2t9_p~EKOeZI`K(o)uQuB$q}qF8?G2<*S>FJ7CWC_d(E)Z z^zj9sM~mL(-Im-i=Qz)uReTXAR30zMwdR-IkfAKI;a1Pt(-#tVZ@v7YVJoL~uX~lW z$s=Qh^=sZAvnty??`9kGw8r>X;rIO6b((9!m#)peE?sM|tmdh9{L5E!{~f56oqw(L zz$@+#C9>8>7`yF`-kMdWw)=lXhWESmhbJWW&wTj1&m)F)^WD!e?=%Yn%jOq{s_T@r zX2mbqlNR&lvan0-!qmCHOoVHq=dZimc5V4L{U?jp)n7d8%%S)NbS|0Gi^kT_vsFn? z%)InBY;fe1-<0{lX;P1y>1#G_6_Klz+$P3J8D~loUpCFyuOG#+<7E8Yecz1b?k^QQ zGv&0#Ka2VdiK5AqcO@4Z>$~o9=a#&?l-}fyo}8PM=H$EUu1N*IF&XlmG@G={lALu=BLh;Z!OBss(*d% zgtLt5kDl2Fo#)-mc)BY>t~jREeT&4$CxYFl9sb$;x=^hsTzfq1Q~lh3VpD4+-Ii|r zA^W%?RQ&iU&GWWyet&sV4_sI>$7q@&``XKkXB*}GV1Bx6k4wu%enSD>;y;UICkh^m zoAY&z`;&HGGakd)J$s6nCEGW@GPo$Gm^AzQ)?{11t2*6RWNTZ0Hojl9KI6~Vj&9#n zkz4)~D)~)36su1>u>F4L^40CL)+2e# z?$7OhE=9jkfb*+Vs8+j{JV!pjFe8Ru;0%PgSe~%;1E=wt06(0Ay z@9*97H`4F$T&%3maNsS?l3#Z3u7P9T#K^gur{!+D5r5(2>tkCSov!@8kvyp_i7lzW zrg%?6ZHrx-kFGVF_uXA*Gv03A`uAEx%Pu~adDp+)cqWy@C9(M8->r!sdakhk68Lmv zj@6eF#VPH-!uf0;)!s{6QPjk9?U%Xsj?Zt5F5I8-IqLZ7+ysZ|pO-S0rmZWqaSH!% zWBIeJojY+G<_tfn~W99-C=g zTA=jw+*kd#=VOk{D(_g_ar4^6;L@5aGpAI~uXxnCd1Zp%)9Q=drL&g4SBU?zc;E9k z&c7FCi%S-B9av`ATyEXhZ^?9S%{80%GkP8cJAaEjCNy_}2777!aoO^cWG=@EY>^iG z0?Ot(S@QLNTYC2A?#E{ZqzxYPe7$ii^Md$~KNCvz3f>!*NxfCFnl+Pm&Q31b*5vcN zbLO^xw)k5Z{nq{e!uPLRTxA2}dpvJku8@0Xd(T{L$1#W3uVlDhSbe_M%J#Q1#pe9^ zIZihxbZ>0*ytQbh_qEDv%lnFK!snk`&fD;DA=^?V=P9x~zeU_n)!5#XSQD47_}j9y zzqjn(jn{SEj9VXBZCU^4im+M0tB;NBauxRq56eWK{hY`yzsqfj?v54g*IrqL&%P;i zGh)lLCv{T}e!Nz=@S6I0<0loNuO}Pw?XHQQe`Dtb=5{MvDS<>aciB&7Q+dr>1o)UB zm354cWZ>QB4NsL)Bz1ZsMXtH>Y?$G+GVWQ!Qo~Nym71@A&P&xS&vtq0cp%3^%F2{$ zqd}73BIarC4T0s|W^60V#T;{XHMz&`P`H?2sG{V;t|J!l;CW`X*rOb~-ol)PXAPEU z=-YI6zt5H5nABAuyW!bErU~C1ubJKotP`uMVV}KYi@Wyrym=C9(`Azsp8icXGwlt# z_QLEMqxa24^OIc`-EFfFRj5Cabob0Mo;<5C6OJ#r|N2S~7;(+EGx#ET`^A!14W=P} zy=F_#8?O7QW23G4I9hTk|J7tsQ>TFQd&HGb86B28?><{WKFxdao0|2E8El@ArG>KCHOhCB5X2 z&wqnc{OY21&4&K&7Zx5D$aAinUK`i0bez36F1g=3mi3h9&XuRLM84e!`7*;7v>{PU zqy7AvW(Gc|p8T979$UYwkLyYg6v-^*R}PPHmgzaRU|)in&?!Gj4gJTbl$@)NDx044 zXx*of_Bui5U2}TrnU#T`EY>;hjy!P3*EVo}TGQnnc3bNDmi*baV)mC@uinBn2RPOp z{^`h3bVJ1SGvlVzyUL$Wh$eTqi|J2d{;jqtuAigGFKykOWiq+VRVH)XxAhht_~aod zd!J#aYyQIhi`#WBTi`3`Q01m*qw+myux_8x9;^hpCdVYzOMCOS^aO_ zzm&h1mz{Vh@LW4#Pr|vITh`rY|JpX^wZ_wr*R2w+>P&jo^||j@%eNJV&yrSTTfWl$ z^*?Eiz3hey)zd5!F7A(fzs=9OrmrkhRx~5|nR;ow-FesF#(ahM7xG20an0CyIwvML zJ+$d@$}*|r3b8n9wfL%=Iwks?Opli z+D8qk0V~b?o+sRzT6j{qY^(N+i!trrQ#0mgU*EY-ylqW!V$WQ+z0H+V(-+@i`~AWA zT=DSy^%ULcPXzzKFEqE1FY&eUi9k$QO||BTsh2uT7sD%T%8Q<~CU+ z7|MMz|FU8uUj&=fC)-m@_YZ!q_~f|S+$!Ag+XuQV58Nt z1+2;k?Ee2eU+(q(sCfLI=NXAxHU*y2k?Xyc@cH`rO&(4&)n;+1*3A2OW6Ksd6UmLI z1brm9^me^iv{yOpm6L<=*XjGdEPWUHwC;r4XT8VEc4fAka(&z*_r-RH*K8=b?D zY?DyVtC@qL$?dy3Cxu1Yl5yA7uB3po&M#NO?O~GU9X?& zS~KoCqr^ZqUV*%OvvR$cZ+&$j=~?T>nUMuji|_fK?BmIpbCpvlBYDT`b-U-4=d>JO zeBpTXPQ%1%nS81oUlQ2)k4?Dt?p(Y?09bUWh6_t5(tkGizKJ-Lv) zX2%5Hcd7D=a?&;}$hl%zzgTu+{x9{?^ILnu>I{!4_OJajYwh||>-)6U{@K;J`j4Km zM^(<;oUA7_`tB^``*uR~$q8SBf# zE;*xnrLu9#wVxM#X8!4^i|${+KF{&_E3VI`$tlty2Q50{a;|m%ZMivF^7TsPO>-{% zpHcr~?tew@6I^ds#;ojrrO1Q~4@>VpPzV|Jkn6?kYs;5=WK?gnTl;;RUFP+u`BxTJ3wOWT%zAfu+M6ZvGFwa|I23(+ zWi~i*BrV^PHVG@&zt){q7-i;b7{`L&sRVzIxBjG+6EKzv0G{sAmnS z-$cd2rt}}(as1B)h06`A*96$jm8)PA%h2hYpxdjf)1o2I?Q3RLZYwm+%t+S$Q+icN zzxJZN=j{LgiDO@5#&v7k0=bp`W)UVfp^NiN%eJg*{k2%Ww^whe?hXTukALN!E|J+$ zur)sXIrG2sn+xvSE$1@Vy=A0Wuagn!@cM_*dB*Ou+`KAj94n4FEs)dbo}IObM{&8$ z>|>o;%csaIx4W5LNa!r=*_Oh5T!&HWu+5}3wPwGS+%)zHTRz|HHo3Y+^>1@{Z?~Or zvPNl>&()r^zW%&>`9iOb8p@T#8Fcps+&_KFX=mm9HtyST%UfnC&E2=F2r(8eN`sIIWz;vnE6<=SRN!{|PJMk7r za6sK%mUW*_|86_+-bg)gbFW7IIe&?(GX6VC+P2)Ao_b2A>2Xf{7o+?6OWuSeOo>f7 zQT#3?Zi$aog5mxb67Ii?u6}fxd9CsMn(!QhhQPIX28mzpw|rK9YVf$9kEiG5*BSc% z&TZb2c_jUe&5JPBqQm)^~sHxkYgYi(g-1I$`?7Qq*Gp%QXkIi~J*Je4p`L zyl9W^QjIDyX1D_NsWXIh*vX+5_zL zer25HbBtfYle4OEm-zdY?l#K#wR}hNtimhu=G4WobKGAU{HE@3x=Z-Nw=>O4oY?Bp z`Bqu&U`$Q0RdCLmvTFZ_xRk_+GCS(FzuO`H-F@4{)LW(ZEM6ME?h%}lJi9M^(YsXJ zUF(+qo1lGN%ceQfU+m&HQ)Whry7Rv){A6uox-HJ%&c9+R zyS_B*!;6xyG7kS|P3No+oe=yb`PI<|*JDnIwYOw6w37|r zKmBf%ms_;&!EZ@%4eQb#ztm~fr$YQs8Qji)-H^&=o-1kPe!ZIEt9`zW>%W)puRiqo z&Cxgi#l1VTH(8ZO>&bRyy1(k*Im2wppWFoXO{Py)M7St^^#@g8=s#1xW(}v+e@qT7dQDfbJ$bM>;s=C z)J_+0vUqcZQM*Mz?19_-i9+*#o=M*oE@a6WXE?Hq-Bp@+c<8bQq*lT-*azh{9vtegbR_2%*Jol!? zYRL^IS~G3iiawa{n|)UQ*5nh0_w3JG9R6=86qx^|zbfC(Ird7A;x*&k>|@rir6iSK z2`p~B$zKtHO10A8b<++M?a4fD@T9}gy?wuL-hqI8iFl3XnPM-SxA5|@ zeNjH9a4NWe`Ii@puNW#z&nXMdJ!^CP`sQ<1+4{Thip-eW%aPdsxxjgeY2GD2H)g4g z9f`Nkh$W}G{Ve^wY3lu1t%4KcUmbt(TWkLbo#M@(cIOD+K2dy3>521mz5e@OJ=FFe zf4}7a`q^upkDo7Np8b21;%=Sa7b8|A&y9L^((Y@ouvO_BL-uX%cSWvdZqMtQxwXM; z$=Q-MPxhYKnWhnYw6a_yjYp-sXLe=Z`agbc&bI^M=vm#AOrLXc@Ama)r^L^@`Qoo`B4zFwuYgctAN7$Y^)GPFA!p`%_(i04yB`m(VlG*Hh#rbx-FAMit zS)94C{AKcn^_bk~g{q#|F30vX3w8xXnmb`g!Hf_zr z{M$vxj5rRSjW6|>oAX9~4gVRZjU3PBzj_dOUGPqOx~cGkWefQ)%wLgyYDsU?{*QOq zq~Zz=vY!7f^S9k>k!@w2S@O>_U$4jS7w1S%o4s%-fnn(cIWKpS7&xsEv~;Xza+yb;538vFTwX)=liylQ#4hp7 zlieHtTgtuKa7e=8{$d`hFw49}{aMo&-Q!_Vy8UEb?xxo@XKwjD7nD8sV|Q8f+)p|7 z%>p*h_-Cf}ILR;by?C&cCF#u0pU-CR-q-u@P&u!qTW)B~=Gfx1rm;6qY+J?0QhLWY zS@CbfKR3yV!M7@=9++{>Z?Wx~t(PSN0^gc!=$hO1T`~EDcI2m*`%Pzye1Ep@9RIrO zG0}@B2fMvHy!7#^O&dJVaJX7d4O#Z?)~}L(o9!geZ(!%& zDlB>6;Ejfu)xSUZSn64}2#5)T=GP+{*d!NE1l{LVx?W1PM69uDO0aLacA7xK#RQYX zN+u6B&N$+5*s0;SRO?ag?_Yk1i|=*ge)-^Nno{?w=0^>wZfu#aZ!b2PCfR8+W#`N1 zPVq4^8y6Tz-!$rRdUW-%s-el|2NwmJ3=f}Cti2de$Nzu%+k!cgMN1B@OR$_+{A#jq zq1eJxYmd8JWPhb}&o1%ytA?eMg{4aa%%6!}oiDgLc~OrITk}!VT3_bXv#sy#USFS` zV>BuM;-OotMr}p`ZfE?Gc72zMd>YvOXd>eY>7qj)ZQM3DNAB$Kc^`*_+{9BJ-E-?M`v3_5(>mMV_rM5Z3`);2p{W`Bs|BUgR$m?mXx82$VpEJF4kFEF; zqRs6*$MmdE+Wd^;2K^~3C6mosBNf(UEB|G%T*J5TD&uLpXBMj;a?V`z{!@)rl%J>V zw5gT7`uLE~| z%~<05*lo)}TdOPEYhBX+r@DVM5WjN%TGh3S*(>fQ#@489F3@6L$DH%}8l(5~f(5mA z3YOK{ip{pV)xtcDPojtW%wd_cNA9d%%$zMyaQB+}@tXENlNWxc4Sw@~eNx!{=gqF@ zzxQ)|t{Sd?^y8G9O{qt8{;7S3KP&djwJ&vcTV4LLCs1~dwpB(Y%T2vRdB=Ma&KKOz z?qI&*wxIODrLb4`&%8P!HF4vqoyRQ2m)G2y^E*e$IPd6t^MJms7Ux4YzwG#?BHJyg ze)h^XuC;UBsv~xv3q7|y;`y$1&-bz98y$P>^GL?Aes$#QIrGol2s@ppR(5Z(PL9x1 zwvr{6>N@8{#_O*AcXg35w-H0P(Q51T0{dI@b{$#vJg~(|;Oh5q=~UaV3zMX+&l&yW zJz2LrR(7{SZTo{MuM9%ovYo#6EGf3O2h-CrGSP(RN5D`~durLAT6 zzbh*D{Ji4HJ4Yf)?!jgUg+n1EqDYTk-@CmVZ$C~sqmaVJd|}4Q#*>dz^!9$a^zQ2d*Y8;@ zudRhnCtq0cI(4Fio|(b2gqQ;j@wfX~mrKu1?p>hc(qWdqFfFTYZjK4t7u_BWWAX3D zI+`9HdR+fa+AS)XWr198%AtT$pEo?XtdShgsHD?sWpukuTJJN@teSfr(R#mlYZHCg z6#LgMI;W}4o&PR-OYQx=jFnGjcFZYht~{}~Bjoc6`(T&X9Zx^n*vUUNEav-qEX{oV z73K41_ujmt5Zokv>hmdWH`D4rYUi_3tnOd5io5A&v-p@DZ=KEY087$(=E22x@8oFb7!7a23VvOnOMKhJM#ExsOj9gmAsT_Lq!QywB?mc_YNV!>oc;oj;f9|(^7PXjX)hw!B*AL%>e+Xy(VPyWU^l_id}+HygGdUaeDCrcd77NJ%$3E-HKlJ`CM&*e*dw1(;r2^-)2Um+vQm4St%`Up(uyb69j_>S z*eYIj|LC##Grwfr&rZE&Ii*R_g6@#G#Z|M)AiXb`QYP~5%oI~?MiBw+O_e0URS<%wRG{$ z^)t(^Bwl%_!Mtg`Gt0RrclytNwN%JseinYMddg<2f)_Szb9f_}4cLOtTSbM$9zEl8 zyNJ(3n?2Wg?=Ciz&kt;7ywA|?S4@(5{@1zBI$C`0C0++7^@V$0SiM?(;ngFy?H~7S z5uPud9slt}L5boqp<@c0HFnmm|2%zx`ilRbPg!JbTjRU%-qF1p#(#UcVFM1(B#_;$AZ6)ieIfrIA-t21le7o&q zUtQI&dn|T$z87>md&-k=C}Coy7PXQ&Ce}NUz4@`;yRaD<$MeM z$|sduCtm59Gv(k`(_Or!3z)B%UEFt|qKju@Y~Lnj=X06e*O=EGmIyy%#(ryBTf>?Q z{2At_obAi|*1j$;%~^Teb(MbL_FIxOHy^j^%3ALtH}n10m9r+E{;kKg$K71F9#1bvr2w{wA<$0$?C0vep-j!yb{*jDPg%_X2^VP&)EdAhdLtdd0J8% zvs5;0m=Jr_B5fPTt)};>AD69papO`uTb6PB#)R7?OYSZ!Fg%uYe(}7DvM1L$zE$0s z!|fpUtKs76ybU+*)s|lWX4%ABT?P6 zPloI1vq$sp%&t1-uq1KI`4{Jni~L{pR=+y3C3i~iw%)0a6=zq;y*?Z&e~EB^J-P z_-XB*QvyGi<|ID}UoQQHF=fKYoC5~bIR0@({>(S)8fum`q^xC z=eh7be38s6k}cvvYnGA&k4@H0v@=s^`PqLxto~JV<-MG1CwS+7-to%!aa0I57AL;DL&TJcVceo|Vth#yO*;n~@?Qa&n{@4}6zcqMm*ZDP@ zXY@Tyi`u&9?T(d;rHUMD7ruV6XY`q;9SbK5rd{oYbGtFmZc-`r!$pEf+s z8H#MUE738Zj}9dqutHd_Qn6!)SvUSrE_21NJ!u{Ix*wq zo}_D6_XRV)dah}o?eom@n2@aPb;-|HYqM&N-oI>6?S3_R-zL9WCHK(qE1X;A-4bx( zSU6w&Z~Rf6X$J+|iY^#&$*S~tIe4x+UYPj7nDvd-L}9%HH#LeAJD9S(YIuya7NzYE z(tLVv&$?X|28a5pi{#^a8_c*4PIwg zlJGX$P4WB5hVILt`wH%EbaV<4{M&R?^L}=Gvd+VMdxF%&FI;11zU!a zW>(f8dh~Aet}zSlKOVE==jrrUf=yC2Z=QGG>PrvNvz^5zX|TB=a{YwhS2xdYm~}8` zYURaEzq0<$(%LI`c-2JT=lYj#=S!Q5XIa%0Y)&~*7?<>IhS}~}Ge1=9Gn{Qux@Mv8 z+h{AzuL~z$K0j0T)QXJTGv8;Wo=8rZ5~{b~`{t5-pN$hsp3f~WTW?{XE%Uhg{_lI= z-&wMLOI`TJx~q4w>Wl9^h9~5{9**#ITVVM1`lTPZGYc}yeWB7PfLB;gyxpa-Cv?|MRWbBrN!E_%jFE;?Ahpb>~v{ho^1PE?p1Mz z&QG~(=vdqM@w#DU+%|Xfkkx)Xa=)#QJv{TV@zWK<3!APyw)hp`*M92#p2xdhZE553MkdacN9> z;Pt-9S9LFh;L4ac|Ym-<+jZB)}6v|_Xe}q-_82mit{p>W5TYM z7d~p&N>5uUar^q5rc%&aMT1*N%SO|BaPpp~{FZH&v9CNTmpOA=YjJB)_RO=N zUf$}pbJ>~wEMdc2@t4QW1;>=iEUPVWx}ce;v1OrOZO!(B{->Xrryel+vAat0d`g+z zlN0Y<&*?7y6qBnQb1weXgG=X%)7D*g%#u9!c>BGo*Kuqy3-0}p^N-Iko|gH4<=3ol zp?z_Gt}M5^x_A0>g~Q_FkDp5HURKt6&F`^H;9HY~W!p=y?YzbF`p$v#ub#eovTh~s zf=}gdO{PVvFWdKE!pcDN%XJ-pKG?jt(-Z%q>8j)_(2cmaoUI#c&lMJn-kw!^@!vbc z!{7Y%bIVU{acu0Hp0+1CJ$B8WqDb+p+g{y@y{-9n`Q}xUcXh7M*t)7H`nT$e>w34C zSH3v0VxP~f^Q@Hxvm-> zwOj7!x%i1lTfOwT6MmC?IfZlcUG z$Hm)r%x>j{BP`Lj3otF?S6XdbBgK06 z$;z*DdN&{LjZDeg|M%NF(aHlqNpsukd|bYMkFnD1 z(gTl8jxYJOUSqkHefZC<@7?OQwnsy_WAgB zM;_r>bm7E{8AjXW)g#hn_E=&jph)Mr$FvHi;RRWk1vB6G-2^-sIzmpDB)&zb(`&x^(VW%cIK;%{@) z_W3S!Ha6qS?Y0t`rMdE!q`BwT;$7`Qr!TELU!M8TeDmVS&1cKP{^#G^E~=CCe}PO& z!Tpfhr2NNnEK))*8kAKg*xvNXRBRCt6ZQ_{P+a2?J0ZVV@WmsInUlVW>*XEJx^cg+ zC9xp-*gVbDl&h}Wy1(V>Ez@27{fv{{7KzZ;8#NvYDqrQe7Stc{Y+(a|H{|4Z_W9>?q->sBmTPD{`&6MO)d}C`(6FLedXbh=Q9MB9r&0K z9hqL5bVGl|Y?&upPhEMvDc2%+#>%q~6#A{ys;?W(*6$OyaDC9?x=eM`mk@V{&D?8~ zrJIxu-DNay-xsmizi@WK{tuQmi%PFPo)NBjSntfntJ8MNm-@Xf3O}`P?XN4D=au`; z-fGXyJGG`f5yF zyqDLOm)|YDesAM6tFVppQfpsdOx`24;>fHSTXo&}C&g;dEbf;{nSaRh8R$shzV(MQ zkLny(d}HNr^U>wGz^c!pGjDI$TqwnT^XjCJmMsF)z=P5piY)?%&LurblV0!}y7*5tnytUhEF_FU8WL&MEYb-ymp zFMAyucU1X8#QjHq9{;kCk<76+o|swQ@mBE-`-aVeUtSb$eOuVA*dj1(vZOu4pbej6 zs^4y%yYT0a$NldY)#dN~dd>E*K>hKXTn1%HC)Q0rere*zS5t!hUMe-+|8dOx7=siv za1vj?i1@1i|LOiWarwL7Zaeq$)#~`aS>LUXb6pFUT~*S>AhY(wx+79EdoJo%-#oob z$Fy*g#ij==?%T9)wR|&bj=ZJ%hJC}##B}SgSAwmhrOS*{rhimz5jbS9=`kqiTLheL zR2n2Cu^c+EhEaI2DPP!wk4>K+{FPW?+O|z{E7TE+Ex8MvMcu0yC1+`;6|9>%C;H3; z*A0T_1Z&tMryrW=TFv^cUErH^pQc4zV!rX=I1a^@hkIW9&kOnUSEt3G%SF3I;LyM4 z?DjtnzL}Xm@8<8nFBbQ|>j||;Q_=S0*v&0iA<<}2#Mr*(`Mm19Z=dJ?ule?7^Z7Er z2p8UPW)rqtp7~#L<91H6vW0}Dz@c>xZt2%{uE{?+>&utR{^hTu;|dQw%3qTj|MOIM z+3UND`>e9wcUWKF$)?#VaA=jplNaZ$;*WB^{t#%a*Cudm;@zVlugiED_(^7RxN#ke z5IvNa?4sY6F0;Xa<6*bS` zBu4F)tDar$a3QcbjEIQEPWCL7bp7J)GE*;m+fZBQyazy4uW~bGEHm~3O{d@6w+wIl1 zACCy9e?E2Q>j~xlGq;TXFRuU6pSJ(cY5kZ*|3Q~t?|OYwef}Fg%f~&&X~*TNbG}R3 z-Tnl+2Xo%vzxV(D99` zLS%y{m;KL^{=0f*DvxT%UCb@}_qhH~|Lz>gc3!iz`ah55%fB9eCN_J={%_g)uU$PZ zaa_~xH>ezbpR{?#8-;7t9EvT??0nnp|GxC!z4OWYfA8K~wW~kle$|L1uI@_J35jO@Qnt-LoU^RLnNYv*S^%nJPZ>(q&IUF~#^-A$j)R|G$` zw@QPCAgBs51(zoe100{&_(dE_Gn{?IB2hMsU1w9)hf{0@UmvzzlVH~|FWz}0;@Q;w zsl_@i0(^QspU)`v{EpGD``EpEr*rx}-^GhVZKvhT48Anw`?oqd_lW=dUKFpM66yZ( zm*w-Dsq=GBXM9^H@QwMDwo%Medm|a7VCsbi(+hvt^4;M2t-P_g~ld*OguJR6iT{ZPWC#d`9|J7rS?b z8)g17esifXV@mgGUFCCymfLh;RRJiNmZ^dUvjzBgEfQ@%pE2Gn|K|aFb-i*iyPx}Q zi&Yuo2N}D0OE$&-{m^dzMrQdjt9Zt~u$1$U7U>nHJzgcfPq9USPfUjWn2b}}$>;N` z*Ue@w*thohUD*Hn?uf1|$Zq_lFacAQ(aW@_!t zH*&KZzCE5NbN)ocfsIkWm&zOUF?>31ya#lBZ{2$LfLy6pJ>8qGtjT!z|D;iAbB<-4 z!s#o5pQbLh-rip1_02BsrSfc<@P>`88_!fW{Wf%W=xe=g)8qNYw*S=9bH-+C`D;0L zF7vy1-OP5{Rl6g#ai1nlKl6?IT=xmZO~++wCmgH0)smj#Q>uIT&$ez0`OR@poa!=# zk0aOo#{{~AI37AYUZ&MnQWsa6Jo)_%vAnPs9jzbdpKUzMcHU?2X34Gc=1cBgSSWja z>i!S>J1*|xE$O*vm~4M>+Fy^HnpZcRX1}~4^pElO@olGm6r>cax%RSBx^JIVuLkoL zTl?c5^Q>1$uZmxCZ~4Kh(0PfIOHcpJlE0;I@$ADY%}xW|nEd9ce*Moky!jP} z-+VkSKfm_(?fdiozHqmHrDvRQQak?VDZSH2T*YHes*h^N8CpM^k^F6wAH)4l#(&qM z^WSdL|NDU5{)JhY$%)yFuffgZtNMFB96Gl%ZR+FeI=4Z$^S=A_kiY&$?4MqvhS`QO zcbM7RF8kZ>)jqy*`Mh15FFr~Bd2Rc?t9$R&{eF9Q^X0Mt+50y{mY>bgf7LX9CG)Mu zvfQ7b67pTukB9B)pz~($rG3BbZ~u4C_q#=>b?=tT*M7OU_iH6+)%eW*2~+p+s+e8O z@P6m0*8Kb3?)8(W&;R#j`Q87y-nS-vQ+8(l1Uh-F@Y}8H`?gJvPsup(O!537<3jzo z`(Kusm!7Zx_w#xA*G~tS`AbrNe767pc^!}a@0;g$oe%Uc_m;B0KsAgSeN@v!9`w5t61Wb*Fs^}jC9fA?zgwr z<7*1lt!LZ(I_Vpe(rje&<3V$5?Zv)RHWBh$IOmk#tBn0SxAxo3yZ_rP=3Xe5h_9@D z)TzF!?nLP&PxaDGC+^R${dRNR+6@0!2YLMO&Hil=cKQ00Xyb0*lfnMBS5NXi{sF4g z@AjL4>t67Ee4*eaLSN4m2ki%yq`UUle`uDU^IP(mVM^!u8||9&rS~l|J`w0Hd-dw; zjmPC~pXB>{yezuq>z|YUb(>~uKmBxC|NXqVmDwwb1?T_&G=2Y_t@2-&%Y5F`6Z!ew zS&IXzU(!>W-!IfRbW;@X5&ouY_xs=X{q^5AP2Za%6q(TT1GKePeR+-k)3i5>{!R@} znaM4=(6@%|S@@G6OWW6LHt%|$Fh_E>YUlIC`k(%Q1{lou*FToNf1`NMhIb`QkM6Cn z`?`AfYf#tinc0&>xt_~gM3XJPZ=4?w>hJLczFU~OjPKtU|NmPipOpXq<9KzkSn_Mo z^8Ix^f6iI_zj?l{?0jd-@1W&h7YQE;E0=aJRp8wK?Gbf$y@J&!%21OpKHKDO3A0 zS^oEpd-o@_YOmk3X|iTYYIRZ_4?f>kj>K zi%&XJ@n+-kU1pV^PO5)TaXi!IHvf5$yUoWV!s2~}vm1W47oIUPw!186<@~??&E4yh zRi9VN|2vi>TsBe6QlCRfUFeKRX48U9u4O*EUA(ucOwSA0ccE3k_O1Ov^L-mnl}&xB zb$VK;iSP7`O&Sx;nvbvui3kZ!=Wsa}@g_;Qtp1N#{rMH!3(uXg+*_P>Zsy;bRlBMV zamwDSyFagT-se4~XP5V;dq$r$dlsi(Tl~%Ws0{-H1H-Y24XiqISY(9^&f1?AmUyA2 zqq<<`{m=&U{i`)kdo``#6id1Lzoa-c>*VLpR+YVZOkt`lss`aFwVg|s?|G3|d@noX z=-NMUvR#j8k0=*-DNsdBzmi#%0dhnmi-t6rh$ zUgYB*`r>4^PY|Q-`q`@Qr~ZA(c750H3E#a6)Sny1haX56y4m-pzA4`_Y^T_(;9rrO z*57Q~vNXq;HF|gBvla8Ne|-Hu{+_ZM>kOeQr{DiRfAV)~^{ZQ+3A(>`U)s3ZWv5l# z-GewFulKTlt>lMfUvNo8E8jy}B+f z_Up=XwZ1DuZ^sP%UaP8LrJ2&sL$ zMyvbjjdbhcwJFiU7yN#|*uFmV>DO1LoB1cJO?a|*bI6055c%-VX4AV_vFVrP7IUdh zpB0oDb@N=++E?DcbL*CVU&pdXN`Lj=Cs8Xm?ml+tY7Y0^GO3r_U)}kBJ9F#g6}e}( z#=SK;zuIM^V%Ggt=g)7w>3g8-)#ajnm)AeNw`}$wOTVw-SJkvD*Dmv&TQ<8`XVdws z=dW%1a(t!CcB`0GH z+AniGlTPjWb$yrEuHTbB*DGEBx@1>!-d*KqwYzV}9oPKMeY1bd{4bHAva9E_+?e}l z*M9%WU!)(0?0&m1E%yBBm;ZDp?^|(O%*&TGzP3(o_V4zsYYbw3)jIv%dp(>p;^*x3 z?@E{LOlN0cV0iFEg^@c#W9p3{QC=aQRb6Z=d!~8`MD99xhwD_zN&8!?gM6D9%kNdD z|MvX&C)u|DH>g--YYYCkxarW{EUTaDwNHefSJteWq2lrB{J)#_+05LNYr6JLVhEb6 z>dpEk-0RCpv!}M7Isfem-?v^XCQ^S;sUzx)4p|J|jSytz&1Yg}pX-=FjUSN@g@y}NMI{7dMuI!Jf%>^sx4x*k8NNR|J5N5A%^_gl-;TLn+69)Eh{neC-z|9`Fj zzbp6jOXW-ZeJ6dGy6w*1vdd~kdzN!brQgfOCt<6*T?J|k&*QI;A-kRJGKU8{e|9!vJzkF2LLV_~3UJfZf`MJ1viPG66Z%wWz zpR3j4OS>PGyY$=E^?lCsCMVDM{^#cTx@&#;kwJ~BqGx^u?bUc|`FmFNe6IzkYMpMK zdT#&!XW8uVTle;a&-;CVnO{ftaE$W)kJ9@ue*1a1dbX7GuFD#Ilm1Fvjl0zM>DFei zeLYgrMSqvR4Lua9n)ZGB&TXbsrxu;NtiLQNYE?<^s$Z9VdpSDeib(Ll-2v`UCoyLE00Wn`|h20o!x1cHF>UwJW|gV-oEF%;?&;6CA?`dXYOQL78>nF_!ihLt||HrXQ zwhwmfPkpsd>w3~T*JID-EZ)+tvNgTOJ9JH?A7_-P)#{??T8_k+_z?LHPwP_~egDr$ zo^&d6<(;Yf3hylsV_{%mNO=3RUvNW#*3MO0Ss|f|S@eV%JQNl+y}jGglsC0^)vbWb zN>AlqaI%CLd9Zf;KDhFidMy(Nr_hs)m47o=mp|E9`QD~JWN-d;a73@0GoQCyhk!tp9BLGW&b)?=97T_uTSU4bxe^+gG&ZyycuNQJ(vG z!+-nlUf;#ESnJQ1?`!X6?|f|ZuHwq?@7qhSZ1WA$T=09&FS{b!@Y3l)okDl7uW^X? zZ8m-XTA2w+%JNcbCTyC z_qsP*MRWQ7wV|y!F|JFu?9baD@jHfd_2h4@p$9kq{;|hTC~wo3->t%u&TTRE&R4e1 zdwhTWvCHAtJ?1XnGSO3O-_$zSE0t>|7-vbV-#qv4YfP@m_2R9wv*b(9$F7fkA9>s` zcW3n0vLI967hcIR-{lOiyPT_4{k=A9zs1^J<}sPKv!i!?H!*#ieph+gsu@@9uYLV~ zaLe)SA-~^;^GTbZD}CSmI)ByFZ|m=?70FL%*|>_sI{WH+zMbjki?d?prPzQ{0;JH+ z_-RsXcQhunF=*`r^ZL)`x4jfs{tCFf;K}84oMKD8uFbQpp0-Tn7ichQn`q1@&mXh6 zl<)taT>r`c)&k#EekIKO<@amLcl#|}Giu_ttvaY?Md+apDESbRDVzXd%Et~$Ddm&nVRqaJXe0}`q|`7YgbO1+%>`f+5Zpi_A#r9Ci!oEKI2}^=d)+?|6a@A zdT^CYzmDbd@;im@(W+~jR4u=S9@Hqh6SP+IxZU}eueU8;H|O(~#UW)Hmg3iAihX}u z{S2x9raJ${`UlnLQdbqFoK%1H`43A`&`Is9-k_5c%4UYln`}0tw9j3uG{yS!$v<0e z=Tt9wH44g-uwNfy-b@zVtzbexBs#3`x(QvsbZ@hg=+CW z{qc0xDYK1B>>%r1jetpjCmIh9h_WH`bb6Sw-@}|tp^2+mX z>X(_FDLnge&C2FaH#|xg{g`b3b8=bi!3$eI?0sLmeyv{7|G(em&0_=BHRn{XE!Hd6 zS@p~BR@4%G9|yxw*-tw{WW1|?o=LYe{%H2ZMx|ob;~B*h9#82CsC*w{;kmS9mYL~W zi3S2*E5%CT`elQcPXvNF3537)BBs(K>f?NrL$6lcE;`Q zG?-d2;Z$jD<@^vu&)Z(NPna#)?=8KGt4RLm3HMvs8pqd65;L0iq%!k#q}ETZtDTqr z|Np!H|M%I_c{>)a&Dj)nJoDP6dzX%F%D?&li}uZLTeiNb_uV-)TQB~+(#jo^{$4VF zawpu{_v;Fsn|)ujOY4Gt_1Uy{z|zh|YcEd@EWj zviH^I)k;BHmSOj&Uf=WY*X!F{QIgibi*nO>Rz7L@a?{dGHP^;FPWkQD^{ZYzG2A@q zRJiH7r?>p=XBb*u_dC{-<6IXe>S5fMesZUu{M6UB-sha(@vhtZ?N;Y<>ANQ`sRi3^ z)Vld}M%@Eu`3S3ZQ%j=1Z{KNux^PWa!ODcGzh8vR2Mq{Mdw2QR$?B#2KGyHlzK86e zU1#z*+LwEtq3ZR5bu+*0ulyfl{{N@_|K|riJ)NKa+xG6R_pRD@AG78rPt85Q@9C_w z+m`)5Y4z6d_dKsa(`(mj^PWUJk2+K9^>5wDpzC$FvVTo~6(1gST6!IqTkc{r{izr`N^3HT&LmJ+}PrrTctSduAO^zvCf4{q4G!#h33tm3viQ_q_a; z*X+qM$)GNYpWMG_P>BL!GZ;+Zia6l3`W5TSq=~1(|GpAXozHT95|_-+DW5?@C*Lk# zH{}hqtCao!DgNK-ZHHV#gaoq0Oy3d~PYF=4Soe{*UFh8Pym4e}_E_b_!bB`}y zbS&84c58^Hf~ZS*G==Ea(w%~uWP>v-~73x%5LG``hVyDXV%Yq#dGu9 zo9BDHOPl^(Df)Q+|4;k;{%Wn@lBYLZw5*rza_qZ)+28)|pY8v@-JiDV^pl!px4i65 z&O0S-c|9^HQvGV^DyD1w^?x2ejDubY=`GIej!+vU1TZn^oso~b3v zZ}Y+7_B6N9176ZztnDHDyk@V|)Cu0HI5jgUQ7Qhqh`s7mEv5I8D~$x}{~WKsv+nw$ zLvE{Lp6prv%js62=lv})OK0zDTet7mtFpO&y-WK-=6h{zj}Z@T)d*EoTX|&K<2kD9 zr+%K&rIvZW_Ug3Nv;6u>zb00`4-q+C`0q`+{qC%(b5~`>YGtOxzmhsVX_fuTqQK)x zlU8}JTrw$p=_=``w@#Q|U;ijLxcG1T{}1xhma(tZQs4Qn{`dC!-Fw-NzfF%bzdhS* zR`Dd&P;;YmORM6w<}cNX=_`*bzo(raBJG*FHN^SUSBurJDj#2|bvicn>8;GrZ>#N= z-^$dgSQ>v)VxHO7AnU)ErtiD5E_kO}uJ-kiW6$oyheW?PZ887b#6r9E^S@2wvdZ+1 zyrlo^mjBl^TVB5Va%$rI)SpMx?JnLspAzF~?SFLPswtQEZeLkFHKeF#);06~lVAVu z-v4`d^7?L>#qT60)tTRaZnIq8FFyG3@v0uhz|g9qm|#`S-}67;3xBTkou|_89q(oN z(9$C@^($|DVXyzd{?;zFCN}fd#a^Aik+&W_ogRNL%+WhqBJ`xraa-?ODZl>i|2cbq z=J7SFSZ2TSd}+U$DK>uH+&jwuKy_!|Y`ra7Cd;_)YDgY_wC#3Y_U+_V)2~+S3=8_G z_1NXtt9K^lH=n)9KK3H;lAH4Nig)S7XM##K|N8sBpI$ce_wy~cbt?VVZU3Y9*ZFSq zlY2(ji*J>#dpY&V&cB-Tm9K97_13oje~QkjO3*mQ^ncS%)@GdZUpFyObj_>utKVxL zOW)5}y?E*TQ-!C@p6^-y|E$^a+Bq+NOnW>rd1m#Ike_ezyl=(5`|Te3Q+s8esO03$ zb1j!!{xe4+wwQ0#Pexq$i9fthr=&dkUA3>ih%e z)c*y0D$k#`&c8l=_UcDRRYH|sO@8q6OHG{qd>j9*oqOuyjOXw2|GLO^MZ?tO>uY%e zLiYt-%uu!5w=!i?t>4!Ekar%TZ8fj<#fzqht&%$IZvX3Ine?Z7E88ad|MUNq`M2hm z-R}vtJD<<1zIFZNr0agI%`)woT8vARyl&m`y1HJ>G1NYKotERto$FrfUJqR5YV+sA z;kTBR&t|6Idd0SQiImg2t06@zy4*f~?62Rmwqn9(W6!CRL#}t6uYFhSebp*WcdAy9 zsnYd;l>5azMSFr4re69yzxHhQ5~he>6GH60e|yiLR#!BMD?)YZ63|+wZU1MwX!$Ss ze|qPsud`pdO#JR&I?wah1J9*OURuwVcKNPbyGmu!wn?X2Ew7*68{ZeG)x5-Z>3&^H zyOoQse!r32zx8)usHk$X_brcm>65f1SI(HCnrn4?exb7Wt%zwMTqoaO4qLtH=AKig zGip7)uKv2JEyT#|Ugh(-!P_s-`90_I7wy2eCeQa*?_H|vzTGP6o&UQXkNe7EuU1YA zPL9y>s(r{EAF=AdlAulo~U`M!LuwsOkO zz@=}WM6K(}*7lrzYSQm_G2WqXHD32@T&xx1cC77=@%0~buCLJQoa}Y~$4meEU2C^Z z{b+aHWtHgJsCO?fxnJ3Ky>x!=%#c;lf1B$+@XxA#zjyoHXIl=({NI^=Qey5$_5PJv zD>I+JjQ{+*XZgx&(`(O37@nLlxvTna^`~3U?gUTy6|J5eeRsRty7rJ;v$i~ny}P*n z0keFD_Q7SV@>i{T`hJ$j(e+#Ud+ODrLbYzs-v9kmm1WyY=HfkO24;GvQcZCvZmNa zsNn3!InQkP0&mZ4NZ4k5+~)SguS?#?a)wWQe)UU7w^5^Qm>xL%` zW8PVOTYvHu|F5@2L8f<~>RjCy;*{<=dwq67ht2+96J8zO^yKwaA*t8pmhUdB*gv!A z&szWW-fGSFQy)+MJo)>Y*E+`yYM*(%pMJb#@|P_6)&Jjm?_O26MlSyH1>f7-vTwhx zDE-|r%dPlc=zfdWM{Yb_6Kef--uHEL4$t|Yd1bF}ZgI)^+W&QnuGIP-TjCXUGU)bf zmF_p;s*|UxbcDul5?pp;b@h^6&(v(6UyaMwS+Q}+{rB_MWX+lLt!{CBe^9VXpY-D5 zHM_3|pF4Vi<@dX-Cf-~1|K`p&dAM2s_pH}Oowk-?m1k?_zTS0z{+IvrRvZuiExY~w z*0X;Lvt#N**Wa|w&*XQ0xA*m)C-?Tw_Ly^Bs_Kl}%f6|1_e-{KS^g^gRmHQI^pzVc zZI4@m%B*MYEIJ7bRV_gKvHbp=d~9R)O8$kYhll7)76vt5g(n~X9tix$Ip4oc{X?Ya zT&4ML=hZ)a?tGbd!Az79Gz9*5RjThIt>7nH= z#x7U#J$F`R{-X1RvzJL7$~w9H!S2_Jm)>pqANjoI*`KAm976+VZ?O%x_PagzyO+h} zSxdO0;+e8`K3ioK$&|NKY;uZ$)l!HRE`Oc z?Os*(+yDC!bU#e=)+S!_`!&VJYv)|ok+fem|AeJi=;AG}xBOfsVZQ#7-sSu2(_NQx z&En5p{?}!9*7Cny&6(O4WuJfk6Vg7@%u@08EG|FGy1OYK_mm$yx#el#+x5S8t(x*P zz5ZKzF6&$y{q-L~3m4v+E!`D--QDif#Ba98LwRFNcCHJ4s&+hM){>4b{W?4CPfG-e z&i+)|7yr)J?-^IbPO+e$S+{;)o6|3~xY#B*(%|^!RmZ+At@qo#cFBS}`MtZu)F(bq z?Kx+8#=>0t<^0Y5FW0}GXJ&Nln91W}x!K8OmwnB*zTF{oLrZhJ{&&5VT~n)1>?!}Y zb=ntE&s$PcBO>dWm-@fV`@G_#)?d%Q_*L#@zjy2@`!`K8RItcWa`&b`-}3*LRnOB- z+%)?^$)ZoYR(=Y9TrRY`$fmfKKhyi>y)8FG4xb5{I;EI@>SJRSOF;$(hK62uCb10{ zeof6^RvQ;OamF{(W3@$9JG-oFzs__1A9=t2-HtAa&l-&j@+K_ZW_xhwpFNWzwHz+3 zWifg`-(YciCtvbv5Zg08%r0DPSCAsypzMsktYn`wvX);4m)27nczT53}tZP>B z80E?TI-Wc0RK??MwIN?;xW0VfzHMS;&fy8qeJ}eRpF4S#m8oy)N~`0X-^ztIsM&t6 z+;5}jDd@RomD!x@uk-4+o>e)a`)f;cZ0TLzx6;3JmmSNU<@i1E?y1eGJNMOv*js&x zxwh5(b@kH1P;>t;weEL+f9tQ`eku8T`P4i1dX`$8UU&B`?OEMmnkC=%2A1!=>N>!&QlKDH!YhV z6sz{yMvrl6i2eyf|EI0OzSCwdo%5Tev}j$hs=~qbHBS4k{hU&xm9@n8%WdZ+x_w;l zdM2AqdAw=jGTWKkx}2_ zOH;GdGB;;(-~B!_{pPnV3%|~}ruTks?h39MlUJ2lWko#SydZWJ@?sr z4^S~~rpFnrQsOYG!n7qKh zcGvz@k|ozSud~}S$7{)|EGy4fD;mO7qf+Op{x*O2=f@YD(~{w(>0+WAUi~$jw5s8% zFT;sR30dpT*0oM~)xGH*+q=(Fr&Vu%oy--sIP3n3Q-<9kA3vlRzMHdVijL{Y>~Go$ zzE!nqmYbISeiQarXX=$r6DL(9o38p)qW!7IYfWO&>%04|EvkC8Mk~R0(YN(liK#KG zxvEa9@?P7rZRxS&g}3kcPKsN*KQ(Qwb=C4$zu%SBp11wJ#c}TR zxT?&f&(rLS>UJG0;fzpEvu&V2NSPbzA=szXxOx&}6O zas3Jj*g465)vl28UHje?Gs)gOFCJI1u-4D_==992B;7v8rYO!`DO#J?2p>4L?dr~T zD;Zb+@=!f}bxPRJ%5ST`9bEqWx*x0d>seFUEBfA^E zMy<-$zaIOm+v~uo(%DbC{*~0dOx|>5qi6NXmkg7?nCT@ht-o_j_I_s1tJmhYe%|Ex z^?dQMg+BGy{{C}O=~Ox?IN9&!)FpejeC{z_{Hs$X)1}v5dZ}-!{bhCjyYp@KSMOQ% z=$YGU5wrEL=B*UEvO4IYfNAOTHNs)XznF{m zo0cYpgx)GV_V%&Ocln#keob&*_gHFwc=4^nvnJh`!Nb77;NWq9X~sscZ7UmU%U`YL z>frf#q=ZS`Q(y%{;@`*h6YXka=g<28NPPc|b@S_fy);Xh;{Wvd51X%7g1tpuv=nC5 zuIp0jxB28ze6RAk>HFIE)wA#JE;k1)EK9c&^^$!LTG#M)+q;{a(_fZPEtsm(>#etQ z32#&C?@yc8Y~Ihg;Q8~POaA=*e*b>W-`DZ^%n2)f4&6HO)8p#mU23amUAVxItEF}3 z*Pp8*Rez7nU$w_TrE$GhREe;Ra;@jR?0KtS_-bEInFd;{xwdWUN~hv`^J>4{{3bD{ z{@+jUPNR=!jL&a5sTpdkeDGGx{hjNIdHcDyJlhfaKlu1}m;U6?z%>e$ar*C-Z&=5> zg}Qp%*FT?IzAb+Jv7f6nS=~cdNIqTIE|+z?P-x??>y>|AxZ7u4uYdpk@7|>>hkF&S zd;NN{M%^|nHZ*nJx}80DEzMTlUehb{TIRD?kME>6MZqt1)xT$E8@gSut^5D4I3#sX zY)!e&7B%EqxxM>Yw7=jw_C6G)xO=e|E>Sy+1F21 zMs<5FxV$QN-Af7MzUS{-@323~Z@W5a)t<`Szs#VN{&2qwgK=1J$roXDApwts+KdB> z;sq0wLtIuaX=3TrQdIL6;uCtZQZw$A@bA#8%8tu)I4`L(7@gLP|0Fk2EB5Z=`3m{x zN`)-7K5E^byDBC!eYQ}@nd>)?am76~y|&4TX}@2>%3{ILL=DFyEH9U>P1zvES#on; zAmh25?<+F<)l9WMuKBg5cgBNYQ70{pdBt(T2Bq3U&%RGRAb2${Y}Tr^tF}!M_I#sl z8g}J%+V5p6k4=6asyfrNbh&$~(c@cgUyWB!yc5ECTbuRQ<^HFCQe%9YT(>^6f3{uwz!%>|eQ0Tz>t3_51gG<9BuT*UN+&jm|AS8@4F)UAXbQ(5W}P^xlMr#k{;% zdF8&**TzXz|1+;jL?-8}Zd`kVl){p~*ck4J>h zX0P9SO^;LKsf9XY)-=wDl^Q}TWdejg{QA&te}|37{$r8 zZgKU0zrNkK|Hq^5w<3$y@A>2vt*ClESv7JgQ<&C=tCf3Sty(>8(uQffw_UD#B@@bY zrt{lr)3A_3>9?HjrC<7NoYHmXOQ2`O3;(kxD*iUqvHqGoXSUhIZQH{xExTMMU-6)E z+o@>P$dox=w}0OIzVCY7{Ef!@KF@u>FYmw-&gPazOv=>J9ft)*{nG>YPBx*H*LGpi^udgR~y+IjdTh$sD(Nwy0Y#YL?xaXjiS{ zDKAV+C%;m^6=FJxWlz?uO;bZ$+hv+pwH&>5(lp$2VrFw8 z^Hw{erz&b0L|%>53QWil-KvtXRK9c7rqIw^VXMAv>3DVL`}zEHseQ@k>g&Qiy-Rb| zI&S-}lTxpBFn_pemH$(TaCx(pt9T~mz7Eq`sippSlH;nmSBh61x^42;CzQeJ;;UHo z$#W*JC<{GqoqTM|^`Nhwmf!EbGMKu=U>%cR?@H6R310&<%PVVsZSykf^*XR>N!O|m z7H4fw+N^rnwcM9u=!$8}d9 z&dFYPvq%1};V+j}$;)KZv<|LnnR@-KX-shB_pA3MzLvX&_MZK5c`eJ-$Cu_NZT{6h z_1DV4`qL%fH@Z)r~ zAFs^^#nA$Ag~Re&_=m^VsVfe+GA#kuA8)r__Y0L=yll}a^&7%FRy1T!nzU@?t<7?u zG{3+3eSQDGuVxA%o$}l7*H!P{_jcQDH@o#h;zBbzLDxsF^_!eLA;GK9IZm51a<$>v z%SE5$?!NUZPXG}cs8tb5j69k;_WyaRe|uZW>$Tg>E}!}=U;Sp|QnMKe zNy{`&Z+gKg@%YJ&)c-|yvZ_|IEEHz&yFc;%awhj*&sDBX4LNY?a~M}ZeA&%Z?}IPA z7M%P#@1Iugt1j(z8ER8gX5=_;TN=Go=k|>6FTa;w4ZE!Vbnhlv)4x|tI_HVL@&7$d z#%iax-p(hn_TC%pa&@0)&3Y9ym1Rn{b?B{0Jpm`1cbfg~th@XDbTPO&ShL2^{H^Nx z!qd9jx13*}^88M-%df^QziZ}yKlxZJvM=`7tIXBj&!Wy2U*7+0-r8IBzwXWon{m_I zex}O7`G20Mzx_V-N8J7Tf1l^ae>D9xXUp?B$KTc7UUTJddFY(Mafqu)#vBz z`?htxZf$~cu0iOkygeU}Z9M5G$$m*ZG$~}>Y&(tbR^Zu1v%lT(e;(~P@-}4d+Lbep zpZxrJ*VHSK^`}#6P8Ryf8?WM*SuV6NsQ3N7>i4m~ex}?1zPU{*ulB(smz4RN@~1wT z`u()k`gqUU%PPmybk6OF>D)MV%G~|?)BbJ;Em>mdc4iVg&=Y#KYt@>`^>@@0CLYLO zGWmJDmPuuD*c?v>v-KC(cTGz0X=1FM8gt3_%gU~x$X%hEg*L2QxoTJA=~=&WmbOfp zsv;32x>`tPHOm^7_D6r;*Z;rtZS4}RrYT+q64MO=`rq2E-?sF3=8vgggqQugy>ZU1 zeQ(N_wRjq&?=8LUl=3?(YF6*6Z>F5JoKDYTu7uRwe9z)D`NyQ}%}tXk{bKV&RiA-Y zxD>9xy}rhn+jHKDFFsRcro7g;J?E6d&VQGW`&{Z*QJ7ilKXuNoYm+M`Uca~EWOyLs zb(IY&0rQGyIuu+py&HO~o^{#kSH7VKqBIX09pC@!&x$U|%;c#Srk?XBnoTL5yl>;J z=&$=Zy_WBnH|Gtnn`aj78C_ZTEpt-Jl$`uf|5J}u6MWa5s}%aWNGPZHUGce9ldh^< zPd^ts$*rh=!qRvAla5T?X8kVanPsS~@!NIBeyAue`5QKSW$v2H`pioQ1aOLnE-uWNNnPs@B(S+TNcvsuv^<8Nw_ zR?l_6@3maMl1ruZs?N$5b z^=Z~dZfllk87-4PxAn^0I3FZZBJ@(opdvo3@xu{x?ZMMmuvtqJuPV3oyRs8CGi<{rKER{JfvwZ56 zA2XL+dy^fye9e+G|JpNN?YLH`f7RXV8WRHp!;Kq|+Ff5YAu#y4s=|~6pM8D|npZ=G z9<0{vnKqfhVczWPEBqI^Gi_eX)Wew;*XL+G~Ezd1j1tq2L7G3oddbcI_E6ees0XYSN)bAxzqqW|P^ve_y^4l5|T&OHl9N zk>Bt4@8`8U+dSuT-lN$4xw$5#zRM;>G3^1ZshHL@*Ag@((tqpQyevV^dru8BvrBcC zM)`negsw$3wTgE5O>$6ue#OLf=REbDbwR93=hteUs7A0bW$VKQsun&{%?o4^>utbcTBQT^W=WHIOO?kKh~?+Ra<)AX9n}z{Ybc7 z2AYfbcE{i7-18s*e;l{ZyX|l;{^yV5_V@Pv+rdz$b@58^rT*uImfu(E&CFe47Tg)` zxuwhNfLH56mGq_Wy`yKVFlzUoeqA=%R*NxbZ^|F9N72_-elyNY%A7a(xO(NXYW+Y? zU9E(*y{q1p9OgCOQd_u6WvOlGrD9cu+BeDa*|%eb5{mX+dj53I^I6_a{;Pt+tkW6BD)0W$4VG6qnf-j;ib-|qbNOulh8(-^rM7;fWo@v~)bM1k zCwtu9WoA`x+MntF^1WQui-l!A^HdmD+ZjyyXpy^N($6BjBAa!4KAn2p7q9xdT=-6Q zwG)#VXmH?|8Y6c?uZqB@dEfUe=e1H%m|TA<-BUr~;3A*xlT`b?C#;{;`bzjO=OPt_ zd0gV65&bsm{r&;zAq=XGH&z`866*0dpw<80PW|9ymR_xfs84d7K`I8jr5I1-WPe*L z#I0p92t2vZ)RbJ|<$dxI3xTdAYh6-Ks zdtLEWyCb*7OF{IAufV!xT&F9&KA1dT!t`-x+ot`MKIbaWC5DtP@Zk(;{P*sB`ogB| zo*bvlmdU2hHJkcv>iy?6Y7Vm#;=ihjR;)`%UsZGU{HFY!Ws`19PB!#xI8xGnB<`w$9B7#BQp9bfZ*&z7|| z>;KOXUKwVkf9d&Be(xZ^uL}dOa!q!b{P#@h#BHg|B*KKIm*t9Y;5suTKf{kw;+rB>Iix?h)l z>cKv%eU*9tXRWNB?X}}v;fgxb<4WtNf86qJ<|}8}t!r;?lk#4j6>;+Q^ZdnCapAQq zlpoiBeHi%oue$xulWYv2VRUaMu>(?`44RC6EDy95W~g=wa9+7r@woSGkmENlrzi8j zb26!12x08Yd%EQHy4~w|Z9<+--N(i7=WG1`ub0jXN$h;NZ1%11r25gOFjjBdl)?b*Oj2q-W3XEOs8*dv(b+)U;e>6 zLHnft>D+i#ca?@I4?N6?nOeon1*t-YpLVm%+;#PE zmeu^LD*`sm6Vf;{DO-{8me-rrtAezB1tXuU9o%ALepM#T_H5ubMNqMF(K zQeG)n?RtQgZfKCpSLKOiQuqJ9E1w=`{M>N;Ogok9KixR)tXH{SxGMa~oTYoi11xH@ z`yy3SmfrUhI<_R&_Waqclg%cUgAUv64Oj}4Y_ppFu(nsyxTii)_n25c?{H5&9z?lZSTC`le&xg z>%J_0`>Wml&%;Yw;$Mab8|okbZ(je|eEP9ByRK>NRPp4^oIG_!bdmprY?HTzAweN> z^PgWY_744ddWVHp=Hg|4|2{L{e{mfmp!lB2AFTuy8pdD@>hq=dh4}cvV0_M`Pc3L_p2Vi%7SJOkE-m%epKl}L8J*oD)MJV2()>(_1l^LNU>h4;;`u%{W_ zyZ$#NWYTOF9dPdP1?8TV{u|U4J~r~#EbyJP;z8iQoAFn@gbchA_A%vh&U*6PQ)E@j zniH>|m`-*H2;D5^s?|`keDX>KA0|!CO)8cujZ;PQF(8acQmI=Y8MzuD6w++A{I`itoM?G=EQ2J-8&Nx+yob zSNryy>+89sf5vXJeXeyo;NT^e?5wDhEY+W)IB%)^n49oX=c-+*e6ii8`{BoNUWf-{~fF#&^QrU(@rBZenTFc2rp96?rcGSA&XgX#D(rYnP>-`c|?! zt#{IKb%hvD{m{QEkA2NMVvj5AKW~=Gb86ST>BrM%?>f0-&6;!m$9{fMw!B^{cWEE! zhz>nf-KWnpqb;vb-4SwG#9cKgWsiqZsIP29QQfMl_;dNT`hQFA=3m)+NaO1ArE}Aw zCs#~0oA_<|b>B^HzuH$#G4;AtaBPCgtk5R!ThYGVQI{*i?oX=qkUni!di=-LNy)RX z`~IJkJj>4T_OwFN<3{(>t3Q>h+J`%ptH!C_RQ)|S_sr`xX`u&XKF^X{H@jwX@${9Q zn`3WYi+R1$BxLIORZKy3_t(yunLO{WPm*`t^yg1@zHC;T=~N_`vd6pnjo)+eyRV$C zra%3W*0XNqL#>yYOY4faUimTerEqcVb<>Ia?0-*CSrOBJb9zqpw)Lx4hSf(uuKcFH z|GeoO{^%5)S#Gx+Lzl1GubNf0=Y(y{y~TaERaRN$-U|P`DK%Y1Xt&zwg9|zbr4ZE2?>Y zm@m`&r`7Gb*U!GbURx^{{{89I`saU^?e~_CPJX*Y)Ce?tXkqyyU+{p`%FHSu56=e0 z|0nzv7W}(7|3Ue*psCqfC$3FbNQ={NT*>uFzw1{^O`mIt@P^zV=jE9I`&o@FV^zW-^5 z*MU=$9AcYZS{~o*cfiYf_2aPP>x4G!n(E-y6cPE0ah>b5;@PTs zsi8+-pW5jcbZ-L7nmuJr2RT12t3R3j{MNZiE<3XP@2>pk_Vw$_+mm``vaIo3xATj1 z<=QXNk>Qh^d?!Xe_F;X#`c>esd0*H)El&PR`@MOs(1vA~eGhm&@)ugCby3%QmBKWy z15)Puu1-mn)DOD4?mnNkrgd`Kv3XhhEw}I7wmRva#n-CLhGC7ik?iXH(GgX9lIhjKi1Rdr0LYMUAH(Rre2w2rz@IYGD0!KRqw*S_uOS!vm(no^Rs0=XqI65yZzT*MU)6{_;fF{cAM72t2bgU ztEcVG;(E33i>hV+&VQTqFTZm>)@`GH-Qml9<^AvL9wZBW-R`5B@N}2|Zr}e??UbLd zh;G%--DbTuKK@quuhn-hKgn+{ygl)w#&P4{!JM&y*L|+-Tvv2{&fk}PQ+K8n$v*%7 z^Mm&`{l{^4i_5p0zK{RTTw9uV`F^O-pGANFvVt1vZ#)k$MI@WLhB8%8<(Q({cr#C7 z!Lpqz{8xo1C>;F3Vjr}2Ig|S4Yjd0OO+y+~L(3OUS}>_0wDHx7+V!Qm-hHm$_AX=h zF0eYDIw^O}Dgn+m)q+V5aZEQ%RlT=c9nj!>;?k7J$)Nfo){|%JTF!=NUtfRCdUcqk zR9L`2LF3>8uN^C1#f47H)}5T7B{3&?X6-4nkfa3J$#p@e+(JE#J>51y|#Yuw_9d6=9JAynfXQa?vk^0MUJuZm454* zRZ2q~{->;{xf*)4Vp712B}-H?uT-vCB^Fwkc4Fhom9pBBD!Hpx`IP?NvC1v%uivjP zI+^{Pe(D!yFZi_Nq}JV6wUy^Xls%>WCZ*ro&2;_deJ{Tg+n(88id+5n`j#}F$#tg3 zO+C3RkIh`SdeZD&yF{hix8`)m5DgsCh&d8x;;%suN)RC;a72|aT%dD4jq&;4h~ zOxUP-{_NHX*$P*uY&z?C$Ac+x+5R=B`f5YZYQLZPJj8V6su!2vOQ)}$G-Xx)YLyc` zUvEzHy7f~2`>HupUa$Fe)pL33Y`43IpUeoKx@A?vtZf@(KDp1EzHP$urxxj+`{%!| zj@k6jE#R$PuFk6XQxdV?V}3^dy5-ey_Q&jR^B>Rpz53O6t(RNhDW`|-U9rvZxz?*a zVMRe(_rJ4E_w}5i`g>CK(U{3oHB58s=lp)W<+)6MOt&T9-QPRCnq($9#Ch&2eLsWc z_?E}3o`wJV9TB?h(!bC5LT~Ed-Vwuk?$-A^n@g4(tY>)`$eB}n^PbAFr+c+tTGWPa zU0C?tcj}6{zrW9!?zJy!$*IGjQPDNBp!xAN%N~0$g*7q!G^q)dd8L-{RXgd5h$81C zb%qHFPE0=8f(r3(S=MlU3tVN!A+XO_07gO+!bsc6ef zHKmf~O^ZXAuC?2JS-5nir`C&@+jrKdO?d13L5=a_o8o)sp2?ww%bOfTx5S-xnIW^; z%j~3Gs{N`UZ`CDpd^jTlMU#v4iuAN+>g`|8kQvUpfA{rl--VW^S=M+gatNL0As-}q zJ?ka=r`5SjnS6isv-qvfI&*SKpEJ{K%k7*J&#l%hIT0fqs+j%aOY+Ofm+YV3d9v&L z*3hY~MYW~BXTG~`+8Xuimr7RJ-Wb+JfxoAzzMpyB_kjKH>DvNxRkLFMR{Q=hxt+Ux z>)%@|Ub*_{d3t6#?>ttt@ACfT`ft?|u9ilq{e57R-lfM0XHP0)bCuvMwnS6O$ zQQqge%9vxvW<`|=dA4~3xy+m1vS3f%Hd9Z&m-jcFt$bU^84)>2X7crwS=OFar;OHZ zx~&rueQw*cTc^LJ{hll_>9zH9#oy+ycBFe2<^F2-Eg}cS|Ro*UGd%zGc$l-QNQ&-%sVZQM)%L zJyU)2uJ(1?f;l5B{TDAQdFx+1=e0qy-><(h|4rTaJ-?mYn|I6Q+E>TscfUhhuPZ*T zS50`j^X4&?=4W4v_h0cn@M`>{X*E~gFZ?JC;a*Rw|M^VJD1L{>bkHbxJAWa*58w5DY3!9p$k?pWpVB*VV338 zdbYE2{!=^MxS*X%>#y^QJ^4C`=L-KawGTfg_SY=&eR3isEi_R5xLV_+tMl|$ToJM7 zv)}DsKDw2A)ymqu%!u0tXf&W>(joYT3wAyXoxI3xSSb_qbo1`Xl6IUZ#I6=bkXvW|sL{H}*+++JzRX z-=5~OhO6MKcEZ!B(~q;H_DyQYV5$^-v*vA#rpHv3i88-uC21U7oB8xlh-uTi-%DeA zy<~hI=>DFvGGkSd&o^UF&#UWR-MF@OUh%E94wt81_qebzM98)8>Kbj8kpB~EeeX|r zy=B?vRW1i+ZBu{s((h{v%arcDZSf%{gNrdp;I?}s{%6Ts_pR%>{KBtJ(vg&JJ5l|#RJh<= z^|IRQCLMv--Fj%7!_Ef{w_TbWvVT+9r?|UiQJfq8 z{wqSwH`rntOETG;KR;knB5rPJ$7Ykm9DuZ2dg*9w1XTKs48-<{Wr_I$n*7~Fi# z@Lb(9!<~Iaec4(Yzc618+j{!3`(6Ddx*@G=o?fx^E1eNz|5z*Gsh#rg?NYf)zh`|v zRWaxHMz4^SWwVl_IwO8YhCV;Jan;6c$1d2I-JVvvKIOJ&fBdgaUNZfAo_iJ96vt?< zw7wlO)$p>~ruaUxXQbY#J+6|~b$Uztp72Qym&3B|tbeKN|3o6h zDDhVCHtXCqlWJG@pEg^f`?NMY_Uf}s;y%i`2J2@&mYixZKRNpGm7?0>Z`Q|6Yh#Zc zxf6c<{*o9p48!myd=vlnZ^oTOMEiZ~vF2`np?B$E^SVEB^m$ z)BNS4AAEu$%x7-A74JKH$23mE&ui9g1uq2;sm{!14^hU2wmoBiZD9l>5an`CW z>wbR`=iFB=EFQjj{d%tWm)DiwZd!G0$^4n2O}h2Vk9EB(DgJ5oI7{_wTI|$05wWIA zbABD|xf;56wNR1P!l_@Up31g#zyIsn_FKRAe>wef_q$!M*M0kbS>>mc8HmecSK(k0(?&?`r=S z{{L0{*6&)YEzdoPQ9Y^c{cD$3!Frc-yPiFBRJBfv{=7Xrw>(s9-NqfuGT9gy8YZ7y zp>^><${%&k1iz4{T`d1sO>&&}=d!*1>H`m=eEg?3TrfUwbD6E{)5}jR8LN~otO-5j zb?xiQzjxj|{Vmg6>9t4e<}#W2IoV9rUpxQLIiIP;bM>*-hket61?Tw``4z>gUQ|4I zjzvYdr25Ch_S>IlsH|bBbq^Kn^qK)Wz~ZSdX}|jdWETV=-XA-rap=J9?|!=#v^r&)b2?OA}+ht{r`PGzdl~n z;&|wdH7n;DyDiVJe=^a1+P};hPac11Ts=3!x^q{*Z}n-rD-yPE_dZ&ZCG}Kg%hFl7 zcb6}D6&z|E^Y;6im9nd6C97J7o35ncfKwdV$&5uR4Q54KLSFXqdxI&?M6(_-Va zsV7$1$Mzp#uFKteoNL+S$M@g?TSlI36+cKu70&jZT9bAfGf`ePHj)pyRng zty5#BnF{0V5Y8KWtG|a_-gt1)jyIc5-(tw~^$xwNRQGA}{4JaoD;q*XWrUWTey-fztS3io^e-wXfCF;K0v)8oky2*UcJznOXk#`o$>8KGyk@$+1i}C$Mt^Cubvw6bX~%FS0!QVw9u%8wM%lN&UbT#%@f*DaSx8;azf=dKEFnCv)d z)ut4w8+Rsyc9ccW>N0q@`~AMMxhs=C@Az_kYQdD>H)#DzpJpS|ZeEq&D4WUzIz59Z-Y*h<$_b&5<39Hk_N(FqP%z`I=|Ox&Qxy1~A{A z&;E6Pjj@@!q}AhMRnPECfxo_gd0ja-c6XWS`|A6@r%jq*Ht9|AvCY3exZGX+Bt3Ml z@$Z_)z2 z9TghN5Mginw{+Q=(-Pq2ocF_-!j@f?R-SZ?ESC;^7rERRqe-Ym$@t@!Y6v8)IH`Xkh}cb2bR$+7v|jX8CDwCu0$653@p>(2a? zo14?m2NgvvxfS}&`f>EJ-Mhjks(_Zku2K1)&CnKjiKRi6^THCXfY2|V7fyv_<&<1K zHrYWmeO_f+w65mCyDW9Zu}}E>W^GdM>@56vRDAnul@A8@g&Ni|)J}ROH09hRhOG%E z2mY+enmRqcu5$Oijmhr2{p9Cuv`j8J_Oa*gPb<;&lQO1otqbMMRz7W)w*S2S|38nH z@vLuor1S16sIpGTUD3eGyrSW#+tekKbyjLjSjuExVC3n#M#uBY$4(+{m_j5>Yqz8rXYzW9EWr$=P?rV`)zwMJh)TJn{i56Y?uo+-@0 zz%XMPSA@YF799x(@Z26Kmr8fC=t%g1XFot(hK5EJ@O~pOhew5x8_WP5=%BzE0b?^T zdmaEyNrU+k9&p1L4mb!Q?cJNy0FHE!DuW5&Az~1dI4c|u8&JzAI=FV!3I^h$bu^$x z0}50KP_Lk1V9w2BU|@KlQt;-+#%2mJjwrDdj zFqjE}P1ITQRA@zz=F1BUozGgo-*Z{UvS>+d&c1W!SMTa#S#$KFeK^zi4Ig)$Gw++T zJIXBg)|M?f_x9|J-IjCn(wwSSE05c{Uj^AGHWOTairre_74Es|mEOP*VcPyLyHvH5pyW>CE85j~KdVtF5gv1{2S*u=!{r>(wzj+rs zpG?LL36)a^k3F}#KSS$e)*O|Hr9xp^NxAp;?ftu}PEIR{k%3_YB+NDx?3%jnQ|U5^ zH(`6aX8qDIdK>sZU1wTd(A{fmqoos)Pj1T%Gy3`V|C@UrU!1$n zpywt71A`71I1tY44ZIroX)|ao@uAl|1h!w}eD?hL&t2EfY`6M;-sba}OW&8z ztIFD(eSO`x--VaM8M_y+`#e3qZl`6%hX&JPc?+%GWLNW} z;P-BoyRMURF4r#?3j6irvY++Z*z$P&FCQ5g7|v+_KM1O}5)gJd&t`iE^G{<*-=2H>8e6u%{ofMC+pODTJ{?urU;HldU+?Z|s`0w} z{z=?fpAyCyzA|B^R)pscFQ-zi1+M%27lj@B9I|oE^-IS=Ca;H@yvy;2O5D{eA)$)O zlL|touG^M(H!I4qfmQY6t0$M|O6^#t_Qo%E#*;OFY&fso{TK^Qc%R+CRPl287XJ^X zji4^VHc)%aSAPbV2aLY-f)V||>MJfWquXa!f~?d|#b``2?tX1XP!Va)7Ff>#uf*K|brPtTjgx-IDfB*j2@7nQi z@9f;n$Y3_jYt^Zc=83PuS2mUY`0()CJ%#VArS=!rR;>^MEoge}3l6#0X)%vNS)*2e za%Eb@c}h(|dj}VTdVA0BsV$e&x%94ePSQ+Nn zWZk*HEjPM4zTm-u#S?~_%Q=VxGG$cDJ8c(FBWqCKOwV`yV2gGJ?)9rIUm z6!%YHS#zS+X-1I%!sn*pjF-)=v z!j?FNg(yus0*cgYv%s!;=Ek&=b5_`cEkYZF3RoHZ{7U6FRDOQ8RFh+|R$?ePVAhC( zv+SDLb*gKW-TO@5@A-W0()XD~91IFZs)a%uRwbpWCW%g64+rx9fREGB7Z}Oq}g?M^T|6uZw*Oq28M>MYLEmM z+;}PP>uQe&As<8-B$m$35&ip{0~8Y3;E;$Y7qxgBwr)ZLD?`sDu86xWtMf#CLDKwC zX{`iChRLt)E3W{xj1N>z22;CU_}gnRax=_u`ER#SE1~qg?yEuu28In{;PPR^I}kNl zDiq`ZhHI0-@tBsk^uP)h9fpLU%YKe4ltAfv^R|_s-UFy|Wk?VJ2O^k_+TzM62JOVj zesW`D^6|BdZB-wShD+ajd&aoj?DqEj?1ufj?^`^b5-bJkE2ttL!$C(9mj%zh?0^3v$cF`=K;g~6zz|&V zZm0O{+TY*ItH0S?U3a?l`rhp~ca?e%x z>7+A}>2oix%ir;E7F(Owrg))W@AmzE_iX>a>;HFs`CR{l|9|4{C$mn1`eAGA>lcFJ zbwk!9lSy9T>-Ybw+WqGC_Vtyo*KWVXvL>XX>gm+*TU~Z5Yf4|OT)vGna-~S=ub0cW zpHxYoTN<`G_4G8*T{8LGa&KQd(|owS|4)|Xm9V{Dk3#o<3cY`C@9$e%y&~pxgmj%Y z{c*?y%>vpa3)!6y@ob~ONrMutl%FYwo5Lfl`>9bz*Z)W|r-;SI(6<%8zGpF#_ zxw5rFV$Ld&AOHP+pI`Umu)JCQ&*}9$zkKG_-?L%ovsu}*K6KS-Pw9GX-y z^^{G&?YD@}FBbQkffoDzE}i5tsUkF3@Y~X)Frf`WFP}d+*qpm5Y|^H@T`!kCJ7au4 z2Yd+Iu0vmE%rm&mD`!=*qw?)m^IJ>ff4(|n?4Q57VygN5JJolR<0_wSE&KcHb^gCs zg|lZFpR?H8==t=Phv=HRM@eqErf4J`UOA215`p5kLv-?}7ZrIi7m;LnX_4^sx@wR`z6z{*a|N8x}zdxU| zUVd}u=l9FRYhEmTyj;EJ)ynkSUw1x#mo@p6N`hgpO2Shqudh4SIk)p|yekB=UbQX%{yk7Dvo>y3($Y_% zlQw*NbMtc8fmQG4SG`)9_WIh|v$o&wT%J>UE%GdAS$EpnFWT{6g=3AjK3L|v{9o4o zb5?qcuitDwpELjaG3k7{?>|Bg-P%=pdi}SzGE>3be>3P<0nfB2ORmRNul@Pbzy8*r zv*qE?0O%-G^rRE$i!lKApb3KmIh!nyFgxZ*P^BZ7zPEd3Nb^ zwUs%~FP)!UVXDQbJ$1vRhN(xip-z&61<*?N`Y(&+w|0iCOb89;Qv3MI_I;&)@#nMV z=H_=xf{UL{4L5r}zy4p4=o;VIW?TFBKI+oGm9pk`{{Fp{FPBcAWq!YAbLHb+^IJ>S zg`BKlu0^JA3l>O|z3Z~(PmC(4s%hx; z1Xr;P&9>ieB%huC@8$e$S66>~dwctr&;0d24xfGh=iGaf>v7e&yL%>gMHIeXyL}sH zB){#KfX|1x^|u7`t1-U5SN*;=e9`4KZ|?pM`~2zj`gIXMUwt~QZ@KPM=*~Brx^I77 zz5bt7;+r2VYs$gRDux>iAQ{A9E2u={3|i^8HU0d&ZCRl)6%SkA79Hj_-_i+k_dA#M z+bcgm+olz^DmAw1<obSQo~fuUy~ZX{&?JPe!NdMyMEr2)ghaAeLN;TeQnLv=`3qbOle)Y$``N zIH{eYwG%6yQXd^>T&bU237G0cLyy6?JbJ&I-s?BVgsm&S+1I}_s65| zvr(&0g^R}&)D^$mnQnghRoEe`njalt7c}sCL1I4m_SWq1;={b=CZGYu;+v_{w|WN8 zoMdpBf0woyK235u=KfGsncU??p$fGE}wTT=jNuJmVdtp&(~3y(>jUGw%F1 z(~X{XZDyN6=mtOQw_D179SHWbOkH)|y6A~V@tYePpZ&i7zwYy`?Dbo(Zh2MvDQbF5 zktZmc89qZR`e5&%5TUi3a_;WhY8mMH;MAw?_&Wcbm7a5cZYBV!En+Oi4 z2v$#-&gJv#cEyH&I$?8TTW<911Cw4pnxtb~l4UWYwf6V7t=G?kCJk4E^CG)k#R5=X zoVH8>R3YCs+f%u@K6#@>Sh7#Wvzh6$K$8oVf4^Su|6RH4<(c!wycxf~WU3|_J#H`r zwUxs9|Hm*gFdWc2aV7KPtJUkby=FP_{OHT&^Y5|U09D(KWzYPU>7FTR2F+T2{&1Mz z9JIG?HZwb)&fkBlR;M0ITsQBvvVA?MzWrAlWnK0r zLs%-?=fpNY>r@Q}28IF~a51!j3w$(w?EjDQ{|k4odu981f!2~g_ul`F1Kp8hTK}WH z{>FhS&rR;rLUvVsI;lQ;|Bvqd8LNNV{CcrCcaoQC{N1Y8YtLpbpL^}kzxV&^Ko=UC zZ1C9k>+1S#Q}6ht_?*}}L3RD*QqcUwbw90y)R|%RK0gkL@4GOk_S;QReE}K;1~p7s z{cXR7?B4f$UiGZXuhRQJO6P8nedf68JNT3Zqm#n^HW&R|E1sN~xb*(~;&Ya{OxLRK zeV(^1h+k(?52xoGtBZz-A*HMKS#oo8y8q`lo6no&@Bdr2`$(&J+zmg|AFcW|3wQo_ z)IHn!-Hye7?c&>Ch3hQ3|7-32tn2DVYALG@s?V?49puu z+3KgafC@p-c#U`Rp_}RR?}9RqI;4xfrb&C;tHL1)XB@>|XWzT)Fx`AIoj^PKJRJ59nycXP~48ItJ7%Q$XxyRuAXQ zd7p1=OwLsbyB?W7_v*fX@9yrtof@_C-lT?9A5bIgsxr8*5at;Aa_7fm(zi<|`9E{b zo$X+q{c!8`xNKoJP(m>S-7IyhEBw68XP@F17Z!f|?z!&Prd03GJI~jy+xhR;>)F=t z_iWzzpox3dTpVnT#=aSycHUrSEFmU5$-;bmEX4~%+dC#txy7J1T1xi1;Kq2A^?!GZJ2v2ia z4eHc_ni6pp4_njz|NEP(x@J7~W#E~%WHmE8pUM4y z-?q=L|DFFo_w$|N^II?TO#|21ptWkxKsQE3|J3pfk9@ZA(N$-D+j};DK0NlmA7As4 z_3X^_c^6}fPOiVM{%Mz|+wINIS1z6Z_Rh}5Ki{O=gNDc$Hh_*DVqjn}xN&i@`|YP| zx8KW(tND0z8&lXm{oC7evscH?Ek0*?7Br9cFDGufw9lj~`)Yqr-)CR&AffnH=Iz<# z_bhMC>Dcpbq4V+mW+1mqw}T5)2Da)C2ia$XE@nClTF(KxZo=FCKj`dAJ6moB+4Fh3SKr+GdsEu+zLU#+|NJ~JpL_lL-R}XQymsK&R^7)&yEV%CTt<6QRR?eQK8@+AI z$-wAsIsdNilg;guv)%ROcQZTx-&fD0XFIp^ZQp-Bc{iWD-Jk#V?>?NkzW(_YQ0arP z>h1mg`@uDgczn%9-z{3;${KX2i~avw*Y{mpGmXFYh4b5Ad*9dQ8*4wGTkf}ePT8$( z&#s2Y=g+JCcJx`V`MsE5wW|`2K0Ms+7IvuW)5-K(Dr?x~Yo5fepZf$fQM&2ouF~w{ zzh5`s2JaHSHV+bI%ch+Q_cVJI*3tDx=VWC5o{w&yKb_V$U;XqzBlFoPxe4$j&l z6lPiS;==lA%I~Z8uBr)L&k0%rd`trs#9HaxV?XUUg*>f$5y_I(257upE)_;VGV{Ew`S+>v)sgV&F#|qmak7HpEvpa zegEDszgM-G`f0@<^)-*Z4oa3A3Q-y;`~Q3bWxun_?Y^!|yQa76#iF#mIk&fM^*wZJ zXR-V5zm3f7vlqMf_tpOClU=^`^}8=E25UnStl#hXJPXtfyt%jf`=#@suIRVtppp`l z&0&Sa%Glzwrf-XkcDz``J?qr}s@H34->+)9y1n}Q(zm~6W#7AeAi#5r*Q19s)8|#* z37HStQhxjClwiM1Btsa~3T|cYUzcOLPUzaVx3_2c&Nf?Fb99y0)}48*Yc`*^+YJhV zXWfu!n{gm@`ro@I9gDRRW6N$HJv&WzcIdvO&?SdLr-2%kv0!sm!4br;EMV$}bJp+Y zY~u>Ee7(l_78hvPi(yU-q?vv|WR=h~FVL(7Lreb?kR70)W1#m;?1HnPyvLw3W3IJ- zcE$Fyv;A{H?udwn#CU`Sgq|V3OaXo(GnR?qi1OugioAADNj~1Um7BpK{=ePAYJQNX zUOPhC!wlTMkWpDk&*=5Kc*fT+E-rq{#BkyIe*YU=G9lw#*QSEQ`Py7f4#tMeFUu9C zfNGZmRk!YdlD^c+2O0J|wWew-UDeV0>BXwUkT7LeyvEM{71f=vF+gyE6;b@RVZ|v? zh677NPO*T7oFU_IySzVzZZ87m)!Xm4=iR-d_&FuW!Uhl2`zRlkL_nXbq3=f`wYtv7mp(pO_tE~oQ{Lhf30mX~s4?3~x zFf1sUyx!?4Xg=#1WN7P}Z~dzUA)8)=9jF3LAIyJ$XXobHGt+dVr5GMODFU@4_B{Yi z9;haSvg!m2GBGf0xMyYxN;_c8vj`mT+3VsLF4}j0%ggKYg>P+4c8`9T^#9-Ax8K+A z`;}GvYUOgX=ku!H74|bTn610Rz2wu?*X#G!-TBhI)BnU?=ezu0v=dggure?li25uK z8hHVm+|U>Tp6far;@TCmS>o&GsQla8*2c(70dD39}uVCIVhi%Igj6@X~a%BD% z+TAaoyluB9D1;6C!D=?-{Sw{yYpM=tTyI@4qjr#>_I~dKGshd7&snYhyVFI7A);n# z!PfHk_sZU!4@$0^c1Qe)-2$PFzfML>+6-!lLx<9%MLpKCtgdtI@$sB;|Eus0hK8eo zk1LLS{dZpL;VOyOj0_Aj+`(BdqWG~^{MY*U*T&~87W?k20*&;&59VBbZMJ!SUj6(B zZ@^KKuyM(y&`Il!&V^rHZSnO=@a>O(zg+gW*ArZQ?eFhaB~PTG?VVS7*Q9wWm}wbE zdp@$N`SGFfvf$On3=Kc0e6)UCIj!e$WO!0p==L)eaml||XtFahFeJo*2fPyQt_|6_ zXws^(H#at#{7sm)YEmF)1gPO6A3oKHC5tiPU&yAbpdM(}w5biDL3fRke|&p;d-|#b z*Zq&K?%)EIejBcV1JR&d$YZUR#NvJa2HUjKUDg`c2CB@64i^2oI*sER(}6cvcifG= zKI!AG*&eaGf_eI+4uc&5u2d54hB$0(+I*KGd*3^@)ZP16v#bFn_I}HP2M)Xa9)*Is zhq({RPEXT)o4onl=hchcSWC4pa5K!=5qL68a{lCksj8geTT71rII&|->FaAt3wIxT z^((gg?)r|awV;wP0y=^(@wa6y*8#PSTE9d$X2qTitBl(|tBqyN&#U}rzNhY5B@uej zXRAmA&(sCMzpnpXp(6V%`um)3+Hp@~t_AH%E;4uAh*7Q8tE#t5f;?84mx*S7l&e;9efjsV%g{S7H0_&F{Xr-+j;6a8r7!$JJP^ zmsugMUY?;03=BGuS?M#qbsM(YUrngjT9vo7$ENJ{wY6`*N0u+QIb{+ywd3ksAy1=g zf2618u;=L9-FJWMKEsmb!f*WaXQ+CH-+h(#S7q(L^NZ#$So#T6a6zXcxtGtMV*Ktm z*N?E&HF=k&vaI=O{_4+{$)6gIKC`+%K4%QV>aXR!!l%9w7 z41R<9tf)w_>npm#PXDc23Yu3vum?QAbl{HE^a#@@A0KP2>iKQ^Iy>g*?0-{I7B8Dy zqL*0Mvn%cR*Ykg~Jl1{vY4lR!?*F5O_D=WS45x5lLO zYSH;(y+p$~CrZ!N%zQFOXS$E6-a}C5LJU$cKD*~Nb#0h-g7ydN{b62LB*GQhBV^Wn z?#*4A6?WR!`9%z9$`>-3yy1dd=)S14OLU$cp72WRK+?=FQe|uPmjymQyAxEOEC$bK z960oXJu5v{u=}gJBD0y@^`9pbXT1tL2P#UtAw5fJukA`<|DV?`mOEY}IlaXE<@?5; z&#mrPs9a@aU?|uG?tmRQG;4{{H4Cj&-L|RcCcaAF@MGD|bCEKa=b1m3WMF83^otsJ zlXpIN>m?c*!86+|*XrHxca^1niOCV~toX10N-DYsI(*~=W+AT5I@R1v?YXF#-F48x z#|H1g1u(cUX28-GV0iF9`MqC)p7#0Q4f5X-biE)w!A5)O7E`P=G>Djb6inE#z5k>fsR?X;q8P2Hxd$V zNHU-OzjmH}y59HO=W0&>-S_kFlEt6ze%1MY?|IMPf0c0{2T6D^fQOkt>;wfy@Sq@w z-O$Ja9F5kBiT7dF1V61rf; z>I2_=AbGYSGQ4 zv+wu2wRYOMhnPe;PFQ{a+8lA<)${^~FU;XP^RLI2=hpYLZTJa1s`+r0#e)XsWliCnk!z#3uWQ|O@87rW z<-gzWuisww_EuQ5cEi=>>zG!b<*Wb7ulWD9(6h{C{{=yV`wTksUNQxXE?ad@+w{YI z{utM_tm_kgo8Ds7e%M&2pzYZBXRe;!*FP`srJK%JCujHlPVw7~`ZW)^-+lw#!F%mx z&C~@~llyJ2Wo6mwmzHn&$Fw@Qcj~)sxAWGDshybh3v>s@wp%~j%=av`EjyvuzNO&W zudlCf*QU>}EvvTa?^T|#_0N?&2|sp78638UD>9Tp;cg_uv6<_B$F^<|QaLe6;o3JD zwiTMJ`#<*PZ@E1^zOFKQ^?HZal6m$2es1#6wY_~!Z@kaA9Peg*pW$}< ztB&xmi{tf$Oio=|FKwC|R(fQW<`y^SNNv+4rcvRmi?8yU-??xo9JJPd^;*#E;BNc5 z>z&F)67*i(kK|00t$MLAH|x-3f4iNm8}EHtX1?`Zg!-I-)}bO&ehWuov~tr%eCxlYi?>~g#Mo&$GT3-XW?O{9Q##u zA>wPIR^4{Lwo>&a%T$A~yzu9Hu1sTLGs?ZT!!JU6<+Pq_S6h^e_JHp2jlS^;bZYqJ zuDj*;Yu6qNQ{YXAzOw)Lx0~tn-)%U|mmRzD66b5sth%@Ff2&_o)28u77|emh1H&2# zQ5g>ng-f;z*IUJ<&YFGUA(zHwR{hndL#MT@UnLw8vV9F#*3x4sk-iHXSk?r2@BjC8 zeR;qAzl!qTZ@2qjjc8~MYWykx_l0|I<(G@@yFnxIxAXV^-Nh?y=HnaAu_5SX11s|j z(5L_dL-*?YE7h`QZSd)yx?gxwM~lLyH#?ut%bokqYHTyt^PtPP<}Ve-Fk9Nz_+TLSO-GhBX-NoU)i*}A89mA<}J^srTY zo2u-lO)Y&(z5UsB;8Cm=$I5nT>C#;nU063{y*fBciYK9CR?&tlU#hPvYHts27TWjf z`ogIi4_EuxSDd%~UQ&LqGMzhaW}ZNV)=I}nv)o%(Z2x|_e0SqUOhE49&bgL;^RzuTD}-QVUo zeRK5bj9A|TipM{;*Z*k03rhI0)o-`n<*)y7xXk8ngZ6=<6@C%w^J|LAFL|n$f=(DO zKWF*e=jzQx+}9pmV&rc7Jf8(LB zcYD9zdw2JJUHSI9zrVgkWW6l9656m+08%$6JPIkF`D-^*L?p|GhNnTME9^hSe_a*7 zT`h2#)SW$*#h_E6wjPi;pyI_~@4c+X_iWJmhN(`_iZwNSVe2d|?cfVvmVfnnzS`&S z)J*nL8-{7#td5{tfbzEAEz3?^#xncTR{ihkvkuh-lvutFy?WKhbcVv=(D2x+(|lgD z8obQg@v!aPwCKE-;54=2FyHHMx3brVmH)LCm=OZ4{d}gpQVM>!+GB>}bM1tnGgmmX zFI_2F_fl!{O5yD}H!m^z>}rV)-YszF!Te|8q&w(Ou^L-wd{%@M7YB~4;A8)*;K;j1GJ#pmb-!Nk z>n2mrxlxyXW_^BkHg|0^&xW9oy{n|AHDup?f4}8`3bdb)aP!K8sI`~pF1^1n_5I%O z@5*jvs$b@363*|NrNCbO&R? z(w#q_&E9=GZ}(d3$34coK$p*f8WC~ktU3o&KJ1SGCt6T$WV^%&?!7dq8sGgA9=$Cm zb8gh8Bj>E&-`OSoqK?&P)0O2qDf8IHphNC%m*1~t{o2^M7*dfjoX#>a5wJ>N)IR$nr1@{^%GBAM&8i$>2g4esu945X z`jcyh%fHWxpnzhS7Rz>Z)0Kv(UGbsrk`12IXKj7lXYF@&4VUfGWxCm3f8?+L5m!TO%3OCNhBA2n^kM+YW9joXb;U%n;V~ z^3~Ont?Tc<&0lfz)hloPy;rP`F|1*GSvNIxS7xaAqIFC;-Llr;U3Qm0pkCZJK?pWcT}h)xV=biW3r{rQHFp z&!9ypPY<%ozmcnW(D-iM?su<1`QqI~ce%`kt4sEtdd!)UI(J<-XN+paRKEytYyWYd zbs1>o-1hJHs>?xlaBM$s_j^l&SWod;)9YK-W&HHja?t$x4vZr1d3U7+=ax4%B^F+MkA*MD~VACBc;uZEY~|9Qy28?yUlAw>GQee@2;(n z-+%SD`i2?1X1&ehFPg`1{bqyMi8u4x=RD4@eI1?a6~hp57TT9jX!UTP>Z3a&PbvQA zsqkH(1%4NqZ>MWd;y`{Fs1 zrn2}v`@FaL>4bOn)o(VsZwD>+%f7yD?k@YUCg1b3pYPvO&$N~^>g#>`{oO1ZF3DzB zPxw5ccuqk6f14+>LWA%7&8qp=E?-x{-47~sgTF6dXZz>F;kCz9E4Ubnp|uf%whP;5 zVW|@#&78iea~&W31TD&lRzD!hd0nL;b-~P+Pj*k&)Qzutxpd`kp%o`;cP%$ODa7N| zzKUg`&=$>~|DOG8SuW;uZ~gy&UvHoIww>L0?(>*}!-eaM?XW0(E! zS$UIw@-QZ>gN4i?)i0A?vgPl3x$Is2pZ@$<6>J0JI1?*graX`S;s_CG^{8nk6#@Nm`V&|R^2i%#q6229nQdmiNTzd5v|Nn>fTi(fmYKGZaE1hEhKbik$^0t3x((Nu^o4JgWfuZ3eJjnKbIK;iS zJ9JmLs)ngn?0PI6~FTt)^417m2> zHzVL>+1IuCwX1)h3g34rw)m{+dhYnSb-!NbRzA1Be{)*NKCk1eZ|2gl+3x`Zl=$V zbWY;dJpSWKu>aPEo6~focbR5i+p^(SQl9>$*fq=geP+C!k=&R0UEj@pBiCuwHQ)by zKEJ(q-skz68pZecZ9W{>cJ6!f%5&Bm3|7UZ&AREMJ6md!)wKK7S9YBEOb zgax0Is?HPxU$&c@drl?P9P;5bO`W-#XO+8?hvWe{Ugyw;jA*tm#tQRPn;%>D-8%N- zOQ*Lg^WB?e-_m2mH@1cyk2@a!JbB|&iQ+Xk^X!hdtSh=#9KZjzPy z+v;t4N6oUMZZ8e{9Uv>M-4ObE>Jp|6Ki_QnzjN;ErU0D-uO7tT0@Ys(1`Fk?UMzg) z|L=+aE>Nku`ZuT)dH3Nk|9iU+jr=8`gWsaVdlmgG9=2@T_v2CbZISl*KhLCZtNP;| z|0`(rtq*%XpPT*7cGc<-tBOBQ?0?wUjB@-|lBhwT(BgLHYyB<`*~r*M7gd z{rAiH|6abE672W#+S=&rZ@1sCyPLBr_&O*9Rj>YCtoNy|{`vbqbFYB_1h6w|Tr_Sx4$O(%Z;dBAR; zaXgA~O`zqo7IC4l6Ln8F$9DN89HACH(T;Yb3>aapq zt@$M9i6yhIgoej{-PPc?D{D#irHk(Jdlh2cFSTklzr32enC(ZpRLJ_;JzuXy@2>xL z{$J$pY7+|sKeiK_mt=>4&xe0K|L4s4Fa7NQez|s0J2qljaPS*dk1Nw31W$|qy){0Y zafyHJtKiG~-21j#O}|s|xc9F3{vSu*U7r81eMzgOpwA9&witTs)mFs6N zlRmRm-OuXflCbD|f1a6d&vvp>F&Sl z|9{1A|GM>h-0gFZ*Z(=Se$PA8m9H)L-#q@Wa=u?vZlv2%x92s!;s;KB)p@uzW_iEG zqmDeY(slR0t}EaA_4fUL-^8^3fiJXw9l6e*!Drvn`76L{;z21qVJdV~hC$6|m)2cS zb}sf@c1n7x<`lD>8yA+vL~%TySDhEV{PnSzrP0^y|3Ck~$M@~`wfVK#ul~)l(+bvI zDt#I>QYBk_#_;XN5^c}ttE=DbTz-2;Ve)H-(7Sstt$kWN|98x5ucBu&)3@nG%-of^ z?%kfx=dLAc#V$2k8?q~NX}6En#E|fnB_f{3*Ma(gzc<_e-h6GXR%~>UwRfNDWwCva zW#4CxK~y>4}E@THrp>SI0M zp0Hcuoe=l`ZGQdkyYtV5ul)RcZh72l@t1Nlo-dtuu3YO-$(~b_zFYnO^LhC@|K

-@iKxB2m&-FE-mw(VQ5|9^A-UrzM*-HOYC zAA>f@ESD`l7r!fH@BhE=>+jkv)qB2Y`Re3dDt%sS&(-z%ZLa=yGrj!vwY9JRJ+%MR z4k|0nOY6^h_o-gr`NsKNa-ZUJ``r`uBT1@g&f7viKPyO`P{FnbG^2LV7mR@}gZgcIr|D*SQ zhU^Sb{h4|H`Q-V3Qof(fuiIRjcIx+1XOBPk|NpMPT?@L`{N~#D{rhIGE@}4KzOqCh za(7wo_uu>f|9<;#Zh76`fD@plrgKZLMc&oje&^EPlk@+ayz=*DPU+LB;oJDs9$O_W zJsrAh(;v`6`qwF+emw5qzE0(7{-56c7k7F5Jzf7(e>XFq#e&kvm*verx5oe8y3KF; zI*;~Q|EiaFhws_}TEu*J-|u&~tum+1Sv+U@oXvA~PkQ@i|Nnn?K`SS>|6UsZYiSwZ zu~I&7_h}^wKg~g#xW0RduX|H(b?OMH)x5EE;?EQAc9*QyGkELI?GJMP6z%K#;~;Z)cBuMuU}mY-ZL_4%5GpLuXOzVelnReCRP6PoS^yctqVWRy17l>^lJFBC0dp5TXcmq zUabE8yK()A&q7uws-Mm|Uvh7=|IOn%rMvr#FLyuP`nB?0xs+i-V(PAgI*Y%ih19K| zsbvtnLapZ3`dHBmr*{4Styh_|h0VRmYv;cu&(4PQzy1rFXc9Z%wP58o+u3jYziHn- zIi-H_SM9HQzYU{4yFJ}{GtOyGq*h7v>#Fk?U%zxZwQ)Jy_w||+&+9)=Uw3`0O!1ZC z&-*4OpDb0IAKF*A>^(EXX?JLsSj~qm;&Q1<^ZDA}Z#MhC=Gr<(w#(?l>~%VlA$9Mo z@88Z-cbM`ZbXUWi!ef$mEuYUZe*JsNW3PF$&uMMHSM~bJ-eWxMnapLE>vicu~<+nNh=c)Q`ow2kyWLG+9q&f4hhu5yq z)CYe-HQ4UW=k0!%Hh)+QD)_IxoH6z7Ur_7xN-}34xV=>!VRd*4sGnRb`?hOZU$XqK z3+=l=)10#ZOSD=(JmjyhSk)crB&;gCanpIr??2}~m1uZ6@%}^5#=)@3?{+-y%bXv+ zaB<0J&{1^J>U$pdS?8_#w`6wMG-rO>Eu}lW16IqkcpYDLW$~Y9zxDS2`E*V8{kGeA z)ptu*EXiBuXZP#H;$1Q7-dN_}*XMz*`@ZXa%GdjDhLj(U z|9dq)_xi@9^*_1b>yAuz_p4vREA#pm-Vaon8?=dk z@!cgw@k~66e@{DP%elh0-us1p-=^2{Z~9;PE~d|N zRdD3F;Ayk?v~QnC<_t*@Jka!X>N&s2XN$7JN?&^0u6XAexV3PLaPZZ}pi+y27k;)R zthP&)4~loR}B(rbNXZ={xI#a}%Y`1f(N&gH8QWt^w|Je6+o zE@D&f&N_95h$@&T6OBGt<#8S2S)~76q=hpg7PN@}y|@0}Ewk541)OInW?S}JLc3+^ zxgg7ZKlzN*S*8X=SUH|ub|{LoPxa4~m*0gLR%CKqZq>RQVl+3rb@3xmcYUspT=koc zYwx`WwH#j81jTwi)4ID$sN=`%`p@~>{+={c(V6ggg+jCw?@Nnm?=(R(p3CEAzg@D~ z+iJ;@$2Ve{R!rKpS$s#{r^9F5ppYgug8|(opX4F=nSv) z-Lv!e?Yz49&oS>;5m`q;ovhGY-|Z{z#5bN_bv`_>crWOmXeBJ%@$K(F|>x~!RO#$tec>Q6< z>(ezkcXn)y<-hcC)f3~Y)6w@XS!F$qVma^xIu_c%864Z?rYdvgeUnM2md&&W4yDti zVn0PV`ONfMxorC?$Io00SB$PFTzpZ|SRDAg@{ZZD(%6-Kx{LdHZtNJ1yWB#rAE>*aetkxc_1u-uZnqk2)tbw^ z`EALyTVXf%UwQGSJS%mV^s?-S7v1IWUMsb}JzFzn>i5W;onheuYu+E0|5so={qxjh zsoM2-&Q-3sV8k#PQ5O4}THFd#-}{u0P=MD2t>Bxfa|ME# z7$hH@zt72+`f8~Tr+(@Ki{@XIcPG5lGM2m~x@6b>Ghergo{{3!eOi3#`BsU!o<;MP zy{-y-UVnn2e(&=a&nG-SUCne_dH?=}`wy<-T>S9jl@&gT;n%0ES^YUK{*}|Ti`UPG zuJd>PZu@((YT~lJ-|y{iogl<_TBK>G{=#)K&WDmCuYc4@cVDrKt^c)}*yov(wynRv zcFp=-jf@5}VZ$khQYM%-pLzN2;`DRgk(YQiFH2rk__A%4fZw6uz`5JgxDuY4a(+-r zDZQCGeQT+eq3!oO#iuX1X4*Nfx_JF;Xp`Sdfndk2lRi&9pS^I|y;t4}TJuk5n9rJ} zW#G8I?)$pjskxF5(oJ9bXIkA&o~*S0<(2a-VeLMwQPeXJIx@w*H&e{(L+4t)y zO!;NI<#5n9^Tay~7d|LqviWu+d3X8V*Rgj!)#qMm3cq?XJ81b`@3ZGEWyELnmB>YF zSgwB=VfO1i6N6eiyw$*xV02z`ZS&pfyqG;iP9@awMsr#r89P0Czi6cGDbYQwotCzSh3`0f7` zSRY#$8$Qj;ZhGNdPoYV-rmZtHKKa~!-D}Tt`QKC@uID+WKgH+q4w2xpgF&kfB*oW7 z|K#oEK6l3bYU{-Zfv*lu5D2|`j7#>cy27+t$#DIwQ#MHDG^s26?Wy~P8_w2+iyv({^J+(tb>pU({7<)zavbgpo?p0s zc7namw7dyh>u+lvpS?2KefeV6gd*6SK#S*xmpdN!z0TYHc3WAsNz2rif8Oo?|L@%i z<^DOZ!nW$Z+xdK+nZ*BM`|rikcjv#8ed$$nH8gx{t;c}{R`IGeUuWSfX-)#k^Q`*nU=|DLxl@c*OuKi%&>oz|DP&b_u|<-xxf54au5kQ9*@ z+BUlwaci!cz-uQ=1U(GV>SCL*(TwBS; zQ~TsA9yEU5r?&T{Z~iO29S@q`oiRTD=A6~*HP>zD)t;++W;OZmxvlyOAF|YM-uL_6 z?r4T@^Z#A0zjf~J&*$^^r!cO06R!Jnj(c-{{I5&Xcd^UY6gaNSzglQ?y`DjBGCV2q zJW30&KRDZb&qLl^1$*Wfs+WUnzwf@E+rK_~`?}jfi5n=dXGlnsUL8vAt!LQE!M7LuD=7lj8Wi>ysFNv2uGb}w04h~;+n_(_H_rBy@=XfwpNoP zGIUk+rHt(d{#*-k-oCXvA#OgywG0E}QtQ(-%PrPeO)v=gR%@5IhNVAfvD<4`-}zCp zT-jZRu1vV{VAV&S3ht5t$AsVx%}0q2%%}KG*#V~ubaER zM*NdxpPxSGfhW*8y9Un5j6YbWUeeT>yTRyffPDjK2RZ1p3YGbx=j`Pz)v|CDWaJrrI!|Dr;8-F!~=v+5PWmzBb1Y^{4Qd4 z{=2-rU$4Cb4SRAYU!Br?*)#W?$SUVu<+eA#1?$<2;Z=L&R?sfGA(~mzhni_S_eEr#N!V=yQ3!LO5 z)&ET0@4oxz0k5g|)2sxZTF2g<`s(|%TQe5~zq(#?*iSW`ccygG9 z&R4^OD|g!1E3Ue-Vo%-{u@Lq(7ac-hxi>ji#x{9J1}PhT&3Wa}X*@vzo1b; z>z_|1Kff|nd*MQ!4gG98)oz03583wZ|F(5~Zt4Hn^1E02RG+InZ2dQ-*ZAkJ>-+Dq zy|e#$(m!u&@BCjY=Vu-4DBu74Zm?qy&y)0%e{Z()90Cm+c_=R2zLRBx)`<;;kB@zu z`P}s8{hH~U?Ee4xynNaIma7W;CztTb@X9aUrfMmqo*CW3NLN z6Lb5@oK7Vau{8)kk=$$lK638tWs~1N**bGl<}$~ZTpVYXFTRp=`say%&ui2_OxVA< zp40Tnj7z;b&;K70_Mh{yc!hvVQ}p7-{+ef;sy%F+ul}_N{|a6f8ld=GwL^-=B8Dx-(#jY#m4^lwCidg%;$f&8e>-+;rFv{*|Vi(Y8sPgg*h(#llSSn-X)tI=#?w z-Kt*Be@}ki?5``(SnnC3emp*Q%CDe$W6@WE?y_62{^eY@)UW2Lc6{dh(7Qs%bL|xu zUg_PHcV=r``18FN`$A1~-{!mz?pOaZo8jh*pYpZ$EG(B5Uf+D>XpR1{(l#0O^WM`} z^GciLl-3`rytzGQw(z1;U(1$N%{&nHjT_FxL!Uwr=AGe>V2lu4%2jv~#7r(25WKY!BU4 z3#J_WbJ4)Tx6}M~Ni-+(6A2-yU)}qEberW~wy50CW21kiB#2uvcG;(yDV{GBnqOKz z<5_e3>-G5iPU4a!^EDf$2Dm=?;m-b8xUTAT^!-~_U0o=uUj3?bd|JY(`@gH}*Y7f8c)mefDwTvYDCwB7w_)PxBU-|Q1N6&++1 z-xBrj=J~p9d*hcy%8JXJvh+Rh0@T)DE&X}r^~(EKE?%6Ff6w^)SrL`B&!29t01d6! zoqw72&gXsb!(|tXXIsrFzQw=$oXW%1d;FV%YdMcTwfXmR{{Np>%F?(JmbM)S?eAav z?tHaM&F_`|wX2vDilA$24zQeND7ISj=ZpXU67Ks;q{CR}3N>{41Ww&=+%ZqjBm4Tg zT;>xmIVSNbOa3_fS(wEmLG9sko)`D)|NjlXyJ3-&J!m=M^1JhSHmEN!waSQFxQb=x zrK8I4rzSXWo37fg&NJbI|1=rzrg+PJHs-%Czdtnfc(Kpx>+AFT(`V*7)NOn^WAlDa zr>A@Vy`29qQ(9#Gd8OZT44mznr4F3W{!|_pp17H1y;AeXuaeL9sHIFT2#>RuT68LT zrjXJ5=@(+prQg$6-0-Im+USv@Q4 z1GD@Ohu?djmCwH)wX0%jTuS_>ie2){f|Cw~U%k0{na0`opWCGKGWP#0-1l{D{?=O) z&iPvI`*Ut}nySVWfru=hWwB>}p4g^*ea4@A!H+-9_P=||?&{VQJ;yaN-b@LLV;PF? zp4gW%|5L=anUBx^d-D0D;j=qSloJlcbILvc6)<FoaEG*-+Fo^O%0~ zBT*g?hSl??C)fYJegEDy%XrKDuRrAfUXQo*Kr*O$)O z|Egnp?R;+r?XN1oO>fQAp6@)3Wy7YoImTc0uCKo17oqv}h3xwZ_uo37XR2i`sUWY-Fki7>xBO?Pi%wvwReOCSquL=TX|yR^0H@AVb|}}?2FWDnfm?2 zr1N&$gPA|eiH6jjufAt2y2H!X@B67Y-rr20zXlz$c7FGhN#1eg^NRdF|9NwGLS7bw zjx4OQEs%^k*YG8C`P^%NFX{gcnte?xao($afkIiQ-ttU2e}z%|{K^XfG6e@1a}QX( zmt8Cy>-PPrZhocr>{YK%$Nwv;zR#nQKDY79o%t`{Zu(o|xsoq}(>Ue9&xP%BS-&ST zzGsmTy5f04p|PDs-is-f(?F*F&&Ri4E7xCK7kygwx%TsivG1$GZ||Se&hzj3PoMOS zbH2YRza}cTnlIw-gU~)r*&HE_6DAoytF0>gTlg<6)Vbft^W%Eu+V_sTo;=z2DsAd} zr$fqD8M94XrW!=foBlqGN%rRb!cFl%`&0}jJYMrIHuCw6%aIz#X9{>Y@utr$4P&3I zVybUybpO2l@6GnvrZ4UkpP&1xW$OL#eg9XQzRa6?-?z^GDx>ySll@b>W3~ z_T0uNHcxk~zMb^XZ>@j(+AG(q=D%^adz@o_{0_hCQ<-PQ{uSEyx5_y8t+Yy9dhVHx z+5z)*%whZgJ+q#ko#0e%x$Wh$1uRHC`_l>)ttppSp9atW6(T)j?K^4Jxwe~91S;%| zPRwb%zmsi)(5;hJzo$4ps$+OPulil)=^P`5xq6D62C3DS^XeE@TdhsGwO4A#JQ2(I zNTanOR+m+D!eT>>EaIR4x4!@L+?w}O8Gn>)^jz@JS^n3BEsC38wM}dM#iC;LHr%Su zmF>@JZ-2Je!n?_xSwwEE?9 zp+i3}P2YFrkP9c5noKa`8kXu$(PxapMfdomuPQm}ZL$2&H0N)Irc0Y5R&M586}F&s zol$F&lQpMw@9T>2pxw%M7YaS{vVGAW8~iwVnM3M5WmEOi2ftpg&o8ajV_eg+N+`+e zt$%~|FUB=3Gd7)BwktU`>$=SArPJefg)(SgpK(H@fiv=J>ipupr#3#Xn)Uc>cJS*W zU!NPJ1b28z;>5Q{w!3MoqDmCFj#EmNugkf3~i# zUCWztUEx>B?K27`OfHc^kG$9?^W>#}uufdcvq-&VszP{Qa>=a2o|6+?nj-9fPPV_f z?4VcpDwYLVT5DcDF`by;V0WCq<^l8DKhHnU&3(1*)uqXKI-u-eZTdH5+f3ExIm>dN z|DGJ+zU!b$MJZ^9N$rVRW6uv-^F!@E*PJ)YyJI0Lu;PR48kUvDoOe}hK6m=pB&|vg zZk_YYsx_{3y0`dpmfc3C8O#2h{(D==arU2ipqZ2~@gnPm3rd1lDLh;8DrZLKr%fs> z(>{dmGC1pcC}8EonTrhfzl=!^>i;xbzFe>9j%7cmeQLb@=b7iX{Pod&(cYA9ea^=I z_fJsss&$&t*2Gd*pS9BEYfS&(%P@dB5k~=5$N7y0*ve`ivLtyO!N>kVw?0_=z!Ps={!v78?2en+W-G-f8QzeGiO3- zf>q+2l4`FHT8V8lnIbsjRgX;0Rr^v5Y7;U9u^rf~vLhf^G%dmY_$DEyh{BVq)3+!@ zIdQ&xHmOgwm@^^t`$`|%h|3Gksy(;&w(3|a9W`x_p6uaEcb6^`neE4<##yXlGVNS6 z=nS2Z>9c1(+3YQ#JipS3|7KbfBWJ~v9jqH7G(SmuJ}?fxZ~N(l^4jF!CPU6sPqxpz ze?5jdVr95!nV0OjYP}XN)1_+9&F9s6zbM*O5YeZ3z2S{J)5ewTe^-7>3qClXWy2*- z{pTuMHMiF7VhC#rlElq1;+vir`xLwa z&7a@?KP$?daSh9L(8S$5`{@i}>tZ<*K(onjx2~N0Q|`&Hi0h|+vTaa$u78*L^E}Yt zSoQvy`=Wo^x$dfbYW<;Azh>dxc`KJO8(6|dkXuhS6tFcLADGklv-rI2cHX#j11sho zk~_{Ol&~E#whdw1^7#)-zR{1_=Ylyeq)f1VKlOqmliBBq&!2ytX=m_$cCKp8l+q>! zNe=%BTFv(>ZM^@jGjL>EoZVpC{J^r!$GjADT}pyK>nS7CxNQ>;gfDUSy!U&t{NER0 zzb9{SsK2#x=ZP(C`~TkFfA?GUd@_rY(5Y2@A(qEj z<|!SQ<17f>kh$;EPS<5@r++{Be16hn4+E9w2FIs9f4bREK;iYA-#Ny=CoMP{;}oy@ zduHy_+RL@t$A7FV-=yg zKlg*%@>{c4vz++!%N}$Z-R)J`u36FBW)_Qb`lS93DlS@ka?)+k9zyPrrEJq|ru|;_ znrB+F2d`&?uI$!zyWi~+JK$w|-Z0HR=(x})U){52!PQ0oKF_w)R>d zs=nVX_m}27y)V2&JNVDDuQ%Ieigz*hwH^F4^LfnI_0o@3=1l*7^2?N;aZBr-)m+=U zqbc<3-IKrF&V~EF&6haptdoVI9dOwnuVGzna%QHjfII zf2Ov-o6BOUaL^(9mC>fPS#|!L)=#%jwTfn3v(QL1JEr>W*5L0?&F5(H3NQQnq21o5 zwBFZt*8O59o153KTz(V0|J}8%2@9XtJh>5Uzv-OWqFvcn%kvbU?s*h!RvF5v;5U+m|E+#Kv&42`>4hG)t*j8 zoVno!d5W*Ktkxaeb^)?GhaqeS&%3k(hK#FcZPH@S;A~3Su#?G$^HIu$?aLgaPB@-= zHE9y#XBOtH1=h_kZ|0S5nC1I6_?zMJ4VMmuPy9Tgz`==GwBy9j6Nb9eto%9qQ+BQX z#dqcJ)sx5T6L=nnW|$~0e)Zzo{5rk*QCAFo0jZZ zp#OaHp`xp@J|DOeQiUNKIvPS1nsudO}?+$zDii*7+|Llb4)xZVK>LeQxi4 z?q*P)cvyE!qE^h*0~eQgHmqRs@LuYacG*{chr}x9t4^}%`*%Mp^4hU#U-)LGNKi<=?x*$e`T~(|gCeuw?J!aX773rI_L0v{>@EGnHj>wpbc+^ z2GtP7)!?E01tzLb9 z$M-dS5!u()ykrR5wJP(mRRZTn=E)9_E+! zT9wH#`PBX$Ah$C_lu3rX_SgRWSpNTx>Yq=iw{B<4m?&#NU;B7}R2~uDPfe(Ve;N`}r%)pf%px zf4|#Z&Y&H8b<5oHdpntDxU3Qe+v}~A*!a>a>gpDwmkN^woOhkv^XZf}X#3fr9efeS ztt?_%b4-I{ZQt#9yld~bTdQ|Jofd7?F!kMxe4lD_p3wB6^ z*xv%DT}NGbH!b}gs-iRD_Tpd>CZ8rQ(^Sv9s~&`w9`JhGwRBbd-?uWLC1jvo2cTUg zx;s8R>elBreb@kG1_3})UlaBL&%~v~;abuMe?=mG8 zwZK=w%jDN2TwcQJwpoAXI&H-@w%=|nW{$`dQi$DMmJ8bG;@7$kkve>OV#{tWc`UecZ8-pHh3ySGSPt}60#w${aqzY_lh4V^78fCp=rA6 zRmhUI)L#cZR|UJvRiVH#WU*-hF zZb&*kO*i+XNPHxNnxn66gy|}$MWKhabauroy!daMztzhn??4BDZ_m5CYg@h3ngd=F z4rF9q(_B91Qf$q~qjw*+%iD$Szhamm1kLOlo-C7gSbe~O?anX9##zt2uZtz@T*{|f zGj&$T-St`;8|Exqy_&OSZRF-U1C`ewdL2bNg>c+ebu_E!D>ztOzjb6IDkK#$E! zh*VLTpx|78mp@@C_qA^QeK+K)|NVS^JKKmsd~vWSlTPcbefkequkxQbA-Huz(EL?y zx~1Ev)!FKTwvVlzJM)nC@BdFG`t`nAGI9svv3ZoV?*w0&X;+G@?dVMY)wRN$#8P~AD>{vO|DMB@| z&1N}M#LQ>f+bps@g>KHWy0Xgi>f2Sj;zQe~Nr)edTGMbX=2aF`1ZY+2x;>vx zfseeHSNTkmQ77S%N=@kr#r6`=`GMc3ZQrxhclNFKldQbdbrOQ0bK@Iw(q7-0YvM&dZ9epyND3WWDaLT**E?`_#cgH*2nGudbBdt9-uI z;9BbR*lXaqQO7kh@&}4eg{+Lc_ve{;x&23B`-{uu)?~&qhB3j4x=>b8EsYEO{3>?@ zUS67{5XLHhX|JkL!1a3mhSm_qHCGm}I0}cXdKtKRiCgN)`;T{R)(Ov*;*Eb=Rx0Mh zpzXM6cHXX)p!K)WwxS1^rbYkr-G0CB_g02$OQ*-(vPxXK&o3yKbw($&CiBkQb}sy{ zK-imYxASzrOjx;pm9#JDIOeyOl3Pw&&COug7W&F}+N-Lmvw|5faK$aXmohUiYRyu! z%O)*!+`dKD}etE&k1JO?*4wgO+3;FFP(6Z$(o#vuHfyF?6M^R<)C%YpbHURpD6$H@%VPD=>PMC z4@6acmA7R0yd1h!S2(-mz}jVtJsp&cJfcgWCWDLTu#_E4vV*fP3 zGuQJ+R?PF&g|QpdBERVe*F2qJ{4{(Qciqp^@$W!wmUj=^<;4y#iN!XBvCCB?fUYJh zd0%ndI?DG|`97wI%#s65jF7#)4Xvj4{USKIU7Ca@I)t^Z-?Xm5rF7-V|I5Ss-EGe^ z$giopT-vaTA^qA)-N^9ctE+soj=wNkId{F=*|6}}HX+B?gASuEJ^JglHl1>4YR zZpAR&an}k4*N_QHS*JGG=)az|Xan1~SEg(q6MhFaE@qjqX^CIT+zEkq->tro_R7uI zI^z5H>zD6t7rL^g%Tk}y=?G|ncJ94BJ3(6kqPY_oxflME-S+?A?{aCgoELsJACJ6S z)U7wG%Ev%1;w8L_G<{%pYh!AOLf)4$rm(*&*)B_JZ`Y2Pc)M~-urU$-d#;C7Z zaqxfL^3`?6SKnMF`(}2Fl=1alRX+RV2sc+SW!a{;tt0o1;-UBAof@?Qpci$pZpBw#{;OUi`xR<}bK zw6j*}US7$t`6c@XA*mPst){>BTwQiw(%^EF>mi|)3(M~my6>K=$;J3=)vK59cE7*J z6h1TS!z6FLm)F)rUVgjvdffVIy#rp`56A!Qzi{0uA@0@xE8y0wn0tNH!F^mIS9jId z?_cbD_Z|DDR~xJD|I1DID*ZMobo=N3Kd+ZG|NXi{bK|nz`~TlqGAloJtzY^1!$Bk_q)D4Wa)(el21CXUxhF=4_F$Wu2Of;L8|c(1=2`{pT~rcR}|KH$`$r zLQb1eeg5UBc>J4&t815)`0dcD2c15!HcbX}%E05RzrMbXws?Id*gtoxY3%x>>K7Uu zIs1|F!BRu1X{&BOwo2&TefNEb>ATvNji7|rXmqPEby;8dGZf+TzkG*$M^1&i?IF0xQ1)PvwbXUg^t{+e!n+*`s$K{uh?Uf*Oivu z$rYOqI+un)j7I^|+VD=^wctR^wZGTo~YGK915gftgd)>*CpGT&OyAR&N%TmEI%mCLxp)=q0U zu@sOW2{`yq`5BaWDT3Xldbz%Rduy-Y(Vz9gKPg4 zH(qs&Wt}k(S{(@IpE&UUMR6K8lY~giTkrkK-ZR(!zFKlVwzKWZ)xz_u&qWkh>TTH7 zyLz?Z^_9_Ac@k8i{kVjqQoI6R-piNEA1GP2TJU!C+Zij@ohz|FpaI&L5356ye6C;3 z(u)=GX=VN5dwr$qw&mw^KCfK;_}%=K%wijAXRch=rpeiO6>%2VE1?!lKm#$;_vsD(dw;mK~Y!{)$ zO=$AAb6kJl>FhE%@XeQZhIFau3~f_}8}nehOThg@Xn!Qfyd;ewBI1=61N3AkkVy>9 z&_)@ELtGDRR0AZ@gF*~<=X)525;Le)1Rc=;@;L)E`GeR<>1KnhF}FyLG^38hfuo?a zKp8+svmTPL011JVf^b74G!KI~Y(fW`7`MbjkHAjYYQV;K+l_&nt%wnHo;>JMsHMi= zcyIfGgg|E@gY+ce5!%+s4I3xXo@$sMA;A=}fj6cHq>X`rA!21u<>5mD2byvpBtfk_ z;FWqtTC9yhEN5|eeC<}ypdQH4Q(b;=iS;pvF^K6fh^vFtfX-^*@^wo{O{EgoUn5SBgB9WS6bF5 zyyQqYs8k#XwI)F`Q;f;mn}K_pgHr_PBphf2GIVPuUzS|VHm#3AOh-}N3St0*So1N3 z4K*wq5;`-#azMlmI2rNro(7rVsM=q880LG8{141TO sVKftsmMzevK-(g>WO+H%9tMVp-%~|aO5D5o$p$3k>FVdQ&MBb@0EkP}1poj5 literal 0 HcmV?d00001 diff --git a/apps/web/src/content/pages/changelog/monitor-pack.mdx b/apps/web/src/content/pages/changelog/monitor-pack.mdx new file mode 100644 index 000000000..ea7b518eb --- /dev/null +++ b/apps/web/src/content/pages/changelog/monitor-pack.mdx @@ -0,0 +1,17 @@ +--- +title: "Monitor Pack" +description: "Add 10 monitors to your workspace for $15/month." +image: "/assets/changelog/monitor-pack.png" +publishedAt: "2026-09-06" +author: "openstatus" +category: "monitoring" +--- + +You can now add monitors to your workspace without changing plans. A Monitor Pack adds **10 monitors for $15/month**, and you can stack up to 10 packs on the Starter, Pro and Scale plans. + +Packs are billed monthly on top of your plan, alongside the existing add-ons. Your new limit applies immediately — the monitors you add count against your plan's allowance plus every pack you hold, so a Starter workspace with three packs can monitor up to 50 endpoints. + +Removing packs works the same way in reverse. If you are still using more monitors than the smaller limit allows, we'll ask you to delete a few first rather than silently stopping checks. + +#### Get Started 🚀 +Head to Settings → Billing, find **Monitor Pack** under Add-ons, and choose how many packs you need. Need more than 100 extra monitors? [Book a call](https://openstatus.dev/cal) and we'll sort out a plan that fits. diff --git a/apps/web/src/content/pages/unrelated/pricing.mdx b/apps/web/src/content/pages/unrelated/pricing.mdx index fddb736e6..97b771c13 100644 --- a/apps/web/src/content/pages/unrelated/pricing.mdx +++ b/apps/web/src/content/pages/unrelated/pricing.mdx @@ -12,7 +12,7 @@ faq: - question: "Do you offer a free plan?" answer: "Yes. Our free Hobby plan includes one monitor, one status page with three components, and a minimum check interval of 10 minutes. No credit card required." - question: "What are add-ons and how are they billed?" - answer: "Add-ons are workspace-level settings like White Label, Email Authentication, IP Restriction, and extra status pages. Once enabled, they apply to your entire workspace. Add-ons are billed monthly regardless of your plan's billing cycle." + answer: "Add-ons are workspace-level settings like White Label, Email Authentication, IP Restriction, extra status pages, and extra monitors. Once enabled, they apply to your entire workspace. Add-ons are billed monthly regardless of your plan's billing cycle." - question: "Can I upgrade or downgrade my plan?" answer: "Yes. You can upgrade or downgrade at any time from your dashboard. Changes take effect immediately, and billing is prorated." - question: "What currencies do you support?" @@ -22,7 +22,7 @@ faq: - question: "Can I cancel my subscription at any time?" answer: "Yes. You can cancel anytime from your dashboard. Your plan stays active until the end of the current billing period, and you will not be charged again." - question: "What happens if I exceed my plan limits?" - answer: "We will never stop your monitors or status pages without notice. If you approach or exceed a limit, we will reach out to help you pick the right plan. Add-ons like extra status pages are billed per unit as listed in the comparison table." + answer: "We will never stop your monitors or status pages without notice. If you approach or exceed a limit, we will reach out to help you pick the right plan. Add-ons like extra status pages and monitor packs are billed per unit as listed in the comparison table." - question: "Do you offer custom or enterprise plans?" answer: "Yes. If you need higher limits, custom regions, SSO, a dedicated SLA, or a custom contract, book a call and we will tailor a plan to your needs." - question: "What payment methods do you accept?" @@ -52,7 +52,7 @@ faq: | IP Restriction | $100/mo. | $100/mo. | + | | [Monitors](/uptime-monitoring) | | | | | Check Interval | 1m | 30s | 30s | -| Number of monitors | 20 | 50 | 50 | +| Number of monitors | 20 +$15/mo./10 | 50 +$15/mo./10 | 50 +$15/mo./10 | | Multi-region monitoring | + | + | + | | Total regions | 28 | 28 | 28 | | Regions per monitor | 6 | 28 | 28 | @@ -110,7 +110,7 @@ Yes. You can switch between monthly and annual billing at any time from your das
-Add-ons are workspace-level settings like **White Label**, **Email Authentication**, **IP Restriction**, and **extra status pages**. Once enabled, they apply to your entire workspace. Add-ons are billed monthly regardless of your plan's billing cycle. +Add-ons are workspace-level settings like **White Label**, **Email Authentication**, **IP Restriction**, **extra status pages**, and **extra monitors**. Once enabled, they apply to your entire workspace. Add-ons are billed monthly regardless of your plan's billing cycle.
@@ -135,7 +135,7 @@ Yes. You can cancel anytime from your dashboard. Your plan stays active until th
-We will never stop your monitors or status pages without notice. If you approach or exceed a limit, we will reach out to help you pick the right plan. Add-ons like extra status pages are billed per unit as listed in the comparison table. +We will never stop your monitors or status pages without notice. If you approach or exceed a limit, we will reach out to help you pick the right plan. Add-ons like extra status pages and monitor packs are billed per unit as listed in the comparison table.
diff --git a/packages/api/src/router/stripe/index.ts b/packages/api/src/router/stripe/index.ts index 9a43c83df..40e7a5826 100644 --- a/packages/api/src/router/stripe/index.ts +++ b/packages/api/src/router/stripe/index.ts @@ -1,5 +1,5 @@ import { Events } from "@openstatus/analytics"; -import { count, eq, schema } from "@openstatus/db"; +import { eq } from "@openstatus/db"; import { selectWorkspaceSchema, user, @@ -7,21 +7,36 @@ import { workspace, workspacePlans, } from "@openstatus/db/src/schema"; -import { allPlans } from "@openstatus/db/src/schema/plan/config"; +import type { AddonQuantityKey } from "@openstatus/db/src/schema/plan/schema"; import { addons, billingIntervals, } from "@openstatus/db/src/schema/plan/schema"; -import { updateAddonInLimits } from "@openstatus/db/src/schema/plan/utils"; +import { + isAddonQuantityKey, + updateAddonInLimits, +} from "@openstatus/db/src/schema/plan/utils"; +import { countWorkspaceUsage } from "@openstatus/services"; import { TRPCError } from "@trpc/server"; import type { Stripe } from "stripe"; import { z } from "zod"; import { createTRPCRouter, protectedProcedure } from "../../trpc"; import { stripe } from "./shared"; -import { getPriceIdForFeature, getPriceIdForPlan } from "./utils"; +import { + getPlanFromPriceId, + getPriceIdForFeature, + getPriceIdForPlan, + resolveAddonQuantity, +} from "./utils"; import { webhookRouter } from "./webhook"; +// The addon `title` reads wrong in the "you already have N ..." sentence. +const LIMIT_LABEL: Record = { + monitors: "monitors", + "status-pages": "status pages", +}; + const url = process.env.NODE_ENV === "production" ? "https://www.openstatus.dev" @@ -239,51 +254,85 @@ export const stripeRouter = createTRPCRouter({ }); } - const quantity = - typeof opts.input.value === "number" ? opts.input.value : 1; + const subscriptionId = sub.subscriptions.data[0].id; - // We need to check the total of status page - if (opts.input.feature === "status-pages") { - const statusPageCt = await opts.ctx.db - .select({ count: count() }) - .from(schema.page) - .where(eq(schema.page.workspaceId, result.id)) - .get(); - const pageCount = statusPageCt?.count ?? 0; - if (pageCount > quantity + allPlans[ws.plan].limits["status-pages"]) { + const items = await stripe.subscriptionItems.list({ + subscription: subscriptionId, + }); + + // Stripe rejects mixed billing intervals on one subscription and every + // addon price is monthly, so a yearly plan cannot hold one. + const planItem = items.data.find((item) => + getPlanFromPriceId(item.price.id), + ); + if (planItem?.price.recurring?.interval === "year") { + throw new TRPCError({ + code: "BAD_REQUEST", + message: + "Add-ons are billed monthly. Contact us to add them to a yearly plan.", + }); + } + + let quantity = 1; + let newValue: boolean | number = opts.input.value; + + if (typeof opts.input.value === "number") { + let resolved: ReturnType; + try { + resolved = resolveAddonQuantity({ + addon: opts.input.feature, + plan: ws.plan, + packs: opts.input.value, + }); + } catch (e) { throw new TRPCError({ code: "BAD_REQUEST", - message: `You already have ${pageCount} status pages, please delete some status page first.`, + message: e instanceof Error ? e.message : "Invalid quantity", }); } - } - const items = await stripe.subscriptionItems.list({ - subscription: sub.subscriptions?.data[0]?.id, - }); + quantity = resolved.quantity; + newValue = resolved.newLimit; + + if (!isAddonQuantityKey(opts.input.feature)) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Invalid feature", + }); + } + + const current = await countWorkspaceUsage( + opts.ctx.db, + result.id, + opts.input.feature, + ); + if (current > resolved.newLimit) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: `You already have ${current} ${LIMIT_LABEL[opts.input.feature]}, please delete some first.`, + }); + } + } const item = items.data.find((item) => item.price.id === priceId); + const isRemoval = opts.input.value === false || quantity === 0; - if (!opts.input.value && typeof opts.input.value === "boolean" && item) { - await stripe.subscriptionItems.del(item.id); - } else if (typeof opts.input.value === "number" && item) { + if (isRemoval) { + if (item) { + await stripe.subscriptionItems.del(item.id); + } + } else if (item) { await stripe.subscriptionItems.update(item.id, { quantity, }); } else { await stripe.subscriptionItems.create({ price: priceId, - subscription: sub.subscriptions?.data[0]?.id, + subscription: subscriptionId, quantity, }); } - const defaultLimit = allPlans[ws.plan].limits[opts.input.feature]; - const newValue = - typeof opts.input.value === "number" && typeof defaultLimit === "number" - ? opts.input.value + defaultLimit - : opts.input.value; - const newLimits = updateAddonInLimits( ws.limits, opts.input.feature, diff --git a/packages/api/src/router/stripe/utils.test.ts b/packages/api/src/router/stripe/utils.test.ts index 048fd6b54..d130af448 100644 --- a/packages/api/src/router/stripe/utils.test.ts +++ b/packages/api/src/router/stripe/utils.test.ts @@ -1,9 +1,17 @@ -import { getLimits } from "@openstatus/db/src/schema/plan/utils"; +import { + getAddonPackSize, + getLimits, +} from "@openstatus/db/src/schema/plan/utils"; import { expect } from "@std/expect"; import { describe, test } from "@std/testing/bdd"; import type Stripe from "stripe"; -import { FEATURES, PLANS, buildLimitsFromSubscription } from "./utils"; +import { + FEATURES, + PLANS, + buildLimitsFromSubscription, + resolveAddonQuantity, +} from "./utils"; // Derive test-env price ids from the source tables so the test breaks loudly // (assertion failure) rather than silently if a price id changes. @@ -15,6 +23,7 @@ const featurePriceId = (feature: string) => const STARTER = planPriceId("starter"); const WHITE_LABEL = featurePriceId("white-label"); const STATUS_PAGES = featurePriceId("status-pages"); +const MONITORS = featurePriceId("monitors"); function subscriptionWith( items: { priceId: string | undefined; quantity?: number }[], @@ -34,6 +43,7 @@ describe("buildLimitsFromSubscription", () => { expect(STARTER).toBeDefined(); expect(WHITE_LABEL).toBeDefined(); expect(STATUS_PAGES).toBeDefined(); + expect(MONITORS).toBeDefined(); }); test("returns null when no plan line item is present", () => { @@ -98,4 +108,129 @@ describe("buildLimitsFromSubscription", () => { ), ).toThrow(/unsupported stripe price/i); }); + + test("one pack addon unit grants `packSize` limit units", () => { + const planDefault = getLimits("starter").monitors; + const built = buildLimitsFromSubscription( + subscriptionWith([ + { priceId: STARTER }, + { priceId: MONITORS, quantity: 3 }, + ]), + ); + expect(built?.limits.monitors).toBe(planDefault + 30); + }); + + test("missing quantity on a pack addon falls back to one pack", () => { + const planDefault = getLimits("starter").monitors; + const built = buildLimitsFromSubscription( + subscriptionWith([{ priceId: STARTER }, { priceId: MONITORS }]), + ); + expect(built?.limits.monitors).toBe(planDefault + 10); + }); + + test("repeated pack addon items accumulate", () => { + const planDefault = getLimits("starter").monitors; + const built = buildLimitsFromSubscription( + subscriptionWith([ + { priceId: STARTER }, + { priceId: MONITORS, quantity: 2 }, + { priceId: MONITORS, quantity: 3 }, + ]), + ); + expect(built?.limits.monitors).toBe(planDefault + 50); + }); + + test("a pack addon does not affect unrelated limits", () => { + const built = buildLimitsFromSubscription( + subscriptionWith([ + { priceId: STARTER }, + { priceId: MONITORS, quantity: 3 }, + ]), + ); + expect(built?.limits["synthetic-checks"]).toBe( + getLimits("starter")["synthetic-checks"], + ); + expect(built?.limits["status-pages"]).toBe( + getLimits("starter")["status-pages"], + ); + }); +}); + +describe("getAddonPackSize", () => { + test("returns the pack size for a pack addon", () => { + expect(getAddonPackSize("monitors")).toBe(10); + }); + + test("defaults to 1 for single-unit and boolean addons", () => { + expect(getAddonPackSize("status-pages")).toBe(1); + expect(getAddonPackSize("white-label")).toBe(1); + }); +}); + +describe("resolveAddonQuantity", () => { + test("packs map to the stripe quantity untouched", () => { + const resolved = resolveAddonQuantity({ + addon: "monitors", + plan: "starter", + packs: 3, + }); + expect(resolved.quantity).toBe(3); + expect(resolved.packSize).toBe(10); + expect(resolved.maxPacks).toBe(10); + }); + + test("newLimit is the plan default plus packs times pack size", () => { + const planDefault = getLimits("team").monitors; + const resolved = resolveAddonQuantity({ + addon: "monitors", + plan: "team", + packs: 4, + }); + expect(resolved.newLimit).toBe(planDefault + 40); + }); + + test("zero packs resolves to the plan default", () => { + const resolved = resolveAddonQuantity({ + addon: "monitors", + plan: "starter", + packs: 0, + }); + expect(resolved.quantity).toBe(0); + expect(resolved.newLimit).toBe(getLimits("starter").monitors); + }); + + test("single-unit addons are unaffected by the pack multiplier", () => { + const planDefault = getLimits("starter")["status-pages"]; + const resolved = resolveAddonQuantity({ + addon: "status-pages", + plan: "starter", + packs: 3, + }); + expect(resolved.newLimit).toBe(planDefault + 3); + expect(resolved.maxPacks).toBeNull(); + }); + + test("rejects more packs than the self-serve ceiling", () => { + expect(() => + resolveAddonQuantity({ addon: "monitors", plan: "starter", packs: 11 }), + ).toThrow(/up to 100/); + }); + + test("allows exactly the ceiling", () => { + const resolved = resolveAddonQuantity({ + addon: "monitors", + plan: "starter", + packs: 10, + }); + expect(resolved.newLimit).toBe(getLimits("starter").monitors + 100); + }); + + test("rejects negative and fractional pack counts", () => { + expect(() => + resolveAddonQuantity({ addon: "monitors", plan: "starter", packs: -1 }), + ).toThrow(/whole number of packs/); + expect(() => + resolveAddonQuantity({ addon: "monitors", plan: "starter", packs: 1.5 }), + ).toThrow(/whole number of packs/); + }); }); diff --git a/packages/api/src/router/stripe/utils.ts b/packages/api/src/router/stripe/utils.ts index 5e0c410a7..fd9e8393e 100644 --- a/packages/api/src/router/stripe/utils.ts +++ b/packages/api/src/router/stripe/utils.ts @@ -1,12 +1,15 @@ // Shamelessly stolen from dub.co import type { WorkspacePlan } from "@openstatus/db/src/schema"; +import { allPlans } from "@openstatus/db/src/schema/plan/config"; import type { Addons, BillingInterval, Limits, } from "@openstatus/db/src/schema/plan/schema"; import { + getAddonMaxQuantity, + getAddonPackSize, getLimits, updateAddonInLimits, } from "@openstatus/db/src/schema/plan/utils"; @@ -40,16 +43,62 @@ export function buildLimitsFromSubscription( ); } // Accumulate onto the running value so repeated addon items add up; boolean - // addons just flip on. + // addons just flip on. One unit of a pack addon grants `packSize` units. const current = limits[feature.feature]; const value = - typeof current === "number" ? current + (item.quantity ?? 1) : true; + typeof current === "number" + ? current + (item.quantity ?? 1) * getAddonPackSize(feature.feature) + : true; limits = updateAddonInLimits(limits, feature.feature, value); } return { plan: detectedPlan.plan, limits }; } +/** + * Resolve a requested pack count into the Stripe subscription quantity and the + * workspace limit it produces. Throws when the request is not a whole number of + * packs or exceeds the self-serve ceiling. + */ +export function resolveAddonQuantity(args: { + addon: keyof Addons; + plan: WorkspacePlan; + packs: number; +}): { + quantity: number; + newLimit: number; + packSize: number; + maxPacks: number | null; +} { + const { addon, plan, packs } = args; + const packSize = getAddonPackSize(addon); + const maxPacks = getAddonMaxQuantity(addon); + + if (!Number.isInteger(packs) || packs < 0) { + throw new Error( + `Quantity must be a whole number of packs, received ${packs}`, + ); + } + + if (maxPacks !== null && packs > maxPacks) { + throw new Error( + `You can add up to ${maxPacks * packSize} with this add-on. Contact us for more.`, + ); + } + + const planDefault = allPlans[plan].limits[addon]; + if (typeof planDefault !== "number") { + throw new Error(`${addon} is not a quantity add-on`); + } + + return { + quantity: packs, + newLimit: planDefault + packs * packSize, + packSize, + maxPacks, + }; +} + export const getPlanFromPriceId = (priceId: string) => { const env = process.env.NEXT_PUBLIC_VERCEL_ENV === "production" ? "production" : "test"; @@ -201,6 +250,19 @@ export const FEATURES = [ }, }, }, + { + feature: "monitors", + price: { + monthly: { + priceIds: { + // TODO: create the "Monitor Pack" product and its monthly + // multi-currency price (USD 15 / EUR 15) in Stripe, then paste the ids. + test: "price_1UChsCBXJcTfzsyJgomhUtYY", + production: "price_1UChsCBXJcTfzsyJgomhUtYY", + }, + }, + }, + }, { feature: "sso", price: { diff --git a/packages/db/src/schema/plan/config.ts b/packages/db/src/schema/plan/config.ts index 9dad7b549..3f1c9e26c 100644 --- a/packages/db/src/schema/plan/config.ts +++ b/packages/db/src/schema/plan/config.ts @@ -122,6 +122,14 @@ export const allPlans: Record = { EUR: 20, }, }, + monitors: { + title: "Monitor Pack", + description: "Add 10 monitors to your workspace.", + price: { + USD: 15, + EUR: 15, + }, + }, sso: { title: "SAML Single Sign-On", description: @@ -217,6 +225,14 @@ export const allPlans: Record = { EUR: 20, }, }, + monitors: { + title: "Monitor Pack", + description: "Add 10 monitors to your workspace.", + price: { + USD: 15, + EUR: 15, + }, + }, sso: { title: "SAML Single Sign-On", description: @@ -285,6 +301,14 @@ export const allPlans: Record = { EUR: 20, }, }, + monitors: { + title: "Monitor Pack", + description: "Add 10 monitors to your workspace.", + price: { + USD: 15, + EUR: 15, + }, + }, sso: { title: "SAML Single Sign-On", description: diff --git a/packages/db/src/schema/plan/schema.ts b/packages/db/src/schema/plan/schema.ts index 00050b375..deeccba95 100644 --- a/packages/db/src/schema/plan/schema.ts +++ b/packages/db/src/schema/plan/schema.ts @@ -94,9 +94,25 @@ export const addons = [ "white-label", "custom-theme", "status-pages", + "monitors", "sso", ] as const satisfies Partial[]; +// Declares which add-ons are sold by quantity, what one subscription unit grants +// and the self-serve ceiling. Both keys are also service `LimitKey`s, which is +// what lets the purchase guard count current usage for them. +export const addonQuantityConfig = { + "status-pages": { packSize: 1, maxQuantity: null }, + monitors: { packSize: 10, maxQuantity: 10 }, +} as const satisfies Partial< + Record< + (typeof addons)[number], + { packSize: number; maxQuantity: number | null } + > +>; + +export type AddonQuantityKey = keyof typeof addonQuantityConfig; + export const addonsSchema = z.partialRecord( z.enum(addons), z.object({ diff --git a/packages/db/src/schema/plan/utils.ts b/packages/db/src/schema/plan/utils.ts index 3b4d9b8bb..015425435 100644 --- a/packages/db/src/schema/plan/utils.ts +++ b/packages/db/src/schema/plan/utils.ts @@ -2,6 +2,8 @@ import type { WorkspacePlan } from "../workspaces/validation"; import { allPlans } from "./config"; import { type Addons, + type AddonQuantityKey, + addonQuantityConfig, type BillingInterval, type Limits, limitsSchema, @@ -66,6 +68,24 @@ export function getPriceConfig( return resolvePriceConfig(planConfig.price[interval], currency); } +export function isAddonQuantityKey( + addon: keyof Addons, +): addon is AddonQuantityKey { + return addon in addonQuantityConfig; +} + +export function getAddonQuantityConfig(addon: keyof Addons) { + return isAddonQuantityKey(addon) ? addonQuantityConfig[addon] : null; +} + +export function getAddonPackSize(addon: keyof Addons): number { + return getAddonQuantityConfig(addon)?.packSize ?? 1; +} + +export function getAddonMaxQuantity(addon: keyof Addons): number | null { + return getAddonQuantityConfig(addon)?.maxQuantity ?? null; +} + export function getAddonPriceConfig( plan: WorkspacePlan, addon: keyof Addons, diff --git a/packages/services/src/index.ts b/packages/services/src/index.ts index 839140752..fa50b9f7e 100644 --- a/packages/services/src/index.ts +++ b/packages/services/src/index.ts @@ -47,6 +47,7 @@ export { matchesScope, requireScope } from "./auth"; export { LIMIT_KEYS, assertWithinLimit, + countWorkspaceUsage, getPlanLimits, type LimitKey, } from "./limits"; diff --git a/packages/services/src/limits.ts b/packages/services/src/limits.ts index d583afa3d..e8736ba28 100644 --- a/packages/services/src/limits.ts +++ b/packages/services/src/limits.ts @@ -93,7 +93,7 @@ export async function getWorkspaceLimit( * The `default` branch is unreachable — `never` makes a new `LimitKey` * without a counter a compile error rather than a runtime surprise. */ -async function countCurrent( +export async function countWorkspaceUsage( tx: DB, workspaceId: number, limit: LimitKey, @@ -148,7 +148,7 @@ async function countCurrent( default: { const unhandled: never = limit; throw new Error( - `assertWithinLimit: counter for "${unhandled}" not implemented. Add a case in countCurrent in packages/services/src/limits.ts.`, + `assertWithinLimit: counter for "${unhandled}" not implemented. Add a case in countWorkspaceUsage in packages/services/src/limits.ts.`, ); } } @@ -163,7 +163,7 @@ export async function assertWithinLimit(args: { const { tx, workspaceId, limit, delta = 1 } = args; const max = await getWorkspaceLimit(tx, workspaceId, limit); - const current = await countCurrent(tx, workspaceId, limit); + const current = await countWorkspaceUsage(tx, workspaceId, limit); if (current + delta > max) { throw new LimitExceededError(limit, max, current); } -- 2.54.0