From df58b3ca0b9cd78fdca1f6d6be492fa3e523e025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Sat, 20 Apr 2019 12:36:57 +0800 Subject: [PATCH] =?UTF-8?q?storm=E9=9B=86=E6=88=90=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 ++-- ...ka 副本机制以及选举原理剖析.md | 0 notes/Kafka核心概念介绍.md | 65 +++++++++++ notes/Kafka消费者详解.md | 0 notes/Kafka生产者详解.md | 0 notes/Kafka的数据可靠性.md | 0 ...=> Storm三种打包方式对比分析.md} | 41 ++++--- notes/Storm编程模型详解.md | 108 ++---------------- notes/Storm集成HBase和HDFS.md | 23 +++- notes/Storm集成Kakfa.md | 41 +++++-- notes/Storm集成Redis详解.md | 64 ++++++++--- notes/Zab协议及选举机制.md | 0 notes/Zookeeper分布式锁实现方案.md | 0 notes/Zookeeper简介及核心概念.md | 0 pictures/CustomRedisCountApp.png | Bin 0 -> 49152 bytes pictures/WordCountToHBaseApp.png | Bin 0 -> 54306 bytes pictures/datasourcetohdfs.png | Bin 0 -> 32211 bytes pictures/kafka-cluster.png | Bin 0 -> 60940 bytes pictures/kafka-producer-consumer.png | Bin 0 -> 59765 bytes pictures/kafka-send-messgaes.png | Bin 0 -> 70923 bytes pictures/kafka-topic.png | Bin 0 -> 44952 bytes pictures/kafka消费者.png | Bin 0 -> 26820 bytes pictures/readfromkafka.png | Bin 0 -> 36567 bytes pictures/storm-abstractRedisBolt.png | Bin 18244 -> 19206 bytes pictures/storm-wordcounttoredis.png | Bin 0 -> 53999 bytes pictures/writetokafka.png | Bin 0 -> 34731 bytes 26 files changed, 212 insertions(+), 151 deletions(-) create mode 100644 notes/Kafka 副本机制以及选举原理剖析.md create mode 100644 notes/Kafka核心概念介绍.md create mode 100644 notes/Kafka消费者详解.md create mode 100644 notes/Kafka生产者详解.md create mode 100644 notes/Kafka的数据可靠性.md rename notes/{Storm多种打包方式对比分析.md => Storm三种打包方式对比分析.md} (83%) create mode 100644 notes/Zab协议及选举机制.md create mode 100644 notes/Zookeeper分布式锁实现方案.md create mode 100644 notes/Zookeeper简介及核心概念.md create mode 100644 pictures/CustomRedisCountApp.png create mode 100644 pictures/WordCountToHBaseApp.png create mode 100644 pictures/datasourcetohdfs.png create mode 100644 pictures/kafka-cluster.png create mode 100644 pictures/kafka-producer-consumer.png create mode 100644 pictures/kafka-send-messgaes.png create mode 100644 pictures/kafka-topic.png create mode 100644 pictures/kafka消费者.png create mode 100644 pictures/readfromkafka.png create mode 100644 pictures/storm-wordcounttoredis.png create mode 100644 pictures/writetokafka.png diff --git a/README.md b/README.md index fc14aca..468e780 100644 --- a/README.md +++ b/README.md @@ -77,10 +77,10 @@ TODO 2. [Storm核心概念详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm核心概念详解.md) 3. [Storm单机版本环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Storm%E5%8D%95%E6%9C%BA%E7%89%88%E6%9C%AC%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md) 4. [Storm编程模型详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm编程模型详解.md) -5. Storm整合Redis -6. Storm整合HDFS/HBase -7. Storm整合Kafka -8. Storm Topology的两种打包方式 +5. [Storm项目三种打包方式对比分析](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm三种打包方式对比分析.md) +6. [Storm集成Redis详解](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成Redis详解.md) +7. [Storm集成HDFS/HBase](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成HBase和HDFS.md) +8. [Storm集成Kafka](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Storm集成Kakfa.md) ## 六、Flume @@ -115,15 +115,18 @@ TODO 10. [Spring/Spring Boot 整合 Mybatis + Phoenix](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Spring%2BMybtais%2BPhoenix%E6%95%B4%E5%90%88.md) ## 十、Kafka -1. Kafka 简介及消息处理过程分析 +1. [Kafka 核心概念介绍](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Kafka核心概念介绍.md) 2. 基于Zookeeper搭建Kafka高可用集群 -3. Kafka 副本机制以及选举原理剖析 +3. Kafka生产者详解 +4. Kafka消费者详解 +5. Kafka 副本机制以及选举原理剖析 +6. Kafka的数据可靠性 ## 十一、Zookeeper -1. Zookeeper 简介及原理介绍 -2. Zookeeper 集群搭建Zookeeper -3. 分布式锁实现方案Zookeeper +1. Zookeeper 简介及核心概念 +2. Zookeeper集群搭建Zookeeper +3. Zookeeper分布式锁实现方案 4. 集群升级、迁移深入分析 Zookeeper 5. Zab协议及选举机制 diff --git a/notes/Kafka 副本机制以及选举原理剖析.md b/notes/Kafka 副本机制以及选举原理剖析.md new file mode 100644 index 0000000..e69de29 diff --git a/notes/Kafka核心概念介绍.md b/notes/Kafka核心概念介绍.md new file mode 100644 index 0000000..ae7e06d --- /dev/null +++ b/notes/Kafka核心概念介绍.md @@ -0,0 +1,65 @@ +# Kafka核心概念介绍 + + + + +## 一、Kafka简介 + +ApacheKafka是一个分布式的流处理平台。它具有以下特点: + ++ 支持消息的发布和订阅,类似于RabbtMQ、ActiveMQ等消息队列; ++ 支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错性; ++ 支持数据在线实时处理; ++ 高吞吐率,单broker可以轻松处理数千个分区以及每秒百万级的消息量; ++ 能保证消息的可靠性投递。 + +## 二、Kafka核心概念 + +### 2.1 Messages And Batches + +Kafka的基本数据单元被称为message(消息),为减少网络开销,提高效率,多个消息会被放入同一批次(Batch)中后再写入。 + +### 2.2 Topics And Partitions + +kafka 的消息通过Topics(主题)进行分类,可以把Topics理解为关系型数据库中的表。一个主题可以被分为若干个Partitions(分区),一个分区就是一个提交日志(commit log)。 + +消息以追加的方式写入分区,然后以先入先出的顺序读取。kafka通过分区来实现数据的冗余和伸缩性,分区可以分布在不同的服务器上,这意味着一个Topic可以横跨多个服务器,以提供比单个服务器更强大的性能。 + +由于一个Topic包含多个分区,因此无法在整个Topic范围内保证消息的顺序性,但可以保证消息在单个分区内的顺序性。 + +
04uhX^%l92j;Ndz6!_n6JZu{Q*M(H3?WOb`4b(28@v>4lte(ujzT3 zfG8dV10DeIq?%;!pS=U&&k^vPz;a%s-Fg2Er>m5iojt3%`Wq-_>g?)bVP(ZQ*yKH& z2Wq^$v9U2D{?A!1U?w1%*gi1fiQBEJlYYrX0qU_xi12yOH``wBZ-Uw?u!d%4Wz8rr zS8=~m`c;3lKvSZh)?l=QoTql?4{lPD#Fwv}KbC#`;-1dFP_vo&5&zW6*NH*sIF z5mf$)tD3mKu5j?5{)f|F*FJcDH)gU9PQp()o8`@$$uR{T8({M1M#}At4aiq5DoWyj z-2D8EqN33F_y_yzC@EcCYVhQs2&fd{?Xu^}zp+$8;Z)A@8r3&-K}`TEh*&r|5xy7a zQL(YgN=nZqCGpNq4uJe`gsR*>CVl=ch61EtQI+GMCIp;^kB`p;zkfr)a@NI?DXEeJ zsY+D7jA5oNyx4cs65BmG1r=TapcIS8;K#e}RMZ&@3yZ~50qwa*7i;5X1e`SfSS9T- zR;LuhEZnU*!@guu0wLCuPkt`XN-Rg7c(sc8>+wc?=-k+Bqu;Zsf5eFwjYrgA%G_i7 zv<&<|sNtcUOcIs7M087CH}xuQXL>`ag~v*a3FPEL4!!>D3W9&IANmMBeIj01P*gKj zRx^#1^`PMSm7VjOk>caCAJP~82K^RT)TZleMo|j bh7VL zefj7guyrW1Hc^3jW+n-JSFIckih&Z`cfUI>^>! MD5IP!Lf*eh&-FH)l51d*5wS0_@ywqpCIyhq8Uc zU%Ra!ixbl%0!)2?yOjZzI+xV9wgzDUF(@Ic{2JP7#3vwdIrqA3PWJ#|Dz~t(xe|T< z{ S`?aN7`GuqW?rGYo&A;Xx<@47^N;C7A_VSwZOy4IAihW z>~G`YwGvT5KR=T2R|MMJ)@%!?Rm;lB`8+pg6eq@Tz2U1L{}YnHYaf3=q7ZHYkEc_~ zMVM(n&{LfPG9M)1fZO)>$FBq_*U>_4Fl^}Jh?I5K6yMHq8GV#+uW9-5o*$P$i-_vm zDjzmx{2tBisHn^xA!`i`Zh|by{`&4)Wi+ghhO?pq D_pQ!kY_lH$ zuhFmTuYxI_H~E}J9n_K&%LDdZPEHOCA<*#hVrP5Gpbg}dhr~WSkBqn%FlQ9NZA|s# ziS_Y86(!e0tg_Cer_qnrCBH^*xWjskg=YWod|KtG6udBCLW}d(Eyh_p5?b%_IJ+@F zctB20j=}G*kAf+ a+0*D{}2B8`$P_1Gw;4 zS$=MVcRgFP{4iMVb0 O{v{IUl5m6cqH2LO{sA`OzBscodxQW;xI_I`p*sX;}a`W z+iyGUu4&@ywd<_zrpL2({qDK zgNQQ1V;A@tpfFmpx1`D2mq^%`v~JDjUPMZpTg%=mx3a7U<1RqA&Qh~tRpQH+V{W%C zgUbe69>|~+^(g=4_mB$bQg=vF#BL#LEPbBJHY7RU*6~U$b9@c>nC`mG#xC%d0Tb8& zC~YEmARA}IV;Lps?rzEctNHwz8bLAn@t*ziP`lBdd603abYat29nzqS%ug=i!FZ!L zD}>+ruVp|4LNmg|;tec6oLqTC!fH1CGya5Lt=0(iPW{1jo%KX{V1p;-^UHV&C|C2Z zK(YX8(=5bw!TY4%+ow(J@1J!+8tB44+CfQg-@1jLz)xvCt +Q~SSBx@P4Q>|JEw|aL!%a9GTDOx$J>8a)TtTMw zz{19+Z7GP$G`M4|gwc-xk-d#I!F?}5T^zgjVs{u4+(KMtZoOA(9MJ5!DLG!A>kp!u zkI}5^4xKCryGi?YkTaNA$N19ls|{p*fTOe=YI%O1XV7_8J0p5WJ8H3J>JB#g9fi2U zdE#f|H-xROIXE{?iVoKeabtRco^*?zTK8wOoH{>p`#CZNC%Nf}Z$mE`yRgjazP55# z#Cu}OM9c>*9>=#LPU+lAcZzLKv3ESK8&IGA85Qli`%4YF8#6NL_~=KSh)3&Fk&+Qo znpW5IEk1Fo*bVyn6J~Xt-D}zw`MW})OzaoyR&JIMyG8bb aM{zWer~;D;cC0(nHkel zw@3vsZjFj39g973UdJnlOYh{^D;O}l;dNI`9OBBVrZ(9%-*Lcm+}ZASTnqnF!V}L* z>lu#;Rk%P&7C?LJM0N^kcjnb z%xEDUC~(I< z05>rIi$o5e==%+P&q~}O^6;3D+idu^N+|?-P1-~0FHX%OZb9PRj}~H&mc%bQRuCz@ zAa1Dh@>@z?O8eQ|e|xYe<@?3*Z<>vkaIeEi%%*M!EQ~~G*R`om;=^TWQW`O9myR$? zHM#l}>`|PoWd}6W@tOV#A%TC9S1TYVP9o7zP;#wzxbSO~nj=9z^IsN#9w#j9*>8p3 z$|>}tDD2cI(?+k8Oa1wsw0 Zh%kV;lIj~NiLyY2GF%0A779=U&`;?bO&cVFBsnylh zQdoo)x>Z14@e64fXX;&6ZTGo&TQtVB02)f3VpK5ciRw!9?xO5GpT4A;4hlZs7C-$O ztLG6oF`;$p6HwOs#$mz&KPzj8ac=i#2$;%b+k&~rE4sQMw%-c$Q~t!6C8y=(eIewm z|7zIc@9cI9FnjoZo%}A|5~N8& inC4OtM_ySO1EuVDuV1T;ay;w7 zU`>fldKl>XBtCL-U9@*P*_y7d12S0btjwGr9oL(P#ngB|vAGH+^7cq1&CKEh fYjA$}-_S>SFQy6Zk5lK(oxhoz^$;wpfnQ-tskdeQNYh7n G$)GSgc@reU^@A-%@1)-R;p37Q=~VbKET z%`&2FAsawS26L6sK)U4Vx~&39;4qiHQAC2xm!0ThdK0da6iS|7iwQHq_Ujc&p<+TE z`|Ancgb!}BX_kI$Yiq+z5`7MxKm5SaX_LD8@l!!z=k`eS61P?JvX@!T)1X-HgNU#) zu^fXr&sc7swJTi%k2;xOWgT;})j3`z*`Ob((d0|0)J+S`Npxoz;=NEU@wPhdTRqZw zYUqRcrCp_r7tDl=94G!J#Nd6l9ZZ$f$r^3u@Jh&U2qC-B3!AEaJDpn$cU*`D{kPKq*8dx3Ial9|FNSp`nlMt9mMyj%d1ypm#r-XA_W%ii_uat z1 YeSb?=7gRwC-srbe)ZB@ZpzHeGUudemW$f0g!qy$g|E|(iYWb8&g@v2nzFC&6DLxE4bK`A>Q*z5=A zXoNP$HYKJO6a paJCKbrf4&)a z^ZNxBc5ijJ4sDoe7JH$t|CocpcaDh;Y(@IxuA2WjCs~|}D|xz9)!IrN$;fatft(Ab zO#yB#
3fRh?N>sZJCAAgSR)kjZWua-3=xjA_76VLv=Bht!=MX z-#buaA^92?*Hk85T@tG9X2h)qkJhC3-^%XOOz|ky#B%93S&EHV!#r2F%?VeSvZb6o zvI>|olx-D?177zi1NkpkH#v`HQ2?Hqr^beemjEfDu~L|fN8_Q3ydVQ`s}Ld@Hrzlj zlAD5FD>Bj`npG>fz61K}ah$9}ui(;UyjW=E!m3ueZh*^`HpE&H1_YiL_V)HN5q?~1 zmx}^SaZ_*8IhNnJ?VD_T6bK2~J~YcuztM50kzXuy!#zm({#8a~E0LFUWD%hqOx-6e z?>fU;levQp%DcJYX{)v>C$+e1R(+A%RVpTYhi^xZl&ff0rNw{T3!8uARam8FS#}J$ zzE`*%v^y7(`~=ZY_~Lf>6-kb4g@t-nanlust{kUq9wB`X0i-ekmEdB(fuXLvfqL ztrWp*
3`uwV-nD4nr4n K{^i)TsefF9Svrb z56=!O-vSE`&DvqZkvvrj|7I{VPTSPMp5LkMBlql7W(saxd;P~aPrJcWUd}8&0XxJ~ zk^4T61Pq(%is37?`VsPxXE$B8OVvspMd8`p)JpPrTieBX=F9SoDBa>Sm3;q`6vLt= z%Djojm}!kxUijeu;OZ^os%)a}VL=3GkZzC$K}xy=>Fy5c?oI&_>FyTf5YpY F z-S2om&-4HAo==<~r>>bjd)8iS?YV5znG@@&mB*s$Z3yaX?&q6zZM68|HrR>_7F&E| zxBFLb=W30y-CRP?DmAK}UGi!k43rx-KBaTbU5L_|0t+asXVl7aC&={f8{r&gHp}hx zJ3UFf8n776fguQ~7k^nf_i|~pYP{Ocw+20#p8Ab_y9agy7*#>t*!?fMz!?%F{nWkn ztI+A~Uo6?ZCiAdn)w|*6Cc^gJ>c{$V3Tr(UJd?DwBkw-!8^X$frt@?k7csd;QU9oIc0l$ z+h!@7^zBhJ2PRSU@#2i{ *Dq?BXv`mML_b{qtV>1d>d{?%# z^O|RESW92_-!i(IM0*FuwIEQnaL}_76|FrRD_aw$-wQNHHLbS{CdW@VJNGP3-^?7; z{p31mofb)%Ts)i0orVQ8k^XzfY1ivrJCC9hR;3IUy^-wV+h136kq*5VovkhXuH?WH zqWLE(*=Af)<-n3Cf36MCwEtq~aOr_|CmqMM1E%uAoLFd?mcH`tWzO@aEdQ_P*b8eX z5=T8boh}-Z*}GBZ2v`DglNg;?NDYA&bE8(k?+n6mYfI1TV6A%|>qGcC^Bm_D16P-W ziH6`Wt_0O$4XIVt*79KzKgpai=f8w&D>p&^dfT};eG>V}GKqdj6Z)6CzzAz3OXc!a z%R#g6%tP}B4TIjj?}oi8;*yf<;8YMY@bI7P7QS?s?~!!(74T?Y-nbscJX42PboVFg z4GEv~dcrxm82 G6`Ghz+Zxj@H|1DRG%A%A-Kpk zS)paZs`&8E{C$4ffUD=|r~5*eg6x10f0Jvet;0+H38-!CKGCf^0yR?WxXkPZWgTJ- z4aN+&j=#3P^l%Gd!NJ-2`QmBHZ(;D!s4>xFL-vwhdN`ePl6f(+4d0&2{5ehCRb=MN zgmW4{x=5gM-ar_**?}6M72BP7GdFGUyR}Wh>g(3F6F1#5f-DBDYTuIaIR;gJ!PVQ3 z&l!1&9Gbkou3w)rns#~j$@`2>v?YllX0z|c+(TDUenTKZ_xB#)+?7@)Q(2NqQ=Xr} z=p9|^!jRa&kRaj;R_}Y6W$zmuTWvHyb}M!Qu}I>rPE-M-?IGQekV6XU70DIbufyj` z@(pq6%k|Bn3`Ga!DF}00>3T|Yw_e2Rau+{LOG@XoBjb6mA4*uev9A+RqK#!(r`ibh zpz>xn%Y%2 ~Sa3HS?K&Z2vL!sU8rxbJ)?!H) zRXlQB)te{nW}UGKB0d!Qji+VBCNKJvX}{UY`wCr{xbn-jz-|lXJaOwjPK99)bMyW= zec%sSSm{*O%%F=Xwv@nV_kwLJgK{PeH1b=&_k<9hCypcH)Brv#q7)ly#P?qf^uCjU zh?$EohR^3;t#;kDIV7FzA$co5HU5n@+~_4{!kc&UhTko$pNH-mX4c6q +VCEVASA%^#F@o3BA`fZWMUL>*L@aQwY7<;{I}nhm+8H> zSy3t~wC8P<8!#p4#9|T@CE>7&gy%%RRU1UM4o>@f{JCAwOhV}RJHFP>VQ Ch-LAJJ_(eQut~Aa^h0kcG zmrRON{kh-q+eU!)I=X@Xp(u>&rx*(R<3+CL#~so0i*zGX#HnPS;72cN5^tl`r<()! z({?xsY3ZgVkp{ykieP%R61(;9@p!D-o112sRF8coriNs_i2EANl=L*a+I!CqB%ksH zH (%5Mzwa<^`28tswTkTs)yl8Z~t3At4h@V@B@ NLFTlK8MIo{QZ$&C{GCJVuUOcd<7$sa@;`1-ci zN^?(UFo=oHB-G~D<|)nM>PzX<8I@#aJJ%K#d)#l=`>^BckXSD44hnV9rdWP3g8RU9 z&i8sMmX}VRKh*CJJC;UM*rvZzKEI4sZ1AK!qNERtd0T-ugL+8i6z@RP_XAIhQux5m zwNYg%2KRy~CD(fG9R8X^m&U>aN{RI)*A+^#_V&ZMzgm+-BqA0TV+<#RKM8qZqjK;d z;o66OXwvEXCet5qoSljOtqqY-?7${jOW%q)tHOz}9!{6Wr8;d!8FyOC+`+ANK=OVO zS<207>%TqgykzHD=_(n9(B`{^G7R!Qu?mE$ TLBN(c;%1a+rPT9CzfsYinz9 zqHdTaN&Dp8@#1O~o12@vy1TOxvtJcX> z_>u)-!r-KM^JN7Meks3c}X&gIb` zV#{_9*KKG`LhUe=xPQ;S97bGe^W$nl ;Fl~RW9a;Kvt*PdcjiYy9<7NN_jR~8l;0miGBIR&X3w;5D4 z)YNdJM5u)1I#y>xX9O2;1FNnb<3`5LB5--bk@vW&JMsgxnWmStMS0=6oPLr-9?f13 zu8(!RR38%bAw7Pa>9X34iTihz5Qx~-tRlP506z^T5fM>tZtiV(u=uq$c_jqFh$^+U zHZ?ppz7@56JK2=hZJX`ESJAz9I8zhPO3$!%VQkN-a7T{e!6I=`1o(rayw&C|aFJj^ zIUO`?f>@7w?^MLAVSMwaCD&G0;;tO6=P!X;S(QBx96}8_L>y9PPwW21k52A&>cP>J z;GW`utBE0ZO`PnKpWmZ&;Gf0JUShp?hymhOctvp!)QVOD -sIdGWAM|u g8t@WF>Pha^>tAm_ASXL%bH4Ujv)xKjOsRan#t7Lj9lrIO{z~*!}X3kd%L@& ze0&`obFNSjxy)@qa=&L~ja^*SuBfPZkA1JDrB!dA6Z&xMxRMe&8)a1K=u14+(($?c zjk&;X!pUdIP^lku*-gsp-9o-ZD_x0=?OK}rw}0PcI?+#CiPd_o7Li`j$vGXRd|IGA z)nc7^dhjZLQ@||af}zFS_vAI%826COUTWmKN1R~E{Tuh~TlK6W)Svt%5wuF1%wyBj zlBTBA=H}698<9l+u+wQjbtaSbJez}~V=}k%{t@Fi>4&d7H!b~VJ9^umt@JswjxkJ% zn*uEaduQmw>q^5A<*d`LF!^LUPgAZfp4Tmx!BT6@4?S3Mwn&oUlwH-Y?P+;8Q`N~t zR4YdBzLO5|y>1;`){wm;t%bjPY{As>&lF?I17oEB^8Ca}h>|CpE@@-Kcz1WVxwC^> zkCx8m2pjPEJ%cq&IF4n6!dGNF0{C;-omo5Mm|@xO-e#O`9TOv0ni85WWu1{@j)vJJ z0cnr*3^$mfA3HW=!NJjTiSzT?X rYW7iXT zYYCy=nREm*`d6;^!>(`F*C`wvw5zJ;03+YB0TZ&ktou)AH86Ou1d%oF3B%jm-Zo%Q zO=dHXDV%6h_ @fLi6oH&G3oB^ zo-}MSWWu_)xA$3W9jr^-@CuTf=wEvqvi?h=5ueXv@djMm)r~t~G)NB*o3M6}U8xuo zLlJQp?Vg(skM>vF19Bk{R>K}7><{YS=B!LQzQcc}#!)NLCZjSjdT3d_X8!6=&`eyS z+w9R8`U^gBuzRl3l*{w_1Burul)1UNkhUYU<$Q-34>%FnAIclQO}uS{{JA>X@yP z16`_hD<^*8Z;SKyN5@JFxjcgu8m-X3>(M1df%}IxI|32CF2}?sr>DUItwNtaLji7< z32;>BqS4Lv8?dkeUo7_f@C b4w@IV4vk&}zd_}rX?r6qmq!_o;8emL*_ZVu2m4V|2wqf-zzdcs%p z3THc>$CW;m@_#Gw$PedK{|}^r_9AZT zXjosnD5G_)u x&lB94h8XrYkyK;3f6VNli#9Omy<2u`NV#m3=zyGVKDD?W; z<@q#70F8)f_?Jki+hKWcoy!qEE$wS(>bgd8Nqn@5AWh#Y7DdCsJ*OX6^BX)602MAC zR$elal5nvZG{1vg&f?1xZ(x=;wWFRpMxIYBLhQ>;5uZ>;n?wf^`*Wmi#lu~q#&c#Q znYVNB4LA1l#5X1={leTcDG2TDR)70Nt*U}O3P35dVs1(8J*5a!^b9}ST%i3{6Gjij zT$EIrD$_*eCU3#S?>Ys1xn$7Uf5C1AW22bWa5w$y6`Vmaq>aGn@YU32xq$rX>AdeP zA`GZq%UYdq-(w)!@VI9Gp+pNKr7m#u;cqbI&D`-FEIjf4hPldKv+erPaLbXG#4Puy zymnQaUPf>tc*TJ7*6B5=ui~ah#q@P0eufCzPtI(#F!%laeb}d`_3lvV6gG(|z7x#a z@`8eWW$np^<;M+@m%i4gg;slDgvna@m6IbOE>6nDl?*} 3X4VDRFOaEH;Lv zLcthoV+bU24PEb$tp+7Bm2W~K2#mVXa8r<3HN$MTy2p309 $Twcq z?|rPbq(r-$8(L@fT+)kmWG5l9F){u a_Bn~wMl-CZawI!2yevi+F^+>8(1m&1^; zjdNo@8;&p%f#++?RqWu95QF(Db6wZIklq&N9rkJE{^vm3ipRti<3X$L%5fwUnKysa zw>Mn$qh60M_OtrMvgyLxFU3!M!KAi7$B%e23cu<4g8e~Nfs~i8K=dsp`Io_zBf|Xa zyAI{P0Yj>;!4K`~@A>%Bw+0g}5v(}CX7Ohlb@z~vCr^FqL34I5T>fKDKJhUATI{!p za3Y_(P3&CZEAwSDmgr29bxkF*L7R)cFTSl2tfs$44|0;2HztgK;^N@+t~?H}n1K&; z+?L)yh_t&ZB$mK8*Fx|u)k7nsDKQy#Nq`e6CnoZ5PU=T05@eD@L3nk4@5II-_LWUE zHa3>EB02ok+1VM8xq3d9>Dbzq?$Zq9h@5S#bX{h&?kk-&jkJ4$MAC)FE{h`Yacjf} zdg7y;;?o+LOUmOBjRk*L*I+CvaeK!~;2%L`LsM$InNgu)8y>g_oC-xci1r=tN`J;D zhT29uA1CX%-s^hR1{>GUFty=LO}s6)-5(9g)s^8fUTJ7(bahjXFB5O6pyS%4)Eo+P z%t*$r)Do9U<_Xb3b9|VBOKSW*`0?p{AI bzo~xRH#`i4qGuN0D>Yvc z7nd430?6J3BsM8&AP~``M2FzB`L8_e^y6>6jvDnll`;M&clei{lLt2R71XT1!@^T1 z3Upi2KXq<83-XT<5dF k#5t=g zFH<_h3+1xsbBSqn?~nXoJ5w$H%}09VIdZQvbJ?g84gY3ZX6R`Nul2##3nl3uX0U7T zy9H86bmYQOk4 ejOp|%`_1Y=p;p{qE_?#l#fsN3z _`oad)wEan|d*)&-9 ~;E?|9*FbjeWq|_wjb^+6lY8KcIJ6u!npT){QilFXt{7 z{!%_KUpb!9SO9L*Qp$V1^mYsVREsmEp)(2fO_41!BTW#(Ij0jZelf@+_V-nOVPVqX zTvfK=91GlG@6n@W9xUIh*SV!X9-QHMe9xi$lysgq8l#D4JWeEYGnK(Lv=4rAKw@99 zSTYS$_C0^{E_?F-Y=5+4#|Z%0S6jk?H(7&Q@9F3yt3BJEpM9px1$CXOatUN&5Xb$L z*sPMJuJvs(EG_0*nqoV8uqbS=Yis)!^dcyCuZ#gT;hBHK_l#IEXqK(&`c3J#6fJ7f zsn)dHWLZSAcyWPo npE|Z2%pC|0oVZnXe&;GUUVe~> zp_)l`Y4ny)^j`x3T6h777$Z|t$Csx!RW-ypzq )05?kp 4=6RX%l>8J$fv4A7T#if z{iU+^#;Lr2V9~!FT5jMoF@4QpPL@A6F5G^rfhTe@JW|ojKO%(B zYG!JjWp|2b62}VS-u vNC=VZIg@JbK#P3_js)bbmk~C~`?j zMF+ksNOLf^Lcs7ZAFi|CP_MHiW7pyZ98R5^f;6omk%WIFKa1UCUG&)oM4vsiw YNhWYp;h9?!_?&Qc^QcwK!Aytn?K(Zza0-uAZ8303J}~N$k;jKOA~4&B zoLIw`4Z|xIBVa-Cr-lsgky(YtWyPMGx;yK)=vZkmAmaJBZ>G*xa}gC1DDy4Ykw*s8 z$Y!ubC31uUAy6+2-cOLypbLqoASuF~{UB}qo6SSkkCDApwfl5Yw>L3M*2`=RsRw(c zk-vQ)=-@>Rl#xn=xQ0E;{&J{bxq?XrRbSiQM0wLignbuM6&&SC7xUhAeR7jh6or}X zjFOt^=6p3LK ^@(rKLNm2*Sgq4rHzs%&Z{yJK1Ryl*Q)(yIg_f4=Yb+yiVS zk^TVkHAO;ZHywsLXj5y=j6FP|$jZ~W?r(j+AaM7Gt?4+r`If*~>R}?EW|n`IG`k>t zNtLO10Kwr)RO<&E45A9e-Gy%p$eCX6M69imxOM3Mm4v~;!L<-3=yswoG#b&Lhv^wg zFc|v9rja&0)nuxERat`C1xCe^a0lk|DX%omN?;`&`%om)rBmQJml=3J!P^kP!^4B- zO@|fl8~aB$LTXvu-4l|98re)y3iyVG%ccuiw&LQA+aXhaVIQ9sx@rMGf%5Y559(## z+%LB6&y9GUoyVM9BL!DJ*0{0nySLFMh >PkfzouMO*OArk7D=KlM3wnIc|CwGuF#=V{v$rjK{+q0BA&JxeJ*be^0edz% zT>}l2gA)pF516p3Hz~XO `Rl#`!UPQigLQuk?d>t_cU*pautz#o5{lIF81Rj;%_%ASu&nWYbsh62 zWcp1ON|1qp=(oxqm7YEf?pq*au+9cbN6rXBW`~PB&H`LSC#PL5JJJ+^Ct84<>mw ezL(YC5L&ZD^jXNiRHpmYl9MKxw@ShbPbMiAP2_x>Ad^3!D~}sb z`2Y2bC@SWiO>2!kZgVhq$Um@O^iwN5?yE7Y7ncvE#E+N?JZJ#c$l>25Fax?Qfl()< z-)Q~T{
c= zTT3>UTyyTON)0((854jUQEt>9Bd4P;=BHnWPAAtX{SVobwpm-o#@EtuXE~WiQU3;s za`G>}9mYb13F_6f69NI&>qBMfMg%S$`H_tJ+q&SR4(^**kUqn`9=||JOBL=btgEJK z%22F~6Rl~&Rm^q@oPT(KK1Dhg0aecbD=8gaNHVMGI}(x+Tb~Pp2x7keYD;dQq;782 z<8FL4I;OjSa8@sdUG|>oo2yj#pw1L2M&hlUCLKnaoSe*i)`dYqMRnc|cje@C>2RDD z+aUy3P+*~wr8wtiMX9xIBUZb(V;NgYpq{**E=60+PYU<-vM0IE1X2~_U+?)Cz$E%k ztV0+eK(>lV|E&c$1F`SYD{H~%Yq7)6uc+a5of%fzV#!JnMal!8enZq-ym+Q+vwk=~ zH)S+5n1S?)M#Psf;(h#;*liUm`<@yN>9tT6u1SS!LZ!nXf6W2Pt#@W^D{oh{4R>I; z2{&R5D;gXp$gnQhf-S*ViY(O)uQQU+i6s*ieTGgX6*)@u%{N?7ln=jpb_*^`&HeTJ zCN5k+FubWknAM`sb7jbh61e(T2r}_6RwN}QIh}UVuC7k(fbalEY{%r=61%yHKFWY| zYY!@c&Y+yTUGmqAGn@$wl}x683D2-yFvX>$Hp+X6$$5BE1s>N>o1U(@7_~<$?Xm+F zwQ)pq@Ed=Lzos2H!}m8N6^-H7)=akhj6?pk^s+AB{{Hn_jJ|VKf8OP$f(;O%$jG99 z(?bomhaTM5gQ;-^e46s=_@MnramnPvUKJ3i$rIbtELnX} fEUc{V2jH0VUI7<}{Ww2LDKPO|=zjx$WG?Fxk@%S9wk-F>(|hDe z_pe`MzCZ&bry|y)jGbjy@8FLU&~@{87U{dW5&0tR=!gllda=LyT4>)FkOA (?IKZpP9qyHlr3 zK#;q7dK^xgCo~$IXhBt3+xQdO$n*_WY;al{;r_t^a4hbOW~UPJTjiFGw!cQ@?C-O~ zAYvfvATbleLp2={J$rr-jUeFww4AVs2|l>Cuh)lj9h86mWiLjZ2ADo55AYCb>2_#b zqM5mSFYzvh;%nucvN1jm4$iqx0QO`K$(j>)v-<%Wc7`iY3 TF2E$`_G7oo-Kzp zhx+%jITL$7gM$^))ug47{^?j(Kh*KGEG|OA!&TC$=;#mteO_%jqx?G*NNDM5s;bz4 zm`>w$j{#kkKz}A+V_)8EdC iduW1 Dk*xRpf zzJEs{Q4_g)JneY>C! 5S94P2ag56 zQDKh*-c!buQ=SyS 1duBVj!(e-pC~9P3qo2fY8UF=FQ@>s=+C#* PG5$H rK*xo{&^4k?WnPee|RP(p$h6Vr$Vq?_aBo8>atJiiOm+^X8zBAX3R;aqy~ ziRLJ%a5H$%m{fjc!&jLL0-|9 K#X6(Uooq*)j`S2x7PAZ!W zr*r|fr*Cj@g3VVpiRm-A^N= V4*vu%e%jO3sW1|)%AtgW0wpxY|2PU zA%c^D(s*1WI)gsiU7C?3Co=+LPHgg?!J}L7q%w!SeP%=~VyzbTdv5Ma?dHOrM|ZxR z5i$F_3aE5OKM-@Qt~S_QTwDO?m9*lDXF QTN>4w}E65S{d6*x|-WkB+ 9S&yk_aG%7d=m!wd) u>2%;+>BnXij>Osa)r2sZI*=QsQ`y5aGKd=*8h|8m-qLJs zvER0~`*o2s_&dy9YyuTfty1AJw55|)sc859a<DL Vy&MwcA z*rWGZZ6l}u*Sr%ak{DsdVhozP3y>B7NQy~H>Z>xJ_(uv3#M1*>2RzJdZ6V+{R+=tw zITr@as`o!gNXCduL_3ef#%{I7#u|S%tU}g-LlQOiJ~^1#@@;H%)?I5id7UaF=G&SP z7so~=moaoW7n{uM&I0OhVCZ1BS>!Y@G;F?U2BlCwe~|uVaA+twIe7r6AAuJ9FY$mx z1O_btSi )Lur^xBVV& S#nIamc?M+bH`Q1eNrbH{@$P6C+- z?p#|1nYgOD+Wz`b<8KDv;N8X27m?4(aepjJW;UL97*Q0JjCGuXgvCtqQg7Wj#>Vv7 zBr|-;xHZr3)H?KE1qlZ&9lw-z`mMOSH2y6rv_DFDEL}ojOhl>GT2`*tUUfN$q98Ii z-{>Dm5dtd)gbpPa7hcZT&oQ$ueWrYtb)3a?nvAWu+Ed`j8sWQHwc`YA9M}TD=G+BD zA9HK#t2C2K_xt7-+|dI{0|Qbn4eSObMT&PA05Lecs6DIn_?@_hNSQ*Ej&J-nNKYFR z5@_DNqbSjt06!)JY@oA8uQ&8p^@y^lX=#&bmGW2ss078xdbqwd8-Bgd6E|45?|)Sb zGWFCOx~}Ox%+LJ8n~A>m$t40#U&UFoBGC~~(<2&J!Ye0&b2>j;7|@OIUJM;E#^@tu z*R3gwOGvDNIt|LmmL4o1Cnu-Tv9WfrDb@r152(-oqfm-@KC}_86=A=V73sQpuv->- z-KzGSKmqKm?->}vK_ZMzNDu|;2uLZ*$gw~RWMq_eQ%C>ueI2x3ypaJf1HlEfcbny= zV89@+*}2_&o )GhS0)0;}4ZuU;OUpq^TNK>;5li?H=7)^b;`_}`OSFsS%~aqQf!^oS^TCgf z0H}G)d!Wh2oj_CE)vZ+Yb#S!a$&8PW+qee97~-xBivjbJYXHbvJ3ETXF%+PpZYC(Q zoGBTbnF;D#YqO~ZRu_9tLST9_temr}*IsVbVFU;~dUx0CL`!MwWncwp?;t^g%6*4H z*ur8z>wbwb5wUiGfnCa9O9=0^M>8= 45Jfd#0oiOvZnh}?|# z_Ic&V1p^C9#L0;bHoz|_DJjc-?ZH)1@g2DNMs8kSOkCXec70%1RGWPXQ=pPf6StIO z-6_>0qyBW^g0oYy`4~=LSMRA(f1>UOtv?V)Yqi{j2PAEP+ICM)P#f}q(ec*JnH?KU zFDQ8hnzyp$p&vmfbiu%&NhLZFQL$um`;iN{P?dPp%~c8zPle}-{;dV^`PGw+ool23 zkilb6y*0FIFZ-1*3(Wly<`a2=&9d;9IW;H1MGz16ag{SP82>RUcJ_qXS@l+A896yr zuv80=CstPEl$GQ5Ir;s|2LY7lx;m4n;do3j-S+hx>T)vp)y2(Ac-cs(T{qT#jp`G= zw5Pw;5m?(OPToPpAWwrEF3Q5fBJ`YRT+swV9iWnUyR0TCm51x!rKOQz5>yD#69)sA zY}6Q 4z3ZDM0XBn7;*9O(P?R3jiGGs|LKPRzRqt|Nfyla%Kdch?R0HR;D1K6d__yg z#wD=2zE9!8i|Of+Ff%h3PL)@iSu6r@7fS_F87VETgh~T|zEMd@`E C>kzmZPioJwW%eL zh*3UhjkscWsn-^d*|a_oA5%PGOq6nNrY|(f`BYO?#hhhsWnLi6;7)7Ji*G0uL-7x^ zGW@KKnK27z7*#z1Aj`RGT??<*VqTs3#|*b`;a9eW*)_XY`wLQ*&HrIE$aG5)rNG6qXGq?oYqZFx6GKgF3Uh!@)grt?ghPhzeykTpF2ikqY5r z5_S~l6$aON@UKd$!#hD01H7%EGMH+47OM;wv$P5~A+RLU(#(*OBA^eAOW?=d9e1IL z3pA{nSC65PfoiXsY#je ;Ok|BE09Zz^#}d{F5TOuBhb;m*zhUgvSg<^`5AO6)iZskz(z>Q7x-% z;V6LJEWb+@qBN05z4!zx?EabwKUJn#xAeXq6JAa#NQsA;-u6|sjYk#C5PrDFOv9~( zM9%LMI$NRYsxvd0A 5bv^Rx z1i3-{g0z@$QQydr5d3O;uOiDR{P#MM@pmeCp=$%w@7uvaBmWch(8K>PkijA_1LE=j z{lia?^*^J}|2|LoPs{%=;sr@Z0g3znKEcoAKk)j$&)I+l=6^rhPcRFQO#a^*`EPyw z|Gugx>$_wkML)qg4<@LiK-kJau&d3Fr<>v)Cv#&dB$RYDGc2nPbRZMqdmb~2IIcp? zQZe5j FKneCQDQ2$At14#g_W$HYGyDlHvydM~icJkR?i>Zcu_``~YhS6$ q{QO*&OgD1}v_r7Zk@*trlU3zHfj`MJK(0}Cek$JF za%ud;ps0B;YEo%FASER>HQ!@#p!Z)kP;s`WcMtq`_7QhFP u>!8wH zKm!J~&m;8tb7Qhvrfyr2r2k%#`&M ^rZ?3J6%sbj+oZoTF)Lk ztqzyfrR5i=6JM3)t;Dz-a^ttB( @@ZVo}lgGfOy za$2z;%GTBr>ZKmVwiB#;J(F^-BLd}k`%!}30G8j9OPsH_1yQ4>cZsb}JOqbEPP3~P zwYBeE?V@XFi+2*v+2Y3wa~I;jn>?X e+xv< z2#@;qOzB{DYJcTr<@T?EZXsfm(og1hZL1eM1YV|RQj_jIJ%Y<+b?ay=FOT|HCAr8S z#_4q3k4|uN#eKx7eWdpqbgDeI3x7_SYu8pGV7e~g7fg1V{fXAR`K&o$TD$P+cR=}4 z4`brsgH^!S+CfXde_6c)jf4bM(AM@NXr3hFiIjy1*Z;-Y`jPEJ5C)36DRbZrjG+Kn zgKyoPD_s_pg5Y)NkZ6iv;GCRt2fe7^e=^F-%3bDhvRQdvuQ+U%0ft0r=68_c06-t; zuT)f`D!Q8cI(t ppx_~CXW^FMD=jY(2dcWIp+GJJ5LkiMn+w)8$3nW$x*5JU69$ zO- KaDeqO~jCHs>PrB-NsRk>uhoiUzH<^OpB%A2tqJ`9Du@TCsLPyXmzs3`C& z?jBuPi3D=28QTv=BiyP>oz&qU;NBpgd;vE2hZc4|&En(X)4$XhFz{$Wx7aLoH*`Pq z+3E96mXS$62@!o{&<*pwu=&+Kp?`E_El6 bXmQ7UB-P zr?c%u2u7iH!@GJ0M=Y0AJLU^bYz2@5D?|(DzF6vzH#RnkS%*(n5L;@HFWJ;?dq>TG zI#<2^Y%vI#*s}w~ R(nBDwfl*U{5NrI$LRKTv}PJ?hJgi8s;vfG3=ebN>U&3 z04Ik}qvU>Ep8r |pOy)|Vf>@iw;E0-WV!#=ymPNiQMyjkn_n+Z<+Livt*Q8K zJ?D30om2d#?{5c;azLw~*^+4ge4*VNbos8lAHHOp#H#4yuajFsh+4hao1%^j99On= zu9M%h&rB(J*1?8^GGj52K?;)-*y*QhgxOwmNreb4JL<<4zhxV)suBER3;(05>%JM; ztMg) `#R@?FzE zt^|=63LUfRLk3Ksmk*~-kJt9%;)k;e3#TtqEAXOMLU3}Lu#lpShhaCpl|K<^&L|Sx z$A1_gxc23}#Lav(#j`9*Arqv@f8+4VEV~-7kN8j{wLsI-BukvXLtYk7!29W72qF0| zoo!)1m1Pu>jP-B4%5$-4k8AcnH;-R`k?D)!{b@2c@Gb}}9MGg2HYq*LjZ#vTWVX8? zIdF4WtUC>qKd!EYqI8Apb>FfDt(1XG5aDjCr7 b9{lfs%isHD3EU~sL=Vgb3f9~Ch8ZC?FOc+d>Z}90CBsc9VbIpDp z)m0BqbZ|+JT;K5vp7t|7!MEP_XlG^)(+Fs>TO%|SpL;5Z5WSpJv_p@PLefk}YWfpz z;f33w9l?FSUw{F5IEfx^n+7Nyy#L|9(>s!;&XC9&&t >AqBd zzreaA92EY6 3ZmgPIe`Vqb+U?Y(*W XZ z1FbQS7|tJ?le!Z$Ewr@c*_)t0O$K733BOz4{3`#*z7Fm#$d 2*HTMVr>cN;{`>bm9$ntdg`D0c4%Mb7@>T99E8KIur{3F`lcrt)UkL>$ zc)pU9qG?5cd=*JBWNH5m8BA81Jd(dNfu4p|U_~kN;;NEX@LZ#CGzVPJfXiv-#Y>yg z%B)P+!&f<70b8x^2pJr8ExfGPI+fwbL8uB^o=GYAM)7%8ujpUOJs3)>zg74ps$?jS zYIn~gr<$3~qLXgIAo8h!-Z7fn{NTHcS;Ci_*0Xte8e28v>cY`lg%bC?hKLs;J0a#c zpSq3b%!}g{cdOAjnW7bw$x4Zfhra`<8JFFm49cp+CJQwdg@ql~Z?^8;45A8eoqh>z z^*a`hPD}_3`8$ZBYxbdtw6hY>dfpr;PpMX9=c)65x_o=`8{MYrY2{L@fQJIuzir(I zyiSi^etg{LI^;_}eIzcI$GoF$&&I(q@abiZut4$bDVOt*OHL^&EYPq$$C!?vX!sDh z%9?}>Jiwz7KZQYc&Ur>s#6+L^ZQ4R|$YcnL#C?Ul^=PHXLznNCe8Ax}&46vREJvC@ zw9M+?v6kR`G @3C$VBp_P8vg+-QR zrtlT2LBXvH&fhbAC`oe&Iknd>c!xoDPGwHzkbkZJgf7RROI;-PZ^O4NA0g1y*m`S8 z6qEurxUQv`oOE%e2ZX+tAj(~w`j$BE%ju$z)7EiG!*N!Xg(G#pRcuTnWxjg}h)hu; z%}w-Y2TrS!Lc&-=o6f9eji5fn71)f*VVuK@th%wJ4rd=xe*=|9^h53bHiN!*!D5aD zy%Y^?!R0J6a*O>4?ZRi_PO1-mw)Y&9G_7uvZ_n^tTZ~ojWn}SwOTy;;A)8zY(XfKr zsv5Ckf7sk%KsV;ue13WGeX8(kowumbXs0_MzK?8O? +-)XQwaWG(3_0cVBEOHY> C@MS|709Y5)7F$=B<>l0ej?yChn<6& zvSPYOZuJh_K&n#8y<)5rd2aMK#q`Ggw)gw+%8F445iZ2Xo8Z|cLgYjFtLpd+{$I01 zNb>T}bU}LBxg}nCSBHPphuWwNgTzSBW?3;m_6V^K59`w+pI8_EuEwi?u=1_eyWHCR zkomU-mfphiP9Jv1ZMiAa)o2tHB)lorpQ00S&SgK9vVB2TCW4nKet~7{TF|vjw=zm4 z(jR3ewMy>%OFr=9L$92KE|Ewm1Djg2poB96m+@~* FCyPyAN}i76evXebK7^ zN6ygqB6am;ZbcBeK|=$YMv~0$aUR@0*1s#TjaZjhu|K534m|zkIgxL@LwqffimCvK z>-O|#5|`B?Xo3z))7!jgprv1k-7Oor|KyYb?Wb>4Pp* Ur$<4lUl?r10rZR#is{v&K^{^ev}~I2$u;ZjP$H zp4V#}=-n6|o+8xPx+^p$n5u5Ogpwmq_^DdEx^Y?t+v2aafrwhUDWYCM9%Nzr2B&gX zQKDGQ`Tds$06iD_xAi~DJ#){U7l LuBMsfTZ{wU9& zi;7Az%^gt%UA4N>gkJb|%IYneHeAn&yrx{<)rf+N8H37jwX$ucV$<@Mu^7U_l+@Qf zm+xA%S_40(gs8_Ti8xk94hzeoWUS$C-@R7|MyQEB&)`qNHZ1t_oBcaqEDJRfcCjR` zF(M3k=PV9QNBtCen0>aITUo{M|5w^u07dz}@8YP0N*M@}BB&rG-60{J(v74`cP}W2 zh?Izw2#Az4EU-u|0>T0dES<8Hu#yWbo#)~6{e0*DpE+}8&To!`O6 -v>AS z`lAhpT#Mx3 g(qtWawU@wd3F0%h!h9To vUW=8;ge5C2!xE(9ngpe)egwJ oroUcG%c$fT5RjP;Wz_KdsHGE_v ce*l_+ArnNfH7bUtL)89Mawv(xOmmI4#WHR|w z-h;iZ)9Ne`bu9U!_O^~B%@D{RZ37yuC4YG-oyRU>X8FSJ9tW&U(^n%GE_K?-(RGlV zz1olK&2)PkM`IOc9p7T+^;qVx+~>==OxBi%l;f@iJw%(eh4+OC8iR%Fz wq8rN!*hJo9c;hD_wFbuX);c z>!k!?^7GMjE7PZR&52I{>ePLEoTs4VDm=-G!d;)V0^#3OK=!bD-9HX-evD>#5D8n> z)-_W#_Tkpoe^TLsv=BD#(K9HuyCT8PEumnS6ueR;wmM^cx>H>JK|U=@0^Op??s#xm zX26vmqQa;B`$I4MmVi@RkB|S#8cEr8Y5aUPLHX0y7*9`jPJM|ElR_Ro-6=AoKZtA| z%zDA4JBkxRBYHxn-@hL*Jdjk8-xF5tagxHjvdik; @b>`1@wh+&L>)%%ri% z^w4Xpd5t_F`?=M3dLK8J-P}CGMqqvwZFwn_#?586JV}&lLGDK*;~$HRj0`}$&fi-? z&2W3(@Iv%Cxt(jBe|5+ a@489n z3^6#RM_)8FE^}bGtcG7w!7r75u#nCV4pI*cXqSXw8UqI3zkc#?c^ozPJ^-H^z-f_; z+3j*VuiCCbZ%`(+g)C15Y~%2V1NlNkt%$SnpX1I&(Y@{KVj4dk+N;p2oJ+llnbS{Z z{Mu2+i!kYinS$SF)$)A=&nYfodw;v>6INo$t10vl+ndgIT0R!^5OQ91AJ23k$+@0# zJMir6?asLwPZk?3yHY1d!h^0kcV*!z9XF{UnQYDh-BZ;Jvg)MgzI7RrK8y#>mPa(p zFGHJWyxyJ={(%A}ro!%mt;qW0E~=O3(J(!D0jXd|01H=lvI2bxP=LI?K1~4N?CgBk z1Ps!{^xk~&X>iC;C~x3-q{&hY0wLW6PKv88c-9Ff;Q*ywg!dHBcn&VP(pU}m0P`SL zyg^5UVMd32m5OhJxsNzEIxjDlks{K2cSV0BAi|V25 L5S&7v z{E?F*?-P1)F&wj#zbGh@1Zygj538D*%zZwCCKinaBhb_Xk2U8>@jl$P8wr3Iv%2NQ zjtqjE_wn;9)-14#UBltV1VbGm3uR?x?~Yv6)S`FRz>1HIjD(jZ_{Hh$eepRNJ2wuS zXPv%&rQk-g#wA2SRcBvi1q2s(ou%( 3i(Hk)%`&*JB8%lNzBO57G2N= zcZRgG#d~awiACVSLyD!~2*zm2DtM9DxS_vG-dKOVztgLmmRqA%TD;O7`Q+X7XO4^H z;}VUVf8r}foi`=pJ#E)))@ZutkH#7b9s63W6Owqi?Ck#dle?W3PFUHy=nEGcXebSY zGj84xRA_va?3j7jQ!7SxB{Q7rirEbI7TcYFQFa?*d4S6?lX!!MGtz*BTn2sOS#NO< z@eF|R#<=g3BBSofw2RLuYra `ga({s{#f%R z_)XCeER&Lf!Px0BopJeZ81IN^d2P>HqjMrENDHA!p=IY>mg!QPH$MK^E|*WgBGP>d zMTF*bE1`Gpzt3;#o(!K^+MH9JC6o!dz;2@t_U34em+HDjn!M+cpF+-WP(jm^63?Se zehMvzZc-LI85 y`(03sL(-0ekS@TOl0&m8 z0mTarFg$+3y`a;j%k7Bw6lM6lU6&+03T%A{(p6kuPT3^A?I-y00VIT{)MX8v r(P(@nRzlnc!S&O?Bx?T}p_---ogMDY1$dtR0w>5_mTJF$J~QYF`zr8v5~piWhx6 zAfS90;z#Kos|*5`N40(+Rc76{A>W%f5MPii>?@uD;4;byza+R$hxLzoUeI!Qxqoa- z3G}*jwi^} LK{e%_r$^U6K)%1dUSMStWoi_g zZu`wvn@-tXTkskg;eht9e%`OdX@<}F5*6-~75`HEn)*hMv54@auSS(EszXD0IL6w@ zyefZ)Q><5&{`ouZX`neR6#AvAd?RTisk(Nnx8^X!sj^~2>^L|G=hlp Ii@8JN-}mLdED>nE0cRx9~Okb7c`Q-QkYc|x%Dvf z-R=0xzf|DW{U5JVUms8)ZIQ|OmB?LP-Gg7xiFR+_HOqvCwf_Z_tE>@Oa%XPnPR?x5 zn&q_S3HuF=H+ETAFD ^)WPb*YAgT5AM!>aO8BPUj@#}4kOnZ3=}R_#ML{( z8&k6G!K5@kvrm EzT79=84T*4*&Yh#)cNU<{+Zp(qTy25E )z>{Zn4) z_5}|YMxZ zY*+Rc6qk*-1?l;e0y86BrY08(ROks~mTVHmfFcV^!n?f#h`7?D#4hrwvU;XiMU}kg zK1lSB=T;AH-KUEkU01H5VvJJgUiKbP@jCIR{=2BrocDNjn$qiUQPLHMA$rB`n6Ik$ zqTZbMNw-A$NmhC)J$PUAO<7QNXZ)sp)rYz=5}4M{mT-m=(F0K#44U~TY-cvdl$j4HW$DOlCdh$fqs4`SayoHi}kq z7}cR^d~~-+{L>asNB5%6rPd-=eB5r!j{B_8pZ5*8w M2j3G=oOhhOx;cX9$q@8 z?^i*0b-+r_J=@@5m~SINtN*1M*zqYVLwEl2`b51>%bPLUnk$@rkq#M-M0S!LthgYj zk<%6dz0m7Jdt H^#NJ?>ZkIQSp1!_?-1fv zX1`){M|;JkA2`FX>9)1MyhBiN*^*3~AII75G;SZa4hwh9^)Aa8pUU^nnrBOlA42l6 zbKLq&tiz~CuE>IH{J{eO+ZQvUQU#S+7mA^+PO?Kd?VZ@z4=R+Kug||GI)0wpB)4{R zb31hTwk@a^(q?g{)pUmp^VO}v_X`Q8?kHg-GojmUx*&3SgURm2ENM?4hUP?AMl*Du zT_Ek|(y;Ycx0t#FvWX~_e9mn@Z|qGA|2bEF!mR!8yFNF_gWnFcT!YzaQzX;}2C5X4 zV+Wp`VV6v8d*X-gjp8>XDEUN0kY}$W`os0^s#!a}E34p1O|uO~un@PvMOwBZii}8> zU!N{!B&w1awys8(&zyEK3#%lFR0YlUljV}!y=L}0$#1gb=vB1q{4%nft(PpPZ9%s2 zt@{9z|2@*CFLrEq^%^eWvli;7DT$t3URp{`pAxO-?WsCvbz5lDDv@jm<@aW(>{zAi zA5pS2^f}r(vr^KgT{V~2UAw0&?;8e%X$**VF9iFI#PR?1I` (_C68 4_Vqb-~Hv`khKmy~dOzf594Ss^OSj&s_&-Qc*W@&k|$d<054da%gvslh)mG zzC-Ge;m^%M@l0%^`*V=t{F Gq<(2fr{_*t*;2Z)Bt;h@JTxW<=lNDK&gJAEAXvbdW(rlQ _Vzcicnb5LwpmS)%)QYCpp+0@48Ny~ZFf! mx$X=@jU5bwDy4LxkH6v|@O$J(qLf6FQnQ@Ht!EMilg=#B;Iw}UGsUJ2Tk6PC8g z)v2G({kGzo9Ba*d$~J9A&sEj}wKYerSGSFgMEfKgg|lFLv3vz~>2DN2@E1|DU2$Ny zlQ+zGJ=E3urK2t{i<_go&Ma=q_1N;aM;BtY{n>2xn~j0AqBF#Ec!0FmE^{ GqMQgtCychcSzsKt}I}Y3qEY-?S}gAy(po?9M0k;L!kceLw$d=>Kc~{ zP;oM4oFRQg3<<-BANudPzhuv?^%-s6HP4zq#AcQEg(e|uMl8m?DUwOkbIR9tH8Tdf zW8UmGcTI<_{jwT46klZi+RzZB+i;sS`i0HvZxcIpLM+X2Xfc|v srArW;Z!gNTj3V=)aq_xJR> zDHvT!vTQB&C+rms$-cqD<90u4mF;C3u-= |Z+@LJl}fdIzvS)Vq2$=wJW6l8y8 zAvgIo>}HXsgiNQ6mQ?4s-YE@(*L6o9UD*=3gi@=Et$ltM>KeZ?IFI0l>e4Wo7)uRg^CJ3GAP5%lw2~K z^KmX(q5rvQY-boqDx2}CDQ1MvwW`0Nc`&sb_M;+%8n#0m?YvkSOB9FJeKAa=SZ9)I zS#K~4M9)2?Il6g+K0&^^xiPZ^y%gq+(>t~E9U2q*rFZzO&4X!bs_kLQo7a{OidW=W z1@$iDKFnz<#o~p-HUpK&uFKx|oL+Vx2yu117uoM05$PB{yEK>{z*_XTE;2#=^Xu3g z*-U=f##F(n!1}-6;w#;^K4}&>aT$$V+7u5co~*fH;gla4u9d`}=6=qRSm<^z@^dY* z!0OVyyO#xG3_@;IRoo@iFZI`4oYZe;De^9#uBq`lRo`2upzd`{FcY|8`!It{gNSr} z?HA$*TEg(ICOQ^Y@iCW;_j3c>pw`Jw&tcEti{FY3I ZuWK=d;qZvO zo0Sf)M0r^G=+PG^P7%$%?TCI+PMl-}vFheyGk0pIqfN5q*Oz`J)-jjdsO2KP+KNn3 z&8rtFI_B{B^0Ps<)QLVjz2hPge-ddr!-c>(p*+n~lplP{=u=3>28_dF7eq}wCD8)i zmW6s8k(x8kXX@P}oq;4(d$yoV@S{i!G=!=ZU>K2nqm_^uM}?+_GAAySZ#V)sNu5k& z=6{7G4ntsMlpIb{v1|CFA67xIUwn^JMm{X6MP}YGPP$V9CvyWs>3&~?LA0A(R#sbV z8`{i;@)~a9Jdqb35Bf11%Q?m|^kdI*6AYjc-}jt|n3ICjzgcWNi5Cl;{q|K79=jTn zB(rk%Ao3Nafx^8l;?8y)Q3Krp&tB1qkmCuV0Ao;QBsRcgSsh9C)agX;kkpouHJvCB zH-Co8bik7Nr%a=5Xd1KVvrYtQoUd%Ub47n$Iq^J}NG6{&z?mxrY-SK3{dZ19`0M&n z=1TYeWV|}Bk+B~Oui^ytMfheK4aS|j={BW1yF|<1f+q`w={#W~7C(ip5|XebRvv2u zv)3lV1%mhAlGa`I-_w5SaWEHL^5@f3AJc|RJxS)NsKh-{!XDnh-GYDx-IPc)`L>Oi z#lc;A)MVSKAEPxEZ(7&mTQvD?HP9}g$mOjH%1;0EzJGE=)r#BI OYS9YwxB>ajm0LCwp}j`y@Mmrr4S(Q}hVlh& _4j1?JCkDR`{Dz-!Yaw8CG$8Q7U^(!prGyNG$uPI zV7NOy^5vS-?F_N!v3#+qtXg)Ax#@}{@;OVLz;2{MK6k@hg4&KhxqO{eXcCX1xlVMU zAG$JAyajDu5*qXIFt2s34+OKg*9D8ROC5F^4Pbf;1Ln?UhLNjz6ESj@(cYj8WT&bY zcL7!0tti1 jV_- z*;3PqG|}~ll!GeDY1KOApNpqgIMLaa3vB%rA w&-pSh|z z*pPR5iUjdfgoJ?jE&)5$K{2yW-RbGf+U1I*P&}%L(TK3OBado@bH2n;sfh6tuI^*P zoN*b0L~HAx2j^b179pX>6uvI$wjNtIDD~hI6;Rh1kH@BLG@=OJu2>1SOXKxEobC*b z?$QRHlJv#evkm&E3i@wi^|hnJcx4`nG*ZEbIF$~Tk_cvg68)G>8Mk1c{b5n@filaI zpfz_9RwSL9S##vZK4&nx?6xsGSenSiU}?48k)i%pZ0fMm=`pq1i|Ii9)6hI=!;w1` zF4(-qkSgfcEEF43lwYjta>ef8dqm;(T=FKOIks3PhGCY3(Gx?}ju5#=A|x zh+YLtYdJYN^|sqTxFtJns8VV43&sVQQpr*|t|w2%f-!;Y#q4S7nZCwg-rj=*WpH|~ zepwKKOGIPE_J4cT*xtEL^s(y!Ks-PX;#i&@2V{|Qb}_|rsS)4DN;iFy;_67l0U(Sn z0AbXO4~%$J8Vx7wb5Tbj7k(|I?|&&F{se~$a~ns jr^D8FA&CN1{-uwfY6xrH$`rO`~q_{bY6|aT*VR$mlA@FbW$$72RI5 zZ+T3+R92d`v7U9{B<+57xERvtG{#fpI^#ovF6n+1wCp0edjbHdYCTLRBf6*3!oaJJ z0sF VD Zda9zM_6B z=f=`cr6*;ntmTV-0yYfS&@WFmaO>Bz_|X36ca;d@V)!c7@h9yrZIV^R){J_!xX8o! z2g>=+oeLRc^r5GdZWYCv=Z~qblc%$4`~xK6CC_#(&-G1{yBHw#7p6!WaT)I7R3MPX zI-(i7aRB+Ykaf0G00!;4itcBLdRzwDwLp|1Q?1gdL@ZK`0pt&avfsNn;#Jd7;a;Tp zj5WqCUauc}m(CX!PQ6nM+oe9qjN$049bI3JOq-Kw^y(b0^1B)1P45WJtM^zWnFbWs zne_EjIsG!I M1il`!dlY2~LD^5ZO3|*_D(= z8(IVq9h6S)>ge~~KWYsvYPWxwF*W!UeiYMj!WG&5`f5R4>9IYJn0CY4%cIedoXhkE zzo%Z|O~U%Q-pSs-kSP@kZz<&p9O02BFgFJiB1`L=1NkHcsn*^CLAXUGJ+FcGSS_ac zy|}npbdmVqqRLqr-86fCvt>iZjt%fYnx_LuXq6$D0}Jm$hlRtleYc!w >_?*`$V^X#hMQ0X^UEy_rp%GHxvajJtI-s$O6S-rJGkE7Mx;+Sn|soza3PYxpH zd{{kXknVndvFv~FG5c mU(Py|0->u z-~A@xT#0NSsObPSLW?%-zO+UC8uFc%)dmVvC-W6ZptZ7kVcjk<_=|b^_Sbp+wMz$+ zH|<~bbgmrSxg?M??H&I%)K>9eBMU)_@wn$zD3cv@%P2LHM~sF0ssrgotq87bEPLYy zWh*+t-oR2zfOoJ#Gw{w2m&~oRYn?H?G{jZu_izsGa?^e>N(lcOofQpUU(TRY<1!*7 z3#Vk7wp}qjeDLnik4dJBX>sy5-Uu-MyP{;+cI2KX{`Iq0R mj{<#wNYDxbVXu?ziDaJ~pvxM8xHo zAglSdB*7R k`K3~_v^zTCHxbRdws8*UR?4QPF}ynW59#lr=}+8)Fk7- zy7T)mU@gea{w>o+<35LH9m5k7o~cfLzJq&}GBRD{hS0EZ!wsuH@3r_=P5yY|W-$}R zKWJXj1UTb*8I0DhEpmGP!Sh7O$rejxsLBYBc(8V$?Xy@%>I-#NnP2uC6pp^BU;gT` zP!JWzh|D(Pavk?2jgUJ$3zoJtG-zyUV*EEoYD6fq+#H4`QAI!FLKOwLNF}GF)C_&^ z)_9ayV4l2M55y}?Oie{HI`*O4hm99F|5G3sOdSnbEdM7gUS_PVsey0@0)=oN^XG-1 zl1mg<{2>q(Q-eyQ2Tbv| VlWpUFzJm6^qL$wMpEg`0$Q6AUban z!uCCJ7N5gwEqKkuM9z(?k_vc9uF%yNW#@l&KWJXzdmf5s+fkQ$ME5)K^1DaM55KkS z?)mZ{7S)1}DJ|y*oTOU`uaKQg(Tvw# Symr;vtVnf?p+@Lgv!4Eq1*@Gge zZ^`B>*VO6;w8OZ-8rDoEE;B&*Lq7K Cb%NW*ookHWiZ9&NDOv989fD(dt><<)?P5y3 ztF7o8v?7|64l)1n?qN(9p2m-|%-^}lIun~^`KHG;FsvahO+}zW#+$E!hQjW3!~(Bi z`|saI{yYoD8;v;TTmjxfYhA92R3h I! zr7K@deN1{{b(6p0`0wN-E#@B6H{yIYwobVlQ{VVsO;_HlAg~Set2)l)6>i^|`x(2o zu`>PcaO 2x263_YFsVVSVs@qCtEsJix^*^yv?j%oX`JUNUw?g2nCaCsJ@$`sx zE-nTKrh{FY^T%XiDHdC24}e#F{cl8|-b@y8Aqq)K5R$k#m%X;_phde!j4-Qf@cYyT z?g3pWxPoDRXKrP=!zWDhBOv1o)BNYP<2nz|`=U>D;$#NuSZX;%z4!$9I@v!k{mmxr zY__9mTF%+Quy(v*{^Ig)h;_K))*N3a^Y^<)c64^3*xS()3=$eymYb7fqq`p$adVk# z^)Ujf=G=azzn{uWz6PgHxWPNq+CThB@eByt>V6RTCw^VT$-Ar j$xcJm6=06X2@tV80YhCECO7f1w%|#y6)tBEI^VyOFbZKnA#zMWTSiE>@u7`Qb zOTnTfu%TIvGqH1`6ky-x@m=tE9t=vHYr#3IQWpi7R6wR7&y>BGKI7_egX8VkBELj$ zD+Ao4Wp%sdJ#JmbV!_xIWN(>GMo8Yv;e&u8o6nlSh4BgQGZcFNez&FDYg&IOk%Sm| zCw8mH`*)95t|JX_z#4XGxqKO*2?_Zqbu>t@{tOeg61s90=yTUF)-I z zuK6ZRk8ZkUTm8dg0OoCMfdS@o4Tk>ls@_U#E{5~GoKwx=siU`ytG#jT2C~ fv{t0EvXZBc4L}T$>V=$8&Mpw9?IQC2cZ5sQ@C%;6)8{4TGP%juHgHf;JC@)WG z_UBI{yi5wzw?|8DeJme#hm`_YTs7~bFWrS-YQ7J9-_Ek-Z^oGs82ybC(4M!V2rG@$ zIb&7K6 <{Ggvi{TGL|B zxrYINn)yD?2dk`W{K)G8AwKG#tQLsHvm}i3W^_ldMDI>EeEHw9uZwhzSMlFm4y0o- zH^b%ro1xkK`ug8b|C_A+zrH*Q)KE$1Miv%j0g1R{JxqZ+0}0Z@(PHXqq98%CU52l5 z-t%h!Kw!XDqb|q%N$mts)#9QZpn>5f&kJ)i@^!?^#-v4B;V$cf{dXCQ_r^LABUc$y zR3EY=TrFD# (rX&>aUi9>_ zYexfRJI}Du(b3P*y~+>5>dQY`SH80|7Ah}AZg2C0F$gA*VXHLtM_LVB7o7PmP+U0X zbz$*f3X4-02i5fli7MdM@`rwusTJxCcHbjBTKW68pDva0zhRjR0B^A-hR8ZI%?5Jn z=x6g=qFesKLy+K^0&VvG(b4>e#oFv2RP(A=n)EnmlQ>gQkXl(Gqm_SxxkRX%n%V^d zBQ6NhYPU{MV96e-l|<(laXDhqFfK46r24qhWeSv@FT40hD!V`lWP^geQ_Q&t;ogrH z`3EWkZ-Rgif^n?v^2&H_6V_8KcxFt~fdvKQvaU=8v^>AkBpi$bOg9Jub_fbr5b`F) zg)>-vroMu(DIT)Ymyn62Exo3()TujA*(Kf!cgZ>IQ$YSVSgzJz6kOxJBf)p$kq|Js zSwg9sP3u3-?|<$J|A(IQ|Mc=LFl71ijVJ{p6O*C~8~qMoRCAgO8#RqreqjBH_^S~Y zFf(ALNRJAa<7(7<1s2h`aNMy8guunPY!%knSdt+_fPz&I0VHd85~~Pvo*FIkOX|~0 z2EG@lNXs7^uzH(uBz3!-d7~V2 xVAXnttY2VD-7i%v30FT##vS`- zj(rf@*7J5AB-TKU^ehw%;uKv(Qcy`aL%bQc@s lsbD+F`96a5Sb$5$GyRihmD5OyrZ2@3_Q z_2cmA4~UVMjK_$XYJ4Tc+$i}O7xj?pSZ8JZ#4&Yhd{(_zZnvetKDVy%SIaVc%hhDn zJdIKxeMY4mo%t>Q>A?6}IQ;SlG#1QDDK+j&P$u-5S($;(l>av&W>@1#Qx{e+xIj*@ z$02nTKJ5Q&y3&YutM#8$A1(xrLB7W=%+~W1>UAq8Q><`jmc?m(5zW46l(_{So2^hT z+bVbAA2`S{Mcoi2usNlr8l17 E<;-LnV6V>9q9S?f8@_6`oC(Ec$$q#t*70*sLsJh zwwSgnM#M9uGF!IN4n@s?oKuoH8gNP!_|K04wUQZnf(#{`1yGymK7yS5{rXg`&6F@u z_T(g~{ci-BTU*RJKg !VAzH;WWQWg51?_DPsy*=lV^ Z6e@B9F_*h|;yAgGYq7vA5}?T-Mw1+UMBD*|V^%2?<&C*~Dh8VX z+i^@b-)G?a;g1BUQ%;R*wzgG3KpF@;7% vxEuy_ZIz7ab+ z!<{1-jGq1bcyFo_fgA?VbLpDG> vJa8(VeU;A7P8GKROtcatX _TE-H!?PE?e=2J71 zn+kF>!+P 5PuQk14CxJI`2>~Amh$Va 0|oh>dZw@0kU3SN{TRT@P6kjq`0v2PSuNF@Uk> z$=Uo9$2_pUpio<{4frQ6tk!dJb6;2jxA7xrbHai{w)W3`=(=}46lDu)pe-=c3yhx{ ziyL?5SNi-1t%rQle8S(nN!t7sBztkrpW>i1*bzg^MRGU)@MNw;F<1h?I6+|uG=2ca z`A<-Ja0~PsXm~ePS1WKN6;1g94WzMgqE%WdeX%`gsCh)k!d4NHW~EUs2xpW%pgc9@ z%fFA+umyc<7fX j>Igrsn0p@#+sFNl=C|Np>RoFE>jzyb!oyzC{-_sRt^SzIYu_2Ihkcqgbl50>kB z0C|^!vW;`jjl&;G#x1;To&^Y|#u0VuGEf>Hn4Bz{_FcVcY+ NIr{A=rl9@=DT4?` z1MkJua-mpmMcsu;{O(x zn#+HEh+{4`PxczC>eklMc zfTPBc7qW4d5s&l+Z&!b|uDtqHinlnTlmhOuaE#cK`=#&?x)D|78Y$-zC1f25iUW-q z1h7WXnHX?9e=Hp#m;FM53gmgv=eC2j>KKdk;Rf+d=WW_=QE|5c&M+gM1hQzj@Op^z z6nyW2U6D=VmM+xwTlg})Fn}Qbj(aeGY5)$5a$C n&`b