From dd4417e34c5d34bc59ac841808135327cee2a7e5 Mon Sep 17 00:00:00 2001 From: xiaohei Date: Sat, 20 Dec 2025 04:46:24 +0000 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8F=90=E4=BA=A4:=20=E6=B7=BB=E5=8A=A0README?= =?UTF-8?q?=E3=80=81=E9=A1=B9=E7=9B=AE=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=92=8C=E7=9B=B8=E5=85=B3=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/jpg (1).jpg | Bin 0 -> 91535 bytes Docs/项目说明.md.txt | 218 +++++++++++++++++++++++++++++++++++++++++++ README.md | 155 ++++++++++++++++++++++++++++++ 3 files changed, 373 insertions(+) create mode 100644 Docs/jpg (1).jpg create mode 100644 Docs/项目说明.md.txt create mode 100644 README.md diff --git a/Docs/jpg (1).jpg b/Docs/jpg (1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b9d11a9b2de81c8d0d3d877394bb57afbe21515 GIT binary patch literal 91535 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 z

Lr(Y3Dc+vR6ycJoKN==gG1X{OSI7@58^3cPj(Ck5E#Nf`zd_3%e|KaM=p>cqT% zrK*3B?Q~(E;7cD4fEPyVRT~I2V)-b5A0$y~X0@pwuccl+I=V99J61DWv-x9Y^JVwh z_+Om(3kP5pVPF=CDLbke;yim!d@i9`)Apa87ZqmsOXcvRkki~9x$PSTAG?pb)tLB> zxYwF;>bm1Z`7+}vqHh%JC<*fkjnkCTYGLn<3BrapMJS?UM6x7K|KS{MR$7vwV~t4% zZCKAVpVzlD=N{-B3&XU^RP^&(!WBpZBA#VZUFt-sE1*KF6iXr7_J_~(iS=>0+ufJ5 zn$e4i*#d7u=iQ+b-v^?jZ�xWimWv zv4RId6&yq;V=`8V-=Ucm<^pjzHM&~DWh}g$MAF5=Wc;yjtakAB+ zS;~GGdGJQPNC;Q*&MaR$E_%fcJpk@4F?W(kMg;6Q4-D=GYmH}nWeXW{Y%G%r3{;v{ z={(# zsbPh;6<$Q2;UABJlFag&i>_B0KA0Qzmh5O)^qg8%AjIQ)-vq$wy0d3d&`|MHvOy$S z$W}rseXqc9oUyC;d?);G?3aB)+l4SXe9R8WnQ$^y*=it?KW zfz?BG6V;e1A18N`nD{MTb9T!ROcVt}AGRYMAbkwTD&TSR%fQR>T4VV6|Da=2=E_PkqI_c|IENBsD)VygXlbj8(8;(UkHR zKA2BV(|A3tlu$DP2Gh^EAmXXDKm=3R4&qS3t_78T)AiyUycr2mK1J9zTR!NT_TR)y zCcEsLLUhlwtDy{tVq<1wQSq;AJ9O=9k3YZkZcg*VO|8Ds9=w`05ZIM5ZP2_b^r*HAu7E>2dg;Q;4 ziUwUf^7bi+k)ZB&GUXW6(vbLYd_?i;dP+)@V7cR{<5yA1vcyb&Gif!~%_R2&l{+1q zh-^H-5D7DSky?T;Uz4TqSw0T_8NqJ+mT{suUq#AIp-rmToyERPfr=K-m$Adg1}?z~ zGf-kli=HAs%YI2I_s{Cits0!rekc@F$Q6ULKpTUQXqUWV-)FB8u@}!yg`_WSVS`A=?)(N~s}oEa(@_&8I!FVUi3yraGPa+?EqgcH<%<~2jWOj| z&5`@QXjSjYD(aWq4YT|Am$*dnP{{HUl;6~lAO})Rah8OrG8uJNe0wf2BL8M`Fj!9W zEc%u#gjJl3E!u3`$RaKl=`nW483dgpDdL3=S%aAkql=Z-+%7BR+Z{5&dK_N6y(_)0 z!xs-l5T%SKBC?sna|vjYg(4UUsId^o{laU;NVd6+IYiO*?Hfu%9h9DqO>&u~cQ8wb zl017~6R0t7n~7O+^<^tt86QKW86iA2Gwb9lI;#8VW*7N^X%V^X!}fJ%;CqjT zFL2o$?!@=0q{dwhu5MBZEZnC|ma+EFbveBVpzbPsGBX{x_v}kQJSEXl4|QF1g)-fW zNo?qeSxuE0NhP>9Tp75LH!iVe88l|C@+27jR@}W#Z+U^m**7uQ$G%}R&7m~-b^UjY z9VjI~bHhm60Pt6erEi{<^zezDvUIg;mRNg8Fh!YTf=^6dF2T)t6P>g}j9v?5oIUk0 zB#_qLBU1l7Hl`#Zwcaz<9U8{IyL)54(U)toAu>TS!3Pdy7Z@qaqjqD;3!Npc^JmyJ zIb-z(+grE^-iAmv)mtOIjg81BO-1zuub&C=s{@bE!=X%u|H{w$%1;m7K*9R;I2@e_wX`T(i0T|DR)-)c!}E%jDfE4U&N{R2R(3sAimWyB zk^T(`?_WP_WB(158+Tp<|H{gka3_XRNH0ivzvP$e;S?FiL)NMHcWdyVBJBo}gQ`!N zgubI9Fp5m3x0Gn<{OG&d#dogNs+Z@YL6g2eKmW=+Q+T45cx_j$#lHbJc{|-Jj*FNU?E$UGlEdg_xo>Y~@dvU{dz!DDi-h~|JC+$#?PAWL0WTcw;6Q7(Sp;u7^# zt_gPHHoP!%!XnM}gat-D19g(Lc(_>_7_3!?Lc?Ssakj1N+z7gZtP_JpVR7|-x1{2? zIt#&zZS@qs)>WfJ4b___*6~Wg$V8I6H>>!ZO{Y}^<<8RNWPKRfqeNvoud#h~hI_(I ziQ;WbWs9WgaBNAM!?;V49*j?nYlC9Nm~)>TSP&gf_E(WZ+WM{pZcWtIM(EtU>JP8c zHQAH%NYuU>Y(XY9uUMjf3Gt|83({)_oKPnKi_ z0z0KTur)4^NZcVJBlji*=0S7jN#aSWtVWx7U2p2XrbWFITqaKX<#pLDa~>OyVK>Uc zB*P&`1{>oN0&pA@zR!81pmdhaMWpt&P^?D#!Qir-<4%U3#Bno4j?nK8G+B{FYpW0a^Ewo!5**f8oWJU(M@1&n$@Z0)slRX*nY znOdH*-81&rE>fxb4m*!%ADj=z2Pa=32=b|K>@izF*6G*3%52b!r#&~ltVWMI@Q;YC)f?P4w39_%qS;@EFw@kT5AyQ-sZ zyeUM_a6FFBDEUR-yzhvr9WoN0OXPPX%3PYfF{p~v+2~kCX7HQo_3x5O23BX%OD;r; z3TmvBnC>m(KpeTm`7y_rp@{lQ?@`5e-%5E=bba@B&x>$TF=hejdm|-OtpPv!DWP%p zkt$9UJlsP$IizB<8-;Igd3@=%)4Xc*7gTU2LA@%k{tZ@ewGc|{l9xjFoPls?Mxea2 zV*5EPt!_RoHau;_YM@2aj(YKc@_3w&+*C&jE~-yrq~{2uCR@~sNO6)p&O2j@6`*fc zRQ00@5>FR63^B3NVNY_Ihu`L4!7SU=*(W$7L`bz6(36y+c_mLi68!Zj0WJzVf0FZs zy$v$jh6>egouL>fjchXejGs3SH80m`5ytde_(5{|MKOvAem6`E4NX9J;N(ZGgWo>Ps2PJy(Y>}KWi|h! z1!6hwnai11qFcAl5Wrz6MiZj)SbyMAQ$;b{EN?WEfWmSFbsy4n%@@9>8#=)q%ae|L z#cs1z^jjQIgOwcLPQ(lBkMH|0#A*vr-%THsivMwZ(+f*^u-NUF=@Y^=L{2QvnpDHx(c}#LsD3g;Uht(o;3MQ$Z(UF) zzIXN2hii6b1U*Tdum}rkc^}Va5I8|Pua&lqq}2l0Dnt^TKp^T@(CLOe40@E)ICKEm zW+dcHJDD!ruhJ0jz27Pp(sDUbi`&kp?u=z6H8Lhu7`~bbrOt4>)Ea!LtY6i|d1VOl z2RKsPZ{>GAQur~ma6jZUZb$CG#QW~%$7{~#Yj1h;mfO75^6y-EA5&4@mHZTYlm10= zLF?Ajn9anRwPaIAZQ0O5#Y}9%)}m$}X}m1GL$5sD=|y@gN3~^sPSafv$Cja2Sr2k! z`FWc&H9ngZ)0^O4_i@2o&NL0mlo9zMq;MyO6|u()y<0TX+tE{OB`*^*wp=8x=Z0DM zja2yE_!{hH${RY!#1y?Da7gg`Ouud`G@SoLS=Vx?&BJrdKJezP0z+A4H)_iaF-DC( z`-Go-4gE#_Gw&`&awH0%*j@6FIS^C&`nD)z7OrRZuC3^)qm&z`-8L?t8-~h8nNvRZ zL@MZaP?isoIG?sJkiHD{GMgH~Wgg3~?uHmCc9w3GmbuN^6o%-EQHV(-#C#1Nt;nAc zD~e-G1N0j&(!?cWvn!wK)5PYwJuH^0CsH%Ait^ti<_3?+XSnUD)()_j3G|8;#RQr_ zAjkpTy5OZspTDN`?+7EZ!kkA^u3(xkXLnnmC|7E3^t8!)g{!2w znaDVQ5aP@Bqm*|(@pp1u7!JcvwYGS>w6z$_)OTgHt0@W4Vj*GpN>o$yi;h&sWxzWn z@V%?z@btI+X(mBm5nNYSdYb6SnNMKBOYLeNKnF9n4En5|b}9<4bF3OlJsa>Mdg`(H@DIP-lWG7baR0TkoW<+sP(m_FSQf zz>1`Mr0{Q=Zm~6jL6fh@3gxn7weE^Yk3wC-Zgo|W>nzV0*Zo2dJlJX|IsG54~-=Ae}#dl;YX z2gM>GZ=-F6o{sgOHB!eq8k+Lj7JW6t`V<6)F{n8ccI9%Z}*A4ra2p*x}@t|2nOYmfe0i#S<))5CW9<$cwYlZVsPP-%o9oVrL4_|)S2v6VlR!grB&kK>Lv=rm*hY>?U@g;gWUHo? z)?!8^Ewet4mYdo1*EYDJx4Vq!!?R4*aj5TM7752k&FUshF~Xu7akrFy4Ew!pPrl4t zC~-4l?0sOBvQ58NyonFWz!*J}5DObd&hAME_A<%+bo;b&`$n6D;pClqyP*TO(UoP+ z?A2$J%XpoRY_HKsYzn#h_@N6dpH{PmioQ1tFah2%$t!IesGhI#?7VJ$)JYWYER08d z;QZ2B7kOQ{CZBd*9}0mk)Zr|^KtczC%Gi{9{OR4b+sRXcNg-66DaF3EHKJRs<``-F zl7rg3PAhfwE217;`ZaJEp~_M3mL$YfmY&aq`$0wGz6C!GR%OI$`CEJYR&piB+=~jn zA|Jac!(^z2T=@o4n-N#@1W~yVz$FK)ToG5bC1#FR%VL#d#ea_U@h;_6Ehm>WNzis< z7)3{_j0WEGNSah4E>a&TW;Dv}x?+2F3R;Ml@9^b1%x@14eX$H+rAAX1-3=^AIv;%P z-tSKDkB*1CC2;X!G55xVRcXW=PPx#s)$G1iW$5!|oX!x8x}@MeHkY+kg%t1??vT|O z4Gl*D%aoU1$v$~fLF3CZ5xX#A)z$=`)DLIBk!wVK;4zIIoT(UMwnOCWk5i%I_$iwd zX!?sUF%*XRr#^PDXK5Sg9+hQj`WoV;dJlB{dJ3$7^H2V=fUB_kIJm#if7a2(UYnUYY)BAp5_A!!cKL@AQLTP^k=W`Ja)Xl#E{eTBDLmPL4Zd*U`tn*Y@ zTEMLae>#F~TeH!!WbFc>rSC`v zN8)L-Z@ep$ttH{3&^94WyWewhIjf_ogarIfn9P$b zqr}+SXE#R1>(VZP1|fkM^&z@3u)H;pY+$=Rk0p02e2|BPCivjKFSkVf}d}%lte2}hsKT|EwBAn1-ui9qX?XZ*r z(Ht*ON}g7aHIkh)mJH=;pMc#I~vAUC#Ww| zDT}i*Ov90Q1#R+cMRMCL79VS9xZb53^;=}FGw_sRIRg@RZ+)jVyf-EtGx3ImYL(Hj zHA`bdZj_VF9%SrEcm6mr8wgn#t%(dLxwn$h>o6qh%E6geoyE>Peg;n!n#4B7~*hni#*?^*oXOzzcNqzA(oRqno!4 zwhh>;G+L~_Abl(ZGShVhh{H}7!4g}I~ufW7=Ki+fu7l(e!o0Ez{%uoCM=$pNv9s}O473(#- zHRLS^<8R4a$s{)@o^KAgSj`MaLUXPjOYcNqB99C$CllNX&9iXO1+zGO;-kRt>(G(e%z1_zd zw(?LqiK``3{4{?X+Z# z9@lNQ2eq+O2=l7%Zb^I=Kzw8|iL+F=TW>L360m5fqewZ@mo2M&m3!{ebjWC+`wB0Qvb^W~macVe4Q#;A`YeKal70&~Av^ytr=bT9H zwwkp_R(E^{kujWb$$>&)y&YRDAx6??dh@)NwU)h;MfRma!QB$0Y&={EYh9cW{y1G8 z0-WDvLEOvf04FNYkKmtN051p(a)W0;F)P6(P>g}q7bH}XHWz9TUa2|6`_no z#)$Be+aoeF^Qws>4Dvsj1RuZjgFWWd85$gx^C_v+N5up|1)T7%I8mo{vIwDaL;{+pGhO@aW`cfCRVU6=EC!lk)aNMbZlEISUx$^-D)#Ly2PmV5D%;3g(QR|= zp35xDhGwJD-5%>$%F0c?lEYk_?qz~AhE$$0y(u~Y5i#r!Ai)&4FFPtHdo+rr0^G_$ zlgoPAQvdVV10YLdGKreD_`+pU(OC2=u56QSz8PU zhV@>u?X1)Irntm9U8iM43SxM~j;LB;7bHFCXxQU_@y)xYl8E?FL=&InN)<&2Cj$`S z7n7BXO@QKU#i2!>AEUS0ug-*zx0s`a)0}(zF`Z$u`tjq+X3u;v;-Rd8pbEtKNc5db!Tewi@8 z>$+(t&6T6q9&J`n?%-yBRq2TpK4?zA%ZL!b?pm}QsV8X4{o`8*_XJGfD6-Y}qu0-s zBEkDDiXD%li}JslKgz{ZR;2O_Nk-haOmJT)1|1%?Z@~ET{-lL<{A&I7*Ws^|pF=A( z^#<>Indig_ZWH7z?PLoyz&*ijHz!3T@6ndU@^2veeoajlQ;&Y-idvLiw}fnSfzHzm z#jNx!i{T*H&mDR8r0%xpak0(;qkdOhIAI@TUH6~D1hum87tSvT`(?zHk>%qLkIv|I zwnU{c z5_A$O$gY41DGtIQMw>+j-sO|x$iSehjr8?j#qJ2Zk3*f2+}}cNIOjIx_K;J-81-Q7 zj(&Y@T|!UwD={l-|13(!ceX^|H;i6gq$4{J#a-lv|N4RoQ&&cX>pu5Rl~rN!_A z#iCf@4SG&jnv=(%^od1Fv)$%qpRDsvI(M-vK}1cloZ#^oI2{i(E&~TwWadv=7)zNP zyO@GSQhG$OF=Me9W0~oHd73EX0Wq8ZuDIDPfqm=4EBag+W8m>}jx3iS=y9`;<-hi9 zg^!Ql^8M`_{eJIx?XT>=Pz>M;sS!<>_M@MO4Nad87LjGX1=e<{3Nz2-51rr(z&epq zOk6F*?Ze_6>bv>Y`(sm-Qrv{Mt}B>WE3ne`j&<0-mlP~MG-09y-COOrw^Zb`ZI+DQ zs#_Niw#7BeJM@gsJxvpOCp5{*@rAraJR=sfq&0fSk5R2wAv|r^0%QUUS7r)dmJlB6 z^n^*aZ`9%K=ty{Gh#np@g+^!Pg4*9{T?JQP=SmSyyh{AHEh%&qrvTp$v~$gvv&v1$ zqiu>bW9ltWoo(jAF=ecO8q2$dF@JcqZuCeT-0k^#UWtk}_fS)6;A-skO8TfoeHUVs z)4T}zhjCSX3fg5h+EofKh?BrH+-ap8PaT0m^Pg$;xROg|UC*a?@Ky8Z9=iJd?zH>5 zP?=L&rvcq3IdPZLkm;5O=n#%6r_H2uNThZ@5~4ZWKQ z<6Y_|EfcFIr`xcO3M7Ug?^`jQuw`@VFs04vM_Ipv&d*T z^x4uR8DaH(hgsUKz?TD>Sy7$p)J#bb3oV`K=78|#LPYCE2Imtnbowf$+cfZ2v2gJskg-9DM zE{h`y_=M2R{1BrND#Q6)gytc+c;M6ZDCC2`gii*xq(5^%cxF^h^JfA72ZN&}2l@ReApxKlMZAXFWYqwcdS zxHri1Vm-|h`2Hh&(7KgMR_>PrOVS)5TE8rK>~8LpKW3ISpjQSGF)#%o08%z&bn|J4 zEJvXVzPmQ#rT)QikS-~6$$OO-jn%$GQtkd)(4N2#-z9u=d)TOu zB;w#z*w{>776pMtRk+9Zaehs0wgq58d2b~vT0~oe_c8K`Sag$j()Gcd*VsfwxPQ|j zC(*{jjAepe_(ndpRyf>ZLVyU6{{}RO^fiCkE3mTKAHGS?hz?79&p1@1yzrek!A<%? zPRyJuQO-Jnp+Y@|KT{+;7WjxrbwEaOT=$_#b8mhqNc8KR_g&T-EvZs6>Y^@wB$_cM z=*lcaH06`592_k|4Xj0@P~e;Q>$r2>?buG1y>8f~3ns<6h|+k(R|TXqm}()MuCNgz zLQ|Ycjv9e|005Yas7I)pkd-9$!(JG%Ak48eSSFRLR2Yf|lNN;46;AVqXjf@mN$JP*{lsrJEMu^ER_vFt1SK@H=;mQUiP-~s!QK*4e|O}e{?pXlrgomE z5>^TJ?JsV%XNJ=xxD|QRnW)^&pC+Z`%@StWP>!$?h>Y8xOHjMkQE`=ggLsXM9~QIp zW&!@daO!zRTIejbkSO`>-5{<=ZBi}+%_=fP(S`{K86EHhnH7d>vKeP)~)wvgL4e(*g$-fKbE z2-?y28(@o16Ez6e&0|!5&m*`3R24HthigE}uZK!=xp`?Btt7!AVYSzs@EaT(>2b*E z7Q0mi@g;5%lBmcu{2jJ;B(|rLb3C^>Z>?vyEGXXX?si9vTFt9`dCEhP5vJ2%ldlLO zl_&vlidOpSBE9QBnsF)TjB7NmER!XRIkVb2pY}%UCYf_>EXKU(&6j~e#Q~^jQFFME z0$VZpLNPZcCUWK~E724KXK5KssyVJbdHG(DS0Ychjz&sb)?OlrNrRb`P{q)jhP}Ge zuN?jC&D7##{Z7BskL$cjvEm0puF7UtWjC2EP049g1wJV?dzpm1io5SFlkxO{>#~i^wi`M`#|7n5m@d@{ zD{+zC13{#;MUsRS2&oKnOmx423HyW7@Rt{vG}avFfz5NlO0EOwqBOmhJMKGt+(Ywu{fbw5;3p zn|>^)X-Vt>QN`F24NVDjVGj)E?vCxl(gAefE2)l!AZ1uxGh z$nbr9vP1uGNAjB5L2#?%adX@7nF zrj9_@&2$iG$UJhOgG5(ga)nRX+@%67S z7Pk*XC|>VQ=?O4?pZ-7Cd+(q&mu7EJh>Xb@lamn9h@4F{!6GAq$ z8BE4tG9uW3$--o8q761+gYj9;`_*1^s?NLL?%loheRu0rJ%7xUq!~RuJ>5M$-M_Zd z=9;$FHK|2$c9M|@RA#I9s}K1pxXNdfk=KM^spza2&M5^5SZJsF9x;8_-cj0s>;|XM zomme~oSD?GpS$Ya*LvpqMIVf4aqfA}{0rtHyjG(gSXDqPFgu@p zlX#P$lDu$mWg)TGR*8Xh$?^z_@Yz32-_@u%MAdsQ$b2Lt>M4#ESv{itmkO#YiD3@w z&mTRb!a#)?;GL{Vr&;s5vVMYHp;=Bzi zC{ziOwTBxrNhh}l6T8m4UbgA!kX#7IFMejLaZ%h6T>-MwCnz9Zsm*;hF>qKX%A1y? z!KvDNmeXz2;Tvsp!v^F*T6pki=E!l_Lm`2b*NaWbBe{~9~>2YU#~uW7CIb#wEap7;-=T)$`? zu7qXm&K?BP)qHoZ`ShO9{orL&4{XmQxkxuZpyJ4t!as}klirWKvECz(hRwEy65Tyl zmdhq&U)0L$#9NI}bxk{LW;=F8AwF6iGIDB=;~^8N`Oo10NwOG>X&z)~kx#`o8Ef-9 z;YG=(n!|mslpdz)Ze0g-3| z-x@SiZAU^{ew%D2vcW zK54u9sM4i~AWCB4S3^ZL?a`He;g5>_{`r#LhZ;l%?74j&PA@4XzpZ!})m(zcPp$jZ z8#pFED1Elhcuw#t`2I^lf2!Uj*iVu9Zw}97?62H}pMBPx3tzyo3qR3rOBBYXh zCHA~Mdgtu(4NA`3U@7>0vrQ)*s(9hMLzT(MWV>5*7(^aR8pmPro zVL^u!b-o7uJ=50c+LBL;ZS_);&q!6}yqv#~`cRo0Q(Pc8oCep$K~Faq;1L@^JFn6 zIZwPOp&C-$NhUWWWAfjtpg;iAN!&qJ2V>OhQnTFCm4|`Pl;#dq0 zeWywFazhL8^^tW-lx}zo4rg|M5f|_OLJZ0s*+1+WOPoZ!-@zW57v+i{GMW%*4e}FC%ja#zWSipN-i& zLd$m4?>{1Si*ao#s2V3?+HFF&<^m{cq~aCBx!^!sycVS2HH}nVmd%QXXe4rt zh3`0zolLGZ;3*mebG1y7Ol1^ssY@sf1!8S%pf;n0-&W1bRtpV$UlX7f-SAH>D6b0m z6^gNmcrerc&b{G?NV92?f4$aM%l(po1w2p*LgYAiw5s~daJY`h@xHoxhN+f_& z4NbQ&;|^cu|K`8yIxxG*@9rITtgg9*cDciycUZi7HVk&BduQb8)_*2ae)pdv-K(L8 zrRW@XKb`%I&f3&}p3O!$Ei2={WjNz~h{^yMBWqZ#N$Wu@1iT$j;y=IInfA1@?uz&7PO0zXIywc!ECxT zvZO>>1U@6`pstZ`A!5$c*t}&|eHQm}aKlxi4rlrZ_(~wXCo74@>FiegZdWaKe$0;j9f{xaXR8MR}WEL>|>PmlC23qp_Gfn&O$%*n9ZacSF!BcPr)6Ju>X$czoX%`F56!R zw0R9%nr5A-j2*iMw)xlCtST8_d_l$*Ao`c%#wC?RVnh98M?{9ia66#V3MR|;jt@j8 z)J?28^Uk^}+dj#p$GQ>`ST?Xkcw!8$W~8VndlACKI&cT*YyhOEN!Qrli2k0){?;B? zYSu1R*2W^xdUHv-xn_5F zh=4M+F$|YIz>UD@1St*8|@fO zVYw{|Oc^9u892)cv}lvk;meWXV!*wSI&=fTht13jcjVC>0aTNChSez;^b6LsvgDV6 zUCSGodgPTnmP3G+)S1O2)*%7#EH3y|4nwo5^uUF(-C}nWzB!uLsP|}X;~f(95=1}} zL(@uPA)Hbx-YXuw8JuW3johWIs6c*d#cnVTnCr+Y21I8fxAz0a%+jyolbCf8%;RO|4CN?(n3S|0uDahF^zw-Hw?L~ zY2cr;khWrTInDP|GNsr>$f7hmGNrmwg&J9krB(IXp(#~SOG}S$3y23`1Bo4B#oE5G za$uN63i{N7iWoR42NdrM>#LskVeQ&&;^h@{)hKHhS7S+xpr97O?2#Qjc{*9yhsCJB z)jKuZ6|1=(-`*HreeQf2zwBRQCw%>pB}avuuf~I3;Y$jj3^l;o2*5ta)cQwt-P)V~ zdnn^f%+pGo-pmd+McVgx+7d-h9}3Ui04N`320=SrYFP=m27pDMAym6h+ zxE>~SrIm!vM~ zoNbsdMkE}fdDz!4e$d>4mjPVZ)tUHXh~a3u4H(}f9i#9bp`HAC3!1TWIAZ(;mSgU_ z0SbRE!}zM%g-et{RiUazA?Ih6;S0SG^fcE#Ox?F{}`$uZ(?On^;?KNYsV(*^o+lyL|oD z8AAO7Kqh(kmq?Dh+=}CL3V(an!`456Rqk~6_NuOJhRvR+TpeTTXK>x=ig#9rEJF-3 z(`35;#A)gL-PLe$c-aPp?Up9jzk}K9)c@|z-5L3xiT-D#b4(L%sGv)&Tx~Kc$+W|;6MIG?wH2%Ex1-v8xg)|C|w#~p+El? zry8rbxIYgGKk@=3%;|bv9&$}^k4QS%gu69-dMYZcxeDSsn^j)4pPJIW7?0~|O+8;B zB8PPrFgu%w;@Wn<+NPFowOaUY&!k&z9{r)dLT6!B=2lQxAg_sCpAhyAs zrFuPX+*O2*Q-A3tCL;1fv&pE^mgc1$O05e_h4L~V8iGtrSrhrL?oPT{RtE9V=F zxsRLIu^rniTyZQjQXRzR6g$qKL%|Z0v;z}<+<09mhZ>ac{X|((9!Hm7qL=u3^!8G<>+pj6gxtQ}eBFoMeB=A_{SI8N}{7D(Ee$@Wwql6NBjvbY^^Z=A6cY2E|0^IZqz zPObBU964iE+X}HW`HQbUy7e~XZpA7zm|~M@s#W8}a5K#az->{3`rdyt`(&F>#yO3T zy)3_8_*kt^X~y2wBUw8GonTauJp;uAX{%nm8;?~E8&ayNYy95C(ugOTa#^_eRWdh^G*KLO;z}FTSg0kzEgaKvwnalF`!qTe&)^&^8773!Yv0m zP3ul?t0G**q$d=(^vB3Ja&SfDHCL)nbWNu)lN#;;&~anrqxP=Q9oD#De?Q8f5Pf$B zy(^HaXUj}}%cqLpTl!y!f4{qTcQ{_%KNH=`^8Xy^)aoDB$w*!I_4Gm7Iqxjjd@*Zt zLP!-)<9JqLos2Edz4oO?c&qNjH~^JZR0G#N8DHe7%S$36j==%v@882C9=tCD|JB0z z%l$8`@UM80YOOEM4F{k5UR>^u!SqAbhD;WPysPL)NimJAYYRmk<~wC4x=s37^wPjF zfNa@vh9)4Q43fak3AK1n6tG){p)p6h$_`cZQ#&~{685-JWZevuod6Uz7}thvN)XMHhtlG_Oasq zTeGJ1%z8W}F4wm_qsvn{+t_9~8vb@N(@t-xCB7k@4xeX9%ar`{rT+~`VBQjx?mkor z^S~@Xg2WW@{HgcdgTkHv034Vjd(R|TFas3huUq-JEc`5$N&=uSzODKP^ zASf;P%f4Es1&@MLZOa=`i@6`5xHQ8#uFAH*8ts^o@8u}~OxiKc#1xbpG!v{5$TaKaKV~-8e;Mt6d!*O;(`f&1I?=%1JkWwmY>@ih4%mgwIdz?0 z*ZT$&eITX#xNp{i=ooL6C;s@=`teNt7HR-RJi_A9_!(c$sGX4tR0WkIy-kHvz;i(O zh~grpI9Os+MB;9d==HXYL8fQ34J;6X2;?W63Xm-`Cx;Nky{eNb1{~&)ij7xWYz2gg zk!~>ePD8}?n5CqCI}H9MK7V)bxQ#0R#G3tk@8qAF=kMKI|599}#r{M|P;eN{otcS5?7 znvG$?wHcev5@{1w&Or<+gl7Y!XAT?8p5E(4oV>iO+OQ*l`T3JmL7ok^ zwQh%tM=DJ`$kxEL^4)jsl5iFWydZ2sRl%72a#8?7jRot{am~x*U8Ze2r>{vva1w|j z_wBma&U6J^m?ByJPc}428yM$Ei-fTet5f1ri*C0dI`lTqkLK~%BU;v>u_m9ZS+C+s zQR(jS40k0(Oq&=3B^PW+3?OF?{4zqd1A2_oOncY*K>y_UN4lwl^=g{T4lBOjdFWm# z3~i^kTHPR8!?M3>#D?4{v>(S49w%#+)|C6PsZ^W3{!7P$RgDF>t>-lI`WEyh)0y_c z7*~j}X|-ZrRzw*YHpzP?7bXDhi8CC-@vZ01;r*#D-Wq}37g)MfVH2W}E_Mg`^x#z4 z(FZhYY?>AjpKXXQ34mb8r&30@*La;;1|+lEat8c-o5&8^35V5+w@rkBRYWC5l!S9{ zFZ=OwCM^^Rnb10-255iLR3;0m4?3Y12%3De7lxp#dq`DdQujwZdA6);LXRU?aOvc9 zi~50RO}$^xNWjN}=2k2P^S?wvOLH_pYs!)7jKBiST%sMrjIN?FruLtLc*VE1TLOCD z@n-{M717-qgxU;SHa_ld*wS-Fk2$S&2OX&Z!yXxG_9tzyxadaYThU39M=`}j6YD+I zq@3TQ(GE)YeWH{4;DMyp+2=Q_3gx^e4?tBjHdPTKm@^IpV^*#mZo#zr$>}`8^L+w> z<=oJAU*DQDA!DB=0nA-9#?&oNIw>)>B1*33#|+5WxgAQZCxqY)F|Up>rk!hb?VwtDbBX52sz zb7;lh95F@h6BmbDxM_EsU?rhsRa!kYrwFBEM<)?V(7Fw{d;X)K=X%2C^B;f~wEYZ- zU>Jy%>Vvt=io4*f&zaBhI!lkj)}ziRGMK(N=p`T}G?q%OO-P3x(-GsMS)R3o;iA0Y zA&694!I>rP3^V5$_j8aCbVwkV5)?uAZu4sq8n7@$Wy}&lN6>u-#jLViKWOqO4$MSqEhk2!wNOW5s<;A1P>%whKVkgkNC`T$-Iy9&D) z;GC|Q_P8tFH}X0X1DAtCdKMkD_raAwON z7tJgyDs0K)tY9P#bfyitPkHRJJK##r{L*+juNbiQCY7H?fhwX$UK^sQh;9iW;p|=c z=xJ!cCj2ta`YAigNPo9Z*n=gMUR+QRl!Eb+1?KPZCAI1an|xMqze?L?JFa5T6W=Ck zqaO?sYFp89Z6!IaJ}W@ELEpqM_pBB?2QJ{gH;y%+yg2_Q@R2|e7XZ(SRePd_{LC6# zY0%-(yUdW|w2QS-x<^bQrh}zPKGV54!GWvo2a(Y`7dV->CNOFaX!?R4$rjyF0Ykfuv38f>?1sB_e zPGYXGD!M>5mn54U@=CC`9{-u;kQ}FMg&(T__``IWj=`_{P?jVI4H6bA;JtYSKG5P*iRw$f!N;Yfb<2_YCujt>$?2_@qBDm&&S>fR! z!MS~+&UUx$8^bksDyZ&Om)qKez);S0R4mhssG0;!M7}AsQ>B@S3u{A{OH1TUM?^{j z`%W!+0o#jVkM>sgpC#c1+AW=)k_9Q^Y1-MT%X+3T+6;9%ophRur-PW<|*u>^-M|MgwQ(;;{}yXLYyo+xZF*^$_mf1pi~L6a1{7f z+{z@FIKOv0g~>{~SZp@&zKTlW)Lbi|*n&LOWCs%AvxIJO*%fWsu*$gSWQ2GE+8XLR z-j5v4bdhRbhl z(mk4y68t1=@AO7o7lPp$)_~-hZ_Z}a)#64?ChM3YgOfoH(v?^$WA&FIyA;gI zG5we%hs2ey_1amt`69RN7}rP^j_VV=OVgZ+6q^oYB~`Q9-Md+U7JB}Cz%N|7@FSgQ zlJMukr6pTS>28Zo)_cCV?8iPNkaU8id1aA9Bg*|oL%)u83UP(FqW1gBy6~M_FvG7k zrb3&OH;r?Pq=sQ5sXj#r)A@Glt_uDWka%wSZOzCJ!W|3AVSPJE(zoT}njT&$)`$xS zE&HIp@iw@vxkJ(}X)@U)Ig-hg?9t2KAW4APvM`9hJPx8eX=L4D_w|s{-YjeHLtonk z_r~I<%`#Ig`(hpMN5qr#py0Bnrp<~RR9*MVPY6i!6^@D3XZsm{TEis%YO{9cA#QUn zDo0@NYZ<^jQ_dQ!7~!DGVR63``3?2lVb#M|w5P?P=?sQd9#)>oG(Nn+5Rpm?0mpk` z>Ni=E&X9IPUcTMKVOqZE#thpr1stZTMO8~y&-|$cRbkvlgscx5@hhFe8_4N%De>Mj z>Ekokv6nnSWt0BL7rTC9{*0DeJKuv(3_^%n_Nynlw^kjkxYL3=U~n}yyEo%xA|IdO zoS`gq0krNMh5$IxvfRtEX9lmIwlwVtDS*~$73GP<^+tRm`w`?Q?sT4A)CD_tJ#3Ki9_-@ z#xewqn8B)I4CC=X+O5i)hCraY!p583&K0U`#^uUL-&V0b^yGhE21 z@U3$|u4;5XYQ}asDm*7QX|eB8R9_hvBS*@=P*UvIfQV}`)mi{90TP56(d`_IFIiu~ zBHZ4vQIWsXHXxYiF1=gKdRnU z#%tpz(G^wd09OyA$Htzd$3PXFXaP7;>uMjxc%2Q&cogD~HZ@uRX<*ETW z4O`_btLU3Jra%?(LV#aNZExW;NROO)PO2@pE3(^TU(G+qITP-A+1}}UW(`-e$p@C=!+VYweAcXQdGvP?$%cn*hY;DK351*$ zR1Cp%q!;ZGJLE$af<0eE(o)BrIKq{sezS0lRi&Kp-VkW=h(ym{&JD^FS^sOjeX*EhGrh1=E1(QSx%URqT)kz{QTa{9%dyV1{ zC7i#qB#@7Kmi;o4Pb@!F2rr5&nKEE_Rc=j}M2OJmF#l8c=7al*2qqfdetco23z;HRE4|UhS{xv%eUtf!EEV;z_VvQ+!9M`6g?0aeDTAqxD8rVqf_7V4 zIfJb34YHWj7N>Ra9tJ5XCu=KC^oGQ7=xuQ2!=00w=4A#uh$}<}UpbSk&V^0m1cmz12?MoM& z6Vq;#*uBYCld861DMVF)U4+I$v_uLIl>?&MveyY~mG$e!l%Z>tGf#sEFdK1c!_yhv z+(+1V6p5~B&yU-wU^ZlLDFLhXd>M%X`Z(hy#3`aN9_NDM;T#~yJZdK#dBOKasc%gFqz+zdj z`-NfzhV5|DNxZ|Toyd>f)C@Zq5TXxMp1>>9ev1~PKpU$|qoIdxE4s~@fQ61@S@?=R z`ouW&MfW}ThbFU{%t}Li~Kja|Zy>ks8XzPvwr*AQ-G^xu|(b-e$BE7p%1p8- zpY$;hSthd0)7E(?#jaX@cL^zF=S7I2%9?{NLgVjtH6-#pQ5aFIz!ac!{CLteyCNggdi0#ATU1=qntP zS-ZI7YD0xo9fqIl2rgO%+80}=Y}}*kf7xNVwS?j5(RW6W7hh+P_3B0@LW&y=TGM4% z&X0x=SCJ1@`7?b4qJ{~^iAmPd+kMsN{jIq7>9%3@RCiAx;c!Gv$2q0-aYP`KCDW1B zEy1+~X#^^D-LfSnhR}5gOsol@Yv0d5wks|BqxC>_Dx4A?BKc2bv|$z;eEH8nw@w{s zE^SI)CupF0WOF^-;>aqSP)l6djo*bLu7j`go*`>gfMQ*Ueu_M23NF68(d+QC7V*(qT>A=`})-#+2M%s;U7cdzMOQ zFi=H~fxi(?E-ozAUo_M1rPn*2TWc47|8hstK0o0)Iw<)XvYuV$u*@tLHQ=W1`*aE0 zZ4-RcN)vebV99U!D9Cj3O5KQ4o~uP=$xnHX2%#k1snnYj$5o3<4wV%smSv*eMHATr zFha4k8(p$aNivU-ALRU(GB{Xo@}nVCHo39o-hiJ{048r0ZKfDncZT|+m8V{P-f`yy ztm%BTPj<4}`5a*g!KYvNAK2+9`OFMPLcKWJ1Xmhry?KbB9K@J_1>1G zQY$Uh@H{tT^vuTm$DOJWj}QtxEeQO!(n7=`z!UfST7Jeq%dK}+7^}y5FHekARwAg! z>AFg{ddizv1v^D+j7GlnOTP|#XLJUX9F6$ovBzd~xAXUj@^$}XcTWP6pz#ps_*o^F ztT@qt8#d*8w+b`)7)F#>?YAT1Iq)kPGxiO#2bol}eC8qY!84LB{ zTbrqwtNR(LiSFs?)NX$3jvgUaJh<4NbA)|^embsb0E-O!_7nvKJ}kvtbw!<&8_A6Y zsxABsEiQdLPM05Es4lD|Jqf_Nq=5SJ?OwL6yAk6=oX=*8&f5-pqcVFBdZb>(6TT_= zWGwN-maIeR>vm;o(r|OX0(o`0B&|ycrm{d{h1j7yw1yZ>t83Zpb@@2ZcUtZH|_!uU}u-oMxlu);wP%oM#^@y)ISK-Bb z#}vP5?d~j-j#u=Nife3U05Xt^RwTdom%Ij-*Y1VOa$d{C+3KCO9OCpX2-*j><8KF= zozL(Z8>F49IU5#ZIK2@ZmSDKws=TJ1THk(EeSJ|3yo^y_( zJGZXqp}ml);n=e!Yt`akE5Y_1YN|RUUkj8#aSXCmLXXpS)KUqRVst`%w1$`7TyJH0 zikcNy2w()Me|e^S(F|SZ_LJo$E|n~nAS5KjV__z?==&3(-#PokYEvfM92*r3+ znLEAM^ao&I;`-@LwLe9OaK$0xp{klrWz)av8QqpNx_!bK-Jql&B7((AI0)w~LQ(XT zTiIX_geU`v)-cCR$Mp!{;L3p~STB`UZN7tQgmnCMmuc}l2pw`CkVPC*Emc?#WRWMa zTv9RjXC)qxJFGtbishI)ozpHaj0;G&sZkI%le6Qj)kUaT(F|Y;Q~}`0J+frj%O=H{ zcw;FYMKpH&8ZS`9mvpO9vDZ&d)|A^#kyUuRY&mo}Kh)#|%Al{OIXEL84;6=j%5)*` zdLd-9?IyW#q3~|!LxY|78vdDhs&&I`Y4vF;aBcF`XNy@z6QN`Xyc{*mhrI)yZpY?9 z4_+$pPiPEgF{sPs5-0$Z7W~HNv~O)OMGc=ry0NZ5Ez2ZX0b@9I0Ft%TCcywC4qWOo zQGLu!g=w$K?@%HpN*D)Itm~LQ&J##65ZGd&3k8HX%d>6pyO`VMK`7?z)cRh8%p76J zoRHZw@F@{zkY(o+Q6@tNmf<7NZhvjJ;59Lo(XVUGmPH}4Q-TnD!aLU$jw4qwvs zw@nmDKk6&aY&`gQ$A)$7R%BKLc;oD5trY zQ==mK%H0nlsd6MQJw%nq@V6~VRLRH^_G}r#Tj=Es0cDy9G>mBwQw+I6gPXz6)X~06 zeU3i>DjBX6qrpF?DlRqGR=s}qGL{DCCs#~zglq)0C)W0a=T-;^o-G-~j_s+yaho}i zluI5sxDgXH{8#7*Ed{G+TwQ_*Q}@3nQ!fe@-lBI+{Ro(yG!XHQ_jgpd#fkpjcATl^ zo<7!pySb-t*gJ(x@ya2iE3`33sD2Ag7bar77fVa)ERT#01XBZpyS#n3#g#9~I2tF| zjPAidf#luKN+Ag!ZONI{vOp|)V{+hB0rD4BYJ@_2E*3uwc0Z@KC^vt_-f?;G>-g-~ z-0<+&S>UNh;PaEy&+|7KrolFAS)g2}1h)kW4_;PAmyzk>u7b&uN0=CxU#Rh!EJWFq z$Tk35s6PP8TE{MB7!z8l<526Sa18;a?RF0y{3#IRv9#C=D$aU#257OK?2zKnE(L@P zjUO$Eb|H&|EM*0C;Z^qasTv#J8qrheX3;oPzLkctn9~Pool+LBh)5%5fm^WPeznTD zNJ0`(+1c=TSA5l=VLPL|qKr_FF*%Jgwi6{xaSHq$RE?gNDw>O}tn^?dXNINbMFwOD zj?M4%ePMiZj@myl`V6SGXv`fZ@n|c*lgyAraG|=iF{j0=U%H7jquWb`-Bf`3MNlDi zIlH$hSUmIi72n=sI9OMKByO&SI9gKDgHUOZ%Dy=yEjl&eGn_{7AxmtZ4jS^h>b9;5 zAOe@qe9m;!Q}gk_vPe+L$ZnU-j_HdlTrO^YkF}~r7}bLrtqQ{lw747Ig~62*e%f=!M93|6w-y33{;Vc;v%3My4e5>>=+C+Cf3XN z=Ffo-9v`kW?sw5HwQZNZJ#taVltS)EOyD`hz}@df5)C-_qt`SzG|q-coj^H);+oyE zKNGJ_vXN<3w|nynrERT{3~*&?r#+xBvWlBdY6%CWY7W5sg(=CAm|MkW9c>2_vtQrx zis1DtceHPfE#t-vFV{EFs!~?Cz!Lue0Cc%iDDI6{y&fX+y~SIUQzMifc=CJwOQFoN7BRuQAE*N|tTkMsM*()bYbt)a9Q zc@8sUuZ^RVw)5)u^&&mew2~5;bW)&Ix*RQWk^HfK2ra0~Vi~re4N4s>PCDOBH$G8E zhW2!P^p!S(EK7;2SReJ&Z#-3nJI9@bP>!GJC?!@5pEhf`oJZVyne>e8jDTVFU3Z6S zsaq$xyrCXMjG>M$HL}(3Kcq_jtyCdQEV~V50p8Uq8Gi*+{qx}a7o_1^bk)1H>{@SY zuK&kF_PAY4r2Ryd_Q~qVWyaA7E(S`2;e*RN-FVK4ksNZt3LFn)j`Z8HcFYXmmzWfB z#qXz|g(VY-ed!YX)Q}>X_EJ3rV`f&h{UY=7{uvQ6RS%*$UYa|=hAISs0a$w|u!M;qC9BZS-b#~- zXZUNc*9<&nio_OIO5Q;MdawbLAba9MtJnlL0Ks5zdjqY>W!SppBk9a%O>`2TtY;En zcJ~&ExW0qiQdpdF>XYq;A+^#cjR*A_1#hlWx){YD$s^O%v7B9fs+v_FyXP~Lr#XE} zBu`?s%Gk)z76@wk0LI=WN5{qX%+K3huZVwz6m@6f5ee*R<;hlQ;+j&il=3{M@Q76$ zMdQ@v0J-$WIfq9;ncvfsW@?SZe?VF*3a~eqeTWrT;yruZPQyY5CmP~~|E$CYgtl+q zq@rDMKdo1?j{iD=I(D6!SUGccUZRWS5G%Ux>EBA+WLndz<%5bz-xW5crqEo$d^6~o zzonDk?dCoICy)Hc^Vi$&yMa~zZ*7%tl^BoJsoSLRS^Op*aq&72T4Lsju;5{>+l{Kc zfvKf2C9X#@jx&?ktC;HZgb(lJF_T&`JR-17;NpRcY7OtMbDA@21eD*}0MRdxy)Uv9B-HhX37g_9wju&7+m`pXpOS z%4Ec4(0?RMm+YDTK_I=acc(eG7C3L4tX=a#l65+mn}SPnnjYlq|KjX^;B3{MW<}R! z^#ntSL647e{*^wLo^QSc^yI7Lj?iV9?w#iUc!fs|en-jT-)i+LKZ|+gtnK-Z*?(56 z_}wfoIQ&q<6Od?jy3F9YZ&;=M!EIl#d-8M2+=mQ}-%WMt#a?~G^ZUKq%~Bs{n{-Ng zHfNvu=BzVU^m66@ZsrCy1k^Si2>-7nnUmw(sz?XU3_^O_5vLqzF9L z_hxmImP=(|>XF+MYSrj(D%9?FXSuN#+7j4rbsrGJ9^i%3N7g?YaQjuXvyJX{K=iX( zIPaCzX~Ic%%+)sMeBHrbKI_lPU+=1y7WV7zf!13mn_xn0x+N?i>STV9i|3RDEY_wPQ`W|A$EOVe(<2Zwj9gcp{k!EnjK3@^-*D%Q2j< z#xx#SKKpr;i5(YQ80Rp`2E(WQLSZHdAdVL2B$;(@A;9?sl51J04jGur;EK(=PS7U4 zpL=JLYDcg-g@%;QBge-YJM>(Z67gMgsFiBE!EZ6yGb}8^uon;2cFj|TIM!%?N96lNgAginz z%enV0|0Aaw@YdzvUB;ae^82s-Ad?TC=^HE^E!Fad{V)H7JBv4`u%sf1OpZK$$eUb@ zyo~6OgrN{G%lL$L$7v}^sXdFe#$&d9r*4Q%7eH<d^Q)CCu=0V!@V z=}Ar5S!}>gI*20r#y{Z;Ffko6xb}II`g{c%5SIoOx}|LrHz?$5-8Hipa^LrVsYy&V zZ8SPvf1@#3;BkD$Dqu3KaY$_=_GS%@ST+Wm0nninuO$ z9<7?JQt{6xcWDszHPwU1Hix=I#1ZuCV~B!iM1+e6{pzJ1bEE(Xgm|e}{uYUuID&K9 zle~!y<4pj9PrUMd6A0b$VwN+PUG-%fT;Lrh?FG+X27 z)#OHgZpppydP@1CfZjO|h%HJYyz+S^x5FKV(1JM_2w?hFKfZ+tk1ejfm!3t?1*caT z^e}zCdgS}}nyHliQ@JBXtC2a_!S+POd10`0X<#<}=d z4t{Yor-~LC^$0y2Ad^Z`m}xJ0&=mFS^YQ12l`{6Cd7(Hqd*qPhN--oCuZ#;eBl(zq z#oZv>`Za+BhrM;T2GI;iphzC%B4G z=-@O7jxT$t40_VGTkrTBxP(vAZk@~_g=m8)RTb+(;oiEY3c}?6^5p$2itoja7ignR zEnfTl0Z>%_12EgD9G3U|4*)N=t4^o>X7UX^<%moeGEK~py1~%|iKneYvh*$uu+xvV zj&hn(Ku8Y;j)1W?+ionM2=cUFfp@ZCHTXtWVld23OqBv^KTB1OqK$`t0PLo@zibAPTYAVYGC<#1b($PPiwu z#qI5%hFz`Js16e}V|1PERmI|h`kir#LTVxq7=z32fbKjnjA01AdjGJUabZ|soO85aFQUSA2E_jW04?5( z21qyaEs8&2k}^-peuA;IRRl>OWcjzKjt44AKxEw zs9$kUG9MTgcY2$jcCj<3-y$*@;Z}EaSSVlLKuV~LfQ>ag18*QkUcIJI0%EQx16+rYL|c$s_0|r?ZX-FyJ%pp4aLP8HdV;p zZ-)sXz%d*nT(}v0!$88#KC>GIe%?O-R}eJXjMW~cSnIsiL=q1eJJ0v*uc|K;^>mkW zOLt7@D&I$_~ZfG-gMA@?jfGpTqymXXyGZWGfVpd3^1M%?Ogd3;mfM zaYx8{{qv*$p>6(a2_duh?pLZyTZKJqMIc3!Mo#*6LbRIHE*cs^|5Se%`r`YCDg+LG zU)2KwqPlHQ*+0UYye5`LVkQ(G*V!sj_~Q)Y+YHfB2;rGOQ_{i3w?dSO6UM^DB4xo| zGt-J=w&db!^6=~t{v!a|x0poLGarrk4wfBv7v5Y;>A<%_+Hv3}J-Q0~+U|run!J)Ek&fl*!R^wh-skvF>593@Ex})*4 z#o0285(5ant1-%A+El6Gnjt3f_Tx#rH-Im8)A3GC+Ye!Os^FrotE*{GqF=&#^_Fuo ztsq8e&&tqv86w)njL*izuRPxQ1V*%&+MOl>$0S?rJ51#_4_aW`O$wp zA+&}$*Zql1+vKSG#$;&2>gr#NU0-s9G>l`Sd6x~C_?GaXX9?ICkDAqmQeI%YC(eWmO!q zgh!0Vyvae+FFh3@-;}H7?XS2?XA-|!{`J|t^(O_2=rg(70%-q?B3m11Nk`r$S$L!TDEVYZY zam*3LR#RQWjC;aozx?>*&y&LFZt{2oQ>&7vO@97*lR4jG_#&cFQT*7%gsUgC1ei5c ztKTUF`E7B7oO!0E&O!UJ4f^}4m79u`T=E3{pRxz^+Bv9>;K4-~PBiLDD4+SdaMxJc z<_%k1x*paxte`JY9JZQ>VT_KUGJZH-9I+^XvHVqbo$RM(Ji8~`5mQS#GEe;WtGI6J zCP>qx_nT~C;l6cG8`mkqcck!_py2<(-g`$i)$I$rp*Ja^ zBSi=hLT}O)1B4zhl+Zys(tA-*>4eaG3rd&Xd+!~TDoBuyqJV;mD1u+!efIgbdyn^& zd&hUjx%ZAYWBswlSZgI2bItXebItji&yzRW&^FV?QN13$)y1lL{~I-3Y7}FP7l{U7 zRPHDZz#JeJ3Q3)E@4L`^w0Xy5%)E6n*Kz*q3X4wnUSC3;gUt2tk?4+MP*#-7=V$Ox(isQRqS#aGozOse zdk!v0w)6@iK&>yhN#@-v5F>BPSot+eP8tc+-3ETq02qCK>$bd068_dO5uO-|)#vC- z43gwDn5!YTnl)~DlERv5+&6(mJH9Ea@x52MX45b&q>}9cx64jYTmy! z=DhVtWZEImxf5Pg?B2-lc~j6phDy&6tp;HLLday~=0%AI25(rqo9sC0Fg?Az3(iAi zS9{znq9isB`EFM)!4PJ1H*N3y&NhIWiJEB@htxReXdx*9@R@(9T>gtrXfVFN=_n ze7p;?L_+t|33H+d)3^8Lkb`MdK4$(y=Si zrvrchxd1WGFRyr4+GBK#S}oi|UOY~L`+A$hkB6)@hh!g-V)82ReR`*zngF{NT>=&j zXZ%AkHZ%~rhh)pwUp&n0_^QMzUAn{5G#0p1?wm~qZy-+(oCw`LnqKW`EHB&RP36+C ztu$aBld!es?@+3~x|K0KooAAB;I6j&{6p`otEr%Ql4D}G__pE0Mq3q5_u;oxy>x7& z_*s$U`k&}k8s?|ui9Lh)Q(sPG<0b{#jVw=; z+>7&I(v!@TV4*!l3%A8IuMt%i4z4?`G@*~seKfHh2&&t|>W|)mUV~bWF3gb+6B7-D zE%bdgEF5)Y`8BtNoOI%0>5@BbD^$K^b_}%D?5dn$iYYY|1_Ezrf95FaU zf?ge9r5B_tnr}Gl^<=${?V!Ozsi-I?QK3G;UtbwZ&ir6a?0U1y{Ie(g^}2*cgi{j= zOS7BogTjN->GktZvK0{Wb%JTWQQ(HkR2nXs^#ft~AEdkwUR(J%%sspPh+mH8tE#cs zG2i9GGW^6}fU^K{Qew&efTggipzmZDllhl9=oXLf(VpDT8Fx9*)CQWETs6NvpW@+l zUqFWEQdoOD&ldioy~NBhQo^VGj2mp>b-a*hb@j|WXz&F~w==@Dv-DOz3w;f22zsH;4Cgw#m_e2M1hr$ zx!Nzedr2vONF}AL?>)~^pjPbU5Q>ZFdi1EpC)WuUnyZ}V&z3{qPR_~{8udEj(0=v1H#D zvS{p#XuPB%cbma8i(0D|r;sLMOo8Wenzs+X%mylu5C!F^=?@@(^LrfoW0d9}9VUa) z#7u=L+d3BY5SKqjX?|;?<$nu)e_izVR^b15L1?{=Cv{036R-y`wGu4~vexV%#N z{O;J9fw75-p^?^~#A}bD!!Q4q0~P*Hv*9fQ^MOltl$RT88(CaPGa`Pi|HFZ*0)ys=L2sb0iRnYz4j_T%-F(KX}XFvTrUl#oNv zwZIeZcB&apFvsZG(d+u=U8OSIoXC5ZUz&I%TQ$(IL7e+Ld`wB;w^=k zO9S$p?2MBI$rya%JTj=Re$v>k#H53Vvy{9G?RN8<^l1Ku2nFfFV;2SfRiCRw-5{iW z2N4jWYc^%{S-ViMu+!(|r_=H9lev`1(ELh!mq+swWg5fsam+=&n2j&V6=m>^--c5D z>6sui{_V(bcm5B!?r&oYy8pQIE`P9k|GJ3%(;o$4;;gNG5PG4QFJ5eiawBhTF)65c z_zmZcgW4u;vRiXX{V>y#8|%209m|)*0o5Mpd=^IHlJ8)5nK4M(d7m5u8-o$;*p(Uh zKktmhqxG@Z{b#Gm-{ZpHqt^d(0pvfW^W?e+u~o!AYq`H=j|}9cdgYfXp)QV0b5o(Y zriVub${t~lsU}qJpn3&X_m>!0jH*4Hud^5}IRnf!5uK@(h44e_d4&4OI*2S6CByjM zKTJ4AQTwmAhN!+DsCHZFI18vlBy%Aw^ns>y-X$R358rf&WZk$v(iEQ=rH<*g3QF1I zIW17VmUo#c23HED+R#&G=-Ds2HEO1e2?+`mm6;+95o2PgylUle?+S%ht2go4ndm_| z;e};Br|XlJJ^g7xX{WVxu*zV0iFX2zTLJ*|<95tA;ceC%>i$HD#5)V?r}HDtAJ5}r zBYi9GWHsJgFdh{j;m$!K1f4tr=+V$k75lV}7;oSXu+2W+1)e!C&wsgdn~r&Ao0`2L zQBYAAu4gKhrsFHJu1XG-SG}>A&rP+BZ$n*t+uyvp_QKY7Ar{oPR|d?+cOH>r`;klnIm-kSze=o3<$T^8sg3hUU@M zeTDXy$!V;Qnnt%kgPK_R4-DJUdapr_+TbUSi2V<4cKNr_P%&mL;)47M7i|ThEB)=n z)|w#gfH!6@cp`-s?FO>s%JAA{RWkM#1pQgjJN5Y;?PKe-X_2rHlist*<$>HcOfBC| zFPz#`Puv-3G$(}@kbD%i)4Hk_mH0%ARJ3;^wRm)VZ~)+2YVRbsgv=cE^-7u%N+pdc z=uVGy{}c^1g|stHE>bVT$!DN!JPjg9Sb!MSPTyko9hOv(7RfFXUt%UkYJ96PwT?=8 zJO^QdgX0=L05HhNmOUf41&hT#+VNnk32~bKCK!H9RL4{gx3ZA!$p1*+Q;;`4His_X zqhEBL%AfnLv}J-3q|u|{;H3FMX=)OZAskm*b-ESR;$zRMKs9J(>$uwY5eYWR@GC?I zh_I0MKA9*&XimCR=1f}7>c?KQ4bErb4i#r>7BKn}RXRCV=*i~-PHO8EnbR!Kjr1HQ z$LowwwHxcZ(Y5Rz88~fm-q_z=nx}(3dreFAdh~WQq_PN;Tg{$cu+=yb78(bBj89D- zB?d?*l;-H9deG@}e9ulGQMPYyOW8+$tI+{pe^GPVhl+dm23o5bNn|1PsQ+jgf~pv- zbQ0O+GodoadvC|Hm-mJzRoX7OMI<1VDz7{v=Vm{b90S2Bsyi<{jvrtt!nLE4hL7py zBnO057J4|3QJXdFC!kv`%MB*fC-aBCKmVA|J_Lj`ZToE5Rr443TM@#3=BRk#AKGlZ za@ll4I;@ZN3QsvZo_5I#J~q->i>}6-3@r|ITtdPl#1NbKkCkqo_pZOYRiE1UjWM{x zKuz_)`UnEnD_W^~(j?4txbIaF59Mf~gC;-;Rmz#9H=3o0a{YZQ+xIVL=6xUNVSnlj z$Z!nQ6nY1<2Afv9OaXZf6HPxzCxzkxO!aFi*sV-R@g~BcJ(eUc{pKEJHil5IH(c$u#kA82Yhd4cFi+r|C-8FlY{JKd`Jfh z01#c3u}FA|N-yP#8g%idDdlQ|;6Zr`Vx&36wzP+PRAunwBdaFsAKq>$$Y)|yLNuwZl-UbB=G zns@A8Qz)GRKZXZvty$OIPzw=};XfWSdvWcjy~R|SimnEQ(ML9*vaBg_Q6FbmhQOo` zCWm4aj9o(kLY*hq1C=|K8)qj2;2wFS#Ka8EDQu`7lB998x*s`nP?R!*DkGie$d3m0 ztJkj5>x5z)Mig@6E>R zBd?Rk2hv$gNi;R+<2%cU9W^`F$`oQF4QWdXC)u7eEsR`1@j0gEr&=2snonPJb3aC) zl6Nl)`-F-tLdY4EFDA0fC=->F5HWLYb4s%dEV}2zje!P&yo@5%x7?*D>4aYIq@-tH z(r%%O{E^B^YsEgQ8XVmHIg@S7$$JDmYzj6XZ>#O4tx05EKUh0F(k`7@cO3)`@Col1 zt*f;>gmmjoWNsSAPcs3zfba?L5>9_<_K#VNL?cX=$I&WJTjKYf8Ln4*3q_RVb|TAT z^91$^>4}fiVQ^5+GJKyi3|7R(yEZ8AI#||TS{t!CCOJ{EkuvF+9wbaBxi}z$ZgUYh zrOY%bY>WdbLmtg^M8e$%{hb_dl|;S0Z_Y$};vH~t=1sZAFYGxfRI(w`|6KlHrp((u zF3|#>V_N-8pr8yyLS>lemw%W06O{nE^Sb5SCu+pQafBWZ#m$QqB6|cOtyh3WTN9*1 zpP!r}U)&hiKw}HIR0<3Qg*IqfiAx%~r#}dWE%;Xl4>V|!d1}CGNtn(~Lg8_^y!Voo zh>l?#9u`6xnq46CPm6RA^4fNF>(fVYLd{;BlZhNi!E8q)n_POPw(HnJrv` zh}e}^4bSWs619^FzH%o+-)TenqdJHOcp>OlJBL4bqe*EQ&jFg|cJQEDC&B z&(I2oocNqvRAyg058*_duhksS9pC)u8U>G^rD{y9Q*vT4WqNv|`oC<_cAPqf!)87N)P=skT zDOEsH_TzgAM9Djf;Q`3O{OyE6af3eTd!+tPn~(LQyD)aH(VHfmI=F%gRd)>t(f{Kq#c@2ry zfcBW=gxMTA>~s1IDy|jnHcRvBLnb@Bip94=c=3s>Bp3^K$CrGuk89&x5Tk9wA;KMLwY4)S z0G~VXZOk<(uG1#xi)!IGE1Ucr&be;3)Oz)^B9Fb-9}P52!HptD_IH;niMb3c3IGCb zZhaadHM7}OsOx5!!OR{rg_@4_97?8_!jdGTpRz9oV{=KPCVIltc0M4>idabCx=R4y=Z(haFm-!|Ne7P9ZDIUw zMWY?IEdR<)=~d%%TT`_z{&D`%j)0H$_Oc5mMaGozDe9>RCQ_ow+ zs&)IP@TCX1X(h;Myy!CSOc%*GStJ_yXsD=wSyhDrNo^zkrpd!hN)pZ49S(~KuC~YcW-5OW+L9Sp=$?IdH)sXNkppzmED`h zdy!fKoJWDf<*cI}6nmEyF5Q&JCSH&a}BM49+e zo$v2x`gEDRr{6X}qx0gW2|S1>!v&q*HwjsI{X7X|ax0|p*coF=|7<&aOR()&&+mI* zQ|lfRe@^=LG<9Qzkl*Dt^EK{a*2nbu)B1AT4s4~q!?$(z??hy{3<70zieHyEJ;wxd zc1|9b1L(u+$yAk-yOQ&~mK0|P&MOCWV8Vh*UGxm`%yu#i%ceJM7?$rP6E4c33HR8l z6#)Kt=TGd(5kDJ7Nk`6eRi|4L@K1_gxgp~9hB{*E7K!g?kE(XS4;%<%!F)1!6b)MV zoCv`Cf-yU}yzrgu37J$64n=!97nK3^>JL$Ugb$(UvbzWTa_W!gi51t9@B*>q43i7< zrbODrE=L{W%bJh;6??CGYs(>9Xt%!`v50+k=h;cRy!?6 zCKMtJf)7^{1tDJyO>KEd#4o=ZN>nn#z3G_YzL-Irg9Wu5%k{iUOP7C|H81f%ki>vu z7P3yp2@5|`FZx8;K*|m?fok_zjX+5As$smV&8eyFdZn>99I>*aAXPqhjQX8qTWk#1 z!vQ`IyXAli)~aFO8>?d(avH)=(%-AVQScba zwB~F&R3$NOD7mA!mI{rm3?1`2uPEB?n6$O^=hs!=aTVUlVEc!4lZ2@R%!K57%E^rK zHuYI)MC3V>b_~iG5|=OPJJCm?g}qNLKGX7f%o&M$*OI=BFG3jVGiYIfP&73Y=QFcP z2q#_xtN=vMc71t%+-=b1joER#5h*{CHpPa;#X_G_hX=)=WZIPONcZi#uMgHc3XAgQ6t6zCN;;w6D01XTi6+qEh~Qq!mp#v)iKQ$5&{#Q0u5frP;@yF0UlKsFa6dx6>IS^mlczPx7VASg@ZMx z5t@|Q17It>-o9(93yXSr;fwy_|K+kx9abD$Fg*1W8D zv6zLF3+crpFi}ayQr#70;Voo~>4(9IY3MKpG_)~a0-m4k^O&u5SXz?pei-;1OQdi5 zLu4eh**m==)G4+|%r?N$${i^x=^YPW`&rvKc ztu?(s|KGR&#)x>(>9yrLb)4;&SwGjOOzWvke2+}NLP{4c&p`UfrcCgzr1yIxIKXe5w z$!}L3O4m@h7}b=nksW(S03pJ{4Z`p%{tcUOx5wMEDn!v!_Rt>mJg3O<$Z_ipd)k*2 zF%(+4((cDFj#-n6pwbmi7#apxFV94K7U3B8x>#`jn`riT0rGG1uHU`i)c=9W`_Jj&(7(R?&%ED%70aJm;{Pg^|FT$&`EX0k z^<>Ucj?04s_Ge5}7RbJ=bS31fDK2`&MWW6lGdv*iS|HVVM;kqEpBVlOQ-F9-PT%P)=e_B*{9E|4gh5 zLG!{osJbRs98RVG=-KJl+KlnkBop-xcNd}h28n3mDU32rfu1Q&Ac)wAq=$G@;*van z^B@1roqq2hXK2zeXp+(8c#y%Pr_G~56PsL!1It8G_5ZPOkR8hKD^e-+DL#nO|A{3*Tk#pS<#h$0S|rS+~REOS2a zVJRbvR9VX}<86?fA3NapM-y~eLyy{-2^9zMK2$RFc=W$U)Cf=6vSSR*X?@&tnqd_@ zDS<#5e(gn86bf}&1ma$nx=pcz00s+tZK7n#>5Kf8S9_G+Z{oEdD&KOPE)xs&2VelO z0IXu}diB)un?9Rfi#Cf&KUBl(4y8d7kGsxc)$Lx8*%lNYuOz#d5`gNH{m`)}`= zna=6A`zY4FRfQ+N_!t>|7_vz@>_pzjVG%9f#(u6ZubECzUILGV;AtVq^Z(Tg^au0m zzrRI%e_JE;G0$r`L}>egi0!LZW_3jVUj-Ho{ud@J!IGBS!%t6DkD)<5%NhtX0((@Ct2rj zebXrKJ8xt$Y#Q)76FMJ%1o;3P*XB_3j!WxHMi!|O9~7)ts=-jz0>^wvgbW@b$&W#* zHN79pDfMO>!cvN{^xoFG_guwUKov;_VmAB|MEXb_X#p=o5)D#Ld~v%L5LQ9~j(-!m)J3NG}GK`VQ(;Qj_&f9XA$r zG_+o5gut4;xqYk$veI z+BTC|*lWymwR%{1W8#A2f()1H+Rf^f#DSG^on<<{HzF;4(?KSq5wY%*;zKc+xf0fz ziJW-dMxsk^aia{TIbJ%9Ae0R{hXui4g1}356V{TX){y?8kTqY)w6)hd<3C%D@;(ks zo_1TrT$+0wE%km)UKGKIxatbBubG()0bkg1(RN;!OCT%R$!jE&CRWL0VB8V!`FhQR zHa(DL1y-OC>KiS;EaH+Io0{D9dDOt7hQZ@}R=C|9_#r_2u4P03u^-p4PrG6HlNWcMp zWqLRdXI|tr_s)nXP2Lx--+L<9-QPdn=qd0%x27G0uldf=p5E`j_js9F&pd0_j){IP z8DN3$Bm+318phjVAM7ikGC(>`7DYsG7LMDd=%-)f&sHh#Cuk=P{d#yC`SWu8I_0AM zwRoP|TZ^t2VY?%jEWQ?08)gkfdtJlhwolhx&_JRP8LxJpB7xJ|c)K!Gkt3E@ESb=d4v3_^qQEj%hvb`1Q{~>t#0i141yrPuY4~*pbJ}F-VGqk>u2LkZZuOXqnHmvYW(osZ zH*;vAZPURl(JyTG=!3E$O>-g#)If3staOtxZX@ z57W~W9{4l39Zd0QODS`{Xa|%KEkSVe5nVnS<($M9JdzKmUfiv74sMkZU7OSYL`x@q zp>2bW>Ye5COM7g;ppe>yQGFpms3C2>3V5{R6^6D3RzK5}3plSAGI_;}o^3`pS-^YZ z93=fGHLKVtWF=5x^KQH4-9dFG*Hy}(L;tSUja29!27v>R%3eep|IN%xHHE@Un7FgR#Ur{>~jJPuo1rcC>hLg>=k zU~Eq6mWY0AeOkv_U-X~3WFSZ%Y=8^0{B2@?Lrb!1P0YwRysB8K;%qP%PQ`c8cWg+ zdP%iO1!liWs7zxhy>>|y?i0X$&7Tyrv~_w*K2>bTvoSto#ge4CTT@!^FpCeITnr7w)#I?2uPzOoFQ9-&c$V%{!J%dS8@D<`Xe z<$SQ~Go?DjDrKG}kN2>xo)369rmBgU%0C3&9;-fd=8UI%r=|7rt z{o#nb&MZdwB+T4uIXG5EGkpzzc86U`C6o5!MMykaGd5I)wk(+$MheCC34T))LIj%s zhGLY9fq#-ux~I!r>KZI)=cwmmN~31Gx_{^K!64;GI4IYpS~DG8F=-h(Cg2_?vgLay}w^uQuOhN~;?+Y^=!MiO)ZgqoJj_daC#DBD++}!7500XofCfJE^B{ zye^XTF7?I2lc;<9@>K^W+dJ^{T2&?S%+#hL9t_(kcFb}Lwrse4=YEbV)t&Pt-H41Q zZ}NT$`~rwCTpsid)_rF8M?&O`|Gt0c@5f#t_5Xi%V(2eGDGn3DMyLIjOT}Bz{_Si< z=T&&vtn$a!UjWU}JFTr#AUlJ$Cv9q7lgzV>o6+KQ88HtMo}p*j&pV{FZ12V*m7rWv zQd$bEk$W6;DX@u0751wmwdK{rb9D4PhpgGNP|C$84k?klfz%&FTk7h60X`;>y!s!A zAT3oebqD54eN&q>QC72%NfRc|`gn%cZB80MN?V7OA!EqLjO}$r4vxDqk!vR>B$PjX z$5H;x&4&X_{-=7r|2;VWFFS(oeN!Y@RId^7Lt&%96~LWp*CVqx+K2!%0?LDP~&h>?~WEPi>th#XSQWmWAInj8Pd5KbWOt>$n55s>KS%xsUq{78IuF z8o8_D$v8q#%o9M-;0Ui3!pF}J+57L@OK)NS1+ZiN1=#%s_ywqO5YOf3N_6+(fpV#_ z=L{2E&80wavsT+6?q7fex0aJ{uB=PPqj|x>Ga;2l;0KcQ3(TLlfWSF+V4~!j#E+__ z<0HSe+K)B?O}h({z{%Lkib1bYN2jufPS>~_LDyv_&2a1U8gOLNQye5_xgn7KTh8J6 zMyAJy2;iW4ctzonkH~tfdOD)taALGDv|CLq3@U?#LGdeEsFx|5M?a6uNyp~|I!gsY z$7+^(hmr5?fmfdhJT2+5!eCqQXV<*d7kB82xY^C7_`2+p`y_9{7jbexFI#D!&lYtP z@oWkKd0E{lK^eRH;-QmX^iZ8af_neNrTD~YQ!1;Efk{O^R5ZbU_5AV2l--T*HDve$ zwi#H{w+jKXalLz#?GZmd;eN1Ru4ArzB%)oGaoTWUw3k+x<Rl+kSVpN;8JMM5Rw*h;LAkrc8!H zAC=|lw;07;I<~DCC_E@@+UnbO&c-Sw_M#CbB)gi?XM;B{ zz+ZstxH?sgu@`!|WYV0GH8ONMi7p#~U3MQ-+o#G`2Jc}@0U#&#X-o`Qgt$wA{P^$1wg#FDb^rX>o;q22K#G+#l6C*U%I zj_%(bnE0n1=#J_v3MhxEFQP0-dijygC7q8F1rOHUUj4cr}1jsmrSD%j|#jSZ%spRGzh{6NF9XtN#342`nlRJ z&ek{KNuT)WP-MOR%vkeiG`yRbgNUNtL&eP+D?|R)tyFC7nv-CX#OpcRCUZq>+vfO4 zs`afd^@-c6jl2Nr)wAXm_cjFa&KD#6*Vc)GZrjt{b*6$wvuw#m-%57)ql(%r+(#?Z zjUS^@)OJljg=TLSg{X^bfN5mYJsXd};&Hgj?hw#|t0{j(pBf&ITbDEg)74GWRugGA z6Stf?C5frmFm;hHR7o36YWm z^#pSu?FGjMi*Ok%I-24jo?sOFQft9}|5KV{@yb_L8762vtC4oG08-aUGvA-YPZj{v zBkbQ^HR@Y@y?-X%^Xv;Q>a064`8&mq7X4sUXBd|jsBB}%tv=DmufP}}FseW*5T=Yj z;(&l28bDLc+mPMJek984x!OTOdRI#&TN^YgVH&8*l6{Sb#`NYa7!K{{{T3?UuX0c$ zKbz25=9iNUa8L+Y)uC3 z&r$qq+waUc=BIUXRjMQd`{eR2blNF^9oWh~NICmNXo`T1ORZFtYj5KSThNt&D2yUdo38A`=@!7Ck?S}@` zF9|HtVkLN2c`oNW=tTJ04zvSQwMXI|j)eIHW)0cFlrZkZ>4dFUplwLmoK$EnU=s@3 z#OH3k!p8{;i8-3RA+U!RpyEy70dq^RPP~)6C+&L%SzGpZx-St=Z2=EOx!r zsr7Ws(@i?4ZVYZVfV+qT7<6&yHU5VqJn&C3cg_IWLC`0?ts(x&3q2_hN0o(5V&6rP z$EUlL5wLKRdKe@RT)<>j?%;YQkv{%K!}P#KyYLb=&g~f@B(AGczWIe5|IWF;p`PX2 ztyg(0aV}Lwokcli6|o1ggSK9yU@&(bS^R^BLE~S5q!Wdn7AcbjRX+nM1Eje4oOnFk zPF!4Eaw%Sy?c9!h#QJb*e`>rQvd&2Piq0D*VgvHD;{fjgWgpMUqCf!aAB4rr1dE&u zp)LSy?$TVJ;t5Cp&U4LgE4{Wd$5*_@`4{A?0{&A_o`!*4W~K9}X{d zOLioi&mKRW^bM*MaCtCYpd?{gd73JmxcMH)H0*(}R*uyr7$ighuuw9-deTQ}yZJT0 zy<4}k^`&i}5Jm7k(rWPgD*GkgN5&(3(kBLhbM;Mt3(EA?JS3SSNjyK0zxqx0Y`j$& zOnjGTD|X5uOK7WOPU3h6;o`8ACg4B^#un&d0Z77l>n$0e2Jf03=}Xt?7H3w$o9Qqk z#e4*Zrb42vzj-^?I)y`g>T`U2f}#3kIImb3+A^}=?DBZVka4`bRxn_D=#`JR^mkIF zT%|?Z38BpyOvmnbPXEc|YjGYRR94&u6(W{|EP)9%n3d5LGTf)U+HKz0bSyWL4T^6b zFFUA;L9^45793WfyqJqXwz28d-nyXZrPM_#j)^SaSBWPUuI;Ccdme$Jdq?GOIbMpa zgCdIBG;iK6Kl%<76KQ;l&q6pHiZl?*4x7tNw2Nuy*|YH=bqa_(Z-bkjN{Xz;G*_O8 z%M-%Js|#`3N>V(TZJe{^`V^LhigB%1Sb^xX@$=;FM|~?ujYxWfGnf)mPLB>R!Y3Qh z%`3h0<><@eXFSuwxWW?9YuhoekL%-YTB=>7?P@xY!ysLnMld&HQXCo!^YkUriW~^_ z>D8JHY(wX?R%kr)sccR+i`iJ7P@YMQ_qz@_yA(*18SiuEE=~^ivEdtlx+pxxZ||D3 zoz}>J)hg|3+iuy5iBZXnERVUsv2Fe!gpNx3WD*cfV zE2A}%?+HtPhmP^fP9xmMCP~9?Z&9)L%U_}QbyQY5qb83%xXs#Uccbil&8l;GmKu)i z7m`SlUWN>9EGm0%bz`$?;sJjL%-ufOmn+-$cu?Uidb`k0 z&wiDz6OZmInJj}S$q@>0s7K%*)o^PmCM!^iZ9%|H_vu=!oS9{@bLIzGYqhPbmx4Sh zI1}?XD&c=3_LPy;h$7f$Z+2 zybcvTnv-WodYH0x_=QOl$jsG>@$!P;u;HX!3l6HTva$j)=?cql>S zx-DMML%Yw4H=nvv^E+F4F|ipg?Cs2_p)uA?hD)j)uMmVk>wUuY!3r6ih`kNe2tHn- zm0NPZsqIFid-Sr0T!Oyx4F;IGE&|a|OQnv|xM^yi!d=YLfd%KVL1LE)I4SU8L-k*; z0&1yeDX_XCg6KC-y_{Y(bzrezth>yYj*kfkl-)hMnfWkqduypzwI zoy;Br$vu2=V>j69t@m}ZocD+Y$~XD-Hy-05D%b{fg=0K~+g1YVv?-Paw7zB4=e7ko zy>w$4SFkVuco6wGpmVL=zcJiF_>#KU1G4JstP?h?<$QK7vToc8b}3|Drlyl@*~phl z7AxhQlwUvCDj! zn215r*jYq7^TCDh0;b{vwa7YY^EWgvDnM!acM$DhST0ufr)puA7nS_-5`CWm2JZif$CbuB)! zRfq)<(Rl2Ouo?LLoXy(YWn~bNIIP4}+9G7r39k`jDPCEuGnKLKW{$*oJomWe&VEyq z^kS~Lq>DtW!L}rHqHPbal2pd9zaEkWURR{QEPe&_|XbY-NpCU=s%;)LXQzagS#W27@ z_RsH$C!*S>GHqV;wC)_?QNl*O_vLL5Y?=>KcZ#D7w$k2tE zFfBs^ekEEIJvlG1+Pt;-HV~>1< zA#sl+j`*f%*K9CVvE|F~NvG<%1h4l5J zd2qP$w=m7H+x4Xu^BVMM_CiC+RQf?LNDil}mDmP$_r*vX>Cx=e7JN6rQ_^}yH{sa) zrAOH^KSK;Lv69s7gquX;#Zx|Iad_0f0L)~kF+Tt@kHRnMa!J7#UtsjiH8{I$C# zl@0V>n_BJJGh>k1vxYX;GEXi&joFE6^M?00SKd|J3o#KzE>jKPpV-pW#(t} z)R^fc2Oao!J2udXuhH!35iy9Rzo*{?KzzdPsYu)Mn!HZJ*vEN?-XksPX^)RY>#%7t zK>0{H(PjLLG9O6s5s+-cetg!%rT72M7HXHG3Z8SKRub2av68WEyPZPe1{Wmq8e#$X z&G}DPJX6SZX`0o(ET~Kgh|RZ=aH8WICd+o-A21I0l}L?jp4S_yo}de0n836#&?k7z zRPypm6>JVPh5bz!h9V$xiew@#NnQEV2I@B);k+_-!NNv{{n~# zKe^Hx`vq8}?bALxjT;MqU0zB@ldZHtdlEc3_tw7shJ`dsSj19ZL#9;$-_pwCD^deAxZRi&xoH zoJ#l}oHl?T4=eQ^97NM+EAJ?}Xv zS)?i~U1Tk@Rj#@;-o2f9s%(3Fx!Xc$HBHDqZZ+VYREPjmf|#lShO|7paM%jSK2$AV z^^B+Cv0>CWRqe3&&_xD@O4;4704=&R{vf(iiSgE?3<*U#c_#(#Mp)p0AB}87OIGH0 z==b1m8C||z!(0KNeehe`?UxQb{bW?mnzY@T1Ud7OuyF>7Qwnl50~^4mj`H!%T*&)$ zpUMw0n(gE5m!+>WLbuP`7CPBvnC=hc>Hw0F00L@=+O`MI3|Pj&De~ssF92e((m=?% zYo1E+ysM$DjpvxGdyUs&Yqhqacy<@3o~C143zo}(zt4JHRIVq=oVZkUYe-H`yL7KU zQN(tsq!t?8OXhbo<-XAN>t?r=N=g1e&ACj`Cicz{h>vY*KUnV3wsG%^QGME%?Hkvy zCs)%y)*BqmEhaKxOT_jeDdwQqL?v<9BpFgJ07#jK8!JYFa_yecIyx9C&E`~ht=H7A zj*5qOv+*A$*rnYHHsz(4BfphGOPN8(jHVBQ%FtpI2gv7rDJNpxnY4FVKU1wZ>kRcE zqEb4^*GaTxU?t*~4JI{N$O$bKdbr_GI$Xtr{cPi|U1Vd)NSmLgC8GpUN7=Cg2Xs_& zw35ZJSP9qfC)p#U=(o>j2B@O~IXHxeLcoSYX;~o|qv1yRV=mBf!JGF>b4DYI%A2Cy zS?TFLR%OVGa+X{gN5#tYXe*WQcIaqY(avK}^(1Be1cfDU$35D<`SC+he?->(l0pzI z+T(kA3~4tluK#L*5AzTJ_rBG!A_#YJ^9e;IE6&NIo9<1FsNT5Vdta>$pK(p~Q7xBk zQ$RTbC`SVHZjA68i65H=xhS&!Aye@+EB;vBXef_edg0)?*S+aIVkN9rl!CO->w?Ef z{Z2=;g}Q=%a_R1@cbb)A$A`FM8OZ z^@@9y&taoi&Cf|<#s}D#=A@ zE^*2D)@oyn5OABCSdD)6kK-=m2Juw#(W zRZ|iBJx;JJe060uaLs*<(IF^Hrn8TX7E_KwedLxqY=8 zesNPX=XQolhDuyc%zakh#p)3Fx|LEE7ccq}zFy2um zh5(J?(JZig+{dfsix{MSJL;)JMb1$EiT^Cz{P1;eY%AL={YRkEYhfh6u_{3lX|-}* zg)RXZY-Ahq$vc}6R$!nbB&;&C5y(Bxel<3{T2l@!z zUBd5%KHUQXx2OXOYrcv=%pY}I$r!!Qb&#Lb39pcLvr{KPE?7EfRYfFMupN}x$2Ek) z9mw@)M1gVmZQ}dVVY5OXiJ6zyq*9dtI#VHxTLh)tM{44URHQG`xZ2^Y9RknP?=cSa z=+F-@%%aO|jaCyhSh`#>!fuv6*t!Bfy|y{GP;h@$yD4E}>>~100Sx7UBy59}a~-p~ zCz`!!$b>3twaJY$`mJ}zX6X^8rt9U*_JM8q)8RA5Cee3M*8m=z+gn%w&Wbm_dXG$d zBi6!NxGuQiOU7Yk&CASIGjL$F{{1DX4x)Tmeit3y0{y(n1AGyjx}5<)5VfFn#yTCC zSQ5+S-j(po>je31go79?1Vj{oQu!;`R*8>8=_DNXzR8k>uG_C@nAW0gF*fu|lCs*t z(NkxbV?^$7HTp{vjl0GHGF_w8t^H65$#ZvP*tdj2hJhdw(A^nKnnc620n8AO8j$_5 z5;lI;ojz=uDfsRzjdIy%QJ;oL$q?-=M;OjYybag_Ql8a5X{&$g*1BT)U1w(MHdkPU zd~@l5D}D;0{Q!#!bKPY4W-KGZJo$k6f3f%8(QtonzxNoOD8mSX7^C+VU80SeA$lje zL>Y`O$mqTI7QJ_(OQMZlf)Krvs0m33BHuIL-+ez%-1qan&-v$R=d5E{i?u#`Uwf}z zKA&B#>-_?pq;kGV6_;Jxz_I!e?3QIL+NTe7&Bfq)B~Cl}EfKN_>FPns6FDoJ0=fAX)2GkZWPSAAYflv12HnhFap;=+p76e@rM zSr)u2vN_^kpH;moSD7jO_$L2V{*GM++oMsh0kdwE{uXU6hgFYX6&>4HRKp}|t-G+z zM&&dRPOrcQ$p`V7;pT6%cVbU=h9xu>Qri+}lq%8k%XOJl_R?06j^6%{(us*;97uUU z0f)3@r_H^o6dLR3g~^9RaVjT|?~4AK`aGlxUvVpOv5!V;Q@E`dmoYjoTXQVR)1VJ; zk}$o<&_-0JA4m5iUhHOs@y5p>Coq>6v3@ms{pM---~;oQXVvHSyt(`~%arN}p-R{B zQ3330%F64gUya#>vpbVEMEllBlvxjl+2N%EsY6&GY`TDx)cOYh=2rrw<_$Hx4>k>r z_Qk5z_~Vb!QFN3PXL_Gmo_&|CqV0N+rduMAx`B!DB}nW6N;9|a&X_O+p4dL+JgL{H z5sl&Hh%tfFEc$%-nV!?KRca<75qeOAVRP$X)2vz%mX4IjUJ=2DwNc;#ECfb^?hg~I z@|K;y-6#GFbXL{h@^q?Bp4S~|{^gx-B=c@D;i_hW^=?@yzm@D?dUyZJ78YLG*xKh= z*koceN|$FK{&r6eiidG*h%W|kDqO=HsV5DI-)Sw(Z?xJjt13$jT@wwXM%GO{s1x98k%$N&uFdZ2(|L_e`IVI6}bLfI8wO86h$yi5Ibfvjb* zCin3`(zeA^cUw0bf+uo7xY#bu)+H8Iw?K&hClT@A{%Og@Y*Kjn)_=qPzW&$nTdbx- zDx`0=*+NLm*^ERVH&gxvSj45Iz+3_D*O?sW>3=kNEGcQ16?tRFI_K6>Hu%H-`BRu4 zrA!H2g#JHlV_Lbg3~5R6)*~FP%%|R?a@(evai;@a6-87sU6WuRMA3q9Z4~OuUx3dG z%8r*qL;3GozidUm%zmr9xen@7pP6Kv$;^z5ipq?NitMwp^4+rXvwHgYls|kOdhuM) zR(D`dm=YvRNhv-sF!W$xNE$B6rQh`}AwlM)^E#URFM!A+x6@Bwj=O#qG49o^7J8gM zpP)B2k-Xg0OZWNjBrSX2>GOIoo^A52kDl!-lIXO$U)$SL>&xD!Fqw%bx&FS_*NER7 z5to&(`Cjo#6h}4JzoIg-53wqBd?)_%+r|0nFDsuCPAHw8V_B?GZGnn1|ekRp7>^%Md7C=zGdKEi**x8 zO-@IqcjIRUUmH20iY9y}*cK3qk^OdQAUHlJQDz?THKe}!=oupuX|MIdw$B6u`2MLc zKCvoD4YVcF&Eg{}Lzs%LjO45`7W=)SzD}nkRy$peqp`B$PjjawInN=J5oUb(+e00qtzfUl zV|8L=P$n(Kk&MfLP(ZPQ4Nu6SU7ghMPSFS$2mQD@_T@g{zO!2hZ$;F#mEsJIFt12V zD|L)t-l1fUETI?$(L=K(!Wi~aPPnaxCKkB>;0P*(c<|E%@jlJi>_yYwP-_=^dOxxG zqkHqO6m^*w*{Z4}5!vO6MwxXK}-1qH~mM9frm}iJYOB} zrZ?1&jjmWC`?u%Envk(VcxKoo6&yb<)o?h~45Y||E8B@X#+g12^|m-KGHYfrGp=fZ z=-)T3iqP2Xu)g<1a?Qxb>+7*3I%O*&sw@g8ZG(h}BB*>>MJZefvMIk&IzNoJW#nay z*K^Q+Pj)9MPl3;4{k3eEY56V+y|4!-a)U&2m=`h@RZ1WTKHg+rt+cv`SKC@ILl^CN z>gAcn+L_%!Y;jr8O5;QvFV1uWtJLB~9RV_0Ua{+NnHZ&KTaiCK{{oQp)$@GS6!={- zJ(@Ai^C79_jyqa9MK_6>M#igWSVEmtZizlhf-)x+v;dcBusFPO*fhNf`QVc9@D=pS zNaJi26HT_tSo@pFjX`qYN%B#u?r>S9*8&v`R=z3ll?8}+re682VNAq>a)#A4116SezN@1qJ%rtM>!xOCNeOt^>D4t_RLEH zk(91|jiN{tBWHFeT1vn+u-`@-32B* z#lPDFlzH;>J%q_Ly)B1s_27%8cO6%C29+fxW!Qs(ZQ%%*r}eTR1K(lG{Mx=(_wpJ? z_VXQe@o~7do(>JndiJ4@vM&7lqr(*=9ojb$?nx)a$WLv%J4^Bv2YjGsLvRL3y$5vk zXyLTsPG!?wxYy3OhGxi@BZq4JoD7~U;@?BYL=4ONGtM?vd)t#oM7vC8niaz*} zltQ(UIs^!a4greJIpT7;ICiYA!@oQ^1o19Ur4_+)nw{r4k zTP}qwM@lqT1~(yu5f;|~9LFCS*>OQ(FI>kYc9^%bD}Ib(G&9+vZ76eBSg{0-G%>Dk z%2&bd{bmApozA?0$(e(D>I6SCNY_{3wU_uz(4)8>y4PH_vw}LZC}c&^&;}%mC<`8t z4z%GJGoH5%Ya&UYj&gbZiXYtV59@TLIAYK!D%*8Xl-*U=omW>RP*jxVvgcGZXM$AV zkT!^Xdwy5`5eqwA-cix6!z#{&#HEgyRC4NuCg`z;jzoV#gez%XBY-}(WE^&nuroW& z{(kgW$(#rSpKi2gnmCB12Mz(c=b||ue~$_Uh=J;8visXeMi1O~4Xg9MqH7{69p2_X zleNiiAf#?|(r9dIe?7%|+`1v=KfGH!PM2WT;FHrjW;(AmZN~eP3Nq5X zu)6~AB0nVQKQ1T|nrv56`$8YUka^^7pdz7_KOAYwOU86e_+>DoIXJhR)=NJpsah7!Nv||wI-Vm58|0uV@JQ7p)gl*!0TgO*@Q>@%AIT1$ z`QUSI4rai>uT+wUsW~CMUSDRkt#^ghxr#+*o#d#ZMsf+-xchLKRM(ZwcGhor6;pPqHO640H$w6FhMZ$lj8HXBvE z?7oxe%8$J~YNXK3Z2%0m((MVC2x=#?O1gvwsY(0$OXb3)-$nEDu!CYDUk6p07;OeG zo^rE0ikbWc=q7&RU%(xkrOg!C29*lQe}3>}@plSgz%*%hsT)kxG4RZ4erSKkNDq;D z-FnUP-F2AvSlxszHEAJf8fOK@jt}twY&N6`2nE1aL>7&77HRsysv34CS=);-g0yMH zJ3{aQSWRv=8e!cLXV}vuglM}U1Q!HLRmg1uG`&eLOWkZoUOp+$UT@`7>@=~lIlBY% zXU#t=LL;_5XmtX2-IV}oxY|I5g9zUqYqly`SzU2Jn)YmWuah%Z^Jtsdgquc}F^OZc z(N1?)2kspf_|PW2y24eZKt8nq)>8^1Wg=xJh&0O_8yJN&SB!|pPa~RY=e2O73w89E z33Zu5iy(MR7*r3LAprqtA61RXWijb$BXTyq&am0e+Jbn9=j@SZbtv;#L;PWdLXNa;9WJY*0JIQ(JiF9W;a1NU-1skxzA*=6RI7Gbb_NdOu4`_cv9nBO zC4szaY|<5}(Wy@w+W-qUma7~Z@{$?eF0GkXuZwY#U5}$Nt^*`9x^O}USdUMnPPF|d z2!ORAx_l&Zqy?LXAMzBcWD#KmSER6HG1Sd#;Jds8gwH}6lC>Argg`z&di2ulhV2f%Lv(hOj}LQ?pnho1)~pZ696v zLWOYpf3T+dEaEbzMxUX%Hi!TjR%a0uq`mNF_jvH|%qP@PNAO6;E+uS|boAcFvmd?M z94MNtY&Du5O-eA1*8+~h)uDIY-N7t;#`Sg?^>a3{P6)y&%;gQr$4g6yP{NmB6$i#x z^|_J;z9}ama>It8cj!fi2ArU2C`}Yt**%j$ zAyc+1f$(o$7ztFKsah|s(w}&-xQ<(7=qiLP&8KU_g6o}mDpoB?#uKfs;{xx$ zX{9V0-eD|05}3m{sn;bh9A3C{T|V*j^Smtr`gicoE&Q>@tz>^k@7#jo-lin~9fQ*O zM@sa=tz>$C!x3&-`Tw#otEb|Yj-f=9Kff`JU}0Nb+tGKVZ;~Bt$1zk>e@iGQ9Yp*E zVBzD3SFduX&un|PR%bl7hfg^Tz;E*Oy$|Q&q+_Jiilm@+%qPMA+xz{EIqyb@V`e%3 zV^*#lq1}z?bnypE-s|_eXVEy9L$eXqVlR`asmm~XL=A@6)!!y!G%&Zh*L#u=gdCo1d-uzIqn&>$5R>lJbDl>IrGh+YcYPecxP|Sly>tX7xTIijmE@trK#Wwc*FJ47+qdRS-!{IyL{4sq0 z&P(qWd=z!3b2N=b8~gqPfJRX{)P{e?J-3vDFc$ET_~}&sOiGB*QKhrfG|GnWfxTV; z9YRAe)T4^s3)hDjEkO=Pld{|=aB^FbJ%BJZu($um7Wa5M`6yS4w(D17`x~Kr@hjIO zyDw+*Ti-`lzh6g@_bvpk4E91xQWoa-jP(^2GC#e9c8oW-0j*#34|Yb=h_{h*q;~z# zqxkm`M5l4RZIJC#Fk&+ySx~62K)R+{p|w)RM$wLvec2!{)CzTYLRTVRme-s*EDr#e z^09Tw0=$Wp56)s_a2t-Xg7U^)pluz*YxbLV=R=hfK_$65KEw-5U2izE{VPLDeaT%}u`&-GV=p%#>o zAHj;xHkpsV(^M6?k~4(LR8@K0Hxh3jski_M3r^%WdS#YuHkYVXJtp@HEoVZ>_Q*UV za5hi;TSf%{H~zK#0hlwh1tP5P0Q?22^Z)v=E438wzQc4|9j&262j-&k*$d|`sh?eBOL&v$DC#t4bH>k^A&)CAm$*BD%~a01Y6s1&CWBeXTNj);l@HqXj=)J0d~x_ zPY;`7G&h&FlibRdCWIgrM;5M0SNoWSh+?UrZQh2y()k6&b6QGp4XVO+@RDrjNc92H6&OHl zMH$gKwml}l?JUTj_~o1Mrw5lHr#p)^wmGn&;sH)!RRwTS!D&TNGKWTK@WlEXe>+SGo6*Uyz=qp1o@wTmfCFuSj*=mvsQQDVV?tN?}!l4vsM z@7Szg!Jp`wd(KrV@$-MMUIxxk}+Wl%6+0rmXIhm(!LB zd|BLF-(S1>!*}G@CVwQ)>&QtGIbrun^M;BoD15%R{g7Jqsk#s!`CI-h;!T<;ldug@ zV;E0>O)4^y#Iv>an10A_uUjnPxO;+;n$mqWYD8(E z(vj`6HFb=GH=a*XQ3re{*I%X*bATl9V%5yD-MaN@u?z2mS1;lkU(vNEx6)qw*EcL2 zliCeCS#E8dBbX65k9ssg46T4#kkh*>4wFu~iudvskntADhH#LMerJ(&OQo@0@ z8jWqjeelLT0Y9#iB5RgO#f>aoi9hHWl8!F`T_&Lr$c-6a5VcjNM0KGqZ!3}w8K<&8}xQSu&nGa zEOdiQn;D|@gmn7DoAfEBw%HSoxTqHtxrOtd&(TG^*;NTNXM;EcC5yrYbZg{SegoW> zpK=9b8|_6nU3o(Vc{|(MU}%AuM8)SuiaR!sd!mZxVIyqW)u%B*Tbu(`PCy{8VAXa> zwZ+%ztKdO58l`nqyZP%-hnb$v+yec2dd%^k+bGhsP#<LH?9&Ht;7kZcc60>?5{s6SmGTk{;s>?3Yy)Cob_6Drr>yVh>)4f@@C%}4xbJ#ThTP{pMsc8TPahfPhuED#|1 zENes)JnTsXD9D_ zD=~x$I{<+g3mmE|#_G1w29F4ay<2^{cvY$!@>y4T-kSl@O`1tubW3z?ICmgzd{#%; zgIeSqSQv+=9X_t<)DzCXBe^(D@Quj_9Nbhbb*Dghd%ekAb-vv1^DAtsX zzwbgmdtvyr@<4%=$7jrZDG+l2NqbE3oIx3=e|R(%lFR{?6(>?~az|JmEa$c`$LF@r zmFaW~F_bd$m_hh{YN8^lhAht~T&TN+M+dSfhX-qeAIzMeUW0snQbv%&dBH zc3bLLB-^;TwU?7wv+JTT$I(eLGTKg+g-C8!_mI<@w6XGTNP|;1{H+}7rPqqSAg_sK zUNaJH~$mgVKETTg^F;d zr5Iv)t42+mOH^wKa*Rz*w6V`7Z9|c}3p@pc;cM+kz5MQDb;!rfY_{MI{$}nvz)kq9 z#wWDd_UHMA07HtRERiKSFw=`OR2BeJc9_Y3DpM>N@@=pZb?j-NE-Q;xCX&<%duod> zpZImilS6+G7cRGe=G(F$i9mREq_!M0PJa>@6y{vjcYJ`Peb4$1`6fE>=uk8X#vm#? zBF4c1o8w${3JOe4n2{484Xb#}N4hg{YQQY+*!kT#i4}LtJ)!YI)_h=QAC*v61!TYD z{+B-DXjPV|lt)|6qjGSCE9>Xa*OfES^&sD6Nl(mSB0DWJ6z$eT!^Txm3E0mG{frgU z0mp7Y5d;((A^xE09C=YpkDWIT@z$7ZdK$fUUO+B2#E%$$*8(YjOvFQN$WDHgL7`d) zD_*s~gY~AR9y2Vt{R`YD$^P8BOM~mHlXvgGTni{)H?Edb`G`tw%-(u`{_Q^SzcUT_ z-}`@{A%aR*Wm*=_&$&ZdshMCD?oLGl)g>6WA4OWsTM?z~DnPpN(DP_0r41~y%pb)s zk;Y~|_&~|{o|zS!-VQTZFooPzx2N52_&F0hQWrRVU?6RwpqnnC0|C5g z;43s-eUX!t6tvTS)%m9I>0bcJ;D6Tu&h(h7j1xD>c14T+=&zu6rskx!krVbu@6Pw) zlbEvgQg9?!=4lF&>VVa(G6Ax(vI?$MPyWzKKl~@A;;kq9)}`@h|Awsp*OInzX2{n` zZ=2&woJP8&;TPWMZd-=ae>tuE7nxeZy7-2>Bzag$qML?{G@Yh%tb$ggT`fRdoM0G0 z1END_h}o)S4pO9+2^eSFb?nT}WJXoFhDZG~-nPEu%dg?e(4$7@3RtLeXuS*WjDbr7 zTzC5e2iZB+(DmWr)cE>hK-{+dt28soxYnZ&r!G}Xh;Q-y@qg-DdCRu{w{K$SPpy3x zKb7j_XT58>rW>4k$d&!CoFXRbYi{V%Td8k>cI#gS+Wj6oa-oy{UgiGBhF0rp_A9pP z=UtQHZ*Qe8|I<8k-~Lol5sH{|}Y@xi&xt~~00>aLtCF{7oEy=eIYN)5_5k(c*(N^)f)i-)KTq~u2&{>BK{g-zJu~4LHy3$B8+Az; z1sk}?jdX%)-{jjOzGZbOdNXV~uczD#M#oGnnSVS}NPKHVPIs+lk-eN)2Pofy0ABP+ z1>}%8^}e(#LU=ZMW?MxVrqNA|#LKMU#d5gZ>=CW-9L}XJrIhX2bvwO&9<5675vrw! zCHe~=iz7-Ssi%yBLu zsc)`3DgMffihX!EM1(*6Ir&)WJ3yw6tCqlv{tlQI!&Q$1{0qtNNP{^2XC;%Q@M`jr zsHC?!Wk^)`aw^&jsP(%LYlXXg-}ER^_uHfJpuDD$LHoY?$98GZ9**0Z3ka87T^q8g zmkO6vD+ik5h;|e1s-GeE9yc3iH4$@RN zu!Fdg!zekZ!(>WOT8Fh^#OrcucFdo=E{mz|Up;tU9LMr_zu+%GGx+V-XvlW*7LeLf zCnT1D&dqtwLi&1tI9 z6p9dtlHH&q$Uxk$S~@cQR`ko!e!x&)qd*X5bB9t}$l`rl7Zn!x@ptMt#c_ACA5j=N z`Wl#{)ISR-2kRui3XGS2=PmSB=#e=(MY{$I@HlmNzwE#BLfaz?3fs!|6o~fZ82S;(5hIyJC^!upVKD-O!#@3ZCPXhhv ze=alxL!Dbcq&>B|C9%*vP%t@Mey#xg1e4IxaeTuw6=U8)c*?GB=+F5Q)`!NbRlgJ67uW zi21OdX>(}Xxv$g(%_6pKGwskT>;{6CDa)D{VuFoi)o)s!{j*@c+`}R2h|d=T=i9^@ zLt{SAOKfyQq71+1n!_2ga!Lmj6+v2_lO6-!9t$}*0a6DlDI`f_-IoH zv|YimZVF9olLA`1ZaPI)OfpS^X$Ca(88#!iMYp$h<~SpvdYYO9mg?H^gPRh{p*vba zc%`?R`&I@2wR!mGb-=%Tk1@-V-A04h;vdtpBIW7OwxWeExUZHSAm7 zA!5N`wZ+3+h)Xy)ycI#Ktd@jpursa=LCSjwNT@H*?B#{9-;+!?ue|9WyN^Blox z|I1Zi<|F0VY9lByE@=6qj;QGe2U`^l94ttuLq3=D`2BtHxHj`;K%DalVl1F^jP9BE z%U*uI>Ham#>%UI(O?dWiRP-y>v zB_*Bjpqqwp44bph22kcMdxrN(9+Id;t0?S7i@=Q>$j2tS;R-~7VK5xg-<{~gWQoL) zfvz03t>kFC;i;8j0d6f-aI}`-1y@WGCjMBA97uMKc&IldkiMrB)4I)Wx?;CjrAq5t zHvjq~U0Z@Up6U~)OF5-|DwZB`GfZe0l%9nn6=hs{a2MUitno@kWFqEM>>gH$Su=^B ziA}CMTNS+>JT^mX^N#0Ts*wR!_#UHcKUy!k9M`I{*E4^tb)suB0pajVekRgU=sOxG zT94dq%#}(|G7L-RfUKP^R1)KGbYl!^$qLH>GDG)_C^?D~wbQP+KlvB-*>4zpGDW%D%{jrS&)Yv&r$pOn`pn$F8 z4!<7moTJ=;7i#9(3p<&E_f_)>1kdo+&$tZedPS|gN3slm^s@Yy*C1I~vOB9$vtf{Px?y>W1-S-Ku< z)YkqP-jm``Ogy>Ky0w)#L{m{n$+t?bKC0>jAOZR5ri0i9IOVji0P^K&f*)S#b|Nmu zz3?8T%9C!rWUEO&hF>ofSu#ErSFKd<7T@n+RES;jW1S zJGXJK7Vqv~aL#F@K_ZdxIpkvQUIfgljcPX}+O!RA@@8_|?8(ND>(rOv}j znh6`c7tI(qr(p){COy%pDi3c;;DE%a?l@OvM?1=UaM@?=s>59&YIvjb>yBS5j@qLU zz$C9OLBkt=_Xk3Cv~>|2S-PCDx;`*mjYa|2$i@^}GiU!|%e5xe0pklIBxzcN<0JX9 z=mIUPoly{#Ppl@tQL-jZ&S|Qev?6KM$TGFwX3=G;fkGEG5Aex8Tdt);UU+nQGkkiJd*3Z zAXXXm>h-{safnRLsb_t>(Qf5f37xSEx~+NS1zkw$Mn_K+8I}qc7MzW=kpqBl7>RFY zV|Nx1gIG)7dzkTxOAL2OnMk3Ti>QK6El7M$jFyN64tQh1F6i?Xwc=OxGOw{oDD&0) z;3;{0{-9`n+d|E16P~6@uNWstA(P<#K2at?=DI9^Abt+qR+BsN5VA&hqSq>*^k2qKEAvT}vZ35rW;r2YEd+DLL#8-`RY zMLdDr%(YN6xQWCMO>LmRXR3(_#nkNEN5|&OV9{rqwW$mUlCn`LAk!-=EuK{yu*ke> zKGiD5;NszBrsR{!@Crnf1c4vhB}y|uk`&%C4TsD(nE zLLT39+hm9$z}H!vlPjDxCDOrclmt=l5X&TiXQ1Tf#U<9|$cvJQ*BjKxn2_RT&-FLD z6ac1B$q%Y`4^T%^C<&6k0FL$4NtSku_OS{AqpaKEpxlk~kE#&&qK~O|^5vts*ceJN z7Vwk+@lZ}jm@_Ml>%LjZA;oZ$;=yy812$YAv{&?rLX@({JQFEahqC3eHQpdcBmu#- zW2BiS^@XD^xbBxdD@%%$Jrf7IYoQbjXRLj|)hwuDb;O;SUxNuzUGRyz@%+)@y1Po~ zvLfj9F#SrBO9?uX)UHV*#y^`TaTh5R+@;MR!a^-5!Q`6AImYwUqt8+RJU#kq09oF+ zLRD3ta*T5vVGyENYRgRf)>uLZCjT(W)D+s0s9Pe}q-?mMM_?5dEr*Hkd%Nn%*#rON zHc8R7ODq3aQjw5QRh&cDnVK9z7;M2R7i)DwFRn;gqj)FV0cp1?w+Kyr{6>dzDQ1yo zX{BYY%GSIwLFImx1u3gpruawAAl>%CQrEkXQby(L1BB{q4F1te3A>0=9`PYMuulQuxcbC|OC1iaYB#zKe_b#@Rh z?>Cy<{@&)ZDdXadHfLu=5LmY=Q{}klD->7E$XA1F!cf$6{_eSWQdYxBvXZR49Q#WF zv*?jpo*xvH3j=fv!dyE>G(?_?!Y|MpPdpWw;4RVRwT4w@_6SqWk4|(_@oO)R-M*yk zk{hH5;`FwoP?#V(4ix534-oSM5UDcj=x1E?R$0^@?6|L<6s@iHAgqPec09$F6bVv@ zVH-_FS+f)XXk-JX4=QY4Q7aveHJ&SeiO*GEd{0_e?yPw9JUvb~VR&MO1th2_?8?&| zoQR`rT>vx-%`>)*qxLnXrmFh=DR(^GGSK1pa|?q>y8Nsf&pvKmbX;z9Qi39LnNFe? zIehIefccGygf_DD<5vla*$%eBrC6V%CUlguXfb75a<|3RxCzgjmfztCs(K_(Ky!k{I+tI8< zZDqSLiu~Gk^Z|FoYDh^m(fQdUkDpWbI$R4!k8|vLnr%syaRuB8l3xV%uaX1j9o5s1 zdmZ7{Dlugor^&e!ovZCOMPU-lL}$~E!S)o98L_3BfMtU44Jm>fk=oR45!i*pwc51! zz~KJ1WO!-~Lze%d?_FHFqTbFe1V`97i~5oEz)BH2*%CVlNA?b*Y^q<6UnsEqBeu#+ zBYH6F)HFKSnwQlcrYbHG*Ad^99#vC05I8LqP5<(=>i>c&(dYV{L+6FN(*%1~^_j&Q z5>j6BEc@X21T&3sN+`)R3Bo_n8tbQTGcyo}4+m+lB7^E#80sLqR#f`HXj}u-4m+)e z<<{nX$|DTBF#Gl6PuflTwwHo7Vtw8vUzMAf)2FN{ROLG)BAjD0Gf9)JEP+W{Se$5) zbCTqhUYAmZ!XE-B#v?f$c~<-4?B~BiRLaN8Y)p!>7-grGS~?@mv(C^L#{(B*EGBE|ue0L3ANKihBuU?5Zr zu~pZjzB}?R#5)qI98*kBhNSfuX*sI3HqQP9Iecf#f8eQzn z3hUCy>>6w+dq8i>iuHe{2~rVl0E7*KQEpTyr4(b}E&E_noQ*`_(yrT6*+w$gG z(X-=dpS@fh@tTbi-JWb)u27IpAW5tiHUR;_RYHcKnwK2XDob*f_m$-)Z;!Bg@B`)4 zopXFs|BPQx+|S=RR_`AaEOQ!XOrEgQ>L)U#9P_8HH(cr!^QY$^PiT==<*&=~89~z< zoC%`fDpf5Tf(A@?Yu^G2l(8JGx{qMp~=F$?8Y_dEEE8C*R&iwOO6c=*v8ii zx%w=2Pam}|xlN566?XO*ssyLKrnao3c!UsSWG5Pe>7EzpL|6#ffy9om{C>V29cND! zEc&Rj@Oekd=7QE32i2c$*8Uc+NK>4D*zGJgpCG9Hd~-q8dnv@e)WYfdd~jInU~ECG zglZIx8`e};xTEEl?0`{U$cj&j1t2KFJ}~cv9vNrr<6ourliR1Gq%6dQ&Z+TtrS`)p zpCvm_>+Z*d4i!LJ*}-h+j3vj67D4dxI2iH(C?ohBc;#`K%s- zUx5nq(x}qZ-;IZ^8VZt?-jjX zUGT7rf1Z*6S@+XJq8q)jg)E>6MxBzEWy}jp2{4r7gvEm=sHXM2<1fI|_FNQw{@pFB zh$S$cC#M?jW41|NPenVn$jm}^i5B_|DdN^c?4NBF@@eim?(@76M0jSk>cWzFDT$LazjKE)6Z4MCvf= z-FJ7rd5@Zo=gx8N$Vuov4c#6gR{>fGo@3ZUSKNEcqck&TPSd-EiN{%kUsft6iW-}a zSCaZeXLrG>!fbBXxg}WQm>nX&Vffs5T!WH9o7)P#XIFyNpqdo57|N)qG~P4_Vg#nv zgR(V-b<6{UN7+09TDv~5?S}Z@pQXhz5j10ac$=~9S^WMhPBuBFvo1x!8mu@pEOM?^ z16fe2_Y5EvR3rg_{*HAfpy%1{6DtXwh0hXqTC4j$W`-LiAE8$bG6x>F9`!^0>Ep|^>4yc9grZjs&5hmzuD(@>@XAfDl_ zpb9%h%BnyVs#GvokHMZ{u20nV(y0{D+&#;l3=Uh-DF673x0yvF@bS;!Y7UlF;|i_Jf+@dXt!|LW@@uG?NDp8&!eN0aiwN z^Ier0hmK3kOnT#dqJG;7C6;pGT1=@-AAwiFSSXARlZ;Y|OM-1w3P*w+iTbSQ6+(Rg z$PPx0Q|BX2p>4yqGcl%;%{^SzuBhz`mofTNF_!1Y32BD=sj|^n1Z+5?o;b=8k%MJI zFR8W5OqMtnvEZ&GtG`NeCD_pBz%%-w3?Ya)A0OW%D8X@m>$2yUIYaoHEM9+ZGD->0 z##GlCb0dOa+F%wVOGkHEQtm!u z$xLXk9N4gsK$TIT$Q7(2BO~;G&(p?$M*F4Pw}tWw&e$Hl7xK9w9IO&UY>KTLW#$D{;OOA^7qJ+3J|ImiCX>GAd`59+q@JJ0%ihMt_oU=b5nnmoX{tvRy0kH=p z+f>MUrw2B3Wttd`!;?#|fz1TB`@7)WT-oIW@;ssAc~_El6ae3Wl;YWs`9~?4F3mP4 zzFAQfjbmp3Lzo9IWX4l;4q+Af} zm^w=A9vMWniM5XE(*e+Z24OAuRarS*Lrqh~U%P6^U24+#7a!lB#y?u?J*JOnIrT3c z8aeg+`t_{q<K|ll6&5 zv-p|&V;edtQb3Fx<&1v2-Qo_upM3^$s~y1?u@u!;)1H6LG^=Q@u8RvF zIUDVSDW_6=O)SUuj2~RLiV792`Ee226uG7?hHhh&US%`5nypQ2Glk*Aq{qmM*^rX+ zBr=qPsJOx?YI_h^;)$|8veTp0jr3Jr3}6f$!9}9o%7TuM`)=TaGdCfE%xGc%ESw@_ zNhMrb8Au=P+<+D7Jj%8yL#qA*?J|fxot&5O3{*RM{JHLP)U^=a7O<+EJOT?JbxpGj z_)2#bUSN1Kn%GLw@3S#}UpTETPj!_dj^UxxvEg|P^jN5@s#a4GK*{s9l#>!pcvT7r zMwYQNd}Fp~^~L)YHaz+yEw#1|b(bcDVy=(XBn|hDy>y|kUQ`F=CcKIThnzB1P6L-R zGpkonI5=@jTd=q+)=Z^EaXctiDYBwb%^QysXAftTxnqC`XbD)iz+x;)I&*6prv0EB zVqcMDYm%jOkS3p|JISIM%nAYsYUqG_zoSxR{rbu}6KOeOZMGr3V(PwKAfzdrQt(o! z$_6!H#3X<^B7zhRT)%XZsrEZF@#V+gBz9n=HScH|jLeO+NN6kMbbbA7SDA=9Rm;7s z2xUP<>dx67@$~)=@lEOdp}efNZ|D?PGhg5|PKou(c0BfI-4B-G;1OCTT|HT}MCbqq zASkp)3+q~x{NCB(RU%sKkwo~&Hv{Y!TwK0OM@FSyQqJ@pxh$14LMF6Y9QhvO5KV#j zbrrw~7G+NV$K72SULQja<%eOzV)8XRtaK`^dhB;oTE|I?U&rc1a&}}@B&ps18oVdE z?D_HF6?F7&WLxeXC2C)NOFy}61_^@i;|naM@ZIJRq62Vla1^*ylfa!rQ&1sUtQ$*1 zPYqdRE)Hy(_WNq{b!hizPq^r6pM_&!;EM7i8Gbk5fO@;7MoZtC92Xg}tT+iqFnFMxyK9c1xUbHX7`WrYR%3`Bu+88F`= zLf;A-_sZ7SH%xECt?hDWdmYzyW?f3^kq;}Yw!XHu=fo$x*a9$V;IS=7bYtIXZ8&$% z3c!33O}vGkueu5dsF$+m^^_dkIi~g~ir3L#Okt8BWf@;aX#{GHoYI70WAXk(vKg-q zi?TM00AqDBO(b^{$mQhosBP7MiDSPWiv0vIlre-9oT02~NZPLlX9n%;+)n0xH|Yoq zil0AO?EE#cV}34S@O9Z>x;pB6e}S{wfIV&Z4_Di$BQt72@vSF2`qdANjkOv-N`|Rl zIY)!`Q9(U@+GWU~b`k;qt22M6=B#uSbst zsim2_o)d1@g1;l|FY1nx4qc=Djjv z%~8c2L6gp_0Cu0rL-^^D5S5X`T2E{yI#uI10`A@uO=L4QZ2b{ZGm*2o^94qLZ8K>&vM&cr|123nw`FG90#)I?!IB0# zTU?0g+J1bX<|thXX=f=u4}VmX(N+_>7dPBFlk;)eP-JWbO0veh5qDa6yXw7)RT?(U z+xK!e7!HQ!wHrN(jlrCb+#Z#c_pZ#@vB?JAaqJjIu=wfxl(p1EK)vs=n1J#bT&2oR z(xD7b94s4k(m;nSU;JLM6O%%+OV$B3aN4^*6*66(^<6H_c!&2QuaS{jGRPf`STvW06qY4J{7x})M+ybg z3YJ2kMG$Bis`s~&-rV55d&_DR>Mr7U;IZ?5_JH#BZZix;z5aXSfA)j@nln%L&|0gB zKiuBj9!w=aqWK#Ft2h)zuHI8^B=CyG%kviEr~y$a&|~z*FmX2~JTHrV_>6k|chNgy z00_cqOvW!wqR6#!--c7qs1?haUqK`l#)xCl=679A_mK^y&4Bv)ytgJvW#Nk;i}?k0 zypET%SANyKgc}oQ(l^%s^lISNn{#fWQP<7{B@s>bWx#nt4-YzpQTvvy57GkLk-kl1 zBbvATI2AJ@d{lyJy6)hW$|apMBkJ|MHjjv^J=AtmR8({B^tr8CvHw%q?Q!Imi@AO! zGcQJ~h5xlm+hb24eCR+Hc*Ns~yu0{6&i_@`{s$h|h+OUIQKca0!$$RwW10l}UDqQzqA7sT$8i0;fuUb)fNRZx9JJKe-)4 zUB&R0e-;mv=xxdcdvx0!Oa7w5d)1=+Nb$gboaz^=7^uYqM<0Z#Kc!BEeRU}|RUf<~ ztj|sl(f!tCP)buYu^<0cP)!`~L+M+aseklU){mK|gZ{(|J1zHeLZ0sr07g$o1I)Lu z<&WiylvMHrp6408o5MtxpYJE@MRuRu1Olr@hiI2IdtvPXQWlJo7dLDR9S*Dm%@g;}1rwbNc-(d{pL~w&0&3|ue{zJR^AK9IcwpC0= z{j%fJTmBtpSQ=mcptHxi2AS5Z-%X0~pk;=~J^KhNWDn#KGjxT05*JG3n{Ot7JDj7z z06~nY&8n?g>_i7a2`w-!km13h_GZ^`=&JI7!koBjb)#8-IKC@tVCl^jWdg7(8cajm z>9~IKX6|W1!4`k$sPS7p?*)iK`ThHStpfuM@S7KxttB}KD27FX_zwVcbFc<;HTyn~ zZmoxHb*Cg;oaLeT>2U3k7@MuYHQ{LoiUmFO&oLNMJPc5ZH@lg3mWg<)D+olTiHQi` zci;WqaPs)4kj>9ahAVOWz4(2e>>AIZHD!S2CN?eAJnBseHTM*1_O4r}WI{Lrz93Z| zW_~*c5@eU9WZ8q<3YoYWoT@P0ATH)KKEk8y9$(sO8mfZB8<%p@r0bM-`R!TcPknrS zIc>NiW+bQR9UXCS66B_&)F;+Q9x52_t?Q4nm1@~Egwkdneu|0qWHttfy|So0)pQg1 zpxD=Yf4~2?MuE0h3Ay&5EuTOUgVqFJD54;3Z!Zo_PIyzlfX5E!H-(PTVu)w8+JKEvM`QK%F|?!m99vuoSb< z_PrQyJmcPH*KlV z7^fIVPGv7>WYN`6uX~EyyPLJ=(U|GT!|qxWy7#8#9OHf?H8f7 zb1jygbD&!##t=Ysy50sbJJl|hz7x-bF}_zVWq6mPln!8Gtd=2GIv zwtm^9O0O3XIyN2YAG%(&YS{AB?s^z^uEN>J+DrlPM)5K!yo!S{0uKo zXiR_389baMw)-gBI{F5GZcLFC2M z>)97lH{U{f&S$$R;#~;geqaK;;tAg#+R}XTifIuydJaERhT&Vi7m(3ka$+=y*{6hNlQ*W3vkSLnv%&)kF&;zg_<0}8Qq<>xYrIyz1 zV&2D$oI|rFuFw{*TkXX-5xCx_X4$eUY%T$)A5=w|Q4M22A~X_g$_Z42>a4?$GI7h( zKA5Z;$@SO-M+TgWk*xU0?e(md)F>tbsvOBK5#{f?Ixqhwg;^aZ^0h+`YK~yhVzm0@ zr1&dr^>4_7D7dBk3XJjiOo2Si(eSE_B%Q5vR2QJ&99+_g6!Ypc5vsc(z*Zz1Bc?=O z6){;`4s~V9N>r_R7dJw-e7r3m?8`m|7Gi4RAZAQXSNiT@V6$Rt-=JsD8H%9K?>BgV z57$UzmAqdgr^9t#QL3UZvQCkjl`w05D??t-D&;e5j*_Pl>VPe%GCCleb(sa0kd*Ya z-i<`jWiir**jUhx%M?K$hAcrJab??wv5(<#@7_Fyls{+c)iaB62s^vnR=Pr0&N_CH# zl5DvMrl*!PPpGGG^-MnkA(-rFnPbWz_JiH>m-Q>j6PFUQ*iZq-ZQ9&(@ph4H^YZ39 zAI01-G`7vqP7Hd+Vn*MYk1Ff0J$2opZ96jrWvL&Ht1x2D30bKOoXwsWRTayy0u;%( z0(=9ZQSI{uPkv(pFdB|F_nxrjJZlq{{q1p)YoeQeXEXZZb`krq+Gz5Kyo=z+Cuw+w z0_H*nZgk>M4WN5|vbA<{Pit^NE;jwOnhk0uAk%Ok_qyT-pw>_u=BqK?U?tg%iVdF^ z1?gck6X-gYrSCF+9?}EQ=>-9*vX|QQ`Vhkq_o>lP7PX=1a|N4A@nhR>>rjgW#W{h~ zr7e|XC*bHjOgb_*vO}m5L^c(wOj)KBZkHEmDoFOsSbldor6jAy$l8RGiezWWE9v># z>9HY-B=w^caduoxEZ6haz9EU!?!tc==||AOD9fYE<{v$X|9<07k3Z_i)g}Yv8oPKp zg_h}o(x0$NHolXv>%*AnsK%+9(K9Gy;r}s->Lm(-{2e&d_+Ji*zeA#;|Mg8Dp-owq zpCD|uMv(=DLk#!J@Ya*BZJcqx6`f{ckuG21PAy~I?TdccIco-z0ucdcr+sG>KK~W5 z#T(sv+Ie=z6(jh-pO;pK!8asW!n-cE0mKuB2AU})&ubg;tI|45F1&6JA_|BL$vVO` z6T{ul1b8=L-u0PxX=nmAxj4Q{xvYy9BrmU9m8dfhIb{}$$Q(FUFQ2bRX4{{%!SCXz z8D%-QI=q}99TrQ@Cn_bNT*fH~MhzUGR4BiFMvLLq6J)ged-@*rIw$Xrb~F*0l&0PP zpfJdRvNWb~Lc5k)W4%X@lcFisIZ@@)uvT%ptyuQf6h48F+!vgGm*Jsq{bkf-X5_I{ zGdiqKb|i*IRtB~{16|bG0Wev6z!Zqj*eLUEo4pzW+u}AwgRhmr_)MM`zyTM-e$2jn zmlzUJr~u%ZW>{9lX`^yXcy(JJU%o#3$^3*xaJ{O3rV*Lo3BJC@sRxbs%oeXP#vgm# zgo*D2(>_Mm=RG(-b|{W-Onq#3)hVQ5qO-x%kS?Ym(Q*9UmubJ~NOZgYg^3#jj2vb$ zesdohKd&eHQ0(OmjjZDe#d+gUHrPc1$xMyq2cX+KF}KOe6tRB-SC$CfR(j9vAp9O+FV~>L+Z2Z+M1)SjM`42+DW!x`w)J;$(I!>Rfd(Nzhq?oQTzSgJVZ zt1xn$Ypp#%$xr4kX7frCKdPgM!d}MBEd&J&l=^W@n=W(n1wSFbY`ozW9%i|Gml2Of zBofgq_eD94bV_quGl|b?`e17(>m1i+WR>B}zpX~r9M@?gU2D9V8M7LUmx%V?sJsH* z;-igLXIS$$kQO45T~CHEmSdjQI`ahaC$Wz|Xm-58tX_k3n$w>S**oP+)*;Blk(F6k zU7&?nloAJXM+c2gCV&p$e9?BYCmL%;yznqbN2~9~>J)BvmV2_&|hB@h~#W z*tMmDBg12LlN<&1tkipkdVF&8Jq(_JYb$}{F;mP^NRtO-dK#X=CqV^C<()djB3cr( z2tczTjC%ZcqEOT?dJportjruJL%z`ObJw6&)Z(dH`G#I&_Sw{|YszwmO#PWFH858u z7{giuKbC&x$&IE+rfZ(Ti7NXEAH0HHdm79QU)LHa5tOi*TZQ(do+ZV5LDgBV!Rm=k z2sDV=hF4bjcVJ9WMM|Z){W6e2}FE101#nO=_ySao4s5SOcSO<_uHAsN` zlFFi@4%xK=4{{d4B2I&yhMLf7;$vI|QhPaW!jDN(zt+Pya*PD|(_bli>hLPK`j65x zoDwf~G6s4&_)ghfmKUiS|LDe1{mgE<>SS$;eN8&^6y{#dkexxJpAgx_G_jc{R2M)> zn4D+gVR4v7i*t-s$B)68AKi=cK|}<6Z}Uc6Zb%Wu_B~@M&BCJfTYQGzW01RPr7ok= zf<&usZswHdUD_y$y-9UnmyP%7oUM(9w{ObYV7Ll@+{j9wmMPCQ3E*>AGex~F(a2~A zhxuc7C$wHcVCqR74cb>hUEtcJsvBpGTFr|{335YlKTR^ITbfZ|nUfMr<#=pieD@!J zxtbl+vs>XDlIupuMjPT|LP*nNPvQC*-3$7iGH5);n3D@s2w{?u?KGuuv}qDKw=h@T z-(S&ecacM1NINvy74b3H7nv!64EorLX+keqYRV$ur3 z0FToH$g8@vMhyhLy~7?+G!6TA#*Fb6zfr$7O6OX zjh;uN+j513aAv}!-N@5p97{QaP&?avym?7M_5m#TG-BArh1b)?IJ3#R*Ge*qjfPdj zc3#xspsl3?K$CSu8uhCd%Cw^VwvJT`zITjUZi^8^=xdo4R@VyBaSa@*`ywvsT+mHV z6r&TQ)@Mkc@ZW5w=9z9%12F#@%1CV}@W1=rP5(Ut z*$z}H8Zqzau&fH76596epYbkRsANKQztbjr__q&Lry4qyKA_O2Y9J)c#6XKcAOz!I zoX?YY81{~1j9&tWzS4ke$hEnw>Cl1^Uh*OhjhQE)s||-yTn85n_$C?;H0C4(LikpXDNRnjFsTKFT(I7c*%I{bea`Uk^rSgLi!eN_TC+F;6BCKyT`%gBXrx4`s zcL$#F&QAw}v24~%EQ!kK)XW)r1!-_VV(c18uLmS8neAzMgL**JFhGX3U($VvvGoOE zW+v*FDCrmHt_7%Sd-j|a=$L&8+=VV*!IWl+z3auXIEdm^zPf!2cp5kN{>EpXBHEwk zA!&Od`0MlmJp}sGyilU`<=SD;4*(2q`cK#3w#Qmo)kwlJvnC3s{`8S!8;o{tZ z>IgbiWx;y&vDzhduGFNmU~IQ&X2-Rz$i8TY^*OZY;kUzRr@`>SjPCwDIlRl3Y<`R@ uTNx*hsZ$@+!YC&&wr3s^3gadrq%0OC&qTpg#*i@)|4sbyAD3W1rv40DdLn-S literal 0 HcmV?d00001 diff --git a/Docs/项目说明.md.txt b/Docs/项目说明.md.txt new file mode 100644 index 0000000..836e6f5 --- /dev/null +++ b/Docs/项目说明.md.txt @@ -0,0 +1,218 @@ +全球化智力互联:Agent 赋能平台全栈工程架构与实施白皮书 +人工智能代理(AI Agents)正迅速从实验性的脚本演变为具备自主决策能力、工具调用能力以及多代理协同能力的生产力单元。随着模型能力的增强,企业对 Agent 的需求已不再满足于简单的聊天接口,而是要求构建一种能够整合异构数据、灵活切换底层模型、支持跨框架互操作并具备透明计费体系的工程化平台。本报告旨在详细阐述一个全栈 Agent 赋能平台的五个核心技术平面,探讨其如何通过模型上下文协议(MCP)、代理间通信协议(A2A)以及执行单元(EU)计费模型,构建一个标准化的智力资源分发与治理体系。 +第一平面:全域数据接入与工具化治理 +在 Agent 生态系统中,数据不仅是静态的背景知识,更是可被感知的环境和可被操作的工具。第一平面的核心目标是将零散、异构的外部 API 资源转化为 Agent 可理解、可调用的标准“工具集”。 +数据接入的多样性与 RapidAPI 生态集成 +平台将 RapidAPI 作为核心数据供应源,利用其超过 16,000 个 API 的庞大市场,为 Agent 提供涵盖气象、金融、物流、社交媒体等全领域的行动能力 1。传统的 REST API 接入通常面临文档不规范、参数描述模糊以及身份验证流程复杂等问题,这直接限制了大型语言模型(LLM)对工具的理解能力。为解决这一痛点,平台引入了“LLM-Ready API”转换机制。 +通过集成 Nokia API Hub 的技术理念,平台能够为每个 API 端点自动生成专用的工具模式(Tool-per-endpoint Schema),并将其托管在专用的 MCP 主机上 2。这种方式允许 Agent 开发者通过单一的 Rapid 应用密钥(x-rapidapi-key)管理所有订阅的 API,极大地简化了身份验证逻辑 2。 +模式提取与语义增强技术 +为了使 API 端点能够被 LLM 准确调用,平台采用了基于 APILLAMA 的结构化知识提取技术。APILLAMA 利用经过微调的 Llama-3-8B-Instruct 模型,通过软提示(Soft Prompt)技术,将原始的 API 文档转换为符合 Pydantic 或 JSON Schema 规范的结构化定义 1。相比于传统的通用模型,APILLAMA 在提取端点描述和参数约束方面表现出更高的准确性,有效避免了 Agent 在参数构造时的“幻觉”现象 1。 +在工程实践中,平台要求 API 的 OpenAPI 规范必须包含详尽的自然语言提示。研究表明,LLM 极度依赖操作摘要(Summary)和描述(Description)字段来理解端点的意图 3。例如,将一个简单的 submit request 摘要替换为 为客户创建新的技术支持工单,能显著提升 Agent 在动态动作映射中的识别成功率 3。 +异构数据源的动态管理 +除了 RapidAPI,平台还兼顾了企业内部私有数据和其他第三方 SaaS 接口。通过 FastMCP 等工具,平台能够直接加载本地的 OpenAPI (Swagger) 定义文件,并实时生成 MCP 服务器代码 4。这种动态热加载机制允许平台在不中断服务的情况下,对 API 版本进行更新或对路由映射(Route Maps)进行自定义调整 3。 +下表展示了平台在数据接入平面中对不同 API 类型的处理策略: + +特性 +RapidAPI 集成 +自定义/私有 API +传统库函数封装 +接入方式 +统一 API Key 代理 2 +OpenAPI/Swagger 导入 4 +Python 函数装饰器 (@tool) 5 +元数据生成 +自动映射 + 人工微调 +APILLAMA 结构化提取 1 +源代码注释 (Docstrings) 6 +安全性 +平台侧密钥托管 +OAuth2/mTLS 穿透 7 +沙箱化运行环境 8 +计费采集 +API 调用成本折算 EU +运行时资源消耗统计 +内部配额管理 + +第二平面:模型抽象层与动态治理体系 +模型 management 层是平台的“大脑指挥部”,负责处理模型能力、成本与可用性之间的复杂平衡。该平面通过统一的模型抽象接口,实现了对底层 LLM 服务商的屏蔽,支持按需实时更换模型。 +统一网关与模型治理架构 +平台集成了 LiteLLM 作为核心的模型代理网关。LiteLLM 充当了应用程序与超过 100 个模型 API 之间的翻译层,提供了一个 OpenAI 兼容的统一端点 9。这种架构允许开发者在不修改业务代码的前提下,通过 YAML 配置文件灵活定义模型组(Model Groups) 11。 +在治理维度上,平台通过 LiteLLM Proxy 实现了复杂的路由、负载均衡和故障转移机制。当主模型服务商(如 OpenAI)发生中断或触发频率限制时,系统会自动将请求切换至备份服务商(如 Anthropic 或自建的本地模型服务) 10。这种高可用性设计对于生产级的 Agent 应用至关重要。 +模型性能监控与成本归因 +为了实现精确的计费和性能评估,平台在模型管理层嵌入了全链路追踪(Tracing)功能。利用 LangSmith 或 OpenTelemetry 集成,平台可以记录每一次模型调用的延迟、输入输出长度以及模型特定的元数据 13。 +模型治理的关键在于“上下文窗口管理”。平台能够自动检测不同模型的上下文限制,并根据任务需求自动执行会话截断或总结逻辑,确保 Agent 不会因超出 token 限制而失败 8。此外,通过集成 OpenRouter 等第三方聚合服务,平台可以进一步降低初创团队的账户管理复杂度,实现“一票制”结算 10。 +模型选择的维度对比 +下表分析了平台支持的主要模型类别的适用场景: + +模型类别 +典型代表 +核心优势 +缺点 +平台应用策略 +通用闭源大模型 +GPT-4o, Claude 3.5 +推理能力极强,支持复杂工具调用 14 +成本高,隐私风险 +用于复杂业务编排和最终决策 17 +垂直领域模型 +Granite, Llama-3 +特定任务(如代码编写、API 提取)效率高 1 +通用性较弱 +用于数据预处理和结构化信息提取 1 +端侧/本地模型 +Ollama, LM Studio +低延迟,数据主权隔离 12 +依赖硬件,能力受限 +用于轻量级反思和敏感数据脱敏 + +第三平面:单体 Agent 的协议化封装与自治 +每一个单体 Agent 被定义为一个具有明确边界、特定技能且符合行业标准协议的功能单元。平台强调单体 Agent 内部逻辑的极简性,将复杂的编排交由用户在本地完成。 +极简逻辑与原子化设计 +平台定义的单体 Agent 通常只包含其角色描述(Role)、目标(Goal)和一系列被授权访问的工具(Tools) 8。这种原子化设计使得每个 Agent 能够专注于特定的专业任务,如“需求分类代理”、“账单处理代理”或“紧急情况检测代理” 17。 +核心通信协议:MCP、API 与 A2A +平台的核心竞争力在于其对多种 Agent 通信协议的全面支持,确保了 Agent 能够在不同的宿主环境中自由运行。 +1. 模型上下文协议 (MCP) +MCP 由 Anthropic 推出,旨在解决 Agent 与工具之间硬编码集成的难题 7。在平台中,单体 Agent 既可以作为 MCP Client 访问外部数据源,也可以被封装为 MCP Server 暴露给 IDE(如 Cursor)或其他 AI 应用 19。 +传输层支持:平台支持基于 stdio 的本地快速通信和基于服务器发送事件(SSE)的远程流式传输 7。 +资源与工具发现:MCP 允许宿主应用动态列出、调用和观察 Agent 暴露的所有能力,实现真正的“即插即用” 20。 +2. 代理间通信协议 (A2A) +A2A 协议由 Google 引入并捐赠给 Linux 基金会,它关注于代理之间的协作和任务委派 22。 +Agent Card(代理名片):平台为每个 Agent 生成一个 JSON 格式的“代理卡”,描述其技能(Skills)、端点(Endpoints)和身份验证要求 22。这使得 Agent 能够像在社交网络中一样彼此发现。 +任务生命周期管理:A2A 标准化了任务(Task)的提交、轮询、订阅和结果返回流程。任务状态包括“已提交”、“运行中”、“需要输入”、“已完成”等 22。 +工件(Artifacts)交换:Agent 协同产生的结果(如生成的代码文件或分析报告)通过标准化的工件格式进行传递,支持多部分(Parts)数据的流式处理 22。 +本地化运行与 API 暴露 +对于开发者,单体 Agent 接口提供了标准的 REST API。这种设计确保了 Agent 可以轻松集成到传统的 Web 应用中,同时也支持异步轮询和基于 SSE 的实时状态更新,以优化长耗时任务的用户体验 15。 +第四平面:以 MCP 为核心的本地编排与集成平面 +在 Agent 赋能平台的工程化实践中,第四平面的核心逻辑已从传统的框架绑定转向“MCP-First”集成策略。通过将平台提供的子 Agent 服务封装为标准的 MCP 服务器,用户可以在本地利用日益成熟的 MCP 生态系统进行灵活编排。 +MCP 作为本地集成的“通用语言” +MCP 已成为连接 AI 模型与外部工具、数据的行业标准协议 7。平台将每个单体 Agent 及其背后的数据接口抽象为 MCP 节点,支持用户在本地环境通过 stdio(用于本地进程间通信)或 SSE(用于远程流式服务)进行无缝接入。 +这种“协议优先”的设计避免了为每个开源框架编写专用插件的重复劳动。当一个 Agent 符合 MCP 规范时,它不仅能被开发者的业务逻辑调用,还能直接在 IDE(如 Cursor)、聊天客户端(如 Claude Desktop)以及各类企业级 Agent 后台中作为原生工具使用。 +主流 Agent 框架对 MCP 的深度支持 +目前市面上主流的 Agent 开发框架均已实现了对 MCP 的原生或适配器支持,这使得本地编排变得异常简单: +LangChain 适配方案:LangChain 通过 langchain-mcp-adapters 库,能够将 MCP 服务器定义的 Tools、Resources 和 Prompts 自动转换为 LangChain 兼容的组件。开发者只需初始化一个 MultiServerMCPClient,即可同时加载分布在不同本地路径或远程 URL 的 Agent 技能。 +CrewAI 集成机制:CrewAI 在 Agent 类中直接提供了 mcps 字段。开发者只需提供 MCP 服务器的端点信息(如 SSE URL 或特定的 Stdio 启动命令),框架即可自动发现工具并注入到代理的执行上下文中。 +Microsoft AutoGen 扩展:AutoGen v0.4+ 版本引入了 StdioMcpToolAdapter 和 SseMcpToolAdapter,允许将外部 MCP 协议包装为 AutoGen 代理可识别的 Action 单元,极大地增强了跨语言和跨环境的协作能力。 +协议化集成的工程优势 +解耦与复用:工具逻辑在 MCP 服务器端维护,编排逻辑在本地维护,双方通过 JSON-RPC 2.0 契约通信,任何一方的升级都不会导致系统崩溃。 +动态发现机制:本地编排器可以在运行时通过 tools/list 请求动态发现 Agent 的新技能,无需手动更新本地代码中的工具定义。 +安全隔离:用户可以在本地沙箱中运行高风险的 MCP 工具(如文件操作系统),而将复杂的逻辑计算卸载到云端平台,确保数据主权与执行安全的平衡。 +下表展示了以 MCP 为核心的集成链路: + +组件层级 +实现方式 +技术标准 +能力供应方 +平台 Agent 导出为 MCP Server 2 +JSON-RPC 2.0 / stdio / SSE 7 +连接层适配 +MCPServerAdapter / MultiServerMCPClient +MCP SDK (Python/TS/Go) 43 +业务逻辑层 +用户本地 Python/JS 逻辑或 DSL 配置 +OpenAPI 3.0 / Pydantic +宿主框架 +LangGraph, CrewAI, AutoGen, Cursor +框架原生接口 + MCP Adapter + +第五平面:基于执行单元 (EU) 的资源计量与计费模型 +为了解决 Token 计费模型在 Agent 场景下的不确定性(如 Agent 的过度反思或重复调用导致的 Token 激增),平台引入了基于执行时间与资源消耗的**执行单元(Execution Unit, EU)**计费模式。 +执行单元 (EU) 的定义与公式 +执行单元(EU)是一个衡量计算、内存和网络资源消耗的综合性指标。该模型参考了 AWS Lambda、Google Cloud Run 以及 LUMI 超算中心的计费实践 26。 +一个典型的 EU 计算公式如下: + +$$EU = \left( \max\left( \lceil \frac{vCPU_{Allocated}}{Step_{CPU}} \rceil, \lceil \frac{Memory_{Allocated}}{Step_{Mem}} \rceil \right) \times T_{Runtime} \right) \times \gamma_{Model\_Tax}$$ +其中: +$vCPU_{Allocated}$:分配给该 Agent 任务的虚拟处理器核数 28。 +$Memory_{Allocated}$:分配的内存容量(例如以 2GB 为一个计费切片) 27。 +$T_{Runtime}$:任务实际执行的 wall-clock 时间(通常精确到毫秒级) 26。 +$\gamma_{Model\_Tax}$:模型权重因子,反映了底层调用特定高级模型(如 GPT-4o)时的额外许可溢价。 +计费引擎的架构实施 +计费平面的核心是实时计量引擎。该引擎通过以下步骤确保收入不流失并提供透明的客户账单: +事件采集:利用 Golang 编写的高性能计量服务,通过 NATS 消息队列监听 Agent 的启动(Start)和停止(Stop)事件 31。 +配额管理:系统在任务启动前预扣除一定额度的 EU。如果账户余额低于阈值,则拒绝启动,防止欠费运行 32。 +动态调优:通过 Datadog 或 Prometheus 监控函数调用的内存峰值,建议用户“右调”资源分配,以在性能与成本间取得最优解 34。 +实时仪表盘:为客户提供可视化看板,展示按 Agent、按特征、按环境划分的成本明细,并利用 AI 预测未来的支出趋势 32。 +EU 计费与 Token 计费的对比分析 + +维度 +Token 计费模型 +执行单元 (EU) 计费模型 +透明度 +较低。用户难以理解隐藏的推理链 Token 消耗 32 +较高。类似于云计算实例,运行多久付多久费 34 +激励方向 +鼓励生成短文本。可能损害 Agent 的推理深度 +鼓励代码和算法优化。更短的运行时间意味着更低的费用 35 +架构适配性 +仅适用于单次 API 调用 +完美契合 Serverless 函数和长时运行的自治任务 38 +成本管控 +难以实时熔断。可能在分钟内产生巨大账单 +易于实施基于时间配额的强制停机逻辑 33 + +工程化平台治理:安全、隔离与多租户 +作为一个赋能平台,确保多租户环境下的数据隔离和系统稳定性是商业化落地的先决条件。 +多层级隔离机制 +平台在计算、数据和网络三个层级实施了严格的隔离策略: +计算隔离:利用微虚拟机(MicroVMs,如 Firecracker)或受限容器(gVisor)运行 Agent 逻辑。通过设置硬性的 CPU 和内存 Limit,防止“吵闹邻居”(Noisy Neighbor)效应影响其他租户 40。 +数据隔离:数据库采用行级安全性(RLS)和按租户加密(Per-tenant Encryption)。所有的 SQL 查询都必须带上 TenantID 过滤器 40。 +网络隔离:为敏感的 Agent 编排提供虚拟私有云(VPC)和私有子网,限制对后端数据库和凭据存储的非授权访问 42。 +身份验证与权限管控 (RBAC/ABAC) +平台集成了 Pomerium 作为智能访问关口。与传统的基于 API Key 的简单验证不同,Pomerium 能够集成 Okta 等身份提供商,实施基于上下文的访问策略(例如:仅允许特定部门的成员在工作时间内调用具有财务权限的 Agent) 9。 +运行时监控与审计 +全方位的观测能力对于 Agent 调试至关重要。平台在每个 Agent 的运行环境中注入了 Sidecar 代理,实时采集: +性能指标:CPU 利用率、内存驻留集大小、网络延迟。 +Agent 轨迹:记录所有的工具调用请求和模型推理过程,生成可交互的轨迹图(Traces) 37。 +合规审计:保存完整的对话日志和任务工件,以满足 SOC 2 或 HIPAA 等合规性要求 9。 +结论:构建 Agentic Web 的基础设施 +本报告详述的 Agent 赋能平台,不仅是一个简单的工具集,更是一个旨在标准化未来“智力交换”的基础设施。通过第一平面对 RapidAPI 等海量资源的工具化封装,平台解决了数据获取的广度问题;通过第二平面的多模型动态切换,平台保障了大脑的可替代性与成本可控性。 +在协议层面,MCP 与 A2A 的深度整合,标志着平台从封闭系统向开放生态的转变。以 MCP 为核心的第四平面设计,使得平台 Agent 能够以标准插件的形式瞬间触达全球主流开发框架和 IDE。 这种原子化设计结合本地编排的灵活性,赋予了用户构建复杂业务逻辑的主动权。而基于 EU 的计费模型,则为 Agent 这一新型生产力单元提供了最符合工程直觉的价值衡量尺度。 +随着 Agent 技术的不断演进,平台未来的研究重点将转向: +自治成本优化:开发能够自主选择最经济路径(模型 + 工具组合)的元调度器。 +跨代理信誉体系:基于任务完成率和资源效率,为 A2A 生态中的代理建立信任评分。 +异构计算卸载:根据 Agent 的计算强度,自动在端侧设备与云端高性能集群之间动态分配任务载荷。 +通过实施这五个维度的技术标准,该平台将为企业提供一个稳健、透明且易于扩展的 Agent 运行环境,助力从“模型优先”时代平稳过渡到“代理优先”时代。 +引用的著作 +ToolFactory: Automating Tool Generation by Leveraging LLM to Understand REST API Documentations - arXiv, 访问时间为 十二月 20, 2025, https://arxiv.org/html/2501.16945v1 +Consume APIs using AI - RapidAPI, 访问时间为 十二月 20, 2025, https://docs.rapidapi.com/docs/consume-apis-using-ai +Automate AI Workflows with OpenAPI to Build LLM-Ready APIs - Gravitee, 访问时间为 十二月 20, 2025, https://www.gravitee.io/blog/ai-workflows-with-openapi-and-llm-apis +How to Connect an LLM to a REST API - FastMCP, 访问时间为 十二月 20, 2025, https://gofastmcp.com/tutorials/rest-api +Tools - CrewAI Documentation, 访问时间为 十二月 20, 2025, https://docs.crewai.com/en/concepts/tools +12 Best Technical Documentation Templates for 2025 | DocuWriter.ai, 访问时间为 十二月 20, 2025, https://www.docuwriter.ai/posts/technical-documentation-templates +What is Model Context Protocol (MCP)? A guide - Google Cloud, 访问时间为 十二月 20, 2025, https://cloud.google.com/discover/what-is-model-context-protocol +Agents - CrewAI Documentation, 访问时间为 十二月 20, 2025, https://docs.crewai.com/en/concepts/agents +LiteLLM vs. Pomerium: Key Differences and When to Use Each One, 访问时间为 十二月 20, 2025, https://www.pomerium.com/blog/litellm-vs-pomerium +LiteLLM: A Guide With Practical Examples - DataCamp, 访问时间为 十二月 20, 2025, https://www.datacamp.com/tutorial/litellm +How Model Access Works - LiteLLM, 访问时间为 十二月 20, 2025, https://docs.litellm.ai/docs/proxy/model_access_guide +Olla vs LiteLLM - Comparison Guide for LLM Infrastructure, 访问时间为 十二月 20, 2025, https://thushan.github.io/olla/compare/litellm/ +Trace with AutoGen - Docs by LangChain, 访问时间为 十二月 20, 2025, https://docs.langchain.com/langsmith/trace-with-autogen +How to integrate LangGraph with AutoGen, CrewAI, and other frameworks - LangChain docs, 访问时间为 十二月 20, 2025, https://docs.langchain.com/langsmith/autogen-integration +Designing APIs for LLM Apps: Build Scalable and AI-Ready Interfaces - Gravitee, 访问时间为 十二月 20, 2025, https://www.gravitee.io/blog/designing-apis-for-llm-apps +Why are we still pretending multi-model abstraction layers work? : r/LLMDevs - Reddit, 访问时间为 十二月 20, 2025, https://www.reddit.com/r/LLMDevs/comments/1owtio8/why_are_we_still_pretending_multimodel/ +How to Build a Multi-Agent System (Part 1/3): From Problem to Design, 访问时间为 十二月 20, 2025, https://www.intotheagileshop.com/post/how-to-build-a-multi-agent-system-part-1-3-from-problem-to-design +How to Build Your Own Agentic AI System Using CrewAI | Towards Data Science, 访问时间为 十二月 20, 2025, https://towardsdatascience.com/how-to-build-your-own-agentic-ai-system-using-crewai/ +Model Context Protocol (MCP) | Cursor Docs, 访问时间为 十二月 20, 2025, https://cursor.com/docs/context/mcp +Build Your Own Model Context Protocol Server | by C. L. Beard | BrainScriblr | Nov, 2025, 访问时间为 十二月 20, 2025, https://medium.com/brainscriblr/build-your-own-model-context-protocol-server-0207625472d0 +Tools - Model Context Protocol, 访问时间为 十二月 20, 2025, https://modelcontextprotocol.io/docs/concepts/tools +What is A2A protocol (Agent2Agent)? - IBM, 访问时间为 十二月 20, 2025, https://www.ibm.com/think/topics/agent2agent-protocol +A2A Protocol, 访问时间为 十二月 20, 2025, https://a2a-protocol.org/latest/ +Why Agent2Agent Matters for Multi-Agent Systems? | by Ricardo Olivieri | IBM IT Automation and AI | Dec, 2025, 访问时间为 十二月 20, 2025, https://medium.com/ibm-watson-aiops/why-agent2agent-matters-for-multi-agent-systems-45c070fdd1b9 +What is Serverless Architecture? A Practical Guide with Examples - Middleware.io, 访问时间为 十二月 20, 2025, https://middleware.io/blog/serverless-architecture/ +Demystifying Serverless Costs on Public Platforms: Bridging Billing, Architecture, and OS Scheduling - arXiv, 访问时间为 十二月 20, 2025, https://arxiv.org/html/2506.01283v2 +Billing policy - Documentation - LUMI, 访问时间为 十二月 20, 2025, https://docs.lumi-supercomputer.eu/runjobs/lumi_env/billing/ +Can anyone explain to me in simple terms what vCPU means? I have been scratching my head over this. : r/golang - Reddit, 访问时间为 十二月 20, 2025, https://www.reddit.com/r/golang/comments/1irz945/can_anyone_explain_to_me_in_simple_terms_what/ +Memory and vCPU considerations for AWS Batch on Amazon EKS, 访问时间为 十二月 20, 2025, https://docs.aws.amazon.com/batch/latest/userguide/memory-cpu-batch-eks.html +Getting to the Bottom of Serverless Billing - arXiv, 访问时间为 十二月 20, 2025, https://arxiv.org/html/2506.01283v1 +How to Implement Scalable Usage-Based Billing for AI Workloads - CloudRaft, 访问时间为 十二月 20, 2025, https://www.cloudraft.io/blog/usage-based-billing-for-ai-workloads +How to Build Custom Billing Systems for AI Agents: A Complete Guide, 访问时间为 十二月 20, 2025, https://www.getmonetizely.com/articles/how-to-build-custom-billing-systems-for-ai-agents-a-complete-guide +AI Billing Showdown: 6 Billing Platforms for AI Agents | Paid.ai blog, 访问时间为 十二月 20, 2025, https://paid.ai/blog/billing/ai-billing-showdown-6-billing-platforms +Minimizing Development Costs with Serverless Architecture - IntexSoft, 访问时间为 十二月 20, 2025, https://intexsoft.com/blog/minimizing-development-costs-with-serverless-architecture/ +Impact of Serverless Architecture on Software Development Costs | Zetaton, 访问时间为 十二月 20, 2025, https://www.zetaton.com/blogs/the-impact-of-serverless-architecture-on-software-development-costs +Automated Billing Software Development: A Step-by-Step Guide - Appinventiv, 访问时间为 十二月 20, 2025, https://appinventiv.com/blog/automated-billing-software-development/ +AI Agent Costs on Databricks: A Complete Guide to Pricing, Optimization, and Real-World Examples, 访问时间为 十二月 20, 2025, https://community.databricks.com/t5/technical-blog/demystifying-databricks-pricing-for-ai-agents/ba-p/122281 +Top 5 Things to Know Before Using Serverless Computing - CloudOptimo, 访问时间为 十二月 20, 2025, https://www.cloudoptimo.com/blog/top-5-things-to-know-before-using-serverless-computing/ +Serverless Architecture: What It Is & How It Works | Datadog, 访问时间为 十二月 20, 2025, https://www.datadoghq.com/knowledge-center/serverless-architecture/ +Real-Time Monitoring for Multi-Tenant Workflows | Prompts.ai, 访问时间为 十二月 20, 2025, https://www.prompts.ai/en/blog/real-time-monitoring-for-multi-tenant-workflows +Multi-Tenant Architecture: The Complete Guide for Modern SaaS and Analytics Platforms -, 访问时间为 十二月 20, 2025, https://bix-tech.com/multi-tenant-architecture-the-complete-guide-for-modern-saas-and-analytics-platforms-2/ +Building Multi-Tenant n8n Workflows for Agency Clients, 访问时间为 十二月 20, 2025, https://www.wednesday.is/writing-articles/building-multi-tenant-n8n-workflows-for-agency-clients +Model Context Protocol - GitHub, 访问时间为 十二月 20, 2025, https://github.com/modelcontextprotocol diff --git a/README.md b/README.md new file mode 100644 index 0000000..30384fa --- /dev/null +++ b/README.md @@ -0,0 +1,155 @@ +# Agent 赋能平台:全栈工程架构与实施 + +## 📌 项目概述 + +Agent 赋能平台是一个旨在将 AI Agents 从实验性脚本演进为工业级生产力单元的全栈工程化平台 。平台通过构建标准化的智力资源分发与治理体系,整合异构数据,支持多模型动态切换,并具备透明的计费与安全隔离机制 。 + +## 🏗 五大核心技术平面 + +### 第一平面:全域数据接入与工具化治理 + +核心目标是将异构 API 资源转化为 Agent 可理解、可调用的标准“工具集” 。 + +* +**LLM-Ready API 转换**:集成 RapidAPI 生态,利用超过 16,000 个 API 提供全领域能力 。 + + +* +**APILLAMA 技术**:采用微调的 Llama-3-8B-Instruct 模型,通过软提示技术将 API 文档转换为 Pydantic 或 JSON Schema 规范 。 + + +* +**语义增强**:通过详尽的操作摘要和描述字段,消除 Agent 在参数构造时的“幻觉”现象 。 + + + +### 第二平面:模型抽象层与动态治理 + +作为平台的“大脑指挥部”,负责屏蔽底层模型差异并确保高可用性 。 + +* +**统一网关**:集成 LiteLLM 代理网关,提供与 OpenAI 兼容的统一端点,支持超过 100 个模型 API 。 + + +* +**高可用路由**:支持模型组定义,实现自动负载均衡与跨服务商(如从 OpenAI 切换至 Anthropic)的故障转移 。 + + +* +**上下文管理**:自动处理不同模型的 token 限制,执行会话截断或总结逻辑 。 + + + +### 第三平面:单体 Agent 协议化封装 + +定义具有明确边界和原子化能力的 Agent 单元 。 + +* +**原子化设计**:每个 Agent 仅包含角色(Role)、目标(Goal)和授权工具集(Tools) 。 + + +* **通信协议支持**: +* +**MCP (Model Context Protocol)**:解决工具集成硬编码难题,支持 stdio 和 SSE 传输 。 + + +* +**A2A (Agent-to-Agent)**:通过 Agent Card(代理名片)实现代理间的发现、任务委派与工件交换 。 + + + + + +### 第四平面:以 MCP 为核心的本地编排 + +采用“MCP-First”策略,使平台服务能无缝集成至主流生态 。 + +* +**通用集成**:支持通过 MCP 协议直接接入 Cursor、Claude Desktop 等 IDE 和客户端 。 + + +* +**框架适配**:提供对 LangChain、CrewAI 和 Microsoft AutoGen 的原生适配器支持 。 + + + +### 第五平面:执行单元 (EU) 计费与治理 + +引入基于资源消耗的计费模型,解决 Token 计费的不确定性问题 。 + +* **EU 计费公式**: + + + + + + +* +**安全隔离**:利用 Firecracker (MicroVM) 或 gVisor 实施计算隔离,通过 RLS 确保租户数据安全 。 + + + +--- + +## 🛠 技术栈 + +* +**模型/提取**:Llama-3-8B, APILLAMA + + +* +**网关/治理**:LiteLLM, Pomerium + + +* +**协议**:MCP, A2A, JSON-RPC 2.0 + + +* +**基础设施**:Firecracker, NATS, Golang + + +* +**监控**:Datadog, Prometheus, LangSmith + + + +--- + +## 🚀 快速集成 + +平台 Agent 支持多种集成方式: + +| 集成对象 | 实现方式 | +| --- | --- | +| **LangChain** | 使用 `langchain-mcp-adapters` 初始化 `MultiServerMCPClient` + + | +| **CrewAI** | 在 Agent 类中配置 `mcps` 字段指向 SSE URL + + | +| **AutoGen** | 使用 `StdioMcpToolAdapter` 封装 Action 单元 + + | +| **IDE (Cursor)** | 直接添加标准的 MCP 服务器端点 + + | + +--- + +## 🔮 未来规划 + +* +**自治成本优化**:开发元调度器自主选择最经济的模型+工具组合 。 + + +* +**跨代理信誉体系**:建立基于任务完成率的信任评分机制 。 + + +* +**异构计算卸载**:实现任务在端侧设备与云端集群间的动态分配 。 + + + +您是否需要我为您编写具体的 MCP 服务器部署脚本或 EU 计费引擎的配置示例? \ No newline at end of file