From 5dfb1bc76575d3ed86e98496ae1efa4f5ed5f05d Mon Sep 17 00:00:00 2001 From: John Bowdre Date: Sun, 16 Jun 2024 19:56:25 -0500 Subject: [PATCH] update draft --- .../index.md | 47 +++++++++++++++--- .../proxmox-token.png | Bin 0 -> 26011 bytes 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 content/posts/building-proxmox-templates-packer-github-actions/proxmox-token.png diff --git a/content/posts/building-proxmox-templates-packer-github-actions/index.md b/content/posts/building-proxmox-templates-packer-github-actions/index.md index a577400..66f1a9b 100644 --- a/content/posts/building-proxmox-templates-packer-github-actions/index.md +++ b/content/posts/building-proxmox-templates-packer-github-actions/index.md @@ -21,14 +21,14 @@ tags: - vault --- -I've been [using Proxmox](/ditching-vsphere-for-proxmox/) in my [homelab](/homelab/) for a little while now, and I recently expanded the environment a bit with the addition of two HP Elite Mini 800 G9 computers. I figured it was time to start automating the process of building and maintaining my VM templates. I already had functional [Packer templates for VMware](https://github.com/jbowdre/packer-vsphere-templates) so I used that content as a starting point for the builds themselves. Once I had the builds working locally, I just had to explore how to automate them. +I've been [using Proxmox](/ditching-vsphere-for-proxmox/) in my [homelab](/homelab/) for a little while now, and I recently expanded the environment a bit with the addition of two HP Elite Mini 800 G9 computers. I figured it was time to start automating the process of building and maintaining my VM templates. I already had functional [Packer templates for VMware](https://github.com/jbowdre/packer-vsphere-templates) so I used that content as a starting point for the Proxmox builds themselves. Once I had the builds working locally, I just had to explore how to automate them. -This post will describe how I did it. +This post will describe how I did it. It will cover a lot of the implementation details but may gloss over some general setup steps; you'll likely need at least passing familiarity with [Packer](https://www.packer.io/) and [Vault](https://www.vaultproject.io/) to take this on. ### Component Overview There are a lot of parts to this setup, so let's start by quickly running through those: -- a **Vault instance** running in a container in the lab to hold the secrets needed for the builds, - a **Proxmox host** to serve the virtual infrastructure and provide compute for the new templates, +- a **Vault instance** running in a container in the lab to hold the secrets needed for the builds, - an **on-premise self-hosted GitHub runner** to simplify connectivity between GitHub and my homelab, - and a **private GitHub repo** to hold the code and tell the runner when it's time to get to work. @@ -39,10 +39,21 @@ GitHub [strongly recommends](https://docs.github.com/en/actions/hosting-your-own I don't like the idea of randos running arbitrary code on my home infrastructure. So while I'm sharing my work publicly [in this repo](https://github.com/jbowdre/packer-proxmox-templates), the workflows there are disabled and there are no connected runners. I'm running my builds out of a private repo and recommend that you do the same. {{% /notice %}} -### Vault -I use [Vault](https://github.com/hashicorp/vault) to hold the configuration details for the template builds - not just traditional secrets like usernames and passwords, but basically *every environment-specific setting* as well. This way the Packer templates can be used in different environments without having to change much (if *any*) of the committed code. +### Proxmox Setup +The only configuration I did on the Proxmox side of things was to [create a user account](https://pve.proxmox.com/pve-docs/chapter-pveum.html#pveum_users) that Packer could use. I call it `packer` but don't set a password for it. Instead, I'll set up an [API token](https://pve.proxmox.com/pve-docs/chapter-pveum.html#pveum_tokens) for that account, making sure to uncheck the "Privilege Separation" box so that the token will inherit the same permissions as the user itself. -I'm using [Vault in Docker](https://hub.docker.com/r/hashicorp/vault), and I'm also making it available within my tailnet with [Tailscale Serve](/tailscale-serve-docker-compose-sidecar/) using the following `docker-compose.yaml` +![Creating an API token](proxmox-token.png) + +To use the token, I'll need the ID (in the form `USERNAME@REALM!TOKENNAME`) and the UUID-looking secret, which is only displayed once so I be sure to record it in a safe place. + +Speaking of privileges, the [Proxmox ISO integration documentation](https://developer.hashicorp.com/packer/integrations/hashicorp/proxmox/latest/components/builder/iso) didn't offer any details on the minimum required permissions, and none of my attempts worked until I eventually assigned the Administrator role to the `packer` user. + +Otherwise I'll just need to figure out the details like which network bridge, ISO storage, and VM storage the Packer-built VMs should use. + +### Vault Configuration +I use [Vault](https://github.com/hashicorp/vault) to hold the configuration details for the template builds - not just traditional secrets like usernames and passwords, but basically *every environment-specific setting* as well. This approach lets others use my Packer code without having to change much (if any) of it; every value that I expect to change between environments is retrieved from Vault at run time. + +Because this is just a homelab, I'm using [Vault in Docker](https://hub.docker.com/r/hashicorp/vault), and I'm making it available within my tailnet with [Tailscale Serve](/tailscale-serve-docker-compose-sidecar/) using the following `docker-compose.yaml` ```yaml # torchlight! {"lineNumbers":true} @@ -121,7 +132,7 @@ vault secrets enable -path=packer kv-v2 # [tl! .cmd] Success! Enabled the kv-v2 secrets engine at: packer/ # [tl! .nocopy] ``` -And I define a [policy](https://developer.hashicorp.com/vault/docs/concepts/policies) which will grant the bearer read-only access to the data stored in the `packer` secrets as well as the ability to create and update its own tokens: +And I define a [policy](https://developer.hashicorp.com/vault/docs/concepts/policies) which will grant the bearer read-only access to the data stored in the `packer` secrets as well as the ability to create and update its own token: ```shell cat << EOF | vault policy write packer - @@ -158,5 +169,25 @@ identity_policies [] policies ["packer"] ``` -Within the `packer` secrets engine, I have two secrets which each have a number of subkeys. +Within the `packer` secrets engine, I have two secrets which each have a number of subkeys: +`proxmox` contains values related to the Proxmox environment: +| Key | Example value | Description | +|-----------------------|-----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------| +| `api_url` | `https://proxmox1.example.com:8006/api2/json` | URL to the Proxmox API | +| `insecure_connection` | `true` | set to `false` if your Proxmox host has a valid certificate | +| `iso_path` | `local:iso` | path for (existing) ISO storage | +| `iso_storage_pool` | `local` | pool for storing created/uploaded ISOs | +| `network_bridge` | `vmbr0` | bridge the VM's NIC will be attached to | +| `node` | `proxmox1` | node name where the VM will be built | +| `token_id` | `packer@pve!packer` | ID for an [API token](https://pve.proxmox.com/wiki/User_Management#pveum_tokens), in the form `USERNAME@REALM!TOKENNAME` | +| `token_secret` | `3fc69f[...]d2077eda` | secret key for the token | +| `vm_storage_pool` | `zfs-pool` | storage pool where the VM will be created | + +`linux` holds values for the created VM template(s) +| Key | Example value | Description | +|-----------------------|-----------------------------------------------------------|-------------------------------------------------------------------------------------------------| +| `bootloader_password` | `bootplease` | Grub bootloader password to set | +| `password_hash` | `$6$rounds=4096$NltiNLKi[...]a7Shax41` | hash of the build account's password (example generated with `mkpasswd -m sha512crypt -R 4096`) | +| `public_key` | `ssh-ed25519 AAAAC3NzaC1[...]lXLUI5I40 admin@example.com` | SSH public key for the user | +| `username` | `admin` | build account username | diff --git a/content/posts/building-proxmox-templates-packer-github-actions/proxmox-token.png b/content/posts/building-proxmox-templates-packer-github-actions/proxmox-token.png new file mode 100644 index 0000000000000000000000000000000000000000..0c421605e5baba8f97a2e5b018d146ae94693edd GIT binary patch literal 26011 zcmdqJcRbbq`#&DpWM@SuBMR9o<0xd0lI)CRlf93XQL>YWkc4D!GNX_gvR6pR-Y4^W zonEhczrVlV=XbmP{`mg&?GGL2JkN7H9@pc#?)Uq3e+av&u5gBkf#}q!Q)iSEcS}{x$9bEC4w2=Jto!FE=vBAzD2ro3Lj@^D-(_Vt~2XY&(!^>5hb4*Yz}wDC~C zEHd9CFM)HC{8J4jkJ9deLC=BDki-_6Vb`_CIv|GN67y84;Y#<_gO{Z}9P@0(yVc)C z9U6{y4H`(yyw5o3G9LE{)<$7rlLwr_xo`@L;F^gX(U&p{{x5aCT&JRbT|8I6Q(@vc zpD-=zTH+{DdiHRR*PlL?!HW8yqffyX8(-lZZzeP(;!2ycFEg=N2MB#q(AE(1PqX)0 zDIYqH_^*>UKEO5dSt&=FrSjpII1XDrJUo-qX~DN-TgJV`LGt$=PGPeeH9Ehh%2G1* zXHyHSqx#-3o53fRlyCMi`BmV59VSAYcmw&I)%x*rA=##A*;MQR4Ns;A)$!y1zGgSB zx22>h_Wk0RtdEnvFW}xAmgPhyY}{!M zM1@R_fA#qL!DCFKwz~MuT57ktCD!Wp&OiF^3&i3~`mEJePWc^liB7%oQ0ad*Ttl`w zwXp%eqL%V2C;d-+6*QYFWd6Aj=9-7f-x`jW8Zc*-KKa#il=4aBlY+QcXCi-FR6|oU zF~PNekNp;dy;i$L8vb~hTSUU?V;}yxGcaNQ9=OgGxCgfZADYl! z$2>&S?cppmI$Qe48qQiZxuIj{iS_qzMqLwl*MGl1ZC^E}A>HFaG`(O;pl{LQe+_N} z<*SWbi5Et;yi_+fqWuq9XJ!i<*RlVGidaQsBEQ)&x>cHJmQ^Ao61^~7gI96>@8{bW z8)q{3uJ@6)O?}DE%GfLB6^#h`H_A?7lX700HA`cH=|De{KE&GSz3y?wPULS?EvWpy zL3A_13PtUHt$w5B92|Ktb#i{=|9Kuhi_XNUljFT@p>jSX=E)yNlfKt5DP_ilGiG!G zaIs3!id1YzOi5FR^_JJxGH{Wq5C7gt6#KPV)|G(6=o2&<1H#y6Mfmm_>r6(*%9&xK zzr)M-Du54}G;z)BNp!=(#M+kwu?sAmf5!e)AjQS?`bS#SsccE&3R=b5wPi-NtHJ#( zr890EA61raoV8V(ZH}AVi>cR5ZjGSds+l?}=;=UEAdDlZU9SHLi$EQ=3+^-Hl5*`~ zGr^3vR#8s7_%nIRw{<(;lACu59C`d?bkfcgJ2>6{HJCBhnPvXRhp-eo8=mlJq3eB9 zmk+nnP7Vv>h8BFwl&IqWK7At>6}d#6v^tCCjWEsdkH3UpFNS~mjB9AsbU@_a?OSV= zcWxdzsYR+r&Ow`)^<(IbL1o^2;nB;RtwWF$L>rdq@my9i6z2yQi=hBeUZJzMEtv5s@iAPX{du$Pbe`mDN@YD0QWdc91gh)a|pD>N2%P%uM=r@Wh30wYz0G|vF zOz#saXVv)(GXb%%nWN&>lgq@OLu#A#ap8KzQy$J<@H(v|V6XLkGUa{MP_YL2moa8X zDMHP3h`aawC=O02ioQz>7$>vroiyvsm<{eDjrFO{h~S2-n!9Go2>b2cv0FM%i&G8p8@?|!J~24(fz5Qg}Y?G#@eey zH7!rFxdW&qUUc8nFt$q)m0X-E=YAf_kK}xU%)HzsSSMaG{i4>yJnf3p?N6LfhSU;k z?jn7w!wm;4g&2#v(N&A7^jn7a{d^0W?C$$-++w4Qj_%sx$=}M~Pxe?0-5?ZHO&~rL z*rrF^t$hZEvVAsh>NbsTBe}8hJ~iZPWOO%$`pidl_@t%vyEEhbPtjYqszxh+Iy`xi zR-JRtUytmV>~D&)qv4y-OgRc%Oie6aeW|#;Dz-QlNa)aVw(e}|alxaZ1D4xwyo|pe z!b^kcMa=t5iR-IkmpLfITHc4p5v%Uq(?~I!(+}B*JworK`GkH*silz!u^$RqW4}i$ zT3o~S`uK!wVqcMsGFe#Vd8ycDYBIm@qwWNhUY@^bilxz19&a(Qr_mF>Vg;|1!QG0usRMG740eQPNyqiX( z;|2wF^$CK?<6P_h@sf?&-j`=ZE8?c8vMkb8r}}{!>>(p(GIeU6h6d-fja%iLuJ@Y- zKXvxVZTBj$#OfH?-)}B`<)*XX+&PmmY>#rBC~rGDp+m&AYJYE7;G3|y)#HZ8!eO~q z5*d4@2b+fJScfV0QpvR5a8!2;?`jopOMk3pmm$NQ5$BtKaL6fa5yHe&e56~{Vzp#e za^9kexWgaYiMV0Evu=x*9o*;3h24TX%Cg2Kkni#2 zUOdPe`MRG=)y1fAz&a76mViw#o6+|9M)_u0P6uE0vwWvKjmOr^#^c92r&eBEpbV2m zI)q8COLq(S>kGmY!MK<%d>7+ES$e?B;w7;Pq5pu4fE{co2y*miUmkc~M=f79kTTkU zr{Im7uNQIaHD>SeHK2F+>9Kq@;ixbq{8Lu8jD^sTG5?G#ct=X`#}4=XQb)E{C*)kR>QF$|v;Ga3B9`3~S|W_&3!%j(QGm*9e$R`1xj#?4^buNIZ!d%HrAYk8mqgySp95@?DB{ z&)6kQ&TK-CzVxL?>d_9`&-e^E!vA1ws=m<$VQuo%oQJwV8?wtHUJ|{(Ijb6n|GCua z{oE0{sM(k1$4zJ}HKyt1!Dl|Lt^UGdORS|M<}Zl#Snk(FBTE}FQ`)c)qi3EZEZg8s zSM{TI-FV^oL6gKIRgS{SrOqE`jHc|KL_f5%*T&-gTL}Yj0~5v%&|_1_&yjnvcMs5O zaYMZ1h#Ncwu#91ZATdnWY%foJbU049eAV8kse1*_->-uj;oBTS)16x1@FZFrYS06< z>S*+E903eoa+mrVeYTEcADYhVoBu)zKgGdu;Yj9lrvOX^Qc!=IO6wXJt1O7n0FLr}<6A}MQB zhPgK%-m#d-wR>6=fWGwg8vVbxERdPP^RtH$nG=fSaQhytTPG^vx+^WMb9>|0wxm+F z3+WOJ+4HQuUq^mZAkNQWeL0cjyoPS$=n_haF0kfHo^bdu35gHYbHu;=T{xeWSJ!&< z`NflZ`o|Aaq-#Ep+UYga%ApQ#V4pnt!zkKtj5b{mj|7nK_j4E5u#zU44tdWN-yV*N zdVKoiP0wD|UJ?OSq9Plqp^Fh6CWM_{hO@K@Ur=7Q87TDKi;BKixk2G`EOD>LUt)u3 zS44bkGi>UxFl^@}*_}V>lR~Vb>Ke~p`%z*y%lW1A^~rLpCy&BC_zVa*D1QwJ;c)-z zUQF;){@Ch2`wHjZ^3q67So_^Lg}xmvX1cnYY7n2Wt8jgd_ZD^j;#H>Q>uH+{26bbs zoZ%XY>4)DH<~Ul_Gz<)8%6QKY8Pt91OMfAR z7B=rM(LxxfBtJ`YSlqb2o)(vQCO-&C_nxydJQ~=ZwCSIxU4S1iT%gOgx+n&wZij72X}|dqnprePA>sdeGK$Z;(2&D=V6Zi`1%X) z*sx5~$zWz;_4ABqmbDRQQ3$Ri-F(?IaNaX-&iEd^;==JqDM zb85g?s?BmiOa*0l#0pqvS;WO4IdK2aO1Rc20?09zQ&~&PRymlTe$7YmhS`K#bP`Rt zPwGXU|2K5}RITTRd%?cv@#E-<-dF!24FT62u!{Q+X4$fEUg)!R7gDGhbF1@wlc7>= zxW9m$+?I3N+sJaZdMH-iC?wp_@^$U)6L0^Qa-Labdk?!>E+CTvzx^l26&YX^Q_cTi z)>NnF`2N^=KD<<#-15$otZoW(twg^#_KYUiAoss;y#K1LC|Pm|Ypc`aX!jcbSJQtV z?iB*7zj|?E6JE$g)amW#m z2q?q<1Nx(w1JDa}Yl0P&e;FuA?5UYq^6U5hLgj0X{O~=dS>G1zzhpd+nG(j7MUflt z@At$)Pt9bQ)%FZ4|A+s{!Cc7Vgnjz6T2EoM!d$pU?9m$#{>7}Jil;W59$zS?`}@6b zbnv~X4Wt>@-&us*a{)<8!A5iX@AnvGPi^$_Pg>gjC;aGGus*gjKV-ZcKFxovaRWzw z=z2sx=4tsN;Ec_WZ5zVfYrh9v2|eY|fX}T@3g`NEk@y0#{=VaZF4Joq9LAfCNK*AO z%xE+cV8RB=p{dRG;c0n%I{_T|$-u`n7~)Bn4rgQCj`S+;l6e{saGI!gG>Fs|le$e5 z;1l<4i@Mq@aTC`@cG+)pOeVTi7z`jmdks~#CFF&AD+QKrOWK8yO=vMk@&jBDjDQZ#!o{X2GI#tq}{?PD1hK*aw_9gw@BT(xp3T zLd-)SUKUkHvA`@|S}Ri<`$d!?tFGQnYmB0xqZ3oLU*Fr~y?j}(+~&^RyAvhm9qk<* zM~8=@)^~ODd>643SxxnVETcd7{@%O-)r)RJ^^t*Ocf4 zopFq&E05dbxd@s0`T1ohLmL|#Cu%(4Uu9VtYHz|r!ednug?5B*SX$0k*pH!5s8Cd- z?kitHl76hW+PMaPQigTjcX9{(04_gx@PJ19-GGgOfx#86S8-3{;s}{bExKOw?sy-q zPSpIpQAVR7?it^_6I!F82((qM;Low}#-fj{FJCgswAFfTd2?xLYg5W(sU;8kP_{%c z2I`>mrByfhrKIZe^HrW06MZx~bIHxc z#l_97y#7o^3H!|KTa-cZEne>RC$ky)`Nz9s4r!8JG6Y_S=#5ka!A}lv$mutFh=}prxf17ZwqzC@&XgWi{(bl?sk|_l`4a*2dNrCO9J_V}$aiCx0MT z!|XW*hA1Wp5$nD;F7w^=k@7(w9O29h3sxd#R#ppeh0(DwLS`6E>0|Wl8>P5mt<-tT z&P1ohzKb%CKbVO5AEVUONmFcS5WXl>6hivAUqc!f7q^#)n3f0Pfqjv_;BJkG$Esn) zaGlSd-^tP5$jAs80*PAxhQ(BP^HPCfb%|Lk>Av&+_Tqd`nkXF!6BARis6*6~C-0qR zY~J-+MMOlr8FxVxGd^0@yq)=_BPH@$8{lZ-t6_pNH-84Lg!xIyAmObaAW_OoI zTy~fBqGoBX=zkp@WuT|OY^VcqW^22&z1TlHI}1Y%Lv=kHupn{TYsS{OxjA7`(f;VE za@(QM(9nvC3Zg=ZBv__9OGAs(gX80d`ud!9L9+1_2&SJaEiI&%);VW0v^agy>!!DF z--c7e5>`_B+y&z^UN!yw`$s23XXg^5LTR_3&*U?1Ta2txYvJ&nc^^b-|*uwY9Bz z|6X5T--{`80?(%{zC5y*9u1_4OH4K7b_CGc}dQV>w!8jTdx1cYx;X*|XHt z5P~JSxhfgG>yo??(MCo_`uV%P847SY*Os$f+T=3stK&JnR(<{biwLrTfdSW_dsF`Y zNBcV}2|V_bwO$)DpIpDsdBO87%p7{gn`6+6Z}8dtDco ztyYA;>b!or%~`3+D%0jr$R^raTI2P;H8nL7kX`401>uvqySe?^-|uUe?BTe0kwOM} zuq>E5FDNJo`D~=r5>^h{kSb!Y@9gX>E87g|j(|BnKE6yz zl=C4JzEJp zclS3tc)e1|2nnqn9Hz>wsgi%LtvT?~@fg>uwnALmP1e46ZvEt}JHL90cs#j`B`*(8 z)>MhzE!X)sM}?L>sSx$)>&orC4TsK&tN8cMIIcfbWxt)H<>cf9^^Pw#-xOhD9n@LnMf$COzz>eO5l+*4W6|~fywpY$k30=9ks8P8rpR-m!^&xU zQyy+^E2HJ%$C+1D-I^v9I?`SXk-pR7e6P#Fkqw!!7~Qs2tDY_4y?x0b2kMPNfiAZN zD^oV00I@aUimwcq$yiML+8V`_5q5LfFm*msp7qG_{_Jf{&0#Ma288H?@wTkje8Jc> z_4gLp7!VU!4X`~^K z_LmA56CLV*g~nT>-dHE9$17(-=FV16nem$J=vac)s1SWVGmec?333#y0g7&g)}U8=j}5qobmtqNk@H7L=2hZ~6EU2M#Fm!kNn?;1ZxB$pA8$xD zI8MuWpItul!SUqScl1%$777xOr6q>}b*i^*3m*)W&DGQI1UXQ``X^oQDuUh++3;xra5NX z80Ac6X6D}BUP38ZS65d>MFNQgsc%2?B*pFW(~wFII&Q?#{6{ib+Wm-Eu#6&ggg>I)fy^n|+) zMoKbEOXK8~7!c+9_JtyT!v`;}+kL)75_YPtNBq*IOU0H1L_|-OGfz+QH*4E3ncg!$ zI#xGI?kebC++CaEWxTxXi%Pu^&3F}a-dIJpgpM6=sUz7@nYGz~wAYaH^z*f=6 zF|%AoFCYwti#|FTW(%KfKeisD@UEu%rtj)}u_=f8=_$%zR~E24*{gEI!oo7Vyj?38 z8LgaI;?eUOs!YCW%@Gk15zKX=QJwe6@li|+xw!R@&KKOp#TSW*>t##bxqja= zE@uw@CQma>q&e%Ymtsy|);yT%LANyiq5cWA{EyzuDg!h!|uCwkoyOnNHg6B7SohEJVa)hx#B8JS1`sHkCX?gQz zOc8}mxqji0sIYKvEUYJs9?1;j-EEs>$hlIU>(@LjRUI82_4HmmdW7$d2zl3h>-_rC zbEAXA6BP~Rc4A^;o3cf()Ph3h zcz>utJxOS>nM}IY_h1*u6~wEuva*xYMt`+j4)OQ&9S2`#T^z{p{98ofscdrLdsyu7^cFU2alZhlvCUy4v=Us_$o;Qo;(Vp088 zLV%y6e!aZ=QDHhYKmaF{3&{>7#m!C1@30Cc9S{yLuR~Xouy{&AU7Zv_k@x-GZ{ELu z4{`HCRXzBYzp8%C0mw7N=#oQT{M-PQHQPjZ*pqi#;pN90&eLlLU zPoL67>E~zl1l9WN6|7@RFkFIE0LWN5v;FhuYVVz&0BJ%3pI*TUiDl)}dK5k49Lk9V zKny`=J5;c^vtR8pUsA67IQqHtjYX!r9O^Fum zclU0CpVZZ>FS;)!bdWKLf1KPqb52Atvkyj2rVSp=I_1~aytLKvw!K_9O9h-Ydpj+Wal_O}r-1G^flbg(SW>p_coZQidl>RFAR_A;W|S?HKd zXzjK5K0kl5-LFv=s{y4JYV(Uu_({NgPQ;GyoUxISxP=;ZtDBn=8)bz!F^q%QZ^l#Hybkb}OQ+yX_&pB;iK|!h4XZby3T%^qS#*U0 zK#@vu&)zW@dnSXmwqsa+2^X5aeezY+)j3-40s;b#{kD|3X?%Qq9t8&zNRx-0`?j=n zaCr6MY-==al$@6?F5aR1kWIPA+GOSkSBd39N+a-LV7DRC=fzB$a7SS89oK@x&zPx`F|lwTT*0lk(Wx%)Gp7`#Vb* zdVRRw4AJJkJls1x>F<|MP0krsPZ7}ZXW4IFV7^q&}Jq`dG$gzKKi`@pBqWR=~lVX(LEEXri*=-l8E05`A0lz^RPg{pT10<4??`j-ZXL#TqTcr$E%)e9jY!+z zt`l3t?k(la&2Zj&FGZhJEdw>c~|#*Sl)`){Gq8KY-%Fr6VT zYhCjzqsI=SraSY9rvf7mHmXouL!mBr?p8d#?svw_onSa4ppGfaiWkJjKppk~G`f93 zVe`q#Mh(I~wDAJ2{3df)#qX2e!l;)&SFV|XD*2D*+NcQPB;(>5`6xaXK?DOo=KFB37$YhlU;MVbTx;^-VVd8*QXwRu2zfIQ zB7hb{O_RPC*%HOX6|bzfRi?!PK zE^-D2WrC4vm+TRn=T{8m2`+PU3!Pj0@#DwOpEe?zXiYXsy|>@s_4Ffr5a^PVlO3%Y zTX)VkJB@?16ui-EN3-8IGU7E}<>ae=kM+P%EcprCs7W?P$lY&A9|0NGmjFa8at!_G zOj`Q+lT%Wn(`kIX+NIFALESqPF4fnkDWamLrUvqaiHV7?uP@Yc=I=iTa&Kp=o1cA| zl5zs2d$QW)5&7$(CEmO5p8*-q^4sbX1zMVulS6i1vdaGi$%H^43I}W?BqRu#VE`vV zGDt|EO>qS(2*PZg(bVYZKF}B!#!3L8rItMy?Pb6GXk}K9iVtDtAf=Lh|14XnIZ9Ua{l!4oi2|C!Aw451H+pZ z7j4SDL6Y&VGs+!+G#54dIwOOS88jVWK0OJ5@14Ij2F~lCXlQBsLo6*UC}n_PEvg*S z!V@dN6Z@cszF7QzV!%KVQq35Vroiw;YAS?1&-kg-c{lM1D0?G{0CeE7p(ypMOE4fj zmWMxZvT<-gtt~XxXvN?KcdEXG`uh6d7|32<67b2+3o%4Ckv4q&`W4_(YinyME`XPK z@+NUP-dz&AcYMfHY5!xGl%~?YTTTz*ROtkSoNyhZ*b3eVeptgd9VW6+SP`wD*7&JtAdHKFYz+b^JS6zM_YEEpQ z{MK=04!8mQ0&PG0@t%`{LMxQK5jt)1@J}H11GvN|Wqid70jNl@vAuoYt&>PyT^%&9 zi@|RPY{YXK&jF$vz(I<^;F3b6Fx?9*T=JB3$TiZK0!4f))dS2kI0Og)V{z5ElpP zrkJAzz?Kk{)Yj+_`<%Qyw%}zLkc{5okPrX}Fi7Mwc@fbtl~g=kph%K$exfxlLW?;} zN}A$+R7l5bC#S=OB$M$?jd5SC=x=`CKb>P422>UngfGt_V7dfe;~!!?qM|yU8LDgT zWqbU>!gs`S>grNbYqLrd;^T{R;0{EWe1*cJA#XZZTbp{wLXLppvz^H>1`L^`WYybQQ!09b?}c1Uc{C zy{=vdfm%F;2jFiiKW$5EQTWlb>gBXQJ=pJJEs%b`~yDJ3=Em8_6P^F}kryA?pY+s4d|_iugnR)NxN zNcyjg3d^)j9q)=p&2DaPF5DG^{sX_yD)iss^Rmj#Uu5&pxL5<_ao&qa%mf4XA310= zKV@F;gATAUL%CFb+xdorUJC*eO_M6JTd|7Y=jP7R&_H_v9`(R5rL?qEIa8A}-a=YM zan|hSO>(eEA(0Q-%d!8R_ck`t&KJZuxE^pXo!*ocm-})M0Y) zG?oM7z1)+$fD_7d;IopkIpb&-Y7pHE~mTDc7>{a$j}}; zu2^;ko7|BRbD8PsX+@S=;-^`mb%d41VRhV zlj1*yFqD+cZ{Q_$_Btp@YpegP^aMZV!}jXXDW zuL-}aktmdo^!Dqmk8OT2PO zoV>?K79I2duO1{bV~_w29yQ$rzHkL829uH#)jq`VX+UD7RU#}3|+wb2{4^KXsN}0 zzMuE7$V3hGX2-HC>EdCej)JGv2&j8!&YS^>J6XuO4=8ekdg3(QLfI;;%+~+pvSGI7O9`FuAw3A z@+0Dd3D9)``%FG0XqGTRA|NhVDz)7&f!11Cc{wZ}(b zeVHl%i=n^s8z^lT6tO7mpQQ}*$%wJ0x95S05%E@t2J-m7Igaw z?Y>cf1kaz-jIx4KgV6;600NK)fx5b^Y#V9{B+#wBy=)a|_9T5U0jclCjT=C^;IQSN zKcQDE*+V>=k&uu8V)gdIt$X)aQk;O61;?aFc-ROfZEtT&`RtO*yvxm9{JPd~attgH zdMcyPQia5hKTf0-5ODKV4;fKJFs#Q@fs@$063D(Oi~O7%Q#Ii8+5Oh#`r@IV6mqn@ zA?K(0ACL6+$EoYrc?&bM@$<)asU&FY=_$1?xV~RqeK1`f59tCjvdK;e?$Rt|E136S zav0`mN_i(eGzb%VxdVNOwO)V4$>kpy*KuE9 zU*N)pR~Z>*V-@yIXc!-mhQ`Lm`uqBwJ`R{?+xo$G}@S8=AJK%9zoXn#WEqd1}Iq1s05u}!{AIysLibprlj zOXfyzPfzr~S1Y057!U$V`13BrD_bY5K!>q&t2QkS!F(Sk64pkeH$v25a(rauMM_Fn zR$rQOGJxxI&0CU@`2ebgAhkSG&Md-iCoj@8p+@u$3t?hbmTSFab~f-dJ^}NxtKdW; zlY~3D%tFsOj9d?Z37Qft!O!C32`hI2enBD|@{?NF*$1Vu-v%IiW8mo~J?|4O+GLyC zC`sq<&~9Jw%^))vy~IU=cFP^GNkjT_=7~TjTZUle`gbqC|E!Lw`lr_+(^h8PZ-rW3UZ(DTD1ey(a|M18e9R226V@i7 z7pA9~$KODLCZ1(wegn&+y872-olnzbD{#Axj@Y;J8W!kA;QV2H~3r)V))HNaDi ztDSFDeeb<{e*K(I?m*H+GD}3Xl9Cc+9*Ahr($tidpFDZO$-`r@!OzTW+K3(ovbeu( z4U{G!p_M^)b{29Sa#>jQr5HeCSU^Slm##Ik2lo2jG+P41NkEd`*bx<-EMm_R{Kfcz zd9u^@wpfUe(Mk^pm28bPPUy9bvdm!r;WxJ7T-*8hF+l~R_vDLRBxk&`%wxTOwRs-|@&BaF zH=Q#dZqiFHE~eOswSHxi+h`^AviL5B(1#j+GjDBu_z+vB4H((Tb5BptvdYT6dbiNo zDrm@2$pA-E;sVy2N=|w1T*nVLH@6f~ht$GCUM4}t4Sp^zmF)hBTCe`R)@S9WS~Pfv zlbJ(EpvNUi;WSrRf~hee#Mszaqb6?T>stLml)R%j2K@mnar zJ^+{kj5hAk0-aQ#Wk7ICK5a^-B_!zR>MA0xgrP4zyFQ{Fc*~31EaUe;Kf(+&uo@6C zQ7}W-uLnX)Hg`Zjf6z(@MBm;nGY_Nw1W2=>Ffc@h&WafuPr)_EA#MF~a}#*MEg(>m zo_@V>2%=ZtYkgw_(psr^C`>;jRI}D73Yh}qhV$pocW-Zux6W5KSp9!#(AyuR5dMe! zD`8qWTJRvCJ{kKT2{XT`ub&(nOP>F=x#_&$xeH!Oj`ho-JY;Zj+QG z$)5hnCFmyplaaepBq~9!PfriT1JYn{n(8Mp?l6B8Hclr_@BtxEhzV>934ecHV|Ubd zvF@?4gD>f_%TZ6DS*xBb5?S8Ejr8{Pga+LTkhSds%W{2azFE6-wLl{bnx0KRm{6$u zD(t~v#aahE16uYQjgI)|9>-T)9e>@D3B1&92JgQ^dMGsFsfw@O8Ftm3|?CIq9Y{2XY z34QJ8$nD9YyXqN;wda|y4cXyt>U^fA_5GeN2ML5n|E;ciGbHgCgQIQWCoHb%HY}a4 zty)#~aG1-8h_dyXkU?&Iw+k1j=?(*fE=Fi$P5VJsk*^GhSJ>bRkJhdr8!!rM3}_A2 z&aDIeHelc;7Qps(MMXi20rZ=fXLr3P1`H|_C-74? z7cSK6WqlM7aH`^#_Idip(b_UswS_CrrGwj(!Z9z1(ZDu5V3rYgSks4sfQ-!lIHDHN z&dZlCLEr)TURy_}Cs~wNLc+)9MAqGX7gi(S3ScHL;KTq^4Gj%%-=>09Cog<{R}yK4x+8_a!9)Vq%H*Rey&%az!2zxD(Fu_640BEl6=tLET6F zYOE^$JOe3d!P~b4XU@cLlQ>r!W@-X(+VPMUp5O_Sqok&W83h89fkCUp7dA1Hv8+w=PChg`Q%3{Q{ruU|xHBI~dTue7PBF zF?T&EZb(}uodJW}XenN8IPLr#;1zHw^pazV&CRtf?DdUsT%`}D0#OsxqY$&36`BFQ zrKGyA$Q)M-ld`id{mI6b9B4!)n_N=8QnNW&^vtQ{>#hOxhlzz6EX<$=?jo2}*B){z zs<^~NF>v<<2M0qta$#Wse!^>|IQEO|?0x(&lQ8(7KYwP3WCv&l$_pD?aG0Lg%?q%w zLToT4%Sf&<30-A3QUX*gXTYZ7VM$5J;NT#=poJr&&h6X%;C!Q_gD&9I#Dp3Frr8E2 zGV3`s+EY7jwhB0%Ie1?UtBPuBe1I;LsVghDgFO%2GR)s0VZzYB^-Y(=T^DYus1W;v z$v9x`c8yvxb8@~bD!Q3|Q}s8XE~~Argj|9IUjP1_nL+g zEIE99{9LVf-@biYUtb4*M<_I(@$fj~+rd#=R8$0S78UV{gbtXxsKGfwh7t3cIC$Io z+f7}l38S;{;|DlM%AuWz(O4Nd5;_o4-d~4@6*ZKG1_vo+l9G~;N8A11zki3=fU$#G z3!xA-+gacXWZ-{ukZEuM0t8LlT8N=s|E_^S?$8nh(&w9SifwPH-{aGv#|GBU+FD7F zvEh1re0-3OATYsRD0H$Rslf$frU&|%7H6dVZ7^HV(|_JVfr-S+t9rcy9Iu@(uL^Q- zJSq?p6f7+(6XN0N?&;wLqXcxt%gVk299D;(ephEFH&}919eQhp{&)dYNr;I{$JJGt z)UZKt0C_y>@#A%1Dw~^-PBkDULzH)Rf&=zh#~d605*I8K_zAC_t0mz+p*hXP#U&*r zg+ziMsiVJNkc9;raxzu;yOSpej6su_4F200{)ONRx(e)R*1l)#m>@#H)dVT>lOVljoeHcn znE}4tbn!~-r%%N>L?N#M=w|eO;fMCNxw$#FT8Yi22yZL~M8@ma)I^_x38}!;y|uXs zCP(;t31;{1$;isWLxbCJG2;`wkd>8%HzE0gj}H!mgE>?aU){U}gW$LnG1rW^jj`j` zV#67gq=SmCgTAu1u%KIHg2j9v?#+%eG8(iCy9izG)rAEN6HnU!jXpe&y=M!&cS8kt z?K-!p#xGyK{M+w4t@!K;fo?a85R&M?;hD0zmzS587WkMTiF1>d%t4WYl6A1Z53C(1 z?aa(QceVRq{Is^tQDvX?^6Pt}1R({9-b4^UVM>aW%MVrYEC5u}(#B$E&G8|1@r#S= zr{9FMuMHlkr3mPRE-C378q!I>DW{;oiqsd| z3bPsO?TX%!W-xeZ8(_eUy&?j}FY-<-a8ta zmKNQp=!3mAOJQpagZtM(bw~C?NxjcVdlroRk z!3HD)wWiVexQGz}k?NCHD`H>*EjcBnFfC3s4GmsS&U?23mB0rUx4lwf+rxDf^+PfB z7duE!Y9jEuFDuhcgioA{)+ne{UBKwlfI@S3hwG*e6(L#lSOh`kct*@Vy znAoPRP?#JM8EFpgN)W0E2nb%mhJp|Q(mOOQ3XsR(7T>w2lJb|4}6${C5`xbmqR=l&i7>uBvgKYX_BG_Z7&*_~Tc&=P5fjVkfW! zt^3%ZlI@d1?+xG<2I5Aiz%NwA{v%6 zCei2Ry##&f=|vTA-vtE)VG=V`+}vFFDIh2a?||zufm=@iH1_s(<8$yTgrUoC(G z7uIcXKqi=PvF%s8!q^HXpKoC3fQC|D7~~zuLKE-ZxG|9m&hy?mNpK~BuUK2eXEj4T zTX4zuyV!%42>NYzdYQ+)R+8S^Z$X+~Y68>C4S(E@-usOpZK7mkWR#Q$eYZWJc7XdI z9?`K_h!$8bk;10r8kp$K+n)ib6nB6HuBu9s8#JjPKW&9;irU`UxdIefLnAseG9QRN z^nN2EI-$^52|*7SAP#_R0fDD#m{{iGYEBtCVp^laZ0$D@BKQ(F1b~9E^%oiqHtK#O zC4MCgF@q%Ux>rH zRpf^6FhOhpjM>4&_*&C$qh=kv_0+G^&{+Bq_;Q*{yq|6z~KC4VM*O z!Fnt&zvEf{`l!tJS($5@Jh@%M5m9hxD3Ff%xjERmlv%$J127Oog*$gHqDTYc@vr!8 zjVfQ#`sa_X;GZp;iV1uktsMw{8&HhlsIC`+*)umDL65a_g&vFu+Zkt)|M`K~&YC)(FB$da!0ICP@1z3TyNHGz+OBmdfPE%` z))$RhfA#3qs|yeYc;<80qkxqC=fENdZRm;p#Lbgzqd?>b%LrqJjNI{N;H@;eqCj#J zZ0+;kG0f{XaK|DLdwc4@;szFWhEZdC5F>^({rf<_zs3g!oO{xkL8dJpk`VnAMz zVVyty=lP;Iz9_IS*iz4!8FP|KcW*?|+VTJStTvvI;2$y@dYa(Rkl|Ao39Mqs4X6f; z>j59w!Qt}zK~2oZucOK++l${#qyOyQg#Cbd5fcB>ZG1_SqR)TEM3>%!9D>9-&qmDe z&%iid!{VAH{YOpc!Xl%C{fz&9q}{^wQGqL+F_$3<@n_tZ?_T4KFPJKFT01_CrJNZ* zcJJ>E=vBx48)Pt|tlB2(bK@-;Q^MzuR{P7-^hOl9X1i6ML_?a_79kjre;5!iLH|#< zLnQDC;6A;rY32UrL`_MpJS#;zG{!U{8hRDr(|543>08-|9xFHO`5`ub^64I!aHr|CX~I8&d`LrcBbkFHe1w~^6&D9ba!vCFiqTO) z4xCN@Otw){z-5Wm@c{`55g61jm67S`rq2ynBE)Ih!LAHjtq7T?P+MwiXa8|53J43w zt5b%5Lildq0+PB&4?KI=r{=`rn3K zR$r#IP!d=u$z{M_xVJLK5%*avDj8Z^(2yczhPFBwgYIy~LpXqkA7sdTrDJX%HtR!j z{!ZexK%liXC-vDq%Zdtq)pJ}O*+u!Pyzr=CwIW~!_J3OBp}V}_&VUZ+@^JHD#^DG? zZGPr(ZAnUEkZA)eND)Znz+dM&U@r&Q=KXC#N9h#~t$~Sa>qi%qUub|sQv>w1GT1Fy15N_iC;`rOIXO8no4~FF@VB?GZuTy^ z!hV(au8W%RnT$-+yF0lA%%D8XiK%C5=IfP)Vo-k)Y&YFY4J5}jkg-HZcsL^(WwF)% z{OPR5hu1)42n>3}eP2O*u^E^63irqMX9C`uCV$?%Z~FvF8*G~cuSro85PsO> zxL6CyEL-r`fq`NoX!KCy^#e$iY0FOYQ|5wc?Cw^Ft$@Z*$NE&Rj4Xq~%^v(^YxMVa zD%d1ik^^nu;23~P6=l#*1G#}yNK|yH$|O{imb`LZ)KgxzD*)3dlFefmQfO8 z30bp`H9KSbU$WHue16{#?{VCpIA-qOa^KhQysq;+ui;~cA=>?(#c*5(E0O+$- zRYhfXNwyS74R(~L>M>xYfpiUNw6?I|@o<1=%F+*vRAyaNQGmP^5fNfW?EA8G%Nb-V zAzeNd01#dV#2DGy%yxw<;G1+5^zX@qQa9FVDO~xy!^p#&QpK(JHo!%W=g1KO$!TLu zmFIVkl{`CtIUaJmGJ6C+hu0x&oe>KBSN!Qw6-0nax5c|tI2Oq#5H^0s za<4(d_AC1HqT{OWH#ZnZ03#xVnB=e$yofw|sH zry=h!QmA^HaVz%8JvSf)-KkO~IbRHQn)ENXPg6J4_cX=t_rI(t+#1?p{;EaAW6g6%}u@!M^z| zO1!42DJ&rKFjkp>jj6^)G8mj;#ciI(!gaJh2B8^H)mwOTS!L-_pSEhNrJ#LjMNRd| zFJFX3`PT&8YuQdNd|?GhFQJeGHUTJT5ll**9vQ$34L~1c!T|fhh!;D9%hcU&yqr-1 z3DXAO^AO0$zxbZ4ivj{fg&(DPAa#U<3$mxPbEF5Wr64+456NCPrPHo_T{MdmmT?j` zb*=HBSHU4aJZf!nb#*lma427s*2Afis*(K$TprlnOAE^lz?o=g=(s+6#%dG|tnaN` zG0I8tkGQ3r3P4UfyC_)71=bUwr+@-9sLqD~7JTHoS}Q+M0rZb>Y#~8S+XKZ)D6&qp zDP-M3Znfm$RH23}FuJYaB_So@poK-GSK7Dfea9|b5JL%Q6y0`j!Ph$2_YO{m91~4c z9-UhF$-iA)kWqC!-YgZI-%#!Xa$kX=3J5JG28L^|Z+y}}k|LaPC*l%27uQf<-<@F% zDD}$54UXp^jc@&U@$X{zFUEJCEX8uX=U%fh^F)U;pl7IIQ{ol(tD9)oX z%vY`}a1%uvzO}d69!%iW@%|9rtAn=F(%(bZYW|J;{egnmzG!nL-)CQ9JT+45a7)%M zh^tHDz%5Ge_{T%*otppmcjBpfql75)A063^9W$M314^s+>{pJltp-{@eK|a3{6r>5 zRkr9%K-PFp)!1aqp{WQ*Q|&8kw9-^t7v+f<6%Bgp5@w{SCEkXN2uVe~dASA-#h2@5 zwvOV`=Y+3S(iY&-+f8!R_|=@ZKF4xM=Tgm;{uW&ZO*R$Y6;EY!V#dvgyP}DAX`^FU zpxmoV9vYgoIct*B>bd7Qbx!N(gbjsMg5D;mL@TpC7&JevA9-&N0~g!Q{c%RDhB)4g zVv)4xBF|+46j6&gwP(36SAO^K5l8;AIct?K$?wd4k9KnwF1*jbW|bUBAMO$uDH1f} zn|g4z8SdINT>i0#N$FJdPPpNW-NF%>txv$+%xdi9#s-_J!#}Aw3CbtnA2Xx41BBwz zf~BRTos^K&oAXEPbPcRx)wrS-v!o@Bda1-aAT}MS9r(nB3bA%c=OUz6KFPWeb`8cy z=kbm1q*SIW%5AJLT8s7*&*gg_YyZ4K?k(`bP9EFMvazrT4(f1iHN>xa5ufSIygWOg zTdg~6p}=7PwB+(!XOV8X56FW~J1X~oe2!o8k=q>or}Jq3Ne}sXGAA3QxwcjqTxGlY zBC7jAv-9QtBVdt^96cJ8q%epn;$hjChN~IN6P_v2^wU=gSJk>%?P&sRy{G)$5}Rn) zKO=jSdKR0A@M$jp3hAL!oEM>qMf<=Se_`Inau zP?Y=En55~l89F?NGTTuxdA~lZO0r%gFyS8JN{_jrm)3 zlEZo+Rs+rz0Hept=I36$lEIFI>2N9%?0Vh_>GyU7+wD^aWtF$5W8=UF=>u z1nYljYyD5`ekzmdW}W$Urr)#USkkvSl`(s9oBs@A()C?2P-YVqeMYZqZl0Nd1AY#a z!S}Zp;@~(JdR?r&>mmv)6fiG9ji6@w9JzbA2PBYDk&#-0s!(#gd9xAJHf3Th_%;i= zd^~CXwugxO?`@ac>DpCs_#D|8E7duHXZ3%K9mGzJ8t*)FNb(JLtE5rS#g>~wewxts ztw*RTcCk7!>|NE4_X3%VHtpHa9igO61V|@#P`dz2E_UKXZPm?Wl}ridv%iXGP~1Em zFR70*&|(#e7G#5RLdWK7?au?wVstpVrFzVc(}Q7h!ri zdc~kobX8Y8-T7^$<6x&Y!tGZ}i?3u@nu*QWeCAkIuC3%N^|`i(%-7G!R=P7|n}7U> z3<)`ph&XY7x8%e2wzjWBoQ!ly^?Tb$vLqtp2fk9!aV1YH4H9YSJB9%Y?Wb9;mS85f ze_&wPG7n0AW6hbReHNe@0Bavm&vdABgD-1|_m+e|g|A117oIL^O}#ba5_XflO_Cyb z#s?DI~$ zbS-!6F3L>}4X*3wB4N2akf|z*wda^gO5kJZmVi{Cq|a|i&(Lrvc;9tH!=v`IK+Oap z-x@X^{odfkv`WN+q#@|e>aqZXSJ-b6qC`7A=%A!W$-PJ7`K^%(a|i0MsNJtpg%=N&^_dI5)VEi4?kpi^guAd3&?K4({nxw^V9OE`i z5ml;-Z{|?(82IaZG~)Bh0N4G5+-1Ic;;|;md(?vB*?ys#Ir(Q;=w1_xJl=4WoI}tw zJ3NcAE5yNIivUY%+y;*UB(@)YtSDAR_L^NVo=a-9BRg{Fc(-r z7&JI`1a@^;a8ph-)XDDO2-xz<(hqbj`t`WUOTEdlzG3Nw(;XZmo$&e+2!*Gv25b;+PKx=RKZ6rMxSR-3MD&SP?hoJ|&)Bo{xtVUU*HmCpIrE%kPN| zSc<0>*a+vvS7^)V4&TM5&t{+z0Zo@1_B-I0Tg`j*WRR1?c)k>6yDMI!|2dlS?PZK< zMmrIfQ$u@M?QEB*WLO;D-9ijn0A+I3IRFJ{VloDX>}n2m{?I5xbv}wBAxSIG@`w?< z2`M0Hi>>-OV-AfRQu@Iv1x}RaK7?p3F>a-cWyku-;~L0{+!r3bu+7w(Akk@WA9%6t z{#Q&4Z_(JoVrC7S%3Y^r78#^d{-|(r#z6JzaYu)_`Yh9!CDgIV$$e6OR(bF_ZMty>Zu!@AQ>PZ! zGKF*eGE0%|sKtkQrpmZ!bKvi%%Oy&(`Q;oTJ^fr=4LZaIZHVN+Bj2yu?FgQylTp?8 zPSiz0Nx;O^lo{()dod1wZn*@rYXi(+c#C&NGX@SVZ>teYOlhl`6U&@#!4lH@yIj=2 zbyy7gKIGW$Y&Tk3KebAEgGSUJC8(;!NKxFY9H$d%#IMX&zf3M4RnT@?ZIB_^JI{w= zxPJ1wAwR`B0#o*~2Kyz6@28Rv71ef;wciN9!!ZNZ!-6Vs+Z1$ncSE-o@0vUN{N-nP zCTjae62-vn42l=G0=nqe`rsJ>$KKOO@zG;C+y8w=zq;XHFwx3x#bvx06go=Z+;9Ld zHRa0|i&~v9rM}q5I9Y%2yF!Q*NKY1~NqrU&z}lg$y{>z3?^>Y<@<|s88yQ_sL_DH( z>{b1TX9J-j1!*iKzH^TG5(37xQLiIHLPLR+QY<6s9|u7=NR>rpXRYcD;s9lAVWbzH z#hfY5Ra8}a)9qC$B1x@-lt)k&i*PxM!ky)arj?L+U%R|H&*CIh?ATsBP$aF5+&_ zfNTmLL>iWJYg64u0Zz|t9IL?}3L;!Q(Ot3<9a+ioq1^;etjDLVY8Lzpm9Asp+fQ=_ zBX{lxH0)2_yQFo+@y5cl`L;`nl<=S+U2w}<$oZ)z&(YSPenXazns;Swgx9r;2>uC<6eI$rV%XEG3ab(MG9E`zW`ON!;X!VGj?FebexWoi7)1mvLK%%j@VV*yXdnE``r&NQ6Y7vx2Y5mX9Y5&#)ZW z!L-?EdlK>+b1kG<*b7u4~tVN_3w1Xw$pXZh~~kR-PcK-AkSZ z2bXosD4J^4Cvii+o*grRTnS)}P*Q?gf3EL=xX;pAe}*a?Ne@A>5Jw0O{-?!yPkxUJ z*6;*Z;@a+kUKj29*NB(U^!HA1<&7&cYt?f|*0GBE5y7v`6vSPYIPi|lQCFLOMt>Er zK=b!_G-xgjsd;%5lwQ7A4A8X>ejsU>{bQJ-h;Pgwu!!%e#i)l>Zk#&nt8#$adqjjj zLAg?DQV~I-JmZ1ZPGF@okyc_1;(i@?qFNA$==fc%bnEB)@1#vinr3=YFTC7abVMb4 z-d15klbdY5w?AN8K7M*xa+>|U8c)l%z)R;3&1IJ#z%XyTMr&&T@Sx0!H&gySxw11W zQ4=o_qbx&k)3<**a#iuY>E2q*0&X*VSlW>4RyM&HKz}t^l%gXQn#!V4+8RH{sV-s4kpW KmP?b>ar-X=IU$Jv literal 0 HcmV?d00001