From 064c607a213e2ddcfe31d750d8cbadc8615dc9c0 Mon Sep 17 00:00:00 2001 From: Pamphile Roy <23188539+tupui@users.noreply.github.com> Date: Fri, 23 Aug 2024 15:02:07 +0200 Subject: [PATCH] dApp v1 (#27) * dApp draft * Missing contract client * Update lockfiles * Add dist from packages * Remove bindings folder * Better topic formatting * Add commit code * Use alert for now to show it's working * Fix default env vars * Add link to contract on-chain * Fix signing for commit * Move card to project * Adjust margins for topics --- .gitignore | 3 + Makefile | 2 +- bindings/ts/.gitignore | 2 - dapp/.env.example | 8 + dapp/.gitattributes | 2 + dapp/.gitignore | 35 +++ dapp/CONTRIBUTING.md | 10 + dapp/README.md | 45 ++++ dapp/astro.config.mjs | 8 + dapp/bun.lockb | Bin 0 -> 311728 bytes dapp/init.js | 36 +++ dapp/package.json | 30 +++ .../packages/soroban_versioning}/README.md | 14 +- .../soroban_versioning/dist/index.d.ts | 217 ++++++++++++++++++ .../packages/soroban_versioning/dist/index.js | 51 ++++ .../packages/soroban_versioning}/package.json | 2 +- .../packages/soroban_versioning}/src/index.ts | 35 +-- .../soroban_versioning}/tsconfig.json | 0 dapp/public/ag.svg | 6 + dapp/public/logo.svg | 198 ++++++++++++++++ dapp/src/components/ConnectWallet.astro | 54 +++++ dapp/src/components/Container.astro | 3 + dapp/src/components/Footer.astro | 17 ++ dapp/src/components/LinkCard.astro | 29 +++ dapp/src/components/Navbar.astro | 24 ++ dapp/src/components/ProjectId.astro | 112 +++++++++ dapp/src/components/Topic.astro | 12 + dapp/src/components/project.ts | 68 ++++++ dapp/src/components/stellar-wallets-kit.ts | 26 +++ dapp/src/contracts/soroban_versioning.ts | 8 + dapp/src/contracts/util.ts | 2 + dapp/src/env.d.ts | 9 + dapp/src/layouts/Layout.astro | 31 +++ dapp/src/pages/index.astro | 12 + dapp/src/styles/global.css | 32 +++ dapp/tailwind.config.mjs | 38 +++ dapp/tsconfig.json | 6 + 37 files changed, 1162 insertions(+), 25 deletions(-) delete mode 100644 bindings/ts/.gitignore create mode 100644 dapp/.env.example create mode 100644 dapp/.gitattributes create mode 100644 dapp/.gitignore create mode 100644 dapp/CONTRIBUTING.md create mode 100644 dapp/README.md create mode 100644 dapp/astro.config.mjs create mode 100755 dapp/bun.lockb create mode 100644 dapp/init.js create mode 100644 dapp/package.json rename {bindings/ts => dapp/packages/soroban_versioning}/README.md (86%) create mode 100644 dapp/packages/soroban_versioning/dist/index.d.ts create mode 100644 dapp/packages/soroban_versioning/dist/index.js rename {bindings/ts => dapp/packages/soroban_versioning}/package.json (89%) rename {bindings/ts => dapp/packages/soroban_versioning}/src/index.ts (90%) rename {bindings/ts => dapp/packages/soroban_versioning}/tsconfig.json (100%) create mode 100644 dapp/public/ag.svg create mode 100644 dapp/public/logo.svg create mode 100644 dapp/src/components/ConnectWallet.astro create mode 100644 dapp/src/components/Container.astro create mode 100644 dapp/src/components/Footer.astro create mode 100644 dapp/src/components/LinkCard.astro create mode 100644 dapp/src/components/Navbar.astro create mode 100644 dapp/src/components/ProjectId.astro create mode 100644 dapp/src/components/Topic.astro create mode 100644 dapp/src/components/project.ts create mode 100644 dapp/src/components/stellar-wallets-kit.ts create mode 100644 dapp/src/contracts/soroban_versioning.ts create mode 100644 dapp/src/contracts/util.ts create mode 100644 dapp/src/env.d.ts create mode 100644 dapp/src/layouts/Layout.astro create mode 100644 dapp/src/pages/index.astro create mode 100644 dapp/src/styles/global.css create mode 100644 dapp/tailwind.config.mjs create mode 100644 dapp/tsconfig.json diff --git a/.gitignore b/.gitignore index f3fdd62..8cb6ce9 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,6 @@ build npm-debug.log* yarn-debug.log* yarn-error.log* + +# Local Netlify folder +.netlify diff --git a/Makefile b/Makefile index de19ab0..02deae7 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ contract_bindings: contract_build-release stellar contract bindings typescript \ --network $(network) \ --contract-id $(shell cat .soroban/soroban_versioning_id) \ - --output-dir web/bindings/ts \ + --output-dir dapp/packages/soroban_versioning \ --overwrite contract_deploy: contract_test contract_build-release ## Deploy Soroban contract to testnet diff --git a/bindings/ts/.gitignore b/bindings/ts/.gitignore deleted file mode 100644 index 72aae85..0000000 --- a/bindings/ts/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -out/ diff --git a/dapp/.env.example b/dapp/.env.example new file mode 100644 index 0000000..5c2bab3 --- /dev/null +++ b/dapp/.env.example @@ -0,0 +1,8 @@ +# Prefix with "PUBLIC_" to make available in Astro frontend files +PUBLIC_SOROBAN_NETWORK_PASSPHRASE="Test SDF Network ; September 2015" +PUBLIC_SOROBAN_RPC_URL="https://soroban-testnet.stellar.org:443" + +TANSU_CONTRACT_ID= + +SOROBAN_ACCOUNT="alice" +SOROBAN_NETWORK="testnet" diff --git a/dapp/.gitattributes b/dapp/.gitattributes new file mode 100644 index 0000000..a172dd3 --- /dev/null +++ b/dapp/.gitattributes @@ -0,0 +1,2 @@ +Cargo.lock text -merge eol=lf linguist-generated=true -diff +package-lock.json linguist-generated=true -diff diff --git a/dapp/.gitignore b/dapp/.gitignore new file mode 100644 index 0000000..2b8462f --- /dev/null +++ b/dapp/.gitignore @@ -0,0 +1,35 @@ +# Rust's output directory +target + +# Local Soroban settings +.soroban + + +# The following is from the Frontend Template's .gitignore + +# soroban/Rust output +target +.soroban + +# build output +dist/ +!packages/**/dist + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/dapp/CONTRIBUTING.md b/dapp/CONTRIBUTING.md new file mode 100644 index 0000000..2d24f2f --- /dev/null +++ b/dapp/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# Contributing + +This is a guide to contributing to `loam-build/soroban-frontend-template` +itself. Feel free to delete or modify it for your own project. + +soroban-cli requires that the main branch obtained with `git clone` be the branch to use as a template. So we are keeping `main` free of artifacts that do not make sense in the context of a `soroban contract init` template, such as the `contracts` folder. + +However, when actually maintaining and improving this template, we need these artifacts. + +Therefore, to contribute to this project, please check out the `dev` branch. All pushes/merges to the `dev` branch will be automatically pushed to `main` [on every push](.github/workflows/publish.yml). diff --git a/dapp/README.md b/dapp/README.md new file mode 100644 index 0000000..a438ccc --- /dev/null +++ b/dapp/README.md @@ -0,0 +1,45 @@ +# Soroban Project + +## Project Structure + +This repository uses the recommended structure for a Soroban project: +```text +. +├── contracts +│   └── hello_world +│   ├── src +│   │   ├── lib.rs +│   │   └── test.rs +│   └── Cargo.toml +├── Cargo.toml +└── README.md +``` + +- New Soroban contracts can be put in `contracts`, each in their own directory. There is already a `hello_world` contract in there to get you started. +- If you initialized this project with any other example contracts via `--with-example`, those contracts will be in the `contracts` directory as well. +- Contracts should have their own `Cargo.toml` files that rely on the top-level `Cargo.toml` workspace for their dependencies. +- Frontend libraries can be added to the top-level directory as well. If you initialized this project with a frontend template via `--frontend-template` you will have those files already included. + +--- + + +# Soroban Frontend in Astro + +A Frontend Template suitable for use with `soroban contract init --frontend-template`, powered by [Astro](https://astro.build/). + +# Getting Started + +- `cp .env.example .env` +- `npm install` +- `npm run dev` + +# How it works + +If you look in [package.json](./package.json), you'll see that the `start` & `dev` scripts first run the [`initialize.js`](./initialize.js) script. This script loops over all contracts in `contracts/*` and, for each: + +1. Deploys to a local network (_needs to be running with `docker run` or `soroban network start`_) +2. Saves contract IDs to `.soroban/contract-ids` +3. Generates TS bindings for each into the `packages` folder, which is set up as an [npm workspace](https://docs.npmjs.com/cli/v10/configuring-npm/package-json#workspaces) +4. Create a file in `src/contracts` that imports the contract client and initializes it for the `standalone` network. + +You're now ready to import these initialized contract clients in your [Astro templates](https://docs.astro.build/en/core-concepts/astro-syntax/) or your [React, Svelte, Vue, Alpine, Lit, and whatever else JS files](https://docs.astro.build/en/core-concepts/framework-components/#official-ui-framework-integrations). You can see an example of this in [index.astro](./src/pages/index.astro). diff --git a/dapp/astro.config.mjs b/dapp/astro.config.mjs new file mode 100644 index 0000000..461bd30 --- /dev/null +++ b/dapp/astro.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'astro/config'; + +import tailwind from "@astrojs/tailwind"; + +// https://astro.build/config +export default defineConfig({ + integrations: [tailwind()] +}); \ No newline at end of file diff --git a/dapp/bun.lockb b/dapp/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..05f81d60da5a4aaf9f627741904d822152a927c6 GIT binary patch literal 311728 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 +kKGCCdduyd-jL z+iTGVYtqoY7@IX_-R70BgrVD)cP8x;unr$Af_-S%8Sm)CrvIK1`y1~Ep!*;8lcYfR zKkO&})t&w3LH}VtNe+znKgH&Y-p#SiF zqxl!?Z&#wjTh5BwId9b>ai+D_{aY6E;iSLU6R}0DgQ{>$a}A0e$9<`G5w3EOO6#iS z5%?WdyYxY_D(B`Mv!zf!IT7G}qXoJaT#3`CT%D7(0TXHz*163-hstN$o7uIdW{}HP zq^+lB5fA4jtHiPb8yGTMQQC1{t`d8seUKUx4aQ+669we}mk#I#qKuN{A}jFoACHf6 z4s4n3kLD9xc(!%d8tyyl@Ojf>d^Dc5Mjt%qBoW+tzjx3+XZ|dcwBR*tJR50lJJNFq zaOr_AsESoeLtf4LG`{)$Dn-3c8PR@UYje!M_R+<7mO4=eadk z>H1lfuCA8ocq%GMVcivFElPYhKBgo-!%rtf6lfrXCN>hQCV2<^9%B55{`w1wa4}hA zG18vZFIhH5;yBd2u`R{Z#c4Z#fFq}rZE$of|1$K!Qu3>$meN;=?b1BD*{8((JQ~EX zNA1N$R$+bMeEnY?>2Dr%dYX!Xqu%R!zp|!U+}0`VZQg}h3PabV2br131e@{=Z@;Ek zW6o!gt{g{de$yArrY2KGBECNQ;{fiHlQ7QjGpqmd@Vg%MUjt>ar?HBqK2j4`(^F@L zah3D06vtcAiNeMZm+d2IZmMWT4PiDEE0lpnTxC*lHv-2CR-lX9Ag8=B9z1eC!Zw8S@XYd)49d0_H*Y2&4{ShJ<;7`fXr>0SB&^!( z0nvp3&frEaKlZH~rGftjTVIBT<=2CH!!CgwGwvSjul7teZ@AD-3S-{;<$LP4%%)oW zJ_G(QzrXJA`u_%U&?xRAF^}Pk$79k)s<_xc82V})+UYfFi;VUOiLmiVm9P7Yz`5Rn zH&+IIC7rUUtiI+|FFDPGY6acA#hH;4!2NYM&;K`&?FVfC%5_*yJ_>UbW5KH~RZ{_u z?64WlXOX_=pOZ^V)H|&oi$4y{j=T0#g%wIWh+679SeVsv=H3U6uT@u~0bI`iSAYF( zJ&sgPo1b0{6V&S;-QlcriaDS4a~|rG>Mha?Dca0-8saEqPZLD6#1xs-P8qS}?VLdy zw}F3NhzBQzPm!l%1h`y4HzPNVi^@26#W$v@=d+^10H3^bM+5)V9d+5B7 zM7D@WC-8aT1-i%IhP&JjG?#>SwCQ?8%o922pE_PMcV-~{P^uWT%YnaH{<^<6Fdnng z4Mk`KpY)t5UxV4g7AW%i(x{*QyiNoVFCWn5ABb?dOT4Ead9gF$sIIY$5_5}#Fh-D& z6I@IY-tiPU`+`*cQ|k*SNi*0PFBi!~0JB@QPsJybAAM>>^lxbF04_h!MLD}KR*Uab z7tNsd#ANBla^co6EPtV*gvT6qKnA$gx6B0}hdHT2mDe!{&ozw@25qkQKe9uFr& zES|<#42NKOX^<#|SDT3ph*t#YPCsRo`3%N5Hy*Op?W>|9y)X#D)u8vjvl^t% z-XyF{g?yrqTj>9R+D5Eat+1^qFSH`mU7xspt|N(29xF0o zu`EGbt$Z%2#|tL<&=WnBAMc_qJ)O+aj7QRSr`zQ>^Xu4EysAA?0ogt;v9?}BXfi*L{1Nb72-piL<&bs_|1w7MBBxP z%e)!qW!(5brzX+Bx>X?O7G`ZLYS9B+aiHrIoYnP{F49b4Vmb z1zrU_EX7NmYcMOIa=Oxzac1-dzwg;KdDMY#*?rD)e@L)c4ojUjVL}T|ylg;@wIi(~ zN4x^AuS)`58;0(SNTk{2uOx$dxbovBL#Dy>3yi}d)R($4_6oJK=qq!m`ANi&1Icgl zUhUQdyN=wEe>i)2e&djsG*_btoJUCk-A`NPPIsnpWNSL0Z~HipL-`Vz{c1v{Zr{Nx z7Y{qFHv)dH8C28i2Cb-uo3(kE)aRB_U%}Fu+s+iyX0eCY{l0VM-*_Pnbp4W^Nu_w_ z6qRM5dL2rY`$8L!(wAScNyuk7SyAp>pe4+(z@?y{4`mD>4KaQ&5r6liI1IZptf=rM z-0VyS!5QGn09{TPizhW_BF2p5yPBR$egnBf0Z3WbBQ^_T6HMzkdWduC$9gkbC?%AV zQi2f5K-t|q?*4KQskf*(bkSYpg#rLq7U+JTqXG|4mvTNm;o~$aQ7eWDwfF=RfJXs3 z<>rnGkMh~U+QT!i>?HeG1EY8Mowff-;aXVQ|PRhFth_Ygkk8Y0Inj?eKpkb8WW^u{KG(J z?_TF~6XMdgUyO)y8)sz6hy1SiTH=-o8no<2{i<@yV2#05yf!%&RyD0vMiHC52bl*!JJJ<||ePvM~^c~sZdhODIs17Q?OFDmqZH11iarmSh`A%`!a2o7s>^;YQ zynu#Huo)!{Erd=4fl?tFngYQ640J69^X{5uhlXbmsZRaOGl;pZTv^)d^H5{k;UOMB z6ns#@MB*4NZH!g^8LsZbZFY+v`5c2ruG@JX-S2kVzVQ1ln}6?xGSDqJ;KtmQkkhK8 z?zw}iwMfbOCUMu1yd|4^LV&bhJi_;wAgK3qZcgkt%oZ`+#Fd3Lh$51VJE$ewur_dB zAT}4^ssP=?=*M85_+3KE=^V2oy{8ue)XasH#VMJoa%{c zn1r6^w5n3qLOu`{m4J1K%yU%&TvedEDU;{8>hqS&;3WX=~JpI zVe)k^6%5%A5FH$FN*&7HN-^|(F^@GzXWF)Ge|uZXeM#BV7-$;dvt1 zsoZMaT3x#v-3w0yL%PEYJH@cC0^EQ10RC~i_vK6odsp+cQ0tWZl$&zR?tEs3<2$ok zqhgcz_%~2Ake$Dtvu@qoysfC_Nwf{qf352of9_M0Uk)-^-KcYWX_HV#;4=7GErgd z@_2_M;CGfL(AC6+J>$<*gvH1&@TNUpoM`26_jdw!s}_}V#5;57AM^QcHESKI{&lnL z!Li3}szE~JkQNA`*Gp1iP3*$LIVDW18WM)dcS8F)|?pL6DQ8xVs5>Cy_ zrM7qaBQ3$?q&h#eh6T7l5oW7OA{jB;?u$(iGJ+Ib@MjzpR?b1`k$6T}g06Z%&97;7MP><{H{ZK`v(y>T}4a65!|s#{;>xNM3r zXJFQua(h+GNX#y9MHyjwXGE(49Ord_ZibedJhqlfA4=3KvNHn^4oqGqz1fl+(skZ~ zDRvSLRA0uM#5>)KiRkOgxRtj^gK=c;%!Cu4_1dac3`U%AfzN|3&<#8*Fmi@0>(y1^ z)MkpkZ=&z4swdgzS|!U^YLJyDYFv6kt2r&oK=I!rrdD)JiVbF8rJyR|_F4Z4<6mb* zr3J`?9?+Ga@4f7)cO6}cAheB_p86<9Rz(>QPO^T2Vxb`qqYb6*Vsd=BGV8T>BeT)z z5XOsR)bxDBU|1`^e{+lgx)=qx`arj(v;n&GA~~{)&n%RT;Cye{-n%en4N=(%)D32meVOoOrLvbAdiL)^8q;TGXT0fU(owwT=weRW4Kf# z-(?rHf}u%9jd_aG{cHqpIHHz;?6Us~bIXJ+4)aL;Q}!%tdFk?OU#8(c-!M8PgMJJI zh}RJ4vh0M4mZit!+`rFB;Ab$5mVz5*xQ0badW&;kdNH$fM*+FX0{>Qp&l2JSpJ+W& z7m5~h`)$sv*KH>)gihQ8R{+-t=n9EQ^Q2anWwd=lz6qH#7@0+eP@+jc?L9FUjz`eLH!ty&spP!P;{p*N&eZ+e?*{!c&4BLiTS!;;blUm_aP|c+ zz3|*hvkv_6)7m_`fg)Vp#x3g8A9z^r8ldj*loM0$Hq|7;6CYM2S!VTyGg27iFjx71 z6-E6UkIjLu&sNRl0_i!XdEv}@Gm^?`1=DM?qhg+-R7`xgPPEl%*2}t~xaraorbp{0w4T*-4rb(ge7cKsSVyn)Cvlx6Y81 zoXo*){Y!K%(_260Axx4iL+?%OvL_EJ&m6GR$f@Q`Q?PuO=Lw0ol(&SsA16&Y{kh_0 zq*uUnetJJ2TkcRdzy`CK<60QtS^-_|fD5#Z0sf`$N6BOR5PRoi1T4jL{+-MM9m=*a z=F%lo%rJ2%V%E#W&}PGk59b?xYj^dt{x18-(V)z4Tg&o zx77y{o9(zclD~GAj7?8$fOGv$7l2b8NUPO7=`By0<=DH7jm#bfC!tnwBJN(j%?VEn zaBYAtREIPiOt5!uHY#2>YPxN^%)1s9?F)6&9t(F&W(Pb+^v$Uqkn5B7!~VCE^w0`O ztPbB2RA{N9=~1U}!gMZRytY7hh&}h2>u~NO<|-WS1ve22?y2O=L+53R-CJK+@^jk~ zgWGEi_C^*_gNb;}nmRM{y}NI;V7qQzF9&qa>=MSnbt5~VJNo&4L2(Q3`I<3uf~shF z%S;+Secr8%gdvqkmS@-`R@m}v$K+BO?OfU!?7Z+x43BALW5R9E0U3I>efZDZg7hhf-H&vvcz5w1g2cS#eKOCr`caHH+XOP!J%sg|xQb|z zl+7nOx=vIW-Mt}>iCb}+#(O5KM4vV!u^Kz(sDk|J`5wn+KJpPGn0Be4EcB zuPpb>{>DpWa$FfJs=_WlPBEofm|J6bDxKh%aUPAtZ{I1+y6(N-u&Zqr+wkc1#n@c? z-b(}EIsxO|0+*5R`B_ju59e;3Z(zDcs7pBr#*ZvkoHc} zO`B4`XYXy^9JqfHB(~&q1%&Y?z;y^-uXnW`8x4%42uP> zrR^66%KMYLnjT|9v8S*F$PGs+syre@4fCXZZVgX;(t>Ih1h_6hxA<_3)&p#GUBi{z z{#e%Oiu5DcLyQG(3ms!X;@hF-KG8ffnDFtODzK@!Ivmc0^JDaftnQ4i2sn9ar@=Y)a|yawz$sjwtp;BloontG&=?#^tAN^l@=y zg@C&K(M}2<4&k?Z`qPIRo+>w<#(;R;{-MAAf_|==x&^Zh;_i2R+G<$Yny2ukm_bY+ zx%50IA04h-^?G&tv~-qP$>+N^qa2EGSDlOckq*;r(_6ncR7JIr2Uri|4s_jOi(B6d zqm-n*xf#%7mU4`=S0oBjo%n_p^7)x1mir}zx-v$LQpY0P2)8l(vz7wWj1Bd`I~0Si zpB{yMEHK1?cs+nFEwt4`>IBBH^uVlps6X{4yv64Dh89KYHMaV8tVXn;+j+?80h1%N z3acb`IPK@-!>RL+e6Mu1-IUK2=3am81h}3+H)bZ#BfO43_Vp)hTuVNGNyu;`dxai5 zl{X5gdZDk-KhYS9rAiRsxs&dW_MkM{1K$fTpd0T~_{3!D z6!f#L#iv=LMQV%m&|V_qZvJ_|^@|9hgwXU=p|rTVLS^d7=>-aB2z_lk?|K9Irz>?~ z8;ItkQDD7>H_&}JVh*x`QMe*AQu80ijkh<`wj51KTY(tjF;Uy(n}r>bB^jySS~-$0 zKZ2D!xoYlxfE{=}T9Rs}j_vaw0M`%bej_vkdzAH4K0Ta(pFo?|Lk@G1HgLFWEt}Bqj3vg~wo+;Y6~vCt zv|HEYGR)-i^gP`*J>qLcE!>7Jo>(FR>wo=$u94Y&e>4YF>s>~oN@^#}Tt$KY#Aiud z0r4-Vs1Alg6m;@N7@I>EEq!1|p4pgSrNM|=W> z)OhAdi=DIr3Xfd=V8k$+9z1{YYYX~0piEPZP)N&{o=jE_5zfLd3JL3-6$hL^xE-rP_4@-7#j`yAV zKBNbTHyr5RoF1hS6zf>tt1SMi0q8~btkZgbkYO$;VM_!{^MjI;yWKki=L5E4g91$RVfy`%80;Yg60$y(xpJQrtSH8%9x*Q{hk?(O7!9`miG=WJ z?Ep6l=niIkbod0gS6YR1(B1~OSR^g`?g)f4IW6g4=q7$IdIuhSoZt=7VHv*4rKC$6 zJrRsrx*si;e8hwI;11PSkqvO8f$p>!r{$=Yc*YVom%}h8pvA-(n1`hL1 zvz(ehz0joz%v0gho9SAm+*rsoF!G<7J5s#nRyb`M>%cmY7@&({&p>b{vxepuch^2! z$W8$Uw^$KSVfS$^LLUz8OLjQJO${r3E~AR;fRc>ry3|m=D+}JV&RAK;vcBgEXA^Kd zjs?25Lq$HEvr{x2v3BZ88HJSVX7p(2Hr|MbXRAA$EF-}&Rhdo1#ZWzzA_yk~TBXh8 z(<4;&=C=%Y6)Jm*a0kGBhB%-LR-~#eyL++nMzPu-fi`(}BgpH@p`{7(;^wrpA>u}%siGem8MuCy2y{2VTvAIpU3bxy_yhKF*qmz~n6|cpBR|mAOxbN6?KjoG zo}cLNKUPSibnYk6MXujA&IGJaO#-@$R35?uo)OD)jhKPPw&cn* z3d?o(S#1|>V=lsU(=l9-c#XJV$ty(#*G;2Q3Ot*Ux_1MQFz~TOg~lG;&5W>s=QkPX zzSq2HgtBX5{vOaJ7Z|~SG==xzVkYOXLbLqVa@O*;AD*V^L{Q!HQruL4-{+LFM+rLD zH!YIcG7rTOjqFXOGr&y&x>W1u1Uunh$G6|(@bRAYDJE-nKBhB{7Ax^IT)%-C?r;5J ziX!;UY;W^`K(QoQuZy8tbtD;U4c1KCRQ^et-pO%`{v3)ZmhQ018qq#%EXIh zm;%4A`GFv?ZY2xo-tSa!$Po;dGhvE?4_zZ-pklwBu+=sWIrzc@Uw=o$_aQWBj9 z9hGo3HDl2^zzD*ZXcpzri<7J;u*(4qxIdH)bZ2T;z6%mz8DB)lwse&Ez4wF&s*C5312HUvj)gR4$!T7J8c4j z%3_~yEs@w1%J22a$zXhTO{V)9UyL${@tjg!iP068jPOLKsMc7Iifh@}E2$p3{Utf` zbs}T+fFrPeJs0SbAiqSyV%Ih$TspRNe=Jo`{P4jZnx0<%jy7WfFY@L{S1YJ%k*c{0 zE`SGzz_enPVsL9916BbyP5hzt+=hs#r1}I&`9CCjR7rC^lR8 zR`_CE=f$p5;+#MIT89fKR`6lhu;I(7Y#VsC+N|qf?$gC8k|Bhq3Lp>pK=;&O!pT9R z^Xoi4v#$ir=Lw3026dCtjPH_~PM=iP^)24);720jfem2F5wP!mA6h?e}QQ zumV@(n8*OP0Ol?pe!A16v9=h5 z0k|bVx0maj6|sW82tvid548jC79pHo+DH4fZWaA`DcVy+*S(k%F6c_@a0ZNFDRzz9 z&gI!<9)%~``U!u+5v5n88{n1#U1MpP!5Gd^zZ*4}cY~2eEr>xGFduaT#6_y3pmp^J zAdhh1(3O_)^-3wqCK(^hOW)JMxW;f{IC`$NH&B~4y#U-Ypv!*d8S#~F!`g|YNlS=S zS~G_}1Pz+^`KH*JXyNdnPxh4s=^HfJGw}HM-h4O@dF~GFL-(cjHsV{Nhorlz`G4!x zzt7K<1KsB0HhT0C4|GY)!V479;3Yb-*}2FZRx)C!mTC|WTxC|%cb%qUw-2J9rrOV( zd`peysMmaA<+=y^IO^AD)!P8^Rsh`we5Q!kYR|LFhdtA=>&?=Ueib^KAFA5qVjQ`n zD1ET|jL^n}I8xtJ!cy>u@2$b2H#}k;EPbD4&zYNlfQbd}w^Rb%EPj}y?OD<~O4iAo z)vNe2=Y~LcD-P+p9jEvW@~8zT^JW&vr0}uVNfhmgScV>3E6f(4tq}qdkZ;z=fTi3G zAl@pV>tN!Gi8Pfv)8ZZE_Q`oyO~6XheL``A_toec{3MvbF)q#44PHBZD&wgivy-7g zQ3-*2Wwl{GU&)9Wab<1{u%E03y4f*?gT<0KKEY4&Ik1pU!fYGHLUM~S;##Up42zvuMlLEwB19XvRk-fwRV>OPKLI%gU zv1racu3&Z7ZfQS5;jjwJy=_+g$Zt~b0ZL`YX)rlx_*9dC)bO_0)}5_57Kc5s_WT0i z)&gC@D#vGbU&~28OJ>LH+31uv{ZGz}DjLYAc1w4k?^0>@r9dYHFypE*;U#bKPXmyp8Knm-eq1KfI`yMaUchPS?$-$9!7`e7y1 zW>v%c;ubVobpAfWjCl9M!y3L3fj!l#LJE$sa?0WAT|$NV?RF zwobysAd&hnfqIok^lFUNqbCe(GFuIi$5K6lZ9`wRV)Ll~xUgWq-A15GItGPQejfOS z{d~)g$z!!&C0ffgKwnqAxs8l8oDAu+J2R6@Ct0}Mas2a71LF%f)^j26a)j5lw{KXT z;@h16)}Mj?xJ^J;;nx-uzN;N}G`~uqPsnT~CMxvRrrAvo4ul8ZV9Txndi0Z1 zBHxBBPNW655A{DLu8AQg@4Y9Ie7IV{`d=PUewjajuGPDt$Em~ZcTkj}Ppug}ALsNwbQa3hMi?#+_rMI7P&&QMj=s7 z(07K)y!I=z1miP2|8a&wv#3-DU`= zu%Oo<>|Da7x{VX_2|xsF3@PkvgRgbCD>0twYZ#PzAW{%vle0NK1vQ$y+YUzHaQqYR zU$+hD8dx_@Qc2gXC1f@pk8m(`sFWiv*%ijGfa_kk>~$gK+gyl$eU)EH6YF}E-{vSd zn$?a-zDm;<{TlIHqPvF#@sA7fC*F3Tn=#Mz)v_~X$#0`j(xRYbCSa0H`=u63%{1TV zXK;#Tu(eYqwsbl64fvssjg)^~CE}>_=FuG3lh`)lRrq-e@8A5wf_|ADKzA7B*d{sh z2cm}cB>5hCLIDEWj(>14rl#CI>bt!JHWv!*EjDdXUT}G9%;Q8={zqc|yiUty0xAc| zn-qKY%)fPQpg;HHb^=}aY)MEm*+`bXb48VHe0I&|-sN|anvXug&334 z*xl1o=vOo8Lvd?Z!&G=l8l1!XR8I#Nn~9kJ%P-ikzg<9A`pa9UMq|$d-F zK7n-uU3&S?q8||Vp+*{&dULAbwP|YdQo?3!o0F-HvtY6yigheZBiCy3TqRq$4m%@$ ztcQBdj!tRbo~o|W3#-YkSpA9jZ{2GT(0vwq-K90CMn3}6*wQf-!zXJ}+pF+xKyz^W z`Gy!g$LhzYs`Xw|SnlAcEf#9w>7<{5D&SRQtuzOUW3~`w!NBj9UZ86TGWIH`%#hKU zOoMNRzjs%IYWnoBWsw&c!`F}!IA&&V@XEOvqj)>PU|}AGl>yW8?Xc3|%f;Xqzl3Kj z*fsONDfrV*_5odK1qN<{j=t^%PA6+IdoMoyG6#V!Zb5(h+nI~)QaHFV&X305BzI&J-FqaNgi1~<66=qXb{>4UGX~`JrIFJlN!ka zlY&ax(L-NH6Zy29x@%IE@ZgmH=l&iqMu09%v(_~HH+L`#mimkL)BMhu`LBX);R%MP z88E3Eq&oRBN$EMyvY@ct!bm46YpBUMvN7C`>9f)(UQ5H3#GJwZbs>Jcqd@oWE_Z72 zR?eVg!>moW$YZ{6)h8h~VJsoymat7u5+&M^A3M5Qt$L6KwMFX?4pn{*-cqz^<2Z_- zzXA~s9DODd=9PXaci0G`1^1*>U`tP6W(mY=&$C%()M>Vp%lO0;#>m2J;YD_P6a zWeH!I<=pU(;L;xf?j+EqdB3cVNVOCcDa77b`X$~-3stnk;|l|uu-6`v+Q{iqM8Rjh zav9a$(h^}f^yW8|?JgFzo-nv!c*&{6;EpuE`(5x~|1IP9?=}T=rEuPE8Xtbtj3LmE z8x1?@AD;m2p~|^{w=I0X5z!)sqoyoz8gnRjZK}K>mK|U3z-J5&sYY<+M?j$9jf@@o z+duprH>ZK_8=uYokl^p~t2P%$*ouk>JvI3SP*Xx*Xoi`Ap%9n#-jH<@!8s6)vv*zx=|&{xWBQ?&}~- z1AmvEF++uw4pgXwId2EQu!kNN%)<9W%)LP#Ah1r8VG>`sV@$^htX3vKV1M`5{Y-=9z_j&j;&d&o~pCa^#lI}nbR4@02 znap1s=ASX-h`Yi!Mg0@qoim)Y=JY>{sE2%Qg>-VN5{h-B-g(D-LTK*0;~c+(o-QT1 z^uKt2&mR_mE=<-tF=(wCi5`T|?27ON?NgN{tH_>oY-xK6zk6*IC)(on2~B;>3wc9J z_QxBrp!e2MhGNuL-OAB4Z4`7Rf4_%*rQw&q2y|DZ<}(Ew`SU1z=R}OlXACOOpcA{H z6`Lm`RX0W`lvA>p_E4uMi;&)b`lJqy-vBO{bbSJG7$Xxo^d%eP-GKA|;{EL|0o{*+ z=uFx~P7d>}_V**DkRPqh<~%>HBnpn~MBNr|_?=zht@uBeVQBCcBA~pW_E3u25BH-k z=5n-1_s9hKlyUuW{|=tZK(`2aFkGcDtI0yP(rj5~mYVSqRHU4yQ(bI#&F&x9U6NA>9wv0Hs(3B>12fnQd+0=YE7ziL0=e~New5V#E`i?t;7LQ^a|4- z_wT%973faaQCK&c?M;BadgFR7;x~r<0&9iN;pa|FNKz1VLWB4LRYq)tKVC=c0gfVq zu%pN`-zY~)uN(_QJu%+?$2=*(T?4wIDDzX^2zBGxn{p}o_a<7<0ZXI@IgOgRFClJZ z%qw@%dlTit%!v<*m*ZjlhY}nOQQ%x%ZTX9+fEj>eDLxQ_NJ0-{t3+X zyY6D8m(ucfQOrgw?QujrcE;qTG^kc*BP5Gm9O*6U-~WaC_jlU@y0n)EYOIqV=dFi? z8exl>qK(>w(U$cVD^|HO&zD0Lu#X1LH$~l0ReS3%dnijGl7EELEeiL97=88p=%fZw z6%EM4Hqc$jh<-<2VgF`zbcfN#V5?wWcw%DX7HcxaUV}&5vc|KS&IHf=P*ZXQ`2iyw z`MWbbm*!7>oky7Oh1b$8PntRacL(U6Bxys-+RF%Qz}5#$#eCZ_iySDgjP^3oKWKQf zgE=5l=vY@YJ#B-5MLC1<2ruei?;0TnnHW0|OC>H0GXDr%pWFqyB7AUghVe%QY}Ojh z>EUk?aS=?FZm1ID)m3Le=7`uiX7q?Vec1yR@SRg{iul~_GAIz~&`n(EDYr(IyC^Av zdDsKG3ywU;MCcY@P|BdX@%n#kjNO^$FplF&H*`HgAc=7uG?B)4CBQPt)-FqI`4=qu zi%R~8PBTvJO{+#9*EJpZJCFMNyX^yAzNn+Cj}|wdC|d(HUx^S*yRWgv4yL}e9cZdo zcZKWLs0iEX>a6Cp`Jnb#q*sz=Z}VeeN#oo3B`SF66_{a41M+(SbSV)-@rBgR`5M~f9p{?IVYl^Maw(LUNfdkA#FNw%?qWLeXyq92o{Jp!dwZlG;zj|r z;We(o&0Qr@O>*n9@t%4S-!5P7aZ9=%1xN2UpC0qR(>vbWG1o<2kMD6BP03=?t8VsX z;5K)20r#CwfUa>gayro_xO?fKcQJF3^T2+U0_1zjcOoj174ckCwq8T_ zFwaBgBf71akjvk>(vR9u!c|rUz6Y*Xp8{QooDHyzrSOq&;!R`caA2Q9zj86aohtUj z`0&a7*n5!;nIoa|;}bG^5%y|n=h%BClmIQ)80md>2x51@59RqgZvOq<&VcUS9nr%j zjm$h;pM*9Yjw6w*AtOz6Ra%- z7yc*%gw0p-uwtz6)jj)djNkzuhDs`hKD-fOf3v?HX#ZX`xi(1)NdPVb@)n|fo(J^$ zC=W8uSFr~ZxG#MLbSF_86aAe@@DiMc_$d-qUEi7p9F5jb+sw~O!`98sVnB0k->gkt zu%=R^N@&5}zRC0^q==w_VjIiE;DZo^1lB=c1Knxn>tHD^njqL~_;*&d7bo9*(JSS? zKPd{pEbWIY)1wgW7P@8NF@8+dr+#lgYZBRbE&l7obS}AQQorFa-e){O9&Ugxp=>4# zEawkMa~Z^VikgRt4OkxN1bxTgUPpIWVh>9GW6uYe(iF@Sx+opOZ+IL%2{chRCN!xFg+w=df>quGu%XZ}?k^31WKg<00qxF?K;p=;-ky2APtl`>k(tuRzx74vTNEpiKE&(4T z4suhFFq(S*9-QIzjFyhC_^Zd#FImL7SRontMn?!wTgH#eNapzSoDTr^9_R{1?~fOw zz7(emS-gP7TIMPzn(BOH5E;XKqy7yfoZ#d8VipR$2vY!+M|--T#6Oea3ukMZrt~>F zUY)_l5>*l4J^1%WonJNfnT>Vp4Ky0$r683e;pOw=e!#SX;u#!wDAYl4L$)~HalvK$M1%r zCF0sM=){g?5IUtuuugP-jtYceaxy7EyxyOJQbBW`Cq6DxUpqTyAc6fSE`IYwfY*wg^=lT(^bYYUycSw$m4 z`N+qg%&V1|`t1Ukc|>G9Zevb2902zj=(_DvAyjUDxd-3I+maw|iWC{QtEmAc+cTa^ z_k0}!?f-ZWTL<0VhO5S~SjqGzQ2L_LhL!nJxw5CGDE+LsySYxoW z+W5wLh3KYRtzGxPFm7)mj`(4#sOF_A0632V2fAl*W>=yrI}*_;rw&P*=LEVxvI*Y{ z#AT73f`-2&iW5dm1#|VnIq-)W%f}*l@ATk%5Jj49jEaPAw2P~bBI5w!g#fy_w2|y* z@nG6Bu)ADNFyPJHB<|)tnK~4;GsVnjOQ9_ZG~14r!y6gq?ApUc?5b&nA2tmOI2W#Y zRDRSu&PrDRTu7k13QJn{6^zv9IYF;Y_L7zk`dogBA18D+!QkBnk5}8HVi(@2JJf_h zRwgFcrGaDOJM8cv9k4G**UfvLIIJE90QdJuK+_Oxce1hR}osFHy6oq9}!?U-P-{nE6 zOySq8%bCj=!b0*@ibd~w0zrLz#O?ftG`xAqeO z?(ebgUjvzn6&z;2{?ZNI{dIcF`-)q{Lk%7jTGyaJwKmq!P4ZUV=O)^nw1b?!(QHKU zVi(?V_+Xc&h<&{3E0gD&JH9f2`@6>YUjtosD6mRp<@}&Zdr4Jt47Ja;<7$ChsT2~dXnNO4cG^(sg-}x=OHe>%7gOg6!&wY)f3GS2YapJ_yo1e_ zoYNFD5=r!Zu3%OKep9r>uXyFepBA0Ok_3iUd~Hc_OeJRUoG$5`c@M0tJsM8FljO2I z@=J9O=K!By1fXkLbd4kuYGOnw-dM>pYf@wRVPppy9b$uDW3npf$d)IDnjM*{xNLX5 z1S4YGJ4-NB;7n8N!l$!mzWztU!vXNT^edo?z;>;Y6PsH^JPEzd$grc#(`@Wyr|j0P z-sYOFP<44Dh&i_xOM=dDED|0Y&}WnaZK!+1pKll4kPxKptLgzf_w{?P=wAbU7SX}? z7vjPHl$~V5;G?{UZd?zR?axzA95s0c;kf1A;Jtd+TzNhf=HN<=`MqDDd zvxg=4{PNuYm-TOc_IqvhUjr>=6@QLXB<@SUte6&~wm@97(*6!Tg7o3_ZP|LErI%5F z14tWG<)uem))|?6V9VV*L*q_%8?>u`K(ia48vb`5=kI&*yXNL!17VyHzF)j_Cg*d7 z+`lG_3tX@+8RV?x*lx;IJO7p>U_f#X3e}A=+I7b$ZKUX!DM=5J9$VeoAL*Nny1G!l^w4t^ z2JIa##%p8J1>*Rz>DN!`LSNVc?rWgSY&|!K>nY-P2@}il=19XbL)%S{hP=R<#^^kewI9bbH_nkpe3{ zd0}clTakfp>1KrLNrK399Ki~(ejN?yI#YB{u=(bO*W1-RtPZcv6zH0oAc&C;L(p+d z`4a212g4cm)rJMb%pP9{7$UvGPweMiWHaBDTRJ^;wCI%mJ@)*2&VJVd|7##+^If<5 zIMq*)j~hOb@#T80C!L`J=bSKWoLJWqrjk{daI(n|BX1sBp-Pd%YTN`~gHb)k(v#7! zD3Na^MKA-$&EI|IzXlSt0jKJBjbeyp;gcsgNjCU!lfH|F-_dPEQk^}V9Z>TidCSAI zGX069=F~Kx8BKjtq>k@=>z*f!$->PLWuasMH2i6t=t1WiB(e80PfVRUId0 zoTeKhz5z=tyF}x879*TIx+#M{O>@Q0QW7>eYdlY> zx`EFZ<2xXTyj>qL1GvBU9R4+sDNR>gy{KX0s43+0lo+-4Lt+3{gp8 z#B6vct4DHgk=YR&c`~-0C#g0&a9+hVWQ9(3G7}g&fcyKK>t6#&B{_{f2gpQBHXO8W zr{mi7Gk(}x?Z_XI5<4S?eI$JICeINrl_#n%4H@>nhrv?^VOGPp(2-mYs|LaKgvw?M z;Qro&`qx1F_?iW2Dpm&1-~D_&CtwnOAjZz$<5m5jO-W9#Wqc(6{QP~SlEN0uo|c!Q z!|?xDyUU;|yJ!Kx#37WF29a*0MFgY~q@}yNq!DS5M!GwtyOEGax;vyh1p&$Xap#_y zegC_DGY@O_S-anJUPaG>3C@nxJd(_tB$X1(UGc{nfc7_1&>bHsfV1KoY;;mp#X5hk z&Q&G&NgQwU5R=ruo=N}dZW)SMCCu!`E}{Py!=nU?HmQ34ifHSj864Zoq^O2;5Ad9e z40L}u;HO0rx4KtEaY9UjgJ1`Y-D*^|x6`;^{ONq+rlM7#b%Yr@UED&O&xw%lrnD%I zEX*Q*@-nQ}N-`}^Kmgp&lY_2)G8f}eG)9d_}24&oPp6oSm<-_lxq3 z_Wr`=`1_-IdoDfrE>lb^yQY@GC=wZBo2RM54Y74VJ5Ycwvf7!xH^u53-C&fp;mQxL z=M!3Prcb|RxHUV$5kM-t&UWJmtglf-tB-tMu_Mm9di99DQ^xAk@5Z>FZVGh*zZXgg zx)tUay_<&YbKX1M7f0T2aGr_2{E%eo*PxRhz-?Q;KcIO1`m$AStS>uWKxBfEx-_xo z>)4NEC(*8!CeF8FfeS#sRG>RrWLW5^+*-%}wEIsr#7mpKrll-SSQK@q)9m0n{YJ>HzhHigy$HRz_xE-}>O{l@Pw^|_8# zPIV%rg=|g_PQw07qobw1JHRf>>w&-08juRojfZ8vU!TNu7H-5J>}B<-+Dtn*m;j#> zqXAv!=Y0HDg@KZvGvYrbsSiz1r&=T8!0_)|BT%q+vAs!~*ly$%RjuEoW>xFGaqj6f zk>YIFtyn=yMfxp`&UgF(>0j*g!T5ny>==qeN{+etM(|R(@Qu($iuE7RB0bz16 z^RI!&o;Pls7gO8doQS_=*Q7`kvTWnsle)di5A{w`N`OlTx-T%#tg~}aR?yXzPhsUw zx4pv&*I52+-S5!DOFTuBUB>UTK&H8gsC23BIqojE?h4+0UYkl2s6b3+vw2tQ2==$f zXBMCV;g6|+ofI%o9-Y6swRCZ(U=V5aGx&u>q6|UQw~`^7AubMs$v|(9Z^uXOIh;!I zd{e=LS8ml1@?MP(y~-X7JWpi+-TDUGi)en0n~GO)Co!p0B&k^xB`fo}o6!ogUJ`L# zMk#J~=5uQ4#=RdogXUlIuNg)+NHZu}fai#epez1E-SmzX9xI^9m4IFA zHiBj2<8!o9=5hM;kuITj?{rUm^HN;v3`SG*8UiOIGhCgYSCY@@j}q%8pMvX$ zm!SLb-`CQVqiIR0yI!6+!oW&LUvNDxAN3F$Pl*qSOM)$qhT2!XV zeTLegx)=$^@a&t|hqs#h|5?!bWddFC;1O7*Hbp@X3{Nj2nIr0l8|{Em2L|%@`8M!a z&)(0HI| z{_h(|vkoItGZ+WkH_hz1;td{-Y)?&13QtQg&)Jg6q6Nd|zbbo7)hbk-S(n5bXcqRQ z11<~b23<(*Zc*Ccd|X~}xik5M)sD;>C0+28E>C;xhPPB!=qXI*J2yshYEnasEWVoX5H((%N9<9{OQG%tIej&UdG9 z7RISav2m6edpth0{MT)Gswd@I{cq6DPdJxy!oc=MSgpAG0U+PUJ5*>uINgu_G^l6EEvnlGF@@ z;w@=;iWJ}XTP@8uvA6q1Guk2m(U!x^-Z) z?+&ub+Csp61G;}2#~n_)G%ceB%1#_MZWR&BnAiJMJetFP1k}WH?$L#4GH&U`sw(s2 zSXjbf8j6KeF$dgP@>y&m^QjyW`b28#JCwLirH_wlR}8ju(nt2PQj zpC@H7td4qt{D-{BwP!ZcxUyN_@MvDO{~^Jpef7C{s@f~XWmYuKNOAlO=l6S^4%jJ| z`io==>&Z00Z$zSmb)@Uggfu$=nfe4ZGk*sgG(^ZCntWz~Votgc=({v;rX05VrUBLkjm@PRJw8{gbT z>kb-qVlhp-nxA%wUGEg&G8T*OBfF!xJ+@ES2Kh|Q@R_*k(D(b-IId9Mzviu+AGBd1 z&pLrO*e`ml0cgMA2i*i|XY}jog=M&lm5wZ=T4m}tKKIV&>R6_QI*2;hA$j6=$2H;& z3hs`uulJo37ckagFKq~~Wh9r9#_)3k@{Cn<)a zd9FleXC7GsMPw4`^k`|J54&}lqG?77*hZ%$qPnNKSrzx?`=nizeN_}bk8=++UqR4y zY$$#HL;K3uiSx&le%lv3#y*!){g7RzKgeU8iX{q@zo%=Q^ipVY^pmgSEx5DEdG(BPMf%MpB|gu(&IXH9;pJBWa; zlBF^G;pv0-aE(7JmZ;7MF5&zK4cl?y7sceGOL(6n+og^sdsR)AoV*F!!R)qgnf z3a!T7u=jc0z#q@i==x>Ko0b-D!;p3%a3|u@6>uNtBxpc7Y%h%DzWt@_xZlGX|Feue z{^v%T*{nY#?)DC*o9zEQa=YQ`{BVLB&j+E}{YJz+|-;X5zjFrl0d$XV-PeTJbA-0$q=Cx!c*hvzPXR*_J$)~=&be12@& zw7&@C``9MXfE*K=yW>TgJxuJXxw9U36*|UmNL-VRbv3^m4cY#6V9q@HCr8mOV;^Jv zB7FESgV5%gcXSo^i#@b2$X&dW@4)k4DbUSXm%ZsO7Nde-N8DsUB>a}dHR4QY{`+0q zNO48%fx0x<4}R6LM8@2BSV>&ePwj1lOG_D!4}7&xRg#DgF*lkww_YS6q)Pb`q`kpA$cbajf+xV3=Kqk6vKsa_VoFkM0sL?Sx4NHmJfIWJA@?)^oZbRs?) z_k*UbWPsP%Os700Y(~+-MHeDkXX{@765z^$u4_xn2781`xBEQ5QKx)P{R%w%pIMTg zoP?oNf=R@=g93i36$RY;RCab(tyOZ9g-VCZbD>4b!q2s#uW>^X!Ts^$StT?eV(X;t zEPRm7$gD6tI*a!Ko_e}2LEB%xr(wSO$>h8;ja&a_3s>)bkg7X}w5RdZxxl1LEX>NZ z8O90oNS9%JBarV0(A~PPGG2bd_~|R9okalyb2WlR#|{zv{FURh&e=F6Wk3C z_Cwnbnq92ISwzNR<{Z;S+&JN4Sn`hJ4Xc1F54sIxbxLld??PK+f4Xq69N^6P&r7`P zH<+1$?fd+B0W<2^H{H2P&4LWB;;`$UTp#~~3S~>hrqDUcV9UNBRVr|wr2x7uCzp9f zXGAF(VYIM;X#~V2T}|e82xiKdZfHb4_=)uS^H>2M>r#4y9W)8ew)`uFo)a{h;VO|v zuzO{@v#5zczK?qXXh590YQO8Y)R}&{jJ@x*5pcy?`84OpSvpX4GEvW6|AS1Fw?-~+ zp$%i-Wz|^K{QU$1K4Y$`e=G~$)23MQa98j?;Bl`E4agwh zL#O!QVrG1UX0{_0t6y|A_AwtaZNJ{ge0wfXT1%KxRjGy;7E%4j^7`|v$^Uy#(Bqvt zG$0$;I4|d)PhTPEW>Jcu8w}~4mTu!Qj-no09C^>5ORH>4 z4!YfP9^P!U_7tqtW2uOS;u){{9?%8lHs4Y0f3IY9RU3H`w1o!mn0!?#5+wNH(C)u? zxM3E%_-iWjhv8~vPtqa*t_J9;(wTm)T?|roMiouHPWQQCLJ6avkK{fpWqkB7F`f@+7&}uoP&@+h0kMXg@LP0*MQ?oU;8PJbIVz#aW8AHC#d{GNw<;KQq+)?YDl zWg;%T9m2O=NtH{VB*)}aR@k zg4V-hn?M8NpDWs*+|(n&i&eiuN%m@F#c%~SB(^Ip4)%5UZ?nDU@fh+iBJ*&sY$n!R zYxIPiTOkv_CBNbnaW;Iu+m^g~oZF$U9_X4kJrry+^Zn(L$Nq)EousJHpM3B(N}wjy z=a``?6R-Kdp9uAG_D^+0CoJlYJQ1?5eLCo=W!1NZHLD@C}=>Gzdfmn)b;clV5Lyb92ke4E3r+D zo+{4SO!=1XsgxB+u*3|KHQ{DN*BE4^je_B|Oc=h?8_}fNKQ0hqzBY zT(DUCIO_90>R2S_?iar_9PvcHPFRRCZImYpwuzCh>klOU6}{wu<-2iC=mBhb->AS;1Gs`KE>P(;oJ z&_5Eb`NiyC{~j<Blo_X#1LiF2-)| zb=F%YmJwLVO<0*Lu1#I-{c~UZ#(^h=MRgTe1e0=4HlH7l#AQ)#2Me7cp^fchW5spCW^8h{|*Vm zv(Rl=P5p?U!xwNZL6;BLpJXF;Y2{Eb<~Vhlm%5LnUhTX-ri`cE;qC2#tKi?cB=eSaY=I+~Gd!c!O4obY_8 z?X-dD;Nh9tikH2~@EuDmkCVmZ-DhTPbPfWNZTc6r`PJDcUbd1W#Vnry*BW$L+>pe= z%(d+pbi0)n`bd4m`1LHQCT8Ud6O$6_QeV?tYfW}=45a99+>}#~cJ`DYX+HJo=8hM1 zd$W)^(c^OlxF10`#U+f>Li?ieQ~1pyqFd7hy|i=f;iTl*lUZ=%NxFGblY9 z#AHb*o5d3YxOSjBkD2*ZBI49{T15LiLtm%F@}@LI7twqxe~Nv!zP1(VyRHi%`FS2T z$6q1Vu2?Ot7FGOMiCeg`uZm}L{cz~nfcv=jga#x>oE_7e}TjPKOlh<>@C)pis_WIwo%s6fdn_7U%WvM=ZOP zxuV6w?c(ccLuO&<9EOr4Xzys>MIzFlJ>GFc>%kdx|Ka-GMo^;e9~3Gl-5+LRxP@Ac%LzN7~gQ;7LkO;Pe@djiM~MCf#!f; zu@AWJp!*NsZ|VWM|M2~$o}l{=-*5WZ*3kHu?>F@Z-J4S8A8H0lYU0N0tt@=c40&-$ znN`YFs&pkPoXRENa!S2QB%BhE8K^bEt?C?kjx;L3OF3Nb%eR8pFhMQGk@24e?Z-Z# zYa?=A8Pi|S*i0fG1$$C78aVkbx>fQ3H7ra?OHXN`nI4YnL=cX;I6cVfOKbm}0L`mf z_b#W^?M5|BT?S@}9l(8@^PvGToF8+KY7FZL#}*6?>3N>bNl8%!!LC5$U=@)32wU|5 z&A+DAmV@3KUyDz`DKmYzAwyp;(r$aw@FTHudZqj0UIm)(7tk&8qc2T4+lC;}!owHt zle}{(U;h5Jm4M#bPFIyW%Z5~Sy?U4oJ^Nu>_46r>Q4x&yR*X|N87CzJt3S^SmHi;# zKHfn=1EOwQ#oc91>e&k`L9c`RqOn9fWhiCE=vyC8a+up1mk(*k`U6+qowv{C$sflAXukfS>x4XBeBWzMH^vdxjbnbiCH{5RjV;eAZt`+o zLcJ#A?RqC<>+AM++JKJJ!~1V+$llI@5r^urHLId&$&Di?Q-B))y0=>)jM8dlL!Bu& zY6U-jqmB4?DdQSoZfgCMPrf_5)UlnlbE94HbQo7=mv9i-y?NN z0?wO{XEM-$7=B5*VKlawbccy(rcdZ^X#H4Hz^2hTl2r4e7)f_6*sjzQhL-%lzf~-E9Z%dj zFDW6ZvfA{-LqnC~zo$$ccHiYRmxv8kq+*J6Kh+{8`I5k;4Bj&YgKprNlKIPk4e3fq zh`T+Gai}vNd%C_69u@T#{|RfyJMp==;BEPm=jc zy-$FAALo2%KrUvU`evt8yNl7TThnRhJFW;ZX<>wGE0AK3MlD^J+ir$5b9Eb&5auov zwH^^BU|SO6av||gIK~Oo`8rul!~$+8=)y8mUeAl7w^QJ?Xp~xPa((-hG_x++W4+TP zd8gqOUGLBA`d84?6a9JTmOYw&+*w=7jEhCx(`G2FP)KZ7LJ1aXr)3eK~%PDLu&Hc3OxY-+r%p7DP?H>=i?{Xw8qMn^T|2~*Os zN+|}oVW6wFVty-xs6g?On!&Ao;9(#K{aV>WA$U=v*#s}>e;h+oGP201!`Yx2BLM@pVWp@hJlhQs1BTBYs z-)XJ9XE=1yt%#AhzC=^6=~Jsq6k+2siC$6jb%nZXHU1j}P0@S6jR4&?vyDH9%ENzY z;Y&iu-#xP#oLzo8^Q1GW{`f|Hu$k8~wVuE{-WVft+t~Mue$teVnuIs251 z^);I~;6Co{p#ga#*;Ukk8W!7UPvgQ9k)D;Dt~rGqw9TxSD*+!M=%Z`$6QhvZML#)V z2)Uq(^rB4plt4+rbwFuxt%Zc_sl{UrK-=MQ4+9Oz4N>PTZfM?V|7+t5q3_yxZ5kSm zb{5#IG#st;Nw29^sUwoc6Z5P4n1t4jBdr{;b<3^Sc4_tqJmPyW5A-|e05=+RpTb^N ztF-Ji6cW=%E0`b%Ao8*c8a4BfuPE3}85XD%(&!qxwv zrrr7)CQy=KZ>f_ z5+51A0@&(m!`gm_u zPRFm-!9SYTEj-)Uu;Ri;FYl_#1>BbLda(=NmU!U4c$Yv{%Kc%88>2aW&H|qx%3<$s z0pLEK;X?x=bb?d+s~mTf2^R_OgsjS7Nmt)Wp#V8#uItM_Yx~L4VqQBe+__!;;xG|< zz#VxnwKw+J$o$A}W>h_tiYZMZz)b>O^Y%1rzl?n2ESKabDW|XytkqlZTRJYD6~CnO z*G!0d&39-uD;E+k-K$+lEI8Od*VUuP&@3HyzUeiHuas=P0^DTKeK)S;sR~)@=3t;? z5JrJ(lJ)05R&w-}9ji~Yx)SFK=CMe8Qb)U($*B0Jo{c9Swl4A_l9ETFd1ZyBtkPzL z9&l4Ycjz+h{nu{)VlQts6?Zp1jlVh$5_?F~5OR&(CglBwMpX~deE8lcND|q^B@F0} zyq`Rh8Nw>-M+CZ)tvm64J+2v`^^gj>MKu{uzN!h5n6=RdFg3bs6RFNHs>Y|JbGM+4 zNkq1x@h;}sxxT@aW2K=!IBiYE#8?QZDJ}8)WUw8Jebuv03AkyX%N^RJCA}U=#f1`c zumnd~i8Pc~^rSCd@N)6RpKoasF~T*>=4!iGex-Slt%2GQ*V~tMan;)VDnfZ1NLsS> zU_VX=-EHi`%q!+6kx?Hb`dmI6XVGKBw;6v@@WR&JU^@AeK9H@c-dwv7126yVDI8(8 z;IBBZpGfSfg)cS_)#ZIDNWp#KD|GsRu_U`p?pFTWg*{C~j2 zXQ4;&exDc=Z*JA#Uvbj4w|$0%d6gdXa_sn{DTARL>fBq}hsV7(w0$!{7lCA|nKh31 zxM%@WRHKhgDzgt;BPy-6vzL=G8}Vk6x0%L_ z;a!(OaNU;$x;lpOZuM0!eEzIHe_0JDb)D5c4$0^F9h-`!`HN|Bj$g5RIH6sI zZils=OY^sKk5|cT8z+a01D+RNNk5S9(Pq?)teRk?^p$4jhB8(+ zmA_cfo_J--ML)< z6+y10SF76ipM$gVoREI?^i3m4Cz0*(T9wJrzEeI}SRSP<Mu!<`lpSU80=tI9hZ}XHDmyWUjAy;Oe?wK2>MZlUbIni1 zC^F*56e?Cr>#C4a_yjx#Rz+U*%B=(L<5&z0$a&=F_4cGJ1e4)Pz5IS&Mtr>}w!Ho4 zd}!8mw^w<`#_$n5f4OThcT;EiGx@(v#7LR63kNd2Ox_p}6+uRbdfc-?`$Zw>{=s9nKOlosYi}^FLh!+!D|odrw?;P6OecBbHCo7tbo8 zd~eB3ar{?F;4@V=%l?wLvxSK!&WOaivwURi41$>C+LOxd^5`NtPn8jq_EZmW9x4Uh z?yZqCr7+u@u-voDCa(C&Y5cCR{ay+Od{>dZ_N%Y5JGcJ#8k2<`PDT_r>x4d}Vpl4>QD9A5`fz zLBkeoK=f0xkv`!V*!|LynA!`ms1TrIo}DXkObTJq&mzM!wmFtp?~1oEu_ z-Ig~-BElc>!!6|QYUpe9IMTnVRxuMTkB8$`h_raTWjphGctZzYtCmdE15*Hd*-u=? zi)Sn;Aa4=+)(r)&_C4TMf^PEc-|sE{I2T&TlB)PDFlf%5FpOciE<7o?B1P$kMIrcm z+Gia$X(u8(E*n9(n8zd|3{5}AUn&NqQ=>$+UjzYe73iL&Si`KNRJDFmLD-OKWc%&S zqt7+5R`x*3IsQ_NCaf!l>I_48VQ&)i=A1Y^KUG>jphujI9{uN}*C+e@bYw=rtp?pj znWm_dv3UIcgab~+;@z2S<`#;>uc+E^wW@sOLd}hgtc0cf5{&AD$shU0o_JOslruOyzr&|A`cwn}?&JS} z2Be|UYT_F%1FYB|m@Dp8wU9BHY<{&c+PK4 z=VI;sS35e9Oa?zomz$@W<=^^mmb6DLIn!#6+q1SV3AkqV0B!^5!XFYJ$;}MdeCj1B zaPA>&bV(*Y#9-OlM)x0f2tOcT`|R=isbemp=&AAS1U0e_%IJL9YVd-ub9Vlo9KICq zK{{?k3*1pIE#@-Z7>xG%F563M<&ds4N%FD%e~XWh%(iB^|RWJ6g@ zZ3@Ul2d25@{}RBq8QYUh%_j;j*vrs%+^~oI!Vj(lni|rdB+xHwmzD=M@7l49Hq33@( z*HbVHk=@5;LPy+K+Qtl&Y7$pL>0p+2lN_hBBu3M85r%1iD6r{%Cgf+e8SSy~Y8}JI z)IJmi+-A^qRa^8H+{AJdI6&ymZu`u5mybM*aiD||X)1tb@O!J#|C!~SC3$g(jP~U@ zvSCu+>VsOPW_u)hE=|<-MHSZLodvXgTR`{K*LT~AHfxSW!h=+>JK>=kx4(#+X;fu# zUQLJWaBpOOJWpDP|MX%`HZJIMqW7osDULa*)*&haA=Z4Ah_O*Nz-C)q+82Xhq4EA_;*pHJR9^8fe9B&X*OENmaLxAW~-7 z859HZ?Eu~0@~YqHCu)O{ek}&ZSMT{T+p23%K6;sog~IFT>}8&hqcE{^5%xRmsALNn zco-q0n$>QHEGcA{ThTP!sH1@6PABL#&8-j6b_IrQf4h^uArC<{ma~rNQxnholGHnq zv`BZkb}gt$hh-+SK<7PBzr15#x3>9Xv4*!Y@bL6STfLMBkZ%|0l3x(N$Msvr+C{|R z*ERC9?3jv7kiZhX!0N3t&pudA5p&WML?T=&>8Wf`|1h2Z&TEppgts#vi%S!kh3>;k zLBQ<>-EX4ta4chRPWF>m8S{d4pACg9?Ul=4ppq|z!qVM7KWYndDxi;1%(nRc()wbT zzgh9e@=~U} zd3@Fi+K+#NZcJ1)8J?F=vHZ!h>H9xx94tOLkQx*Pj3P%|YYcrkZ-_A7Na)yyX z81Q^J>ObL9{`6o|wrVZIP_6(J`(!(8$wY$+bEi~jEuG##HO%!jT5{(C;u zT`0If^$*#Q#mW9N%MSsAfhow5GRW{EVur;5!3Jp0LUR739|iV{`}wuBd#j1SF9G>J z?rEU``G@^t1a$vlzZeDGf7ma^K=&W^i*eBXhxPC{*FghvTsHA?t3XTnH;>Ed?RzpE zmCM7(i>5DsGK7K)Rn0?^y`Oer+*spXVVkpsY|=*loRp$>I&VwnpC~f+G&%;cD z?mw)DDbW3g^)L;(|F9lrK=&Wk!z}3j!+Mwl-Hrav>4kI~j^?}+O3MVlrY%i`O|+*x z5R1l}@i}~M=62^^-MtBofPo9^Fv3#}IvkzU&L7uO+n;_$Ot35BD*tCe$KQF-{fG6i z0J{IM9u`6OAJ)U;mP)7{fYW;oNYm)60x3ritS#FE6mTGvn^?}Q^tr*N**@qhlknaZQ zQmV}u{cQ85r0M2o=>9aKT^3!3Q-J-`)mJp={8_;32O5F)A3wx49rpawQob{Wl}qoG zvC4YvB8Kvcjx095dR&`AKetWL{fBk71-c_{5+x|FBSSgivXKXh97yz#Vzu?vF~Xg~ z1p*%8yAS_j5r@+EX9Zj)_Cq^Qr|2hhjb6*`*;=%4G7LlW4daw zXvaqD@;~twY9SmrLmvPA25)2c(;Q9W*DiLtQifPgSyN#d)U$mmXv`*oN{8--(!({rp!xqtLf zlO)i6IUViBOM>a^i*t~5;QE43>ex~ma35<98juA7H90BLoZ)xuwHP&@Fmf#R^VMyw z*dW8HZsFt?-S$!i&#P8E5Pd##%lf}1lcp2hS8e!#h9PCGT*ml1@9AUTg??^(p!?tZ zX7^On<+(2f3aA#u{Mq^PYi?=xibPDll^f_G?#!~_vQtO+mzJQUF*7$7h7b`>&8kq( zc3K!Edyc01Xgr=BLfw7P{b-Kn(0r@mnd|%7M9CpxiGh{KSli#P=_iqN`Z}!u>)u0& ztrB|83U9bpk0P(SO|gvL6_T!{r0AS*KmyhuZNNPMUEV>bIpX~fx@>)_1f$tz?UpoV zsUJRC)!a&%z8)LP>r9oae-{(ic-c!wlBt|$Trlm2>DgA~PM>SEEJ9PK>Y0~(RvkRlEHJEoo1ci8~EYZ9UdYg;gx@V-SwL9 zx%$MWpx-CTv!#L-f51Hg-JF{j;|_FQeFPp4F@!CC1*3k#t$;= z4Ph&bn9hiIjIr#GXD`rtI0fCEZ#)G@ou-w+QJI--*w%T<9nI!X{wvjens!)mjn=D| zPsy9(sLBnA?%0WGME2A2-&To8jzNFgPaJegLOv_rTQoD z5iF(xGxHXh*ngDr?+!=1Ao6^s;U@fC{LHharK3$7HM-6=x|gjF-*|CEg5eKRPs8IK zAvE7J(3LK_f9X9lp9D*7CpDZJ(XV!t`IIQX zd`VdwrYWC}TTIH{OuzPLs_B#S?;cKP@`|F$3K}(->ue&Og|TFnZrrRU4`m6RKMYVW zeRTlb3(%F4UY;WrBi%k)mlr&WA1{~+{}{0`f^=K*>z>S9ncRJ93ghjwf5f-Xd zS4!=>Yp#kdxnw$siU?w8()9>n!=beHmIM>71uK$-`E{+MN|`n7G(sflfWRrnSr_!O*%8_;d`&QhNeTdb^o zKPcK9(Z;x{LNjYzR;buizfh)CAuB=jW|8Vn5Yb$CMojg#Rk|BeYcj!&>c~*$*Q&wu zMwJi9_ZDf8cIT|{G<3eoK*HFhaIf8)_k+9-_UAQ zMM>YLQ`ytKz8IX$dqP}S-Uy1_bP5Lek$k}Y-x-97F$(yuH@QI?dIIDiWWx_<~-bA;7=b`;G&2%&#rpwLCsnV$aA;>7F5=sAPr zpZ2224!fYPfUJ~lrhc+>zFSh^$LO3D{UJ;M@wctGuE)I~w0+@0x3$B&6otb6OqpgI*3eLxfpv&*G8OWeF8T!7l zGnvG|@AP6V!)<~&a##W5DcpbG!X|fO-FkmMUsi1PWBn^a>($p)%Su`S5lwn6b}wKqIQS+ZZvkOS&C3YD^AFz?Gh zpSg$xloF#>xg5H22^{*nHowYE3E`I?DD*vw3hwoIjsYd#PeGy{!FOvq(!FG58x}|Kt(o?)d>P2Bn z)wbwrG<#Ovla#5{`&jKULV8CSUFek-!Uf)$is`!k_5JkDKkoLP40nT$AjeqFQUCk3 z1sss?Q_yvWKy)K%EXuz$N@gq+^c7OH6d_moEEnsswfzW)L0sXR>)J?5lFYrFKg;u~ zZd*Tl4kH|;i)c9c!aztPw*d)oQ9zfX$>#OdDT>Ccy=fm<1&36LjUaa^+_x*)|2_Nj z(*alY%XbfE*|&D3&*IF+ETUv=sb7piPD!f?WA|96`2+W502dW>kGml)TW2HJeUwD%vy+I3FBcwmHIcOG>-oZ=VwRl_U~?ME?v1K=ej8EWefFKt|J7=^ z3E-lEuBoEb((6AQi%6?>SQTVl(cJ~~T*mVG{SG14qeix2(g|kd>VIdrzL*vlkW{C* zaljkkNHR~Q{^rklFw7wE2n1Yo&`r!vxztg_U-#WgG2EP^=kvOTyxyupdTp;rKeT8Jrp$_0;fbJGY%-nZu33b#o^a0s= z*Ni*&=n~50Ery&bCBEZQQ5qiJdcj6E=~|BY#sEgvYqQ>2V=k%i-czYlw=Q=Zug7N_ zq2mK4=;FT|tXxPka!g%j!svAvwZ*woix<#67p@VOY@%61DW>GlK0bP3U+{#6tj@X# z8>><}ndx0vev4-d?8R`=XM4bX2D?%f#boP1Z8X8M@;} z>5nQuqwk3x*2oXel_qw7V!IJ*V+;Sjf1+iJNfqz&fF8IJhBv3^yq(Q=o4A`5l|~KT zUtojoUDjJa+Wt5s?~}$VH!2oE?PWxYF@iZ=NEC~j=UQuq6=E^3^t=yC+~p4)w~}FG z9ML^=dvxA|zZ@59#^3qC`ym|At?b%NpuWy?MlnhQCQKvP2Z3T z%fITIstCvbX!re7P>L(g`?zUTwV_aqDjK0iWq+fa#oBS9FUn$s2pT48tlLznT z@j&-WsjY0`pMo7;};TZ9n7V`=Y|iujHG`$hl}p^B<(GAj-!W4B(blRZ*z$>T34Po$3G@nU9eooqrN6NA#5*?HqIwkm!({0$c*noyhE*OZr(eh?DBY`4Vd} z$4w=y$0^pBucX2kAwL$`gyc`htG1HFIqMA!2E57efTZrsdex&VK4ID0dmP`4$Gsr5 zUl4+Bj+tbTf~wJOEm7#bsPVXl{kOCqllWCpa-_5KTh;o9_v}@(*ZrYf2Rt%Cfv(T)3oYIyVzbSB_NhBJVaN3_&Z|If>=Zoi{yGqOTM)^+AA=u1$OSI~MyjxUE9Fs+ zr*!?g1}D`e0?BZC#FBW8*3T9((U8M)dNbKiJf_$riX3oBKv%mys>i6ev9{~=JD0$& z_W}&Jai92c@0!cRF-OpP_V%26&_z#EYAN93DPg3Zp)fCX#^L3wbx<3OKR=h$u=oJD zq@bI#;K>HhCGfS0qd9CilRZ5B?Ai#?@{7XCOM{=^{RPNX`i9Z3U0*OaGIrDW$~J23 z46D7Vi&-Ml{8(@>NTRm{xMZL!(G%h9p)EAH@=+TTmn(+HSR7aQ@Ygav4SeM5uW|nA z#q+cP3Kn$QFiN zI5+cZJErEIaa_@3qyokgCc!s9`LJRw)EdU13bsVmi}VHR>^8?PlhY)Pf0X$1$Gbe} z=SBg#Y$sZcFE5A;k*@9sODM1Qj77H!RpWJk&RtgNH2QB z9%UF@JfO-xG}9u|sTlT&8*nK>w`C?}!nyNQtM5Z=QvEBn3Ppygtq-2HT{)!(*;axgNZBSXRG6lg$KF6{fuI%^UElHYZ-^tT6{DgpcJuMqguyGy=0KkS}S zzG9P0r((w{nC7~xC+;S?Vy^VC@2{C7u&9?q{-}*B2INZ%x;ifP8{^gC@Qm&IzbhO& z;F_e+V~+cdIaKc;E7FM>VI#-)do8FKfumxPpDL^dzNxrrhCE4?`@W=WE0eSMj0SM& zK(|lpq`K6#r)_}tdBB4WLecc+a-IqJAe^u*y z3W{Xn=H}Akhd-Xi!abg;L+gwlbYGqCSp?N&o+!UwJ3h*pr!LtdaO0-33O`+iiHQ?q zFmOO4X(MI5iYfS(Lt@k;W6(jFj~62JW*wz^INY)|@EhPVfNm3)_T^J}+cZHlJo$i< z#*)#NxT1Ih$zKkEcJR~9M}|vuJ9w-D+)3?bf5r(Y76fRY5_>&4KM?$m%|*?ywQ&!) zjG$|VcySUoz88;gho8p7(JW7v#-}2wHmh>=fi)$)!>1yOFCQ2?H+%n^cox0 z(~b8dQ?v`DV0dxtdwuR z+LeX;J6Z3QOMhrmkzYIu;b)>_j~CK!ZP5SL;f?&5FvwrM7xKT&ah9;=QZ`PDQ2|_L z(7nneOHwV;4w$Hw@s}8M(q`J=qMh61nK6`|y3D1OC%4EkgDKM7vV3-Z&~PJRQeD(Z zWc|>1I-o7nrkA=l362jepez4#k!mwHz1j#rXFzvo&(?v5&IOll4tL+=tz}9gn&w^K zSfnZp5^GVQW8(6Z(sZ6$&zK24@*B%1qv(47z26bYmlbq5Y)ue}pS(-K>h+>Fr4!w@ zEpeLVNQiaoGLVU>h;y12*`cLrYYRNdXo5@rSqc|;$V1DB=NmR~arh+Tx{E&(aM?ij zI44S6aCkaQKehz>BTFZT9lo0BrP2Se_a0DDbm_i#OOl+E2ofY`2?_{E1_dN2f=G}o zL2^z45=64(AUTMVqvVVvL2}NZBteiQ2z=G^_Pg#r=gxQUIdf<3nwi_Rdaru=-&MbU z>c97{uH13>yB*`J#I~vH&bSIUv)Hfn@O{oe71i#Ye5LLu`=j!n7$c zy6m;i7Y`C7op8$sFE;}D@`GFt(>7F-U=^hsrK`G2Pf+hfR11xsT#KfVEPU+$@b+Dm z!0?|@*v1)F*O{v76!3mg2B>Wcw|$RT%1GeV6&sTt1GoYp*S3(&U0#q~w5Dy;`TRva zpPX%NXDtb5sn-h1PuLa&OiD za0IwQAh&q;jGvdhs_wTrlac6k^lW~nuSK;~A50Uk5QRq#m!=HdJyYmJMfOOfFM^Tw#7~JJbST9fGYxWU2s^X9@Yg-D7gi& zkJ>a&J4o9Sk1o6qziCf`r!O70U;W`>IC@4pAGxK`dp}%G zzX06ZAotA%OWPxSgO~Rkwhd`Uk^&t1IU?jfz{I%{6xOXS;_nT7`}n%ssf#9C+h;)@ z_A9VCvNmHj@kofrEb-YrR3>nJCJJ(SSZ0%ICXMnQy;pN}71{kN^02kp*-CmjGuzGV z{kS-NH=FcZ=DDeX^)M0dd&<{y$1E%*zl#)=mkJk=*Ofqcb4?%_R>5A+}S&DhDv zYQ{@cjE?;)C3dG8yzk(0f3@CXsiE4LVVF^RADD-Ut+I!2c@m0NS;UvFl(R}qo@XeO zWeae{L2kXf_qBq~_7xS_Je`s9#@mX%RH|34x1tz_LxphX#3+S2)X+#wiVa)Et{N$Y zuCt(anbic2%pcowwI+vCh=T3+4#?#*F?{bHCsm6g9bO<+aBBfs1&$=={z8$1@K~Mh>$X5d7Rt!TAVB2qC(BUXJ z@IFdgj7a`C*QQ7P3HKz5i)qAN_n~*zrICZMGPh&G`@2!1@E&dYfbJxe2IW8dQErd*CcuWl~Z7wM3oeXU7LxoflI{RcvE^ zgjH(Q{ZH?}?CYMWVR>qYYFhzZDUkd4Bu)P)o{ElUmRN65<7S!b3*+Bh_xL)O*}j|~ z@;72W2&$GRYZYwO&nuD*+)&G?l`a+Oxa@sFqvrnWhZq(7TFgJ!XVM^7+}yGpcXKGx z0Y7M#d{u9(sK>dbCy?ys;tpM;5{r^iZVdMTOte>%=xv(OnxLwrdG*sF{Vvb4^o^G0 z=K|b*09OX&Vyi!DG(1ryxzj4l({%oI^}!Kk&sp_7&f?HmpDHWP>*Y&CVTUL%(tCL< zGFuAGcqcD}hFlJ9oy}0wddM?c;pdG1%vToV+OVG-yx7A3vc$kgwqebYUim0x*hI!^ ztBG3N0`oVfFI9g|pfI+x(@i?5tM(dBUair!PnZTJm3lSz)NZav!>?WXlPd>uKfExE z{&0iRrR4o^Mauc58kTCOM!C^lERx>rMpxn~lofQ(vbFo`++P=;zha5JVY9AJ{kTAf zB;ec7T*%{AW6)oDkXupSUZgbl+s*GFJ=ZBZqw;ZrX`wCKK{WGBx`aD<73S?}L)|4R z=B!kd^1$p#GIX^!7`KhBMBY$qvuoEBNrT&|3LrPH@Q_#4J0@-^&y1(ip+&0OTy3Ic ztogfiO8vLE{+LVeYYH0I4_$*)XYiKi*kE7y9ZtU&I9rZ|iKS?4@+^YKHSU63%_`Lo zHo1y~>{~s9??koVif&I*pvCT0iv83I&M{*~@sKX93lOxW=v||u_L}-Y)MYUFn(BwZ z?zYLSHoLrI0pRaFkh{x#)UcU=!#)Z9?PB#%w^u^1>OpK{{_l$C^^bD#NZEyEGG^E} z8f|Z4K@1|D7tAjedL1mldYIh=!T-Gu)m43r$k42*W#@QdM4nHJJ>DW%gz7X>4VTU_JPEk$pxzzyoKFDPt$@C3vW_591e(Cq+4KDq?<Ti;9;S=m;M^{Q6*uUs9|GHlo;HrS!iP;um zSs~w-Y)WSz%ac03UOz<>IsG`&TK<~9&5ibKDXqcyRo!eSA!SW+Se;>LaK>`EbTV`8 zHj4mir%l(}y8u@e5u5oKNA=ZAEFs|Ip+cBc~7Yo6YDWK$C0gJH~$u7Wxj z*GfSm^|~F%bQ%+ z6Sc99QQ)JeB`dU1+FmY|Ha4!arhY%W(Omx5uQ=lVY9mPo8{NgHIjaF^N7LyJqbqwba! zoMT}Eahf|0wfUJeShvP&r*ZtduRBU>4!yIIo__V(Lg*|TKhcdf(<=`T;A()}>q(_~ zd^;zt2FhxzTrYK?&UBx!RlKWkXzw!{>*G)Fd#e(1ZYJis@lUyDJ~@aIbJA_Ql9$|@ zV;xw3Yxmh4{9c1U*T0WIZdEsdXa?sGvDadGBR$E7FR8KabiEMHG{yNGDPizZvSmlt z`&PSdEG{gC>2cy0#W$Vz?(gRb@o6{D6^fHudtL&#njn|)a28VrCqhSD3YIjt(O+~kV?aI^HVu*pYZdJXPNp;{0hAAYwZ8b zR}17i?s5q)^H7W`*#*29HT{iwLUzf+e62M!wzIi9NcX+Ld)3r5$tcapG3CffefLx4 zNK5T|0rTfSl?6E#3P*ob0NlqQx2RIhgb1e_cavU%jMr1;sD|g*`u9fESD}J!Qa{nY zn^gX)>f8CBf}S!NusKm)T71^lI#9fJO;E{hSIg(oWgmd64RVi@7OKeQHlEMCVWASb zcC3OXUO`qsuDhXuc{^dAJ02~ZSlz>i@?O7KY~=NCW-m=B^3mRZCH+NADX7ZxdCnC) zKKTUXevH5LTRpLY1cmuc{SC~e^)h+C@6SVsBRYuZsH7b*UMBV@PO2tWgg(Ik`uqGU6WQRk?4DMg(fLz5H^2oH&yAdy;GU4~!KuJ5q`V%T`%rZ=HeLzq%mTl&95pJPzGtXajZcF%+G6_}ECbJoNs#Ui|+RSA2i0|INc$0_o?YbjaQ?=*tROr?J5R#!;>q(@1334; z{d8~@iK1-~`(C{{rWgsTIWj5$zM!wcj`Z=MOK{1E{;64SpQu?>wskO`vw0S(u zK^?E~>mJ$^?3}L1zRwuk%A2zPDf#(fzT{~{|9U9BG{gL-a$QJ}y z@N3Tg>=ywDpLtb>guWVa z;I&@;I{nhnrDW$z9=DwOJAv#5)$wKxI+GN`nHubGLOJ24z8IDO*9hc#Er+f>dQ<$q z9Y*!S_10+VQkhco_v4IwSDIheBe;0l$b7Pb) zy@VRF@$g2kP*Y3X@O2!{2T#g2C)~jOLKBet%X&14NkM?NtW{V3ioIr1ZMF#2y@FS< zCVGWZP`gWs#3{%9c-3=M^VWPuD7SCRhXjq^`g(deZhW4Oa^yASfDfi1_bSEBgQcy} z!*6R9LSalo4X&$g%mx%uTU5(1%a816=R|FxrJYag@e~7Anss7y+LRp{p@)uL!M^7H z=p!D>PbYwD26Dd|y2YB5cE6N3n&SJul>o&X)fKj>7F};I z=7>;oUPP5Q1O+h&oQs^v%lU}0j@d7tyN|G zrY@$Y!N-hi(ljg*qs=vGbmURz$#KVs8V&8@^f_5Lk7Li$!LX3^Uv>57@A(e2ichR^Xjud$#e0bDDPOFi+` zvjR|tZy!8zQonN&ixv|piSd_wQU2nCEy!J})WUy)OB6Kq&AUa`^X{sotJAP; zYD3e=HZFC)N@#>mgYNqt%f*(M0AKfH#ZK1y_YHr?IPyqImlsQ_dkg>J!yozDfm|N* zNo9YhWQNao#qc-1(!Yp$@m$BdR&%1X>9NsyL#tZ1y~iu2a-xaLn>Gf6Bix8C(9a z>w{~w+qP0Vm&)rSIvXrOnmqefT&HB8zJyPb0M{MlWe&SA$)l0oWQ-2o%M2&)J0ncCEfU(8aS6tH@Byv|$bIE6 z8c=&F-d(unSMYA{+mEJizc4b-CR$ya&T1Ou9xt%?In{_}{W&OB@e>(c(v(@@@&dWc z4?XtQ`$|}}PtJ`1t|!Q4cbsN7p%*8bY7&8tW8IaoHm>FPbduhivm+Et6+gqU$(|-U z+Tye+Wuudp5$>hUPgnAEDV07xjqb(3YU?w3fa?WvA7-AkQ`0fqi^Oa76cEy;S=ZS2 zXls!)i^_{ks;U+m^yX{f$ta8Y5;UhQ^0CQ&D9UR)C5@chzUhV{ST5@x>uukkUhRK1RzYxtjw-V06eZU(PL95} z^();iQ%?u#l7a+GF1nsBOx=l3`^?_OpO?RS-ExXk-_#aKpa3p_vX3v%7~ zyB$us@a3Ni_k6yQnrquy=~3Wooh|unv}V;-FieH_qJk!c-Vxh~SxC(E`@?MXYeHfc zeKg8B8%>l%m-@itseT|=f#~v6Wp@)d`I?*>*_P~YUK25t$A0D4UdF7Y&kHGl z&h@5OZ?8=MUW$y4{xQ+Zj55VEEFK@F%XGYI@OzQ|+>Uw)ay6e45DcrQl9_An;~K(Z zc>}S7eQUYcOGdeC+Q^>0{`m0Xtpql^2tnve4Nlztm2O?rXAhm*9A6ryQ)Blgl7Z)W z{Xyg>T!&4#_4w=jBi-!l~j4ZQv= z2;@p*#+zcR+2+&V7kgvxc7FP@r_%EB&^-sU!jQ>pDZeYp49^!IIa}D{HJ0>7uV3q~ z?X7G)e*L?}sxBXo=^zI@zViy?E<0P5plI`Lau@LeO(Bh!D})Ru#nYr^~5S1es)=jF2Rk@Dj>u4yp6<+?~|eEN2q(M#0Z z05=lkMrP_L7RPnGu6fgCE><8%Gei50$I}dBzJ?o(GdI_q?B46b^)S4VgnODD&wRY}xeNu_+>+KVU$rmB(arQHIphB!UB3QdBWH;Rqvyzp zBkFd}c5d83UD9~=^{;$;LtPRfLCl+n9M>G$GU63f+@;A16!QMqfBR$mEEeQC_^Nr` zZE~t6H>(sMwWvUam60}8r_Lsm;0d?QX;Z z@hiL+%96p{#(Vq5{i5YEwz*ZSsj2Uu zL?h_wwlQJ$6ue&~5#(lz+=|=53OL?~>ko|VVzao4ekf69$@;WMVUM#-Rw?I0j;4gv z7~kdKB3Q?}K0?>m1hbV-nM?W<2_tyx?z}Vr@=XG{uG(xq@9I(b(k^6$?yeWxg^Km7 zuYa0cemKwhBE9)dD9XeqN1uZ`s)JW)HA*7FZf8s75lxHjy@?BMP`;&#k`8c_L9YD; zgZ0sUCY-~|>wE1N3Ur!w4Y=R<@8F9xt;zqOQcKBQq8t}!S{*HniDkT`S80^xX=fc0 z+Fo@OdG&I}%R@|nn*wr2UAj7*Ct^653tWF4u$3zN=kl_kgU;H^XOS$1~#9bO`Eq7e|k$~iks9~ovve~KWgxtrKdC`zs zbFGfT;=!XkRl$G{X&^VAqg2%5;_k#Lm5{%qleBOE6Gsi>azN2j0V2nt)d3FnIJcJ>qAI7TcqSf@MBj@owczqE0@xIl)I;y%iQJYlt#34Dkm>O zXqA+d7v&OM=7KXz|+>dRM*is%#i${jWRb;QfW!Aoo3E zP6AcKG2vTGg5Kpk+g+uGIrC?oZ9_I#U%#>Uq*?ZfbJlavaYo&6?_Yfp5vf#W6ll!9 zwe@b~BO|WZ7SW z3Xv`%7yb(Db(!FGLGM5=0lmr$$(>o>VTpwpp5Fq(QG-L;_gpP@GsiDK?g=BBT&>Em z)zw@iBo$j+Vx9M)l}ZvQFlSiodlh`DHT=#QJPw`@aZ$W{Cy(`yS*D z7&kr{J)I*YRaa=dwe#50TrzI`_mNQgZTb(T1>S5jBF#A;O#||Ye2l3`uQy{Z2K5WBv3A9DkE0bd)B+N z=Fq;X#q*BChfcupCc5zCv`B#tdl5#qKp!KCZJOE^HsFRNh&8yV%ZO;Pr(%YaBn~NPUS@+bkny`j)1Dr(IvqV^xt>E?e!9n z`?$M^-rr*@YJXu&ji{M*ty@Fd7>MGlIoZ_Qgh?jXDwiO zmHchhG`a-mD?Q^FVq(DGQjjZ4gd*N``g&*ACJEc17oCRPoOE(4;@nyI;UHTh|D7Zj zeRSD*LDNJLJlk)bI15qu@jYkvJr{q{&3DRUWiYV;+%k~sxYam=6E|B}B3LEQuzV%w z7G0=i$b(Z~p3`KzC@*2>wyaO{3p;#|QYBx=rz!UOXS^2v;A{7NOiTm~Ll5>Jp66H& zav9%QC~XlJWl4;T3CD7NXHolr!NlrV&P<;i^6F-&Oj>4zrZwdZn(bn!Xv%z-`OJ?5^B`bVeTTD^qL7ge_RQ2^Om;@U#F>!W0{_sC14k= z?mg8sCmLGnkXpD`Q5~QmGC}m%={Ar^apgmZ)FJ!Y`}JmgIh#H2yI;{GcRE+a|E$` z&91Sb8>Pn-iRo_$5e552HOOtB-er`I2{!5sP>gZHgfZ@g3&nS)gud>+o-#bT!rn!r zrhi0YwbK$u<1X}74z<;{FL&&A2(4GuCf)54$-7{C_y}@mon*JW_>>uLvRMwl_z)69 z?Dh(i$j@?pw$@sN5vx9UcFEakU*>nLw{@!5{=LUhv>!FC$Uhxh=?*<-jCnf_UdL1e zaxphd3v|Oo@JY~3uvTU5pE2D;9pEMGCKWBBzggh-CS$tejx&1Qe7OI+ehEwl>-azx zjF_lJvgw?d;7w<0QgDB$7UZ&}e|&=(jw|{*un(n>>uOb{I0b%kzkYyQ z4{|?~Swuf)BG9q$*z(6qP%^yyy=-x2I<0|;UA$PXLf8b0Jm~seed&u;i~#Q&KFQqh zeJ9ZHtkPozF zv}kCxDK=JR&^q`a%3V#Z;g?QL5Ns5GUn)~k=va0I;5LHXle`t2r{5!mjw>9tk1yTR z*nffJg+F#k)7X+=PUG_AOvizLv#@Kn!6$1_y`zQ%@8rQj=ZUhhZInPi?PcKu@Hk8p z$Q{rnpcv9vXI>^RZYm5+=HEei^nmpZmZywbaqvo@pzwz%j66@b^YPf0BBE*xblOJa zxw~6$0)7T%KW8|)L1Pc(+YE9e_C0vZdw03M1flvn;;P4&(`k{8Yd?sW$mY|fWfoVy z%bOXsH0bFOAWlB;K$8>Ma`?i9;~=-UU( zCf?C$_d`eh3WkG@GtM^-k`h~9QeNo@+GeZFhQPR6b^QQP|Q;Qb#!o5Jg9UvEm zH~i>M1?saR27g8^sivw7BaFhV)2#mWFn*@qpPZKr2-Wdt?Drd=hy@savx{rKR92Dr z{xl<%Y`96`Jgcu0;C6ysbv55WF7``w6C!+@LXAQ{L%vLBT$>l@new5l|A`W_DL(38 zJb!a*b`XUv`Mfpn&Gq)|YoVfv_QRHXsgG#ig8l6i$VE#+!Tk^ypdzbck?``{=Gyr5 zT-NcutM*}bL97JF2@YP%;w@LYlWI_^<~SRldRu7ke+$f~*)S%M)`>Q`)c{_<(*<&M z!)kg{)SG^zWfrt`JN1$HpnJXf;)XNCxQkURtR|9l@AAwC zmLpaCMu&RRCfWn=d_XtIwQx8v>nRD8`&w6yekUQidW(?FmG|@cPZjzcyO}8)#-zg| zN4?pzNo9^lR%f{{lQ6`%so#|KM7*d?6u4GO=mGfK19G2FF`jw!(1m?dPh@(l7coWs zoOi0#`eoLoKHnOwF=CS1%_!T#>uMb;KJSzH>bFCDObN=Oz2ml}xMzey_wNY+++L7t z+C1OB?bQ5~LPkz_wP@9HXvogOwrRwUp$djkV=QuKT<=Dcid3`6T>(sA&%A)}nGgl1NE^H^psbzjKk<5(&D2P#1U;BlCK zkV`Zo@eDV6vIA`#HElu|ElAWt7^g$T|1RlBt>9Mhuv-3Pb*NmV1l>g66x}$9z2C=o zwyC>a5)7v6LW+}VL7xGC2S6@yNf0k{>iG2F-adxM+ZzlW&yu;kity9Pzn>Sot`KgE zlr8mXUEyrdc}ImtcEX<)-+x76B`4`Tu%lQ^+_)1wKlBCUx{T`SiW9R`>4{{-uV0hl zSFUP(bM9uemR=^ldhb!%vsRTy?@DFR0#FafLtSRgc|X~!^6fF746#1^_RR6&#~~o! zL6A%Hi)7D5Q(neDN`(#`4R@}7e?D%V0v8lIs%qYtxEh028J<*-4w@{enW)8&;TH&BT2u%?Gj-8$)}B3zVVxm3aO zXE^?-4;72gztbfjb>f4^A4Wm$-|>HG$3X7i@qcN@LGIu2e`zN`?hV$7&mCbx(A~h7 z)(50-R$U5_Hac+mlEvF|;b4CwN-w4VVA5_JB z+E+|eLXFluxy?g}E8m7&!m*P{w;S}5;McC$7j+(>-WEVED!u9#S<{lQ_hYbj(;ozi z6sk)I`dlulwaCIye7@E2lqvRSQb%1tL;G(6t@;7Gvb0Z|=9-BDlVR&SPd<^YZ~)vz zklQMoMnc;~PqQ^~Zch*xP3anL(+ca;c^bvxR6|$&ddM}MmwDPVa61fVddMV9-b{yg zfh%tS<=Ey2-m8nACGa^pOCXnPR>S>)wf>YY#S4Q8S1Pwg1ET1gX09Ve<#dl>+&`c7 zRVI1ld33ATI^6dwG!Fmli^FMpt0qfnvugu-g5MVuAm3$>tG`1sW5LiOXu|X{<O;zO>@e-8(Ox6J!q^d^O3?I@)c0|>143lZlaoPYP=zhi0b-%Z%~J&-xc7l zfLu2JS2T|c;^h1YI0eSt%>yFd?$B6hwqB`?qje4XDL{}{niFL0Z7se+)G#7jTI@h^ zBeiCDJKf^S$cAfpnI=8JT?M&oYU3P{>4Z|-%toXf9EU6b$l;6pusOm@+nngx8-LT zRaJqa4%%Y}RxZqU0cqI27KyN`xv0nzM?+?=$YZ=kxtqebXar`x7Rs~ivszyn5dryr z1G$L}Pa24ocbObgU_)1o#Oe37c%Xb}|8J>BGdPm#i7 zy~v?XV2nfco<<;K&jj2rTm!i{8~d)A59yCz(*MQ^{FpSa5^Z4g{iD6+wV~TAa!ewI zK3TPN?PnD#O1qa!CnbChu5+xR{U$F{*e&|O^B{=Th)T>r%WGz`~Y#=l-~D9U-1 zKbM+ZHatZ)iQu!?9>7ubk6*{rzQWBf*>1Zu)p^qzLlZOK{6XwYNy{_CI>LlweN(`P z4UlVpHx4&pJ@DuS`Jr|zZn~X(Bo6gXCS}L%7`yvI$L__9ZQfo!YAz&?HpBMB8yWgK zdxe=xhw+Fe8^1SIZB>BRU2TF~$8UIPt_@Te61K^%^EgQ)Y{YR3+#)h`{jQbvTZ$cm zjwx@F-r|1GE4AzCqml8OVto-Y>8vD1<*fLU>^zDI2gr8|#@KE}-}@&@mY zp>(5hzvs~-e`@};$Mnq&fV&NHZR*}lO2h~U>ZIr&(TOqDJ_rsuoO(fC*?v@Kd`gw{ zR6SQ9PDFStZPv`T=4E~eNRV88mJ7MU@8mR#H z2gp5n^xh*Tfal5QO#>C7C3RJS$<7JR^ws6JU-5Nb+kLGNQtb-+IV@4}X8m1lnOohN zH`*P#PpQf;a-|u~TK62l=PB%hT!Y}BX3NoEKDT_@x>xH%TYef_cjb1*?_*~|F>29U&=38%8C+)eG^zSqcW+QgUomld%1yU0 zTPt<-mw;ROj&yn0HHD-fr&=#@2^2_IR6<*DEXq|$+{y-GyP{0;os+&Y3s;_TD#aT4 zf!9AAf?V3JooKQ9-=vNlJEcl$Ge6Q4qSh4USEP^N$Pr6B#xAf^-6rkhGc0ztEmrmo z%+sOgUzlC1PD~35?V(1wyBG-MdjxVF7QI&XUhL9-58t+`;*Y#KAU*5ce3+{7 zTB38;E>c4OV(o67?@1#e59wS`JXNZ*=4hIglVUi!7lB7Ez&!@Jb zrp4(vYcj_JU5U?>HbZ64~gJHD`YB-WaTl{1{y~wIY0Xz^3Az#lb)&n}+Uqw>Umyz;4xO z?kbS)Z;&g-W4Yyu7hW(J?{PNPv5v#6;?RMbIs9w`>pSVR9A?%cC4p?w{e?5F@sZA* z8C`)~Z+C)?-2$D#gAG@^0(>8Udj@jYAXnG-BTXC5)Vo|s{fC(=w;j}qYO{Gq zM%M&HC4?^1b_Y8wJDgv`?UcSoNF35A(GtY;74ueqTKer3rP+D=*S6sA#RbT1^|7aL zXv>xCP_K@$EL|&a%2zYf)9M&>v2HZ+^4V>%+qmc!yREx?8a8~~vhH}D8Do6l{$R?WjQ)|bMJNS)$;B(0DtUq;hVr<(YdVkR*0ShfKh$QK3V zre-x>)7Kwo#pgKd+j2K+yKBIH8cI&-IqkL-%V8cRoV#kasct8}Xc`&SFpHDfH+$1! z=hb2I0AB}TqnXDQGk}WI4JYqqO0dYe-<@`;ot*A(S`J#4xE2~m9bb>x zUbZusJKXPh^inK!f1vmI>(7E_t4TG9Rr#0^i=qG*4di0;-s)Z0oY4uuUBFEvm!X;* z+fP@U_>9$fz@;_KUmHj~cwb4;|qC zj~e_NBOqT4fQzP4NMARSB)0YSMtO~EAI^%Hn|8eu%p|Isyi8T#k*0y=Jln*#?qaN% z%Em4{>0q=UoqBV&8tmuM`vn`&%?Dxt_cF-Mv10k<6tObJl@Ow5JRRKU5|;L5;$Fs4 zT<6sa4c5D%m6B`xCKC+=pYE;iIeSM+yuH}875e1kP%?)jZ+=O`8sK7rTrM}57lkXS zhp{9##Rfs1Y=`!(nz)DK`I`6h{X?%)Yu`8%_DzZmUumo{ z?Ay4sC}lV0ebCICT2e>#Ocly`s z?x-`4{wIBlv;np)WHFsCs?p`!3fJNTq#{ge>EyO4=^c55M~)A*FrTa`53V;oH@!2? zPQI{sntPm=Ukh+?L2jDk%4OxuPT2i`+s%Ucs5YV6H{2%F9^+*Y-3`0EYM(_IM33Dr zIU8Xoa;w*~R7N1_#>M=eUBAZmfJe^nG{+o(iwANww3$R3pJu3GmYoK^yCq!9P^ziC z`uX5(!z)2{Hl9|Bmx;XhH=AGM3sqZTym*uJxcHi(5&{2AwOh|tq5ZK9_?!lOklPUK z@@n;bfgwhFOD<%TF_5L!yC*)MN0!7?JGh@qK=tsJF`>Bw^bGFT9RAF>wiS%qzN1O5 zBX4nX#8~BvsS<&F2|(_3L1r|g!TAl+tK$#dJoCCH(~k6yKFb8Zd@S{5rl&2uUvEt( zE0uJvNpfqOLVxASNQmkFS7#d;OeXNR zZ9bA#p%!m+I6WM_@2z;vApJtz@j}7G_Td-`ZNrGZzYVp!zN)}cW~R#w7QiI}x%lhM z&mNi?rSrp3hG_kq`Q1ds<@}C6O~K4$h)5sV@>tC8k4dAf)6ia#DT{W(n?mC|S&%oW zAzWt8EIB5bBmua@AeUfkMVK%db^M@mG>St;8;hn>{M^yDPp4R%V(-49G85{EFz<5B zYeqTMo9kVbq$^J_xy)tWjgraA_%@ih1{eZd5|B%DgE5vq^Xn|(jpR%{pF7eYX3{8d zB+hM|*NAf$_(HN{skl;Ney*QVq6IEfQS+2jVI7U+InP5EJ)VE+xl7dsa7jU~@lA27 zUp1cvI)1&DDnJ)YDJ1prNe~kwtQ1o=F|b)0XjGb{_I(sRgx|PGQ*{01bt%!k5?iN% zt8qMU=|AVihX7nMkXv#fRHHX*_~g4*iftQF+n3YKfCq*o6?>N|gzs8OW73+ch4lN? z65hrjlvs*jX?|s;Qb{CeBH~x6%9Z!Pl@i=)kHcHQ!TV{<$_#PKEc2j81K)w_p*NpMy z*7(_IX3HS8;zGs;R$I;ZQkrtr<^*}2j7KGU_HEzk7PBX~KKk8!hDG>jAEpUI6666Z6H3)fg$1gtxj&CzV>&N;d592&FZw$#(;iMm*l180k$ALzQ&;gRuQjeo+B^T$IgV&0-;NdEYm&jXrzvvu6&|Uk zEf(G{&xDJ5W;Y@3UmM`}8^VV_$A8A~_y1Xg-%AN<@M-^<2lyhtf)a-A3HJGC&J&p% z(t*F#0r;+#6dnwQ4YhG4XpH}F)YjqsHv{UtIRB)}1oz&^!NJ7A2nORM`J)d0)_VN^ zn-A`RE$QD@ukifb44zxT*@ouU+|Ml>;30DOFFFAC&%)f%96q_;m4DuL_+MNcx+zYBrS3t#X3zfx=PROkJ|_EeKcICz{mfn0sg%-eE;z`5w5+2G=jgOul}R*{AcCDy}BX%AN~7h z%@vu~zqSMLwnip{?3e%AwTR3f>A*jy1Mu~WqQ*bw_{Trz5+k!hI`DtT0eIi~TleYU z^Zw_3ga12O|9!vZ-(@-ezOEo?NC*Bg4#4}{LrWM8>z{N#9)4Wj*1+Du#2yAyu!g~) zQ!hUM7$=a_|Lg#~ZM<;&+u8^Fwwt+9*|4Y{<{Cn0Wa;f0g z7(kb3!rxOtFAQ2=ZHuZ8e)bI1Yd0MY@Z14svu4j>&sI)HQl=>XCJ zqytC?kPaXnKstbQ0O&sI)HQl=>XCJqytC?kPaXnKstbQ0O&sI)HQl=>XCJqytC?kPaXnKstbQ0O&sI)HQl=>XCJqytC? zkPaXnKstbQ0O76Sq=Iw+=>XCJqytC?kPaXnKstbQ0O_mB*`ivEX~ftUvV)zkp#mRD5E>B_ z%OaMo6rmAA8XZC_gEY8zBv4_5G`MG#kOsYAq)_?tN1ei|5%ZEk+Au=c!7$B_+ zp>-j&>ySo`(7F*CBcx431wQm3G$tr^`ilaC^&&K8=)DkB;Puys&{&{Y7%K4LGo(Q; z7%Nn6!v$y50j7vy(g$x;&@hddjt`38BD5KV z#t&(!2yGUj2|!vJLYqTqf{>Pu(B=^uyv=7Jv;~BA3)0XL+9E=OdyIk5mJk};;|WAN zT}EgkkoEzJ;lm0-gZmEeqwrxB8pA_Ts60Su-=HzP`r&o)5Q^b#eGQ?BL$N;;!`u2g zG=`^e2Py#w?K@&R2}t9CVtD)ChQ`nfCJ7Z*D1f*1AJ7>79a2zHfC{{=?;o?P=UACUkL3U6vLMp-ZoDVnj#d#ml>{|A~Yo^mOyB~5t=geo*QaI@HTgb(C$O= z0Aw1xEuBLeyosqmg&J-oG@wHD2TxTMD)9aYAJ7mQJU4iMgb(NlO&yBi{SiK3AhZWi z4DXNdy1xu*@Q)ut1->4I*F6?O(|}_5dK9kVKpOOdJ%Wl3q`}(*J|w_%(S(Wyq`}(* z0YcM)Vm?TdfX0Lf?J*ReLNiE1V}4?`N%EpC@zI!_;3xOnLshTZNuw@7SiC~YYG+kdH`N8^a#xi ziiaQ#UN6@X+A}C_gfw`)Fd;N^D2DqCuLBlHgXdxamB)|+ctdQLrmug#TN*TAECj2JK+5m?xO%=US}wVue;zr z-b83FPz?6~?vD^+URNldhVp|iw=hC;gW@G97x?msAT)QxbnxZ5jnF)x7~Y29(~BZB zEyM<&65LQ|z!r7l=M#sv>;4y8c+l7XWqILqz%79HWeliXh6*NBu%Lnsl@REIP^iFv zkKpS99;m>7U*PKiDoBTK|G~HSXrKb$#)EIuVL}DI9oGoKo1oGRl@_S9LZuBV{~vpA z0Up)W_3=({C%6}vLI+3)!QH*M%Osh=K#Z9LFQmA;6e(^kEmojdaVb`;xD|Iwp~dC? z);?!4AV-fOSDwwyD2z+UhTGG>BVU^bWoz6Eo^JTMOTlvR9rzxs06%~q!Ah_StOjeqTJRHC2iAk1!A7tNYzAAvR59|lOf&<_nI0O!ZBj7i16dVJ`!3l5@{0>fm)8Gt92~vSHARR~#GJuRA z6UYp*fUF=p$N_SJ&p;k9j&dCjCV+`x5||98fM-YxUw2_$Z<4YFd#*+35P8ORNyk^40m0`l-oUXTyu2L(YYkQ$@` zX+b(5K0w-c7)Z!;>1VO+GYJyszHmCy{ zfQq0Js0_-2a-cjY4f24zARovN3W7pF;^QnJGpI_vRRh&Q4Nw!*0<}RMP#4q#^+5yB z5HtdfK@;#LXbPHv=AZ>=30i?n$WIAUfz%)kkT~2Mqz7Ig0Z0hm^ZYO{9E<=X!6+~q zi~+a79dH-i0}`h{05`#Pa046z$H57(4@lfDar$0h0|C@~AP53oxefwWP@n6L96N!| zpbcmXiU5h}&q6;3&Vvi!61WVmfPtVN5Wj2((r-yWl@AmE1wkQD7|g@g=7R-bE|?0Y zfp5Sp(1vH)f_9)Br~oQ~(qK6B5#TE@5DWs*;AFR}S9FbzxxGl0bA5{pahJs&It5??O{udw~s;0<^S-huZZ5j2UnCBDAO z^>rX|^$~Cw`~o(DD9W=l$1WfMNL-ZytiT2&z7B;R4kAELFq?Z4V-E&HzyQ#Z{B!|d za9)RF29C)cm-aAhu{(T6I=&Hz~`VSSV&zg0*k>MFdInx z(H=DCygTRt25>zZj0CqS=R4poxCico2jDkw3>*i$!5%OLYzAAv8X$3VF0cel029F^ zFd2*jqrn(33=9S-Kx&W%qy@LAuiM}bxC`!q```h12p)ky!DBF!vY7>DgKxnCun_bG z{lEY)2tr%m#BnPhbZQ5DB6{FVGuE%q{V>#Lp5hOMEQxu#5#H_Lo?H z73c_Bfz}{7NCN&L%|F0zAeeH^!7&@S%XvDE=|M*Dp6kcpKDYsHf?J>%SW4Y20pTD5 ze8s&n;3Z}C20R3(z-e$6Tm<{URSN_1HR7J(sP zs9bY@5wL;oUfLfq7r~~SP`k(=Lh8{nYp2U)sKow9G)C3)X z#KIE$+IiLiB0&`B1$u)%pfBhL`hx-BD-Z%~pczPjobDW3fJ>y6n!II4=3tI8*X0eu zIiJeCUZ4Olfm=NL5S#>iz+c=R56Xgi@W`Br%#p~PNMRuJAlFFi4{!;b0q20s0}KVj zz;I9km_ZRx7g-rOCIv4@;}AFiWE}n$S|88?GyzRPV^A4X0aZaS(hLK>zz4{fxhTj2 zvH}?|X973TVua1JB{wMpX^vi<;9f!ufMdx>kQw{_(8Pk8?Um%w#!3Y-Qz!7d>3 z+ktEFUjV6qq<0M&axLc(oc9D?$TNW#+J9S&pJtAAM|;QH+~EPh+IS zJRft$ywtXJq0! zBlrRo0eL_nkQ-zMIYBm%1!M&|Kz98)7e^U`6a@J|9*`Fl0Qo^4AhDJBVc~K1sX{k{ zJfI{f0ZM~Xzz6sOKTrWktR-!`ynZfiOxju{P!&`IH9-wf9Y`7015%z6e>4OQfWCC` zUfQZWBW>YJAZ07p(vDk$R-g@N3)+EBKV;k@#ka0s}&=52L^}$=7smHM#koZgD zF^S6x0_mG1#(KyzQkJ8@18@)A26@0Oa2;F$KZ6b62e1Ns4|;<|U;$VN#sZNu4D;gN%4zL|;1HXW+U<=p` zHUZ(i3@(9--~u=g&VjSw3^)x=f#1PNZ~`0$$G}nW8#n?EgG1mTH~@YH*T7ZqN33(X zC%6f2#5$LIUf?dc1M-0TASpL9fqyuE1mwBD!4vQocntmoVuMeCJpYWNJS*q&yu^}e zK?)#oS2FOH`)|N&@B%ysufR(nd`UoJAnAx=?>W2!*MZ2CelP*>(vgUx+!qMHGi{OK z4blK-y3)@%Wr^M?xt8=(a}++&Rnm3p=cGGj3Qb~Up$osn%<_z+E!R#N8T4l)k8)2S zV<%_Xh#b*P^bx*4KsL@Lt|$Ox%q6jTPLK=a19^bNOL;+lP#hEnV$+2X zKL(EDP#_8lXC;2C9I{paLil@*uwe5POmHirlLN zobA@xHmh<^cx!^%pcbeD%E8l!V=K@cGy_dR3;nt!$JSsi&q@6ZIbb%J2qu8>!1+uM z&c^|HRxn9F3ZL_tnVe4nGr)8(6-)!)0P%y8uFz)zkx_ zICWdj`4X@gNSdOlvFVa8k-rp3zC;(1FT8@Ez*_JF_#S)*R)95N zHCP3H1S>&Zbe89w`iss^S-)^DdUWTRV2)eCX0Qot(XV9=unp&#ILde=0}%iAj(fMk zEwCNj6KBuuq*-jmeu0^NV z&&NK0gB&SCK?>|XArPB?51i#I11{&elyw5GW!_rKTFO}LU;0atA#sGvE6H4BQXun7 zi9sSDa@#J-mK`q=kkpT~Y)(iRyRbvfzall0|Ydd{7(mDqC%;I!jwBqwDj>k#{ZjKO6r zz5~nx`9NMEYd*5xBkMjnK`#B;d7g)Bd2TF_`H8xqBKRB>12Wf=9~1_KfXwm8^RgBq z_XNTx&&#>JR zU>J~jp}}Afhz0|IQ~x@gOWIX{tn0}7j_4-ma;y!igPNcQs0OM6x#v6ztrl?RH+FgS z=YBoV0MrMPmc;WCAB2D=T+3W(Q;?SHFF7^_jX*=-F7}V_p2!p#!XE;q^jD5+u%)`iY?Sb&iJu7ggA-V*D0AK;~ zY!}c8h#b+Q9eo__U&lEgqF+1jOP!AbBf$tT9E<^Zf!NzjFa1($TLE7*0bpByeH?9j_5uKNIF7u=4UeJPF*EG)4)_P z9f-VdIL-hIz-%xF%m?2BXL@rvp9f}92RS&d2Md8bzYZ(`i@_rB6Icm8=h^Q${s;ze z{sYJFz;dt*ECnloJR|h4z$(sH$GTp_`C9M`*bX*>jbJO-0JZ?AKbLX>iPttOxD|5+`u8HG&j`O}uQiD|bwLB~9tYTBiILf-K^iO?t$bK(bHnbD$Aw_{!&zI@9W<&sw_LY{bTm~_*LRc~JjTkCJ(H^6@Y3SKP^DArdY*w&y0}kqhRF@#VdNUUar&+CB{RKB3x)eau{a{_ zG6o)(JM`(}$nANd_!ajp?uU2RHm;lA`3Ltq-uT)8m5xs-n7TX6j&7DxrgznH#D5Z;+5}tI_h&Pm+ zrP7xzc&xy;isGwuvv)-vb+|N$7HN}oM$I|hI#H`s zJ5)NpQVmt~bo%799lJWR(-SDZTK&}3wZ0#^XLg(0O%LhPN^5f68pVI&)H%uOvS{n(++LrRDf;(3O?9*E8}_IrY)z9x}kwOuwGlCNV&lyel-h}Ju7=xPw!Q;zmwu)vRfVDA-$}oB0fuw=C~8} z911ljRp*Ebv|Aij(}ukfDQ7pzWQT&~h>7H<6^pdlnSQ>Pec09>P^bf`pYl+oPEV&P z7nVL#gL+V;ekixNElbi7CZCcu;F0#z??P_x!-3|$LZN>AiB9@SjWTL(_WQ8E+Ca;gVKL=SloL=*GS4qe{AXBD-0`Y{7j^PoDm8 zcX{WX;}Uoc;Mr72F;3?|BCXA3OP@ZZMgFwEBaH%({K%T5l-rK%1(R&)+~p6QLW#-> zpipurxYnuZqel@?%2A?ticnjaEyCh(IFd~KD)5`~eV~*<8a%QaLvlLIyF*CGP_H>q zC{g~IN+;H&J>K(G#GEsSPYQ*Gg$f@_lf7~DqtS`+o5bPKZMQ#4Jm>PmBJjWHUEy}`8L6W zeTZ(yp@?olZFldQn|6NU1YTRYlZiW5I7*4OJo%tNzi{uiN;g#tZ=i_QJ}LgXU$l0{ zL3bvv&)7ivGBCv{p{ z)7l%wq~;z3wQG5);*Oe1H^q|!isbl*aG!M{j{@gH(LItuI+Q^o5|R7_^ej-RYRa@_ z;n8cZITX?0c$@E!)%$zi%>-TprOjbgZgT3c<;P7WAdoYt58SLytZl&G8h=;{2s`B{J?5j*&DV93^sYkvBH(vcFyc7D() z+nU*SCwO;qA{4PiYCFOb+0ER;+V_NG`@2)kDkg`bdzVrefwbVNnXY_OetWX7pokqH zt#>zDU^hJM;n4BV7d3fOTc;q+=CJm$LRtPr>+{Xi-;=0D=Sf7hiB+Yz+d5a3`D0(H zbdboN=i}pDnh9OB^#8!f2}`zp~_ax zUzZYpy$p(2e3yEGDf5kLDgHpukC8M#({*pnsup$c71j4$`&{tQ*Go|G7ZkDhA*-!N zitY$1x>M<+OBqtqf+* zJea*_=*E03 zaU%zB@uTF(&lF|}3%3O^ThJtTfqc78k5TEAlKdFQAvXydq~?m9T4X=oV{HeQ27N7| zA=1uGB`LGh(?#vizep7i|0)h(k}9k6kmSP^FLE~LNwK%;sV75v}v)(u{lFBJDl8>o;X3YmL88ttD(Z&la!=wA&#!#eA ztEF6T`r+`dv3h=}Ik!=bkCaYatyMazP9vl{=dVFJI&2fa&ogQEMy2~fli61DMd zaU{w2d!gt)}lt@)?^~Y!;lG7C5UOhiF>Ge`79c3ZL5%G9BZ%jLS zOwiOdThAZ3qIi_nb9Ku0FJ_;w&@yX%DA=w<(SF2<;&)<2-g+M#YPEN@lH6er(rUYA z+SSV<#~mAuG=22(ap?@yJ$W-dj(3edR642*EI~mwdqlq6GqUB%*Nj#VMU_sl!`jOl z7U|eHad4Jlk49cjB`Sc6V_t9L6+#iNPy zXwp(NITU?x{w04U4a;UU4@G=@l7UHQlwN5k9qH;(z*GVXMjxH(*Rsd+v`g|+0xuZ` z!(yrfB|VhvtE$aOn>vDCMiij3O>Lowjjnt7+4+glb2pMs8OBnWZx9r3DEGVfAD+Ct zzl;iWN+cBVJ85gwzL2)kLy3fR%GXfxLK!f%Y|o^jGbM(F;*0exgd!G_{YB`*?;7Nz z=A1lhph%>jIm4}nMMl=$>7x7sMYJAXuX2M$e~)~tQABS`V7Q&G#B}cYgrLpyZ~O(N ztiWZ}SLri{GvmcZZvY*zM zyhfVXL8Cj#uTQbOkk%;ah$UKkSwf<$rZJ<=P1*ONM01^oHWy?I4n~;iPM==Ck83z8 zI}~kz>|tgh$YG5Xo+HCPyR&Y67i~U7%{gSGs-;e=&JQ_|?M28xNF(YM4XloUC|gL7 z$vc0g8oiS~{TT|Hm17v1A0DxtU4t554ZpHQ`bIHDyd@D*poMh4YTGtfm%pdvgd!av z(hTM{$WL&HB{GtNOMb1|fY6{Mih8y%8h&9Siep*)=JhtPe1_yNtjn1a0GkrsYMajzSc@Bm2MTICRV)0!AyaNv3 z?zbg@mxNp5EkkXg5cMP`u&UyVrlympvL!fAiy)HnUoJd^o1aq@J+YK&oy2%T1>N1KfaBAxSZ)ViHD^xlL=C$KMd>FV*}3 zvr_)1!0?c8irO^iQl1e_*Cv)RlXNE3X_|am`|0*_Ky;!i>+485nvG_IBDRzD&b#6b zCPay^(nq_6p@@ZSUAVp2^eHzhLXp`OsUO2SEd!5u@>Hj%N1iNsNg^)2M~}4F&A|@l z+JCKW%Q3&(uTZ2Gu!CywNDI!H|LJdweOgJJsQb}zP^8u8y-=c4;ZAvPL(${J6!|r+ zx20&>F<-F~(#sI;h>b=>g-YR=YOmdyc<`+C7CoJk^s?}XZVjdlzj(y!lti7<7O0;9 zKZ~%KvfqANyGN%(Q=l;WCc1TkN8-^Tr&|@e9#u1)qEK>_L8RSk3GHLr(qVGj=qt&* zpwOX9XYZCrS>jw>gT6=hKgis_X|$52yybubnujgywYYY_^_9g!#0*F$JSQ#liPms7usitQ0 zLP==mrKua54!>0r9zDW0upOiwMw&O$x?F12-4B}V7Jz*Vv2@Ew6;CEOW_vJPy0#4 zg?&i5*}}S6?Y2lqx>@(KWWDmc*p6POZQzjz<W~t6~=AM^CLXs#kQQd z6|mf~PIQy@1CPO+1C)=w%RoGc=oSza94vj--g-617U{PWtHSR{(>Bt8(s8S`YIA2k z*L+CpW^+vM{(L1dg^U{|KUS-?Old#U(3Vl}n&qx3tx;)R%Cx$u=K1OeJF>KEZ(+RP z^odM)E3-N?$*%TN^OnjIW&YZY#iR8Wq)97j^5gN|56@&{jb)&eH5$0}A{)v?0G zwVXZ+n?5*WilzA#MU~FS(gsTDP}VI$3ExV)3+kt0Tg03$>VbPucXNrCK6q-w02ABucqWX|>F&?h>!9 zs!mk|88_PS_DV?WW%450C|WP|(fke?$XZ(|Uz0sNBqS<={X`)b>ZV;%O=3QMuo;3> zDYr=_+Knr;zEZi2UTwJ}HWOlH*^a+i6;Iqbm^$I(j9wU%`s>XT(r*vk80Gl2>?z-j zl2f(b=wMAo9%**F`sj3%y7h7KI3oLoL_w=E*HS7?oAgR9s5 zunaEB0w{T)lqvjUS>M;kYP%>qp@`OLuO0XK;?1EqF3Ke+Oua;pw9hVlX=J_BF3KxC zou;!MJ*qnY_&XOR8?8%pyH%}VvVUsS+~cB@fg;j!^=smFbHJ%+7sa3!D9y-n+Q{hg zAl*G!zp=3nbuSvh0QTtBlE*E7M6ecyJn^itmEN8BC%UqPzI#1SD zuY8&v^tZYwd!S^3XKs#?n@`>iZ0Dk!gOUMC$?CH@|C}T(W$o19fu2t4EH&@WUD<2D zi;|$crrR#lqdJA|CaCJ7WQLL+X|_!jm-{6Nz2%}5(RnTm39juk{rpZBr6Ls3VBvQI zyFW@+@Pv!f1d8NzMQvM0dzHd-Tofx5rd6YlFYwN_r^wwVF3JEsoucWBl=2#LeSwQI zQI{6dW#RkNlQyxc=*;O-ohKmko8)P8XMEICJTY&D zqdN;J|E9ch0Vv`RhPIs0?VqHd?{ZN-MVc{>F{M=vO@po#lC2sLKCB!X=n-)s6qy11 zsZf?oV`m4-s7vki8QT8xAtML6oc_f8JjiqANJ#XD7x0O zbgi>~R=s_`uRmv=+!<}Kw<)SC%ZerLw|srAcE0+qbPQ$|=*@zxJ)wyuW{7Va!_gL=6cmyWSC<8liO437$nWJhP?VQ;4{u6@*{+h{Zp zFV?&FfVNTNo+Wir=0lM-x1hh@n;u`xspit{M=0X`7Yw|Zug<_kGBc-_=uRlo>QmnD z+`NCKR99V;k7wDmxu=q*le)Afo93>|eyWAkoZfzJLlNCNwz%cLc>f`>UcI*8>gn7X zKQ?Gq^?r$<=y77d-ZoY~*yES6OP^9bn>uq!?>C{I)=t~?@G9WzJGhHW+A=8FNN0ca zic{aLSyBRuo*(0~4s4)V{JQDQr|sErSa@^|!l8)wUz;s=gPj@jONr{1Xl$dy;gJX> zv`4?cdi~V;kW04(P^8soOFOMos_vs>>9zuj_})iVN+0NxSk08^{=j%%%-BMfHq=UI z=Zo7r7r)&-&85LMDAGIo*Ll9^%*)(!T$GbKCHte+#j8IHm+_BYKgN_BjWpY7lK!P% z`6umex_Ca;%^9g0Q;h4!nDVhSXKfqT+|4Fh8Jw>4WzPBmP0OOS%-z!JUqO*tNILt7 z@1hZ*GTW+CKBX$5?A)3o+JudsD5Q{&4ck zWWRT~*VJVP#`!U>p94r!v%2@!rfCw8n=DdA*E5>RK zlEsg={}g}PdaLDIRXS>JeJ(uGqi4RpKC+Nk!&EK3?%ekopUCXvf9t_MBRO zWYIr(14W!nfY;8)H1DUOTG~$^S^j1wj;B; zP*Swg^7ArvzV(@^&VQW1>m5>3q3y>SP}^#5FxVCrWM)Dn%`ID+?CYC4kfyg1zt&oh zo@>uN>qEyN)*B@mA9ORGVfuKL$C=YlnXfX~Q$n#u^yq442ZZU!+avAw)P8Xtt@T+P zH~G-M{HYMdWdBEtjOV|*rm#iYafju@`eQFiTSjgq-MvG@pc zq`fZ{{&nkOS(dKv7z~eI2yQgcqqP4@1HFFSXdo6(>11iA<+Q}I$~$fi3-}5R7zm4Q z=b?!8E*tgGTF6qQj$Q^>?`n;|87c-dmr`7*!v+gu* zdAq|+ohoPLwic9C?dzn~+}(Ohu5M}_-I%g=#_?g+NZA0;y8MdHk=&!l zw2YRy4P66+bjZ&sc%(I6sFtbf>VDtJ47zTk|LzRB!9HTF>KN;D(l-|Q>++wDERXT= z&ixeUp@?ovrq6wlI8PTDx#~808;W>}(~WB{yFcM-tQm~QP^4`iN_MwU{l*6m>t#Sr z-{_QHt$lNi8_-zRfAn@5{;`GVKGBVZ$Z7@Bk}(sJfpj8T9&K~GwS5rM#CD*#u^rtK z-Rz6jDId?1J8L_D7hlZ&ex{M%bs7|$>2+Sx(e2>l{!~m9)A|41zQO)B%|f=6+g{Vs zb4yXZtZ7-ppokreNIbd7g$frgK+*l1TOUGeU^ke~<5O|wy97t3np`#K#w+W4Cuit9 zJJVPAr*p%}+PGe=P0fcQ-aqmA*R?`dA6bnwsZ(^jl2p^}4y9ocT zG&fr7ZNbgFr9O84ly^mp-)u0LnZt(|QzG+dKIFswma-7I28wu!5BE+A%>3k< zR6i_m{*>Mcyqq%_5246RR;tOhTBI9#me|EfNf@G0D(y>FqH`uBfa?(j!Tr*5SU_qO_*%D|Hs-JZ`$dv*B6gR%!u*SZZ9 z$?3t&uQH`b``0O_w2~$V6j{$IziCX1*O`LWI(bT)CPFC$CGCoLKSa$cAbS>+G=G!Z zoU-q>oI#xm<>QeN?Np7KNXdo zr`7vLH@g|w1210r<6Q<)2Q+ODZNWG{(;S-by|a9D+S8|#M4*A*(;C$RyK56@t^VV8 zNe$i%@+m`Pr(Ur!-EUUE^8Fjl?voBX4W-;Zi_%tbx0dtTf5Lk1B@|`7rA-x~ zoqJro@%-$goD`qZZJ=a_^3~Sn(G_-%xa6diHrb)b+SK!g6aMtMkzYn1s!mH8*r>cP z(-!|GJ(F{HI_peo4$@q57t%68F$Hhi^KfF%i%8SQjmDN3gfy|LxI5bYO=plMt=@0I zxNn{eSbN#2o4@G=6j?`a+i&qN|75zn(n%?0%F;`-ojTV-Y8Bo2^Cl;SH+D!zV!jXk zwX|UOElVg1;YkZm-2L&M{6Rr95I=hV&a7F@OYCl_%0T%@cQ&Qc+4D_O!Ak*NEa%Iw8{+Qa}50W_b7Q-LzSq z7E;=j35x8ExWB@>WbTQ18(fr9P$Zr3Z;qxNII`gkD9p&n_9i#`ASJS+of_AVn;nw+ z=W-%C{>(D(cQeI>YbTcF#c+T z!MhaD1dHvDM=x7ivyDcg;n41dr6ugZI<3|GlKL zjGeV0z|?b~Hqxs#DQHVyM;VFIqz6Q6<8&qs()`=YA1hXVchi>Im5%Yd74zW9fCej` zK3`b!)Sth?qxV^Bp@@Y zSbkwi79Uxs)zi5MMcU8fC#_q3vv88E>FF!^cc4h=ELdXiw`FNAZx`hsDAG=6EqywA zulI{ED0)0<{Puv+?7pALc*WCTKAyHs037S zla5~2ZdQ5pa&xmoMW6L>vqMGqVxJ<-n8%o6yl=yJcSi2PT5Ftnt>Lw4{)bCbZhB7t zrF|QE=@@Hmtbv=IN_w5TS>@3w#_1SKGv+b2H+MWH^=Hg;e~4zir>FlpcI@7Cf4OY* zITUZKx819-HBUE9`N>5wwqAD{Xl>#D?0~oRt7&B&YyX>W*Z-~^e2U*O*6sgl?tic5 zCJfa^U~kqfxcbN5($8sgy041T-nuYt>eusjw^k2i{WRXbLdU zHg0oihG}E;MAyIBRiN6?ldhU80!5q)Vs8Skes-pgjZYtNnc*8(1ch>QFfr*m+)Hc#=okKe=St+!(BF*DvTW~_m6I&R8M zw}bK{v>p1(dQP8cK2dfo^`pmcZuf_%Sh*cMGRJi|Z?>wr_J!7kM~~9Npvc&%_KLwF zBl_%XbcD@t-y?xO9y74I1avI2~ikvQb)0Zq7NZ(>D`#$m+jdI#ot%{pq6` zmNS_mw=aOA=f~}gjH)@~{214E1JaRp+Ve)WKX%OCkjkY&5EPmB-?Zk^-gQayH*!&o zOQ%0PGB)cUar$z?Wx+dLJd>cvyx6mS8=CaU`!1Fp7?-H=9!+E0SxY+ENoP;ldW}Ex zx>dlXf$?tC!#Yoj^4;?nuAM>V?DSeNt~uitY+TmHrSmE2dgg=*8B{&>pySJ3luxnVf7eEh zbNVS(Wn2sYA5F*bt&4v*KmV?@d=s_axt6^}?xk%i40f%#8b=Psl>11N^{mqOr!VZc z=bEe;=`qDiDAF3&1$MoZ@4buOZi!Xa#_h*g12=nd^j_1r2XwP$r1y=+^GL>TjDE_Tka4tO90l-&4o7Hr zhiP@Ca(jR4H+?BK%GOrdC{%2Y7Kc1IkYarDp9<}kx0-!usqC_bl81I$Z@6{%Q(};(cF<$zI7ZkbF6*r@x(ewy5TAGMsGR@Mf|~@ z4e1a55h`no7s5G}Y#8 zbG6cWx5DyIvRZj7D6Q4L^^eN{@1msDou}2@yfjPxJaWXJU14l6Q{~oPr-XHAaIeIT zyYjAxXw6D~7!;|6Rf9I}n4Rw@;!!8hV4YHL)2xQeeyds7MVSsoO6U8Q8)xK5?el{! z&4=G_(J49qUfVX&(7ge=)=+jpk^NN@yI$TJa-~{+{XHXU>@1X=P=;hEF?!pt9r9^k zFewWq(h*_{;8=U!rSBJJ+44dtKI&^rwdQLU(j)c8&LMyNlEkG!XDA}gr(4b(w>}Gy zIWEa*Dc;Id-%O2dJI-=D43ErL{WCgWjh_Z@&!qEUR>m3_Q;f^nxZI4TeTr@owlH>f z@@q_)e6uvKQ)fE6sKgG)&yj^%ExcR4xJbVrlHb#FiX9kh(0P%z1H#<8b?Wxh%5R59 z_Oel@HYl?H?dXJMfB$}L+XE=rp`;TDMOy#4iY=%0INM)lSELr8MC+6c{et&??ps(a z5%(gLu~1U;K;@#>GCWxRO6Gf^$X36ZP-I`gnKO%bxBekbHkY*JP|`u!mGHshOxa({ zP9>~bq-}yCc3tXGi{KR;9c0W6*~_=AveNv4T`kwq4Ta5O1r&Z z8=VK+c>zV@oi&T{Hvic#8~gcs$yfN`u`bp|$eGtInR0hi!zGGGwK+!w9)XhG<6k_% zKVz0jE73JD{)(8v`#)&l_Wd8VQ|TfaNLepmHb4APVQ+uZk+LRbxm~`TAXYAjmB27F}_c@J*mhn|zR}l@$d1@s;z$3e?)7b|WdwwI~cvpV*Ly;Kv z-mUKTL^IF-rt3ylZ$Od0(QlgLebvx9J}!!Jn=_VX%=7j;t*l#R+b|&2yA@_vI;p_}x9m*Nt04yzsfEiY_V%f?Y|2>|w4mx+s;PWPs;L(Wq061oNk{Q|AT zxL+{#*PqhQeXN0~hVh!V|DajO+oWq=3~XOiYr(2*`~IkTmqC8BdcIC`w~NY;+Ra@7 zN(##Q{OL6P7Pi_q0E+%4Tmv7ECDwxHb9fFFU)$bRHq{RqX^nlPqj2*+lWO%S=k^=Z z#J94ekS~M68~yC={=fo7{Sn zK&vdB6oq}(Zoi}H{IwdpO-Wnn<6rKVycd5~Jj%!4BtK%k&nqo#vNGJ9Oi@$_86Ip^ z-!^Hp;Z*9JGukCk6!~npDT=RR%U^<<*PgZgx&J#w!7uYWYe*C8O;LEjmv^%+eWJed zrhI&wm0Hgr*i#-1MS7-UJr`Cu zw=&}zC^9Z7L$3)X4U`$3#)Rkp^6=D*UIVz}&7D~srJsxL++jk}MaK$?G+yi`tE+UL zL)psacyYFP0Y&lU(|M*}pompMk3-5O+bm@3Y=ar0Q+ zJei@0`=?HgEySSajOqt@)Xi$GM8hBVu9(B@&%qf4~m&o8ROBRLIU-Kgu_{_l!F(d(3NDDyK}7SqKlUw!*> z*iLDUQl)4RXb*QddOJ*!V^@!SU1|PsB~4jkkoq1nzqQ(`aP8f?#-$S# z7HIDq5gGpax1wiSA01R$FCDRvF!dvirj-Fxa;Njp7Nn%9e$Kc~jdN=JHF^WTL%A8( z!uWMs>4Y9^lDX0K==ZMgbsGOBfZJX0s^)ACf4>0cDqe-v9XVyey~E^GdQIwd{Cds% zH%@hP#`B^>t$OJ|`S{mEl&_-P%52bVv_|qR3zLLooTSQ4rDO0_4O*75G-Dn&U#un- zY1?kTs;=IF;x}p0O-9vu_B>8_)~8m}M9eHGcWpWjMdo*kHM)Ck;OgHGxG48^%HT9l zmtVSeVzY~q_-8HhuJwhf(EM}fy0|ELbjtLV(~k7Ie|)HmQUQw01+2e$r_J?uEBN}S zQ-jt}BwD{-WBjPSzcrfXqC`TGX#Lj$mzQr`dT^kNG8sy4DE$|HTfa~1b9{HwDQ%5T zxl+Ede~Z6rgu5umpyYw4?b>^zI;Y(-%td(&Mb@)Qw7696_=W1Rq!~x}#&ZG2@wM?d z%l3;Fhb#!%XBl4Px%7Zir+B18P`uG?*3I9WC24D8md!~qPRBSVpT14&w~w@KT&~Z) z*~R~-q~+MIrPE{N*%Q_Gyf5~jr1L4d8IM@*qJhK|a}o}mlC%8=U!{R+jZdMZfikey zic<9&y_8u3DQnuc*A6X)Z92rhum1A(r=aNmAU%|f@Lc+OZmB=~`=5a#a~pWrfjhO4 zc&~Mpw_W=FIU{ktg~)qYp2jl9cX?FUYsv~GJsMn_{@eSV zuYzC8Y^%!7Cylp_=Mz6=H1#Q?_oC!SJkt8Ye(9@KEbFv*yub0-%y@Rvc+^&dbi`A% z$ulQ^?@f`f^jQMDWdM`{P`=tcck_ZL_nq?xXh2x0{*orD_tnPn6%SFTWwiHPjmM`3 zBR%ZkW383F`7 zH}==|Z$6+SQH_(ruRulG7>p;*ljBB?atj-)*?l$osJUMo{|xW@`|Hxt+i45>E8nK3 zP_iKHr<$J?UVdWGdErq5Fy2wK1V*Cu#M@^tXPdZ(ad72I40f@%Zt%#wW%f)3(|w)4 z`C%6&E|0g@L7tVkAp5TxPl7W&qi0m})%p@uIv>CH9?Y}STNO<7C%^t4k848cNvN$9v<`}YEpA2pCL8JAl`SXb8V__fX#NwbW|I;xPXPW$pf zA)!pTf9?A+(U0)g@(a^4)T?wrvx9m=dp-Md@U~d9lXalT9RBv}K0CfiJVgACw4YM^ zUb|0O8P1t%KJj{Tb6cdWmA+{))lgV0msO9(hzA`tcuXwusE}JU1_qqlL{NFDq z9%Pl+U$4642eq6Rd*(x=S<4sL%zSdkX0)ukDK2a@{yMn zeNB1ckr|m)wiTxiXV{im=b@dJgpv-*jZ01U+aBhUSt(f&fKm;L%%Nnxx_tYs?JHvG z=H|ONddo7-sd0YXe3MKs(JM){2tU?0Ze-qtcIxJf5_ElK#|sRXXL8WEd!F@ z(kU$S%+o0s7OyS6f0=cSi?Rxe)X$X$(+dPAe5qzIv<9>TN=7Ihx2115?ZQ}xizml# z8qeAezdv4luIU?{!aSRS28_iGG=S&h9uNyrb125rzD0u+=(aE*OPLCte6NWHl&ISt z&?)UxG%&0MKVz*8%8i^}IjUKFwOvtF8w9DZ3QC=RV!3@v85o!7|5oYP`zQx%n)XG8 z#G^}A{Fa)NSWL#w$F8iOvPlCN51n@hJBz=#KV5&TRiu!3<>i=p$sGzGx(YU-o@=N{wn_# zw+z&;_o{L;*3IqLA=Gd18GRk1toyG+sB{dz4&gCBaZA+ob%;MtY3mEGH_wh9QsY!6 zN=FZc+^(^xFu>rqB`G&IU&6(3#75mk0cDuH<#+qA1Mx`n3PyiXY?w8`^}7gxANT0A zc=7%QWdOyXKScxM{?u*Hq~_M$L>tndBF#;YuK#l2|JGO0478>XHt0_&9XI{9J}>s~ z_S?qaa{G5nCvhIFKmFhre~C9deXsM)Y0cgWOt>(i(O;K|6D4wxz$(cZt=}H_+x)&M zTBK~~qGX4X85<4iQLxvoUP;fnC?%m}f%3hrcaQwf_FQ&R>Oe^crSiZV?V_%&XI$b; zr;Se8o;EUI-`$_@x+rd27EzzC$p%kqq;+q#dhvDdAup8|Q+<6eU0TChbrK|flRl~J zjH8j1VSNco26(Qux!=*0#4^rzPFkj&4+@kL|!od3;`*)qPwh>*&1MI#NGQ4UDxm*3EH2 z>+3Jn$niE!320Wvun1i&}rWJ_#@(qwi8 zoDW;XYZFsQKPNn2LP-u!vbzcD1XaEzT4NuQALDf5mJU36@$k#s#U-oX zmmd2^v!~XDP{dRCdm16PMFWYe3g$SpaiD)rejAT*qXdJdS``siR(l3qL*`Y}3Oqf}x+mjsM%R7Yn zTv~o8qTBe*sc+9(G+$;K;Zb%VU#je3i~Q|JtM4N7w$V^z@J@-Yf=9-|O?nrdSNixW zZRd!JxVAx&SgeHClo_24S^kDc%{2PTH_ff)pa9eEy^H^PyKhODnh93p;K6q_4Knr_ zn4`e_Kjx?yR$1c6lL^H{O+`*=#}pME_Q2w{Fh?XmJzZS;?qcy;{HU8f%o5T((#~{$ zm8VxKxOV}LEJgxpJec~Qkjxq5Dn zbnwHZ{JMR|lX<>w7Tn-PG*63d4lP^yuvecn?;`oNx!!zfzfSuTg&q}KQ}|ctlFu3M zN>vY8-5`D38Hl)aM^vDl&#;>|?2Sk{yHO_lUS>I@y}j`=48%+N4S>!O}emYR?a!2GM?o+1J@5% zBun2j^ycgPTuWQI-R$80?iZ5xZll-mrR|ASJ*B7^RhFuZsY#!hnp9+Vvjq0AbhSE4 zIKu6GdpWE#b?0CW0t@)~PE|E?)ZI}cu$wioN6eM8POApmt+vSGk=DR&B`Bqk5Psjj zHwI>nbeJ)J=VO5me)2Yg=>oegB2u#-&1SkqMn*WwmndPkcBPcH#Bq|iA;xOC7@Fl^PK&x4qiq-BRZFi4L^|+B@mY#@x zvuNc(V1&)iZ}dnN>t|+h(f;vph4zCXw4a%uqu26n3F~W)pi*rPt6q!zhBIDJ_9feb z`AkyRk&qkHHgTceP~zTn6bR!3+Fafq~f59J}v4`HemYO~-XAeha? zUHOSoF~e@Qkf823Hb;cj(nI|QyfjQ{j%G(-l-=IfgY;NWkw~m7bd?z?Nej1N4zys| z+8TMD0R!@=c*j?rso6UZDTqQ5m=fZhr)JiaD2aGV)S0T3r1RWN2@oR3!x~ctdYZ~n znI-U7g&$y-mTK)2VF?r8??LxCPa-bP9h#4{QF6kE{4HUD)*$=^h3`q`2M>zK4{lKI zl10yD6I0u;$DAv#uDLLq!(s`f-;&wus{C3QeVB5cvJUP+wYZNWJ%&wuk*MZbv8u6C zhFxi3mML?UCAv9Wskyf;D6$*9UHRD8Rf#Mq&Dgihf!*mm={Iq=4x5ufyQ->8(8ooV zhkM&Cu4iK|s%l@KkGYm7J(NPsbLby)j>*a_B)Jz=%4)dLhMiVHRJg>_v&8 z4O{zoP{s8SQd}3r0lE|qyppK1taTlnmv}T8m5>>0Xn1#IZ z(~B`+4;p(iJ(+x0zQ9U+X>r&rVann>NQ-3xs1oZ6j~;(t@L@6{;DdB=YvRH^do^RD zQqyzsaL4Vc(IM_F8iwB2suvi{jM{qRX1X#wrJu5SveH;jAvo5R3R~jKS*+yXj&-H{ zopKS5ZdL|LU1=~X0G3GGtbXWH;%(QJhYD0rBVPM?Oeya8`Zr?GK2|u?Q8l&rG7?8i zDT)vEc1dv(;&Z+qJQqu#;`@(WnF^7yeLnK9%+sSji*wfM~p+G1=T zyOp=jdRfg(BL0V|I6hRGbmH8>?Gn?Mj;GxkD1o?GD*Z?G8Cz0JF^gKxB3J!@%DFTu zUA%|f>QBT{1*aDQmw}U~RRZT#c9eqO?qV&*y zG08(}@o-8;Jj+%wZG0`*r6~ek7mBw`JXQ5!p5g!S25p~FbbLcNCN08yhrz6!xEw|> z?`O$IRWp?n7JmtjdF+51vET2iL0o#@FVZMW{_p#!^SSVU~@GT6pMulHK`H zGS?{+k?fOa`bB0&JSgdU2=T59myLMfjbP$Ul#=;38L`FdL-mr4tz@iB#lB5x$KT3g zP3Iye*42O1&Oe+QM!<(R{v#Q#iDvj+7s^&t2QIBHzA2ZOXQV8g&#MBB&py<2kC>@; zqEuGRA=nlYVzv_(d#ZZZLr8F4sMuPi92u^Sz2lYi;e$x~@P=zbfQ~OLDm1|340Oyh z$cZ_3O>lUy#~8l=XUsVTskagFcJd~^=Vb|b0)9Er2-vb1-&8d^>XV@QnW}x|>bb$s z{|MEC)~<)N4C@?9@AwQrO}oDHea%Wz4-a_?wc5K{eG#jjP>?c9?YX~*rG1>d#0<(kq!?E@$&#bEs42Cm#h$UB z;TPn>f^42vLZn1`>Lt??A@U85c(P!(MmaQ}sGq^6&+7h%s_SZL+Upm}5|lTwM}>)R zmsLDZs~xc)LsINZRTwH8J)^Aj6v}5Y(c!5w<2;GPICqp#W$^!LF0m#(i=2@^`6`!Z z>)_|^;NX9$2`n_8r(@O$g(>DjDH>m^aBk~{(|Jmp&?}$DiW{-mS&U)Z&#LQL`T>2SY@*C*!7%Be69xl0)qY8M``cKSCK9NI&EyQY%xuMo^WzwyiH6((a0WpM7 zi@iq>qeHrDIgPo`vcHwxiT1u#11tg75N2!aR{fL-7b^?1;dcF63mKgkAyHjzVP@t( z!W>Knh9Z~OG#Re+(I0>!TN9kZ)P{hn>VMXYNU3vYNy=ikSHmCd^prB??6yY(rC0WnBggloHW3^eL z2*#|z5=;k~BSKk$4zRLQfK3`^*^Z-am0(~iRoItL&O0UbvN>##>Xi;X828Y0u{hP< z)lsIIUmrm ziTxM`82gg+byw%G1Y6D8UNTS0yPiT)EFRU~;_LGx*_0A20jzd{OVGQ^&>rFh&4D4Z z${#3Hsdr1L2TfcL>GCuVjCKMsVMD0WsM0|ey16^SK;98}sJf(*M`Otn4@!<`uTsA9t*4)*s z;CEf9@Lm~qkX2kXF3Ev|WWP`tvr$@8WciMHE)V*B@SID$#;3|CzNX_QapbtUtA+xq zme{O_*K?}sLAwthl+ycvQ#C0iQHE6dhDFbFS=Lbc3(2QCVKm2E5AhU#%&rR9V$NNe z@u0r`1J&^9XR6BLGt{_V752Ed&|6;!Q`<9w%#l_+FB6)2M-iFWLkAc2O~sB~@oCaLS0; zGbclv-eJ-rwG(*aU+T99^1MAzX{Hu)f~?jEZ6pySbt)6uL?{y85r25HcsEZY+Ra^6 z$?@eyZK#qhYvQQFa8*QMF@t^&6~?o$@IOz>@2z_-u~?afE7p}OWb%-f7QqEbg3eQ# zQt9~n&$xa>1jKPIs2~3Xx*HdTC^vV>&VR5CMz*K9{2!9yctllk@%6B=B3vZIx>DTn zMF}4U#ZoRfB6CcXOji+qn^iksVAXcO#B4m$E;T>pp;BW%79&LCqE6(s4@^q$>K(mp z{rZJ?nveZ|nmd=>$a3Ti&%%I#*&7(Zn+6Pc<*aL0P4!?r5Ipe0@WKY#@GJ~8kV>Vb z9OXrw7fCfMKZYO2-g)T<@Wc3v2ws9bC&{C%jk_93l85m#7`&6gU>Om-GJtXk`Xnsv z^(cIGXzf6_SYSCHK>Zn|WlgkzQpS=>P_J13w7Y?bztnKfeR~7FUnW84y)(Nq-f5Yp zx$(GxI6A37VWifBCO!ONi`x#I(OE$)x>2sW0JKMh^Dh6ZjneeL?=yo&p}E>K*B8!K$Zv2 za8@@=h%7w%+W64#SyF=^TzQ7wC?ocSbk72^=+u7DE)EFf_ITSKb8{q-XrfSf6nH&s`;?RE_qP>liopbp zIE}BH(_uaOnJ0M`PYrU|Itwk|Mu5ra#}Ag(+2-)HsM591t2uGbepO^h8znf38tHPu zT52&om-B0p6TdZd`fxe6)(RCy4W7STf^O9#mQuzp!@mugYBvT<@a4F!PS)7&)8+U< zsx*ljK7aXE^bxrj_%}%g2x*Ph8H_NWKVHIr=%lDH89Il31ES`9fNAnbJ@51u>H1;M zY7u-1w+=x2_sntqWg5DjDcDc~R@nWQdA*L7HqFpomPX!}2aTchwj;y1$n0E)#;f>s zzIvHGJ}wwTQb-=G#==HoQtl~cF}||>KN(~(^!>gQ;4IqFzHjP zXzSf>dpC%~Pxd4n-_C z2qySE@>M~=H)_BzGL<2ZYpyy>2N4M;6dl4Yf{6{=<(AoCs-9E$Nuq5h9(>?P~yK!S=x=_||2vZF05L81RQ6m5 z6It@(*K48TU~kRW`7Q;DOhu@Rj-2v0Mu#F^N-xkc`ReZ&H`xHO`CU`!ov!#yCqUWI z>TUhHq*c=*5vv-92I=mHGTR<4N=eN99Eno8A~*v<#KJ5ki%Vx4n*P42c0s< z#i$F0Efx>$y`LBhtmxG3!QN(+RWiHx46XO-iKlH=avMl4C(iU%q(yFI4rP=CG>X1R-%z&M}Wx$mDJ9`08Ut3S%=OK{OzSpoc@8}#-~?Hd2rVQ2s zP+L4vSx6v?0NcInY<2IK_gHIz)*LfcGxHsY=r4tDrqZPZLDh+Vq`@Ec?{>A6t^44b z>6LojzUTOWgKoCp(9CK;papfhy9dD>x(nay1Uxj9-b*LaKf+P%MB&;TTH|~DhdoRV zjX4l~Kb@Q9&!@R;cbH?+0oOHFZJ>~!Nk>|tZ5<@_UH-{oWudr+%3Gsk262HN zgsBkSeH0IF3 zJAOr1O*9GTGK6W=0eH$ZPuLw9>Y4@&{`9=Ujsa@L^KS~uiEsiJA@La5S+hw@Nvwtw9(8GL7 zZN!2USA0=&*r1TfO+YtT$C+89^^L@a(UH(RYiXcmE&$1%Nn?E@b0Ru3oHdqpEnn>$ zsz|AlRpI(n%|Mu6H`lvXKUINn37GgJoN0LGsUfWj(byUyTKFZ1NdQC8^ht4boUYi> z>NuTytG$DQ(%?zFpQ-b(UN?hD)3Pvw*XAVIS6ymZT=dRQ1ECBe(CJtrv$!7FaDWl& z!KgE-;~X2nA}_j*$m7~8@faNoApAPC+O#AMqCs5{J^D|X7xd0`;`Zrzc|8-A3+--O z+6rYv5-tOB)oWBUOA=ah=(N8#iHd_FRME-U*}q^rlGj37Ndl8h>Wt4+0383I(&*N* zu_7vXbVa9J+7b&gGo)yXZ%h~Je5WDzG9pQo0XiJ?%0c95$p#k9Vg^K!p zx_Je?_fpeC`ucVqI)mHU^KOrkNm-lhce~?<25{681T;Ex&1uk`O$(s2-*g_u<>7Wo zUR<>Jtu9kt?>L?w5=p5yaHfJQE z?lwxWj0jp8kP#ag&ZHy&&Zl$X-fV{5KIvMZ3@)t)Jqg%t$XhYS7M)10Uw?=!Ny*Qo z4F!KoUFh7Ub(u!@jb@aK1DP81mJ>n4pVXqRf0|G<3Lz@sLl&J{6?+}6K-O3D!59nH zc|{*DU;9^_?47hUaux(2cRsC(+PNIKk}t;g%+3Hy8*aUEZ6h48HDpvrC4o9<(m+u% zASeY#86zBracILE3eOGB9$$(C`-L@_?GLuoIODtTnMz^vaw9D&U2ywA)s{_a`h*U@}5%=E@Lm zp}MRNZtRE8%u>(s-YN!@du)Adm(OzG&=A~6Y}g+Ooz&?JyTmE8-q;V4aCA=UzJ0Et z^581KFG$H{2-ft=eby^a)6MSYf{eT$h$S<1{!fAyS0^P@)8^ep08D@+_3eylGmAHZqI(as=ch1R-uHxFcUSY z8e|(&LZ1vy(Mg2WlxzggQPOHXq@v%2UgFV@qW9G6kiz+;vvvi&^T`%^n4p(Yv*9f} z%MCQql1Ldj+SzIpz&Jr>CPFxdT4>6SJ?aI9ohy@-kG2CJ%zv5vF&QuA4G%pAigv`p zr*QL^N3m!!sPmv$wr6)qtr`VwkG6u(FtV^SK$tXGmt2pr26lsS5gpr&z2;XYQwS&H z7r_GD@6)Ri4kl-Stf~%Z-`fBobzVP)vT3W02EMHrfi;Km);o78c}sOWGnazE``op$ z5m2jMCQ=L5 z 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 UpEB;a{L5eb;@_S3|Aq7a0DkKoFaQ7m literal 0 HcmV?d00001 diff --git a/dapp/init.js b/dapp/init.js new file mode 100644 index 0000000..f8bad2b --- /dev/null +++ b/dapp/init.js @@ -0,0 +1,36 @@ +import 'dotenv/config'; +import { mkdirSync, writeFileSync } from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Get dirname (equivalent to the Bash version) +const __filename = fileURLToPath(import.meta.url); +const dirname = path.dirname(__filename); + +function importContract(alias) { + const outputDir = `${dirname}/src/contracts/`; + + mkdirSync(outputDir, { recursive: true }); + + const importContent = + `import * as Client from '${alias}';\n` + + `import { rpcUrl } from './util';\n\n` + + `export default new Client.Client({\n` + + ` ...Client.networks.${process.env.SOROBAN_NETWORK},\n` + + ` rpcUrl,\n` + + `${ + process.env.SOROBAN_NETWORK === "local" || "standalone" + ? ` allowHttp: true,\n` + : null + }` + + `});\n`; + + const outputPath = `${outputDir}/${alias}.ts`; + + writeFileSync(outputPath, importContent); + + console.log(`Created import for ${alias}`); +} + + +importContract('soroban_versioning'); \ No newline at end of file diff --git a/dapp/package.json b/dapp/package.json new file mode 100644 index 0000000..1e7bb63 --- /dev/null +++ b/dapp/package.json @@ -0,0 +1,30 @@ +{ + "dependencies": { + "@astrojs/check": "^0.4.1", + "@astrojs/tailwind": "^5.1.0", + "@creit.tech/stellar-wallets-kit": "^1.0.0", + "astro": "^4.2.4", + "install": "^0.13.0", + "js-sha3": "^0.9.3", + "tailwindcss": "^3.4.10", + "typescript": "^5.3.3" + }, + "devDependencies": { + "dotenv": "^16.4.1", + "glob": "^10.4.1", + "netlify-cli": "^17.34.1" + }, + "name": "dapp", + "scripts": { + "astro": "astro", + "build": "astro check && astro build", + "dev": "astro dev", + "preview": "astro preview", + "start": "astro dev" + }, + "type": "module", + "version": "0.0.1", + "workspaces": [ + "packages/*" + ] +} \ No newline at end of file diff --git a/bindings/ts/README.md b/dapp/packages/soroban_versioning/README.md similarity index 86% rename from bindings/ts/README.md rename to dapp/packages/soroban_versioning/README.md index 9684d89..02d0f41 100644 --- a/bindings/ts/README.md +++ b/dapp/packages/soroban_versioning/README.md @@ -1,6 +1,6 @@ -# ts JS +# soroban_versioning JS -JS library for interacting with [Soroban](https://soroban.stellar.org/) smart contract `ts` via Soroban RPC. +JS library for interacting with [Soroban](https://soroban.stellar.org/) smart contract `soroban_versioning` via Soroban RPC. This library was automatically generated by Soroban CLI using a command similar to: @@ -8,8 +8,8 @@ This library was automatically generated by Soroban CLI using a command similar soroban contract bindings ts \ --rpc-url https://soroban-testnet.stellar.org:443 \ --network-passphrase "Test SDF Network ; September 2015" \ - --contract-id CC3JCYWHNMPMQTOQUNDCJSCFSWRFZIE2JVSAUEXEG56DMKOMI3RL7VOH \ - --output-dir ./path/to/ts + --contract-id CAP52ERGUZ65UNPHP36CQBHYUPEUG2TT4NPVEV7CREWRT7UCPD7PRWEE \ + --output-dir ./path/to/soroban_versioning ``` The network passphrase and contract ID are exported from [index.ts](./src/index.ts) in the `networks` constant. If you are the one who generated this library and you know that this contract is also deployed to other networks, feel free to update `networks` with other valid options. This will help your contract consumers use this library more easily. @@ -22,7 +22,7 @@ But you don't need to publish this library to NPM to use it. You can add it to y ```json "dependencies": { - "ts": "./path/to/this/folder" + "soroban_versioning": "./path/to/this/folder" } ``` @@ -30,7 +30,7 @@ However, we've actually encountered [frustration](https://github.com/stellar/sor ```json "scripts": { - "postinstall": "soroban contract bindings ts --rpc-url https://soroban-testnet.stellar.org:443 --network-passphrase \"Test SDF Network ; September 2015\" --id CC3JCYWHNMPMQTOQUNDCJSCFSWRFZIE2JVSAUEXEG56DMKOMI3RL7VOH --name ts" + "postinstall": "soroban contract bindings ts --rpc-url https://soroban-testnet.stellar.org:443 --network-passphrase \"Test SDF Network ; September 2015\" --id CAP52ERGUZ65UNPHP36CQBHYUPEUG2TT4NPVEV7CREWRT7UCPD7PRWEE --name soroban_versioning" } ``` @@ -41,7 +41,7 @@ Obviously you need to adjust the above command based on the actual command you u Now that you have your library up-to-date and added to your project, you can import it in a file and see inline documentation for all of its exported methods: ```js -import { Contract, networks } from "ts" +import { Contract, networks } from "soroban_versioning" const contract = new Contract({ ...networks.futurenet, // for example; check which networks this library exports diff --git a/dapp/packages/soroban_versioning/dist/index.d.ts b/dapp/packages/soroban_versioning/dist/index.d.ts new file mode 100644 index 0000000..3e3dade --- /dev/null +++ b/dapp/packages/soroban_versioning/dist/index.d.ts @@ -0,0 +1,217 @@ +/// +import { Buffer } from "buffer"; +import { AssembledTransaction, Client as ContractClient, ClientOptions as ContractClientOptions } from '@stellar/stellar-sdk/contract'; +import type { u32 } from '@stellar/stellar-sdk/contract'; +export * from '@stellar/stellar-sdk'; +export * as contract from '@stellar/stellar-sdk/contract'; +export * as rpc from '@stellar/stellar-sdk/rpc'; +export declare const networks: { + readonly testnet: { + readonly networkPassphrase: "Test SDF Network ; September 2015"; + readonly contractId: "CAP52ERGUZ65UNPHP36CQBHYUPEUG2TT4NPVEV7CREWRT7UCPD7PRWEE"; + }; +}; +export declare const Errors: { + 0: { + message: string; + }; + 1: { + message: string; + }; + 2: { + message: string; + }; + 3: { + message: string; + }; + 4: { + message: string; + }; + 5: { + message: string; + }; + 6: { + message: string; + }; +}; +export type DataKey = { + tag: "Admin"; + values: void; +}; +export type ProjectKey = { + tag: "Key"; + values: readonly [Buffer]; +} | { + tag: "LastHash"; + values: readonly [Buffer]; +}; +export interface Config { + hash: string; + url: string; +} +export interface Project { + config: Config; + maintainers: Array; + name: string; +} +export interface Client { + /** + * Construct and simulate a init transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + init: ({ admin }: { + admin: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a version transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + version: (options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a upgrade transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + upgrade: ({ new_wasm_hash }: { + new_wasm_hash: Buffer; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a register transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + * Register a new Git projects and associated metadata. + */ + register: ({ maintainer, name, maintainers, url, hash, domain_contract_id }: { + maintainer: string; + name: string; + maintainers: Array; + url: string; + hash: string; + domain_contract_id: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a update_config transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + * Change the configuration of the project. + */ + update_config: ({ maintainer, key, maintainers, url, hash }: { + maintainer: string; + key: Buffer; + maintainers: Array; + url: string; + hash: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + * Set the last commit hash + */ + commit: ({ maintainer, project_key, hash }: { + maintainer: string; + project_key: Buffer; + hash: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a get_commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + * Get the last commit hash + */ + get_commit: ({ project_key }: { + project_key: Buffer; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; +} +export declare class Client extends ContractClient { + readonly options: ContractClientOptions; + constructor(options: ContractClientOptions); + readonly fromJSON: { + init: (json: string) => AssembledTransaction; + version: (json: string) => AssembledTransaction; + upgrade: (json: string) => AssembledTransaction; + register: (json: string) => AssembledTransaction; + update_config: (json: string) => AssembledTransaction; + commit: (json: string) => AssembledTransaction; + get_commit: (json: string) => AssembledTransaction; + }; +} diff --git a/dapp/packages/soroban_versioning/dist/index.js b/dapp/packages/soroban_versioning/dist/index.js new file mode 100644 index 0000000..d86e946 --- /dev/null +++ b/dapp/packages/soroban_versioning/dist/index.js @@ -0,0 +1,51 @@ +import { Buffer } from "buffer"; +import { Client as ContractClient, Spec as ContractSpec, } from '@stellar/stellar-sdk/contract'; +export * from '@stellar/stellar-sdk'; +export * as contract from '@stellar/stellar-sdk/contract'; +export * as rpc from '@stellar/stellar-sdk/rpc'; +if (typeof window !== 'undefined') { + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || Buffer; +} +export const networks = { + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CAP52ERGUZ65UNPHP36CQBHYUPEUG2TT4NPVEV7CREWRT7UCPD7PRWEE", + } +}; +export const Errors = { + 0: { message: "UnexpectedError" }, + 1: { message: "InvalidKey" }, + 2: { message: "ProjectAlreadyExist" }, + 3: { message: "UnregisteredMaintainer" }, + 4: { message: "NoHashFound" }, + 5: { message: "InvalidDomainError" }, + 6: { message: "MaintainerNotDomainOwner" } +}; +export class Client extends ContractClient { + options; + constructor(options) { + super(new ContractSpec(["AAAABAAAAAAAAAAAAAAADkNvbnRyYWN0RXJyb3JzAAAAAAAHAAAAAAAAAA9VbmV4cGVjdGVkRXJyb3IAAAAAAAAAAAAAAAAKSW52YWxpZEtleQAAAAAAAQAAAAAAAAATUHJvamVjdEFscmVhZHlFeGlzdAAAAAACAAAAAAAAABZVbnJlZ2lzdGVyZWRNYWludGFpbmVyAAAAAAADAAAAAAAAAAtOb0hhc2hGb3VuZAAAAAAEAAAAAAAAABJJbnZhbGlkRG9tYWluRXJyb3IAAAAAAAUAAAAAAAAAGE1haW50YWluZXJOb3REb21haW5Pd25lcgAAAAY=", + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAAAAAAAAAAABUFkbWluAAAA", + "AAAAAgAAAAAAAAAAAAAAClByb2plY3RLZXkAAAAAAAIAAAABAAAAAAAAAANLZXkAAAAAAQAAAA4AAAABAAAAAAAAAAhMYXN0SGFzaAAAAAEAAAAO", + "AAAAAQAAAAAAAAAAAAAABkNvbmZpZwAAAAAAAgAAAAAAAAAEaGFzaAAAABAAAAAAAAAAA3VybAAAAAAQ", + "AAAAAQAAAAAAAAAAAAAAB1Byb2plY3QAAAAAAwAAAAAAAAAGY29uZmlnAAAAAAfQAAAABkNvbmZpZwAAAAAAAAAAAAttYWludGFpbmVycwAAAAPqAAAAEwAAAAAAAAAEbmFtZQAAABA=", + "AAAAAAAAAAAAAAAEaW5pdAAAAAEAAAAAAAAABWFkbWluAAAAAAAAEwAAAAA=", + "AAAAAAAAAAAAAAAHdmVyc2lvbgAAAAAAAAAAAQAAAAQ=", + "AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAAA", + "AAAAAAAAADRSZWdpc3RlciBhIG5ldyBHaXQgcHJvamVjdHMgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuAAAACHJlZ2lzdGVyAAAABgAAAAAAAAAKbWFpbnRhaW5lcgAAAAAAEwAAAAAAAAAEbmFtZQAAABAAAAAAAAAAC21haW50YWluZXJzAAAAA+oAAAATAAAAAAAAAAN1cmwAAAAAEAAAAAAAAAAEaGFzaAAAABAAAAAAAAAAEmRvbWFpbl9jb250cmFjdF9pZAAAAAAAEwAAAAEAAAAO", + "AAAAAAAAAChDaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2plY3QuAAAADXVwZGF0ZV9jb25maWcAAAAAAAAFAAAAAAAAAAptYWludGFpbmVyAAAAAAATAAAAAAAAAANrZXkAAAAADgAAAAAAAAALbWFpbnRhaW5lcnMAAAAD6gAAABMAAAAAAAAAA3VybAAAAAAQAAAAAAAAAARoYXNoAAAAEAAAAAA=", + "AAAAAAAAABhTZXQgdGhlIGxhc3QgY29tbWl0IGhhc2gAAAAGY29tbWl0AAAAAAADAAAAAAAAAAptYWludGFpbmVyAAAAAAATAAAAAAAAAAtwcm9qZWN0X2tleQAAAAAOAAAAAAAAAARoYXNoAAAAEAAAAAA=", + "AAAAAAAAABhHZXQgdGhlIGxhc3QgY29tbWl0IGhhc2gAAAAKZ2V0X2NvbW1pdAAAAAAAAQAAAAAAAAALcHJvamVjdF9rZXkAAAAADgAAAAEAAAAQ"]), options); + this.options = options; + } + fromJSON = { + init: (this.txFromJSON), + version: (this.txFromJSON), + upgrade: (this.txFromJSON), + register: (this.txFromJSON), + update_config: (this.txFromJSON), + commit: (this.txFromJSON), + get_commit: (this.txFromJSON) + }; +} diff --git a/bindings/ts/package.json b/dapp/packages/soroban_versioning/package.json similarity index 89% rename from bindings/ts/package.json rename to dapp/packages/soroban_versioning/package.json index df81617..e9518f8 100644 --- a/bindings/ts/package.json +++ b/dapp/packages/soroban_versioning/package.json @@ -1,6 +1,6 @@ { "version": "0.0.0", - "name": "ts", + "name": "soroban_versioning", "type": "module", "exports": "./dist/index.js", "typings": "dist/index.d.ts", diff --git a/bindings/ts/src/index.ts b/dapp/packages/soroban_versioning/src/index.ts similarity index 90% rename from bindings/ts/src/index.ts rename to dapp/packages/soroban_versioning/src/index.ts index ec249ae..9ba4c3c 100644 --- a/bindings/ts/src/index.ts +++ b/dapp/packages/soroban_versioning/src/index.ts @@ -33,17 +33,24 @@ if (typeof window !== 'undefined') { export const networks = { testnet: { networkPassphrase: "Test SDF Network ; September 2015", - contractId: "CC3JCYWHNMPMQTOQUNDCJSCFSWRFZIE2JVSAUEXEG56DMKOMI3RL7VOH", + contractId: "CAP52ERGUZ65UNPHP36CQBHYUPEUG2TT4NPVEV7CREWRT7UCPD7PRWEE", } } as const export const Errors = { - 0: {message:""}, - 1: {message:""}, - 2: {message:""}, - 3: {message:""}, - 4: {message:""}, - 5: {message:""} + 0: {message:"UnexpectedError"}, + + 1: {message:"InvalidKey"}, + + 2: {message:"ProjectAlreadyExist"}, + + 3: {message:"UnregisteredMaintainer"}, + + 4: {message:"NoHashFound"}, + + 5: {message:"InvalidDomainError"}, + + 6: {message:"MaintainerNotDomainOwner"} } export type DataKey = {tag: "Admin", values: void}; @@ -125,10 +132,10 @@ export interface Client { }) => Promise> /** - * Construct and simulate a register transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * + * Construct and simulate a register transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * Register a new Git projects and associated metadata. */ - register: ({maintainer, name, maintainers, url, hash}: {maintainer: string, name: string, maintainers: Array, url: string, hash: string}, options?: { + register: ({maintainer, name, maintainers, url, hash, domain_contract_id}: {maintainer: string, name: string, maintainers: Array, url: string, hash: string, domain_contract_id: string}, options?: { /** * The fee to pay for the transaction. Default: BASE_FEE */ @@ -146,7 +153,7 @@ export interface Client { }) => Promise> /** - * Construct and simulate a update_config transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * + * Construct and simulate a update_config transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * Change the configuration of the project. */ update_config: ({maintainer, key, maintainers, url, hash}: {maintainer: string, key: Buffer, maintainers: Array, url: string, hash: string}, options?: { @@ -167,7 +174,7 @@ export interface Client { }) => Promise> /** - * Construct and simulate a commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * + * Construct and simulate a commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * Set the last commit hash */ commit: ({maintainer, project_key, hash}: {maintainer: string, project_key: Buffer, hash: string}, options?: { @@ -188,7 +195,7 @@ export interface Client { }) => Promise> /** - * Construct and simulate a get_commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * + * Construct and simulate a get_commit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. * Get the last commit hash */ get_commit: ({project_key}: {project_key: Buffer}, options?: { @@ -212,7 +219,7 @@ export interface Client { export class Client extends ContractClient { constructor(public readonly options: ContractClientOptions) { super( - new ContractSpec([ "AAAABAAAAAAAAAAAAAAADkNvbnRyYWN0RXJyb3JzAAAAAAAGAAAAAAAAAA9VbmV4cGVjdGVkRXJyb3IAAAAAAAAAAAAAAAAKSW52YWxpZEtleQAAAAAAAQAAAAAAAAATUHJvamVjdEFscmVhZHlFeGlzdAAAAAACAAAAAAAAABZVbnJlZ2lzdGVyZWRNYWludGFpbmVyAAAAAAADAAAAAAAAAAtOb0hhc2hGb3VuZAAAAAAEAAAAAAAAABRJbnB1dFZhbGlkYXRpb25FcnJvcgAAAAU=", + new ContractSpec([ "AAAABAAAAAAAAAAAAAAADkNvbnRyYWN0RXJyb3JzAAAAAAAHAAAAAAAAAA9VbmV4cGVjdGVkRXJyb3IAAAAAAAAAAAAAAAAKSW52YWxpZEtleQAAAAAAAQAAAAAAAAATUHJvamVjdEFscmVhZHlFeGlzdAAAAAACAAAAAAAAABZVbnJlZ2lzdGVyZWRNYWludGFpbmVyAAAAAAADAAAAAAAAAAtOb0hhc2hGb3VuZAAAAAAEAAAAAAAAABJJbnZhbGlkRG9tYWluRXJyb3IAAAAAAAUAAAAAAAAAGE1haW50YWluZXJOb3REb21haW5Pd25lcgAAAAY=", "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAAAAAAAAAAABUFkbWluAAAA", "AAAAAgAAAAAAAAAAAAAAClByb2plY3RLZXkAAAAAAAIAAAABAAAAAAAAAANLZXkAAAAAAQAAAA4AAAABAAAAAAAAAAhMYXN0SGFzaAAAAAEAAAAO", "AAAAAQAAAAAAAAAAAAAABkNvbmZpZwAAAAAAAgAAAAAAAAAEaGFzaAAAABAAAAAAAAAAA3VybAAAAAAQ", @@ -220,7 +227,7 @@ export class Client extends ContractClient { "AAAAAAAAAAAAAAAEaW5pdAAAAAEAAAAAAAAABWFkbWluAAAAAAAAEwAAAAA=", "AAAAAAAAAAAAAAAHdmVyc2lvbgAAAAAAAAAAAQAAAAQ=", "AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAAA", - "AAAAAAAAADRSZWdpc3RlciBhIG5ldyBHaXQgcHJvamVjdHMgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuAAAACHJlZ2lzdGVyAAAABQAAAAAAAAAKbWFpbnRhaW5lcgAAAAAAEwAAAAAAAAAEbmFtZQAAABAAAAAAAAAAC21haW50YWluZXJzAAAAA+oAAAATAAAAAAAAAAN1cmwAAAAAEAAAAAAAAAAEaGFzaAAAABAAAAABAAAADg==", + "AAAAAAAAADRSZWdpc3RlciBhIG5ldyBHaXQgcHJvamVjdHMgYW5kIGFzc29jaWF0ZWQgbWV0YWRhdGEuAAAACHJlZ2lzdGVyAAAABgAAAAAAAAAKbWFpbnRhaW5lcgAAAAAAEwAAAAAAAAAEbmFtZQAAABAAAAAAAAAAC21haW50YWluZXJzAAAAA+oAAAATAAAAAAAAAAN1cmwAAAAAEAAAAAAAAAAEaGFzaAAAABAAAAAAAAAAEmRvbWFpbl9jb250cmFjdF9pZAAAAAAAEwAAAAEAAAAO", "AAAAAAAAAChDaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2plY3QuAAAADXVwZGF0ZV9jb25maWcAAAAAAAAFAAAAAAAAAAptYWludGFpbmVyAAAAAAATAAAAAAAAAANrZXkAAAAADgAAAAAAAAALbWFpbnRhaW5lcnMAAAAD6gAAABMAAAAAAAAAA3VybAAAAAAQAAAAAAAAAARoYXNoAAAAEAAAAAA=", "AAAAAAAAABhTZXQgdGhlIGxhc3QgY29tbWl0IGhhc2gAAAAGY29tbWl0AAAAAAADAAAAAAAAAAptYWludGFpbmVyAAAAAAATAAAAAAAAAAtwcm9qZWN0X2tleQAAAAAOAAAAAAAAAARoYXNoAAAAEAAAAAA=", "AAAAAAAAABhHZXQgdGhlIGxhc3QgY29tbWl0IGhhc2gAAAAKZ2V0X2NvbW1pdAAAAAAAAQAAAAAAAAALcHJvamVjdF9rZXkAAAAADgAAAAEAAAAQ" ]), diff --git a/bindings/ts/tsconfig.json b/dapp/packages/soroban_versioning/tsconfig.json similarity index 100% rename from bindings/ts/tsconfig.json rename to dapp/packages/soroban_versioning/tsconfig.json diff --git a/dapp/public/ag.svg b/dapp/public/ag.svg new file mode 100644 index 0000000..6262e7b --- /dev/null +++ b/dapp/public/ag.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dapp/public/logo.svg b/dapp/public/logo.svg new file mode 100644 index 0000000..cf33d48 --- /dev/null +++ b/dapp/public/logo.svg @@ -0,0 +1,198 @@ + + + + + \ No newline at end of file diff --git a/dapp/src/components/ConnectWallet.astro b/dapp/src/components/ConnectWallet.astro new file mode 100644 index 0000000..0120007 --- /dev/null +++ b/dapp/src/components/ConnectWallet.astro @@ -0,0 +1,54 @@ +

+ + + + diff --git a/dapp/src/components/Container.astro b/dapp/src/components/Container.astro new file mode 100644 index 0000000..2eb126c --- /dev/null +++ b/dapp/src/components/Container.astro @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/dapp/src/components/Footer.astro b/dapp/src/components/Footer.astro new file mode 100644 index 0000000..c1d1407 --- /dev/null +++ b/dapp/src/components/Footer.astro @@ -0,0 +1,17 @@ +--- +import Container from "./Container.astro" + +const year = new Date().getFullYear(); +--- + +
+ +
+
+
+
Copyright © {year} Tansu. Made by Consulting Manao GmbH.
+
+
+
+
+
diff --git a/dapp/src/components/LinkCard.astro b/dapp/src/components/LinkCard.astro new file mode 100644 index 0000000..ba0ea26 --- /dev/null +++ b/dapp/src/components/LinkCard.astro @@ -0,0 +1,29 @@ +--- +const { line1, line2, link } = Astro.props; +--- + +
diff --git a/dapp/src/components/Navbar.astro b/dapp/src/components/Navbar.astro new file mode 100644 index 0000000..74ef32f --- /dev/null +++ b/dapp/src/components/Navbar.astro @@ -0,0 +1,24 @@ +--- +import Container from "./Container.astro" +import ConnectWallet from '../components/ConnectWallet.astro'; +--- + +
+ +
diff --git a/dapp/src/components/ProjectId.astro b/dapp/src/components/ProjectId.astro new file mode 100644 index 0000000..a54de3d --- /dev/null +++ b/dapp/src/components/ProjectId.astro @@ -0,0 +1,112 @@ +--- +import Container from "./Container.astro" +import Topic from "./Topic.astro"; +import LinkCard from "./LinkCard.astro" + +const SOROBAN_NETWORK = import.meta.env.SOROBAN_NETWORK +const TANSU_CONTRACT_ID = import.meta.env.TANSU_CONTRACT_ID + +--- + + +
+ +
+ +
+
+
+ + +
+
+ +
+ +
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+ + +
+
+
+ + +
+ + + diff --git a/dapp/src/components/Topic.astro b/dapp/src/components/Topic.astro new file mode 100644 index 0000000..9ac8654 --- /dev/null +++ b/dapp/src/components/Topic.astro @@ -0,0 +1,12 @@ +--- +const { title, description} = Astro.props; +--- + +
+ + {title} + +

+ {description} +

+
\ No newline at end of file diff --git a/dapp/src/components/project.ts b/dapp/src/components/project.ts new file mode 100644 index 0000000..98741fe --- /dev/null +++ b/dapp/src/components/project.ts @@ -0,0 +1,68 @@ +import pkg from 'js-sha3'; +const {keccak256} = pkg; +import { Buffer } from "buffer"; + +import { kit, loadedPublicKey} from "./stellar-wallets-kit.ts"; +import Versioning from "../contracts/soroban_versioning"; + + +const projectState: { project_name: string | undefined, project_id: Buffer | undefined } = { + project_name: undefined, + project_id: undefined, +}; + +function loadedProjectId(): Buffer | undefined { + return projectState.project_id; +} + + + +function setProjectId(project_name: string): void { + projectState.project_name = project_name + // @ts-ignore + projectState.project_id = new Buffer.from(keccak256.create().update(project_name).digest()); +} + + +async function getProjectHash(): Promise { + if (projectState.project_id === undefined) { + alert("No project defined"); + return + } + const res = await Versioning.get_commit({ project_key: projectState.project_id }) + return res.result; +} + + +async function commitHash(commit_hash: string): Promise { + if (!projectState.project_id) { + alert("No project defined"); + return false; + } + const publicKey = loadedPublicKey(); + + if (!publicKey) { + alert("Please connect your wallet first"); + return false; + } + else { + Versioning.options.publicKey = publicKey; + } + + const tx = await Versioning.commit({ maintainer: publicKey, project_key: projectState.project_id, hash: commit_hash }) + try { + await tx.signAndSend({ + signTransaction: async (xdr) => { + const { signedTxXdr } = await kit.signTransaction(xdr); + return signedTxXdr; + }, + }); + return true + } catch (e) { + console.error(e); + return false + } +} + + +export { commitHash, getProjectHash, loadedProjectId, setProjectId }; diff --git a/dapp/src/components/stellar-wallets-kit.ts b/dapp/src/components/stellar-wallets-kit.ts new file mode 100644 index 0000000..ca984b9 --- /dev/null +++ b/dapp/src/components/stellar-wallets-kit.ts @@ -0,0 +1,26 @@ +import { + allowAllModules, + FREIGHTER_ID, + StellarWalletsKit, + WalletNetwork, +} from "@creit.tech/stellar-wallets-kit"; + +const kit: StellarWalletsKit = new StellarWalletsKit({ + modules: allowAllModules(), + network: WalletNetwork.TESTNET, + selectedWalletId: FREIGHTER_ID, +}); + +const connectionState: { publicKey: string | undefined } = { + publicKey: undefined, +}; + +function loadedPublicKey(): string | undefined { + return connectionState.publicKey; +} + +function setPublicKey(data: string): void { + connectionState.publicKey = data; +} + +export { kit, loadedPublicKey, setPublicKey }; diff --git a/dapp/src/contracts/soroban_versioning.ts b/dapp/src/contracts/soroban_versioning.ts new file mode 100644 index 0000000..b80a0b2 --- /dev/null +++ b/dapp/src/contracts/soroban_versioning.ts @@ -0,0 +1,8 @@ +import * as Client from 'soroban_versioning'; +import { rpcUrl } from './util'; + +export default new Client.Client({ + ...Client.networks.testnet, + rpcUrl, + allowHttp: true, +}); diff --git a/dapp/src/contracts/util.ts b/dapp/src/contracts/util.ts new file mode 100644 index 0000000..c39903e --- /dev/null +++ b/dapp/src/contracts/util.ts @@ -0,0 +1,2 @@ +export const rpcUrl = import.meta.env.PUBLIC_SOROBAN_RPC_URL ?? "https://soroban-testnet.stellar.org:443" +export const networkPassphrase = import.meta.env.PUBLIC_SOROBAN_NETWORK_PASSPHRASE ?? "Test SDF Network ; September 2015" diff --git a/dapp/src/env.d.ts b/dapp/src/env.d.ts new file mode 100644 index 0000000..50bf1a3 --- /dev/null +++ b/dapp/src/env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly TANSU_CONTRACT_ID: string + readonly SOROBAN_NETWORK: string + readonly SOROBAN_NETWORK_PASSPHRASE: string; + readonly SOROBAN_RPC_URL: string; + readonly SOROBAN_SOURCE_ACCOUNT: string; +} diff --git a/dapp/src/layouts/Layout.astro b/dapp/src/layouts/Layout.astro new file mode 100644 index 0000000..9ec2fa0 --- /dev/null +++ b/dapp/src/layouts/Layout.astro @@ -0,0 +1,31 @@ +--- +import "../styles/global.css"; +import Navbar from '../components/Navbar.astro'; +import Footer from '../components/Footer.astro'; +import { ViewTransitions } from 'astro:transitions'; + +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + {title} + + + + + + +