From a9905dadad9d9aa316e6bb8cf0d8f55682096625 Mon Sep 17 00:00:00 2001 From: qishu <1779009810@qq.com> Date: Tue, 5 Sep 2023 18:51:44 +0800 Subject: [PATCH] =?UTF-8?q?Prometheus=E4=BC=81=E5=BE=AE=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E4=BA=BA=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- api/api_prom/alert.go | 27 +++ api/flow.go | 76 +++++++++ conf/config.go | 3 +- conf/config.ini | 1 + doc/wx-alert.png | Bin 0 -> 81033 bytes go.mod | 27 +-- go.sum | 332 ++++++++++++++++++++++++++++++++++-- logs/err.log | 0 logs/info.log | 2 + models/prometheus/alert.go | 29 ++++ router/router.go | 4 + service/prometheus/alert.go | 87 ++++++++++ test/main.go | 158 ++++++++++------- utils/goflow/goflow.go | 112 ++++++++++++ utils/schedule/schedule.go | 55 ++++++ 16 files changed, 827 insertions(+), 92 deletions(-) create mode 100644 api/api_prom/alert.go create mode 100644 api/flow.go create mode 100644 doc/wx-alert.png create mode 100644 logs/err.log create mode 100644 logs/info.log create mode 100644 models/prometheus/alert.go create mode 100644 service/prometheus/alert.go create mode 100644 utils/goflow/goflow.go create mode 100644 utils/schedule/schedule.go diff --git a/README.md b/README.md index a05f052..8e88b4a 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,13 @@ - 简单的工作流执行 - etcd的备份和回档 - k8s的多集群管理 +- 基于go实现Prometheus企微机器人告警 ```bash ##k8s的多集群管理 - 目前实现的功能: kubeconfig的管理,存储到数据库里,然后根据这个实现多集群的管理,多集群可以任意切换 -web创建namespace、svc;web查看pod的日志、webssh登录pod、web获取集群监控汇总详情等 +web创建namespace、svc;web查看pod的日志、web查看pod的yaml、webssh登录pod、web获取集群监控汇总详情等 +Prometheus企微机器人告警 ``` ## 部署方法 @@ -81,6 +83,8 @@ git clone https://github.com/qishu321/cmdb-ops-flow.git ## 预览 + + diff --git a/api/api_prom/alert.go b/api/api_prom/alert.go new file mode 100644 index 0000000..3543448 --- /dev/null +++ b/api/api_prom/alert.go @@ -0,0 +1,27 @@ +package api_prom + +import ( + "cmdb-ops-flow/conf" + "cmdb-ops-flow/models/prometheus" + "cmdb-ops-flow/utils/msg" + "cmdb-ops-flow/utils/result" + "github.com/gin-gonic/gin" + + svc_prome "cmdb-ops-flow/service/prometheus" + "net/http" +) + +var defaultRobot = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + +func Alter(c *gin.Context) { + aaa := defaultRobot + conf.Wxhookkey + var notification prometheus.Notification + err := c.BindJSON(¬ification) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + data := svc_prome.SendMessage(notification, aaa) + code := msg.SUCCSE + c.JSON(http.StatusOK, (&result.Result{}).Ok(code, data, msg.GetErrMsg(code))) +} diff --git a/api/flow.go b/api/flow.go new file mode 100644 index 0000000..23b3b46 --- /dev/null +++ b/api/flow.go @@ -0,0 +1,76 @@ +package api + +import ( + "cmdb-ops-flow/models" + "cmdb-ops-flow/utils/goflow" + "cmdb-ops-flow/utils/msg" + "cmdb-ops-flow/utils/result" + "cmdb-ops-flow/utils/ssh" + "github.com/gin-gonic/gin" + "net/http" + "sort" +) + +var FLW = goflow.New() + +func FlowAPI(c *gin.Context) { + var data models.Job + if err := c.ShouldBindJSON(&data); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + // 获取 CheckJobgroup 的数据 + list, err := models.CheckJobgroups(data.Jobgroup) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // 创建一个 goplow 流程 + flow := goflow.New() + + sort.Slice(list, func(i, j int) bool { + return list[i].Jobleve < list[j].Jobleve + }) + // 遍历每个 job + for _, job := range list { + job := job // 创建一个本地副本以避免在 goroutine 中的数据竞争 + flow.Add(job.Jobname, []string{}, func(res map[string]interface{}) (interface{}, error) { + serverResults := make(map[string]string) + // 遍历每个服务器 + for _, cmdb := range job.Cmdbnames { + // 遍历每个脚本 + for _, script := range job.Scriptnames { + // 执行命令 + commandOutput, err := ssh.ExecuteRemoteCommand(&script, &cmdb) + if err != nil { + serverResults[cmdb.PrivateIP+"_"+script.Name+"_executeCommand"] = err.Error() + } else { + serverResults[cmdb.PrivateIP+"_"+script.Name+"_commandOutput"] = "命令执行成功:\n" + commandOutput // 添加命令执行结果 + } + + // 创建文件 + _, err = ssh.CreateRemoteFile(&script, &cmdb) + if err != nil { + serverResults[cmdb.PrivateIP+"_"+script.Name+"_createFile"] = err.Error() + } else { + serverResults[cmdb.PrivateIP+"_"+script.Name+"_createFile"] = "文件创建成功" + } + } + } + + return serverResults, nil + }) + } + + // 执行流程 + results, err := flow.Do() + //fmt.Println(results) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, (&result.Result{}).Ok(200, results, msg.GetErrMsg(200))) +} diff --git a/conf/config.go b/conf/config.go index e16337c..3f0264c 100644 --- a/conf/config.go +++ b/conf/config.go @@ -14,7 +14,7 @@ var ( Md5Key string Encryptkey string - + Wxhookkey string DbHost string DbPort string DbUser string @@ -40,6 +40,7 @@ func LoadServer(file *ini.File) { func LoadApp(file *ini.File) { Md5Key = file.Section("app").Key("Md5Key").String() Encryptkey = file.Section("app").Key("Encryptkey").String() + Wxhookkey = file.Section("app").Key("Wxhookkey").String() } diff --git a/conf/config.ini b/conf/config.ini index c714f51..0425799 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -7,6 +7,7 @@ WriteTimeout: 60 [app] Md5Key = 123456789 Encryptkey = 987123admin65412 +Wxhookkey = [database] Db = mysql DbHost = 192.168.2.81 diff --git a/doc/wx-alert.png b/doc/wx-alert.png new file mode 100644 index 0000000000000000000000000000000000000000..b73a5587f26a71a4f046ea61e23892c465645721 GIT binary patch literal 81033 zcmZ^~Wmp?f(=CdZ;ts{7xKk+ZTHGPH1^43auEpIwSkR)yAryCtON(1^J?ZTc(0Y!A1>zDy$+v8wI{jppLK1s;&i1q&(9Kc7FD{fbaP;9uJ1|G?R0?x zPpup5+Lx^6cE@1SjoAX2T+8*ImjG?v8E&Py>kgLQ!Ygz3-iZzB-i-UI)|}9@gy4T? z4&P|hWqHxjc2TLiJ#XV#P|vjo><}|I&9Vva&oXs|)zpO~H>MazYW#^+u-9hm?^uad zSV^@n528$R?^_JK9ycA5HR|4-8f zCG@r$tp-f6at$)BbcAxK*W)1CCx0nbWR?0-_wp{duR{F&z6vhKmcjFR|T37yam&b(RxoM)NtC5tZq$-?vvi(e5hVNmCg^^3~LLl8#+ zse}MFT3DyI^aKhwQ-nf-}84h5BdlJ2ie_z zo=^~jK~pS}w}Cz}{2b)abA8^>eq-y2aiAnt#z^sH4b3s5jl|$-{(*%^6D{c%{5TpN zNspHc%o>jI5+J~|WYyWK+J`mMa5-;@rTq1C650G``RB@?BXJAIJM`w(6{f)4LtGzElsJ#Z>Ah!b8BAu1 zW02c;DF@it901%bp4s#FQ%|r@4kKKxx~|CLIof^+ifWj+a*7xI&Medt5(9Spdf1wk zDm}-oRKHiU$X8>H*L$^6L^Xcpbn=;Gl(p0*dqb4w5%25vHGk?*V0jcGqUzPd7F zfcy`C3*@9JSDtc7{m=wdhHrq4kaBpV9T$}qOo3!H>at3F%roH~Bp3dJAV^f$!?BL&OP@-BaE||9deO%}qW7Wp4l`xFZ*!v0m-Wq4m~YoPu0y>~SCOKR zhlzpLQ!SFVsqxR(8Qw!ac0)!MLq=^B{tr)Pgr7vastq0C5)$490`D;cJ#=0k3f{hh z*hs3{6z8~K2D?+klYV3CU&vj7MJ+z`mS58Mwx<+A?_?v3#*nl%xZx1)@m(TB{kbp2 zfZqK1osQvm`{9oQSqUFJMX(e)%-r#)v-OVh+yq;``xWCDCUSa<@hbJKhoBgphvJ5}jr=XAct9Rl4M68hT&lTA8~L&*RQZ3{Fq zTcD18U>ES1sddP4f?@8c$G%(2sEGMlR}mDVmMcB|{(aJqPn7$rL&to@PP+8ZW{^;)&gqz2B%cH@giS0?8lPNSK_ul2MC0yDHUw1GeZx!#2hvU2>;&}<6`zlEdao9aS)s0fUhpF8n698oIjDJ;i=Noz zN`an%(rkQ?_W=xbBjLU1g@b{?WOUqb%%*;t++#GFvDcy?I90~cK?*f~!9FEOHdN$Z zZ5lCzYDS;Bv)_Eog@pygmd6yx{G)XKeG^(+Rq>Jo%Ch;>r**$l5x+fL*2^$3BNj5P zF)=c~E5~cjPF;vK;939CD*9}y%*8^=c{4>SBBkH1v{uI4D- z7-~04K_)B7!_(YT4UOC%`s#{`0102BG~Ua zHZ^bGU>oUf!3serbknA`1F4BE0v9-J5+N~DpBe4CCDSXI@lq>nvW+rC^}f8{gEia2 zjk12;3C(~f63uy^6sJJ(p>Deh-MN}KfMSg)OSof(hVtDVcP|kkr=J1ljr>=S*Rks7?dXO1ex-HNtDLU_G`(2Xdzd`*jiJMjwSD)8s8|eka{W>L;0T@hGY6y z%i6lZa1Vk6`Jhxnch+EV^L|d?T}j|y3fAVwx7YKxx!%Wzk@2^u&As&-8E-~y{KF_w zrdV_Vx}hUN>cM)1O3S7XtHRPr(3*D5=3{1FqbxB)pQCjm{u4#T6jqHZm<4-k|AJ$w zDs7OvKAjp>| zV{GXZ6^)y`2#vD$Hj$o4WF8Mf;5Xi4V(fpEWytbRBnu(>;caZ&-_u?dxB?T#F9hn7 zSw+P$Rke!?G0bBqziDU>lPAiqV6jk)q!BOz#|RqIU$LJj-X1pJ?nNJrUfbRpV}UO< z#(s|%e+%XtSrk}68VC-(RK@sTs)%g&<5j;G*1sA-@m5>^D~%7{Mxkr&c)iNilZ>+@ zWz#DNTf7!>;~Z;0rKrQ(fBb5IcRj@XI)~AC%8L|N zxMb2w(9JvHd2t1&(Zx;w2ll}0TSH!p2ho=)BsB@gxx>wu`nLgqx;jgpjJ~53KYA zP1(ADYJeAW>|NjBJQB?PKgjB33qNo%CxVV&myIMqy^1s<2m{T9RL3P*LaUIzLNB~< zfSYzP2g+>C$qGNmPhNGaIsDhm80*nhHj`AZCTy>A%J8e~J z#RaGVWHOJtu-Y!Q!=Qqp_r}zLB=uR~3qo&V$jRgG7=T$*z)o6|{)H zabvXCCHq$ZBq5`^V#0+ehTDO96>62gHLNeNtmG!9#8cWcAxcBBp8`UcT(MFK-?{V_3PG_;)czIR@aScbTT9>HaLO1_1abZS#!af!j`an`gkuuQxwah{#(GY-!$?-V;Pp z=0LS)jQ*Q{@?5!(rkWaC+4AyQ9#B(Is`mdNwpU#h?+3yRu6X=QHx}}rdUZcE_I@pw z?`+r+innIvVPC12r;mkhKK&L(58#Sug;sV$B1Ra>lqQa8yrzS%wvw$Jd2B$BDk+t< zGYsK7Z|mJ4vKY&UI7_Nk&hauhm&?J4?{Cgq*!qnC1dxy-PV%>&oO5MBfXbG!Oq0s< zwh#po*nozQoM@ipKd^asRoA({Y!Ug)kR<1j^ui{=VB*B(BznJ@Qb1ER{qD|LySqj3 zX;#K{B%RL}2WQl7x7^D1d-$!KGDYVk6ryjg;pMlYK%n>}(aRP%#~IvZXW%Df$$@IF zaY~)SCQjjyyHFLcw2Ew|1X@crAW1x(AbpJudZ*QHzk}=|;032;Or8TU&mgsGaoo%U zTf*;xiZ7S8n%bp*P{79ZUNvq1$M{bUQUyDhp9AhWgWpy5$XPul2d+`Ws7-riQ}j`% zZKY_@eqIFgHZQXuMB~%lo~~`CBz@p>d;4E_@AWy3bt~bI^~yBM^~j6VI<$@LIJCh) zpz8mcZFjc)8Q&jkIqSoZK~%!koQ(FCr&+GMXRat?gkE7JsRwpAwum8>_YBOASWP$7 zk5qo_5Iu+lXZHKu=pI;c3di| zFa1a5mPygT5ccE!2N4J+o#=kB?ks*y!3u-Jnl5QLecmO95Zt)pOiRSjP=cgxUvtOkL)E7VEWA>yT3pB!eN z4iMfni}9K>kymqPR|md z`d(Au{8>agg>>N=M4#$z1yWd|f(`$dBdq$i;H2K(g$H~5Arb+1BH)iUx$>$Em_eax;!A+Hycn9@puPZ~F zL786~MVi&~Wjetv{N z&8T!A3puCqX?Wu0!@)b_H%QWu%5ve4i?)7YXc1r#Mn6=n)oq z6@!jd{5*!=Dy)6-(%&k2UTzHnn)WhkUXx2~vf1M3MWV`fvy=_?_`N(o!I@1E!G~y0 zO3ww~0fI9gXIT9;BX93>F_wR`=2OZzMdJdMSYYvlST`3J(kK_(HvR9`%^EYOpu?Y@ ztSQ2@y1IHNi(p$9fB%<|)byg+8h8kFdA8W#cBr+;kG=(@%a8cv3t&PA)gVw!>8`}wF6qcoW?UfiwytuQl(>Mmpw2$ zfAuo%A9DTQi&h6F&OMR}go}Lv>X2I(|F@UBem&QZH;JT5b8d4cta~Vn3g;(ZeS?e4 z)YD{x43La1821@7U>kYfHBe{1joE^y;^ts1Q?7TU5I>DbpdB!I$U99(gM)PMC*#hi zdY>GR@GKDAOGNixHlOrf2heyJnZE*N{0I-HdS8c)TYbbyiZdsRU;j0X_&v(f5Ix;==Tqk)pR#Upvpor2nO%Knk4fc@T`bnotwnl z#5XrfOti>}DFl2!qTv5mf(c9Xm&`uin}T#2U8E|NPx2z0_RpJ+t{RggPQ8~3+i`0K z)UHe0AX6|sxFku!P3-D)BL0us1=Xv6H3J=)M3ZPRDG6);2U!>U?W(tG;7P9=x1Vj} z(BMYN;y2O^e!Zv{mOOHR1;5jZo)9CR{2avmC&`Qduc4#@d%q_Zxn^3e{}7h8ixxZE z6JO^JE=+Wv&ar}NC2g<4f7E+TL-Iag6!ThU?`fi+B#iSFB|3J90P8A-RZ>#xraTW2 z^6SV-?m9O-`#YD5-*X=YuYmQ$>B>>k?*}U2$tSmgMwy`;{Fvg(7Hdbw>Gzec_d{$E zyk-bfF8(?C$~>!_Wafe{p^fW7wVlqi636iPKR_GvK0E=Yk>451NWf#k76E|`5U>$%?~vqkNrcxDA_})02+>BBbVF-AT;7R|4fhT zDY~|NSMZH?CgUt=8=1li%mviZ_vpP$CWvm`83ht20U*bdtB zNfC&~NDEB9PJ{f6de}G5X-YpyB}0dT0g5FOh4@T^<4m*q0x+5yzWW^mI7TPI_+)iK zUxJ$dzCMADLaut|%xgyd2R*?~-35m_sm2}=mw|eWvka)c$+xK0ZP-4aW*)n{j5hgd zD!oNuNC&2G(cy0B-(2$3)bUy}`VnOdJ^+vm`{_G(h7<~noL!}uCoChPKQ7{3o$W|N z9tL@MO*;RCE3z+j!`AHI;6j0`mpVbZXSU8R=y%mOS>!=P(gm`JV6Y2&BIUn^)bn0}9Ni~LEk(M^YhuM^8BvUjH9M_?;PMu++kBU!d zz;7pD-==If-)rG?aqsQn(l~?Nm$O%5py=u2r@RVTN4V?ZA#ZzzEg3aDEmT4QjY~HpIgK`>H(6Z9*z&{9l@fId(Y*H<(Zb0p9E`)U%733Q%g6?5)`%4M z-1bxe@xk`4?_TC zUy29)*kHzIUPE_5&n$6$5PV+R|7f&9wk&(aGerFoUGLS_1W%p4wd5g~pd-o&D}VLr z0GOOnFJ@BmUC^fhw7_mTycwmpL$-XSk540Uk8ZTfe(1O2b!R7)->h)uTcd#T-x6( zhXL!_|N7l?lRy%!xpv;$74G??9WK|@UyP{hekS-0F*X4z6H{0?(p;5_G{LHNXt%hR zOE=@yqNn-w>Mxa@LN+7eow?FJx48l5$G*fc+Z_q%#g!F>sV7zz-z0Ze69CsU4O%@G zA3SZ`);o%&>+L80h$K>yHb~A;7tBz@r121o{f?~=Nq~&hTj>}oV>eu7YDqy(@%|Z5 zupNMA*p4jO)b-J1h9bE}mufoJ$V9t=$*~mx3E6O}Xu~Nu%8An8v$OmVx<9p)$99oqNrPvF&K$sK&m=N!d|G@}BpdTILJ%f_ zEgDv>PHw^wVanb=yG-aaj1r7pb0M*6W_+D;^{LBhRiXUHT?NSKC(~M>)PXv6bwA*5 z?zHgFd9X!TJT#tpS zu}K#;?7PYFs|KdkXwRpH8;l6$g*d6T&pzTm<&X3_{Euzmi;teRb?@LT+*6Gaerk&O z;8(Z+!Xp`Kq5!N{yXry-L$zWCDC=P$lDvtrFkR0*EAkvei;p$u(hM=hi`3n0`zABc zAs0`<`Oj0b1L<8dgstdb_4)cXG$udq_@-9;d1Q;|1tx1UD9^k9V}Oau2C}9Oj_mR} zYPq=@UoD6$_t6L_X-Mbw_HGe0t9OkgZLZxx?r0a`2;U69$)l(?50AP;Jve)*NY55i z(r{Ktie+ceC*~F$+wmy&d7Xq@Tc(YrU)#Vn*kR*po?Q7~)#%CT)BM~eze#s8=U0aB zPf;%gxb@)!Aa##$K=4V z0=#O_d@BAqrn7z_u9gf6fw!atcw0aHLF_&j3gs@#RKaI8*mbTyip+MSRQU<{>B?UD zyIL#BO&(eZEs$e6!Ds`IYD;t2&~S!Q4CHqV3I}8#D&2=oG|^1)<1|%q1I}YfP}e>z z4{oWlK|w(`c2ZUQ8r5VkGA;A$eGS3kLlf(g>gPgE{gM~PsQ-{MPKmy$Jb3|$X!9FeN(C1%6t~RUYiW zpOoVt;evPh4i8}MKok6tnnF>WMH9DZ!KX6o+z8 z2E3kJTh&{+c3v3g7rg$mYM~FbV=n0CuOY~LJyD8EAX9F>G+At6sS7CirKqpF7ytY` zO_v|&Nzj3GNcHl|%Bt7fn614Y12dnN?D=})>&y9H-if>}3PX9d`Nh!^b-m1;M;Qtn zbX5X!D%NTpZI;J{pq;;r2J{YdhYy;0cw+0~|3j?$J}WlZrW@g1U^^iZ6@!Xgv}65Z zlRjDePRrBJ;EXk|}TXgu9!1)Ap{TzJMa6q$B>WMFaw;4V#X`FH85}TM1^0S^D;7ZTofUrs2X9(*NV0%N_N-Bt6;ndWoLEio_ z{+fdoZLljBBXHD5^WcyIPFn3)YeGRS%IN{LtMQ3^KQ*mDy$qG^Urjv5|F1)f3i2;N z4`eQ4F=Z`csr@4&2dJjq1?76%_nQM`#Ls)502KC)l7RdVd=db7`6uD0EV3``G?yMs zu=GGwkFXPiI?Udak|!u zoOMPhX5=pm$~!m-mc*&U$w;D2VGt((ZE$JTbTx^zjK9b!^n62Ly^zyTqS<;@W z;kA7BhCu-foOpGVPFd|(GmloG33JLVFj-wU*j|j`wb1?7BVC9y5RHuj-W`0~thQv@ zf*b|Mf7MA4F+Jp)`%1k(~Y!ECB*Fv7}FO<=a{*W za#Hu1uhV@HYNFy+?7uhU-n|a8#OQT)6-uwI4ONhyf* zCljv>1gb`?Z!k1g6PL=j2GUp-Wm&=67kTh?t^YSPVN%mZ_@q(5qgs>G%-`UB55vt< z_rC;HJ%&5e|wLF9kY(!f4EYZ|s@l_@j$sUr%_ zt|d4bAfsExk%%<;6WmY$rW7CnQ08YIZ(hV;+dV4~9HG1PNM{DO*c$uaOiB?4R*yy{ zVM{|XEcHrG@4JxG=~b3F!^M3&N>>C_ee>1DYh9c%eEH0JUXII2=<ap*6)KDLX{a3F z$&`vgyb2mIIWMHy$>Z_xP4mQ|w2q(4nJK=oe_4p*AlPmD<8f;3ps`NSF{4 zpAxHJlgJ8Z9%6cP^e<7Fs6(+WUJE8Q@U$}dLzKN(^JsHq!&)JTkH8MP4U`Ty{Ex30 zEQQ*J!InY_vPy+YoL68x_){#)8GtyD=B2H3&6w42yDAe?pOisDEYmY~9hU1gx zo!`I9|BVHTE8pQV+R-eQ_5gF6xOYA(KE+5bx^D4u8~sPWqPw8)m=%mt0v zC?0VdoZ6qb`vhG}+9-s2VeiX}C^B%YcRxfg^4$~{U-+2vYg}8YtY1m=sot;3Wk9xCieiF(KARb*NF#r#aE@KhHFp5GDrrhSWiTORf#>HFd6(lZ^DPLTMxW8mCX8giw}dH1Z(7v`Im`aepSWTp$D;F~eKm5g8a{n~T2ItCse@me;i zf$N*fBJ>p$!g{pLG)=^CT##&lDk`I&-p*9DDl(s`^u&8mv3g5)HsV?-=*Gt;PZEmd z1W7VPdK1QI)w&oVOgvJ2WI#ZnEIi}8cT;oSrH$IVpWVX1Ap(%2w+eqJR6f{s)BTNN zQ2VB%XAIqX@w5>sP+V+4mP-!M9o|EOCVuP_hFg`;XOUV)q2iLSW$w?m+|yQp*}AIp zS2Fha_0wB+CvZQqNZ6Qs(&_hKp$wf$&kr6%t*g&bX1-5<0WagHzq_lB;PKzJU&Tm5 z^{b*>3KGw+yb0M?2Pw9YM8+ z=7!BaIbV*l$b_ygoCht?)VP z&%s)g_3G{oY=#nELAQ@-kcmih5JsUpwJ;f6na@bd>TICq#Mi1je5>lQj&;I=zM<}s zL>Zm}iXN}qlc8TVQ#!@R58LDOv;mHhPP19%Z^Nwd{!$Cx(nE{;%(rbbMka5vZUv(` zu3sgYG05Ia3ri=1&+O-6a`p0}o0`5-_=P8{5lMzyh$gy>QFD^7?NHUR^pDoKWcJC# z*b;yr)jyLolKz@C3spEKh3+(LE_&UD)f5{%?g@ml*kz^PPN*)fwjlgEnQS^MnR<0s zgGec+E@=CY9FxQ|?>`i;Tltc~{Rp8AP|iXq*6ziwUr zwKCo4{&%PZt0-=tMld&}mGzFE{*Kf!`Z1eEB-H4b2WPy>;dwrfc znOps$Yj0b}=k^ir=A$%3Z>Z9QiVts-n>HyFpc#<_z|?=hVi^qSa+5mpc40gvI{6rz z{Dm)-6WJ2JYdx~6Sj~NRl*twb?^xtwRv;3ZE*0YKFvvfR(IRGOs1m>d4lG@2RY*!% zx@k#OyEK~hf44?BGHfOegEu_)5i#RyT;YEs;ho(N7`Xf95<_nNp7aY8TW&9?KBoOr zR?=l>XAyM2+dRc(EL9C{nbTaFB1F$saEe_}JYMdIxUzP8-7iW?+nOh=@4-p!=uvj+ zgz9?DC2fN4H`l&sU01=5iGF0`j;CfI?6`K^%P)VV1M9>8@k@(yK$fs74kkpEQxX=2NahaCyK?`D zJt`WrL_SfbgV6;LlQ~)Q&=NmO}0SOgW zni^xm^-`>$#ZOdePY|;3X2I|JmQXtwzA46+kDnXi5bzVoLEh&o;s<|$InuK+1B+mXl2JbmpqE}C@P#Q{AKmD zb=bVZ=!-^A4m>@PE( zIWqlYNrm-4e;;mc;^|ET2;ZuD`m zva`UY$9KDW<-*>SWEw`j&YPY7TiCcfVQ~l?9+{m3bG%fZZe9(P#b4z#laGS44#U=#rX1CPEhF>x6rmy+ z{G|6Q`wE|YjhdN`{O5EO=oj(sU;;~hePOv#8R z(-P&_T^--EN;o=yLYm1Qj_d2{K#36z4R~Z`oM_GWKWcy33W`$46l*VOlz_f6|50@g z`Js+I1xu4xC?MUNN?|f)C2lvOJw^5_F*RJIJ&TB{Ku|Z~dsM4UPduzXLRY!VNN6Qt zMA5ElUxD;Di#5bqnj8fv4$FZKzTr88OJNKGceGr-MOMf^Ju)79Zj#o^0OmuheZ#+! zwfq7#f81(`sK#otbxp=^YtNp#8HJX#nZHf7SAeA%EtVS9!*QPG7FdUKSt+%7vg=X? z)S`+^)JS80MH9`SJ5u>Q!HKb8kysMMvih+h`WktA5U`J#hC9p1d?t#h>DznJJY>TV zNg7qpl^V{To%mo0RIVQ&W4^%uJBmq6Ozs%L7)_rn$!0E z0!T*KxsL8$Mv1>tz?AQUpU*05k>a|XPI96r7{BtMh@y>cKqT=hgr$fJ5@=;2z6(wv zYK3EX1n9Dvl}K#a)D#ali>@*yd?AsL=c9Z0SBD`QsQTM*A@r*4x$?X3m^Xdw7a~+~ zBrT!naUM4#zCkZUKp|AQGC-}>5`YXswHiA^=wlK2+>Rox=3C!g1QM##lVl_3gA(%0 z&mAg~dC|Be9^oxrE@tP*x9GN8zfbfJu_BrLQPQGj&=vk3$vY;?P%o_Y$pPa`nQ7~O z1aO^VhIYz~cV7;`oIfzm`-(e*9RF=9)}QtzVT22}@V?veR&~ky2voBp0K;}}Yp@!! z(-dQ)Ng|JnV-$v`_Fv{fiLA|48%XwQY=v@dDx#|zN9@)&mNXfPeC`=f*oxaxiR>k- zWa{JTJ|t>2uX#PR34t-%CQJU{i@^v>#?bYWROvWCpWJiKDhyL8B|#0$L&r+4qLXjU)hI4B;aV#%O0s1yeTuu53h9DIQkFH#oe=%)5dDt0T2gOMexV?qe( zs35bPhI#=P9Y*2BmGpIa|{K+NE;D-@=CCMCuY|4 zqmQ-*fcwk~IxU8_k@2^(qLkh|Jh8)HrWujR~1mF6kkE$0f`Ye?ftYqR@YI1J*x#3V}^ ze|Ml)nnY;CyN13(JlkbFZ8ifTGU!YyZ@*qel+rw~_;0Rogl@J^VpS=K5{h0pliB{yL%kteAwVndvQs5M*Z@WIae zen>pQNr=k1jz~V#L^RNW06G=^w3!C+pUXa-Ee5H8q?13KY=)^-h?mT?oceY`>S6IF zo^0b7Czeh%snL8)5e*EsQ_bk9h?X!5e&Du8+l#}K=M=36Tmu+YLtDUCAezZ=bQ&E6 z-1|i1q3*&@)P_+mdAbfip5WhuVUJx5!uO?QBGe|Ti?qQL)X)0`Ft_d>P$tY-fvgFw z#Wp@xN)Vr;D-;6qh*=r)QfXvU?`4QAClKa1epKSfM0r4=Nm7lG)y&Y>Sa*GA|mu`&?Kel2p0%pGm)9+_j{?jEZ7&)b^G ztkfI4GV98Zi^B!nL`N0x;-Dx*EEOQz%P^FhRl4` zeDYm}+$*@`wia?EX*H4=b9Dms)g+Vy`yj7*`kFD3rerx7{J3g~HA_oC;3Pf8lQd(* zGbbUu6saOEqU^4mXM;T{p5|Zj+o(NZ6V&+rQx6fO? zD*X28k+je;VcQ7)ncG-f2^xIsvosp%Nh-;|BN-M4jVuul;0SG|hs~6-g}gixrMSM78Y)6@=UG<@fPI1)3mMDNGs)`eW^a z1u{7O0(fE+M@7hnAZk5`NEN8hnov?BbaGRtZdZ@vqviQO<2%!apiox0BYV#K0jSVd zd`m%yx{Zn6t;x-4aoMZRhFU2V47P38nW>0RDdR%vjF;b@56lkmhUJI2zZ+aq#~1Y@ zSGMR>wCCh>MgGkOvIw=zMv2jVBv}0Q;e##o-Ay;eFmC1Cc2R?C_($Mr8jN(57BGW~ z*r5SiB^uoTmeYJV9DfK2&0nl8Au>e@J-htH(6(TJ(MV zAlZ8RZi-%y6vTNTy4zRdYw;t>S!65zUlyU!Uw=qo3R8_=4sL{=Oj++62;DRq2zLSa zvL$P+vp0NqlL0f8Em5v(Ms$lRfWSbvN5bCw@lF4)25jv$PzI;hyH~d>@bB{$7Au#H zk|upvKDDG51EZR}5qCYD2pgqFE}{sdzm0ZLy4yRuqM_C`{r&u-ArM~rtlI5Ly&_y3 zoK^&D>W6Pi+fvg7#g$|W(02||A(V+j9_r<5YISJAKPEMs-p%3i|L3oKC5fEfhh3h_U?@` zmG&(i)s~E0XnYHgPVmbvO25x4Z;?(IhXaPQc3n-4g`XXH|01KASgyyann?qdOawaP zPN`a+7#%rr$Pe?VXM=Ei0Zes9zZHTcH{P}r!C&ELx04p?(7WJuHXTsJjboJ97evlz zqn2|oIqF6Cj{b*w4`o1!Je zc*1MMRzGOyO4VFEYY~l?IG<_MTqHCl1@cg5P%H+3@BHy!py2gxL-s{SW3)w${Tspd z-SH_Bqe9V0qa}<>vkG=Amo{XE)%f5+>x0^|0FKPwQkSJT|@D^f41wf zQ}l6X))cn_4Yp~jk4>l7k_E{XHk8v{} zV?+uNp?U{^a!@pZMUIJCVI(CWZ4*WYbIlrWSZ$wAQqm>w!|zH#XINb>_GR+p+DZFU z1@6>`I_Fph5|txa2!r9bQD0U^EW6-SY19aEk1(}ja&ETL-2Lx5 zB&zWl|1tHhi<@gQDl4}nln8srmS4H37Kf1BZ;tR90EV;(BhV`A3oRn59x9^Qpz| zBR&~~Q55w0RIK|a zuHymIh$V8dtks1HKOE_nY-_!-8Mo0amtGdqP2LAYm;>MsVAxK!4c{wa-|h4W_GmzR z!0=m1-+_e*gS)H8V|L@)1eg)q*bNeXWb>~0W8zA`8$ENANcJvok-#Uei7v0>(1h%F zRq^b-Ld|Dy>*LQ49^=>6#03iVV^ehXf^T|Fq(vE# ziH)n}(zlYJi$TRB6)Z%caDzUd!}Yj|(wHv`cI9E^4fBLb`s^4onoO=_68cS~4KZ5G zSck4i`gusuOBR6oG;i%u*(DU`CJl3nKp5;YZq7u(Cc5oaDmn8X3~Sq5G3jO%WdQ(Y zH3GWaCOF{A>s5Zg;u>i}m2KOY&N-e$!0pZoAy?Uocfh>O)O})jM2}CIWNA-A&i9U4 zcZ*$P+j}`dp--*Yv-f(0Zh~oFXj+cFl3ME;GRshJmuIYq3u1XcsP2bDXN-}5A8!PM zk{osw$gIj3Xk{H6LG>?l?cX0dNUp1dLdla zRy2=q(&Ws7Bwj8TE^pzZm#1v>w|W+M&0=sx?Z`d<2wnw$M<>GhE07jXA#}3n16BfqT5Lt&A4YMeA&!ep#vatM_7(O5)cJf@19#=U~? zp0OKzA_=n^V8<9f>Ny)UiVV+zVUcb}Q!$GD_ayULxEuPOOxuQeqfQWh;YiG+3Pou2 z7~NI8Rt!L9g>D+dYfX9>t78m+eGd#plVe=QD@|hsLBbUeU`m^NF}$WJ<1UvLI$Ev5 zQwW_jppEKh+4nv5M%!D?ipGELtiww%boWu=R*M?%-h1)deIxt8_|R7xeo3_7%z|X4 z8R2QPpIHBzV9q%pZK;XYGD~Fy>QGkGEE6taamJHSCkMhY9!h!9TujG?ChHRE#~f(8 zfnxu?`rX{jDFe~%p|#XAbp8!ADu?$Nm*MXC6~g%gAn-i?p|UL?yTI;(N!kX%3#;EJ z_I(L^J%=g4kC%9S7Kd=D0DTm+C%sxj5ybXTEK5c3XC}q>fq)h^e#fXwnoL|_qDku= z2DltFs1g~ypc++d(D{~SU3!KTE&$RwanOG%sjqYF`B@~izNNJ!OUJFI&aCA%6YI^u zjme_92qofUijkU+p?zPQ+CwG-Oj?izu_>^mfrXz#I#*1)DFBE{1Pvr#(iQwBfW=cG zm(5^1_=ZjxI=mKjaS{c_C#jj=cx`SV)D{NAU%)6CFCe+=Y%|zvCrf#Mp^~MNCz4Is zn%P!|u+KkNMcWXJ(72!(r zA_?E|Zm#SLra8(H3r!$y{!8fY-c6}Ir6FMApBkUkR}HM08OqeZhnH$GGN1owHDz=# z5?0CFx#@h4Fz!-azTTN$h978@=(Kz^P4PA$m>2B#f?4{Ef#Ty`Y2f*_1Z}U|cX?j0 zafDC!_sdRVkA%O6p~=lBMH@-OCBk|<0bG2K3HD7U8zv*$cyT4W zpD&x~^*^ADtX{Q4A&Y6+SAUK49>U{2%@NrJf6LFmA)oG&a1Xi=?)&Wf)QGC~z5Thi zZ$h4SL5`O@TMNEW8_l&{Su)lj@&kR(dwSU2#>uit{tiuTKD%We38YcBRNEt@{%)22 z%yB=1oTj`tyZ6;M2Y2Jy!UdGWMs_Bn&%N)|-j$E~#ZyGN%D~UbR0_a^LzJ2zO3_5_ z;6>$1eu@7?zk0%Z)O&7p$o9HwrX9uEDiR=oi-6-xP{5&uM(_o5Qa`7+>e&`zohxt7LOpb6pk6Y}w=OIRk>4s1; z#=93bUExPQBbE$jl@tu!tW4}pu;_kYfeZgkAGM^ZCzQN0VuA)RaQf*To!oH^VpaR| zlXKH5Dy>A$t2EXu+O@EeoY;>VlCQC)NxXtP2@1HWH*p2$O3w7s(1hy-2Yk#V=o|_% zmXUQ2?HT)iVY^Mm_gS|cOy?|Cs<1U0fGThijGy)O5fUDZnQ^DJ z+aFOzaO9;L&jCh37k#;9ASdZ%GA+7@QSt&)h(o0*sws10guqvL<0` zf<_A)4etTFP*&zkHeqO+9Zz5TI4=mLG$8tgv}1~|o~2X9kLw+m2ol1d7B$bBNN^mC zPHaELWA|GAsNL?iF0*m3B%C>*vel5=1GwZ7%Lxl0R`jo}zOeM|js-Z;LifuIp!nK1JquKs0bH3tD6}>#Gi!$aotL z4H$$;_<*ZVPJanB@F<)#%YdzuRMkGD3@T<7R~KG3(d5H;L`1XLsB8TCcxATd&-KF^ zel}rCf(4&7E6YP7h*n|{RufoN-ZrYUd?6IE{ZZR`|1ZJX zve0^Gi0Bg$R9w3nT=%7YJVO=MxzLkLOhXDXKGhIvp?mlOb%X#T9AQLNCXv$}tgW4< zMtBK1ZQOL$k8sv+R};?iKOOW#uQ{#dEI5898Gk))dz>{qz-eR-t8aEyYYAyuSBA`3 z#sROYw#Z`^P;6r}BNbf9y6hA5mpuIa!Au|=dsI6Y+v}q#yWrw!UU(V5_P zC>xy$c+_y3>Ebt$PyB!`5+^zRYG7SI#(l8mSz+LwUW*SGIaC*Ax&&_*2MWmLGHF&y+W)?oL^!=K*? z&LnUSc+ivbC6>T#yA31R9KZB3{qxWND5d{DmvQo&-~Va*alCZ*bQL_?wdT;!ZtA(K zM_XF@$QNyQ&Rk+dhX#ZlbRW2vsB^0d-@vRmPhtunGnWW2GwwB*ocvpXnfbsi)sM&i zwHfEGG_9OY>2D*f2wep}BBUxoGtLilA0k0!B&xd8>?u1={uv1KC(rpA4jQQA5On6K zF2Yt|A1ZnIvF7^!FB#;c$@6Hjf?{@=D_s!OgJen#{YLE>!111BzaVvqAx}@t@DRMX zCZ?Jsm8sr*l5DTWix#bx|Gx8!szKWw6{(gNC#XW&Fv{SCR;hb|ztF|g)6+Bk9yXZ( z0>aFV?@^zzkvdDGLShPQEm|1_3jQGoPyLG(3VnW6EY7}Uw~T_w1p%( zg)IE}6X}J{(dK3k2oMk@!sJ?mI=$j|tlaqcEoxMj+2yXMgdt>ReS+z=c(B}RhpW*7 zn=Q?L_uV>Js{L8@25r76O9rhPZ*X=eS7$EkRAz^-z5?5kN-jWfT}-hVgTmFaB~E3u zgL91=hWher2k`e;2toF71#`zoS&ThYp9?sMh6`02P}sqo7{y3*!|#lnc`mfSR{Quj zrw@i1ee&FXJlGj)_qa^dDC}%5ew-nge8OxqJCAMO*GKUAb9umL{p}@Fc!3O8?9oMD z=%??A@;qj!j-DvP7|;llst@t#mUMJl)T(h?k}%{@6+4yWvX2F7+7YmIF+-torge zp#ewG$Hz7CAkA*=&i5&JR-#HqjId>1=-uiopOfN|OwbjC;<%;2ia0Sm-%;W;R6sIH z(cj}swyUPC64B6u|45WEx$eU&XIML_^3Cqpw~qqH?e`)9kb@3IYG$O-FA0DryJ`aF z^RfrjPfB)ia#aKMC&`ZhBFa8_#)K^@r3&mE#L=d2k7KqKr#|qOEN8z;TDPf~%Z!wa z#N%o$M+xNVWjbsNC5ko6){8_4tS-0T4r4(c90wRWpdAYWcwU>5T}(|xhWr~)7qD7j zhm>ncA#yDb#4RI8PUx0iM=SJDS>>7BQjU#Q4M_htF0&M$&upeiI%k=z zhMpo?8cRB-giEk~03QiNpq3Ya`+hT@@x5FmuE={FG&|HELr}u6A#nuZ==i(F{S=QV zDHL0!cr}q7QAM7JX3XKT8#(z33a>a^15S+y}_avulsxguCFA_h+j~+ zh?fzI&9=6yOur@iyrmyuB&xPc@eHknncrMj1+6pG><*l5(=tqoqjDipA@BKu^&0Z3 zUEhz+(3Qbv&^N4ZPR;-QA@mmy#eCaSZhYC%Ee7<{ifz;x23J1JXu&Ya(LL}~tEKAa zzJ#OuZ4X|vmt{Jw4TOO`riQrKo;R}pPtYYc0WF~oMPZ29iYph;`vPL$-JLe}!TpI) zGJsqI!L19J>%C}V_1t2gY==HzltjUv{EhD;u?s~V-6*N{)a=W6N1@5|W*XL%l*;%+ zz0KGRp!mYQnKr+_SYput0T9l)jcLd!iNk2S-lQb@lUA9o1Npomp8S`f?rWJ}FwR&@fc#lR zp%r;OhAKWv)~`&tU~k^Ijx*U6iOgrA&=Xg-I4{RGDqCb@nyA4T#;uQPV)<4qm5lB0 zZ&9y7AdrJGO-8uDEmiQ*%Cx+;H)GEr@f z*&U@Hb)@oo&Jep{{bdXw-E(Fr1yYAE)w)h8Q&z|*ka{6Ftum>xU44C>U44(3L_r@J zY^Z1VAa<|ord~|#69lBNu z(4mn9b7o&~l*OgrO@>GoI!U;qi&;|rRw;j?L4Wo_g`hc402lR(pfsh%*7Fq+asf>U_qMr)8ks}#U zqH)v+G?k^=p|xLkBsp5mtr?|PZD-J0Ufnkj0=Hv!HUy%FH5(f&LIJ_(8{Q1s5l=* z`_>h~nRSpJDUe^3I$FB<4=QYBt}eVXC{s&9WO#%j%#bpHV^o5HNURUrg}$hGjtODG z5RCq>@L0{;1J~I5|NDAwGLC6@`&t&g`yU+Re|p{hz7&otk$!DDxw`Vwmcl?ZQE1{T zky!A6syOKK6&+b#cB245#eHgLein(5Z8;+IbLlzyE; z$#uB~rzr4H@W48i3+iF?;c>O5iL&E?g`q{#5&-=DUq>Of0wSwZY2bDeiAQ2&y~$-r zf1{mo10tQZ!3)F8V=NqiFnAV87f2>6Ta_hDL`D=Lz{W9Lv*$yRR2#`zJPv)M$aJYV zzBMmv@heO|;ya!q>{o6I-5LN_ur8hBh^-Gaso%s_9VIJGb-sQ3Bu4)-r<6~bo%npji%Ni@P>SGwa`m_*gZ8cz+$Ql`+mKbQ zWlSM)PR~2K7r1zO8|axcvo-+YsV<;T;DpiQkaVbm{qxQ10WP^CAa-A<{h8j+&Rj%+ zV1e$iYAC3|^wDhW4n+I%XEa*^gj~T*ZnH~E1p_hu;e{Z=)O;AX!q*@% z$=To2l1h|_RmbrE-e|A=uBe*PAo`O)~m%Nly@f60_g~xvUV6c%;1c6lnt2>>k+?urmn0sr?6!j=z2S z0G9($H{(>LSC0H_k$!CrG^_!ERtQn4RMH@g_7#!Ha;ujfjLhq25wg`%gIQxPVK8B; z#@twA?2j47h@iABcZWWFgmp{Q!gp(}e$cz4lV=fHxhE!qX+D0Bq%Jyn zw{QJ;z@;zD&q_MGlB^_Bx;%A-|fzl3vI zBFhX0h=Gby`RvfkHk=b{X0!MRXhd7_MpsYUmVG7IUBcD>(MVduCYF-1!Y06$s_(eB z1k`(ki}*fHH|(%w-jCb>Q@sY}g;fypbCJw2ZBsa5RRnW9X01?|T{-}#-d#21%r_W_ zU%t(VasSp5(XHRT{qw~XFGL_NVPAVk(`waZ7d?D_cg~kXNh?|?Wu|Wb+Qndjd*=Op z%(IyHT-)=5;ilHfCEG6@Kx0!bC099B^htsrs>Kihu*|B*bYAyP3%rDUu4|>=st?sX zE-`gyIV*C`{R^IgQdsnTH9pgDb+oJ`>-iZN`E(eeTaXN3dV& zaOJ;zLozb&2ueSBr;6X^FS#ZdRWIs^iap^G`U4wX(iF&?df_5{@@AW6oP}QG!fb<8 zafTxL?{6meojI0X(0NCCl5Y(ZwHo3%{O%K9${-=qQ?Vz}Dxg2^4e^gQbH3*lO`&-! z7vY<2eKn!R>h;FjL#&YHs#dVp4^X4`7)?vwQa9I!9c6d%`=Iomm|cC3s_yGrq&54Q z!u#tVd-G!V-u~F*3VlPNE=OTPv9f%2^c|D?2Xl7ioHpu<^hYeBWdvtUUB@Tgl1WL?2Pj;s@ekdd1WFM{ndgq4+D$%jr*wCqCEq!$5lEzMR_0)g&#J=QMIb<%Zw@XNbE+ zvhHU5^Rsb9RX4{fl=pp1(7E2dzCojVAvD|NqjeBn7cGCwtSG`H%*zH^D z{4K~b$bn)sQd|Fg zRAoy^8%8}@dqI~Ce&GuZD76*!4VxdLcN}sW2qsY@z+dY_%66*XM$8Q3W)T|epFihp zCdt|3{N1`)0~%MrDR3W{jbfjBt&&_ugdZH(u5p>QMAib&1kX972=sKrZUK_Q+Hzxw zUE18_H;>nNCSi?r9@u-|>n z*Uq1?r~CpspEfdd|gFOGLYxa2_~V66-WFX zmE)UPU_<|86>Nsh^Tse-Ec-=gP4S4dIxglNtmZb9;%75XaDdVo+HBe40qLckur{guo@7C*&P2UK z?9?w6&-afhR@HXbh;2)`{Q?FHyUu5Mn7{MJ*dMveaRoQ_D=(zWFzZtv}dqaAPnn0bf9u*Lv z5w1JJm^=2ifL3*;1X2|SzJ$d#d$N)2KKXK!tYXzaiU7>slwDy=s3G^;#Q8T6K3)&F?YM49jiEul`8WKo7&W z!1~#wa#L*UQwq|RWo=2Fz=01fdGH0>`{9{Q&D-NcLRA(Y|1+JE=Ic9_CBIvOefp<< z$@U|=Gug)tvKH#$QHX0={qRMDZpMx+5O^DYr4A)Y>3H5C()ni|j%cz&u3>DxFD|7C zi@cCbn6LgsPn#rJ!K?VhsV=WQCFP1X78j6akzU2Ph`W??!x0B@idy;MJ7Hd%iUR5? zKsQq}`JC*TJ7LF?LWo^hLt$wmFtZJup5@IdG8ksw?M+2W1==nArP|Bs(y9BPKN9dS z6Pr4;R1#CH&&^bM8}KRj2}2`o__vQfglB%%sPqPw`OZM5DYvL!aoA*Zi5~02VeS)l z5_$FzW?4txyyts zJ6diMqtZ0*c|IlnXajEPE|R>hHY(C`4aEUL(GLv5$y4f#f?pZ*^9}_!x62y%`j(^e z+WD}s6Lxn3r+c$UYu2prU6oQ-@a&VSQ-zAej&i$Y-F}RN?i@Qb86lq-Gp&C;&inYf zuRTg#RWB+?&WGA^C$#S3*SSwGiEx@Qyh>N`bDyEFZ#s@st|-^_h_BL>rP*L z8cC^)q+=e{@!zm!3MM*e$;DzH%=t#Vs}QueJ?nWjpl@5;(O6ZOT_NcVha)g=!w)Bc zPAnXP7NA`xdLY~yuc6=CCY$bpkvu1DU^0)* zxRq4P0L#2pQ$etnOTx37PhOWU=oavicti+^MC(qh*erL@q1`g%$+_Vn{h>{nG}BH{bYjg~*zmeN%b#FNr%Eup!+x2b1_{so?a{lv<-ye{RN}*< z+C>$6k34eE3`L zBsb##hV>^i$^6QQ*}`yxAwNdy9&`=9p1)uH5BB87^Ztx8#@w2~paD7Ao%?Gys{yLG zVsh#GmPpO)m5F}EwF{(sESruDQX2*hvM$@Zxt&SA#`$(1@-~GPl{`i-8laB>MaGkp z|7XrvF~&kSN1*5=#=BB;UL1S1CTAYQupF>pE;y!RZBPhYEZq49&JpP8s_pcuDK!^4 z$>f#;i$z>VpAcgmXoLwUcK3UcCaZv$7_EN4vaoLGSkava>5kd4$rEB`+`AvO{rMRw zs&g;x;-6i2&3l2*>GtB%Q!OE~`}XDht7pWy$1uiUJMSvHX)ZsI^pgs9*4Exr4czC4 zEGyb_^XXK~KFBvyw+WOs?i9ITL?LAuRmYj zh+1WeGTnTia5tUdTn|vNMFElUevpIJllY`?0{P#aDJOI>oG4*Nz>}#dl1TH<+C?+R zcRq`FNB+NtpvPq!>)DOswk72b-%c<^ zWB^tob)^&-z0(qP_~qku<}l(k8LGuy|34v$9h?{&!NZLdCG6l2RjZCJ96`4rfc@mN<#Yu+(xf3)eLUvkL+$y@>I(*+> z+At|L{hx#ZkS-+Mm}vJ+x2StEQgJuv-0_OGs-SV5XJ^k$x0&pw#?#R4CtpBOawg{A z=KB`o>0daEux6e2Omt_4Sedv>h_XedeCWLTY<1nEhvl_T%tYcS& zvgN_ff1w5a(?;-`7kI!oI-&d%lvQbv z+4uG4P}?+24$+G^N?u>HlyvnQmr>}&9d zlQ3gF?gUeVO$0cQBQbCoi(;nS>5o_J&X>QPm16 zQ(ke_7P}59X4{m81ffnnW`l2ATZu(YZ#aZQVFrOS?NKd|1K@B(5cj?}N8Vyuj!Sm_>(^`c%47KP^(-05JxugW$?nC|wlvY)Ij9ue()| zMWncR=v@h6|M5~*>!RsuHZ@g)45}3Bjweh0loT^P%dG^fpYJ-H(fcSPwmicj7Re;U!5VH8%2_}p|Ob(|Ioneooc2nPmotnIL+JKT8SU3D>|s&Ry- zg-_{>l}%rf277Y`-l0t}$Xr}1_t}&23v%#Jn_*h{T<4{f>IVfbeW&~LQf!vLKydv; zX360|=#XneWm6I2T#87O{D#M?`bs!!*q6M&>1L(5N81yWEBGSQ z^+vBCR-oC48}L1@54puotazgGgYXD0l!7=LiiY$i?720%qLoX~P!4kD#0+7!9?DLq zTK|?*LM~bi&vjL(n^^rgWe|1{nkk`MxbR6>Ib2!de+@;YA7gh*qD>C#2qKhEmZ{ znbs{&U|4z(%cu3ge!^XI!4D`HXM#2L3#%@`Tco3)CEzB!gNzHQQcG~YTy{;281HsV z5T{X5)iE9!Ol>z5Zah(fdkdSU#ho9EL6sz` zoD>r*FEMTOF}hNB!b#L%i|c>_%t_8hcyS6|m9j%MHa;tA9Ybr- zPp_Y7u8himb?{PGkbu4B>1p?Z#qTT`D2+Di3ahBgWie9xBN3*0CXl5W0lwr#SRVf) zn9AbK0@RGigF*|bKmka4JlgUexXe(Pk9bB>B(G@93WdB#aO+-HAoJod68@FEC@z+` zjcls2w{Ouju*jA+fU9(S|7R>w@VR|c)-)jSkqPK(agdSmf8w#>miCt)>aEF{tGpvl z;60qGS1A@Gi||s<562G_Px|P-jD^N)uK80`5t2!- zPF0weHb&(Z=msLoMT61g@w~0RTPrxg0eX0I*~*XCV8E!Y1D=D&5EZm^Cc)5b&;hSv zg!apbq?kCUW2l);wYB%@17E%b!7UC}{k85*3jxhRBmQ>?{n?>kUooN*~hIixTE+Gdep_%N^$7r8qtC@2SK+ zSVd(vG-36koQaCvAq>d9&@VGo1I7GY`C$_tnTc(c45x2Ib!KVWh9Nqp^P%|S8$Pck z1YXP*LnLq31G%v6797#kp14r-25!beK9Cf@*?3PY`#jWeYx1q`F5$AE>6?pl6g~Gr zS(*1k!39F)u;AO>BpvMWOO_vD?!1*-#%f~T>KHagKKZ4!nbp?*?Yi0}p91kPTW0DB zc_RgIw9uOZx2nB&`{{4+cn~Z{Gng={iuDoQV6?jA*i^=)8KY}NTdwLhkh$)(aW7F` zHt(Z9f6&DkNnx@lwcR?040sZ~J@RV5lH8)4UG`^~tg z$|GV&3iUcQP^PV0r1DobrWWW8qKPHezl{7NXN+oFt_VT|XUgS!K3DmR@>sWt#*jM{ z&GQ7Re~sjC4*7x?GcaEP-|-_3BRoH=kztsXkxy;frxzOM_M9=peh933nIx zWTqZ}@cy`L7FUYC9kzlKQ)=#*-lzq=l=$mO!)|h^urA~aTW^c;u=I<*pEqD0U|)UV z#;-hr61I3upOZGHTH=#JknLAUdVd^wT*r>|7B?e8Etj$!VK>qe|BRh2^!V}Km&!TscEvIA@g6O~*f(87wP!Wylk2$S98<#b9eq}T zY1&z07+dKtMe5%UO<@5wSxzCsBg?~Jf0&H4jX8+s>o85vcdV#!1!6VLqgxE2di81} zgwq1sfhV|ium6M7kmwko_PJPi5r^a_M7uOhv?t3gPmi3DNrP%_ZGa-ASMTNdx-uMp z?ftbzhV=AlQZ7=e0>st`wI0`+^Lt^_L|!%y315<;pE^TE-->0-8(a^)#KdA+@9+F# zSlJ~Ik`lOw8yoWSghm%CmKnXg>Hv42%$a=wy8X46qVEd@2&jw&=`%tm?C2My><@;C z-K~eUqpOJ;o|@`pkVYicR-?u(EB#B?s}On@bz-!u1G1S~h4?RAlWcSHQuY1y!t(`f0glgsKbA*8appaz%OWQpWwqysV=`i%$+DyZpqQXR)ww8*``hJCoEH5A>B=! z%PrFTPjJsZy!y@kst|1OVGJL_cgz-^$mNOLg%3R=ZVdsA#ZC(_x=l%{pyJBqYRgi8 z_lT`3kdd3@B5YUVXP)l1%z!+GA8 z!mBEPoudk?%fw@uTiV&N$DHzYi4FI&3f}a+qc-kqPf z4E32Ux90#C!Y?~uj)ocAMN?v~*2Nzf$_u5h5LTbzNc~May;CbA;tR`&MXZ1Svrg+~ zfAeArpyFclU1KUCdbNAJv|7}#m!9;OM0L)UHh^LP z9q*X<;ec$H(BsXJj-sLv^w8z5P0K+}7@}`o{Ic)sMZ7D($8QZxZ#Skxf7wJmgNj90 zg~6f`i!VqQ0Kd*KAyCu0KCE5r-iRyj13b?PGZR@y_u=iWL|cgCOOn~LX$C)hl_rC- zE@~sYp$YO%mzMx`hL?}-^@f8f6+`g5Xe?jHL@Wa;nUlcLy~9wet?S?aOpww~oW?!S z|5D0fZkCUdf+nqk{#PSS4~(+^@IcjHYT8XF7d|YeWv2`xiR4Vtm6n4wk!zEIHn)R) zu5Za%%%5$E8Ks3X!vY~LaIv(fpp?GKvYIJHG1=<*?J8Yo6asgw*6M1K`c@BZ<& zDAG8@{)@N0{TFX@{TFX*t8=su1*kQA&b6o;?%#|#{+CO)`%n88Rnv|JzYT!jD~p>& z<>;*zJwgEF2Z4kMU~-p9thW9G+5!dupzT2RKcH=(?JZPWAWq|S23`eZS{AwB&w!N- zpm2*`|JuZnEz_v{f zdWHyaOrzOh&N{sd-m2(_vjEGk4VIWB?5{Q{J+Z~Lk&34>x3<=$4-=AOp{`OaPZ>G^XMR%y50|b;_vzCJoDiU<0I1R*2yIQ z$6L)nzUSL}jh_f1-2n79eYN|VR_+*eKP>BIE8NFtJ|{qa=Mzkk*on0mQfvy> z0~v>H^3mrV|0}}9DFAfB53LMnf+JOi9MlrFU?Iej2H?&8mx)2p%&to0)5@I=w@x5( zj8=VD0NB4?3QHDz?tNlXyoG#^*;fF(NM0_kbH+hHJkw8)7NihRjRDX!)_6so4rWxO+OH0WYe? zTAt}N(#uY_h7pjX<)>%vh}vfcG8eGf605{UKR<8)bgcdvfl6p`Tc-qzy$w1bwL;9@ zM$wFjawh@J?$a{^Hl@iiB;sEy4Z}ZNb^xl&30|WaTReAvl$zf@YO&H zs^xemG!lpE|J*kG>bQBJp{gnQ$WT)~TWu!r`k0K2>?`N%s)u{WK#FiqNAyH9=W_FU zzS+1f<51O=E!AVW0!q=W2A8kzWxnYpcG;J&_@1INw!(iPVm8Cknnc3Uk#>ZA8>+`~ zI?L*?KWX?2USjo@0JdOBlFHT0*W4jtR+K6( zUJN&ea@1r^+YI5nj5fn6EIrLy*_%9AU4erOt70DQ^j|~M+P>S>I1(9U)hsU;Ga?xG znI3-?y7Ol~->R_~ra}p%nC%XS29BUri1ExSrHe&gA4&~6EsK4xaannG#CN73dwKjR zii*pdq$0E=T6q;up-#mu9P_nscTHC5qKZR4Aer-g8jyaJWMpCF29 zqKq-U{OZFvs@D_Co?lr8*#edmzn!@M`wLP3?nk?~*wpFX@r|&id_0=uoOQrhFh`bN0zTe9oGag{p&;rOP8e*ix zYPc$@%gf8fjeV~cepGj_xn7gkC1?+|X@Ix3UIT`|jwyg@7l*8FugS4eduBuG2D=7` zzJ@du`~M~|cmp^ZR=S@k)LzNOhyfRh^M=0fL&hfWULtBn^ZERRqD!@&$1gB|1xjKK zN^oeNe6sY+d0q3)*>r=^2812qhPNL%?|_-v97RMZbA-GLd^r?v=2t6J8+m!gR(FVm~ ziJBSs?^rPVtOIUZS-E{tn9}DC+Y|s-AjjWfp4lHxz_3Wwy~zWi9W`;ITf+`GRfGf@ zWD-TziWF3bZr2wubD%HbV2q$8l`l0T;c`KkJs(G;2)>3HmHk#24aUJ>Cw7DrZ`kdM zG7^AUZ12`!cpMD%jE~`usK!~X!J@R_bG3e~qNA@!Z-z|_8E0&S&qCm$ zx-lV$o-<`1MN=IwhkU1Fhf=iN0mTbL3c)Z*&N&{AG#ArQ%wPF`-4lpFZCbjB!!t9) zGwO1QIyn_CCX`#}+g6Ig#;N!fN|80yi&@nrxvSV7rC{H%mAVEBe&>fBbeV6P^>j*P z-USM(!5RuEZ!W7xGgN2?;>XujCJNmM;nE(QopLOH`C_r&uc{mlpL9nC@IXY-+{z?2 z+3vYGI%fC0jZBOFz>bBd{u`S7U<*nN3!0m`YVh7CS(RBAPkyTmKsv8zZBi7qTE%M~ zTrce`fPUk?PGy;JwTREXp#t+h$^Z+NfGQIq4dyk_byIu324C}Byj^~}wJnT7e)vy$ zGN6$ZYt~tr5He!mvV`me~VmHTx+?vI<#RC13!b)| zsCc&9rV+lZxFP7^m-0ExK<@Wk0#O6ej)FK1Lf-b`#h?{Bv#YsTIh2>XyNY&<*IwG$ge(5ivMCP22mQHk~VZ7)wNO}V--2;&eoR35So#N z+hX(E_%|pek#Wu}{DFpfsTO=)+s;^ly(Q+&QF!&)EodV7L#T3n)s8Vj^CIM*5tq^{ zd{gkhhE*6&Ea{r^0#dA$?C5U^;sR6ePkJ zMOPUEi0TC1=B&D=|2JC|DfVPkhfOvuCDfF3=>8T{vYP9H)=YO;0vgG+S{{1as zIP$3apR(aU28>wi^cyKwts#_a2g-%#QD~Unp7+nD*qCQ;|(p?KPft%-ujh@2(>1@_eid;5M0h9T1)-M z4==$nipyUjLCF_y8oxffc${apWJFd%offra!Uj*S5|$y!HS&<)lGs)*&05f)b#aHe zMd9>GZ^sL;NVLpR%nY)QfeUoQ`<{A1cv?g7sR0hmP^T7D8nOA4knYQZ%Q% zaFQt7F7F9iFIGF?fnZ98RnCc}ob3s7b8g9#h9iEhDWWqCs%x#>qfc>CG5~W1v5tKbs$jY$#$j8rnr@yfmk^UujUc?bPE; zKad8icosH-QAQS9O`Ay%kj)EC`cZbQe12HLdFkSkphsT4a|GRYN|jXSjL81}weOh| zFg^5V^C3gj76#@EjEuO5`bR`97B$oQPaHW8uXV>Q<0!(VLi0RXc@fQ_pNqZd=pazb z%5(TyLZ+q8HILdHfs*ym$ixt6iNWWFtk&!igZw9y-5=D2qzodu9)-V=uiEYXrVRDn z(%+f^`-5WJ%_s0Vd5 z#Pu~)u{6)?VwG~Av=!&H8HL+M^(0@Mc^|8VoY2w^q^~!&#r2M%!zd*;Wg*1V8m6NwU5-c z+~kRdXbhq?Mb#*Q9wc8bhja?M`PH>$d5TyxHNx3ygMYx}saxcxEYvy1scNQ9l4_$< zFCImFK2*?1Y5?D!V6ildW6o@sdY;4g{$lm&Bp5p@8E32=xE5aqQq$@o&yNUQ-MOLZ zyL4eg>CA84_G08)U7X1bJ zfRB#|l%3OYtM;KzpQa`Ux$1M-5U9Xj)&eO}Z%;^OG`)Gjp$OXWn}QshbvoK2pJnv) zr4rGav=j#QKHMYNY(Ye8J&DX7hw(v#1*b$Py$z_E;l%F;amFiCl(c;-_WAk>5(|23 zc4wLBgJO`<$&T2!_f3LEJ6%&^2}lL5;^h=KXh@Lw1nzFy7KhH3VUy48^wM>5SlqAR zon@3kgclediRuGOeNHHBO3>ty7pdy>wFxNGip7Im0Se2a=PG+ zb73CXs>HDOW?gTh)|dhqAl`}99Fk_+V6NEuEJ3$R6l zg*$$vp`IRPe@X7gzLB*^$@I(i-i-r3p7^t}S#A}wh$b~`0G5)+|*C@58d`=HCF ziH4sFjVyw@SyUF$00GH7KLv#pIal{P6^WQk`fAi-!{@OYh410rRiKyw`+4a_REv_* z1Hx3i%!W$GuDADYaqhE)nW3BNAtPuk-rkW*Egc>QlvRmGqntZ4A=^^@pGV>zt;$u9 zdG?@t`amFAdOb!pKgm|O0oljh;ih_JJVHYlrCt!(4C1FpYlBY0_u%3|AKwvFkI4E= z&#qOKRc}UnxLxgKpqCx2F1+E0-J{YFsZ`7VzBfxu%wFe_ZjjHz0KsU}klJIc2*oKy zd!FE?3a6*N8-%ED1{`ko^tSa8CK4G$4x?nEjbKO(H4)(*{6 z2QVt1H)+z>y>lK&xAaWiB<#RR&>A%;wfkpyYzF09NxZ?(HOl@*znfFDrV-={2f0S6{LGR-sZMh4fXjsS-8Qift2R03;mwEC z%Q;`fHHKi>exyy#s0=}B^|E1sgSj1nR)sCxB-+sTGEOzU&R8`;?0O)HjJWUjwP8!@ zY7spp@B|6XR!Q`K4tVBTm3ZjWn3K8v++R}59e2tCr-Q$#fo!>p> ze}(m<##x-$q~EICT40UNr3CDF)?S+Ft^5weJSO?P8u)*hddsk=zNmdzrMp8B3CW>T zq*J6ASjI``>2?osweC3 zN>K?O6oK(y4K>TC#5A%pah<+O{V&>$cs zDoZe&^Pp3B6mB|?k6TIn#^4i!k4wwgDVZ=$xJv0t85PXFV#4K|@>Jb|ME5-Z>!Rad z2wY?FXNQ0F7lMP<4SaBNt8CoVPZo*Dn`CA?&0VOzGb#;gb@Y;7h2mcx8apn9+8wGr z`QW>r5U$8HUt+ZAH0`MW3g)DT<-Ty>Fnaf zg`RY{P3`baFQywu3Pk>`2y*zjHshU_Hj&{xefC=0#4>jj7%~5+uLy0>1VaDzg9Dx-PD-NLXcZIuS-NYEWQ%6G z?L_>lfwNud7Ug)))Z5^spU#ta>v}i0*JuNU|1=fJj@4S`J z#|S+>%EL1{J9}ii*HJ+h!-04M8E$K8jCbQ|mN4gl)9^(H;&k4h*5OdYZ^(=+0jt@Q z><3CtJ%ggS?dqHm^|(G44sYG*5eI?wnL)=26S-_S7JFKZ~b|aXY(chSBezZI-Q;s|&RK zN|{XTcF)4Ch!cCgEjOo-@Jr}BZod7;=FR}(ia9$O-2 zw;lU$YS6!bt+I8dA*6t0k^%kfJmfb~Xf-|ZK0O|Arpl}4R<_D1iHFEcKXIdW(z22| z$+Q)sHa=vA;P>&Vs_{zw0{!`E3V2@G~2IFFJB(s1~DIDe`v+-!(8;sYVP@*>l) zPmUig`o0asRW1vEDtqf9q2oJAn2?{VX;k?(IeM98jroJQ;fgA0WTD5ReMQbk-XZ>7 z->dF6Pjf1J3hpb62{FFMlpx&k-m?{S$@LRus;aN1oNILpc`W9{+k0#0yH{2tTGMKF z7oCO=U!`C3hp8tfIanFuuY9(t(5cjYcKCkWJpSBu?X|O2;sc!BGUVGe{|9H|x}j03 zQ(FLA2|Ptbo2S>t%Xs<4y>{3T*zTS^jr|7hd?1`@=KHSRXc{W1FAYmWveC|VC)F&q zth1&?KjicaKG<^@<;gAOl28l*7t3bA@9z$Sa~j4v(o?D45L~RX-n}~P)*U%|sciqB z#}1>_^M1F<>x(pVD{}8d@)_}ckCnSrV<2C|yo-79B4H=y{g&Ag=mWAkAv#H*p@JS* zPYj|XBt-*>+{H{}x`(8Panqb%M5~Ni&M%Y1EdbKET;; zy!JyUwqMX?J=fUIJZe8X`i=*rAZyS%504i<#ZTe^Bp#_A5|1ajUKce$`8T6< z&YpMsvPOh^pRMin_Pi4L=r+;E=oW9cd^#RA$q`sTfB9f108tMZWWQRo$#&L4__Oz( zZF?}kVl`I)DO)tAGAJa_rlHpSsom#>Jf_BT!)qy2OU3S0TpEsm0 zdZ>KR;$NAAp?qiE9q54sJ`~o*F3&1|LH+~@p-O+zU?Mp~**~r&UwDs9x3f*Yte0#u zv=v{?-?-wpd$;eX;|_;;+Rc^+XsMr&rny71DG9_K!q5e0icvD(ZM@?Grs?kp8=@ER z)QKZVoyAFvkan=%2^RXLWmB<3&u33^7r626c|mCGah#z)h8~vn^zKOlU}W|f_-eUF zI>Oa&8wK7Hgbw$}Q%p-JXL_SY)-Cd**^?A*?}s!pF>^?lCo81@jDz>0U!FazIj$B)hCREnS|nsL9J8*1^n@fAmzgczv_d zRy<_uS^CHNO~Zh#sNQ%>4+5{1Q1rN|&|x6^!Y=U$oW_z~ro7(IjKgUrYXxvXi&QoS z|InqVdelf>mSeRFir42pAyLZTuJ$K}xvw!LpGxO>} z9$#SRf3@$I!UGVs&!g^rgQJGv&{B6cOc@bXbO1%yX^VZg@}JW;26k*9Mb4iyH1!L0 z096FyZF2Yb@8aF){pUULyG@byqw_72`;+?)hKB&=!i%IbD3~aUU{F*S%?Bn^#YHwu>8u zQPV|oRCUvE9<5da0Mdp1l+k*DH^=@Wd4?Rws{@{G+aIP;mR1;E?bCPIg`>1NzvRE= z)qYv|^VFpMHsj#d`?&S5ERZ)=Tp?Jxj^PS8dFdyDZZRVfuofM37(8&=lXG{Ta=%XV zwP30}@Fc4;9oh9^n*(okE&s#Kbw<$9SDo7ng2l_h9D9(DgzXG1uRl#OkG-LJfUYJ5 zIpdFkP=k@dE&|H8z%KCNNZMVuV`AR$qKTn+Qy9-CPAW?%`T;x69#ZS4CR5u&zPTn; zqq;6e0hWs@&~vi236#}>Y08jSN6k6+Kp|d=;k)y=wu`fzoBfP-k{+$UM>%cRF_rCm z`$pLZw|bVTOVm2h@81whS10!+Yz~(*Ri({AM-vsB>8m}&{1Cc)|Gc-?UF}-Y$$@XX z>k>}rYn<(y7G#96YkaTKkAuBG~YM-a7INj})p)O|aPepwx%3hY#u4OT& ztpEte{Kh~L8!$h7I{eKOWBG=^;G6h=;<0B3L3I9pt_(Z^HYl35yN&y``<#ySkORa9?p zm+o)(W-8Um?(Yun@l_e;D@iPMf9gd#-fYWDRDa)la0q|+hCz(#Zr<++&^nQcB-wru z-_9W3$*YfTg-ewmmuaUg8VM2-ifom3KFnt55f(x+wLRojL|bZbz|I1V061A8mm=s+ z#N=`>=fz-nNBt`Y_O9R3bv8Vr?W*KSFWb0je&tX++ByZ`BpPS<%fRko3faHg{L^*P!cE?d zt9vJxYQeAuktVzLG|7U5VU?Q?0TD1uSF=|6`3K7izae?QTAG0iBLYvj+OoS?5Yye=SR*IoQNmSAkEYY9K_Waxib0t||y@fL)EOvdIOnnWcW zdtCf)ud0w&D<=NeTWW@9TBU5InUA7DY=oZ6qh654>ngBAhxh;0U#2?fB`o`=_Bo?e}Yyk>i0J)kGA=WY(RTr>_%`a3xXIq zdAXTR@KnkvXb*4)(-JK=12aL_1g`t)_cva$R>OCjaV|}3i3j(0&Os+OBQ59OY7cCT zzt6Uv4#)XVnhBrZv2Q9_shYz~q0e<~ zX&}j`wDLyV!eFx_^SU@-0kj9a_F3U;4BDs!3dh~i_!^LhqzRLU1r|c5P3wYhb0oSu z3T!HqqBPjpP?1s3=N2A-kh8vYG|ajNL~mqOU*+_mVqj>L61VdUMjh>-aY&b9Q&|j_ zx{=N4plSQt9CSW$5_EBuB9rI7C?k$bQ+;-ubC<%^dXgfcIYX)nKD%AgB|7VoxHn1M z!Ewg8zCFlMZTlOp@y^C3=o-Fs)jLY}HG$gE*a{C&;g%6sV(k>P&;d>QsaTp;t`)M= z$`yh!s(LN2t9iwm4AS`x0X{{HH ztGjo2aj_mNt&E?dwwn!f;cwdU$2vyTP9MEL^py8s9Zs~pN$ZPd|E>$*f>?+x;s5{(XdP(vQ}o1DtR2gyKr@ZSL~e_ z&a`4~me!~{uVYF+xQKQ1hj;8?Wi$8GveYJmr6?jUsJPLE~U zxayewB+J3O@ya6Ih!6Dl)pj%sy+ zDKihh{`cok=vc-;E#lqh<4!_NN}|Hir%*JP?G?l(GrHg z)mEJ}rcwK!M;R_@^-9^-D+set{F3C4Op%M#93+pj^MFwuVO4+mtf{9VrJ%&Gchv3aDb;ks#Vv> z9;n7};7+{TgqH&g#EqSsC!-7n zA%zoXl%wZW`?Dwe+g>WZeP~2|{od0X_j>=;e`Zf$@|tt+_-@KT282jrzo*&n74p(I?cLeU%LYBES5d=>GL%_=ps>zSl& z$=AK93m*XZQT{)+hMZj5Y~F?6kW_I^adhShv8`#ekYmbse!2sG=>2~`tY#udBZFF{ z%byaglenR)6;|FT3HCnx{>Vkz^L6Muwyc?-9~lPvWd6?x=_yp*wxot9#LDj`cjk)v zi(~O7k?q{}k?Eym;~JS{lwcjkQ9@6TOdWa-duRC^)oehhBK!Y8e(Mfmb9xydsD&08sgyZ60f}P~iZQh1uuD)i20Cp}15KY0%5DUto*-MdZP1a^@Ne zlrT|9_jR>GfvZE6iG*2K5$lJ|+cZz-k(R-16O_OvHVO#3BCdm3$_Ckpbm{BgT_2Y^ z0xRRK6x^d&79Ho4OyCz*qSv!>Lkauob4cl`TrKuu)^Gj+bQ><;6Yaf;@qKWmYu<{E zUcfS2EVxc+XYsT5*{jA*AvTwa4`vzx_VjyV zlnxdD*Mwl4X=zhalS=jn`r3j+->>mTODgkYnR0{~k0H}$g!-6T-Gh0Yj0CktXMb^G z{rgz2b0)v{;IneF(+{pg^CrfMzH~NVAjt-b9la`6j6KNl2&WrAIUYY?Y%fH0+jZyG zVireAO=as@=QYda;rG$jvlWSJLDaAJ5rS+Un6d*IxfRt66dF)*^1Z8Pi~&?IS|_|x zM7Z21@(0af=pklu=A479aVIuv=~p(PV@0}d_$9WQOmZ|~=u}CS&(rB1Y{otxOmf)~ z^tZAnkVyXZePb(+rlzm$#cCp7=bx1L@WemNzktnY@HDf@#TSN5z$&ixTScA7E|aSf zrNEWu!M{tKIDAdnOF`EdCfD3f_b1H~@fH}g7JCN7-5hkg3YH1=&`y_7eLgcEQcl>r zXABW|FwmY9Vg5D)yCxaCW7Sk-w#Fv3%;)9-im zSgQtbmCuJ623&_KU%E1kFzj2XkfLwbvEUCr05*9B!gI&3HR@+x$4UZ?bClLidVj%I{q~A#WPMnt`UBhX zPxYk5h~nmcH(c~a57Fo8R+BiaH3Nyj%KH_D#8zUO{Y;GR2raZ<3^F(!Wj0X&vCTH* z%drViMNI;MWrB-LAvYe1%>7%zK1ISoolMB%L`aA9=PJ<|G}BLBt%R7&?}@3}6_E z@6+Xa=B6q#Y`GB0{Em&viEc9Ev{bwPtFL412dXw7^t3`>#HYDbEPA{4+DSm z%$mo`ta0Q;gH;3YUIf#O++8;3H;6~{Nm~sRyBR<;z|c67ehbayP1|0m49IZE%0qM9ZrI^p)Hg9L9?N*iuPZ|U=h}49Lsut>f(E#cEQGu9mHq6 zn8Vo5_VG*Du>nH;`TgcINi>S?E0*H6hAdGmBI~fl&2n3|)5!08 z>omZ2i~g#zS}-R-ziMB}ZASjjDYLPsHhc zW4(CslUnghX^$p_pVco2WY1HzV3N-WKH2vIJpN015W^^@&tj$h+c$*Wg_7{PwYl5H2e4D`57%tcBSkg)>&XE_W#Hv@jUJDDpvLE_$(zIN_jtL zMhCuU@R|LUjkNC-$Aib2g(7z;HnreWHscX*$_XTHVCp@e$On(@mQuuVKMFBOPNCw# ziFFOb`-^G4RY*%vVV{)vYE1Aq8-QVizTK`8Cj6u;m2LD^#k^;^LiDAm6d@RDz(}fj z91-oqo-WHy0>Hk;*M!*);(z}~Ln-{;{z1)&mASVZpv!L@PVwyZG`sVInv%>~m?X-` zE%NkSc$99QLNOsOycq(esi`_+ohk1X=wlVQjRy*ySiAoCVmI-Ig z$xTU!mA1#eq&R1p($_3DMZx%z9Fe+v?bx-7cwdNAYC^EI;lZ96!U3_s3%=s&KmDdg zX|3O887zOx6i=zRD|h^<{qbG38yA%f{PbAwouZ-CmyQIB@QaiDZyG{g%!U`c$FRi^ z$ZQEWh=y2jTy%fB<2l6?Q}Tv15ET%)`GLyF)xP+{&dp`Wuf%S;^*3fI)^5JSmd3m7x8i(8z?B0U zm>^ZP)B$)Sy3mx^Qs_yNi+QH_2zJ+xnKse8!qZoXO zl%xKuRgAsh!RCxjyLXweUzIsppR|a@mp`UIfs~l0#Jyf12rHFYV*yGYou6t^s&}2e08Rehi-O@09kJGcjSR)@(fA;j2|tCV zw(mEwJMMRFr03Xi%0AHHSWb#oMBU_OUm;BK(q{dSXZ;>^X%fJYnJ9T$oQce4@p=P- zsMlmyAp`xs=kG!D-kHGvY|9Gu4ZGDzw3uj+>2y-FM~S4F+ot_6B#aJcc(UR_D>^d^ ze>+aVm*N~Ct2`;C8u|x&T*C>vIIrp3!T7u=^Pnf5+jJhn_A8e-17Nn@1(27voP+ap zGxYO9XAB(ckiS4!X2Ap@KjJ3T7MENpo>G+4Obe18*5KK=;tjPfaW@5|myidQ=(UrF zSN~tGf%@v3X^k2^A@`pzCNvw?8TnVJuKKBK>g#@qg2fbn$nr*aEn zL@H!iuStw;ISDB%cPoJST%?rU{QmJ2Dyx?Fh7|c(Gf0y*ZA>lTkxZ~MUK_}gQqZ)g z+DSEGfna^o`PU9P=HF*y>Qy5vPde!`sH8-tHLPOXD~@zSGiU&I+Gq$nAE$|h^6lg_ zX(q<#h}jNrmJSBH09NFak{Y$^4B~Hv`YmQRg4PX8v9$;2tB5KGUAnAa;}>rd)<4q& zU+R$tCc$?8Hvcwp`uABfc49c?m{=idbUMi9fiE8^c*3xWG^j?^Ttx)W zUR0DRSG$y!5YeSA>*@XFBej75M0tWC0P4HjBx_ODWuQcBB?&bq2Mb<6I zDCSII7K#LU(Qh!xRTRtVeo+buu&agIA9LemJVr6tHN81I=Xh?q!lsP1stE%*P^b6N zo+f;;?*Is90ZW{D1)Y_(SbqL8Qo&|=&LU+yES`PsVG_(QsFAi60WLU*YqJMlnTi=g z{?(%6l=PkK@!v8y3cnUhY;tDXF0YBK&>2bXaJ3fnt12>+=v~&PPyKfahjkZc^E~45 z-=%T+o*QV!B$OYYACT z3NecE`kA-(+%hjMdwD}>+#}x1{(D{Oo`sKhTXoeZSDgpV9Pmvz^FYOuSoR6XmQ8Ya zXWyfZ4KG(yLe0)H?t*vW)6$WRBw)n!ij`zr%sNRL7G{((qii8RHcwb`)s3OBbJMap#R8Mb+b$Y@p}$V!$E4!5L$c!Fm#Ww z@WnO>5f!&(9k0-V*quccGv!UMK;Xwvx{gB7e{aV1Ogx>zYPFd(!M zD<+_xg>^Muqxl^ZQ>6@gz`?Ynl`HHSu6X$Lrf?idbSP^g-J@2Ulz0J%>AF>k%qe}# z?H9ssGayPR%-oLB)4O2_-(I%)YHImwz$M|_j6Um>)44&d-N zxk&v)g=S_XDrm5lM8!Z(nTU@|V8Cx-^eSZ8t}rXLF*I0U!`H>UJKlx#8wcTFL_{^` zrSSABpvH8o|CNlq`h(GaqbzapGkkC(oF?#3O54exz|x)U{BYa34kQ$XWHCsD6bP*X z6!-bgt5mZ558Isl|16|A>=K5ZW|;);eGlSfJExEz&Bn|Y57N~6^40oQdZsaaC{+5nW+fY^#BIC(-X-<~!qzal8zH`mL~Ij~Q{^^6@4d{iGfE1B7#{pMpUS0n!egx>Xge)N=Sz zyiz|FDk0ro;vB{1$;$oEQVjk#f|w;yCbSm5R}O7RC^h zE}7BQ3rEP<5^i8zedP4?ITsa^E1#%c0yY9zXqY$riwh}2x;(e~=0ej6O*0O{%84tp z$pxboL@Py5xvoJ6&3vVEb;tRD+;Up^zN6{Na-zSKCBi@SEqnCG5ONnC22W?HCxGV4-V(m2E+?*weq)3c~8J3);%D8t-N#> zyPiiYY{gW;d4{M`j@V$R2(ya%AwjM5Adxd0rq_2Ij5QY#&%!}7x=rjl?i4yQ`SDa> zT30ssz~R5nC2OS2s1mTi?QNY6h-74xIqS2&#k(pG1g{s43NcRTcrUz>ws5=hTUj0o zIMQb>&2nH$iCxDMyH{7pq!lqsGwzjJK1H>ploIgj}e`8*ox>Us{K{$&E_O$c3mA^?LO!8o29s~*$_vH&;jsTvF9FABEXqk`vka*X}V@fF#U#Pj&8hk&dFuP1oiF45_O9KJi7~1Q8_7sNs?z~J+Wo_J{XVCC{;|V&o{V^ z=1+7Q6P*~95(cV(SFL`cv;t&DlPxS(bqK>$U_=ND(w7a|je{;L8 z1J=nN9&NrX`KWlLKiDaH@WWBVYK~4(J8y$xQIKp#_8>jA>6z;FqO2Vfv@x8!p)jSP zld|{HS?O3V4RL}5l~KO7TWF_p(Zi_Penf6QavyZ5)ge}(za%_K? z0^9^Lk2_^Tq4A8-mKZ0V1);k+BF_RUreqF4H8FCjb$HVKoV&v=w&eV&2iW!?y$-ES zf~4>f*Xz;~AgXuHMK)2(m1Ty*tGk-?%pNa+WN29+n~fMbk`u~=60;odNa^c_D%Azm zw4~2PM|RP1Fe;Y-uEZ_;7YvD%DK{^a8duimT*WTrV0Lan$$R?>l1#9t1Y%QO%T8-C zj~tAlV{{I<2<(@%?X4g((^+u>0Vib3auK5{DzDSvDRG&#eQHEw}6&Skw5!7j)<*Pp_#t5(){ zJS_yAuQB=n+9T&roCMg0Pm*h;)&Us#0*CMj>~3^|++#sRSRLc~eiUQ@ zm@t(3+-j|liMmqujY=g?&hj@OtO>5bkZQ(DOhnpRIaRc{e%uyg3yDddmTUyjN2~4b_8|J;y z+cYU!nEJug`6Yk3yQ~sIQ_`Oi5o1wk)SASG=@X%T%>l-Mb(mo)NsK<;Kl>e5PP{_v zHmF;>wM|ksx$#CyXZ%VQ&;yiSN19)zANo3lME0 z+U94O*z@7o!K(@12L-Jh^{^-oQNf@xJ3Ux8&xb^cS3f1bzEFm4UF+=?oIzjuMiv$# znA^|GQ&**dV}?(fZAtkd3H0&LZ6k>(+p1dKJF33DgDK%yY*RRDEH)Fk@f^H-B*?~R zaJk2bX)Xa|!nLoaitW3WMm;U0ai)}wU7wcgl=|jLRdOnV*sR^WAQkn-3sYrw(3+~103zMlYEasg1~h;TrSwG0hLBAz zVXqtvt+2Ceu+OP2_VEPIwZ;aD?cZH#{<)(tT1%+bqV{OypAj*tr^vU+BX-bja~}(_ z_L9bW_vw!6l;|0NoImXOyPC-~a54kw)7c(rf-l`Qv5b+JbwCwquI3R z*~i`olZVR?{;ddxVqO7=(Bt#Fz<_H}o;POZQ4om>!Y4r#63i~mk#h68XFa5eZ7Y>djl<^A%u8xMzq8#CS z+S<>YWjFg$sdhhbE=YL$qyFLeS6|erw(YV%^gqWWkYtr!J<9_h0Ix3q;whpUS;+zK z->3qRZliY*Rk{Qz$0_*^HUL9(#rT-uPIF)iR@42QRkb{m#c| zQW=Or+1QUTbcal5Ny6^VV8Ba|3NW6sa#|WF?UKTPH?0GwaOF@X9ZEV_U#2_7th>)@ zh;VDAabnvzS3W}w(u)|Ss2I35uD2OlWf0T>+KcD*9Hm1j+_Oj|B$%%(sSeC&{rdH)n_lQf3~(Y4z*+_; zH#c=k2*Oy12qEBDfonT}h?AqElfbQb%(+S3JJ&aq!^|tdH3CR1m^VW%@eehUwx7vXaZDIfV^9eFoNv=6^V7 z`Jfd7b~QS{w5PO+rY=j$u|ahGAmNKIqU1iL)5I0Q`j}~`q2$sv)nM`%f#&3+kDV6W znVeRB%$Td=Fii4GK}Tf2vU@9R_9nT)YdPdi~#Wj?|H zze@%1-T!N$nEluF$I3~+do|b~3aW{u_TxiO%4o~BH{}Vtd!^ujZjbH=;OuK=C_G+Y zY5rUAPCN{WSW>*ON>0+ zSSOpo4$1{I{=ywIsa9^u8^G8MP{Gol4CrfjKlk5mZ9=Bosny%BTidU<*AlB&zX|!CpI%09 z9QT|QjmB!wXXwj1Qi_|~m-MoYO{S<@eK2xffC0DC6AQ(s#nWP%D?dz+p)TbluVSBu9{&O+EXAhGCT|+8TV*xG0w%)0_t2x&a!LM38N^M1%fVQAt+* z(i-@bKpm8V*8Zv{8Mo0!8KA~lULjICqsx&jN<+}`$FpKr<|7XDkyb_2fclZw(@&8d zVx6ur$S2?FYvWq7t-MWr0l`#VJyIO#s= zgMUL%z`r^g(Je#Mx6_&197cTI>L5;&N3;Z?J zKJduNf4TG%kSGZL*KlrJO~UV#MAH`HaeK#ftsl<+eZsa?SNMtfR$HNwvs-tvtNv~b{@#7fhgSuG2 z9P;#CuAtu!{XPf{y5qS(RZ`@J?&OU|nZ)XytqBHJow=-`=*9ra6~K!E{B699tBxF% zGn{yb@wcY9Ux3+$TZ4Moc!{8crvgCkeyLW%Wz96UD#>G})XEm~d)CefaS#xfkq0Ns zR8}9~*S5cd-jUQ7W zJ=aQQA@F`W)KUnRgzP05Tn&1XKBJX0cmU4uXoQ4xUe;V2On_>|f|g>l``BXc&oE*Z z@^_m={daazPQ-tbT?NSo$!Di5;8Fjx@#B9s8kU3>d~+cR;mhmi7`Jxgrmr?VhOIu4 zdpB-z*y;KTofaM7Y=<@eP z$X6P`P{G~y_IV1e<$mRoNt&O~sg62JF&&ZeuV-i*wvO#I>S2bEi`LUVcq|Bg{#kE& zyXGwlLU^p+x&En!JR8CDXIN6AY7ZW}5kkL@w7F*!BDJx49yRmCtgHIVSK8XiFNah8 ziUX}1P7s}wXqRIDfEG#(C`j1 z?{d|7&Hp|RXJ93)M7}ABA^>u&U;UyiYkKzT)}CKzy_j9CUj)<~^Mir(vNX>OaY@DD z>~DG=EHKX>_@lJJXL(Ek^C5K%_>LIuq_{}Ng539!B~EjAebA@!T4+e9tm*(OK>3Ml z{Aox2;Mx#O59d0Iw|5l-joQjG2Tpz2B!64hyxtw%n)H{LyL&IQS#9T0Je~V#|PfMEP%P;=qKE7+xB#M$PTvuo4bi^fH#fvako{ zSaVV4-sRvtmlSFqF%MD?>TENwqP!B?_EqbD#+43!EGJZW&EDH1zf#WilB4;u1e$-MK$iYP7T2E zv++LWy%Kiwvh5TXV=IE6HjY!m?v(Wr-m(w6CA(YU{C|7&nk;@t;~U9HQl1>ii+#E< z?2*7MB-wmCda~$P$n>vJ$0^{*m=K$$)yr_lkO!sF-(Dc-C@W+8qz9Y{FGSG(c{*bK zm+%ZlC25}e5~W?Pd+oz^+2CN=tCSS!xvIJ@tbbraY~|ur+PU4B+`1_hk8*XiKbia4 zqY#_i5>j`jB-ogq*sW=M0;r(DcK506x8YvsQ>%`(OLSf9MCOB-4Bda#!Hj6>cXxNM zj(3qtve1DFTQ;-Vw*4|pln12Ie?`kHBO9wg{pmSe27Eoe>-6wO(}N~FmmC8U#* zl=@bIu8AywtO=stRoJ(T4k+V3d93MaQ*_bm*6&OM8i_@!f6}@0CsI;Ik+3LqHX?l; zPDbnYu0Ll2!%#*5P#*J;bSVl=39(gj!aP7$U|l}2%esi#+Q z>$nr#z{5W>hh(RUMPW<~=t;y8Y$s%yVasL9&u2^IFuTx|h77)Ulqd(gdX31-v2~l&(6B$5vC2&<*&@1<~|4(PjeY7h#nSR zTrfR{v=BsDP^EB}zIbQGY)C2|p2A|Cmmr-Q>?nge>xz8L51tHV zLf06*-*4(r(!-esB-_}gCg z_$6e8UZJRy>ER2$$J(1v)XN7o+(c%^|L&r|=Vk3x-I%*!|5>U%MJJYNEB?1a3u=qv z9#4po?NI6^k!meFtz>K)>pdUZh->5%qdU>e3*+UsJnqP1&18rn43Sw#Fkt-GVI6LO zhO0f&DKXvD+UhVp)<4~3JAl|S4&&1R?7YIUhEK&)YU~o)sGj}TI=q(Vy!VohYb*to z@ot({rFGIylKp&hy`|bO&%aQO&m%0qJGvUbi=3r;o%I~eME>G&SC`JKlm8??f8RW4 z2qWI+0lE&eYHYn?_hl=kpRwOlI(t2SXK<8M>jN9>K)5m&3bx`S8i@mX+rk1{95?A6 z6`3|h>6)R8ktbgZ3@J0Q1vpj=jSgg+Xh*xz;aHrHlV2$`SpSK#W1Du!&M)VzejaS* z-3PHvKERH721Hu%v%m%`o8=(zQ2eStTdB_aeJUofpQyX0{g>I zH{nmFyAeXuzt>QKrT9l;E1e*qlt_n5;0%b@l7Px&tv0mmf*Lp^s!rn@*&j-ie47bB zYI02|K^ygP1_`|e{0Q@)QtuZ)UG@=&79l+Ye(1i^$7jt0X@vOk@iy^EGUGa)U?a6Z z1pgMO6IO`P<$e$vfDCZgKxO@IkMqz{y55+?y#RXOcpp-~I5*drLc?by)KG@2od-go zJqKd0g^))e$jhI!+E7)SmXT0vDd50g{z=nZjNUAwiPS(~W}6k&cS?SM+y8YEb1%y6 zYkux`^NimqD7t>S|JU(H`A+^?*nB)zF~ko|zbttobNn%W>o&^QUKQ95)&t!NUtit4 zkz!%7d{-P7O3S)0arnQ745e*#vLx0x9j$9RLQ~&&J7v|%V9Vp$p3(I-_U5e=+?5X8 zGCa&-S@hy`+FW2a+>4J9vwblkR|*4;(5~;N{N|?sPT>73Q_)Gs-Ct7{qlgF{WC|*N zm}p`J5m9!?Zc`#1ffcLpc#z2-RlVf7CjnhOPWezae+juKSg8Ta0bBpdoH>#MrwD&2 z^?ei3P3iA4-kKw|mP0`|6eIoDOH?9Q3~h2k1fY88>Xh|ou)65p9kiv! zLI#I0>4jK|^qkMo#Ubm*aEOphy3&5aHi$prlC#uw&z%k^@@Jq4wb`nytR%QJQUhWU z+HO_Ge|w+hMyCQu z72%8(lTc91^dlwQOx~lb$F4x=xD;Eobi23&luT5Fx*9we1A@gKw@ZL!vyo@{q{;!v z$s0&a^Rxy?_eD2JFmuH80+;ve!Hworw(r$cY&i`3b?`F3aC?@Fmo6=!<1dC-Jq(xM znkdJ|vfeM-Ton82He3D2%#4I!3c4+0Zk0|dm;91}4C$``KKR_G31f%SVVEA=VaSUWv!3Ac!`;#{ zv4XpmHtA+7$KGcBdh(uO-Z7JmaIN*thcZrO0wQ36`8bC_(ZgO6;fj+g$?3)$Xd7AR zev^|JGGywYbOtqB?bLEG8{=N`RI4}9Brz!*UZ&*d$pE=s8Ry-^2Lz{5 z$7CEW5e7JA__o=Mx$XN#X3O=nJE@rF&v`abNMqA8!9?&&=1Fui?Fz2Mbgj`24Pwu_ z)}0ELfk}_51E^QVpCH9H_=eX9e4#?lmgjir-x;~+Fkgv%Yz5@{icWF)jLT;j%)! z`Gth>kySqMVe<-3n0R`b!cU$--6MK}RG{Q3$M*!81kLhQ#@ZhzbddEa-B6KIg!B%A zSd~nNn)XaRNBAr)g}`K5ESIk2nH=g@n)mjwC;uN;Zy69})U^vscc+w;qC+VHA|TzN z)C>$A(%sV1C4#`v-3&tw9fFj|(A@|EQqmv|=f?MW-gCb1*Zi7$*V=opz1Fp^3)Fg) z6M1PMAT3#)lPUb5^8*!Y<$(G~;y+MLmMUx!gPM*CyRUfOYzp23Aa-#u0EclwD40Vp zs-EwdK>zlw`+6Bbv&KySJI#^-^i+r>D^ofQ%2D^qK$X^)OQF=k$rDw=9AZ<4VI5x6 z#Yh&j^HyTgxKNQOne>w}Xk#EX&e!h#kq^&}tBoY@sW4G<$nWPK zSmp8EKrz_zR=7Pbh)R2#Ux!-`5l*6%nQr=m?$_gBuT@H*=tv-pL_y;v;RPJ^B;fh| zuK9-)l4Ym5M+)`f=k-q{z7zYxXDG8TcK+L5P^4!U*Hv>D2Nz~FjXvF-`+d<#FnY*Z zc5CHx(yOBt7i|Fi8rSU{R`k($SiLkq6jXUsc|8*QqsW-V2K7*6xQg3WLRf;v;;4dB z)o|~^_3V;Ip%4fZw6Jb5+!b}L>Ku1o>cC9pAxu#rmE&KfESI2;y|5hY@& zBCws|xzY@Vuk@JJ#1#T)#@zG+Uw8qAw+eQpT1n`qBzuL`97EFRLjPcOPcVzl$m>Z` z2aF6xIgU!~H_x9NX(;rXPgw7wb#!VciTU1NCrPxXW%0xGE^oh~*rm|%K>s0myBJ|3 z8k~!=-=?MAK)ccRLr>rP%r?uVfSiY+w#7^25B~fh2r^kt7xj4P!TeA+ z`@BRk9S9rf%A1>Xxj|<3L>KT;0te8 z+txVV!Q_Wm>$>kQiMysQJ%gF$9_(nwz3p4CBqfPsg(E=49llsA6N;pQ{YvINf^&HA zpo(#={i!ZfF!31+mlkWYfxG5JMeBFYOIBpwR@S&&EXTh4p8&v$qCXnQP?7u3?-)$fBq@- zyPv$LghdTLPqcGR(={iz7WOAqBFKwqW=s}2of0Js9!wl2Ccxu#0k{z7-0XBhsPI*x zk>7+y7rbreqIOJK(y>evJXovW*Qx=Ucjy&4m&=<^S7j!(#;H*2->ydK*GCk0AI`i; z$7+fa(SpLka|hWwMS(UaQpS&UjdtZR45RE%TrfoDHsVyOgOH+(YDQGL<{BWo)1Y2B z_GkC8lIny@8zQ6?6KDK&H5*dIc+l5fJVgikshZ&%yhT#f;=@BV1@!ZCuZPtNMeJZQ zzYvYw?h(SY?s>1ELyjjTgdeekDHXA+nUR7eDo%K6-bKDBIgDyUI0D_}OT92Z!7kv9 z`e5CkH{^q)m;|wN9(lzJ&L~2(uD8YL->;@~ul?DnMb8FuFcaoV`?2=lTz(d4341i7 zFJ0xkmNFsbMzzk~L=3#+(^xG_d{sA-uO)=rE^WoSHmwO_&@!ny+f^{kdy8-K7CdbG z;K+VUc&!Y!>Zs~kk={x?OM>oxO_yTX!C2*uRZIbBt*uOi_A>)KsEqnr^-SH zYWNzWG|rLMF9}9HwqZ%|RsPAXgdZz1!ISCNmtA2`)yx7K{qQj+eup%_aBDsPSjrm(^& z*uv0)sS>HeHuNrWIUnjUrrp!j{n%x>!)})cn-@11xB#Gz-ljW{t;|CK;`Tnzt8WjK zf|X?^O@v_dp?eS{`nsV|p$kEtWlg% z>b`*8JTFrDJoCJ5td#M^j0m)~%&PbV3XOL&! z@nRm61~>nL)qsY%n~fXsM6akT!IHTepu{&ah%)3Dp35xRO8Q@6GVAMBrs}9R0#7T!P6XW9 z?lA(%$U8-Tw1@Kff|rfyxs)5N!r0XBzlZIV0GKH@rdK{|ZyC-cp``nVE-i${C~{zZ ziX5)!iRc)6SZcFeFcaqHY>_+9Mq7Ghn3Gt0CprAhG$Xo^T$`5U#M0Gx(=`=g=<)jB z7@OX(Ze;x+FX5`;y(bnSPO4Ddq`+nRDUP&C!S8&Y$C=|w84_$%o-gAG4WU|Kw9aL1 z=)I5DY`Cds`Au&~)J){erh>)&ZYNE^)A{jKvDB&j^Tc~Al-*3fgkSg1$`L&+VXg+L znzF*H?yOu5lxF&hi%`vEDbs|%|U2d*8x|S1C7fbPkBQO#*~}fIaBJ@_HJld<`LcU_FvY%|34v~ z?3FouZfL!|&W`wcw zN0#XeQ_mv&q|{!6teNd{o=#PN{YDsy!J_+zG?6#KEcY3wIj<1D$e3K!hzy;1X_60% zTP6}JVSe!<2R?cPHh>@Y^oI}-uB_XO-+>7o5A%i%hed9FGo1^CUlbESsEz{4Fz z(vfDJ_m{xn#cU5WRFpwhIevi&D9`{nHwSR1U^}GgZi^c#+Un~XsuH%6TttyM|8P%J z;pzrOaHnSdt{EOVQ!srXu}F=oz>2C)=wtlpQ1Wwp2stO{#leviMWrLd{R>+H4@dkQ zM>n@HvVkfje5z(UUUDFra*8|OO_o>k$REhCk#=KODcG*2IV)zKR#a*viQ|G!5z*^2 z73N`R+AU#T$E9&@_w{b*E+-{(^*Q|u9kVAB^O zI=N2N@Yy}n6TJ9$!|?@grQwnfP3bLaTibf`P!`n@7vw(q3>6Axrj5FOa=)nWm;S22 zS0XE%f6v4KQB|u2Ye7#0ec0>JGEaTU>~A;iMmbhF>|V!NmRUd*ax7FvkFc!s2W)^c z`$x9*Zi5ogD;bK8gmRL`sNXanZaR$XCKTAIWI-HS=%tLD6@SxDtHP#&I(mWJ%C^X= zZg5To-&q$^oX6px?avW^&08?7s`5DXJL|rGiizg`#q;kimk%ujD!L;X$kW)eeZiLx zeXY>~+1GI^`B+o%V^rl=NM&rG4`6l~TAa8EYgxyU*Za=;+^G8rlA(YXp^QN(Da$yx zqgYp;8bl;DO9eIElQeMue*J@6B_JSA9%@P+PMVazJ3q^n^p?|xB*rYV<=-1O+yZ8E zDIJ-3#A!7<_D!L{@Py(TV-mHdO`7Dw^~TQP0c~4aFi(m>~Ja6VAl=d zZxBiAAaV?Ua__~F@mOw6P^QVErB104JA``UNgD<{*GU~jl_~vVy1!@7x-9tIMrCma zk%=E=uP%ef0UnKploQ7yBr`xQ&w;DQ^{MK8@kaxD7kXFovON$lzqx>Vfaq#Scx zC9#Z32MTz4$5ZSuUr8L3X_*O)mmVdJDD3(YsVeF|R(b7jZ|>t@OC-_V)_KW6P8t-{ z@5x=XbueZH(y5Mg7;MA7b$*Egm@f5sfvKa%01?E?luN(3U@FkAg{})@4vrl0=pb}y zXi=aTmXzXFL=YXnaqY}=&Wv#UA1O?v9?$g?4R1GvB7E*0=p_+es=^F;_`v8cIOq~mv4AuJ0C zJYIjr98ao`wDmd#gXY!HZ8N}RB*gy{k0=^DfLEne*-z)*vR_!;UyF{tS&T1PRsd(SD|8IcBP&D8Yz$)Y#bd1(;;0=EcOJ9%ko^JjqB2>Hc zVh#X;*ni8YgMRA;ATgT^a-hoSfo7~=s_*%8l{Eg-L-eF|YR<{qCOZ62n0Nr2ya%eR zFqI<0gvnu4O0|pXPofA_-TAq?U0{tPv8nf?n&ssT6)5!*)a34Hd3xrpX^g z(G{^$gc})W8d>)W%X?fc8Zpkm&q{3p>Q)`>RDxr9->SU5dOLGZ5y*`2=tdeo%aY#J z?}N^OFzWyPK6z_npMY8-JsdeEE?r_CnPC1nLuj4@Mzy1-l)y|(E4jf;;Cpl#ysRkZ z4{gJLWN025r$}ne!e8d7&-21=BmrPKar&NkkSX*4Ft&R{P}duE=<_w1z)>2Uz*EuP z$+@jfs2=?!H$|rx-55v{+NMf^oAcfYMW+(Ux=$jnSfiOE!+ZEl8DcYSqY5+MAh`M9w|S{3(niCe2b<=|L$NY(4S=Y~HT4a` zMJW}{4c6y4bh7pLqS`u}(8DYgXsSd_Ma3WVU7m_E)3;Irro7m%iLFs^_~j>-Fg{ZN6ww^oNw^Wm@B6 znCs>(PvUG~brPbmzrWlQ|2`sw6d{ezZL&UpsQqsvEt*h6TL~NEu1JKEIc&Ss#1+5f zREKL)B{Vdo1`c`m#sw|$Z<_G4&y&d<&R`>HcQ>;&%<7Gj(|8=u^?zQ6&4sc3v1dQJf@lD+Owtp!hw)>!`bYaD=q=a{yd%8^Rx zlfv}~vN!TDSy7deI=D($+lU)w{{jiA#FbT(%Zgso39G6y@4>$W+t^rRN+3_#3)Dgoe2Y?%C1on^+Ior0>6?yvt3Dh#vwMTlr1 zsG4701dH0a^1mPdAI=e$dwkJ<0B-*w75Oi04Ipk|K>yF71fb_60d(4bZ8`8BzxBWD z8UN0jH~4TD*~h|K zuf&v9r4*=pq_jq12chWRLq5Jk-HdgYU+(hEw2RNy9Ik+8Frpfsw`RgCn zN$_FMJ%bV5;dP?rlivk0GJ_VC?+oACyC``a;`W$9JO=Hs@*%~s`m^;LRsZev$KF!p z8l$5>7i%H#v#w#9jXTprc+WbAhmzLF%9d)p>zE~x(IuD3YjbvdgEy(4 zW;k0+L@LtGW|W&$WXCzY?Vda4rUR{v%ga^olYkv0#Y>iZK`To70CiTabF^su2<^Vf zs3V1t+|r78c`GNfiIbfO^B!q%RvDHet5vyZ8Gi)H;L?|gq>mh(GoNHi@&1d55j-@aYj&E!i#wI zi!J>o8qe&Awvbaeh%-T26&5O3clZp>!jZG)G(7-N_$Nc&_-(U83p?vWa<+A+wM~}= z*FMVF)$TYBvdOK!v+zS)i7ZlGDht5;D(?)ueu`#`(>~nEbm(ehzWaGe-PmRD^v)8+ zVUd<87|`;kmnVRC+FIcckOCkwj_@M_EQH!Vo! zU?=X^_u1%2HoYz4Ld~shRW9jz0;uTrdT-zoWMV(GddZ*(gOdP9xX;t%q+&)_)CH{m{I$-mPOPpFTOrULP zyr;sdzPn*#{5y>xs=}p%5cYX?!iHW&HTlg1w#vGfC&ZKP0~+0W`?gfJG4ES z{^1dfa4u2ih3c~JW4F5pB~jr`Pht!>?He9#i%X0D=xDDF`GxK{Cq}RD|9E!?6&Ev3 z_w#m|k0A_&Ow}GJ7nCK7H=5-UBU|1?H!XtPo(?vn{k*Sb>ta)R2jH&Jv}YvPVc^ik zg(JsYs8|L#D<|&V!IQY&(pvTM!tb1Q!F~0!D33xU$}uS)jqR=X#iKVq)clD7k1D-k z$t*gT2A86gZ69t2Y`(WcUWFd4jJCE#=(I2ORxht`{IM}Tx4^g9d#C+Xj~I+XX=5Jw(XaO+iJP@09x74EQ%Ko z7-9I^yONW63WFK^(4!F1Dau{JL-t`s$DvNbL{Y&*w>m|h?D0I;K%FtVH_SAn`o~Sm z$}$7GR|cgB@~z`)nM$Ow9e!AerF9XwZfgAQBzsOSN5g#UnOX^s;323 zqb`OKt*JV8%sQofaSSc3$b!BC>hpYcYPHJzSrxNfjv|6PI~XYHIRN@&d1$U^$c;V~ z|5$&m2Bc!Db6aPMP=0Ggvgsnp-6rN9Ny%o1yEku7c^NOZ&2iCx`LP(3m4*EfdGvV6 ze>{Ixhw1yHS9PL(9F2@W2|kyjb|}mrF_&XUowI2Amxu73#f*!pzmE4Uoo<6}H@#Z358H28v&z2OtvxFykA*!Ts3pd3-fE zL;o&N^kBUc=WP&99+aYg53=1X6>-mn&SY6xL8{zhhLYV|G@$9d>h=V-_;9ThKmN!3 zbM!}*!6z%~e!B(tvG|&!qv-s756Z3RGVuix4v!fzb&sGwC-pDgWY?_>v~Qqqjy@wD z!gyV*Xl<7yj0F8zW82byA-3q`_Z7V;AfHD_b(`mo1TDmqI0<7;eo=y>|1|!+!0}H* zy0^`@RkX&4xL*yRm8V0d=F9CC#>;PC5H5XUx~!q{gVFp7z%WYE-SYU$2_CHZTXs3@ z7$<%Bs{ROl+F^fqW*X64F(q`Gc<9*FI+Sjj4P4=?H?~VED(?LbLg}H0AB4cmqB2+^ zR0iAmzH1c9IJ@9-xu=K6o@F$bLfyfG5Ca1GULN`uRdui338E5!^W?(vw8_FN zRNP~LO4mVITpLn!)8hAVMB?H})z^?NZnx?W{-V#MlP zCO!ZZ2`6Ue%qjYT&ET;yRL$ZC=7|An7hg~Mi}Ry8>cgsk6Y2jJSM*|y{jS*mqPPv! z(daty%H$N6O1QSQNXToat!-0)S~p2t2@3f;3)(%4T0$-c?x0AVeI`|R)PL5(eXd^X zw)g+Oqb0xQe$@2wvLfkm%uk1{7A_IqSe#3Ux!-8Om78~u*Tp8*QjXtYa{LWD+w>%p zWh`=@-i+kl%Q3RPu6>yNo6dc)aP7~L;ThS?vYH@)nHqFb-3d1l^oYvIv-4$dK-<0c zP5RMVwdEYUtj=UesnYJ<>`PR76&Dkg->)s6IzYgv zM0!2{o8)Ech@5ZJ&%UI|^E5l(n@#^4cavTDA>@*L*pBqo|0H%IkrY}Y-rq*3CWE_J zmegmti7WReN1ji$2KHZy3}^nx_ZrKsNecG7I;?0kDQ95$Tscq4R=MZ-wA!S( zTKmoVWXwyV8~&bW$BTd6*XAyG!InX#HWZp=UmHVC> zOKoepYM;BfGKYA6lbP;ME7Ox4C6BkOA)ZXho(q5p92Ai_4LYe=e72b@nyNCdYscE& zr~4B+j9d1jJr6-+zdEP4pZ0n*_Z(#v%YGHtvFOZb!BPItx~lcYTl2nikn$k7Vn%X% zK!lo}m$q*in|WXCRz3P2yLtswxx?Zi)&t1(lOC3m2I>e z{0S9yq~~-`+baDz?(a3Hm&6tjd^N$_UijCg+V|q6uxdplpi3+U>R;Y10(HNaK9;GZ z`f#`fhd<6ca34QJzNbxy8$=fcX!l6uXGZED&jWj(ZS>SyJk_PhvYu@Qxn?w~?lj3s zpE`q1fl0MpCh*f+IfBz@EQ(X}Lq+yy?q6kgUKFMFzagrZNo2di1zv)=kj% z?Y3slHjO#2rH<$e8zbf?cw9!D*BX^wwunOvLGAgwxab`Ln)&cKvy{(5KP-g=dnI|19b0Y!f9yt{Yr5^ip|uPPiehoIhe>l{x5YTND@)*nf~T6w>F=R@x}T5l;I@80FU6oGBox@LxsWlX|HF03hx zQ4UVP+~86^%GC`qm@7(nTCFLd(qRz_)`@ufTH^X+xO_{ht#MP; z^QBmOvT0GBq{i;$XH~&4?dhV{C5$!X*u%NKh_{q z_w*c}ZxP`oGk;v1S03W+J8!5hEC@i7JFGT4yjiR=APYFLC*>S$4XiWMl=v@V18liZ+3Q26v(0K7iPY; zf6_N=A*l*Dn__vx9efFH&(ze^pkr9MXTfX_xU?yD%nZ633H83^J|_RfDWAF*uRQmT zS5H@0MaZWs8f{f-ic^aEvQ%rS4b|MzLJ@hoJAZbKe)v=k%bf!s{z4~mzR2=^nEB$W>YSoa==nUkI#d=!eLW)Ss9 z>*+_nJP+EHbj1Xz>2Ie-%_-f>8X@!8=6dTM&MX7Y0VeDq(SDnl^u&#Q?RC z4Ul96$6>FMML>gqEuF>UZzrcPsQwNP5cl?pc^8uj;30Hkh<;uwZnFLWk-jPSIqN8A zhHS2a=K^mQ^dF$`>5*H{2@bJgn<&zJjL)S=V)DG4qH$>LJr`ryXvq3UR8+OjSP(2k z3Fr+@v`;BlqlcD2Fk#%mddrv}sJbaiI9n$2*WvhqOKJfoErsTjwxcLKOeFwV{b_a` zxjDzct6bo0ez*>xg4vm9tUqVcEdIMmqDxo6)|DW)^i8L#wM2f!9m<&JAlf!HJ}usz zUFD)v9gma*eg>7X_=RueBdgIRK+k@dZvOadCZ~ocI#Ri4?Rn$Cttt2ins;*Oig0b+~9f%P7GWNZ2XswfQAd{!Lm)l9 zbhhZVzvC7*ra{~`t)LgH57X}@9Y5%`7QA!d`~2w1Bp?yhJ6LW0wl@$5nmgjtlN(yB z%Q5aIX~gxz#`xh!0EiQow5M?SonSt-OCFO;D|fz|{+Hg!PSPS9c&aU*H(fTQA7pGX z6xi_0TBNh~x6NwWcN^FHIM`?0XfQS6o%6TvC9xP>IrYKDEMij?&S8`8%varB!Va(OT}|2In*Lo>^Fru*1b7?PT8IlU6Hj=L#J6PQK`fpl3+q)~VL zno3C+7n#OA7@QLY*YhR>xDvSHzHp*Gs*vl?EkT|>O8MFP>5}GId-kV2_0-L$HhLy< z9Ks>^=Xt-u_}%gF#>Lj-$+_SI4x_D4mCn2tf}FUrcTxRWgn_}jaxu=Y=4@z9$F8H{ zpWccAhyK~G8I?Di5>>bY^|EEQ(d|Kl+j%>tPG&q)o67yz+G`)6aW?GD-urfk4%O&} zRK1hth``r*KXpt=gj6M9>gKyl3g%yuvAODm%GGkshT?l8F<(+Zd+vbB&R-vwy&&dm zE?uJ|E;<)aMTotg@NhTv6zn_{BAl;L(MZDmgxE77u_=KOW$z&z&+1o(mcx{**pAIa z_va8=Zde5A3|FR3dMUn+PQr%N_E@Vr|Bifvxz0HFm%v?yh|`>*?O1pDZGsU;1EbI? zv8EUBSRJXLvEUx2h7UjYu1!CG_D|*=e%)(*Nc^U}T^u~MhZg=V<%U<=lz{CK%g zp~l(~E(4rJ=2%&anzVv-4X)l!tm;;Ru)4qe0IiyC%0s&DnQSb=9BA$G_ZNUQgfEYb z?HO1xm%+LAqmAdH1bXYyyk|T8@H#XrIEh+Xu#I%l+0TT&8JN9nGZ)6+aVQB}Z=#wW zEkSxCzyl8;Q;gYV8wa`yf^Q6jM5Lj3qD791Rt0m zDC=lT1z5eYud#I+kM=<5slH_sdbXgGK}EgDlTdcS-b80XQV#St_kl?QL@!-Rfoohh zMy&%4G{CPJN>`^ePH}A#*U?!6J)eZ5lsw<}*h)<idt~xhsPQhL76i|4SI;>)F(SSqt8k+ zpzW((-zo#}Eu1rWVCcW%@NQBjI6>)#c^vid^(#+&_|)Y$+M;Q+fxamD07(iWW((zZ zUneG3R)p25HWsNrgQgLr!f9weYwVi<`7!3InVg<8ai{xI>QaUFI@ez*}gL4k2NNHG3oj5 zsBl4rN)Ip%}F@#J-ymf2k{K9{ppmY+OTl1lWYnkKA>|Gcg8X z8$05_y`hbM@E-cd^Ro20iVi2PPmdiIUGCL+lBsLJ=ggp;%ilY0-csYv1LOnGLlq_H zN!L-BL;lCczsJh@1Vh~QRrsh|00;EL0<}qHLxHTXwjmJHuja9!c8lU6%PcmMk`Jfi zbQ2q8{I+-6OvGcS{mZHyeeuUjMfzN01B$G(bOQ1Z7(DJzM*Aem#FqztAyDkvw+30M zW|Z~EM+X@H6dipTpqKbUKG__+Vz}^XFF&7Gv_57u+CmZKUMY}2ADsJ0cr=o7>cS%d z2lmcY?7TSOwgGTtS=*hsQi=$v#b%_L2ZQklG;#Eb?0;42J9sH-zUBsS?Z0ccZ*c~( z45CF%ZROE5o5@xb{8@BzH`7{@?Ms~ z!&iR{8Y+>utL?Y!Am!UZ-nH|S%dPS0Y-DE*jd-h28I6J;Lth68wA|l~KJlgK_}o*q zws*nMxl<%e`pIj38wt%>OeyytqJy+50@jgPf)CCU$dc6ANA9(u;B-kvLJFTHNB+eI43VA2U%)tu@sxr%G6&v#Q10 zL4|#EMPBiQuQu5>=4Y>VxIw5uhE6O~axxV>5IWVl)Q zp-}co`w_NYE-W8@NylAqet`5dE5of5h#d|%IyzJIUiABLQBZz|LXEB!|Lv@4NVP)> z&d*BEyKGE$;_zywpHd6A>-d<5MN|%Py8BB^g2!iPkKHyBk{@v*d9ND=@5~_m6y8g4 z*TSRh2<8aC@X}Jzco3KD7HeV)v6O0$P1Ty2A})bpbx;?0ik+xp?~gjMYkG~Fz@bYC z8$*|Xv!vg7^ZR(b;#;b*&Y(#MaI@VMrx(CEWoDybTE`Xhiv?zybD92(vK!mgud$2| z2_9E@gCCs(xi?+0|jg zbNZfU&Q=faGGyZ|6_CcH)Msq+eBe!Av%M2V!DXNxnM-G9^c3LBw8fNxoeFWeYN=3L z5QUkUKmsKHsZ@?0z+1j}e@FOyIx797nOWert5b*yDrFkfs!ME9hZ^LE4zAMUO+@7V z4#3|62QEy4p_OH?6a}=QUN!Fw+g|BSQoNQZk?19>fQrSu4R(}m6AgHk>DTT@U_Nq= zX4B8w?uKp56RLVW=?P;S9*+OX%+uG=veAUXC#W?T%;n}-dFURN>}e7kS1fjM>f`6f zjW2LBlIg*avObVIlGWbg$BTdXu&u8DUVEmX7o4-U7mDt+0XQr$oEj9^1A1zWT&?toZ6dwyp-7&h6I zYw`O*Gl;W&SUC@c#7JP>H*#0Dd}Q=SeRsS9*10@x#ZCXm9q#x_(jnK+l~e2WaJ8N5{whE9LeCme$XGfQBcxL-^sEzC9a4Z4-r30hbae zSud0q{p}!NpSorNC#j&{*L{B|Fm~%z2(Z>;Y2g@f513ju@pLtbyXQg8LN^cy#Lbc2 zcwOoqs}A$3EibM-P##;~+eJ+PHBj9eFxaHyh)vmBXlskSc_@9n$Q;Kh?e&O4N%H>u zK>^g^V02@J2@LHsA4)R**`@|7d>Jg#uase@R1}h?wZA{M!$V16nR=B`7X5b%9jswd z6-0b;5#Hu&gT~pbp6%vewPC3SDGhb7g0T1%Jgajo^pO?_c;+akEx$Kb^$|NPXyaI+Y5Iqcb)=Kb|vWaxHOMO5idB)x8$zZM0a8lT<=A6PwrMU*8!lCfxg z6)X8@OXM|Tf*;dJY%^FpJ1tZP4COu4t!KDescR;LPZAXIzVs-y9^n5Jh46?s&R$R_ zC2MLPnHwH9uCY1&QPXhrpd1Ge@Xe=!zV;bBNwG*GtG3?mNp0HWcbxi?7>WuyC8iRd zgUj3o?%K8s^@~?V|1MAK`sE40CnBUVwWz&GbgnF8)CoGYEvmL1n)U?Ly{>4Hu_OnDy7ooHHfHiC$Ysvat{0YsIHw*-~q)K?tDM{FaEx z&;ED&OlM0XFH`$$S?r)L-<;w*hewHiA9!qBV#dEVNmLT{&p%rx+IY8loec0FNuaHS zRA^mU>Jg$Y6{odF*}Ty%wSb4Nxu^tGRfgIBSP%rK^lXLF|L2x_bYb z#4QURC|j&8YMP6n=lErGR%b27x_Y@v@N`VpcE8SFf@|ivoEyqnjubmd2iYr|uX{0T zE+u(h)TM=OB>Etv?hBYe_4V5z=D#$m!*<)-f+@vEr;Ne6&5&_ziELD-nn6(}t%oO( z;69~+V$ayKJ*fB7`;d9yW;lH;SbP5qUKRLB460dkC+?C|uG-{iOHr1G zpUG|i_oWbp9CZN9HkkTFbabdmh!~|=l6vlIn!lc?X z(3|5uX~BzPRm@o+XdX}^aJW5g|5L833BDydwgxw_Z};rO`Q5V{)1y~N9~{4P1H}U< z<#dcD5J$$U9EN9bvnus6iQ`gz@Nd(RkW_UGfD;?2 zsiLPBAK$Gftlm1W-p$HF%RQ=T@D~sa%*IT}LcyIYkiQMo>AS1$lHmcyH+8Eq>v}y( z>*c^b%$ifT%$Z^||6r`W?+4hOmrN2%o>HIg><=9S1x_#%J2MraYy(s(kPOak{1Yg< z`c6N8CN&7|Wh!o_hpqnwl+-K-MTH0EvfFMQi&BGHZC<4N*-`#@={nNS_1wVS#NjSU z^f`Z?SV)mDmumJ(Uw`cHcx^b5kBp_%$50(a|Mw%R7d6Y($mjKflQ)fS74x(=E#AZM8oEftVZ&zC{vyvJigT(PN8I z3w+$Wk76QoO;vMi=U_LpALv3a*25-de^Xp)E+BRr z{JeJDe7~Zj+=Fh;LuayZYWr^*&@TJdLK}*lk&S$3zG43&l-}P<2Tww6q?7dvfN7Pz?+5T!Q6&wI z-m}yG=~c6s!0-;t%`PcW!|?HGuX8E?18p|qS4RU0@pubC%&DobatI2NUHsuG^K)dq6rA<1$=6v1ek>}Q|2rm5oYYh71#Ar^2^SI<)ItI3u zg}BE!Go;6&kK3by0Sp4WqQycrDo8>jJ>F}i!vZUG8Rvmk930n`aiZ)cqmjYDiFG7j zN#ALtnT4wTQ~49~Kb$$(`}lQXG=DYA^tDZESchyZf()fD-AARgr`wr>d)WUl6Pi&Xp$l%FM7J*P2JU2- zsq6QYfBIhl_mCFClB7@jjTVbhph1D1hCmpbBO2nGcG71MfWirXqae`7^{@l-@W+01 zsn_P>8GsN4+2buoK5Gh-e+XN1r-Q zHR@jWLlAD(ea#L#*dl&H5QIgN+4DVSE)D#2Q?EIR4>zN;u|R9Sn0s>OXmMcIaVlD& z7ZFQo!Px}y&{yrR;j@n!vz*OJ!5%^IrQ_FV?^o>OlFvWhUV3E!^mE;#ITOlc(6b1E zBDayIGH5l@Ad>703`=uV>mIf!Cgxd+qMsFql(g5yHLB;2oU|e#{9bZ*u8V0poNR0$v!Ydu z3#yoF0BvBl>F5~(I6EOSUlPWxh4)mrr(lm*TCU%UvDW50%3r0!{^6GU{Fe8?)F%-! zi8dFhbKg7aEvz*_G05Lfsj*R&O}|b}v0BR?wXh7C1XaD{I4BLi zLFa782iBnaLA0%x^#S`p^Z5L-&_|YUghuxIJpY9i7owuRu|DR~(sWI2+0hMQ7%_`` zzk@ba+!&^dl?W#H5pG^h(lGCs9^G%|HpQN}Hdo|Ld)+Zt`4*UYu8*_uKO6Q?B_Ay< zs}|E8*?f1-e>6b%xZ-M*MqlE470S198kulOBl{AK=UUox!yZI$D?UB#GN}39U!9-N zJg-Ky_j$cF5YWK;5qElhyvDHSXV)TTZgBW(DEmL)*gc^A&it}OK@YhtQ`0BflFH#T z5${RMXc5mVT6ogZ`K9nCXi&MC*O4`p><<{JrZsD*An7DpS%7s&%1CJDu7=`qdUT#) z{ogU8=hWF551LOt`Bbb^@#>kf-~fQHhZd@9n$-4+=Db#LhBz@#G`!mN=$ z2fz}(tm(Wxdi-g+=;}D7`RQaRNlo&Lsv)MRz!;q*+6Cm8qHu)0(#=q zdLBKL9k#$OCygci&tDt;V5b2?ICm$*cYnjh4cBOx7@xmsvd8}zYQv-fX?%hD3ei6` zpR=BOIuu4gzq;A} zi&zE-$;eG=NnMPJQLc`?D(~RPA*r?~k!K%{$cJTFdH@Z|+uR_1w=|{H|1D=dQJikXoLlddpYItodR; zB&&m~9_BB#dtaVR_PR_P+s#wC=k(!-P{b4gOgq=}M{SqKpBo7qrbd1ue^SMAZd#+Y z+uqsZDH415-<^*Uh(EY9X#tfrAWgd(9^?M%{@-4}k-p@&eS-?mutKqvzWV)Ln+%Ty z{}hw>y^`i7RXcgyV5P}F*`NIG$Xk3fcq!n+#adtg8Ed*&>$c#tUrHfU;YQ+KM>}WR zAe^>%WE73M{L0S*>d&&Ae_x7M#&+ta@w3v8&>p5Q zw!R_pwa?pHYDq)5vILPOcd6T$?C=c!9mhkDi(jLm%BoMfdgpnjz*^^ja9y|DTK3qD2WC@vhS7$DP0T&Dupv!?0VCA7o80 zj=aWs9d9;WHE_NDci8W#{cY))M5_X77exA}%coJCThD^C-IRR3^rh+3Q|7%7B;>2s zXy-Rta48cp%ve9wUDJ;8)YQ?GwT}K(1i4w`gO{j%MU=d8<8)Le?Z&&W^=ptC)lLpB zJC0Uf+34qW(Vb#Zbb02Pk0i{x$x9XZx#SPn#Fi#ZpPPU2XNwhld-+1oo$XVa(i?2m zkC_67A#|l!Es)qOcrrv?T}9oMe}fS(X?maaM;t^5D*^1-&#n6c=|JFB$HP~hV4MBx z_j#Nl?Eh5t)p1blgNG`CnbW5o$h)B2e(%mg3AV^6r64D5W zbc#xcz@7E`?stEee}VU%_spC#Gv_?#dEm{}oQNG~!T_;nm|ieFFY!~sQ+HtoKgx)C zid^`AhEQ26*Zb+$FEeSsBXU$FvTkm&63VIG`UWJ~b`~2;ufN{LntfH%w6Jwc1v!%oJbw?yPIz~1d z0UZoQ$7Tti`v2GhbHpG0`vobySRP0 z(iPIHOMutvzdkRR=2`iHPpMBnviQ9et-YgHUJy{^ps9m+0fQsN$HrPt!ZqBwab15ZgVyIG&6ef|9TBC6VL<4QwT5N;v#RRE|<0L zF{oJjU7lz)sT^;NmeNGnGsrj#zAtBkCY|A25ZX*P7F7f_GMb9$Z_DM2m|g4YBP#7m zOxQph00}lQbgEXt*P)?lySn(Bfbza+K8Tu2SP{{qR7(*L(Z^8t;Lb#e?L`)*lQ=Fp z8!2GA6@cQSvin$cUHr;OvIB-c)-o~UqbWr+n_Rh*Yo48}U zW(@tTfI#9B@H}|w8_tFQFEZ#NUX7n+w_mUAtX5wigJ6EYm$@AS zeBJbhaS3PFWRnB=_7kiP;6YGaYU)JiXe|ozhc?JZDH|R;)KN9$t z`M<{W?CdhZg8R2PmhpLCrztPEU-~wGRMJ_Yj(-*vDOUcNpd}!ESx<;gg+by(-#Te| zdr4Ps!Vt9gXjzD)t2ZO>*DQkB0UhdCVjl=N<5>1+0RL9EX6NjPHEosm`lCCBD`d5B zwygLbL^!|E>uC#g3(wPb0R(e2vq~08X>Ca@fd#pO*~0hlzU`l=(O9BH96$jDv3f;T z15XYdeyYRb?i!K8Ca%~PQ6rAkB~AwIks@4Eb4*KT+|_p{JmWda?fSv`*E7gM6WYNsp3PRzVx5*U|82(BwS&>K;q9Ka=!4wKs$n7wt7~lK3h_CwJ zDv%V%$XhM~!$kDygDl_s)T}C$wP9j=%FV;G(>9?KlQ~jpV|+z90N+P)hYrY;Km}z`h-|mJ=k;GCS3b*+d<-` zM%8C%@Q-q}kfldYEb4d%7((~$kf7wBE^nEtcoT41$^t25$@_bn)}=Y;lkE|;Y3=7e z53DXvf9m_4{Pg=~Us{2&af_Xko=uq?=@Vp5e0eJRJULs*?_hI(g~(V!ZtgXfy=w>_noaIlcw^2Iw%m z;G)mOb80PMsCgH*TngD;eBeZ(MVp+_g=O|3gZ|9~hUYH~+{vCL-3^#mW?TE+a&U8K zDa-xF6XNTWzjbHpYs?1xY&>L&CoFP3=AP&v9U~6JOsj&6?AzHH7W902P3tRds|1dL z@uezV)V+!?vBJU^NzKGp8z=3-=-MuAW2pdi+VDM!?ypR}21a8?EKD zrGj^4C2mvr5SPLB{Rzg$gI%-=uimh5tcrOA1u8iJz*gyBGKaNdyN#~>W(}gGV2S;v zk!<)te{}!BUgPH{>%}K|cCBB26uCr98BTby$?WL$I|KwGiN2BYBtDIg8x8UuieGi} z2!#$(nAD@6s2jX@VM`L;S-EZ_z24d8D?fNC5d#VPtSCHORzZ1N$6+1tWC|mP4DYV@ z^5#?v2h8wbti^=EX34HTSr-oVDkz(A-FPI^6WwploUG88GBq~;R@1I*s?GT1Zt|3Q zJz~H=eI;*`qGtM}TZ^MF2VHq^H3}>CRR*-75RFiug4+2|ei{@7XnJMRQ@CrJ)M-u4 z|KPe~F0t``qtULOs1W$gj4B9Ejt|gpy>8*RZ?bF_74(u#2x}{HQ#!B+aeI#=nNY?Q zWoEh7?DXj;nI*}@gLyUKf&<{bOhmiLv{a^ojjz}=Ev8_kt`>i0pIv}6Nz?cfvvgbm z$Jx0fQC}KhVf-$AIk_0aR3)iRJf90-Tr4E_RM*J<2d`?rJM1586 zaQDvMm1sR=i}x0<^TiJp_vk?8{(}oyR%9SScf5^dNj$x+n|f2($ke8pkMWkd>5;2ir<~mrS%)DrHu(xWX*+W!N^OSTE_ZjNk6 zMi0qTXhc1;fv6n26+_EaJf9tNTXNOF${zwR=Tul|>hOPLxZA29T^B)3V?{i%dN*z3 z@?Cs{7!_DRY@w)pK8D1gd$QZDyQU>^Urukzbg0Bl<(1WvrNP%nW`e-BJL~gwjKO&J zleVotRweYyBP7k`4HfqnE@sx3OEGs&v=H2G`e3OtFsj?MKcvR~E;_M4y_N{w;}qY)2mfJ!Qd5Uzp2Zup`o~L~UX~Jwq>Qd{$!mM1rW4Yt?KfU(Hci4i~?PYchz>Y|e(7 zJ@Z@pE&wKdgmIhVm*FK_gF!h1T@akosiYRd%H<_?3p{d!rggui zfWXEh<#%+08*l6{tfP74xFS+jmMR;myZowQBed!UshLF2spY$Pc}RU)7kuvw!KPF~ zmE%|0K@QmvH=*UC6!u#HOpYYBkP9@NtmIxl2cQ1Kq`M6+JWE0B+5B8D9Jl*dP2I0CGi?@o48yQ>&Uw;G_5m9`s|+@>qtB31XzBzRlPy${8&?6^A18Hw4&4Q z;O;jOy#z>=aZpo+e5RMghs~neHFW}UeUxpKn;seJ&$jJR@WgZfYV)a_H;J_h0N!`!1WI)MyDUOuU?uh#@=^^lvNindpz0O6I|-WK9G~QP%zB z1BSDcT}|n`JC5!w=2XINjCDsSvU(VZiDCh<-|qikrFQa5RiV41Io&S0CM-0C(A7Vd zGce6KyCa({D<~P|@9Uf%BZ-^sn&sYR`}0Te4$(|xANC>CyY!V=>Cm7fb{Yu#%1ROl zE@7EWh}{msuws@fa)xt@8g-77_CcN6LOCHt`SfY3;G#>x#FW;})}GW-UcC5_ZJ=4QrpdeY9JL&9;52<+&kk07#7Y*_~l^ zt5LpV#GJ5;+q|MB&`m~|Of7mpK3>&(0<` zIKcz?KGyhlvr_t;xca7=)%s+YmUM#Rm%4Lbh?6EKR8k-4P9w5jwflaMBRPTEu#xXg(fR@RPZkJ-CoE!DN0_l+d?&E$!sVgt{+5H5(0j*I%t$g1~e_Tq9?%-PR{%;3zZI>4n2S({Ya+G}6D&Zzidmf)K|j;cw&@8chX)^N8od zA5P0R$2s+-)VN!KcA9J~*kGVxf;m1>tCaUC$*7W5!rqPbchfp_?R(I*ZcX%54KU6q zbBQeseYqI60&oZQL=_>UB}%3P<6}<;x?SP@eMH!Yv~=jfxU>pk2Tk!}?QAGnH@2qr zeeP%5{?g<%Sn?K@Jp!fz9ja;*1ly6NQAphqkG zt-bp6=Vx5{8LVDdU-()dfie(=6dI^2H zq6*D)Q2BwmMTA7b^offwl@f>I#G7%K32LM^3B+wSwM3z@cPXTm&B9y3?QTnRq{3?#?+huZ*Zg*Odfj^(}v#dFW*kLuc?` z4KD~OP^j-#u?&g!mFg#|@>YR$POPL^(d?_Gn961930i}lHSdcUJjABZ#?2(V3N9?A zWb`Xb6L&I6@U$cqS96xtod;)NI*Yw<`tQA|wC_f*vA<0i1-L~qy(B2BU}YcM3m5c9 zyZ^a4uBUfU_minL_lf`30GrM#zZ1O^*YspKc{NUIkR@riJ4>EZ{OkLwZeR-(0Q^{D z_9d+Xag?}0T(_wiQk{ujRwDIXhL}@#ySZ<;6hQq$mua_qqSO|iocNcsHX?@RPIgPW z)q1S?#2sHQkEJt7UwnVU?Me)@$Odt|;-8#s)>;>zHDXw+*lD#b$P^8sr?78oCaj9u z#!tx-BN5Oo?0n*x?D&3D4GcjGa6yUjs3o*#FebjerxiXqsmz-vco8$%;2RY9GVKmF zUW!OAqWRk_PFio$ebEIMK=vlfSdnE2Z($j)wS`y?4@~u zyOxlOn_gC27u3!)x}b#83q zWKf~~o6aJ)T(vF}kkH96uUT9ff)s`w{+b307AcT{6(D@zru+6Y-QSaS zF2`)|@g*}#>T<89&RfBB%-Q!G;St5PQ-;>oyCrdufe&0-HYjCQJ{~e~eo>3)BFsj8 zVtS3MMQJwOtVZSoGJ5-ML4k~8_EzV&X`s!kc?A2V^I~4Hf`ftbb0ow9`b|X4p}O=y z^9mA^0#=@YIqJCg#o7aBkD~MvqEhyp2F+p(9Jc6*3`0lgbEYce(58&fgfxA1QF&$^4fo&3n2 z_%9!+xhmoJsZ`=6rKjLilaqXBzZJ=RqG-)LZClRM>aysC5LZkk6D=b`cvij6aUxRK z!j^=)lF@QIL{NhCwjw>OUEQj8W$!imi63-lTYTrN0${Ln+}|+2szuzRrbAhfjfjma zryo`pWPO>xpTfDxDR$L7OLWXBMOzjSP!X`i-HUj(VxIUo`*Vt)8j)SS(TwBvDE8}< zUf9_jZ|H-4PARj?l$uBN+&>?dG@b$Ak8M|>td_=`2SiUCdMWH z-2DZQyYl7-_BfTV1`uImrUAB?_t@kb!XGkrO@}P%4|!v<;sJc(14ehS{CyQj%4TnI zCksxoH1Ogn-vz4i@-{TDqh4!rPRGr*%I5i8l5G8A47b*AWo{$bx>meM|eZf#p;9X9d3KZ&j3`Uz=&XCchh-S$~Jpko{EOAr1GTN|VhALDS# zXP8?)j`9;z%ycKz2{AaCee~vg?ONujhe0PkUiIyxu&yS7!GaVev6>$dH*PeGzQMGO zxbg2P!6{IjGR|_96&z98=gOy;jA^4mZgA?F>3zce>gun@&R+z%ipYoK*xr9Tugb*KFy&#X*1=;J zoi21D*KQrLSHa~EY-G6vKsWMdjZK3j$ z`xmlJG?5GWY#l%Yhypq#q!)eqERo>nF}2b^k3-;Icoy_Wxk3`t|J{2NN#`sdl=hHI zJ;k-yZI~WGnLPd=pn60BtP}oQQbA4KiD0zq`&8EGqD@?tE9Gx%t|;t{b?FY%M92U> zph82=B*tkIuqNHA+5eUNt&L4EtqbcpC1vb<%i&8{nA}#UIj%J>F0Etl?=pvujvQM{ zRJb}7`Z=(Sq<5EJF6`Av2i+k3rpcd<0K-)LFvvh3I1V9W739K*7mT&xs7OZ8&5r`cYAQve-Rq7SR!8-DYRPY>q%yW`P4S!R^s;eHK((6rBFTrlBv*0AbEbYgaxGYss{_zT^fiDoAD-Qp+ltEOOQg&2WY zoyC#*CNTI3uk0P!hbG5+wv!>|x1CjKQgJ#?@u)+srz`#;ihz&PgAosqEd9X0e#Cc} z*`#36$=_fu!=2JikDlm-^gk8s%dSL ze%ey|k}RYve)ESWP~apbu|)s-uXssM;C{ub5W;%T-`l77pc@1#ZntkxuVoPJm>tR8 z58HdEsmt*PwB3GF#T7%#c6S|b! zr9UiGwX)Y5<_445zKFT3(5uEcuBLZNdHGJ~j|fP4>oy{tRb}55oa-4R7a&J#+lH&L z{6&vrj#)~VEL3=zyU^iYWi^G?Ck{0Eg|Cn|lIV?H^=aZEzvQ35+_|b#+);L*W~t?iTqC#8K#ScdmgZ=xI3c`?BijGtF_qGXIe#S8GPcUwf&!MgztX5 z%AS|2lVmeTFrvy+AfpGSYOoV;C)D0PpuXsGmsXEw8*HbKm!v|gZMl!)ln)w5QWg^e z=h*a|qvE6>Qu%9M?2vIoUhvi&L3xdDuDcq=CVKn)JS0*8JRoxIbs9t!XI+TOvxn%=t2C*vrCQH=sN0+B~3Tnj~A^u;h z0Mw^h@&66qlzcYHcX`!u++gD61$>LwGY#Vn=>pE?1wMEz9!yR;+ClR>zNO#6^fCtg zzxNw;*-(4%Sw2l#yCMHY5jKFmq5%wY7p`ork=W-;SxZ|K_VAief!ay#;5MT7A`&Us_u*Y4?}-+ABl73p>U zQu<;DQR#2SL#|AR$yXOcEv`NTi*0A2$3qVsR)#+Pj9f?`BKG_~Z>GYK+YUdP9yPmI zNM~G$IXi9F2wgKH0SK+W5BT==2J%rL z3kQ7PD=;Pra<>aE^ZgsFIep4Pd1xMTz+V|jA_@h`<@%O=6+1_H9E zgRMu|P18c*L%#%c?tmioZHS(cjJ|a=gfq?iz$otSpL#RJ`boW-N!^J^a#20g>Z$%B zs48I%gz;+cm2grawL*9gZN!lpANQhtg8vyl%k;sgKUPKlP$}$Wchf~A%_h3 zs_P8sllO`69(y@2UFs}vc*G;g1ws!9BdeclGc*7rukprtyKln!vdW!Q^A6pszAq?T z@i-injP7#Csdz*9u@P46Ek5!QTEdX{gYt9n(nFaKP48ekk(-lLQzzC1OODT7eaC0rySojeXVL0|0xmKVtoh$R0P z&Wx6^)&396@B#RrM+#Ek!vEEoY+LZrg_53t~6UiqCZ{FRQw zOo@x~(T)-4i}U4*43Ld~E*i1m_WpM1d^b|=!id( zDMjgM2lf+Ar-kkBp|D_)ExwHtcDirBi>C~zbQQwXiPn=hzfH%n?Qu<~ENCM?KP}LC zjAIjjv$y1Q;DmU*cI2;fe(mb*3%Fk6pJ5$_>l3bj5iLYvW->rIqD_q3)~uC=fD-jQ zn)(CtW$lk#4nW(8iSn-vz=G^hvTkM}VhF7K11*KM^uYA>#Aja{Tld(!_|6EElTisy z>#)4@w9mE^z%3xSOlWVe%~0T4%src--{Mdvu*;#USw=7T zj00DwYX=xPOEJ8_|5-gZO{{}w{TiQ^*FN#Z{YW^tsyA&z!EsW=@)4D{YP884rs^aN zW&T*pFK9Z{!@PNWyV0{vNI_~%!h^h_bCIQ%oBEAYD}F<%QctJ&d-6BIRB9*EW50Az zftd9xvC!rze!5%))q3boG{maVMM&Qf8>~RZ(&75c3n3WgCOYh30WBYyb2SRW6y)bj zK}rL&lsM7#ImS3rvj5wX3c^@Kj~<0~$OSvg6&i!9*`q+@{nLHq{(o!n?#7XI@plYd z2lbkSqL=(JhbIi2*t-A3)!}ZPhUBcScsBb$JQx(xLBT1>6OgyvPo2v3tEzr3xla_Q z)vxOxTc*PAF#u<#X$ESMs+$Sr-guSHqQhve>P9aDgEaN4M__vZW^+LcIv_&SqNYT| z#g3wN&}Tv_DA=`ozYf#6#@2%xcD8tVg}7p~WXr?sP0KYZ1Xdr7ZLsOIv+Q?L(WLfw zqZOWAm^!PWoqW2RS|I2@2pS(j~I;p3slyNkB} zGen>I7Nqc+iUg>rml02@bLC42QA6`_M7YTzoU&uY&qqmDt7a;u{pjEE@ZTyU9d!1^ zPv;7td%5 z!sB?{mCNi?Jdweq+#BM4e%+U>DU4$H%(r{j>G^K`NlOWalHeG)>_kok57Qr6CCF(0 zCs;>@O^({t?XL}}XiNwyU5Y88TbYM%K8@A~G}1`L-9w6t%9vU*hX$+0SJZq6>=X{c~SbzZb1dMbKuW?-+07L2mo z(Y%r@^HATzDrBETv>X07@r#FY+)8eTUUddg#2RglC?Lo&4x7WpN*~LvnkD2%Yncr zah|A@*5F!N;jOAkkhX%v#B9<%DCMtREw6b_U#LrCP3!{d56+K;2qkQV7~rVsR~~w^ z-|j_;l#ejOov2K{`nML$<8sf>{Jrt)S$aWDul^oOUjxwNdh##O)vh6VhM^Qd@0v;n zCn}Rk&tYxRzSw}766@n^w{Nf+zGi#QDFr*!91;(e>KkuN zSiqM=RMa38$Q@k@Ykv7*dX+$W+9d+qLp{&ixP1uu1_53bnx-hP`$-kS<9`9tF*&QY9N9p{*K`lLl_&}?V+iqQ`IZ&pIu$nqU0Q@wmDfL3_f->4YNG*s)n1S zJ%fpF-U_e}wU?|OeYQ$iWd0YoG{RP_tIjY8rb5A87Db-HcEIrHPZ^nL4bo);QX67c zH_kHxbnyq8Ao_*;-gp+#gbqt%@kVMNv;5`fSZ8+R*?pfrw0<#}<`Nq$(bTgCpQR~R z%%8nSU->><5@P0)mO;35gAj?Qf;hSv^(twt@1L;;C|THvCS|F1BkSBP;u>1XyAQiK z=*bL4D5f8~U|!6zt2{j|T0`lvxb=m3Jg7scYdcMPEwS(Kj~bAy5jNu9;$Aaf5~g#u52@xk7uu8g_rWn4(*5e% zL_{em=(L0@G42hdU)dwN+!%;MDr7)seboK1CooD=)8_Aphs>=Ze=_{9S1YQzRhb=S zXgNF7$s|9S?4*^jelcB6-VhPvGB!o=EQh7>=FS<12(PYRVYqNu!-oSGn=>7NOvBu` zwDC^)Xk>n_FeR4eEbaR*&97AaEqmASZ+lyGnAqn8Rc8>Zg`RAz_~iq&MEf{l*)V$c)V!vA=Ut1i(sqqM{;@w^ z)2zU|8ByK^E7v@V67&8SIT$1bygQ3~9t$d0KLgth}p;hL6A$F8LY57TG5F4H(`XG+coRuciYJR07#@jIcGM6aaVPY&(X;R7p{V$ zc2S0DB?W(_6;_*tfrK#ekNA@fG84qfJL@JD_h+29y;p-UYkU9ER$yL~t4o>O6qjAr zW&<{#v&xS z`lkktf^J!mCj##>juZUQT#A2_4yJ3M@kyEMeNJa937*`m%U8L=B+N!^eGOve&qQ&j z!na*;+UH75I>&WAq!WFb9Dq1cNN$~zp={Z)_aGwt1*!Ckt9gGBWSG<0vY%un4 z;3@pL级别状态: %s (%s)\n", severityColor, alert.Labels["severity"], notification.Status)) + buffer.WriteString(fmt.Sprintf("\n>告警主题: %s\n", alert.Annotations["summary"])) + buffer.WriteString(fmt.Sprintf("\n>告警类型: %s\n", alert.Labels["alertname"])) + buffer.WriteString(fmt.Sprintf("\n>故障主机: %s\n", alert.Labels["instance"])) + buffer.WriteString(fmt.Sprintf("\n>告警详情: %s\n", alert.Annotations["description"])) + + // 使用指定时区格式化触发时间 + buffer.WriteString(fmt.Sprintf("\n>触发时间: %s\n", alert.StartsAt.In(loc).Format("2006-01-02 15:04:05"))) + // 如果告警已恢复,同时显示恢复时间 + if notification.Status == "resolved" { + buffer.WriteString(fmt.Sprintf("\n>恢复时间: %s\n", alert.EndsAt.In(loc).Format("2006-01-02 15:04:05"))) + } + buffer.WriteString(fmt.Sprintf(`<@%s>`, "guomengfei")) + + } + + var m prometheus.Message + m.MsgType = "markdown" + + if notification.Status == "resolved" { + // 如果告警恢复,将字体颜色设置为绿色 + m.Markdown.Content = "告警已恢复" + buffer.String() + } else if notification.Status == "firing" { + // 如果告警仍在触发中,展示原始告警信息 + m.Markdown.Content = buffer.String() + } + + jsons, err := json.Marshal(m) + if err != nil { + log.Println("SendMessage Marshal failed,", err) + return m.MsgType + } + resp := string(jsons) + client := &http.Client{} + + req, err := http.NewRequest("POST", defaultRobot, strings.NewReader(resp)) + if err != nil { + log.Println("SendMessage http NewRequest failed,", err) + return resp + } + req.Header.Set("Content-Type", "application/json") + r, err := client.Do(req) + if err != nil { + log.Println("SendMessage client Do failed", err) + return resp + } + defer r.Body.Close() + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println("SendMessage ReadAll Body failed", err) + return resp + } + log.Println("SendMessage success,body:", string(body)) + return resp +} diff --git a/test/main.go b/test/main.go index 8279af8..93fe158 100644 --- a/test/main.go +++ b/test/main.go @@ -1,87 +1,117 @@ package main import ( - "cmdb-ops-flow/models" - "context" + "bytes" + "encoding/json" "fmt" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/clientcmd" - "os" + "io/ioutil" + "log" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" ) -func main() { - models.InitDb() +type Message struct { + MsgType string `json:"msgtype"` + Markdown struct { + Content string `json:"content"` + } `json:"markdown"` +} - // 调用 Kubeinit 函数初始化 KubeConfig - kubeConfigs, err := Kubeinit(1) - if err != nil { - fmt.Printf("Error initializing KubeConfig: %v\n", err) - return - } +type Alert struct { + Labels map[string]string `json:"labels"` + Annotations map[string]string `json:"annotations"` + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` +} - // 打印解析后的 KubeConfig 数据 - fmt.Println("Parsed KubeConfig:") - for _, kubeConfig := range kubeConfigs { - fmt.Println("KubeConfig Name:", kubeConfig.Kubeconfigname) - fmt.Println("KubeConfig Kubeconfigdata:", kubeConfig.Kubeconfigdata) +type Notification struct { + Version string `json:"version"` + GroupKey string `json:"groupKey"` + Status string `json:"status"` + Receiver string `json:"receiver"` + GroupLabels map[string]string `json:"groupLabels"` + CommonLabels map[string]string `json:"commonLabels"` + CommonAnnotations map[string]string `json:"commonAnnotations"` + ExternalURL string `json:"externalURL"` + Alerts []Alert `json:"alerts"` +} - KubeConfig, err := clientcmd.NewClientConfigFromBytes([]byte(kubeConfig.Kubeconfigdata)) - if err != nil { - fmt.Printf("Error creating Kubernetes client config: %v\n", err) - return - } +var defaultRobot = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" - clientConfig, err := KubeConfig.ClientConfig() - if err != nil { - fmt.Printf("Error creating Kubernetes client: %v\n", err) - return - } +func SendMessage(notification Notification, defaultRobot string) { + var buffer bytes.Buffer - clientset, err := kubernetes.NewForConfig(clientConfig) - if err != nil { - fmt.Printf("Error creating Kubernetes client: %v\n", err) - os.Exit(1) + // 构建告警消息 + for _, alert := range notification.Alerts { + // 设置告警产生时级别状态颜色为黄色 + severityColor := "warning" + if notification.Status == "resolved" { + // 如果告警恢复,将字体颜色设置为绿色 + severityColor = "info" } + buffer.WriteString(fmt.Sprintf("\n# 级别状态: %s (%s)\n", severityColor, alert.Labels["severity"], notification.Status)) + buffer.WriteString(fmt.Sprintf("\n>告警主题: %s\n", alert.Annotations["summary"])) + buffer.WriteString(fmt.Sprintf("\n>告警类型: %s\n", alert.Labels["alertname"])) + buffer.WriteString(fmt.Sprintf("\n>故障主机: %s\n", alert.Labels["instance"])) + buffer.WriteString(fmt.Sprintf("\n>告警详情: %s\n", alert.Annotations["description"])) + buffer.WriteString(fmt.Sprintf("\n>触发时间: %s\n", alert.StartsAt.Format("2006-01-02 15:04:05"))) + buffer.WriteString(fmt.Sprintf(`<@%s>`, "guomengfei")) + } - pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{}) - if err != nil { - fmt.Printf("Error listing pods: %v\n", err) - os.Exit(1) - } + var m Message + m.MsgType = "markdown" - fmt.Printf("Pods in the cluster:\n") - for _, pod := range pods.Items { - fmt.Printf(" - %s\n", pod.GetName()) - } + if notification.Status == "resolved" { + // 如果告警恢复,将字体颜色设置为绿色 + m.Markdown.Content = "告警已恢复" + buffer.String() + } else if notification.Status == "firing" { + // 如果告警仍在触发中,展示原始告警信息 + m.Markdown.Content = buffer.String() } -} -func Kubeinit(id int) ([]models.KubeConfig, error) { - // 调用 GetKubeConfigList 获取 KubeConfig 数据 - kubeConfigs, err := models.GetKubeConfigList(id) + jsons, err := json.Marshal(m) if err != nil { - return nil, err + log.Println("SendMessage Marshal failed,", err) + return } + resp := string(jsons) + client := &http.Client{} - // 创建一个切片,用于存储解析后的 KubeConfig 对象 - var parsedConfigs []models.KubeConfig - - // 遍历每个 KubeConfig 数据并解析成 KubeConfig 对象 - for _, kubeConfig := range kubeConfigs { - // 创建一个新的 KubeConfig 对象并填充它的字段 - parsedConfig := models.KubeConfig{ - ID: kubeConfig.ID, - Kubeconfigid: kubeConfig.Kubeconfigid, - Kubeconfigname: kubeConfig.Kubeconfigname, - Kubeconfigdata: kubeConfig.Kubeconfigdata, - Label: kubeConfig.Label, - } + req, err := http.NewRequest("POST", defaultRobot, strings.NewReader(resp)) + if err != nil { + log.Println("SendMessage http NewRequest failed,", err) + return + } + req.Header.Set("Content-Type", "application/json") + r, err := client.Do(req) + if err != nil { + log.Println("SendMessage client Do failed", err) + return + } + defer r.Body.Close() + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println("SendMessage ReadAll Body failed", err) + return + } + log.Println("SendMessage success,body:", string(body)) +} - // 将解析后的 KubeConfig 对象添加到切片中 - parsedConfigs = append(parsedConfigs, parsedConfig) +func Alter(c *gin.Context) { + var notification Notification + err := c.BindJSON(¬ification) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return } + SendMessage(notification, defaultRobot) +} - // 返回解析后的 KubeConfig 对象切片和可能的错误 - return parsedConfigs, nil +func main() { + t := gin.Default() + t.POST("/Alter", Alter) + t.Run(":8090") } diff --git a/utils/goflow/goflow.go b/utils/goflow/goflow.go new file mode 100644 index 0000000..3a33c9a --- /dev/null +++ b/utils/goflow/goflow.go @@ -0,0 +1,112 @@ +package goflow + +import ( + "fmt" + "sync" +) + +type Flow struct { + funcs map[string]*flowStruct +} + +type flowFunc func(res map[string]interface{}) (interface{}, error) + +type flowStruct struct { + Deps []string + Ctr int + Fn flowFunc + C chan interface{} + once sync.Once +} + +func (fs *flowStruct) Done(r interface{}) { + for i := 0; i < fs.Ctr; i++ { + fs.C <- r + } +} + +func (fs *flowStruct) Close() { + fs.once.Do(func() { + close(fs.C) + }) +} + +func (fs *flowStruct) Init() { + fs.C = make(chan interface{}, fs.Ctr) +} + +// New flow struct +func New() *Flow { + return &Flow{ + funcs: make(map[string]*flowStruct), + } +} + +func (flw *Flow) Add(name string, d []string, fn flowFunc) *Flow { + flw.funcs[name] = &flowStruct{ + Deps: d, + Fn: fn, + Ctr: 1, // prevent deadlock + } + return flw +} + +func (flw *Flow) Do() (map[string]interface{}, error) { + for name, fn := range flw.funcs { + for _, dep := range fn.Deps { + // prevent self depends + if dep == name { + return nil, fmt.Errorf("Error: Function \"%s\" depends of it self!", name) + } + // prevent no existing dependencies + if _, exists := flw.funcs[dep]; exists == false { + return nil, fmt.Errorf("Error: Function \"%s\" not exists!", dep) + } + flw.funcs[dep].Ctr++ + } + } + return flw.do() +} + +func (flw *Flow) do() (map[string]interface{}, error) { + var err error + res := make(map[string]interface{}, len(flw.funcs)) + + for _, f := range flw.funcs { + f.Init() + } + for name, f := range flw.funcs { + go func(name string, fs *flowStruct) { + defer func() { fs.Close() }() + results := make(map[string]interface{}, len(fs.Deps)) + + // drain dependency results + for _, dep := range fs.Deps { + results[dep] = <-flw.funcs[dep].C + } + + r, fnErr := fs.Fn(results) + if fnErr != nil { + // close all channels + for _, fn := range flw.funcs { + fn.Close() + } + err = fnErr + return + } + // exit if error + if err != nil { + return + } + fs.Done(r) + + }(name, f) + } + + // wait for all + for name, fs := range flw.funcs { + res[name] = <-fs.C + } + + return res, err +} diff --git a/utils/schedule/schedule.go b/utils/schedule/schedule.go new file mode 100644 index 0000000..a119d67 --- /dev/null +++ b/utils/schedule/schedule.go @@ -0,0 +1,55 @@ +package schedule + +import ( + "fmt" + "time" +) + +// 定时任务 +func ScheduleTask(seconds int, task func()) { + // 创建一个定时器,设置触发时间为指定秒数后 + timer := time.NewTimer(time.Duration(seconds) * time.Second) + + // 使用匿名 goroutine 等待定时器触发 + go func() { + <-timer.C // 等待定时器的触发事件 + task() // 执行传入的任务函数 + }() + + // 注意:如果不停止定时器,它将一直触发 + // 这里可以选择停止定时器,如果只需要执行一次任务 + timer.Stop() +} + +// 暂停函数,接受秒数作为参数,并返回一个通道 +func Sleep(seconds int) chan struct{} { + // 创建一个通道用于控制暂停 + pauseCh := make(chan struct{}) + + // 启动一个 goroutine 来执行定时暂停 + go func() { + fmt.Printf("暂停 %d 秒\n", seconds) + timer := time.NewTicker(1 * time.Second) + defer timer.Stop() + + for i := seconds; i >= 1; i-- { + select { + case <-timer.C: + fmt.Printf("%d ", i) + case <-pauseCh: + fmt.Println("\n提前结束暂停") + return + } + } + + fmt.Println("\n暂停结束") + close(pauseCh) // 结束暂停 + }() + + return pauseCh +} + +// 结束暂停的函数,接受暂停通道作为参数 +func EndPause(pauseCh chan struct{}) { + close(pauseCh) +}