From 885b3bbb7eaa2cbae873569a4aaef148c1beb70c Mon Sep 17 00:00:00 2001 From: Bartlomiej Plotka Date: Wed, 3 Nov 2021 12:53:29 +0100 Subject: [PATCH] Added Receive + Prometheus Agent tutorial. (#4817) * Added Receive + Prometheus Agent tutorial. Also updated tutorial 3. Signed-off-by: Bartlomiej Plotka * Apply suggestions from code review Co-authored-by: Matej Gera <38492574+matej-g@users.noreply.github.com> * Added minor nits. Signed-off-by: Bartlomiej Plotka * Apply suggestions from code review Co-authored-by: Ian Billett * Moved to Prometheus main. Signed-off-by: Bartlomiej Plotka * Reverted due to broken main. Signed-off-by: Bartlomiej Plotka * nits. Signed-off-by: Bartlomiej Plotka Co-authored-by: Matej Gera <38492574+matej-g@users.noreply.github.com> Co-authored-by: Ian Billett --- tutorials/katacoda/thanos-pathway.json | 11 +- .../katacoda/thanos/3-receiver/finish.md | 7 +- .../katacoda/thanos/3-receiver/index.json | 4 +- tutorials/katacoda/thanos/3-receiver/intro.md | 6 +- tutorials/katacoda/thanos/3-receiver/step1.md | 4 +- tutorials/katacoda/thanos/3-receiver/step2.md | 8 +- tutorials/katacoda/thanos/3-receiver/step3.md | 2 +- .../4-receiver-agent/assets/expected.png | Bin 0 -> 88114 bytes .../thanos/4-receiver-agent/courseBase.sh | 6 + .../thanos/4-receiver-agent/finish.md | 20 ++++ .../thanos/4-receiver-agent/index.json | 51 +++++++++ .../katacoda/thanos/4-receiver-agent/intro.md | 30 +++++ .../thanos/4-receiver-agent/step1-verify.sh | 8 ++ .../katacoda/thanos/4-receiver-agent/step1.md | 56 ++++++++++ .../thanos/4-receiver-agent/step2-verify.sh | 12 ++ .../katacoda/thanos/4-receiver-agent/step2.md | 104 ++++++++++++++++++ .../thanos/4-receiver-agent/step3-verify.sh | 12 ++ .../katacoda/thanos/4-receiver-agent/step3.md | 25 +++++ 18 files changed, 350 insertions(+), 16 deletions(-) create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/assets/expected.png create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/courseBase.sh create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/finish.md create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/index.json create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/intro.md create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step1-verify.sh create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step1.md create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step2-verify.sh create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step2.md create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step3-verify.sh create mode 100644 tutorials/katacoda/thanos/4-receiver-agent/step3.md diff --git a/tutorials/katacoda/thanos-pathway.json b/tutorials/katacoda/thanos-pathway.json index b0dd9b40bf..5f78305e33 100644 --- a/tutorials/katacoda/thanos-pathway.json +++ b/tutorials/katacoda/thanos-pathway.json @@ -1,6 +1,6 @@ { "title": "Learn Thanos", - "description": "Introduction, Tips and Advanced Tutorials for Thanos: the CNCF, Global, Scalable System for Prometheus Metrics with cheap, Long-term Storage Capabilities. Course version: v0.3", + "description": "Introduction, Tips and Advanced Tutorials for Thanos: the CNCF, Global, Scalable System for Prometheus Metrics with cheap, Long-term Storage Capabilities. Course version: v0.4", "icon": "fa-thanos", "courses": [ { @@ -15,8 +15,13 @@ }, { "course_id": "3-receiver", - "title": "Intermediate: Ingesting metrics data from unreachable sources with Thanos Receive", - "description": "Learn how to ingest and query metrics data from unreachable sources with Thanos Receive." + "title": "Intermediate: Streaming metrics from remote source with Thanos Receive", + "description": "Learn how to ingest and then query metrics data from egress-only sources with Thanos Receive." + }, + { + "course_id": "4-receiver-agent", + "title": "Bonus: Using Prometheus Agent for streaming metrics to Thanos Receive", + "description": "Learn how to use Prometheus in agent mode to efficiently stream metrics out of cluster." }, { "course_id": "6-query-caching", diff --git a/tutorials/katacoda/thanos/3-receiver/finish.md b/tutorials/katacoda/thanos/3-receiver/finish.md index 8a47bcb6f3..88ec7238fa 100644 --- a/tutorials/katacoda/thanos/3-receiver/finish.md +++ b/tutorials/katacoda/thanos/3-receiver/finish.md @@ -1,10 +1,11 @@ # Summary Congratulations! 🎉🎉🎉 -You completed this Thanos Receive tutorial. Let's summarize what we learned: +You completed this `Thanos Receive` tutorial. Let's summarize what we learned: -* Thanos Receive is a component that implements the `Prometheus Remote Write` protocol. -* Prometheus can be configured to remote write its metric data in real-time to another server that implements the Remote Write protocol. +* `Thanos Receive` is a component that implements the `Prometheus Remote Write` protocol. +* Prometheus can be configured to remote-write its metric data in real-time to another server that implements the `Remote Write` protocol. +* Thanos Receive allows us to ingest the data from sources which have limited accessibility, or that has no querying / storing capabilities and they have to forward data somewhere else (e.g Prometheus in Agent mode explained in next tutorial). See next courses for other tutorials about different deployment models and more advanced features of Thanos! diff --git a/tutorials/katacoda/thanos/3-receiver/index.json b/tutorials/katacoda/thanos/3-receiver/index.json index 9d3aaa1992..e9a2608b1e 100644 --- a/tutorials/katacoda/thanos/3-receiver/index.json +++ b/tutorials/katacoda/thanos/3-receiver/index.json @@ -1,6 +1,6 @@ { - "title": "Intermediate: Ingesting metrics data from unreachable sources with Thanos Receive", - "description": "Learn how to ingest and query metrics data from unreachable sources with Thanos Receive.", + "title": "Intermediate: Streaming metrics from remote source with Thanos Receive", + "description": "Learn how to ingest and then query metrics data from egress-only sources with Thanos Receive.", "difficulty": "Moderate", "details": { "steps": [ diff --git a/tutorials/katacoda/thanos/3-receiver/intro.md b/tutorials/katacoda/thanos/3-receiver/intro.md index 3ba44eb65a..428dbd7218 100644 --- a/tutorials/katacoda/thanos/3-receiver/intro.md +++ b/tutorials/katacoda/thanos/3-receiver/intro.md @@ -1,4 +1,4 @@ -# Intermediate: Ingesting metrics data from unreachable sources with Thanos Receive +# Intermediate: Streaming metrics from remote source with Thanos Receive The [Thanos](thanos.io) project defines a set of components that can be composed together into a highly available metric system with **unlimited storage capacity** that **seamlessly** integrates into your existing Prometheus deployments. @@ -6,12 +6,10 @@ In this course you get first-hand experience building and deploying this infrast In this tutorial, you will learn: -* How to ingest metrics data from Prometheus instances that are unreachable from your infrastructure. +* How to ingest metrics data from Prometheus instances without ingress traffic and need to store data locally for longer time. * How to setup a Thanos Querier to access this data. * How Thanos Receive is different from Thanos Sidecar, and when is the right time to use each of them. -This will allow you to setup infrastucture - > NOTE: This course uses docker containers with pre-built Thanos, Prometheus, and Minio Docker images available publicly. ### Prerequisites diff --git a/tutorials/katacoda/thanos/3-receiver/step1.md b/tutorials/katacoda/thanos/3-receiver/step1.md index d20013ea9a..8e0b6a0300 100644 --- a/tutorials/katacoda/thanos/3-receiver/step1.md +++ b/tutorials/katacoda/thanos/3-receiver/step1.md @@ -7,6 +7,7 @@ Let's imagine that you run a company called `Wayne Enterprises`. This company ru However, these sites are special. For security reasons, they do not expose public endpoints to the Prometheus instances running there, and so cannot be accessed directly from other parts of your infrastructure. As the person responsible for implementing monitoring these sites, you have two requirements to meet: + 1. Implement a global view of this data. `Wayne Enterprises` needs to know what is happening in all parts of the company - including secret ones! 1. Global view must be queryable in near real-time. We can't afford any delay in monitoring these locations! @@ -57,9 +58,10 @@ Verify that `prometheus-batcave` is running by navigating to the [Batcave Promet This lets us tell Prometheus to dynamically reload its configuration, which will be useful later in this tutorial. + ### Batcomputer -Almost exactly the same configuration as above, execpt we run the Prometheus instance on port `9091`. +Almost exactly the same configuration as above, except we run the Prometheus instance on port `9091`.
 global:
diff --git a/tutorials/katacoda/thanos/3-receiver/step2.md b/tutorials/katacoda/thanos/3-receiver/step2.md
index 9f4a1b9ca2..c22b0cd42d 100644
--- a/tutorials/katacoda/thanos/3-receiver/step2.md
+++ b/tutorials/katacoda/thanos/3-receiver/step2.md
@@ -27,11 +27,12 @@ Since we cannot access the `Thanos Sidecar` directly - we cannot query metrics d
 This means that the Global View would be at least 2 hours out of date, and does not satisfy requirement #2.
 
 
+
 ## Thanos Receive
 
 Enter [Thanos Receive](https://thanos.io/tip/components/receive.md/).
 
-`Thanos Receive` is a component that implements the [Prometheus Remote Write API](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write). This means that it will accept metrics data that is sent to it by other Prometheus instances.
+`Thanos Receive` is a component that implements the [Prometheus Remote Write API](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write). This means that it will accept metrics data that is sent to it by other Prometheus instances (or any other process that implements Remote Write API).
 
 Prometheus can be configured to `Remote Write`. This means that Prometheus will send all of its metrics data to a remote endpoint as they are being ingested - useful for our requirements!
 
@@ -58,6 +59,8 @@ docker run -d --rm \
     --remote-write.address 127.0.0.1:10908
 ```{{execute}}
 
+This starts Thanos Receive that listens on `http://127.0.0.1:10908/api/v1/receive' endpoint for Remote Write and on `127.0.0.1:10907` for Thanos StoreAPI.
+
 Let's talk about some important parameters:
 * `--label` - `Thanos Receive` requires at least one label to be set. These are called 'external labels' and are used to uniquely identify this instance of `Thanos Receive`.
 * `--remote-write.address` - This is the address that `Thanos Receive` is listening on for Prometheus' remote write requests.
@@ -91,10 +94,11 @@ Now we are done right? Try querying for some data...
 ![alt text](./assets/receive-empty-query-result.png)
 
 
- Uh-oh! Why are we seeing 'Empty Query Result' responses? + Uh-oh! Do you know why are we seeing 'Empty Query Result' responses? We have correctly configured `Thanos Receive` & `Thanos Query`, but we have not yet configured Prometheus to write to remote write its data to the right place.
+ Hit continue and we will fix this setup! \ No newline at end of file diff --git a/tutorials/katacoda/thanos/3-receiver/step3.md b/tutorials/katacoda/thanos/3-receiver/step3.md index 094de74d1d..ae3611e3a5 100644 --- a/tutorials/katacoda/thanos/3-receiver/step3.md +++ b/tutorials/katacoda/thanos/3-receiver/step3.md @@ -1,6 +1,6 @@ # Configure Prometheus Remote Write -Our problem in the last step was that we have have not yet configured Prometheus to `remote_write` to our `Thanos Receive` instance. +Our problem in the last step was that we have not yet configured Prometheus to `remote_write` to our `Thanos Receive` instance. We need to tell `prometheus-batcave` & `prometheus-batcomputer` where to write their data to. diff --git a/tutorials/katacoda/thanos/4-receiver-agent/assets/expected.png b/tutorials/katacoda/thanos/4-receiver-agent/assets/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..7a60f9066781113099d00a35054a0e8e6c95d0b2 GIT binary patch literal 88114 zcmdqJbyQp5);3C=;zdev_X5RTin}`miWdnKcPKQtyOZMX?#10*Q`}vGbNBBZ=e+0K z`~Mx^7+*#h$<9vJUVE*%=6s%K&PA}2f+Q*uJ`w@~0;;r>msENq}$~EB(pvq?OAs`==aU zmea{ZQ~gZcsK&vnPHDm&@S-dB0ggaJ?=iIMK~*vg@0yWC#K6F)6?`Tk>1^fN$?&j` z@i^Z^@rzC6`sd33et5nLg7Urk_Yv^=Q}E@4@P8e*;b5S?{?GAW-539Vp8oo@jQ5|5 zA^hf3Q=6%Ebd;jR^cT5ZcDqHS5`SaO+3Yg4dEx5m`*XmAlaoD22s6v~KR^0=keyXz z^UXwz(%Xx|V8NO*o_^wB;QZE;HQ5gXlLX`8ZV>rD-$r00N-t-@zS+YF7Gq8RESq?= zS_hCvyuq3Omy{}`7@o(=SJcK7q7H1TRN~^8!PC>z zT55Wj&?q%^&`N0j7dDQw^B>Rf-C%t>UL^m{iaJ*I@x4L|sFaF-PrrwmBkB5-gUhl!- z(X+KsZNGHM#X~@om6i3nj&o5*M@1!OWaMzLs0h-%>DSq*=%UYn>@fGl6d0L)xPGRS zf-ma#vK-c;uA@WUvNE?MtNiupy!PORg)Gz1bZe_MN&R0VeG|E6-_Rp2j!5Q&%E+2K zch|dRVw!-BYZw_!8Iy~eT`%HGKPZE|Gg?vgrLSH~o0LQmo)b6Sj!w*2UT`SA4r+Z$ zn&-wWG)3#|@O`qkufk~$!eQaIVwJ_0=X&>7C#qV>Z78n2P z?XAOnTKDGW;vz48xS5ePyKB_*kY@P?R;=KJbf}C>hM>=FFy^~|4dD3fka;vxhz#&V zy}IHj#wAmWg3?eifa(h7q0ra=!89shz}x&g|rMui%t4E zGDt91=Rr9yP`X`qARpi2$zqfDt?hvaCdQ#9`{Z*U4Mqe%8MW9#zOyxi2Xgk&~B`4}*#c z%F6n{y;TKeq~%Ej9V>njZOo>7koRE)i#-MYKHbUsO*g_!&JDTtXxgCQ~NBG#IUDrLomAJEkYHMrCK>S{tH-$m{=0Z$KRu+b%X4P1+s@I3e zqs+A3iY$)(zb7aH3HA@Lq`Nyivpmp=)49DOy4JpV#K*_y$tQ0f&l-qp7Zw)su<_j= z-VO;I;?_OvP*Gyq&Fo*5!z7Sx%gf6R>g|d{s$#0MyM80IFS(phK(3D$IscTlEB;mD zFA*k>)|Xh0bjND_F>oJ5mMoXSYNx04yS*;qW8lz0|8SG*?c&NkdSz?2B${sR;f|Zo z)8WC<6-ept$SEInZ$KUAY?p*0Eu$44CM^wv$IkZ5W?T)P1McBgbF)9e-&gPU<9@PmFm0WlhZxo6f>yhOlT=Q_@F zdwXk6J~qA`^=Sg)NE%P!e4N4qN2eN7(>)+kSlJL6`rutrlhHMTX)Cf>X)u9Rh$iv& zjy=Uh)j?H5Lt#3#-cztW`-q&ve?%?}3Gn*MxphO8ni!?T~oEym5P#vOHo3H{>vZR zxw`Q7r?$0@Y?_s3a%2ZK3em^idG2T>(qpKoWI8%83NiLi@mI}8@H+X&`$mXAOwjAt zk5ZnMcHCzu0LC#rqnIWbin0Eq0Wp*8*GoK3jU6U^1qEq&8HLJvQpKw*IfIz_PJq4j6WV+fq{GOQFnwpa2(SC1lad8uYE3KWm zZs+B_@NNUbSF!DPjMF!WnchqaKr~TTQ`_I$zj61Nt=^ASQK@uX2Hp2jQL-e#HP+oPgAzQj~@d?-@ciiWr4Q34wzK~aWxPHX?SF) z*?Z$7IjN*aGuhV{iDi&!F7_ZjTwmc&gu9BFD#ZNmDzNcy7KX&wyFOQU;rsjeP8=L# zFKnX6^s#YproOY|n)ms(t!8rBdN~GD#3e#)O)WaM&L<~fGqW@APeQ^KqoRKAAMEMB zZ|vBz?}@uecEF`kB!mP0C~UYSLIHw79y{>sy27^oF!^10z$eC$&SpJ0fZM1q5tV}qsnV_Ox3cPIqj#RbO zax%-d_tr+Yf1GBN{u}hUM+~iTPS2?pVlFnhzprGOms(rTB1a}jZCYFmxN~O;Tx#Wc z-AHI7D%yJbu}G}ElyH6Bg!$EY4jqdg&v?ow~3ng`4pIixILxxwuyt3L7F zVha(OiOF{*9S!F_nf~Mp+{#}R&{l4r{oMu@ib_Q6S;?aI(5all>WT&lBbBP!_@1cW z!fdLsantOK^5G=Zic-?@Q254})=6gZoUQdz&FI+NQY~~SR8x67kJ`P7w@)F1=f~+6 z=a5iMk*E2#1>yGl;$FaGkwf&wo#sE#39tei*?D@!jP3#$ zUdF5CqGBr~q|iw=R(ghF3=wP2RA!7**Ou*VGe}gfKTl+z2jLlZv5+EphC(v?YIip+ zC)3x>CdZoExcGRR)u!;Pcb-q{@pXB5wYlP()wn<$;U^Y)1igihl^e5?@Vk>!Fs`(+ z`dqK$_zKsUYAr1+R_q^yhROonw7)p7oZPl|d-I}z~D3KEMKm!6E)AIp{SuPGZT|*2fLVrgtGE- zMLC&_=2MynDa_!w*wns_Gxq5je^n_3X`JKrxcJym3>9T%!0la}{{R9E8CNId9i~2V z>)y_Rz@L??o?=?G#83=YHjWPJu&(o;P6UUX;^J>0N*3D5NyaimgW)Jw7VIffeKpRv zx9$`W{gx0F6}4_I2|+I#3!ClTZ}3yQ*B|+VT(1cYl5>(r+PqGlfXD$X>dF@t=jZkj z*UoSf!J_hVT!F7H?{7RI7zVVihBjvVYsVqa9u$Ypb_4gBRX1VrFMWlzr3X49GJlgQ zQn#0@0Tke-dT@y0v`>9z#w?Herk#ppR<`G*e&^U7?aT}Zz)XPVc^3ihg8y+lk8?KR z?7cK|wtgsKVM&RWvUczs)Qq#aEQ0Pq|jCYT{TQ255*KR#alrkGBIn{@u-MW^-xkMuxkr!zIR1hCK%$^HQ=IoMbPktg&_ zOk@~{^z?&Qjc(+7L4{Hv8jRD*%qaE@!Hh_Tmii0u;{AwZ0sWtZ zbem4yowJ2;vO9h%Oy;v{%JO^pbaK7ovE+>3DM7o@2*$086+2Xk>lha%A#=Q49;j=c zo|!rAyS?@AY!(se>J1}&TKW4`iyZ(Q&oaTv%9ISST+gm#0K~T=w{hQv+a$^Jzc1k^BcuSam^&sf_#)IPFYG@gkI%`Ojb8 zz{DvrD_Vi+nzLOs($a0_=5a;)!NADibNBFO7N^n!pMYQrW(u%5pnnP5X2&*QLU7?a2N;+|}EWaPn=2N)uEO}z7l zD}p^V!EdX0(juH2o3CKa4ptW03%_2f@={Hka#2{w&_G&zy zq~NDUDcyWqDB|d9L&j&N{c+j9w$U4AZDZ5sb}$OFF#!;Wxd+t&$>)G z7YmDp1Fj=Q(|G}Y;_{ptH3I`&C~rk&<%feSYKo~f-UT42dkQ}H6whfrWPu4KMY5=7 zC32M-m(i@G;DEAZVL_KSj$n=!cyT9RQy5$s6O$#y9@S+SI&3Hz8}+^3hbnMn&E8E@ zL_`<-h*4WoR@UJ@3~;Y&2YVExQz4Hv6|PQp`>LwWsW(Wk{c_^etgK|IsKlcw_!xI0 z{#Lp|lpGu!064B}y9yA?Mb;9pRskzZONQbmlD%d>RI`pT(+)G!QbtQP@h;jt-n%t4uX>zH4LhSm z_HA6;vg^>q%CNI@l0$aEt1jd?|5n6=oBOe=;%eli?UcWIX8>YLUKJ)8U;}D^Ken-n ziAmVgr#Un~ zNDe@1OLeYQm!>g9DEj1`o#7qNi$_dxNojr<`zPzm%4Gmp*mX>XEEO(V%*P7cYh+IT#m*h0EH^6sFaiy?zKLULzJGqM*)h7^}f7+U?2+}=dIUn zOE3mKbGe#^N~aZ3xI}DxE;9Ppp7?mpr~%5CFJ`>|Y@BIbT_KXGuoZ|q;e=0#APcNOlMx=9==AtutW6YTK>!5$EH=7v2A~zdUgF~8x~==(zxEp(q+iqjQ}(E*ci$MaS)G@cFkq6LoQz~U zJu$1I6g38B3&8)EOArS1ta!xCkgCbcxVXISZQywshiz?VXsublNAM}cdhM(sxRM3$ zWKtV!hVwuxO=mGc#Eiavw03;>9hw$1dqgFs1e1IP;JjqHgdd579(->rt+K6H=BrWz z0`58q!ci_ii12{h$f~tU0wXCtGHItoCvRaFpsM9^EyR3M#k)k??CVeoCu)TAt525 zqK1crgt+4JdkKIjL|^fOdIu*(L_v&?AhVNg9x|5Tp)FJr-ucO8IZ+TuRdi*x*Zp^- zrnop&o!I--5e)#ksHnt6MFHT5Dmn;&s+(I|ao9LsE&TJ=&h8R?+Vr340S0(^b*`qV z8XFzW!pi=M!-%#HKOmw`1L&u38*w^QHejM)(+-m=t&&LZuAS|z#JIS-TX&wtB?}9S zqQb(I@<`EZ5A52~a5#F0Z=Ma9Jobaa@(-RB`PIDoK3 zB@W<({Nn7~Oy6_`37uY_-&|dbG7A4ZMmt77lBwy;j#@1yuCHUEpk9LUH~}{`&%kQk z|1BDUH&2s3Mwry~k~>C>G6J7vx?@yBQFCs1+GIECYaVs)2Sw;yEwMNgK(k610cE%% zQ9=~70z_{DRDfd{zLy>V@RLHs_28h4M#4vpgzclY>Wo&`!lEpG$9_^aEMs7tam^*4 zecQx)sE#x=|INL~EsN;4aN<$I<#BLu7zSm4C-4R}Tpsw)()}Z9TzsOYhJ`tzg}Anb zk@Ya3c`7qQT}%ywo!^k~PdX3s0RrZh5Tg#ai-f4C@o5LeiY(rRv;Yqc`v9;v!!;MZG$Kh<5^9W7S(zc5<)#&z zWaQU=x-Q38E_O(#7i6(?pFcA2QZup8;gMkz5lE6^-T@tzmbT+QoUA$rzUM@-1B6yU z-{sUuc>DHlRwIEDGg{riKue7f_ZcIU5nxTp$)Dc6x$Ehnk?8AnQX2(SKS0X?2vcnh zJCi|cModaxNe(w9ZPZUh;4Xm}`S#`(u*T(&DVE;_BNMN$CX*A%q@8kd&~JIu)e5+JfegJrN5e`X&D zmTLWpkmupz*uvNxfk))#_Lgy|uVW2JOTz49vYZ((WQ$sC+9d#{T}*FfVQ&AsUCMXu z9OnI)HbBW5I}jEg8YwGvctzatZ*&EnhONBv__IX|XtLyxipH1fGt=FI<+5S&BmE}! z(sq2Am~?a&qN-C0=0W>XZsJ>2uvx|wKCFW%2u73Ro!1RB4;ACh-{^Brn7$BF$G}K4 zfg+#Jeo}O1TeBi*^VRpZ-@?z~Rz6EDUhpdd!<*ifB`y!Q1|XU$>+14Zbk0M4^iH?I z!+_3)jkDPohHuBQ8Bo82Kwvcl^0;mfavw2t=oDcJfHk%|Z+ztU58mi~s4`g_oH+o9 ziXTP_o5SKEo@%!7MyJin8uDvFePY0?b#|VVzyJ*+r##=|;q*BrCB=5N38bY(Nhj^# z;^1Uw&+U9Z3}C-zO}V7XY>Cg0dy<&JH``!2Pa`1P5?fR>h*1BuZ)qt#Kqs3})=6`* zzq5|r;-U#a1m9nhKy&;8%kuJJj3Xl|lan7m>xU3s?3954^qjpa25Ws*@{>VD`P5%g zcL&SNmQ+mJFQ8<(t_u@=cTEQ21TW#ZUuYo|wY!#655wf%mqok_nf;AmuEBvruY3{Wvq zkxo^k5&>;~Y=~K_+0M$fzRBi&vm*zkAdAI%!$chlfo=eYzX*`Jl95q(gzpYiobq*I zp|yp$R~rsR0C~id#ky#9*eT`u-nqe?o}f#Nh)wb!c%i&qF`3&&>F0BZK>|A$m-*Ia ziFW(#XzROlGYV>^wuT(FulmPNU6SdIHIPd?}($ApCeS#bD zJtNqk1I3N|W^bVKmg_F{RY;^WY||Ld1)hqtm`o~y@&Wo0~$o7`eQ zgwel>|8KtA{f)G$%hnpJ#iqL8c7A7KM#Dk>_9S6-Z{zZi+ngLn78zk7?4#^nKs zp-X3~=D=!x*c*NGzc+O1e=qjS=Ux~r&k=lCn0K;q<|;?6I{X3y^{{O{W^(@KHN~q} zbKawQdA$=Xc5b(CpvR7Nb)4;`dNPTbP(hEi@#qccvDp8%hhQKW^tP^e>O1K$!GEQT z+XTPZerx`=DvY3rB%$>0T7duk)v19fDF!#;_0DKdV$j$|un@xkEC0c3O=r&n~tV;dJ_r1O4bI~NVhyk_Y)U4ki>K9QU^^>3{A30frRx z_J55D0pYat=YQY+|IMfEaU-p)Ek_5K>1mlvtMC^Eelk(ymS*OaXVXc??zSHK+W5^O zJEBh$jyH$wkLOA5>LAgZ*82Pm!Nv#sd&9q`RC%Sc0VDZ0^ z|DO7VpPFJIP6Nn^mR1D=letR*c@f$MN_sjP$}?jf5^_o34j}`8;FhmQh_jlMoV-PH z2|9gh{q^pR_u-qGt-tHM#*5S9$lF)^bcV>@dMcWI*aMA0HJ2`5VW{mtuH&j>jZZQj zvoF^V;?rWzS57C6j*;5kR)(i@Ja`UwIqpP|DhRywo3egaoKD`dfnB_^kZ$QNjYfFf zA2zp3mzHc26B9!t+$UNOgA0jQih1Nd9_&_P8P?n2;^1N-O3A8TG?V?>8A%qWcDXW- z$=EFjsspcbdoO=#S-gCZKf{A*h&%P)F{`c2-$v7`&^kvq@ZAMBvn-8?*Q_ux%X@s_ zulHE+&{X0%giq!B5FLCkqN_R>erzZ;hf)%OmRsYV3A*C|q4wwV&($V*2RF}DZ68MB zJzk%r(9`RSNKDQ&&l}HY!Z%GOwwrLan@Jo0));7Jv0`JA)$>#9*beyU(uiTgt>alM z{IG6mPVPG6(0r-&knufQvDJ6MI-_aHqy3<{u|P?*iU*4t-6c?2DB2UoH|F!z4|aRf z>x&!cm}t*Z)WH#l*rRfqF*@F-&W7SE3o{$t<~MA!5Bepakl`@bPq8!39zV0s+Qdbh z5(QXJQfyi>PZLiZa9k7HF1I&v3+WjEFdxDrk-!9&=Ay(vTyXPWk9>%f_DN)MxNhn1 zgMSd&w=7EKESZ^`x^L0mznVM9?+GP5JQC;J|88}~o(&6_Db`3yP7V<=TZSi4 zsmeaE^@RePmp8mc9V(U`9 zjYuhM5vs66&dS0mLZp^@Y`Vwh%>;Iz&h_9CDQI~Cc7>p!oorV8?GdFaEVa?aW-V-P zyeDsAC`qe_-~C!)6LgViIuZH-1gBFlkm+#G!Zvb(_^q5pfg84cBVYL4eU0qIAHVfU?`uvFkBThlN?op#3kOwBPOg(=Xkb7- zgL{q5?CsP+d17Po9)iozA4D zZY?Ft=hD2HMysj}zP~#L^uGy~N}uN|bER(xbv*+Uz7p9hZ64*7m4Kk3a#Ok@zEbdo z2uHbjCeK6rE(|K0C`8>pr^@@BvSyt}#c&11&&r5Xy>6@?SAF)C1x(dewH%iBY|PEy zmR8gK8p>1~?om(>qdjt{gO~$P`c9Ypy%n99d{Z~ zP}Jmcm!iASj|)!shny2e>%&rO zA{s9tMkc`*FsHr28Q&LQw>9csy?STRWRJ7dzj1c`&*-R7<^%3;C)_Z=T|B>^$dWWf?xOl1U z0{tDXric05RchVeV8@N7?t`H@FAk>S^MJB5ecZpV5}3PffhFc0oQpcw*UF&DW6N9Lej(1 z2_UDQy$=q^1F{XlH_@xFUIBT0I>9rbrN#z#e%H(S#^;}?srA|myibqqzg&^{iN^|| z_oFKwi)O#X$X8lje7*@s`G>du;Nfm)cuR8g&ckzUed|w0*JtZPB0aqwW*t2}6+aAC z_S(<1w0f16wWYt1MS@1mY?msBM!Nc@V_5!J{XG`&u?K1~_M8H!Uzt$aJ$gl@OA3#GSjI06@Y^LzSUQNii2YWn7*^vpr5}pDf;Au|EVAm z@Hr;=%P~GYINN7CKA?IOMsgDOqqd`FL`B?mi+MV%r>1`zUeYxhqJDyRYFSaLFAx-dn#eSyr$^*-G|7Y&uM~}na zi?P^q2vlppI_cTG;BmPfgiEySbVk?Sy1>?{pND$?$ZkAq05ky>d~66F0dt{q>E}e~ zxy%|K!vJ?a3d2p&)CdJb0T0&FI(OD30?pTvgUyY1zejVsJy>fNkCzMGyH{8a|B4u| zR_QJHqZrod^Qrm?zi#_79JlbM+K4TL#-{N*AI<#5P8T1un0*7kwZ~<17Tprl!pM8) zqTS8QWWyz($|31uQ?W1F1pA z>ZG<4L%G?@bj_pf*Ue8icK+knnDhtu8iY+7O}nJV&ZqO?I|g~1E^9MDhUpaVatoZ& zwQ<5vvR8eHXzW}8XO^skhW@cNk>)X-a@Mbe-q&wDyh6TSp{2ELr(2qMG+jA+*Crdu z>D|CV(sa9Mx9XcElXpX)CrKmV#O(Yh#)qWOteIJ`=0Ie#*-r+z|J6KPG6-<<2l=n+ zM+L&*54RO7X@76;MGo*&Tns$-n|8lFi$7ZnUNlUV7}am*ELYhPj4h44zt;6Wv@~HA zp{1|=_O~h)x&2pHr?h=Cy1gg9M3n#`jYKEq|*1 z)o0C}7`LQAns+clj2Z1pdO7ox>N$j66|jm2gYVeaH=P@=VY!mvo!5#hc2va;i$-^C z6^RzENIbb5v2}Vi=~##L5A(J817O98o}7Nl^~c@e-|94n+pi<_eK-Y+U)L7C0$V)+ zGw;g~xr8L}hOB$-j0@_$>@y)0ae@Beyt(=-=`%25gI4=|Udli}L!!0SOj*2O2Q{5k z9flDXXbr%?-VPf-P>6W;1dV*gYkm3*%o*(5ICD&OiF$PF3~u1D)_h3|m@RM(Xd?-Y zAY12~Rpsy__hLTA_D-P3K{sh98c_W9vzDX_Z#yd_k_UKyZPfUYF4sz{m%~sVs^MBa z{0LnF5$EGa`8#iVf00Jdwc+I0zGS)WI19Fv)YKlz`1Eu((|r^i(=7(vF@0_i866$> z!RbA!++4)W3f;B#GJQVh;ayqWQH7K*-dp8XohQrUh(vj;W4ATgILAzmgN>a~t`mNwQ@1|X z0D=7V^60eHH{kX;P5|?rtXko%xt>kpFeN%X^tbcXgWYb=XHE_{gVJh3sk%&9&Bt_s z>No=X+s@S$K819_)cADyJ?m92mS9!dxPac?*!4T#E zedoZ-kBM<gH^px}NBIn;_kuPHX^T&WFfje}8>hIhj?G2O;ak zo0Mt?I5D~lTy|${I8E>f)+ITX)=X+Y34}VIJJZJcMDv^QC=g%WYAgKPjBR`UNNO~o z(gRX4Y&MP0r!uQb#iYDnH+5vqQwVG(A<^6M%Eupu`2G}rZ@Mt}4xNMyQZf4T-Vc2^ zmCXtsQHq#3vgAw%OnW|6s7;{%XbKN_=sJCeS#RIXFvKLdZ$mzng@%{!(!$< zmrJBg3gg~9qWseh9x*P}YQMk-hn$~-2jJAWKs& zC!y=zkO{c6Lb0t0GY`hc=qLx%$DCpUYATa>;&!ZXj81RHWj8YWiJ&LtciZKUt2;MG zyAJ5<&02`$iGMbb&7MDCrYg6Xcl@;?pkBZ)8oQ;~1o`gX0~P&$aLYXEEm+V3TN|JF zO)nhVD@tLuNt|E!=>@nqsYC$ydD|5+gw48lxNk?J5oX58t_X9=P42>SYf8EwIzJ=! z^!@9TS&kvnqdx3oBgRO?C9E3EwEdQ5I|rZumB|iwUzbODd|~%X?{|FV$a~GOcM@k- zS2?fdLnc1h@x<2asU^gEH<)kd?LCQIK<5WCKY$U7l-CTHHdveg(6d zLW;B9N;lBZm_V20zRr3K^S2 zTGxu)32xTR!BX>%`xC<*3W>7{6)Z}+9uK}htgf?T=*x^Ud_J|C<~^Uq8>jHJz#^7K z!TUddSejt6Fje1(+dtiM02)_nHYr6g5H}omw+})iu@WMPemFf+f^inocPJo=(+5q; zEU#Zus<5Q+@PA$p+;Ui2pxN-U)_)SPy+8cJ2H!Yt8xT%cM|mldswk8qR03Oo^|GSO zXcDzeU5mrK1=r_~c1a|!(O1qNFTY0cjY{fy#soFxW#cbhX>f7IPQvC4M(_`7z#2c3 z9K7r%{&eS!FPDJjMJ%4fLPKi_ZB05t)U z?>vBBwfz)wxKops9{7VGjONmPV8yN!l4p4u%v^qa}1!kY0hj7_u_eDGf?OEUd3{B0K0>qfZ*KL}bn&v?C1qyzhoE$w{ zTGp{vB@Mgh2o=%cg+g+bRW(}NJ~l$QI|n3pyK88V9^C^IhFj;k0ReAU^)na}o-y6o zP>@~UXRFXYKRE#6ukF?16;m1Ui?5A{G#|9J7j!wnyF2UF-@l&@ zDTbDoepXE54aXplmPRDQHP2V32m}&8EXl(TJItdgEa2gS=(l(7u`~)mK6bucl2^~G zAhWWvt?lbg`O0bpxElNRQrli;aCU@Xc||WgJZ!e?R$f;Zc_>DT=%X}H`Y{aUTN)q# zDUvCd_9bFyD=#O93{vI~dHePzoPy1ILGOZLxn_ zqMe}=%JE0XHUyfUn=!b2k_H;C^>5xVM1#3+e9LNdENS*_@}m*;+0%jps1dCDZJU?g z#YG`iXt+m7v|~~D=$+4f%|pl_uU)&XjLHBzeX%iMhTJ8wdf-G^*fJn8*}pfTGi zBg&nG>mE&hK!S3_K!`1tVcDhzF?NQx6bg-0mdE;dW~ zFq}iKCjRDSM~$$DH2nf>LP|d+U`4A3hQy<{ns$8K7sHa@*^$e4KOyVBU8vDLEU50)6$d|(T>MHKsR5qe&~;Uv zkq{XMY{5NA4iA&>(;TWTrI%`6N2u=_lc>!?y}90dWdOy`t@eI_zD**(tEH9NHL!v% zZv2wJM!Y&gm9LFYjD-I^zp=Q*A&L*U$pHv~%NVl#mx&rS6)49%U3EcG^axJjEAscV z9PH)E>!repIkGB&joRN7zaoNs64p;l_-BW76y?1;D!ida86CtLVV8bL(IJLhG~9Ig zxu=hW;makCbd*_v;TaJjgx6PJJ$wG1-Z%ts-}8LZCMW=>?=gQRgL%eNd#adG+^=Ut z_I?pcpjAw3#zOxZvn{WzYuzlBnK!TePiP315=P`nwg3dCFH_1N9kSZAcrUVV&@Vx4 z`}N|o-gt!AyT^;L{@ur7B52e%Q;T4@$K>?*_{>CbL@?1cC~&BQlA20eTYK{RiB(if zOIlf(f{YA3bPT9+MZ=%Qqyp6%(OnCZVm#nHvQK8D!48)^r{K$NXGebKUcw$hs>ml9j$a%(DnFf|QlD z3rlhwcUA>B)YV<;nXTOWV*4VbWb0FM)n%(qlPP799Udx6KDX9gKYl_z-2qYz_+pHZL*jxAD8It)Io_ zn*p1hMr@14BIKmx{->aku{dUd^%D@HY96dE+B$P`^6aIA15Gv?< zxBYl$PQpAE)SsVjmVMBII$k@_zwRYXg&~$~p%-oW4a|HaJ44Zd|>C zWJpGOdIs3ADJ3SNqOc&umBot0aMt#=_KLAJEPbQ~qKfD?Yq|L*l38k$5eT}bPMo+7 zV2F~QhV;+u%F}2y*1g%{%i?HhK#F0CjD$)_*A-*o&}_wFzJIMt;p7<_p1GLLg@>5g zou+~;007Gf4E$p=mgSL`9wE6I^haHT^yic8MCy%kEeU5Uy(u!TzWuUOaY7~mOjOD` zQ<&o>pNiHZ<=NxQ#OhM2au58YqChg_m}zn_T)JrCAFMNB1D}tL{>ixB=(%rkGWH6; z%QirVJ>LE){W?nh$moR1vC1`vRV53!hcjtk4(vT3$gm{$h~A~X7Xm#z_Jn2%_4hb- zKr^XkN)A%<5EV;Sj#0~|Vi!Nv@XIEZg%DnKotsvvU?QX3i8|-5eB`mA*=(ZFvrhstuP3KHiO66caz+31`Ou&b%tL z7&4_e!mx9C^T?=kXVQ>lWe_1%WXQ2b1uIk#qUA012Dw46o!Fzq$k$?juca)EAd=Dh z`(fYmW+L$cz&>kRL&r)xB%L(i**gDWYsR|?WHD;l#Knp6R*|mJvCHN@aW;fH@~D@I4yL2-2CIrzMfelr~dcr+L?B( zno5GX892)26=Z{y{M3~}ffNHs=#OR83yXpt_j51Y-J48U-GH21XJ7wN{qkf*l(w-k z1+lsqhzU=_t2IonxbV1%RjqES+rKM)qc`Gd=WlzlW@%7FuqkUY4E4Pwm%OxeradXf zcwpiub4w%7t@T@%9>+|A+!gx@ih+*53m75{do)f|BB3;4QYhd}w&@W$EG z6Rg7r?TMkKHLI%2U`#G7Ts|z^Tmd>*1nf{WoSN962}HxQwpuC*%%AcP)l^VO z=&^jC*FV_y?1UZqO(C6y!1m|2DMd96^*RDne&?ItKWZfr@$j7Y-Z6g+?b$dh0qef( z(<4@F__5g?*8X0C@1G|y=`xB7i z*4R6naCqe{EXHuqev)4hW;Sck890E}Ao)REF-r4ehUNamXziRsJ=uFfR}D{;O@ zP>9sB&s9(F-m6#Xawe38fck5uRKot=o}xL`UkTQ~ef9?J0`0G^E5G;L z(m&PQf{7W+dBI{YMG&7y!>qP{Oa!u6Q7kiJ@5by9cbDG4(IWfMf3Rw^_2@=3X~X&z zMj4EU(R!ghYv)aNK6oc!hYj%}8c~DIy7~WE_0H4t7>%)Y9>z!P#Ydc)5Do`dTx!LOR?5pv`Ti}sZ(4}ZJUYTAM+rtT8e+|7}zoEDpQuc%hsS7iV)U4?ZgP+R&x z%UeDt7}$boLFKJh{VuYM9D*1$e(hxYef>LfDQ&4R?jsML;)?_L;wt4BNJfT|W<9o3 zswSCFiqzErzjLM#oZ(ThgY!#*3hv$`j5zSVbr9SxIL%e{L8RK*K$Jx1Y978k*c4D! zAHw(ed$;D!Y0GPIZbI19bZcH~f(P5d9!M_i@1GdZkk~4c*pB7p8-i`hY7{*I-n$2$>@= zSO_T7kF{KZE2+dtP{#sFp!agpMCVd`yg1)2P@+E>qe4Uk_6!ZHxvVnqZu*Fsk`_ac ziJCKInk1JeO!|jGU0xpC%;C#K@e5=2Kd#k%r zL{lzSwue^qe=cs@DxJQ@stS}y`xT3sVnte$CsX~G(O)7rlBX-vb5aq0R7faqN_GA=cNIM?N;!HBQ@PHkVwr(NTc zWy;EYA((&pV%1)__DbGSnqEXoCuY%E5B(Z@%{yXVbsDGpv1y5EO>94vdxhyW9vywW zNK;*=`fI4v;nvI;P!e+4^v~*e?MDu(st|F!id>$=r^6SQIQOC*49z_08MifZpjda{ zgu1mH-~4L#eo&AI+5etZYq%)9Mk6ytOD-MU-hTSV4}?pxQsM}u*%FW+Ci=F*nwPUe zpogotC?L>|led+K8#i~9LI8pPE-3&jX=20Qhz(2UQudcn*PUMDYtV$^!Zi-E4g@tB zl;t*1Yc0shA!7JatxJcQ$^%#Ogby$UgS<9rnFnnQ5$L6uff-=ymG}#;CE*L>CCg3H zpDBRoL_A7E0^fc}WEgm;ieUgvTukTI6vnA}7NS z?&!Z6zG?XaYY8768pCBO0E%LN{{WzMyvT>W{)L_x7WOZH?HlLU-y>#DPuDCi!Wo|W z2PY>2SDpV^Nl2c)(~g!xi6C-a8kLZA2aZ(2`QDif-t7*(b&Wy8-jUu7krshLm#%-UI%4K&rBzJcp zn{jIY4|i`F6zAG?4dx_)2myiw5;TF}7Th7yxVuAeY22L%7m&dEP%$H8oZ9W9BX@MU%U4xpeQf*IwK70c(ixdsQ_R5Nud1DGVt_^A>HcQ+_^O zXV&>sn^a&79ns(a>1keW{ry76KwvOdXfRYo^&J;^_H0@Wz*^*=XO-vU4ScKrUZ0*$ z!e{&ueNm-cf1-5KwDDVLil1PHajt{Sg3pg1KkDLDO;mdlaivH|oZrDeo5cS-*Tz;F z$~m|GA?=3cEBbEn_>Jx(Pj9Hay1}zM4ziLN;R1ymVG_@;StY9S2$m7)Uw5|hdQ^HO zY^9%9AT3(&i}|IRr64ikFU|dODl{X|1_CQRskPqv^_U=}df_^S5lvBzCOVQ-bNc&N z$C3Nh8fz$z$B^?8wfYxNH^9PJKNN2sH1GckPx0r~q4zhfhpo~e!hVSK@J1Lf>PDoA zAM76+uXyVvTqZW=L;JCl>8k6i7CQpvJ$%o1E1oc_DA)WHBzwZ~M(UufSuhy@dB@!* zw(_e7_)o&V$*%}_q~Usaa5}NGRcEe+I(-^`NH|91BF$hsV0Ml?-X38uC1vit?}E!_ z^;6oG=}JS!-KpqeKS4**BsHyT_3%&uZSIwP0OShNAM$dmXiQ+-twT{qD46|+w7rO( zM(cHXOMZdyqdbQMUT2e|O(Z&vFp_1Px)@2R@T=ThpU2*r*>8u{oXp2#R2YB$9{2Sj zm()}V7HEGD(56*bV}V_3^Ra~|CM#z`T%D)X4;u{#ItuSPD_t*0xMltE%Ne= zCpl}IpWGdyU!kQOHEGC^OX=Bg6u4jWk}@-MlIc$dXn{=p48h=!PbE^$S_5NB040I{ z9ph#jVwgfI#j3PALz)tRkV?gxJ$*f5!s7Aph0X^aP4QDxy}gB183|U_*4C@9UMc&) zW!}!#6gPrk&(V7l*%bzcrdFg8jL%?Hvf%Ab_(x=A>4y>tnSvmG=QJ}7H#|N4;k)-Q zQ`6JaZ=0Whtkq-)B$>~J-bgyNt7ecsI;bSHx}svF4mDwEX$fpUSG(t@qQrt6CMHId zRMeWNwR1Bw>M|;|+QT@mtw#gQea4}_o}^iUpLoucL%T- z@a-yCSi$lBe-2H721#+z=;&xXZiA6#kIh{we9?LM)7Qt%!h{|)EF z^sUW?CA^2g!+t=s-c-%zhYMd7S@zmj;%0~a*(R%FMR)gRgq-1AJ)ptp)CfPfG3a~R zWOJVK#TRB{4f3JfRjRCK+Ne%X)A=`hWBH=UsW=U0GUW{W8v>kfZ`yml_=eKn8Rr3o zh@6}!Cbwf}C$GQinARK2`ovDufLvNa_?@tXSPG|`>h#U9z8<;w>+|)yrWSK=Tx{${ z*H@>v6>&7~uQa~ax%_~w?5&v?YabpDMS(Gajg9Ry_X3~ERet(aG~C=0C|;Bv;ImtR zwdEENGmwx3lK9t2wH;29XL_{A*M-Pe0&W&jEA1!WKu1dB>4n}$jgF)^y^PV6&ZDJ> ziq~p3)w@q=fQJM!sVzUa6GvyXt!DB2>wB*9>xtRf*@oi1I(vt}xAwRN6SMvT1uUW> zogeJ(Upwgig@K`6a??o6cYfUOG~hC~-dlg(KhufD6pk@CYG^UQ|2$NzpU3fZ_1N$6 zrL(Iys)f@2(eTs#Z#gplo9`GAFb561(j7@kWGaK&Gy@A!lIuXowQw|z@?SjcI zHu-7y31+FdaWD6FqEMFsmKN-t_wdOIp<3xg|g_TYC*vz@tZCzYN1 z-kn)5%(g#6j!wM{ck3^fc736q`{M*~s99mV-iNEoTvAN2wQEhMm;ymm$0=#n#i_eSnEVe8*ABK|}j+ekKFCu%7(Oc_ook}m* z`T(hb_=HqzI0DYTQX1EQOUP+?+J5@$+=ZTRzii=cN>B0_EUdnzvBz_`3aP7!Hu*=p zmLs<2z?h%kmGfACKSM11+FIFER9@%G{=SpYeV&*gNdnBi-t@T11rf@S2?or7RC(2wTVj-U29m4H*$%1V5+wQk#QN)x zc4k*~TsCiZvY+!m(r=Ral~H;e+JYquvrl%Bb^Ue_3ixZJ6iulYUNTq7JSRm@yxR44 zc+M}39bIj8u7jzH4va!O-$_CSJUBI$8-Qd8F?4@mCxDA84Y(jTIE-c~1 zHr%AIE=0o_?5yKJW&wRCV%@9GelId6VSN{7m{T3STq43xDghY zx49EHoS10B=Xj9oaPJ9X_xDp8Ty~}&OCy_$866=+ob|ygX5t+nSG8!rUE3|WWuwgrtwwK-NM%f=yt}`0n7U~Z&$m!|( z-TB}vA_rEwg1aYYwGQ{qS;u!Cx13sUU(za9aIl_6q@^`yK3fKWpMoe1=r28gh63imwP~A*pivojuJ{VrRA6qNh0cG9ZjbKfuP*QRvYf$P1>vjb(~;g?mCAOA^}yS z>Fm?1$^!eH6U`~W7$v52VT*x1;S z$*A>N@0)qolJ0b2VfRLObcr&reM{y{qB@pb1n35IVy>E*V5t-?PS(?5i{m?BFwWN5 zf_#aUpvk7&g`a|i`l6TT=;J3P#SY?E`WHEcRB8jb3_KsIV{YzcB6C&D0%Zu*$CGNR zkGgho`lADVD^K9q8(0UCo!WMXmT%LY9wqF<2{;DU%P~Wl>oU~B5T%e6g#qW&jVgFQ z|E%klCsT^tz?kE_1#eVf9|hj(sg0 zfJHHyW()pw#$X)0`S@IY)n;=3njCxc`*~1tLC9QO{iS+{v|f4vTVvq$Pmhu85PmL;{8P60KcS{p`lGuhZn|o{jbpr8tP4E=Be;op*${dxYv*LFlX%jQucq&hApUgtc?;Y92k$%(&F{htg-0 zwUb@kj$&@OYo?NaOpLW0SZAX}lA;OgIloR?=@M3M^75W(qR}>X>4sSxKfkn-sSCJ` za@@UyLkH$xQJF4$tuwSYKCTnJJR}bnPAWp>P3-L~TmD*HZD&n^wykw9RqC2@ zI$mK}l{l3#2zCLmFIa#tezgqTLqU6`Rl2{d$RuI7Bd8S3DLiQZF<(F}Vp=?n!O&uw(9K>R|;o9C-xil)H=B zb@}*@l$>}EO|vNn^M$=C%Vy$N6M(bsAQ<^h@h=)3Z*5UO7?2_4M>Ky;}W2 zr&__9lq4%q+hBr~V=o(41G~>~ztJ#s?_M}zxqm2xLcfS-D%c)}a039l5OtGvezeGB z8Kei_w1!GatgV=jL*sBkOs2d6}lYc#KQ?0tG$g!5Q_dg2@#8G%W4ghfW;DGRe6;vDqR>D<~qB{k!%6Qt#+wc11tPZ>Xo!b8bZBC7xTCSnYBrtXS~5fN#%Ith1EdI-OV z9ShbjHs^}#<2mQIt=Gaw0)qTKurIi1;44TdkMp}bke&DFD8D6Pfj(yGuBDPCVV4eZ%xAnL&)YkWgIRcqUS^o_rYG6krm+*cYI9`7eo@NM?3| zl!A_qo;g+>&tTcTa(8oym~@N(&|Ue-3W-gjZjf;12hx&)&|aqA8lF-9nXx8Ref@}` zoWb{h`Xl=TXq^8XHxH>@q_qEhdXP)q_1}CKdEEcceAvlH`}ZAEb+CmgsdDnYa!Eu@ zhZOJZS@jTPC11-dxf*>QOZ9I8+d<&PPXUVW8>_x0iXYit z{<-GD_`9gVT_fit<)g{+erz27Hj$K}VdnDZkfrA+|4N6ZE@eJbAr2o|?QE>(BhOw} zGUJI7N$t(kFCOfl{HWnA202eh$S1K}2oyw7;ZtJzlcq1#5QO;DeQPZq$wFS{C+8lo z$m`|)lW_FwK5vEKIrW8WVl0sW&!;FKxx8{n`1RtOPmFJv;S+fUmIAWQr(yA`*hPxj zaV_AHY6(K(KW2r?dH#9u2h!x?IAu<6E^YTV*A*TuGmGUbL}w2%mq$iAzIu)S?`iTp zLY)#o9_>0H_y(>I^CHoYJ)Xgp;_9NYSk=+iiZ3x z$ou!PfNNP?=_r4BSR2kL6AUxe% zpQ|8&dA`$LJd#h%%R{U@TLxNttE&jAyo4(A(BNRW%l=>4FYaGJl}d8A{vB+0q53FU zN?&XWK0IKSs4Au|z%&Q*-*2YDA;m8;^1@rr6Ovhw!Ryq*K}Ob?-Y-?|w0-8h7ra$7 zq6IT={kfQ7&>vU8VRtkV7p=LwV={JVI(i1um-s82S5~ma)H;E3VqYA0Qx#0j%&_`Z z!C1FcgX3kn(7yW_>vj#RQN7;ebD$*1fL`N>7#fqI#O~H2;&IJ1NOC?}?w@s5o#GYaW&STOtp<0wj`M$eDW(F}KWif^8iHNhcGUZtlthQwSVm}fgDkp5f(-)&DsGxB zBQu-VWx8wGLHfb<*IB-P_ajxQ>>Pz;o$Mx?lGei}A4c>QOAld@2vb3bz|<5!D{(pONaslIPLG$&G`j1Do=dh*>I$KO-?O6S z`Y=moS9f7{$5(QlXiXl(wN}H5PTGLpynpv7BO^nJUaj15@cT775xw#WX9Q)Gs8A3Q zMX2R%yn>y{_|?VXGCS!XUFQpr&aW?1`Y4Ym2JZW~qI&gy6Yo~~cgaWamK2>O4kHFr z+GvqA67_~kePmN+i4$W4_yc;IJ`7GEeu_a%$u(k)bn;qvt4Py&&Kyz9?0-RYJI43j z_cb)Z$$nk>DkpE7&>3GU~oTZCK zmQ19(a{fVAgkm;_@p9TC2P-TlBLGHKvg%W_y;uujS#^|!K3Nq>jtA#f*-Ph{^%m4p zQeWu)g%QjZ%TZEP6?UbBWko`zzb58KNv9M}7MXV(r;ArmQh$Tk*CxjhcyBnuygXo< zwd%&O-07kkru%5s##2{kNt6d42d6k!Zc&d(Mc61-D8uI{1_&-!RcY}xjaz)jW3yDM zKQS6PI88`Rnf;nDRum9f|LnQFt>w?0hpS3}mkz0SQ;J554sA$Ey7{Q2#7;)0;C^#3 zsLMX?d?f!CW7MI5B22i2l*CV14Uk6UZ2Ia@W9YT$cwm1re;3Aa!rq(IaAkLCb#*?x zocxxWs5=0=>5Q*%kbP5jpAqEeH`9BmLpAGu?S#aZ7qnO32UYfxf)pFv%sf;%;E!qY z!#bNvdYK|Kw)<%-_MpbJ+v8$Sjvkml{v?P6Dg+ zbXI-5M1zdj{Z9h-0ZI?uPrjgDhOCx;?l+IN3y|s&PBBML#7|lIBKk6SP_>YMmc<2) z5In=kqhUOT3|T+P=rF__%n~6l_YjSJfsC>FY$A^nY1RD9<|n_Sn|3fS-Yoq713SCL zan)`_$30YPv2VJnXZ@*5rMZfygS@ny+_ELd=BAdQ7!bq2d-J9{6zSooMY+w*Hy~ds zQvRzqOP9{8StP-?F9CJZqn4V~%kS|+1ri;YGUR=P+nwL4O|b{21W?DJQ|pcAtF%lb zaoCg}9vpY^6@Fi5bAFdtdpuS+`wcblpFJ)$UYE(p&S943U2PGe{1gYJ)^h||dJvCs zqwrciZJnirzq}ws}1o_1#;_L|Jh=O z&{2%B@g@d_#VbQ7=cwz!LD$i)o#ZC^rv5<2^aE{Cx&`@l*M3P1Be`wSyUte zK_IA(hoNC-~KbH zKiaXi%MA;L4iB(v&sIvokzYS`d_m$&5Y@T{3EH3ctNxi*n>r-Uco73S;l5en zH`YRr_J-$s2~le{Yh_7fmpzES7^HSE$zP8jFd=(=f-o$5e=ZYOiYhYVWEBceq{9ga z%)x3>6EJw>52j<<(T}fy+-0PE@#fwJxIITQoTgS7uf}HIy?rpo9OUc&r$)e> zy!pn$CtL=N$r`8aS(o!1@szx_`|^*Azu$Rj0wv6AVifb4`rCD_z!Y9|0xmu2RrZMj zA)x8PZE%xWFkXDUGr8R`U2Uzi?9|j;fS>Q*zwaaxT$V{w-Uv4Nyy)&3z-O^-t3AdwpRe7nw(tm@ zy9E=-pOS^e^q@41LNdwyV&ky6RR}n2vW1ENoibPlab|>3fj3T^lvpyTX8qy)Trf$p zoHb$GB&n!wy@I-JfJpzI`K7$*sqG_C6h&JxajTBx*`yX^mi`G6<7M-i4`&B2b$>N= zW{DB)$0!Fm*%VUwqNU}FGAA<)BHuB2ZPRGRhqq`mn_xugBP`sk}Vs6lAJ3bra zO<3sye+sVIXBJs3&UQ#B&lp&%up+KqE7R)Bc4lM?l;GAq8IF#Qq9QNO?Cmv+)Yewl z%%|$S{9Mm=NYlxQf~n6MXY1@k{DZ+%{kEUn@C6w?QZ&ot`vA>t<%wydN&Ar5v_ley z(^S`Q%gH70`5Ea8Lzdi?ZE{Cuudk0wr-VV4vY6;+W+ttsLt3Xs&z z<_Zx&(YShdLg8XcGKq@^B&L_Ni-C6C-Q9h7BZV~>M%oDyh)7Egt|WeMGT%XLjheI` zonK}BNXyD|TIx!RDj4tADwU?hR*g-lG#`}}Q1JG%wFQ#%tYa1viShCI1v%V06F(U< z1YKcT|BU(v_xrSV9Ju81*i@0i{=AGcF5m88v93)|;vkVU;SxOYC+8f?x&urWKh`T} z397Sw_wpD8^LY&P0*qunZux8*gSrT^34K=h&YMZE_1}jLogU1%Hxj>R3hy%NnnT}q z-f~lg5++f{+fh#{d$k&1V(> z({U?0GBHoSlqqUZJ@g_8LJipSmqBybn~lkN=x@|k+N>|~w8KN(zF5W9VcjAep(mkM zLB#4hvGD0pBX_r`@xNv@wYm-)q08~5WBEDr(lgPbyFg3>Gdu+;_lar$6NP)b@}*AX z=+DV_5fqQn2{{$ZS|91^E=wl!4VQYt!^4LF#%pMxXTLXc$UpjLnRxJVG=IeO?QO(M z9@~`(3z&htX^$z|HDDjPobAPklCcsJqVJs#|CYX&V*NAlA4peHbK?s`BzW)?F48?A zdPZL@FMiGK*XgY#)@pHAx+2o8S^howKuZy6^4EO`D@}}&-M@c*5ap{f`p5ft@Zcla z{}caNlr77MtGkho`$C=gpL2$XC|?46$>zi7e_MQ^NtpUwnY2IYw(@|qW@-k&`RrBV zmno_ZpcF4s&?j{hD zI}JH~F{)5=gsGH)na>E!o2-t1by^N=-mm`-8&@D~^Z4=w77p{&$NOLMD)+cGv_~IE zDQ?3DNdEih1Df9p5#Gq0_+ixN1$H0g{@5=M+%b?aMZ5F1-sbypg+8vgQ2O$}-P^B< zcK^1+18I?;|E-mhOaK4khlwc5&>!Neu3nP9(mM8tSGG}kLK0W45kVu=?+9|4oGx2( zCw|nR`>RaWk}1B-rA~Ogr51}vb?6jD@W;*nX!q+ULXZCx`B~gbMcmL)qlTPPoTfM} z-Ma~oO-3T$21EPv7VmxjOuGxWd7s1G>6*zK%TgBY;ra1L^F5)L>Q!M?saAA>+Ggr6 zD&(80^Teb`vdvLynv5&5KjyhMvn1Bol*Sy_^q-<@y4CLdE_yqUScT@4J~!QRSzSdT z=JhDb$T_v7JbS z9WDI)3F1N6^fF3H)v(Gq4tI6kP#=EGSO0XJJTbqU>B17ez9ht&C0jN zc6lW?#DOAM?XbPuvkBmrS0}RzW^!D$Q+LvM8$u%vA5=a}z-D5I>(7oP^p=joH2LR7 zLj3|Heh&{?S5(qw0raI^<}2ds2NK;Su@aSMQ&q;ijtdV+!iC=tGBR>ExYeER*f9Rm zQWM*TPsM#O&d)J~CC|b!2J7e7CMGBEgyn~GB<+jVN%$p2M0l-tE*7*&>mAIYo0B&} z@&63=ZzfAQhL5Bky9uqr-YKM@%CFgMO(%4PCXDAXmMSELK_#W;tnZGx)AB`UsGlJ^ zl&3qC;WIH$1jrQR<@ibVzNEu#ipob=*nYcUU(|KOJdv-EQD?S$LV596ZEcFiv)$HV zck4drgzC{ffZhoq(S}Wyczx&LO+cWy*zR9>$pB3=nskzMHqD~?DZ8oVYV^sE|1>OR zU`jHoIF*xU%>c_qWb*y$>NpM#Eom5}?(U)iMXE)P`4|A)X0xUSCr1mVDiCb!sEVtJ zq?mm^rnnalF2nQJ?9797!zA9+u6yB&Mcn<<9&4HhzZC7nj74d~==p88_kFc7^G0Bj z!N?&70fHUH{9+L9Y`1<}5GhDncH5jhJM4DtuL-_0C5I&!mCa|Zr!d*<_S)X#4W(z- zYA(JG5Z~vuqnH4A@5Kl$h#JW3YQWj8-jn#tSFQH8+Ms{I8n$LpxTMo4G&nOa>|K7L zX|*Jx%!83si)(G7eZRi=EFk-NTR1Ak{u7?(QhmLn3QC(JUGB2u$fh_Eemvy+c;mJ1 zI;#D7+@CH<$`XnW!!e5NMj|~{h7sNUw^NT7Nk$%1YpE%h20=&$0XcTyiMqIi#OTnF z$$W9&jtX-P0UAbwJ5~jV>;1xIP@y$=2LY6(Cuxokf2;>a}K-7#DdG;si6OJ z@aIyWV;4g|hA|uG+IX|pT;B}C&c8&zfZDlFrh0!-({vb+F%>y z-W=^ii)Fdnm>2a`_CJ_HncclSJTD5$G#m-;I+F`#6UKOWN*q$wD%UPGYi~~IFm`J% zde4_&aSeFa3`C`_nd5!9Vfd1B6zN5BT;nX`(0y|kk6|Ml-t3atcslZ*6X34hF_B zer3b=ba&YAJf= z-I7KsSdg1bFjKwWi^wo9KJ5rfxnN{0BS>;1ex+}!N6D{Q?z(EO)s!bkuF12{Z{7Ag zi$;-<(>c-4+QvpGgvij$%MlMp|qfVIi7tiulLPwpC7WxlKpJ+8Y zv+fTd9gW>7mu_?oF59g4*10b3zZuTC*yS#@K2-%C?Ifha2yt}hc8$#ERBAAK0+e1MhCz3!23o;1}e81f7y zlv2p!A1h=*NWLSv#hVKG(HLtgKBE80>^}Bh~xKBYd4+r;e6R3_kAuJ6sLi6oHDL*<8E;2L8fdguA)lidtQ3xyDi7b;f zU$#D$4DrC!?(A+*1rkJ0J9TobZ*8nVm;{s3N`;m@rjNQjPQ=;%ZqnslL>=qSg1H!E z?FuiA5g}w=A3t||Y$PhjYj>$E3?4nZ5?UWZE0vy~573{g%1Yy*39r9{_vjaw-M&S; z{Eo4HY(-ib+1Y}S?Xg1Bq59D*8YON3PS#_*LA2>GVuw?Xe9QKDld;~YRVLchMMbYV)1rsYYXyTij}&65^9u-Yo6F=kaEtS zRh(U%o-PiNqmVk9gq=^q)(NMoX&Ruio9nrLlz_BQGC%kGcPU6(eJP`;IJQXI*%5^I zPAj9-$NMsY{nH#@quccf01^875t~DK8I@75Fm5?L%ze+yYSrm67+>q@8&8&4Sdipz zZhWvkNUhvvUt3#y?u`VTtRyZcot%(e|E`u9p7-xh78WyL29h!J4Z%t@mtQ*!Bobod z;u~FWv)$lT0ICL5R+sZ)b+pczUelfqyTik05Zm>=24HDCa&cQ-{_8&R{yNF!9O%B3 znjW_7-`V~dN>AiX*h-yHxp=?vIA9H~%P-7*#B(lhnX=f_VRblPHJ*MrRX53E$pT}! zsjuGI?rMu)b3VEu#CT)!Ox$kt(Yza_3!5}0<}t^PZ2XaRWr(Es{?=k@O=d{cCzW#G zKbU2bNg-i|1&6U=G~EAG)M1mRjzAKkcs0lCWU$|H^e9feYIi3?t%O95*=BVb0*&D+ zV`pJgA&IJ;cugg0qO!GL`#wanyOeE+gyadcMmrU&zNUes`?I1OrAqTjoiU3hsYIp* zH#i#+D!#Ico96d}(d}{I*{tS$Bw=D=VPR%|QF#&ApU9fw08W<9?X2}6r+4x$*k(Eu})!X$p zT@V%Dnq!CW7Wr&%GDAcc9ScjBkdTnX`Sc1kuswW0f}DgrLS?>E^Xo#O#To8Dy9~8r zmcgTYlTUcAb&TPD-4W0A7~^#OD}>Xe-;Vkp~XMUY8}_?KWhY%>J9290V3iS>OJ568pq^|rNto+$&%C6Q+sK~WD)Wg zT5J@H#}kl9rML8D2946RVci#rn0%E2*A_fz!D`%98XC|q^a+)VE4NtHV$;9KxJ$nI zjVLre&dY95ip0X$pLYl|e0`6y(s~FQFw8ow^qb#`e?HMH+{DSK2+tCDu z1@Zjo_SnGnaS4~534=;aYIepKd;2N~iB$4LRo6c~L{9`n$|jr~mHLNX$?Ph>DYzVyf6czZ?Pc>lZ3%wyKRAT8PG= zLJ4%)AjuhdwZoFpTwgg^&B26m5Z@AoR^UIx#?~Z zJs}7^6R2@}dnYbcXh49Xj0{e$yE`UN0{f}y91B1HeMiwW3NAy^d8Zb4l{rx51RHZS z{Z+w%H+4SQzFB%vmIgdp&Oe7BsB zp!D^Lzmf^YXEy1nA|&LlfPG-6AaR->FHtczgsNR&Ub0ce$K%03&K0kXv!31v*tg|! z2FlCItu0F_(t~=%1y&Oi2}ooW6>*+EhD54t$U8eDV>|;KKp`WjZi90>Q=a@4&p~_l zDAYIjwcGxgo#)42tJVW4yb3ks5$)8vCI2j-sp;}t^dy^?Bd+WXH_H9bS|m(VTrVQ+ z&Lt|+AtX_|4FpD+be1f`r0IY)3TTM_egpb0wW{Z*g|9Fp#37Y*s5;?85~m|{sI03V z;>epOk;Wd=Cp$Oo*A~hfP{8$}&7z`D&@aru!Mr7-IpJWDw4#+>(_hD>)bxQ+ylNC! z>0}X5q-PH@swvU7>_ zdZ*V`SzK^o8a*KVmmhk*sJhMVz1O0uL;_o*^{T4qRt%#X0H+Oa@6SwTMS-_A3I!-D zqzwr8S03X1F0qid{D3iLZy1QlXI`x=NZSBPB#i#(uTOK7ihudw976Y+S zuuP%f&i4&8Hc==I*a-#!|5>z9u?|3c8{6A`_s7RWE@)_H>Sz?Fa`EX7c=33us;cVr zpw`_Uxa*M#tBEqLM*Yt|0|5ATi#;EhKt+4DYR$1`kd1bB2A1f_V}?LyK9m>Ox%u79 zp<2gFt33c1^#chVbz?Shth%bApeClQb<$KN(8JGU$|GUpOR+FYz1O(?S73OMI;QEaovK}y4J0pJ5jSfIlT@=@vYMP;OBRyftFZBw;-bIs&2go zsIMrYE!&fL7&2M|QI4xEy;Q^4g}CX?4L@#tLLAoM_V_0!Cno`uBS)b8e-7jf**`UV8?tkc7bQeTyPsSj z+S)SRo}hVq3vFy{{P^Lcudg4)`vRQ0USE4o%){f>k>d9_Ki}>8Y_8P!`0^VH7_~qu ziwHyjc509PC>L9Ot*~+&uXmj8`HpU{LGe=uOqp4(ly!0sadGt~D;s&+lRmZT+cQF= z@ha4mf$`tc`=hXH5PcAfDd}i$PvNk;0(O3@51OLh2Ql02v)Msi3iTRWPI5Ljj`wXA z^X|H&;P~=4F@%sHyD#?m0x?`u;|L_4xotPy4-N*)9dQ0^)NN8JRD~JhRQJgh@pq@Y zlqX_IUR~OZZiaUAhv&=RgcjkClJgEY`^N-**G`MgjNg`&nybU3g!aVeiGGG9m1Jel zv`ktHGN6+%4dLu03#a@t)1Ah_B=tvayTHr`xNqsKxoNZKZ-4=j9cru zC|zncWU;fRLA|6@oC-qcq7Zt0TO+ZfIfzKQ^;HzYGm|v{d~mpqQss${fjg)U2+CC@ z;)?N?cp8}%&Q?^l*Pz}ZHaXGOoYg2CmRxzs#`DtLlBHK%4r`@;$pO@&$*00dYd+d9 z8qI=r;M^qV@>;@fH0S&z*EsF`1Bd;ua$O3X6a10*-w%^!h3qV^yUl36eN^CNrV)}j*nJllr^5Mgbg1ehBOB8ZznczVy-Yhe z%6VsDdJ5zU+o4>MRKiJ#a+V%oS3k2hk&-U5fcL2p^f*+TD$yzLSi5GC<0BQjY z=o;HOEt!qU`ptv9;F1E=uN546k_?u1pCE^dOe!dGeH*`c7& z1*69v0juZN%WhT?1Y&ARRTJ)sJw5kVHjN+ODwi5rnQT#f`Qjyl)d6(%_VO!@zUn!LmNX9;}Xd@+acpNGzo4369{SJ`Li?%-gGp19SZcdETJRHNb zW#de?sD~d8q!6IW6Qamv03a278}y!5K}1{>7A8hqY@%xGPJvCPW*P=8A^0>?2tY-#}QNq!J!%KDxx4HNmD%))lzPIxsBPA)Y*{s!Pa z$}SyKbMpN27~i%Qat5&f6aoS|#eVl*sCs{H^dR-~+yBDs(i;E2{!m)L^^H0@fkJ$s z7gU&#jVsL8&2tn-_G;CJ=01yza#SGv15Z7W=k?i9>ir%i1G1pHb6x<0gp7+bQco&~>FLk8o#0*o+uaygl`^PS&A(o#9DMGe6LaO>;Enr7Zt10t7G@6s;|su<#U zi(SV9$ikOBw1OpsBfB$;?FiIZi?u{oO_Kf%)lkm%ELf7dX*|-{mAQp03VWptG2fQV z*q6g(BUezo1+Tb<1y32&cXRJon|ZnM@HaH!*DKw-LK@R-B|qV~jJYn{PVREb(xr&= z+_P-J3}8db@78@{-*kK-AZSok522)8 zICk=Gy^BrkHh=}A+WL1@hP0BWkb-ubZ@kZp3v&lUUr+pdjxSXFrgLS4%NP4E@*ZFCy zC(uBw^%6v=#f%5u5nDjJ9yQIOi-Sq~sPXTatzdE#(VN ztBSmL477J?*dDsoyS(OlsrXp;Ry(Q5HZc||*Xtt>!!G21o%Ze!gbAB!v;v_uWX@Wr zCsJCG!tZM@Tew2litxr6?xb0*i`u__cn#s97Xo#;Q$NasnjwFN@HefoLmQ<8R!ggL zSa(;qCj9tYQI?9cV6>Ws5H5vFm~#Es-C|^V$;EwLS$=(Syg4EADDw%o8cViPpS-Xr zZxK2ds89kP`yMYD3AtC;0i%;%6F|3I2A%ig?V}sGD;u5950A&w=y=qnkkwQ8>iAPS z1O0+HofbQ4KJmuaj7JIISGwc+YOvr(P+$WR((Z%@6Fb9v%Sf)=HaXaaOz!oXN8}Yi zL|7jpj{L=cVE=ddVa6}^7<1kmx1kT=h_#}bu`;^|?$Cz`b?_0Z3Pf+ezh4ktCq5`T ziFHL^=P}L(hW1iJjpK52Z`mV-$f)!sK0SlgOnp5h?}iknbcP57&l}6zvy5M35;IL> z*4yNJWrzNc;MFepug)vcy%Ar@b25X8rvg7!SWnM|ictADa~78{?_Q=6Y%G()g2$Z5GL_MySp?vmKv z0(_B}^U6RWM5l}#eZQb)Ypm69N_EQ(?uhWKx*~*CvWSV_WftYlWw@cliQBIqf`1in z(w2_-3?t@$H0YKolM7y**!@eb|HVMVwdYlo^#&skMP5N6^6%+7BEQe?c1q3h9ib=M z7JlQZ{aL5HHt(I6U$dTST!Jf1!cBvY-d6&WPu)%K;|$5nFHHOyd&5Y@N<%TeUdoSw z&|}j6^w%rV;mFTQV#Bbo0x>!l@(8DuovZ=}B3!f#%dyT8VJUYlQa3_!uTL+KQ#yNa zaX7dqljeCw9nwR* zf-{P;{L|(t;ZlXP;<4i77?UF(+^(21cN{Xq`LIct*cpHB@1}yMONfzz#BZ6*o8}9D z)qnApnoYYeavx}*2;J39J7l`;hCK9P2I>J26((FJ{Zd7^)iO0?VKxc%4cRD8l~gLROz^6V2!0TV&eFL4X;%j2EtYA9$?d3w;(VxsTnEfx4l{dwvQ&Vuf+jhCb={t>qyKk z_al9|){~n`IHvzfLiL&zCs+@;ts>u7H z-_sU$F=d-A}9B#Bqj|wW{@(uOK7Uf#Zv?7@%hp5`Fb+Z&$RbGC3srym|QO z+Wyews=)#eW3*uRV8?C)SZu1m%*w=7M-w8CFq?3T?Og5hbFQ$^PA$-wo^zg_!xG1l zlau&ea~CuCyp4wO43aOY;f#oz9Xj(CctC>1mDN{->y{JLqN4PY zXX50?N4vi0DNP29D%8}Xm4v3C-fQ5ABHN8<3N6O*x2bBXDa)A)BZ z*9$#bl6pJ7c;4mXO{H7Ia(^sxN+g5l|C;ggxct!UgI~+G2l|MdDu?W{Q!&0QSY)>I z@0&G&p85B(MSZr0*sN?Nzg~L?3oBpb!PdWjZ!Ir}jXut2rS0Xev{>F#EO}@VcCfhI zbto5e$2w3e85jNQ51;=54XuhcP*uG;Rdc|hSL4;``bMO|tzc*S=cyl%U8_v~ig%Wm+dnSD^nHOe(!E77 zn_u4E)^0JoI$fXF*-M3mjW1ShKIyt#r9m-}2p!J%Hc4Bh^B1O#E}bmQ_rv~ktp%<8 zuTqOE1o1>4mF8tsiQ4c9lewrox2v&A|GuKzmSV6U*)-+T6qc%RRa631U75h@k; zK~UoD&lEaJO65xP<5mhOPy$gd)JIqFg+9}p_KZI{SPw3;sV4;Vx}G^>N_Ach6^O8u zaQ4-FH2mI_c*Ofn)5!hn%IYkoh^~?+Nzbywa%h-cpFe+A zSy?qSG(s!ezi7DvqGo@`tZfgv{55Cc;wd~Keq-iSI7El$dxgf+Y{h%i1qtWLx9CK? zVM+#NDil)pW>8%_qk(?b9$X*qrs?`wwZWac)=q*Qv+*MJp&~iorbqOkPGl|<*WXfp z|8q2@Q@_Tq$$7%~Iy2`pM6cjW0`c$F>XFgIV-;2+vrPzO#Y8*}QE@`P8gOTKna@2k zk*HYlj--4z?Uk9)Z!6W&=%7(*synHaA&sqgDox-U{?5z(A~ukH zbYvXS0q&3nvMo9UeeTv7_&g5t)8P0Z>iPl;E5lxs&cCa>TreiY?3{=vKIOhvBBrhq zjN~s69E0q?VoC(-UB=roK9Sk|p=CXAr&IWeDvrpC!`=AwLjNY>3vBGpx=JOOp|juT zefSVuDl_&CP1w-!ARr(j83jc$B8UQl3KAuWfaILBhbRIf zS&||_BqKpG5=3&697kzv_r81I>o}@4fQ+<~PGys}w`( z<>if4n)+ZchWcGxSRhXY+oq~2KgAH;@23286QVVv zxKdho8zkargP4p>pYf!vWVt`NS|iJ`vm08lw`)QA` z0YQa5zQO*lB4KmA^hgYosAi#&>*%{z3lb+zNSut!?CI!HtF-bD`EVql?j1k6t@;K8 z8o$yNiIkBL*YOmhzKWISC;IF8<@CPA-(?Zoc+}rtrA#;DN<}mOV6!AaMnpfJc+36eDSGJ+X(Obg$qPxRwW%i;x z$XLpR@k&aQflXvRb&)q>pZb^&!in6c+97IZaXD?a*QV4U`zggx&$lHi>w1k!J z6TjL|PlrP`kBsSQ1&KmlFNFBgLf0^@25p2H@eEB$DP}wwE8=GKH z7_|;i%GCTa&R&T+$6@ALHt$V&@~nS3E4tZj2G{5k>Qbqmx|=72Pt@4con+(l-96{a zwa@QjA)%6=rI%(d;6*`Qv)->W6!WOB=c3&C4y%ggAUQf3GeNeeYZg(P+S5ZN~z(9|cip4{1y23l7qEg`+tX05&155B0^LrXLX z*!g4GSsL~&fynY%>fRxn8mtc@NObd4rn)iLPG|Uozz4eN=^|@0@^;fpII$_lTiZD^ z9WT97EtBrEP_A5&PE5DIRjVK`Fv@5U7hjq>eYuhaSIO<}4mNKbL-lY8!LMBw10O?$ zXTEJcmszVl9up;A7UK)tFKygK4kYs~x0JqL zn^Ufks$3Ob)xaBt`O#C>)fspj>i;^w|61ITNnUO^WwxlsuW1L_Met27Z$IT;YFGb4 zPC6VvHv#pv8 z(M)6xy;K}}w*Mn;rN_tbbe1n{1xsJe6LgT+gxmM~1jh85_Wg{Ny}^4^Ke;d~Iq6f* zrAO`AW#-$o<%9j*gk-H1bMek|Mcw8jWjELg%Cq8yot4&+JW_Ga8XPSR%(G+VEF}+D<=AfE7I;PaX8!@mJa=npI zg0G!vM34HW8MvLAsv6zOox=39OE~q7O);~!)Z)Yof3nazSZvC>+Zhw*ItXbhD#n)2 z+9|;bwGL5bT=oj8j=1bq`&C)?B7JFRJd#-Qz$8Wp%@I#~3Q<C6g>&Jvy%pgZmfB8_3>sh$(DgvEA0 zyC*H!1jLC83Tz=-vK0M=h}cfjc|pp)AH1RGeo_4b3VqoFJfJmN@h?l)A=rxc`~GeNwX!{8rNQE>s6fe z)Uc|)c9yeznkSiwX`9pQB5X=x1a_O1OXy4eDNVjI!Us-T{a`Io&OKGKX> z5+51R@l}jl`_LsVBXgw;?dQ_lNh7q`#$4%!u}4n4EL|*Ln$p@&shORL2)bxr`^(e$ zLGiCp@z~yQxm5S9FIsz(AEXA{*rH`McZcaP-d;2EYItpJ^AxwYYcbRPmy}XC)$MFY%+J3XMhXt`*U|tT3g#L$^Zk8 zLVnmE;m>z!Nk?gL>(xiFgo?WEU6YzjkI!N{3-U@+wRk7Xd8y5wKd!nr8@rfp+`IJC zVfJ{iGj?~RE8YwR)nFt|mm?>C?T#L8X_(rysk3(%vYtJL(mVPs#%*tH$8>O2qa({{ zHO;`h7}MIr6>#Dt`twDL>T6OoIaoJUmk9n~?3XOF!E0x~7hsg2-6oE?{`IYpMPj z2S>T{Mx(K$#$99bt>%{~^V0D}PV%&g0VovBwL+)*2u)$<{M4H7DJjTdXXJT?9E*X-6n$Fr!9vr;P z-_@4>mzn`vwm?#_+v*o}q^ORIO=s1hn>8wpIj%k3 zpsgn&v!K9zYaBy|S&nwhI6>gC_+flM-3jvM)6#!ZX*vjXHCVY&)YG#u-|=x_^D!UN zYH*4}{Z+uL_${=;g9k04qL>ETIldt@s?uyAZ*o0U)S+i4^?9z(Ym5)s19SJMj~~Zw zW0%g0uH7b8#*bKvNS_w zQ{*teERP5Cb9?2?*HPFH2^%l$kkp|2oh$86A!kzIFe|RoS$BoBpA=o$!k7uN49zv8 zmXwyWqIR1vQRk4`zM?dOIz#jP!Ejul-ri~7MbR-D^xjGvwb9LmqNR5Ey*AYqhqAQd z?L}2Ic6Vlb#>OcD4sW(?^e5awxiA-SewZVAnTyz2>`0vq5Z;Nks?LQy4V~;p*P?ls zN2O3ATg%w)o*t5E%^>Y#XNo zCvAY<73wRY4M@yrMQXf89|Ufq;xY1qD_f^`Nl((3p_g-!36^sgQe)ehu17M~m!qoh zqr4G5i#!v)qH+BnrDm90`32|N9;-dZfztKhw(a&A2o_lEk{9`qn6Xr7I=HwyH=iLo zym&vgix0D$`b3wsWcC%8zM2nd|L!k)8s5p1%6k(AMRKKkCkG2}#O{Y!r)unbBS$uN zH>izv))!qHBq>R0^6aO^U|`T;CXOj9stW ztx;|^yhG={^c_*1M;Yn9AE3Oysmv1)@Jdba>DJ!Z5_W6qNxD+-fO~C}eUO={R@w6z zd4rLXb?-^0I!Q=mlLzH~-D`O?SYGx@D0a>NeuBu-cs-5lPmZGD{dOeQys0Piuj3?p z>&&7zr`{7<@1hqhiZD~HgG*oM=&&wh@3Q5a{&=ZwY|ORWxUR>=4*OrDVqKLgPX0mg z-gxePoAX~pN}6^Z6Gdh7@0Rws13Z8AWELFre`)TzBqcA(Q>mP-Sx+N8nshb@jNHdo zwseEBYoFOFZAO#ihn)t^D=-+k1gFkFMfXPnHD~ zwM{5^gOv7bFQB$DX0;GG!c$~z(#v#WNH|wz?}HR=>GGa6dLFqHQa`mnwdkBqN);!a zY_>mXJ|evNYdlC~H9S1sV8l*JXViGa(qCe1tS#Ps!QRbgBVQ&UAYicsT@f)dmir*4 z=x0y2*0y(>aHYcxnOVg~w=K1Z`{;IHV4xNTY2M~;wsQL;8rwxkmZgT7rJ!^#lnU-V zzQ2j4YuT$)uDErBw&?5&;%t&X+C1B z&-FYwkBvWqVRPD?zGjm^@1C$Wov?_Vi{#vYYHF&X6hG~y%N!O_xTm0GXxOlg+LxbN z30V?;wi#P5c)zF2rA~&cGH>;5TJ|=wA6Dy<#knMG_*v&Nk8t zOJ`Rs4pwe;({yoS#itrUAkezK*tp}K5PF}G&vfLv`=~Xg>|Sk9Inx>c7WKjmweqPc zI=57Fq;SPrIh}cb-bSkEmXZ#f$ybRUr`xxg>aB2@xqUoHb9pF{k(4?{Iys^|rz|PS zVJ(8g)d{Vcv%LLiH@NTG2@^9px3vN4VBwul!LhbGFiEgW8%R!8))VweT{GrScQes} z&S<_$C%u;M50u?DV$l0DZ3eMUoq@eB7;8!`yIl@Z77mu}H7&ZGxjST9yMgJO7u(%? z5@@%kHjw+>ZSI{+t8*Imv-g>WM9}^)1uEy+y0W)-@)6=!PF%cclK^T2Jrb5swolro zW1U9sUk_*JWTg@@nVw0F{W>8kG;n7Z4o_ygqESMKH@sw-;Hf6^<0Xn6GS z%~g)!bgQa?jk&Iw_1Jo>?Kfu85~+j{datuV!bZ^Lkrg>Em9D;eX!OEBC%xD5-SlUI z#m}#AZ;4{dtv22TyG{Q@R5J#*xGw4Vp1L5!?X}!Wcy|#5gga(84VT7Xp$~MuzNROg z2quXy_%G$klFh0|j6A_bH+ad($-^SZ>&I6ZNi#*}-+XRvJ4a4_Y8q+YJ*zC}PWAOy zF$%jeQ3m+xtK6HpI}pi5BW#34R3lMBJAWlKpQ4woxN1D-eVlA)&UR1+xZ-QU#86qX zrv+2pi0U`x$CrLqw7vP3rf9S_$;vx;`*as1<0tv@c|tIf<9rIFrtb)tBo7TZJl5~4VI^o3*pt{ zNbA}ybpFNT{5C&E*p#y>uw3patQjnd<7I>6&F7 zX1Y?*o2_So2gMYbn3|Xj88!~?ybJ6XGEZcq1`;=$v<4~wj#Q@>4aF~6**(!!=wecK z6JGn8R_quoQZBkV+U0wSmRww=)U2i&Fce!`;e{5sxWANS#M-i8U+sY9}bh^Nc zbw9qqWuv)SCo@r<@#Wm(qTB0Vl-B{-otWwkUqxMTWFD;tsyks_Ks8wjP1N*qX5B}F=hL*uP&0;qfJbV;5tEHHuv7% zZAprUiaKVB%f;;HJ|kOW(>ZpReZM?%bsquT?XiC+J%e zcQET1Lt@-|N^Ixu5UUsU(B{`LjJ@{p@zEM_s|SLAlb83o8dc0YyA7^x+xhb_Y$U+k z@cdDI3rVwCXAw0K8SNITvY>f(z_R2a`-IDEdytNnzN#vw&@_(u$WTL&r*?4X+rh=J zsiExNbEigLAgh+0tlQtkgwD`RsT5+~@9S$0_RG1}>*gY=lPO)N0`)m0`-2|+0=4GL z$#N$c3|zZ=-qH1<*lu$;HpAt`M(K5}@4C5N@;g;tmQwTUj5WTb+dJWrLPcAmKoNHu z+T3sK3;V_aV>I9TV+LFC)(Ji9IPKrH(TG*u(_Xp*_%9_`!RO;hNLpX|t zHe)Vs?5&bwW4n6XYJBZ{Vz#TwS?>^YacYG`GxpCWM{3@`yiYw^-k{hIhgAIB{f@ze zNYyJT3-h>-N+y)QU%27FkZuVu_(ZEx-^8{%IZ~E|lXa(FG~w%LsVFi1`jT=-rB)@A zOr(gQ`{?l?!IF%OrFma0fYptS!NLXdCww< zt~v1st;$u1sm#|@{bH$r6yB+Qmdl}DxH;Rs25*p33C~s$Zel0R7o9?Ra}3&OGu3Bq z@bZ3tri0YkofkAo&;=#Dzc)*@*r?^#ZD;T1ZJ9U`n_JpH{l3UK&;1pQU9Zxbo1Gn8 zlK?fw2K1A2MXDJk*6#wl}+x%;d2ccjr!xq zLw#F4Ur<5(v#trHTY0|wA}EhXjBJH%@7*=#ddy+sV?eA%^`Ee)uPf6X;dlC0EqRiX zqhccQq>PNTre?9#NLL%J&9CXWh}_7?NYnnj0=L0J7&wuds?mm8`4gh9=;^inKgW5r z_6=t8G|Qb9*5^+qXsv(Xk>lWEJ4w&J-PT#OS6-4YdnwBC&5|1IO)pYnO{Jpt`1%@U z<-kYzgloqGHMfQmMMuz8-jpt^NJ-lZnV!GEED>k9dOY^(+egY;mHP#By8&nXo2AzZ zVfFK4up3w1A)^!2*?SeKr3$<~F|j%>tAU+Y^NZbr$3A96iD^mLWj=w<#UX+IuifxS z;hX3NRkA(P9g4^>a>~j~xsrr5%2;K!PNt7lai^$M9M?mZFx_$JrcM%81JK@dTvZH|Dkrg>56fE-2r#-^-o%oJj+`m&aa3va&Xc6VLJe+_T+` zRgk+?xG^8_y734`*)&0aBVBOmPkJ!!oOKS1;B>W=6rx=kERrXt50@^7CA*r=n@h_` z2W9wQgIEVl@%HcjK$n~oseJLxI$&VU2Ds`x2OOl`mPff3PvnD0k=tL_>q>DSA25%z z8e5sv(=*o8fPJy{RTRGDZiI~%@jhSrb_WolZUHvc{aI}8rk5a64k(fkU1^csD2$WQ zj`E^kOx5pbXt)N`ChLwk{#vLkPfyHX57i{0yJ^$oN)`)pUU0*r>Qe|v8vDJ)cwnis zZ?WvIV-2a-u|}ORj{{?FW;@JGf;qkn6I41|bmO_w5rb#-ky@JkFWNORyHA?6mWOhe z5|&rlvWGT&MS+=^^gaBtl=H!SX{p=x$B`ohKS~y3iGnh-N-R24&9Dm^pqR>UUgXvu zV-~ghxvOcwm_(|iT*={;<96pk#YsowXtCwjp`zToSlTvwj<`B4TBivxnC9s=`PrYs z4yB5&lu$;JQzp1CN-geT67<^~U0~gEkcbsd3tzBl@o=MHL=U0`Mc+As`U(StPH6L! zkI#2=jP_jxg|+wPtjzASYFGDY*Dd-d8p0=Bg8qe5^69-e)Qdy}(Ej7W zB37xq787nY?%34I=d|uHB9^{7_w;6$roq_*RUU2$JAM7pwWD01nGJHF`(0;`o4iIJWgQ|Zj*U3ZoK0t^pG=h`VnKB0A|8@5u-pn`ks*N z)_&AS&Wd?9FcmSoFK-2i2+q7puUOfDQmx8RDhE2EBD3~prP@U16j1SNnK5n-Q&OTU zL8CPy*y6Umoz~K9OwWU^N|*j4gJcb0CLDRn9_Kb!qpRg$*qu|3G;z*rb2U`kly*9a zEH!iT1(Q=>Akr1R8Ew?YMLT&Uk$O6Z(!yD@eC-^28r5)Go28+VS;g!ub=&sx%<ffFv_dRBoefcy5Ju>mm4-^`fnmJx(r?oI<}SJ}W)x zlZCQey1Pb8OADxft!Bd8leUtJ`KWRt0#rj(;cP&A)ymb1^jD-IB$%e%!qm_& za-#f6UBirs^%4fDyj4v?f=hXM)+x)UeU*F>v<}lDVCS8kwc7fSoLJ^E@{*}|&Ye#& zEHe9_og`amI>)WP&ztLK@k8XyQr@btlP^N4q9m)BzrVdNEP1x%?c2oamlC(Js}*|A z`NnBWU?sjF{&j89d2Vj*rg{In@BvNbws>Ld-r`=0;?PVq6#+pA#b7v%fhK-vq6fkk z-!@E`arq}^W?+R$5c8Mk%wO3E(6kgdt77ZmP};Np^LwFB>eosb?8{&e8wVM4+DW}_ zS)Ka|c6yj4Ll13cRd)r6O$DbO_mwQ_V?@ww4Y049hh3x9f!oVQ?f+S~*l#x#L&r6F z9@m|9Pr~DJvA3>yS)k(V_s8k5_mUqk!Pyh7LTk-E#-Q^WG)Lvy%ycTU-Z1P;3SpEg zG@Xeug7Hc4UVYZD*pp0TOB+<5sg=F$wFIZxw7IO(#R21N*R4@sEyv05o+kaa__%wQ z&AyKM1aOwT`2PAr_8>ldW42HX)TQ%2v+(Zx7kV$qK-0300^BWdLFo)% zym(P=HB#otoZw?^TwOkhbDU43q?3I}X$GA19z1w}tZ?NCZfa}m#f_%#zQgoRa8AJ9+*94c<2AaVH*Uf%)v*O848Lq&3BzMs3x@YG7o%b2Kf2fr? ztoWT~1gBx~GnZ1n@xk&7$il{H8qu#tTRlF+g$IG$F4?JmaR6jH8nMXW>Z#H2B(_kQx~J zeg&Rgc^YohFJgCN|roqCA{DZoVSh>CWAxG;t5d!NTT^EeCnp_+=`wb{5D4>YO z1NnyI^}z|E?)yK}6o5W3%g0|7fAPEPNTmtW@z)(<=6HuOf9CkFUH0jpKZ_IlOFU}~ zW65U8dVpV9kuzxJcCev!`~CkLf9>yq`G4r{{r}bH{y~oKK=~)Tc*|m})}P+XcCKgG zVLb3JB9fhX1JTm)8-VIO`pqgOHioR>?|2P6e}pg&7TU-b;6`~nhi&ap)p0tPoZQ^p zjiwm0l9^wBk(oL7&-Z^h>t9R4H)PQvN!b#0ZQNEJ_rAw)#2T+fjSmT#=-%>u=D42& zR&^B0r)Y(~E`-CtqvkVv`Y$unN`nLUnT;;L7K;#!KkGJOdpOu4lY@zgDckwq=HB`e zQndFNE~>yrKW1O}nrdmjuyAbv>*l9@NA?aub*2vQiJK%Y>m5>TY;5RZdn7=?>cYMW z`#I;Ph`IpEB{$3b!B-S)s~Si7pZ_Xw?N?+=Ti zE+9$Y4Dwnm4iy{sWEAhMHi5EbWNggF$|@(gkk420pC+Rq<_FAsD>YH`287K&X8Xu% zbF}{NBA8`|p0Zp^F^%cdYO z*=MzZ8PyVlE_tNw>WWEu5W~vG2Gb1H9L;0&^OIgvM0i+OSY%|8X@eoYC*z)ewsa+? z*ZgT-PwB+Sv1RDppJ!=nmJQ_6*0cik!A{4I-L zMU|L^xC-?rPjHs6GYToPjt?wN@sN_3!9>DtRzFlV_6i~X`P)#H-z!upZYU7gJ^B2h zoXuNT>4a1aKC0t=(~l&FT)PEomD3sILEQL=53$IQ*6Iq+N&4E(2QlIT(d8x6*AE=$ z8h5P*XWJ`W3GevT1;A;6F|_9&;H9ER7X9#3>dpq0vRg{+AB8c`t7{c&2H3kLl^O8C zBGXibbXSKe<1l>!+>M86-I1Z{3u2VGev$2>-tRP_h zG|Ra!Bv40zt_kNef{1WGJj`{E}Hq=uwNi9_+hC^jU6@}~{4Lt<>+A7$`zyZuHI zRi5>$ADga(EhMiQ4l3CDrm<6cR3*{gk0L3?xGT-a z$YBMJKE}1h1-ALK&yFoDWlpN-s2{%@e9(p`@9|}j^!M>{*YtRXFdbC*XkLM#_T8r3 zYLY3UyFrKV{b(L<8W^fde5L)5%6TZ(l;pU2o9`AhlY|ldo#c;2C}2~CC-l@meH}ot z(I#y^h$i9Xzh^+r94eB26`E2q+b8Yg2J{Kr$UUcghmVCZj;n`XB;vi

Uq{96B>K zfMD~Z*laMXk8bb@q6i{CsBCJ)P$8=qf{XUeMm){sGq(?hp&ZAsmDjzSd?d|%Zf}0< zWT0hJ4?Fdz+D#Jn*4Y$KdavG#m&Fwi+oeG9j=q^TX{Q*}Na`TdG*i)sw{~HsaqJRh zwK%mMvPTa&Q)jBE0B8f9-Jv@S2O_pTO;2g{yH&2a_M=LK_&{{^qr)-x^D&9>ovcj~ zb~5@1=&a6$40}1$<%9NxXW2drD6GCZbRn(yz-@+(km;z@Xc5<)Do;XYx!CjKU$OhU zbWYPBz=(QQUTCFHH`ug1rMTD;xSvcU=Y!T~+497nn(Ejs*E7xVKyb1V=_% z`t#?{@jzjF*Z_n1%!a;#6NLUw=gj&*fich~JVo@7WBTI5r>Pk7abH&wQ?scX;Qul< zn>?Q1da4)|KPYfKCnZHcyL_`zh!db2^!oBVAadr&3PHDYQyJ`ju?jsI1Q=bO8E7f@~ zBi~tdxUowGZmsJdr$j7vs1d~oS~A-fMj}e=WnihAidT;ISigH=fh~pB_witO?{6Q zxl>x!j!kb+L6NYPdXNr8BL|i2txC80ziwYge$L2fc1hnDqfxh;b+7e1&7YZ2^qjclztZUK&KxJp zg_MViEAeBu4W_19G~H$D|tr}TCWsn!etoIuvXlQ9w8g`{LHa5bhSuk?@bHFVwm|S_I3*Zf2SJc|Yv0JgeMSY?`&w zJ2zFbjXB`u9*kC{Px$J$dMKlQo|m%!RqQmCAf@UvT94`CmGf0yxA z^l=$v^tC6PCQ9Gz-P7x=a)~@*^Jr!4)i1@dteRn3n9a6k+RwYHY#=lD8eQ5WBNAnw zv_L|96+wFE$l&1^(jcL)Jre=~cX=Dpr;!`M3tLHNeZzfzDJdqCoHT{#Xlbfmvc+G; zo*IAQgjkjIC?b~O=zLbQ^k_c(=oJHpWP9*(|B*oEIZVOT7|Za?OuP4&8BDJBcSI3W zP`V$n43D+bxO3FUBq``?9|uy4-$Rw28+nII?ov|dCdsKhF>SuO6Jy@aUT6k$Ca@3C{DH@YzI+9(u8Xo$J_Oysr&E}+2d0v{N!o(iZa|AA;V{S zV&-{;@hAsQhy|OEmJe?RAzkUX1mg(S5rM_5aLh- zF~M4OC0uJmcOK&Kk8_(c|tXNWV z=%DyLscqsAg!uJvQuQNv9<~!&I&ulUurjl(ZLr*-Isc&4+#W~~P*PYuHc3|Uu5PC-b=?K8yBCCl{Y!~(npxeja7RfQjQ4b9he z5=cEw{0c6z&0h*>ZNk6|^~<-(6OnK>({4)f#0?JGW|H~6p=IcpdtV-ZofOkC@FVC) zaAgtGCsD(rvV-=!kL!fIAJAWIB(Q$NFF%5p`}D9Yp?as70->i#Up&z}>ORMV=K5m( zo)_^W(V>Zj0mhG}f9xjs1kEe9r$E~S(>S26bt^w}oE*|=E^`gl7F<7W5NF%dm#eGJ zWd^4cUDN&EnG9ygpGo&a?*?7$FJwyXhU%UUgTBT=7jE1_@2iq?EmDf#>*vck+q5uL zWf1Rpg*F%oT6C|LI|hhL?z6gAIOE1-q*ldZ$y`>+?B_xAN>>QC%%lX9pkTAf=5iy$a(q})0CX|dJMPmdrf(4Z|Iv~B0bVw4(JJfHcba%`>CxBe*%eOTULFIZ zo~Ej5fBT0!?hvFI2llLujSZOycK+omLUk@6C^K-adc&ot1oYE`MC6@cfuYFLQsI!U{hO@)zC_m4*+%nE2>mV-G=YIB& zK9A;26h7I`8e4GOPL4djBz!BfZMo&C-To#N?`eh0wr;Sn-Ar;MtZ$MGI7egkgPyB= zy))Y#Gsoq&5&&@~PYaB?!M-p%H^*l>pa`9#p&@M08vE$uUGOVsBqb$*eb7`!E*-{P zVv1f@m4l*^Z+TV(kN27eQM+kv0J=GrsneS`bLP=kDaFnauo!~1PfuQJY3!g*mNa~ML|>HX$+2yuuJpx`n;gKdJ#a+?>wIi%!U#* zP&5TeWc5465=f6Ee!~MyRz!Gpha92$6p`B1QwS0~R+c1rg2Y5zJGd!K^=u_4U5UDd zxO9NeHvN3u`SC2VOVNP@F10y58LUc`qjpE%h#aUd(%KpamI;TYBxs2UL-MKy532dA4IIat9W5efE-ITnUaF^?B`s?iZ{76F3! zNFrXNl~5EY=J2wq4MzN#X>ei?YDSfWlROftS7JkOWt2X+HI*m)D8k1bcOQg25dqCX zK|cW`gSZjkYfru7@xr1KSGPu>OfMBA2pI0-Wv!xqvc(%B0m(mpCsZ&`9p$%E;R)12 z;uVe*`CZ*5(#K7A!%Jekcy{0?%{R!$?FH=Q(w~3$k>acMXy&;o$n29}$7apO#XNrC`|Z($*yt%-w;sM?V+~of*wZ^kcJ^wV+CRRE@C~@Bmg%e)*>0M|x z{7&|YGkS3tPMB9$kCD9s&OZeOg(V2F!b`3O=7fvl=dVA%ClIGuYG;ZUFsOWOs6FdE z^?C7}$LB9Ofwrpu6x8{X=h$y8m92qV1(y#A^-aCTFxUiGGPzB5@gzu9)v^c`IiekjXJC3z}8wUmUQxb>MXUotvPWo2|DTeb_xKd?P0 zYuG~3yWMsd&?TZ2#$U`O2XRJZRMIoMmj7%-MlZ}3P4(DqE;qg#NC~7_&rP%rTKaAy zNnEa}@g>Ew1qfAVfokFyuhQsGFAt=nj1RRLgsQ-Kuz9(~#Wg~eH{_i;%Z^Qwk;qycW!HkeY~0y7DdOvF>G1}1v1 zT-|zFhhLsBYDcTRwYD3T!FIC0yCkaL9OVcK_5bKq5M%-B32BoYc{667H7v4YoPT^*h$Fxy2_4y`y z8Uh=l|{BiV1 zq67|j5sxDNB$Rk_@Z@ncp||dsmm@Lv2sqLuo;98XCwHnu`TrdcW(?#4mBv1|INB zUe>p|Bo>CZB{DP)L80(kfrR39>y(@}Z-Pf-Ss*hJk7i`4qHtpMp4l$$Lp?JnXz?6i zoP;9ot7*$YT$_CYz_B!dV)!4_RBejr1VH3r6M)P+Og#+Bc31>l`(47fpF}|{0|WHZ znZvtgl4ko01U8q8T%pbVjP4V7G<{2jgyLz@6g46LC<=eC{_BbXL<@Kw4`7)O8f zcU>D}S)Trq)$zD`*wn57!#_*`(=R20M_mERb~&VLB(!0og%1gC+%ZMgClCpVs(7iJlahRYXESgPZE-J!+Nph`C zRMaa6Jbcfu_m|o)^_YVT%yr2bx$Cq!-#>62JiwOY-(j83sS9uAQeiRH;Gw=FA$>g# zgfIsMk>A^)R+8qgJG1GO>?#%`jwrAU>ZwstQ`3R-*Ep+KzrG2);5(ZOF^*4_l#~<{ zx(busvHODiKgQ|;thGeUU(~&#*yi-ScpdN4{wFV&ZS~576kjid`c4AV%9~bu4h>D_ zi&}Y22z&DoD&)T@27Ng?^j=bQuIumrB4uS~cL_~+RcE)4N-N}Gy!-lxSz4Kf&-+8i z`9Eh;xZ-MNdFP&Q2;(LXKR27e;MQB)LwK`GUJl@@*jjDk@s~=KGep1 zQS^{C1ktq!Wo2h;l{?uIe<&$&f}jF=uYYsGb%gLg{3>=1sA;hVi_m|7LwYaM!9v)N z3ZiJ5Z?uVG_rPWiuDzRXdt2LUDET;n0$9qoI?+JyRfzMOK9^**exC!g%Ap$hEb z+r&|n@1}|qy#MBT`|(O~N^JDz?ia%L@=3d7Zb&9B6tJb^09z8V21~8ux&nhlLC8>V z;*gdz1^MDH7|z_k-1CP&2YGVOW9b6L?ySO|Gns`EM%^D-^9vI>7P>w^mYjcuPz-yc z^330a@p)TwEIPPG$WZ?b{q;~j6dJRoI|QCd=T=)TgREF@*a`3I*@LrY9x}kzhwo(% z4t5svhh3dKt{?7=#^e-6a+!vhpi%tb)TXfM4j%6o4Ke}`!{2X=N$bGD$OoGzzL&7N z+5Q%n^r_!T^HcvYB|IW#c(7NL#~Dkrf6jQDg@IL$^bZ1W`hz_#rE8%X{!tVMh(-9{ zl(O?JSfL~jkE4>lEUM7=60psq`tS%TrhhFXR8%bbcX@Et(EI(R1k^IjAIcBc)zk8) zkNo4&zZUFY+6eb`BkohU!tS*asjYrQ5Rm(L0(c$#U}Xe#Ci&eW+tJk#Pgze9oH#rQ zD{OicoQ@hK1Rnm^R&joHk25Rer~j!<|NHVLg|?cvJuUgGU#FT_*kQv}k7d6P@A{Yme|R17K59;R^X3>hq>Pd;ptS8L0j z)vTS+DYp*Chvh9ks9nHeBLzj^dYj^~ZWn3bpNFi!Q^FNIH$&QXPA$`JW48O+wQB-# zt!-`Q5Edlv$79f%p;4-o{J7vn$FpBmo;%?;s2(^tIGC7Z$fZ)>Fj53KCy|jZD8!c> z5uE3l1j$)Sqlc=jQLU;fD(tFx&jA2nqZ)Ajw7=j@SI&+HZ~0p$nX&QluFlSNHYo`S z6;)LZ%`%5-uRljeNAJqu(js6=b>5QIvF;@#(6&l;HhUk8zYq+- zeK}4Wv*Lc>ai7xSXJ!2i0zljke!Bk_eEQE-7%ERgN@DzPA{Zwd$i6)EIi(XCo5o|$ zK`Y%9;)RG95 zx{Zz>KfYZ6#}2Dy-ehNaL-N|+|JrTLqbP{gh$=mCRkF6og|T9idW8e&XTF{CX-fnV zK9)>1mF4Z6?@O<;;lGpOunxM_}8w3L{_=5eXG9i0-m7AqdeRBMbiY>C?g> zY%DG;c=hTuxN;!)s;ID#mPh|JqB;l6@dRSq?>k^>QOM^)Rr00zs9)&lTm#kbsP_^4 zwS%2a5HtbR2t<(klh*eK-&`^v%xnN-ueMq<{+RY=v5(_`uLR8=2lI{R7yj;LG422j zj|(__t74CG26jadbvr%+w|56O;lcE4_5fN;zXq za*I0I#RV@CC>&HDC$8{!Lt@Yv-ZS{>ry1tsKXm+^%xbY`&)&r&1XUAJZullqqg94& z!?dsbE^#Wp{0Bf5MTNuns;7sqzPoz{zdP(y)nSFc;woc(AeX9=F4O1ZD-eBH0Twf0 z@*Wqi5#j)wn}zc%5kb}K!8&?w~p&;!^;F$Hl~NfvH)YN zPW}D>fA{+Xa(uadCzd9JPtD~pHFA7~?lxE9Qj&dz?{LP$?souFX-k^MhFx9q_<{Mgw-6fbDsT3!9D;VlzYpgx2h-oAaCD)4((m-Wv2 zjL$#NdJFal2Z&TJbI8@XpVkA@lECB77x~b;Q(2(9yizRT$q5c_i!rZY@wz834@I=I zvjeMZIO~(^C02@xirU)m5sBb%eGBI`GhK)XGs0O#2%E;eG@RacXV_B zm$k65DYKev1P3juH4YF1x0y(}vpvShs9@mRx7%(D)6<`n(n)02BhNR%VK}l6-N~n* zkW*PlrB5G#G7cxl)GJu%E8af5pBOKFFEZSoJKJlE^}-4Vn%EKt+V2>sZ&^>t7O2sj zJ2y2us|Ma*T45&$?z$o<=nP~PxMmrgt=?gurg#ji_(G-g)1!}%)2_V=M1-0DivUns z9FO@JzF+*-*whdX9^uEP+zsE|V!e2nQ|wm6Vt6%Z7Nw4BDF~1{9fN~{SFWTeWvW4g zM?^$~vng+GZdSNqO5F6AnVAdJI4a?UL`yq6kUiZ4xcPb2R7e~EX^nOG{?@;vtcb(% zFZk6P0Va7$&ZiEe-jsQHd1ua?@j}25@g=1>BVG&px%c(m;^+Un^~3P{Yey;1XtG>9 zf8Jqxb+RFp`6R5r#0U!uTU%K%FfvZQy=giC!H<_&S&hKd4aP0f6DI^9>}_jhJTo)1 z{`Cb$FK%{RS1x1U-DUohK7+%-ix>v#qmq8HlP3cp797(H@TlkBZ9%K-7 z6*{}|LKu8Wu;m_zpC(*aba1yRp;9>F_T||b+y?C00;}QGN(U4D5L5*4caGQo#7}e@ zJT_5=!t@{@=o-a?@gWuJ8pUH%zbYd2|jl`j=$m zggEfSQtl9%NKrT$peb98%SKj;@lX7jv}?b=6~Y~_x^}?Osw93xlj>m^PvfDf{~8&- z#HaDlG=DhjPvgO4KFSwAA%1+c2I2`;1M=67_)_}|3GltaV+!>lrbqytU1P(I1sz&^ z3o+mbCc&3Oke66>c!leM??R`bq*W3)!cL%He|U$7(7#{Bi-Rw^hsoe-$}KpB?}RJW zU{xlF!jVU~t}rA}zi7#ZUTO9{ES3chkN!?}^#GcG7vW#i4UT7cw&(<0SG&0emzu1^ zM+$LbV;Ma7nH)C5u|rw+^b#a{z}!7pUf>6l9>GB=QmPmwU?QB1dWCPQqqtuikET4s zrI~UG?7%JfG9NPElq%e&SYgLx>u}FyJ#pen?})-R+?~QNu)VItxGC`6 z<1K`1=&&P7$tAX#N~J(BqoU5o$)QjvzUMy>m_*n&1{LpYHt{25=S<+;v$V9d)YR!+ zGr-llzgp_nynUR>0a<2OxU^M%z7>e`cje#8*z1l&kIikn_Y zXy^rQQ!fu}Dy~gE^4{B|KBJ>c;6u775QoIaXLTDb%+GrvV8zpM(u>m_AEi9QKPDy~ zB_#AlfB*=+3N(oCZEV)TD|V5F#v6fjS!;o{1B=6@%Gx)8 zoBjHAsS*ybP)zUkVd_p-Zo@{v`FEY!A}5kX`_E3E`4>zLU)h@Vs*_AJ`;+f&lm#0b z{ao}<6gKWUtyUP~zXMmN-Az+U%1B^su>!WAr}2=ge*mcls*i;D#UECjMy>{KMI0il zx@u7NU1m%!O=gV(+P0DzSJwu+e}A~MxVUI( zX$i`NoSd8wQ?i;mZm7YqcVQbg(bm@fHQ5viYXI22meFYR`a17Z6xfEqcbp*XZ1?bC zJ6JLxI?3GBR9L_HJiV6=erGor2dPSbLn)QU1dKuyirH&<1$Uhm2VE+Vnr~4noaZWT zPQbPNlf7Bv@PC3Uhc*HNf`=y#&;t^Dd;p{HZrIyUkv2w zCBX4<`93U#xz3&jgf2}9C#K-KS`Ql4)qeq*lWeEOKmDsFeP~o7AP~CoUo_#l-fZ*y z+Bee4PA2zZn>Fc=fS$NZtXQ!GO;TpJFaTW88xa%~G%_**b_*Y-o$v!qbx+`5)l~Q> z%pBO{uZ_9hU|L}TU@&oV_A{NyQ!O#n5zqDXl9Q8*VGF?RZ5jcaAH&1K|Ij}rDktgO z_i`1DN%46Tgo!4{keoVostjzL6AhuTC+Plue0;n>T$b2+27k< z8Lx-^_<}F+-2K0pd-HIp|LqdzCw*&3H{J#%w^ZpEra6Q)m=037E4b|KXy^&y}=ST&L|#xMTwU#|7iTg#!~6 z4#%}R^CwDcDU?xXxdM^q<}=L#*x_Ua+S=Bm#r$WbZ4b3O_}m2zxwj;J^9Xg%d92w3#fbx8Lml-5f(|h;F+t^470?k)p2&(c zSar^Mt+HrAi@tOX1u`B`8mQ+2mv#h_HNbBmS%4dK1Ab5hNxu(-a)MZF0}F?ZgVYAHs9hjH0VyAn7FcDB`ukj17B$ylAg512 zaB%kH#2Qd{0a0&$6dVzdt8fHoRbpZyJZ=nJ%4ubl;hAVJM!>!}z9s-!8AJvkE}lp$ zNGpM22T>yf&r>=Xo8gjt;IjPp9`T0CIYbi>nfv3m}(=?N20sHfz6CwTZtor-Y1tOM1}jt(X&CB|8qY{S(uJI@h|+4$D$ij#>vS^DM`sGIlwnd z!D&FR+sC*#&-E$Ay}whAv^QNn1^8F6)WE>NeL;uzII(baXC-O}{F;1nKFlFOldC-Y z9l!jh_r>LX*DWw#{{xYf6-KYBRz^wbeNYf3J3r-DP0#rnvu^s|+H9>baYkH1g8SOF zs?{1whtnWF53MyYC@N~_jTHbf77+m+NU}UNj7tYKBeGxkU;aW|deN!ui24YI?w89P z)~vhW$c)**X2~lkV4>0{695M4X}UTWTu3i{{AonPzZTpD=m1d2UYMI}W$Az(1;Oak z($Z20GihjOfEV(yUl;3L32{B>0sMtMblO6*s+f?FX111grj`nJ9YS`>o9pZA;@*dD zvBI`AETSLD=1sTqxvA~nfOr0PzV6`a8X6P?GO~v}yw0o|9?r1j=;3mVD$5kZuVw3D zlwfld71MPKu7Qz7{m;TdtHHh&+YSly@g4OGlK+3pK5xuk2N5F+3rkjZ_Ou*`o}l|X z3Y1ssiKkke=vijwA;36V;7-n-9xw}0lO$^~SHf^Zj?;>FS#qV}y!Oc-E`S6K6j&(8 z%Nv2ChC>3={+!|E-~hXp3y!)M_UPlskC64);_?y=%U$+ebSm0*}*bt#)imWxv9A|ALC^$iUW z)k|}5n68dh@6qOi)bGz9t^Pv9;VzG`@HQkvwu6PA7{RMWbOnJr+`Mk$$$Zx`4=#j+ zFS!Q~pw$w4|J_M)?g6qhT{4nWF?6J^cUNL-vCrcN=08q;zxOQP$u~kzW+PlyqRE}yyjnST%HEc`jD-KeX8O|I zNKdbouNX+tS0kQ@$~9nGU9dKiCb7rM?ktUP`{4Gw+XaNz`pAy9Q;AymW^5~wg2rVI zhY2jkTjydw#l;zn(FYl2bXrOqmEbU+6f*Q|b%yY+gfoQmgFUHxvB`M%)v-4QC8pCE zGkk+?2bkSws$aA+8Dxgbql8@!Iq|QxY~Q|hJ*+CoM>lv1NkGx3GKesQ=Xc?WtEiBxI`P8t^z}wvTIoGJXYP`IaYtNwIZc(bn`hEQi zRr|4~s`T>N1{jY~e@fDDf$QArr}ppCa&Bem-hj{T~Zr9^3)TwV4>lWt60*+@-5 zudT0GqUG?1k780XIx)x`}EocxR9!OBuS)vF1m zyj(tX5Q^{e8ow_++(4rlWZX)yyWM?!T;xqw30LQp%ViVI0!mdkDt&_xL+G)4_I)>( z%C&QB^r5x)4>+Po9)=BBE=9ePxq=BT7!^CBe>Yo8f1s~uJ(=f{A$Oi_>~!;IsAr7@ z@;p8?+{v24_s%mhy*o+kh+g}B$Xg-dt=`Wc-xen>eL#$+zlH^_T5qx1N>Hc8G#Z~p zDl-c@rl3GUgh31V1W~iWL-&IA2c&6|>13%1+caLUQ`wj9`Dpy(ruzDtnnuwJY-q>9 zmYpbmUAKk0{0tWtxayighDFT7X5%v(seIYLmSVf!pbEy+(8>g;UEnXudrWkm8vDaw z+;;ekuq@&F!LBsot!2-1gtD5d<>z6+`LowPW7~eS{i9UUU{%&*P-XMdGOCShpi!{U zy?KW@DC+Tbr^A~r&joW$g*zMSwKIEZm?SOxT3)Id((CIF@kH_t4IaIuU8cEXeo{-- zK1t!+a@T5=Mn4x6uRuJp_AFajf8>(BOs9WKRc299`Bx@+Bt+S`y%~&{4?D| zdnJlnjRj%5FvY!plf7=#>)@(dJpW@IkAg_==Dk|RG5ldD>ky3N3RKM;NR-N z?!w}#@cn8j)Xqr7wEwSdz^laL?V7p-WW@dboM_@j_bMso=eazQ8VNIS0N2-$krLTK|#SZA4C;BSx;oWiT!Kzpz*(Jn|D%-a?kHhE*m$fl?bozlKitLI`Ihz<06Ao z_FIEnFjh)rZF_^-QplC0a4GnQ*TbldPDWwR;!;=a8<_xE|4^sJwe_H{tw!^Rxqaxj z3cxIiz#HildnXqof2DUnk$3%;8yXrJsW~YhoH3})AoJpdc@?Q%pKtJ=EoRYORhhSR zGTBuk6Rn-gGU602b0sdslk9bKuJv50-<{_BHn!s>j=ZacooVd1G1Wu?R%wT)lH$5I zOEfGWM%lsKV>+2bFBmRn8Jb6nAc(wr1^3yJ#l1PmFr{%RNR)10J@+I3h+im6ES+{}}0Xw~jSU1t?_n+x7`Bjy~~HnhP< zR(Ku%e3O_I@XI%sbS+O-fmQ&2IL_~(o#|uM`)8WHdU;D(=u+#VtTD=VH4{4Wm*4)) z$9MBwc-W@0v-rqcwF|9Zg_3_U?pQ4h6scHSTQ9oe-BHLo5>(tx`59y$UEFE&v46f1 zRaajxkD5jD?sw(luayUXMtIPnbTTaBo`vwUG%1_3(cAA3Nu|H5ZS3D3Bc*MWfo25* zPQzMWL^(g~`YY2xqGbi12o!w?nk{BKE;o?GbI`~)e?2~x@A>-=?6bJbvb4qM;c$iI z9<%M>Img&id8rzRe1Q|zMOARt$cCRz2;_zu~Y64Mv zO=frc+75I;cJ3d_GCe)Xh9jATwzY#>s%u(l%H2v`cwu3o7A;&W@-5P$V8-G6kM_f7 zTO!s1#-$U3jaRw38}f?Q-PQ+Yo5h`$^l(jDd(8Tazi8H9CSsRy1C6!Hmp!%61ulfc zP)@}daM|~(lh)<)icr-7#61kLF))*Ed6yWhb)fW{=(SMbt$c6|N*dCB@7U!DeD(ek1Q~qN$5f?YlSOpHht$w%(&O5tkUYZ zm=i@voi~TKrC6PRXv`_Ac*O`1CzK<7GxAnXzpKq=;MK;QK11j$*r^KeM}N61`Sq|} z+n7z-VRLa+NEy4^wfgMQsWnsjmG9qQ)b=Zc!Z5Ahe~|q-#wEMPrPw6@w`fu+F56;- zOBs7n)Xnl$YR5Z&8p`JsZ;~4C!_ntO@3OEg@nvUy?ZuA*b}0MZG@#tRTr@M17GQ!f z&J-3K1hw7N*a%FMNp97>-R|G= zh@9OO+rElvIO+>d;@Mh5`PMteMdWLWT`6ChRbqwI6jflY*Ge4IDpZJz5FSv&HiUgI zm?eEKuCOD@vynds1}cVewjMrfOX5=IQap38IvE&_@1A!`PhTinmIXk-qM^-D)-U)Y zVlg=sA;sjbG`j9jDXqJ)EUp*^FR*L}G;UiR<5$6PZLL#3RBOkTyma&u*`epY8cKAo zsER%Kyn>G4oc|Mv+qWaYKEe~6MTVRq^la5NHQFMG{RPqZm2whPrETEfT29&B5sgPq3%ZK zN(E}BWnhoZYl*pIK~+YEWaxTh#sOBnMxV+ewH*b@THFxQjVxGstxd}+J&5l32z#cT zQ+J7axXrM9vAk43cmH=jHUuTSaj=dsRt($38S+Wk-}&iiNn5)P;AoN6kWpsuf^w1F zf%{?IjT2f&f7W{X;4#^lto6oTJD0&R-RNDtin_YSbpQN36PhrqAlHVRrM} ztMN&^!*oV(7^m&vp%;YC+PQ||oG&{*nqckl?276;U%iBpd-ub>3tF^eEa~Bz$5^bw z?rw3Ml*psh?%(zGrKKXk0=qj{qn%|SwDC@CU4N<{vXN15zRTZJ;m}MLCG;VOpFU%( z?8$5|N+7{f1%}Y!4cC*8j}Z_%P7C{8#Dg7hqWZ{CqRWU!sn)uiGdFwUCx2~ob90h7 z;xoFr2y&SM=`ZCL#y*{i=IvDhAd!Flydo{YMuzYPKovVFRPpIE(vI81Jud}8D+TY| znYz3`jjj?0Qv)X;V^t`Ob9tl~3*YzIBA7>hK7r$6JDSuAE^Rbcniq|aLK%Y|oDTo7 zU@bk?+s~<}$58bH(h1bI9LvF?8-y;jjGhh~Gua`A<;9c)&+TEnUUpI5;C``9Ib0S6 zXWHB5dF)-YL69YfV%Jisi2$~Xj5BWFQoJNIGcp2#E^swY%@HvB7c}Hk)w9^YEJ2cH z8>x_s1wxr(SP^m4*!|XBs_@SGaJ+`kP~Kl;$F(s3sFiKJchvh%GcDiTXyHk(UwVdaOR z(p7FZemw6d7*+iR=+TL5KWeP(oc{K(dCohtYIKhz`&PpB+3&!_@V;9Ox{d4!Uyz}jd^(C48XFNYCYNRrxMRrD~SpHtB@S`|R z%Kp3DWrfLo!O1cd8tC-qoy3!^XYf_3sk~X5o_h(og?hG+UvWd`2;18di~R;0z5aRw z_x#BCy6v6hymk#LpdgGt$;IPq-#HbLA>Om8WD*CH#KmyV^nCv)&&LpFc#XfUzzjIn zYGoN{jyVQhKErSH{$)o=6X`ewm*T$jL5TJ~Ezgo;f~6|B{Ky9JW5-D78{&}-rEl7Q z1%`j(`}+`L8?EZWGS^)HoyS2q^f&EL0_12skr`?$M*blzH^xz#Je?S2i%2B~h|J<8 zPD_=!(#za+um)0mt;R`h_4C#3{ly+zRx+oG{ivrjW=T-=owLr(c*>)o;BRMGzBF1; z?18b;Hhq3|o2{j}IaZ8VIpbX=b1GPVV`pzp4`bj%huW5h3Q?ty!-FB=>?m~pX2I_S ztGn)@M9X+pB~``BSK|rhqef^2IX{=0WT9+c{dAV>aSNuvS8+)a1gQ{&6a&adzUz+L4Zuw2Ap6XT}OHMNXhMm)=#M+Y|iPrg5(_3xbN)MP&VD&CWUOhB1_z_ zE%g>N;t#({;qSJwTJKJ7Gs+kQ1`A#)0e5(x7==uxt203IzHYIdY6glBfvB|TDK)dUNgsL=r*U$sk4v}zIZV; z;E0CH40HC(;o6KpO--$T{&XSppq)JWCu&> zjGc9mnboQYiDy636ZMC${HYhK+@J3*+S_ZB_hwDoFOO7K##C+11VC1NKzq3hnH^mm z1#jfgR24vkf%5UGvD#4p*M2zViK?Jq4zFT zLZ+=(bm|nLgEX6sKPpJc_?~HvamNRQ?$}J2tUN<+;*4bi49m%$>8P~MTT(@95MT!j zKZ{g?8^y|er7IkDI}PQ{aR$M519LVyEc+vNqQ5TL9+MOKnqw$V$xg!}$?1b*&d0;{ zL&HZf&4}6)Hlq0R(aXIhe=qm8|CbB!Nk1V9B?WZ2m5ok6=G%IX$@Cr1nTIr}Ry@|( z@5{@}o7hShT3aBIx#P7)fUkdwO=Aa3%3Fz&yNtLqv6bj$MBwr%aoTerGJX|UmHT}2 z@cXYHAKGrp@tV)_y}I>HJ>6w_*KBbomgwm{kOaEu{LH~tMhL|rA~@^PrP`I-T+V?8f8WW5SJ>cL%27vDRb}gxixVH=KAUC z<=^hH`{>u6Jbl_VXm@y`{RY2~b(|O~hZA$+*f*+)=$iJ|dS30-qekAuVMkg4q@t># zy_*yIE(&$<^f~r)!e%AZAY=j}BA!y9P{i^0ckjHcGRpKY4dgEon&}3*-X@7ZJ6<}k zpTu957=<}%r#^+p9;g>TCeL`YwZxpQnu!ezPldXx^L7>!sNf|@rxK-!Kt)g*sqHa4=1ogg70wixxt-xRVGYZDW8vO$H{K}f}1 zpo3Lgo9cQ{hGyoE5jA?5L&vqQE`h2?Dk_?~I>S}rkH^eqZ`?@NTwa>$hq5L-e$P_{ zfByq~bu}pg&EKRSt_*xZ8ylOhF2d}P%%7%4jr|}NnEa`s(JOO`DE~DgNLhv5$B;pS z{ehibPD;x3gc@S+RW&y~Hx`PGGUZN2Kj)0G@^`uff2brlbF4pAb#bvXG9ry=7MN4B z`^1mbsxVQIb%x_e2cR${qtpbq@#%{j`;x2RZ7aqcE*Yg}w zlp=dv33KFwvHKn*eS3z=LQ9M_Vy8)ABlS@%yJ8n}E-k$bZa_01lN~{tiy>0bUdCw^ zG00SixOW{m&YW;vS^yMqjAnT&cs!kplk*h2fdM!lhOBH>R+e-0^wV+G&A}6h3d5)7TINbt8ADh^ zzEY$@vX8G)X7`1@8cLW_IZ$Y_tj(*OJntM!b+w1^^faL$WpnwJ4jHNo(<96^$|6eZ6&J zqxP*tVYh&as^X2TqTg%?eT-$k3$gxSXGLF67h^YIx?Qmcb_$iF#RsI7h@PHMgyDH+ zX6~mM`XWebFWWr2q*>(=^Z+Rq?TDRhP`kN5HEt_K>CG<%;{!MX~pB_Gr(6>gEYdnN#`^MwGjAZOE1vMI^trkUuBU z*1yjKC~&WcZ?ZmQeqfS|Xu-sKh6fRYeR|=-ddCyo>;<%HGy>W7F|ihFSdgLFeBpPN zATTD`27X!mf&)yh>wGpd^O({mIrjob%8e}C7I3(JuWW$#)?)8QhQPDm4&DX zMBL2O%17XIwX)r~W>os;)G1dx``XxILYpe6Xa z;Zlu&@%@~ft!W9iCd{AK)@%q0P5HgD2qQA(u9OTiaRlSh9kzlNlMzzn5PXw;qm^i~^=R}iRCO&?okZEOQ zf6`dOWhgY3GVa0i!sU5=?c4sBD#1-@7Gb0c$;LY;1ot1COC|FScXi3!x#$?Xn)WRI)efO&UJ!j?240Msz{%M-&z^kz8R$Smh&!ro z(O0^EeO^aT+GbSVKL!f#voq7c#TpnI0$}MTVWGE=PyZD3^~~+;=k-tZvMjNxtCRX~ z9GP(JcsVt*$cW;@FOv42Ci=ozO|^DkA~=2AK7J)_v}5nuE<_`!!71=@GXjFKRZ0cs zMB4c0EpG1F7gOnZkSzGU9wB2 z-c@gzKAg0L2qyQQBXz9E(5vPeoQ+PL2PwCbi7GEl_1wv$)bMd1MtN3%ywRIGL3tc4^Qh3H8tI68oN!9k0m6awlDn)3gluMotAyeF<5cP;NajuNM9)x zvaxi!DsNE>MWm5{P{hTx)Q{g^_uU6@xIYIwoN7!Gaap=(Ft&LwSx|Y6VNLFgsMBs^ z46?uSplyi0KA8AS759S=kLaXe;@Y9vv-1Kj*bX73X&Qo*yy9FBGO4yxV(*D<@MX0H zCaH@Bd4&AAYJ~bRn^7BpzJECHh)k<_lvC&9bdv6BDt6@bZ zfRcRZxV#?>85zVqqbiS%_#ku>JBH{+Ydw8kDYuXOQUozeR#|b+;ysjN7*Hsr4OW}* zv&sEA_|?6i(_x&jl3oYGC5{=6J8X(DqU^Q!4kvM)BOUd4|LvSy_LXBxJ z$`~e82nq^jXJ_5j%l0%>_jg$qw%xm*+8rNS)sadDL`mkYgeTTHmX3pu&$gefe43aL z8Oeu7q5yETqh=Nt#VxubpT+j2swo&&!Zj!MfOt60GJ0;>{)HtK)y`#aQaWCh9tFT% zjS;V$wGV9=4QIkpkd7HZS%P*@FqsZjQIO(&qtSo6uGJ`$tHJw86*l@a~n! z(e%Sp(@CxyzJB$OB_w0EX*e5h>wwREVGCR%vS7 z)egP&qR_WLOLt>^npY+O?6}tf?J4%8wm4S6;p5_1pcu3-Q1LC?2@)k>zGoU$##B~% z=?xP9MA|O)W@q+Vfr6!V&x2tJrg;teceoQ}+%0&=hc34GFmEe0A-FFiPaN@3EsD+L z>BVGO74UPubO|>NDnv}l-*2qgl5G_LAqZwJl>>9L*tfilB}%&tfB!y(mK(;FCKQBs zXY}G5qfRpxnbn@DSgqM05ClkN#A1NO`1C5Apl)&I@N@%)MA;CMfGcpt1H?VAHWDL* zvV)q^6N@%rR{d^k%lVm|O;=N2KeHV_R8Ag->HV1ZIoa3if5*xM93#)*bB2H=an;9i zY+--0&(=YB6(*(yGYkDJEIgb|2vQ*LE9b0Iwjr0E2>{R~>iSmO}t)tqYSPP+BMP=nwU36#S zLH-$3lv2t*6!457&b{YP zOGSv(A3xJiMv90tn_F0bH32%2S7%r|uXa(T3$d)ytGB`EhK-YXlK?*^UYrM%~?P48T|psRUyTfL2X`IUFc|w7yqLm2z01_ijh0& zxzeoVPQ?WU%*4J%i!Gx_CCt(W7hC{-W}ZddY_LTDVQh*-8W)%cYg25mjJW=Sq5^ZN zP=vr=b~DTIU%ueP(_}l1U21k+p%N|Ov~+3s2Ds#v-}S*B+ivroPEOAbLZHlb=gu7? z*1M050K}G&ehgz1Zq&`6B8)oL1c6GT$dCq$y=H_i?^Jx&#Ugi&}hx zMYLk5?cu4w$;;mnmIFn^T}6$mLr+COBT^q-LX%1Fpj7R(PkZTb;ocry9{7wWPb`25 zz;B$tp1kL{u`+7ao56SZqWVkzuwA<-}>XR0BAKa6cy_tDluUp(MzZHDMg zW>Gf)*})AicSv6+=P--Ecr__+x6&T%N;uqWzktr@v|{AnYnl7;;Us^dbyO3519>NE z8CkJagu!gBDx`9sUk)8X8QDxoy}$(kKw5#TE7uQ=nw&&lM%X+2L3JD3Oz@Gr@qaHt zW<+xAJ4YXGUWHIN^(4h%THrJPS1H#jwT;h!?(IM8`!FG(nYq%Gkkmb|S8Pj$Y8seN zA0MC2l@IhXPcyY_8^`Wf9?)2_o;N5~jTgaRza;giX~&+494E@X=cg#{N8k|tgL1d4((Ul#_Msh4-5 zL=LmE?ploct4K-BRvYhdrLob_8| zwjGa`@WbJ7PAk2$Bd5cMC{8RC>Ve01wn8v=mFho!m8zl-flqlzkg4_LG15|3@Y}a< zlqetiUwP{kICAuIu5@vA6%l^VaUFLeE$vx{p~MQ?y92_A>DgTSJuk#zeoLI#>=IO@ z{QSiPDgIeG>bDc?GD)Rf{L!Z_jAG4h4%L68021gu+A z?TF!0@yDmLFchGv+x+3)zNvrAuVYw{q(467;vJjs!7A^l7quKkt)N(^$aSR^osEuOo&ywCse?xKIKZutU|SGoDq^Ll^7s-HG%GTZE~o*LY0 zJ$+r51nrXUFY7_5z<2#7XHw!j3K$AQ&2lFTm0QKb!xMC&mDokn5xPyCy57cT0;)u_Bbjn6Mh@ zERC!?{tYX*kt9}~>-n3qeq2T6?`Lk#+cdh4jg4pa`y7{g`+!0xpY>Zy+jBc}E1g_B zdHIuAYAkZ@b75p$TwG-2^jtpuc?O0k0mGZSj}g-OLQ%wjI3F&p@;}%wRsVDL(xr1h zUp5!PIToh1<=H=`@flYzo_4ktT6clIU}|UAm#W=PaXX(|^()Utd4N>GsWL`}O0yxC zL|?r9st3v)zAlS8z37c`&eXoy-`^c8>{#?&Z*8N!wKZJbojOuwU~7-DpspJ5U7{-JQOwWSv_Kx5c)P2qjF)i z@>@Zd%1TMsl@Sq#P0{K{e}v9IyrF$JI%4BW?JZL>2D`f77h`pBo7*-yy_GJGKFG9~WOobr!$euw9Aoz}`L<5-aN7RI|s> zPVvWSeKR_Uu~sYBfRxF*jz;W#418b3#>m)C!Y{T9*-U+byCthUw$qlrBRXBOU>vgVb ze%a3C9~v*=va6Y* z{ayRmSuXTGCwGI~b?6o)per^?9k8^Z@e`e?vllmv~u$ zW;xt!2>+mYrnPKmLBeuw6%>fHPv{aGpwN(@LI2-3f6Yd@bMpQ8^?}?Ry}k2{jBE(^_W_rsJ(i}Kb=Iih z-k{Esz?CtRt94L2M`AxkPgkbhsY#cqL5@^;EX&JTX=2|P0-oJ{A$tW8Fi_?N;Y;_6 zfrZu1=XmYmZj1H@%#PhN**2v_3Ti2riSIaS)b>1RJ1)+h65`qG!qvG}zt+#$yy8$& zR9WsUH-7fe(fh4-uCeRfaBKbOfXEfmrF8}lanDU1FJ668=%;8iJ-xDLUyqWlZOWfN zotOFw+WT{jeU&1rib_h{swYz9%|EBVe3^uiLJ=xL(Rr9k4eT3P=tIZ(TK6NJtmf<% zajynH3;-$pLB!Xux1H)NDHugu)e<1lP~<6|km&r~nhZ8QtnUm@K^FQrx#ZO=d(_7E zvKntO2Tr`9uHNsibu&esgOuJ|93jTu?fDcFj$4 zfFA3%w}4v4iknm0G&#Q zIc8~%I@fD&1w|clSu>b*V3bpDgmXVsOa76Ov7Mb{O7C{p#kkU;G%(-3^!?|`ztHEa zPqw!;&G)4E%MthAp7smA$a;Q`jo!<3zo+SH!-w|fX6vD{-VN^jrS`s7W&`H3r|C(p zY6;QNVpdB&Vg)}M9*pFtA)$~jSv~wcmn*5dRzBl8uVbmHd_i5^4*fMX!zvqlrx!jy z{OTuCngi$hmIENO0^54)aDO@~*JybJ{W0JIztNv*2f}b!zV~tl_+#%!O6T+m*h2c> zJOwwUg}>?ABMwV;PwzTw5z)CfQ7mcCg68KJvyDn6MQ?rMh(5e`u+4_!)4z9r;yRC` z#R2BUQj!?~9~O2__oVF&7?RuD+w<>Hxy_FZa_EcG*hDj)ewRjM3{kqkC~5N(UU=6% zb`_qxGg*e%+k(7;9EbZ=h7zQG)O1i(?hB@f7YH|O=;k37nc&?Z$9UGT%+tLk?JUHH zH?(yhIPLwxq|F`3P?9SPB5{uIg9^HR1yg}M*M6%7`vl0UN5UNo&9|$)25LN$JxCZr zchokA2DnL%{+#CZJpR_}_*;cwri93N!)n{?<@mlFyyeQ$=UAx!|86c~6+hUepztp$ z@to#4D-{s9MNMTQ_yPglDw}MgocpAAIZ_@7uk8xwp^yiKK!b!DJd~AlG|NL;^)bZN z@vCReW~V+diF7s~M6Z+#eDyjAOv_8N+{B$$@jNbBaVQ^hIVvHcea7JN<8RuP;s<-+ z{ml7>bOuFziY%{gB8MbguLif=q-BwOgePqr?)>R}5V1OA8%3zhvSDR47&dQ<);2Hz zd$haT)NP2`##r@#3b6CTpLyB$)BAY2@Uldu*G@=4(aNwHoW$p|cKQ@ia|g6_!r$Ii zR>EK&=!*IA`P$j(shRDiZfs(?MR|x}SXg-Abw0jIV6^?~A&Kzcau1ICQ;}oB&Ry&} ze6HU0x*A9Xdflnyd$dR_+zM6c|t`I+xi?RblR zUgJo2!;rxBi8e!y!Ac8!#a_@q*3Q!lTVov;;J+&OX?73yD9wKii?l4vCU#&IDe9M2|Y6`#vzU#SD#g7 z1*9S+F=rHuTq&4sqwmZP2#~Jy;NiKhBa*kiX~}ZIMb4)5=gI?)_g=ech7J7GOK}yR z$3<)gId-+{BIX78Y*}K8ELqtSuB6AGX!h9LRlN7AV8D^Fa1qCK>-%1O`KJek?u*;@ z^xXb;k-+%l$!G2D%O7tWL6vXMEssyTuBqd|3+Z7Naa9`q(9FQ0^w6yvOeg-=M>rin zDWb;g?>`W!MN;_PEp~O$FR(ivn`oJ9RBX}>pFV&&Y>yR2Zf#RqO)z&9$yyY#ojH0? z_sk+tmA~J{=KIqIGM@~zgeo?O)%(7RMN5o^&eJ;Yl$0ur!)H>JbnE5*~>{l?CvRw1?{hnKhLc?ZnG3G zRiPAWc^|xAa{UJj#0Ijrsl6R8Rt|d?q<>t3+eP3}oTTkW-*T=IR`^Z<+zLvU%_s5o zaBD{iiM^sIqJP?@NdEHZl5HX=lVCxi2}MGyeldI-YVt*F;{s$gD7U@f_*?1VWJxu@ z1PA0-1aSD^8wesUbyf6&D+7rb&al_A70Q)oTDB$4 z*2M^IQd3ziKFzi=wc#vMl#4ZVdd)EO*8>S!^wXD}W$^{p&s{i6ncdqPTO1&8Fm)tV z?c>Bsx91VBcGGTO=-W<8rpFE`XOzyJPHSn~_NvY5@O=ZO)|FJFwJfeTC`xrv@&oJU z?mrY(odqWL_G=$>9a#*9ZCDNDL*uVF)sJ^~^_*vMY%?qoby~dw4RKem)?R3pZ8t8t z9&siVVG-)r(Vb^b5xNg(O%LD6f(8AYtMhx@fpb}U ze^%(;{rlAcozH>LXxpDpiB1hN(#*-cfZ_iy7eKd|{jhJDI=1MhalX=K*oS}x{Q>X2 zb8Mxr`GHe`JZ8+P6NjA?(bJ4)^^WWFwG+?mW)YLS( zhYU>BW8Rb>s3!1U5nKak*{4s>*WPOQIvYe`vgmJ5z}}(~bRYb{)%;nIN)SbO`{a2& zyjM?8VZBk6T7tBMBf+!(a^=9!89p5+0iKvvcfz5se$n!?i!;qp0-uFxY$cqkn7lLL zWC_#o4-AMwdLwuj6Hvj(U_YCanEsn|-2bAVJ5ju?qsMgby(U#HaL|7>Ag-?)^?XWh zfP?c@3eA4)S|9wnarH?q5bL>09ev?5C>z5P$3C#8kQs1_}l>w;q{Jpd5LJrl!>p0FL=wFgX7VLCwwUIk%od(PzVy>i#&FBJZ6+S3`8>_3E+Rom6)tCp68yrT_k`h=crSKR84^%3A@*ggt zBql<9F~o0)wR`SG%N={>yUW}0WtU>~D!f^_U3TIn(4DYJP%1m?N)XO-G{Bg%*4{D` z7Uf+xdV24bVCVGh+xd3El`v0XSDA)QOxUzXC-FsQUsmjG6hB$pLL_w8N90bt)`!$k^rIzN zm+_L*;TEmY0?$ijb|r2L3ANT&bEUo9fRMc9i%>&H&)a3aww&PBY#Sh)qQ^Q+!uP3h z-qPL^=c`?c@?FgjZsEgI)nGf|JeppdnMk=+)NhN=Z|+R#9CBT`XwMpHauIYAoTnfa zVAFqr@E{t$=r`YkX=u{0xajwCuwtus*wGC>V=?kER0jH7LRHgz~n=u9`RDJHphTLV$8>| z)XLK8HUO-7&DvnO%biw!Pp-+t6g%u}!sChB)x2Ov%|cCJ`;;NZe1u4G+waE(W)WMH zi!noOrklX#IN@*$8OA4H=>?^3fzTL z@3k9X@&&9BbBrG6wJOHgjh)^G*f+>H12s~SBO$kne=hfJu%%GCsCLE#N&OW$Fu-%C zr1INH-@MkbF@A)hN^jOCD z#b(KA8O$9_o~p941!85O*m(01w^IE(?M>5P1Fcs1^JjmsVMrtd3 zC{e!SXVSuFi&NGh&4OL}Ir|ni7m$P}X$JGM)f^^k&ST`;;Dd8?`u`(i~Opy4W)Q zD&uJ<^m$ZVbSaI=AuIv~q2CS`qw-aBw5jt=0JOccNqMU$`$?bmHLQw(Y0MDZ)f0lX za&<`kU2-t;!t6rp3)8(`-{48^~dL;qLLTBjtK} zI!+561W3~WL2{`zk^(Zuu%cS-{&di+>59TSI>)%`y59Tn=RCmiGpBrddQ*yh& z{1I0Y+~C)np*ukCF;Cz5g=Cho-;|@nFM+6EfK)?NuH&?jKgCRmFd;mfuwfs(@koAMbn9c&dF;xjYN%K(X4!4mH=)h zSHv9z^bIHmk~71?0OQR0VEtQNLt|@Wi=BhfA{F)INj@zb!-WfW17+`O$IqWX4`US8 z1fQy_|7mUF;@FY5(=W0WxXA-k#P_xUsy#zlm27aIv6kP$%#51(PFi4U!;~U@L}cW^ zHLfH*A!{n8yWhNqgh7*5hJ&Zp+yESAu$jdjd`i;5-R7 z71cu-1v7g3C&1o3c@hJqNaY94ix)jf>(jLjp{J3fg~)!t0LTNjGPKdF?cDdyJ}ED< z6=eze^eHhTW1&Cy#+_{|O$G)(6V*7$$j_fgi<~p<48>1#i58;Of@TsQOf5`=ecAoW zN%bzOCa2J@S4LJ=R#i1ew!Dau-!H%U-Mha79~!Hv$;nMG_MacvIi;+j;Ye6wsv0#i zrHIo=ZKLb-u}}8$s&HM#4FWv8yXym!OyEMjp1%4rG#nE_r{F@9g&9*-L9q=UA{~>zQ2{9Z}-^T!qM5;gpFeR%C(~B{@Y6|l@zyc=TIAZ zR#b+tN`HfUe$vt`Ei4ZBZ|A>>O!-^{x-ap-i8PVY@uS+*RU#$9(Q@cO>-X{B*Z#u5fcJs3*|UoXNvr=6jQ4 z;ZpJ;Ik`Y7=AxIq91Dc(QK|9*?tR8wBc{Gg-c7mBd`8#5sKIy_d;5G)%X!8pPyc)x z4{CHG)=YnY%V40$Gi~H-= zo=;6H<8SNC2>lvqO#5{V4T%voH8t9p%_VV8GiB_WnNe6|(09k^jQ2|PYP1}8gl?;< zk~mWg2HJ1zd-OgxWz+h8H0v45P@%C)@laX0zpu*_0hM&|{Ap{Y_uIwX$uN5*<^6$m zUd0ex_)Px+LP^N&ix9Ys006y+TwFrwFgB?L%&ksdv;Nd)bO)TLQ{GeU8) z0YF}Bf+xq%!aSYwePn!w_#tLV4hNt?i2?tC|3pKm;u23aV)W1VWQ|DTxAgSrPto@u zw136wRGDg8S@HNc6Td{<+@GaBc*OxjY&g`PXt8sM<*<53y{d7&7VI7BN$27J*WOpgMZI?I>bABbC?FtGN{4_bogzbbj?^IC z-8G}AbVy4KNH;_G3@YN#-Hnt(cgK74?7h$Pd_C{^o%4P<_iw(8;P9Wj)>_xP*0pX& z05A@8CM`S7S7gu@g z9S|~p(}^9mdj(LAX83)f8K2`*ZB_AiB5F2;6!&{4Tf89^rsLsM_4_3h@WajCiHeFm zeoCd6Z>NF#S?=sq469%7t%(Fpa7L0{^R-CwTbKHpR06>24f>+dfy^8nFt0Nq_vKB1 zcCnAU*^E?Vfnt)KrH=hAyYB`kJPeX*wx%?alaF{OFwX8~X4wEdp&Rz^H}8~{@lY?9 z0!J$h@J?@p!~vv+IACY?EC3)r_f>a#F5^2lH>U<~KBw02eORwMYmB8x^P!2OYC76L z3+zzm!sMipPzk7ZiHl>rn7;SdC8Q{?Ox7tt&#bbW%q(xb{dc?$?s7$I83x_70gzGxaL`7!qb@*YCS66C8ZE+=fu?SlBxp z=o|G949I{FPYMD_z9#7ifIFOR4_d=yZxhBoh!^Q%W@c__ZwH}92^AfikbIHw5+2R~ z^4sWb;84-D$FF%@Xoo^o^n>^Z347np(?KQRheca zSxbWH%> zrpteZ2DC5qRp&$j;3uZwe9*;pxcGb=WQQCKWmMjP7ZCC4Ax%(e+R0vrnc*Ha;E~DHXfBfPSQeB;2?Hc zn?~6OxY-8gHf(4O<>`P9OtEKpPk4BcXD5Iy6>a#CAON6QF{!DXyGsm&IIVtH`}r!z z$z`Wl&Fm`(1B6&AcsMFiFPlk!#c$$QVT$K8e~wg`t^j1pZDVAtrE`!o*V0k7G}GtD zItK8d9Ql)@rSG-2wr{Do_06PDF)$KPKKH@>y79`rN3W5PdS-(yajK=|lkYa6ZUK;> z2RBJuO_hS8gkO^Xb>d#IF@VdF0l4=j77xh`9yxpN35KJglDfLqd%=BJqCK2gPiJMC zpWiFVHd6`s>ieZTczEjleH|Tg5;CW^Sm5W|l0e;9Lc;iaX5JF#X@+40HLAj&=5X15BK41;0cbrR)E7r#p2S^iq8+qnn7H4 zke+_|gm1QpzF9m@${88kZuCe%7P+nI2#g8<-kQ+JDEY$y_{FS*iG~XuAC%UJM%e4{ zD-776^LB|OKI^dt({aWW>aMPEo$2(tS3lfRJj=}=kdhKcR#jt`7oc>y1`$q94 zljgb4t4UC#flC*Nt^sb!-YEh>O#X(PT7s79Wt-*7d``=&6rJ8e!-MMq8ufI=GQQ?Of?Y<4a^L~SSP!L}+ zjMm@La$Xh!{LLzxNhJpfF)^C7@oQmsSDKr#4$lbl00M;YzMGzz_VTAwyJ>Hf>B?~NtA8byUpxaINl9fXhQgB* zWD|08e}7GDT76|egNn}S1_lfC00r27+0Gukr3yIGRztat%N^RZUdOAWN!1(4lvLov z0_P$sAwd>m-fi$kowcPMxa}`Y(N{aWhrPQo*X}lf;H4AUxY;|$H156*5=K`3hTPoT zR=-zX2vZZXu(ApY2$m^N?r-e_8#q>CDSucr4yOF|@$hs$>%|412XNc z{D-KVK@?bWkQ5+gKVxGPO7e{l${W-@0+g#>(7Mqg9xkJOLn?z~4XybP6s`6CLH`?0j+TZ3?O|gK{lpK(Y%f z>T~!xGP2ZkeBUfhF~|ZWoaHZ$lMF#ijwS$mFVC$pROzMpWv>3XB4z+gG0zI`L=Cy9 z_4+9YI^1k^N(-hizSWl`7wPb+kl=lbiNL1WmgnmHoSdn?Lnq{pXeArz*mQpk94s6_ z3!bC{V@{ZXU7U|`)C*i2^z!loYLATRr>CcE!^OnC?>~>clkg{d@Bo<0heHKeV-IkG zK!C3WRyHduHZn3VJ6i|)6$BwBCtZ^uz5uc2>a*WVE53lLwVF&xJ63%$Gn;|^F(jvk z1Yp-F8M!R2+t=H-@6e_LjtUIpWxG4F1wb4wUf$hQMx25nc%h)oELAO(P3LkU_T~X!2B+9>V0o? zwQk!@fMMRIrD9AMdw6eLXviNwIf$yR zo!+wG#{mtm&6pD)H~~y3g?im6CqB5Sc7#|3+^T*}Pj$&W3HLPRJQmzF>;TD0emTWeV(NDogp_<{vt@y&il_>mWXw8RqcB&GWDbd>6dZ*AQM zxCNQc>*DwEvGMWB5F8H2XXkIw=ouZjF7JU&d~@DsPg1B`tpsX5m4I?J%j$N+jgX_^ zFjLqyP$Q&YRrZz(IcT|-gZvx2#0WT&T*D>n+3atc#y+hXkpWIaXE=X8A z;oneeBVkw&en^)3HT(mJuP*QdZw3$d>B;U&s~PE10IfTn>wMO|Y0d{%5Muj+jQq?! z*aBILkRkXxMX+2q_cu;5sumph*)CvJ)(5cZw=<>0jHqMp1aLA_V0&FuaZFDXdY1QKl~X)Cjy#VKfufPi z`aq;23lr9qlW=c0-(IJYvGH-^#@lazTMr7D@1IJ@L#546M^u4AUowzQ3fQ*=N#~MJ zAP<`YoHOxYqOSeW1la;Ow=V`1p4%QxX%0GQ5X_)U!>^OnE@9_eeWm zRiX6PP%06i5893ut8qP1(ie2MnP1dV`~HH9HyneQ=6mb`h-f>D9S`vqU@`gWZY+s08wTfr0g5L&gw9+ zwld{FP-J66YKlS#ZUiVa`vDh!mMEu+;Z4z>9PPvd#PNP)UE)~qf;{lQjW_0x&zk}) z)frncK)4af{t-LJW3{R|-L?;IM40i!c&YpQBPH zb*n5laKtmeXL>NU*0jr`=oJtRxhWNcP*kVh>SJAE;)s*!bdYAg#l}RHwxqUaPY+Om zb~jf_A|j%MKmd%WC@hj9hTt+D(p$NSZ>E5xl@}sbrMmY1);%NO(E_-Wb8H17WR*Z( z3}nQn&)a%9M z#C*6)OO*%+AoFkRPe7YO-kNEEgaP9I$*lmpQH=3&=56q;O$@B28?=89$2<@-pphky z6QGA<*GbpDz6#2sdH%F?Qj^(+hqi~l z64jYS$w*3r1`h!MfKXUl%VtE6B(}r#cLoOreuk%NWcXtM6L!_N-gJ2cV>_6yIgxa@kK=pB&-@ly{?tp8r6%Y%!)QPR z4L0Dw7jit9^6fY85-4$xFOUBG?pM8t@4ih-i7K?I>*A|0 zg6-nxGk&0O#ela26{cbC2aXX3?5-}_=?GQaa&a~B3zl&u4|YVnNpX{99UvGy#pE$4n!%bQ^Gh6Gg4N{A!8l+&7cTD;zy`XQ&Z%B7i!y zq3p$cuN(gXBku^4J}BD-QaX|EPdXJ8!>NS~?d=botIm$Nd3dJdmfUzhrQ0C||GaUI z`{4Gg{s&~=6cd$_qD5GCy0mz2&;IUvP;vB%X-yIJcH8PRP5TJww0;{SN6x0E z=9kFJP^e{N9qo7c;*;pqRGOKMgZ|)XyOn+9YKNS-#I1Ytjm%oX(+T^8n2UG6?>~Rm>_)FlNP%Ve^%tjU>t})Xn0j68I>Bc`l z%zb(v^o06*{13gEN4VaA8*oLWz%bP3PjJNX?Rja?No;u}TJaj~nCpxM343SH<3`+0 zysPDK-^9RcmvJH0d$hC}()jBq8LZJ!aiY%O4A@A!=AGIJzoN+rakGot1#u(q(h8Qieji^g}lmsJnylr2ATeh&u zjW5Wz)&1ZgKyub5X2p4`;OBa-iA=`MIo3{0pWgqQ$$LorOV9VQTHfmbjk8k(g;n-?vbrz`gytBQ1E=sNB#_N|9 zsLuw}7shYOLv33++EU6*nrB2OftNlzywuWK4kjOD&RE;p)^vDz3awT2^nAAUM&`^p z`6=@?B^rGT%$BY4-Pb1(o0~xm4L(*nUenabL-(v8b`jd=f~#Kq5m<*>%4x2L zOuPCHK2gW);#$i}^+xEU2|kY5wG;^~S!eR@#fGj1eGM5flHcZX#1KbvKe+g~tVkY# z#(JM)k>w{}doz_&D=WE?Yqm|rKwpqM5j#gE;wrkor4FE31ZM=*2|;% z)O60p<`(2tTK87C6+QB^rpqv<-M}tGhkcU{pS)nJcOED0<%)X*<_(aZD6e>C3>ER&Uftf?1U4r> zFMo(9ce2vg`Wrsr6kb30zFnCVhQC6vI#>xvXKRZ{GStMM_}fC>Tfxbc?n9Zqo<~Oo zymm`Y0+0tgzgwG_x*5YC6{Z(9T>NJ7H>}aKyB&cwqln+!AHnU+1>74L%zJe58|S~~ zZKgoUza1kqootujuk7=aXRbUc~5O?L~5%68s7#97a}3szckWQl)R?!eAE zz?zxvu1!Zb&DxAsUaV%ZQR(my+x&cV?B!eU{*;wfr_%AHs9x2tS^_NkoIUIt3^b(s z*YMjUCFI(6+R@O|0EnH5Y%((Xg!Md3I>VomKpIuIzS?TMTL3kN>Z3h{X4g(IB7&s{ zn8Ex!1626Co<+@yN+TK(aK=@`+t-HDT-OqLU=86=O`z#fMNg}bWW|5lN%KQ=F^8;P zOOEP;g{75=`4VI*0!S5A<=YQsdp-k{Uf)&RdU|H23D@LN zR()|8OhSKcXwo|s<5QGg#8U!=%8DmA@f3cs=A-+mn965&+|V0sj+(9;2PPruE}tLx z2tm*N^wx4R5zk|z_VsJg=A4PO4z+LoARk}*mXTxEMF6g%HaR&^9OCH8fkr$#@2qcP z>LOSk*VmPg4y@qjDP-?t&}0;1Vgf&5TrY;ugQ~&h)y>0Ed0MY6!LH`sl&0C-{9JzD zkZ6ntiM_41fud$?`vR|>5Baek@_}#TLmy}!IxsLyM|-wBxSJ13 zXB7j^l2am8&FW=;nb>@M=8KH`5{o5MX|cT|ssm{P6QB?ks@bS)EQY?;EOXP3MC?x^`o; zwIcK`lqq2G$$5gdHjwb^U*a?-2E`QPqpxq1GSz9RQ9%X=hF8YXbDe=Lb2*$EsBEz9 zN>tH;3EHDrC8U@uN2p>(X6EOF*v_i=zvD^RkxjFqlmkqwI)}?)(s{8 zz8gRs{PsN0S=W!+ zhgVSm3bk4Ei@{7Pw9Psl6?HB+kWyZdPi<#M($3!pcT%yn}_@LnYm85>k3yX_ivV>SS)QEr1ceD z=f7YIcx~!|!(UKZkXaTJ8}sV@DR`;%_wm_`6FXMt$7P%G=p$P%e8O%bii<}oM+F3o zRvyRI=9SjwaYbP3$sO(c!+r706ngpw{@gz>yJqgkPfzJctSd;U**}OIsJcPe%+R1; z@0kPU9VC_|LpY#K!3)bKG}MHivu$BLFAcQ&{3sCCaXdPn!q~gP0!kGTA=Rp!?Uj{~_VK5y*G} z(0X$)Quq%fpTg1PK9f zs=Qn+5sTkV_hZRuqQ%gPr;lrF9c5d8k*tW(GZ05s#bwtevPy&|1Q|+c4Mi_;ULqzA z8?(fI_8s@@wQQ*7=jZR>g#^pXU6*g5B1d1e$nJkE;@Qn7$G=34^b2$s$bC?QL zorky3dv0H!mX(zwyv98hd2FSDQgZ1q_BY(#-Z>(+0b(tl+oz^*@vBYG2oKir7A)`&633!~DtZhwze zzK0usA2`K`p%FE_iC6=kN#SzRZCl!1YIAX5&JEt$M<-7-2*?9wyk~yrjfPw>{^BlqwqyHC36k~>BXmHM zAd1l5v#RSN;2r+HaX+#g-MMne=S+&qO)pv)&*Y-8oqxewIR115aTcfF%+L(PN3Kq# zoW^&ww3MqhvDXtk)kVu{O4ec$wu*#Qqn4l6Obp~s0mtD*d71T458nR4vGfZ!8|Tdt zTmoJ^U?&USth{dU?3GyQaBRV4r|!$a%0$o<<14TD$|x#LJSg}-MvSFg z`d#xBw=_hR>mF({^r4W=+nMj79ff($@lTWZ6pyblU)X}nex(niS^Mjfq;fen8mP_kSmJUGO9=9s4_G}f2o5`6v=5@Vq7UO8%AIA1XSkLvz*6a*sh z@kfGO0CjY`U|)iCnh?(Q&JCN4v5;0%DzrRj=f2k;JbKEB<*mD%Iu1yWyGUPI))y=} zCEVg#S6RBh;GqHowWia&Zad|66q9908$G$e8N30oa4j%;-v%AlnCJ?=g7@O$VV zn0p3)KA5H)&FuCN-JLm`gLs+oW}AX47e=%EgoEch$gj4bW_PYvX{ z(l@KKSiDD~{U~v{QIb5{T$D`&->={Ox>g#UcT|10z<4zB|ioueJS?8&;-(zDZ@^*4WnD#6)63*UAhgx|Z}u zdCV&I(sG>{hXZ{voy+l}SGYz(`?hh;1e4y%T(TAXfdda@p|NJiJt-r7J?4@#mo0n$ z8k^?)7r_JOvG6VyT5O_Awoo36ni{DoS=2!sf*u|%ReTcy;o*^wXKq)=53^4tVFr7F zSv0oe`jmuGq53hwr~RRUqbnpkxu2z%V11+O5C}^B_o{rN>)r)!Zy;;1JWv|K-ShD$ zHzREud%C5e3ww%Fh@AQ&Sv)*9L-SZ%H9Qb}BrHeG@HR{5p>)^A3mIKWD~i|~y)XZH z#KRXJLm6T0L4keSE$(cJoAfz45QrWDVek7VCeS$=-0171nR=gQ%m~!sNmESr!3#!? zfMO;Ur6-nb>T`8jH`wo`MTVIa<@iw!4n0MdC_w1CdkP-Z^#xd2sF+=~?2Odn;s~gS zVfIbj+}=HXE*DSm;^RMOd8YeI{!2zdlXQu$N=xx8_=4i8WkG?v1F{m4)V{}vHa^R; zMay&vPR!}WaJ)e)Bp^^GMV_4?c@C7Nf+z8gJoC1QZN0Jxl^nFPIy(e~>%d#KP_Hvlkr=xO z>}pIWqMr1T;4S#QU+*+9`ZC0>;R&^bvRHqagW60V_GwTMm35>u`y)qxwH;=jx{&ME6|2Xk%hDW!5Q}QJ-!0aC-OpRE{syk1~6pIT`vE z69SK%f|mihY5!hRef6>LLI^PuchSua+e7E z5+w+DEUm2*y<-JwzPy-Z$QJ8~^iN3_43SNd$Na3w@fB!``q1?3m!0|lLX+QKQ2zTO myz)PUE&qG1{vSTU`K=n&ka1>?6Q;{UA}gr`DSq|F@4o;8EdA^N literal 0 HcmV?d00001 diff --git a/tutorials/katacoda/thanos/4-receiver-agent/courseBase.sh b/tutorials/katacoda/thanos/4-receiver-agent/courseBase.sh new file mode 100644 index 0000000000..f9d5f65609 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/courseBase.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +docker pull quay.io/bwplotka/prometheus:agent1 +docker pull quay.io/thanos/thanos:v0.21.0 + +mkdir /root/editor diff --git a/tutorials/katacoda/thanos/4-receiver-agent/finish.md b/tutorials/katacoda/thanos/4-receiver-agent/finish.md new file mode 100644 index 0000000000..2514410157 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/finish.md @@ -0,0 +1,20 @@ +# Summary + +Congratulations! 🎉🎉🎉 +You completed this Prometheus Agent tutorial. Let's summarize what we learned: + +* Thanos Receive is a component that implements the `Prometheus Remote Write` protocol. +* Prometheus Agent can be deployed to remote write its metric data in real-time to another server that implements the Remote Write protocol. +* Prometheus Agent uses a _fraction_ of the resources as normal Prometheus, by not enabling features like: local metrics storage and local query APIs. + +See next courses for other tutorials about different deployment models and more advanced features of Thanos! + +## Further Reading + +TBD + +### Feedback + +Do you see any bug, typo in the tutorial or you have some feedback for us? + +let us know on https://github.com/thanos-io/thanos or #thanos slack channel linked on https://thanos.io \ No newline at end of file diff --git a/tutorials/katacoda/thanos/4-receiver-agent/index.json b/tutorials/katacoda/thanos/4-receiver-agent/index.json new file mode 100644 index 0000000000..3c9e763143 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/index.json @@ -0,0 +1,51 @@ +{ + "title": "Bonus: Using Prometheus Agent for streaming metrics to Thanos Receive", + "description": "Learn how to use Prometheus in agent mode to efficiently stream metrics out of cluster.", + "difficulty": "Moderate", + "details": { + "steps": [ + { + "title": "Problem Statement & Setup", + "text": "step1.md", + "verify": "step1-verify.sh" + }, + { + "title": "Setup Prometheus Agents", + "text": "step2.md", + "verify": "step2-verify.sh" + }, + { + "title": "Verify Setup", + "text": "step3.md", + "verify": "step3-verify.sh" + } + ], + "intro": { + "text": "intro.md", + "courseData": "courseBase.sh", + "credits": "https://thanos.io" + }, + "finish": { + "text": "finish.md", + "credits": "test" + } + }, + "files": [ + "prom-agent-batmobile.yaml", + "prom-agent-batcopter.yaml" + ], + "environment": { + "uilayout": "editor-terminal", + "uisettings": "yaml", + "uieditorpath": "/root/editor", + "showdashboard": true, + "dashboards": [ + {"name": "Prometheus Agent Batmobile", "port": 9090}, + {"name": "Prometheus Agent Batcopter", "port": 9091}, + {"name": "Thanos Query", "port": 39090} + ] + }, + "backend": { + "imageid": "docker-direct" + } +} diff --git a/tutorials/katacoda/thanos/4-receiver-agent/intro.md b/tutorials/katacoda/thanos/4-receiver-agent/intro.md new file mode 100644 index 0000000000..51dc893b8c --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/intro.md @@ -0,0 +1,30 @@ +# Intermediate: (Bonus) Using Prometheus Agent for pure forward-only metric streaming with Thanos Receive + +The [Thanos](thanos.io) project defines a set of components that can be composed together into a highly available metric system with **unlimited storage capacity** that **seamlessly** integrates into your existing Prometheus deployments. + +But [Prometheus](https://prometheus.io/) project is far from slowing down the development. Together with the community, it constantly evolves to bring value to different network and cluster topologies that we see. Thanos brings distributed and cloud storage and querying to the table, built on the core Prometheus code and design. It allowed Prometheus to focus on critical collection and single cluster monitoring functionalities. + +As we learned in the previous tutorial, certain situations require us to collect (pull) data from applications and stream them out of the cluster as soon as possible. `Thanos Receive` allows doing that by ingesting metrics using the Remote Write protocol that the sender can implement. Typically we recommended using Prometheus with short retention and blocked read and query API as a "lightweight" sender. + +In November 2021, however, we, the Prometheus community, introduced a brand new Prometheus mode called "Agent mode". The implementation itself was already battle tested on https://github.com/grafana/agent, where it was available and authored by [Robert Fratto](https://github.com/rfratto) since 2020. + +The agent mode is optimized for efficient metric scraping and forwarding (i.e. immediate metric removal once it's securely delivered to a remote location). Since this is incredibly helpful for the Thanos community, we wanted to give you first-hand experience deploying Prometheus Agent together with Thanos Receive in this course. + +In this tutorial, you will learn: + +* How to reduce Prometheus based client-side metric collection to a minimum, using the new Prometheus "Agent mode" with `Thanos Receiver`, explained in the previous tutorial. + +> NOTE: This course uses docker containers with pre-built Thanos, Prometheus, and Minio Docker images available publicly. + +### Prerequisites + +Please complete tutorial #3 first: [Intermediate: Streaming metrics from remote source with Thanos Receive](https://www.katacoda.com/thanos/courses/thanos/3-receiver) 🤗 + +### Feedback + +Do you see any bug, typo in the tutorial, or do you have some feedback for us? +Let us know on https://github.com/thanos-io/thanos or #thanos slack channel linked on https://thanos.io + +### Contributed by: + +* Bartek Plotka [@bwplotka](http://bwplotka.dev) diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step1-verify.sh b/tutorials/katacoda/thanos/4-receiver-agent/step1-verify.sh new file mode 100644 index 0000000000..5143a53c61 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step1-verify.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# receive +curl -s 127.0.0.1:10909/metrics >/dev/null || exit 1 +# query +curl -s 127.0.0.1:39090/metrics >/dev/null || exit 1 + +echo '"done"' diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step1.md b/tutorials/katacoda/thanos/4-receiver-agent/step1.md new file mode 100644 index 0000000000..465f2974f8 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step1.md @@ -0,0 +1,56 @@ +## Problem Statement + +Let's get back to our example from [Tutorial 3](https://www.katacoda.com/thanos/courses/thanos/3-receiver). Imagine you run a company called `Wayne Enterprises`. In tutorial 3, we established monitoring of two special clusters: `Batcave` & `Batcomputer`. These are special because they do not expose public endpoints to the Prometheus instances running there for security reasons, so we used the Remote Write protocol to stream all metrics to Thanos Receive in our centralized space. + +Let's imagine we want to expand our `Wayne Enterprises` by adding metrics collection to applications running on smaller devices inside more mobile Batman tools: `Batmobile` and `Batcopter`. + +Each of these vehicles has a smaller computer that runs applications from which we want to scrape Prometheus-like metrics using OpenMetrics format. + +As the person responsible for implementing monitoring in these environments, you have three requirements to meet: + +1. Implement a global view of this data. `Wayne Enterprises` needs to know what is happening in all company parts - including secret ones! +2. `Batmobile` and `Batcopter` can be out of network for some duration of time. You don't want to lose precious data. +3. `Batmobile` and `Batcopter` environments are very **resource constrained**, so you want an efficient solution that avoids extra computations and storage. + +Firstly, let us set up Thanos as we explained in the previous tutorial. + +## Setup Central Platform + +As you might remember from the previous tutorial, in the simplest form for streaming use cases, we need to deploy Thanos Receive and Thanos Querier. + +Let's run `Thanos Receive`: + +``` +docker run -d --rm \ + -v $(pwd)/receive-data:/receive/data \ + --net=host \ + --name receive \ + quay.io/thanos/thanos:v0.21.0 \ + receive \ + --tsdb.path "/receive/data" \ + --grpc-address 127.0.0.1:10907 \ + --http-address 127.0.0.1:10909 \ + --label "receive_replica=\"0\"" \ + --label "receive_cluster=\"wayne-enterprises\"" \ + --remote-write.address 127.0.0.1:10908 +```{{execute}} + +This starts Thanos Receive that listens on `http://127.0.0.1:10908/api/v1/receive` endpoint for Remote Write and on `127.0.0.1:10907` for Thanos StoreAPI. + +Next, let us run a `Thanos Query` instance connected to Thanos Receive: + +``` +docker run -d --rm \ +--net=host \ +--name query \ +quay.io/thanos/thanos:v0.21.0 \ +query \ +--http-address "0.0.0.0:39090" \ +--store "127.0.0.1:10907" +```{{execute}} + +Verify that `Thanos Query` is working and configured correctly by looking at the 'stores' tab [here](https://[[HOST_SUBDOMAIN]]-39090-[[KATACODA_HOST]].environments.katacoda.com/stores) (try refreshing the Thanos UI if it does not show up straight away). + +We should see Receive store on this page and, as expected, no metric data since we did not connect any Remote Write sender yet. + +With our "central" platform that is ready to ingest metrics, we can now start to architect our collection pipeline that will stream all metrics to our `Wayne Enterprises`. diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step2-verify.sh b/tutorials/katacoda/thanos/4-receiver-agent/step2-verify.sh new file mode 100644 index 0000000000..be32a11ac9 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step2-verify.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# prometheus-batcave +curl -s 127.0.0.1:9090/metrics >/dev/null || exit 1 +# prometheus-batcomputer +curl -s 127.0.0.1:9091/metrics >/dev/null || exit 1 +# receive +curl -s 127.0.0.1:10909/metrics >/dev/null || exit 1 +# query +curl -s 127.0.0.1:39090/metrics >/dev/null || exit 1 + +echo '"done"' diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step2.md b/tutorials/katacoda/thanos/4-receiver-agent/step2.md new file mode 100644 index 0000000000..1c860ec367 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step2.md @@ -0,0 +1,104 @@ + +# Setup `batmobile` and `batcopter` lightweight metric collection + +With `Wayne Enterprise` platform ready to ingest Remote Write data, we need to think about how we satisfy our three requirements: + +1. Implement a global view of this data. `Wayne Enterprises` needs to know what is happening in all company parts - including secret ones! +2. `Batmobile` and `Batcopter` can be out of network for some duration of time. You don't want to lose precious data. +3. `Batmobile` and `Batcopter` do not have large compute power, so you want an efficient solution that avoids extra computations and storage. + +How are we going to do this? + +Previously, the recommended approach was to deploy Prometheus to our edge environment which scrapes required applications, then remote writes all metrics to Thanos Receive. This will work and satisfy 1st and 2nd requirements, however Prometheus does some things that we don't need in this specific scenario: + +* We don't want to alert locally or use recording rules from our edge places. +* We don't want to query data locally, and we want to store it for an as short duration as possible. + +Prometheus was designed as a stateful time-series database, and it adds certain mechanics which are not desired for full forward mode. For example: + +* Prometheus builds additional memory structures for easy querying from memory. +* Prometheus does not remove data when it is safely sent via remote write. It waits for at least two hours and only after the TSDB block is persisted to the disk, it may or may not be removed, depending on retention configuration. + +This is where Agent mode comes in handy! It is a native Prometheus mode built into the Prometheus binary. If you add the `--agent` flag when running Prometheus, it will run a dedicated, specially streamlined database, optimized for forwarding purposes, yet able to persist scraped data in the event of a crash, restart or network disconnection. + +Let's try to deploy it to fulfil `batmobile` and `batcopter` monitoring requirements. + +## Deploy `Prometheus Agent` on `batmobile` + +Let's use a very simple configuration file that tells prometheus agent to scrape its own metrics page every 5 seconds and forwards it's to our running `Thanos Receive`. + +

+global:
+  scrape_interval: 5s
+  external_labels:
+    cluster: batmobile
+    replica: 0
+
+scrape_configs:
+  - job_name: 'prometheus-agent'
+    static_configs:
+      - targets: ['127.0.0.1:9090']
+
+remote_write:
+- url: 'http://127.0.0.1:10908/api/v1/receive'
+
+ +Run the prometheus in agent mode: + +``` +docker run -d --net=host --rm \ +-v /root/editor/prom-agent-batmobile.yaml:/etc/prometheus/prometheus.yaml \ +-v /root/prom-batmobile-data:/prometheus \ +-u root \ +--name prom-agent-batmobile \ +quay.io/bwplotka/prometheus:agent1 \ +--agent \ +--config.file=/etc/prometheus/prometheus.yaml \ +--storage.tsdb.path=/prometheus \ +--web.listen-address=:9090 +```{{execute}} + +This runs Prometheus Agent, which will scrape itself and forward all to Thanos Receive. It also exposes UI with pages that relate to scraping, service discovery, configuration and build information. + +Verify that `prom-agent-batmobile` is running by navigating to the [Batmobile Prometheus Agent UI](https://[[HOST_SUBDOMAIN]]-9090-[[KATACODA_HOST]].environments.katacoda.com/targets). + +You should see one target: Prometheus Agent on `batmobile` itself. + +## Deploy `Prometheus Agent` on `batcopter` + +Similarly, we can configure and deploy the second agent: + +
+global:
+  scrape_interval: 5s
+  external_labels:
+    cluster: batcopter
+    replica: 0
+
+scrape_configs:
+  - job_name: 'prometheus-agent'
+    static_configs:
+      - targets: ['127.0.0.1:9091']
+
+remote_write:
+- url: 'http://127.0.0.1:10908/api/v1/receive'
+
+ +``` +docker run -d --net=host --rm \ +-v /root/editor/prom-agent-batcopter.yaml:/etc/prometheus/prometheus.yaml \ +-v /root/prom-batcopter-data:/prometheus \ +-u root \ +--name prom-agent-batcopter \ +quay.io/bwplotka/prometheus:agent1 \ +--agent \ +--config.file=/etc/prometheus/prometheus.yaml \ +--storage.tsdb.path=/prometheus \ +--web.listen-address=:9091 +```{{execute}} + +Verify that `prom-agent-batcopter` is running by navigating to the [Batcopter Prometheus Agent UI](https://[[HOST_SUBDOMAIN]]-9091-[[KATACODA_HOST]].environments.katacoda.com/targets). + +You should see one target: Prometheus Agent on `batcopter` itself. + +Now, let's navigate to the last step to verify our `Wayne Enterprises` setup! diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step3-verify.sh b/tutorials/katacoda/thanos/4-receiver-agent/step3-verify.sh new file mode 100644 index 0000000000..be32a11ac9 --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step3-verify.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# prometheus-batcave +curl -s 127.0.0.1:9090/metrics >/dev/null || exit 1 +# prometheus-batcomputer +curl -s 127.0.0.1:9091/metrics >/dev/null || exit 1 +# receive +curl -s 127.0.0.1:10909/metrics >/dev/null || exit 1 +# query +curl -s 127.0.0.1:39090/metrics >/dev/null || exit 1 + +echo '"done"' diff --git a/tutorials/katacoda/thanos/4-receiver-agent/step3.md b/tutorials/katacoda/thanos/4-receiver-agent/step3.md new file mode 100644 index 0000000000..4f0be5a42f --- /dev/null +++ b/tutorials/katacoda/thanos/4-receiver-agent/step3.md @@ -0,0 +1,25 @@ +# Verify Setup + +At this point, we have: + +* Two Prometheus instances configured to `remote_write` and running in `agent` mode. +* `Thanos Receive` component ingesting data from Prometheus +* `Thanos Query` component configured to query `Thanos Receive`'s Store API. + +The final task on our list is to verify that data is flowing correctly. + +Stop and think how you could do this before opening the answer below 👇 + +
+ How are we going to check that the components are wired up correctly? + + +Let's make sure that we can query data from each of our Prometheus instances from our `Thanos Query` instance. + +Navigate to the [Thanos Query UI](https://[[HOST_SUBDOMAIN]]-39090-[[KATACODA_HOST]].environments.katacoda.com), and query for a metric like `up` or `go_goroutines` - inspect the output and you should see `batmobile` and `batcopter` in the `cluster` label. + +`go_goroutines` should look something like on image below: + +![expected](./assets/expected.png) + +
\ No newline at end of file