From 5ac75512f483778cb93e64c27379aaa613fc9f30 Mon Sep 17 00:00:00 2001 From: Trinh Dai Phuc <1653068@student.hcmus.edu.vn> Date: Sat, 22 Aug 2020 14:03:28 +0700 Subject: [PATCH] Set up envoy and make file for easy docker-compose run and build --- Dockerfile.app | 2 - Makefile | 22 +++++- clients/index.html | 31 +++++++++ clients/main.go | 45 +++++++++++++ docker-compose.yml | 20 ++++-- envoy-proxy.yaml | 64 ++++++++++++++++++ protos/entity.pb.go | 150 +++++++++++++++++++++-------------------- protos/entity.pb.gw.go | 3 +- protos/entity.proto | 3 +- protos/proto.pb | Bin 0 -> 70199 bytes services/listEntity.go | 3 +- 11 files changed, 259 insertions(+), 84 deletions(-) create mode 100644 clients/index.html create mode 100644 clients/main.go create mode 100644 envoy-proxy.yaml create mode 100644 protos/proto.pb diff --git a/Dockerfile.app b/Dockerfile.app index 7d2f0cc7..351bcf30 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -16,6 +16,4 @@ WORKDIR /app COPY --from=build /app/src/bin/ /app/ -RUN ls - ENTRYPOINT ["/app/server"] diff --git a/Makefile b/Makefile index 7794e18a..6efa8940 100644 --- a/Makefile +++ b/Makefile @@ -3,14 +3,32 @@ pb: -Ithird_party/googleapis \ -Ithird_party/grpc-gateway \ --go_out=plugins=grpc:protos/ \ - --grpc-gateway_out=logtostderr=true:protos/ + --grpc-gateway_out=logtostderr=true:protos/ \ + --include_imports --include_source_info \ + --descriptor_set_out=protos/proto.pb build: - go build -o bin/grpc-service main.go - go build -o bin/gateway gateway/main.go + - go build -o bin/client clients/main.go + +client: + - ./bin/client grpc-service: - ./bin/grpc-service gateway-service: - - ./bin/gateway \ No newline at end of file + - ./bin/gateway + +dc-gateway: + - docker-compose up grpc_gateway grpc_app mongo + +dc-gateway-build: + - docker-compose --build up grpc_gateway grpc_app mongo + +dc-envoy: + - docker-compose up envoy-proxy grpc_app mongo + +dc-envoy-build: + - docker-compose up --build envoy-proxy grpc_app mongo \ No newline at end of file diff --git a/clients/index.html b/clients/index.html new file mode 100644 index 00000000..122677d0 --- /dev/null +++ b/clients/index.html @@ -0,0 +1,31 @@ + + + +
+ + + + +38{g*(;e$D6@Cv>HxSr< z>ltm%J9Q`Q_o0W?698UJ3c?tgrc+A>f&s3Ia@j3%tn?PGyD_Y?8{!< zTox;42ZnFU2327oyc*bZcbZ*lt!5V*mom`HR@+S=%(t_1^9#+a`RGh@X(gLq%%H*2 z!hB hhYxx-+%GqMV6fq zHL@-EFxvZ%j~yO8IXOB6vNSlo$VzNy%grBLonK~<)0eWw5~$2Hra^F_aWQKxXN|e# zCht~SLiOS@%(FPRFKf5Xtz2v@H`8o(zP++MKfSurL8X9y#%RkGpi^Tp8yK0)#wG`{ zLnD)8ll#)_C1X?fjh~*%UNSN -QhY;-akpU4i6pFA=)H8y^d($Q?> RX_dVu1y2>Fs)bh(;r^BX|Fv5l79Nbt2W(Y4=eSme)_|!L-U*JRsDRTk|woH z_1blt_Eh@+LnS-XJU74CY} WWr!1bEpIcqFg<-US_$-D@auk*r&c;?$NsPtV z8F+gI&PubFMS1z)%QleD4>AX^Rv_vn(NHwL0PpBGtVuT$rw(Tqnk(m95ER~NEjBe% z7h22B%y63+ot!dUyi$8O<*!=X#DK5s*_ytmlGbXQl1=q$mOQKfZIx^!V&}~}hh|#} zNHkWAfiF3?&dxtFKfBskSkq0mckjvZsnLUb_hust3y~IUh~*H^wH6jy7qfwdh6uwD zE<&gQ27)jE;jL+xaI6W*ywpvpcV~RZaI#(3#8Q>gb=RkFOKfnw8%%EPe_fKjD2DQ0=L zd9Ja#umT?E8;{Iu@xgE{lW&eqHgWWD_Ppobbz9NT%y|YeV`HHE3pAfk*CLjav(hE9 zbO(}EM5N8ni6sa)xMy$rbCYm>rQZFolTBYwD*gX-GP^OG6UR+0Ga&F~?BKihk#KEf z=bDX`RR$~B5P5dGxpJ||95lR*^Q5FfVBB;q=QbB-ms<0SD{Wgt4Y3K5uK7rFp@lp# zl1#78FU$flOhjqju_DB(?bW5F*78a_n{F}DhAfp#2xW130RKc|@lw{l)Lv;`XzyeG zW)@a8zU*bbQ>9|>_Jf0x{B1=49O7|xdYDb6yh#@O +y*<-_>uEN-IwO4`u5SsL>}-^4XT`_4 zuxzt3E;QnvszL5I`Umb9HpY*v61I|NJI&4`8)oOvonz^+!Zeq*iG;n`CRBTC6X9`z ztxDStTc$Cc@2C=+tn}2Dx-WXFFJCIH`h7+-6PXc~)VsiT?Uu>!<<>&mumNCT`>6Nj zJwrJSq3Afkbe$0%6wnfZ<{9A1r6rUBRPeZg(z+oA&CZtg1##Y49!3?6HDeos5x|#{ zh(D@5V;vP)Ai1oA! 1eu zM{Te9^aQ*DgT(pVkT)bFj5!RR(eKd) Tlc2BvMaKJ)3m<{ZI *Pt7)zzKx{UU%xnd>f;545so93eQVPpG3bz#qQ{tj9XTr`dFzo_Z4T94WL zG#k?2WA=Xp(6P~}O!Uerb^C!k?tJd^&Su$Tye#HSBZjnVstxQp3-}TCgH8@#%Sji{ z&$HGfYh-s!x3FHM+>4_+xD)1I#r{M;^i@8M 6WN({zv9Za(U01oW2C3v#ME@etwSct`nD>hk)r!{0}55}*Pp*pk4vF+!(iS`e( zwm~NBI~%?1*q9>Ag}rCYcU>6(W`h-wRAFCO{lS{RPFR#Jk@tpT9yT1?5zh_}58rFH z$2}v@@qZ7UMd?`EM;V7;7CMLf9*5o>7DI>nfl}NQP>7h@H~17*CA3gGtaFGx+@N#) zJAKa~`*-G^!|<2OnUZoKlUJsn8EXy31l6Ikgpv>YtbU$#p^4?;&HyC3MjSMfVf;Y& z6y@b NvY^q3@~$%nnTAN~Y@$hxJHM-5 zZm&yYFz(n$*5v#7Y&3f5J=HppS&S>hbf2K18Gx`d%3P%_a8^e71#Adyty;=BE!&y3 zFq0W9o fg(3*nVjrVbhm_~JW@7X8^u%l+>8_-mUu5npNRJ*BUYb?z$aj{Q)jelq5B5R*- ztzrQqWjf|f#4Z--aMrm^2!Uc68w>I>GbhMPL&JR6h&NY{SIbNEZ?ybQIFJ2ZuDHG5 z#aavKKGpJyszp#cg2sCws2ps~e}m=ncfiag7GAUK;;vf6pRScICf Mq z9QUqV+AA%LcI~|;9`daRw~DM 1-gua5nnCni){oszFA6hrMuvkrhkMH>m;~GrSBe{UdXtFzqh8)doXVfd2Nj zaTrb9S=TK6fEAl=Y4v|6iMw*K#Y!lo?&UVp_EX4%%Nn|!c5Z<^dsW!PSnGwM?9{!` zEXW!y=1xFipr*kLMAZSJlr~3`AvfNb>5SPK+jU5{LRcEN4`;`ljdS__6r{o6a&u;t zLq6n2?lI3eXpwU$@=_E*VQaHl2=DfoAwI(yLYpHf+h*BRSI%>+#_qe)oNF!5HzB9k zVJJK5t}AnEg)=#Ai5+IUIV3r&!xmoxDj*-3Z`jt|=@GdswETQ$SaNK`Lmq!~`JP0& zz-t}bc^JkB!W6GI+H@e|WsqHKAGy1eh5>diqg`V`a)}xS(`m9sI}0=)=DaAHHUW~i zDa;;M_n;l3KNo##(J7t(weiRVP*R>`H6OqrI#(Q)Jryw}cL(+km`RemQ8q9Vp+UYC zd5>#|7ial0u3_5T@!ezA!mkNOcVcG?q&&Zdn t; bDV;_65y|57h=I;s?0yakrD?yNNsy_&)!$98-AF>V)P61?4cN1 zrh5k=6(_+kHd4lBoZI@~ R^0G9a`zpHia* zYO-m5Wik~V;;@}rK~t5M*GZ}1kjc&t7(oWm?v~k_tppJU&YB6$5t}(~@) 1df_ zWA;VJRyyMeXG1dtY%H$ei^1dK@~$+rz-(t Im7qiu+uz7PXdSsr{V;W)5A8F03 z>g2pQ<}8kP%Lk-{w|En|^=;c`9xN8F&CV}xmUGj0n1OuzDU+WS+DU);Gj*^6U$Uy> zEc~se0k*SwcpB5N|EcD|P0FV=4>$^4oOrx}4u$!3ZouYOK?f=OF8r`KN8G{R(VX3C zB0!VIUUk|mO*`+=G5(~7&&Xp~#Me;sJ6FgCMI4!ctaaM$(K=B$R|!ZSpOl*672nCu z4WS7U2CFKZ)-+^eE)Sh+%&1y8`7SMsqDOVuR gQ)*68PT7Lz1d9^AY!zyT>VbAFz46!4a8c73nO z>HZ9^WryGdhy!dbipro6luB)Q^E0c&A-LU7oQ@977) c96X}8>D=FIJu zOMozF#&|M6V$hCIB2eML&OLT(NM(US5@X9qSKCnHHqZ$t&Vu_q!zN`YYI4_D@H*vp zBL&69!lUw1M)=L7Mb(O-%VgHl#=Jtvw6hp{A==N!Lsn@)Lr8BA$vqfP4~HMQefWgA z=CpSe=Qpk&s!=$6?l?;=8{GR}Sw0KWX%y>tQl5W#KcQ`#M;3Qw_?7~PG&43Y;0f=< z5m7Sdt~qQX(;%ebmAEou73ivsN6{yyUWG6+an;L=ym#bthyh5or`ltz(M)S$XnIxA zChh&Rt(o?I2X*5^?bhNRP1sA$E3VXd7pn0ys66?G7aXh3%WXnl7U5R~i?Q>?sI3B( zl@?JY!}HCRa~4B-e&xc#{^fHs3hmm%bbEBo9m5BP4`h=PD$Q)tPC3Ond0d&WG3H*6 z%-+4WQ8O1r;sp{#EF%0AOXk4v9oa-wh;q=b_%1gaj9xQlYf8PXuZp)#8i7 @ehCngPjA$!1 zhz2OcO@3j18mFX|qVy<{V}=-E`9)Fp*==VRB>PP1h#fn@#K~f?r@{+x7Fj2nh++aK zb1WxwdD2X~&S&ic0rl((!TBl22zUpzvzWfibbuNYBMgTv27v|GCYBXNi~~R!(`%?{ zv~1HREEnu~h~)u|8t6nkgAMM4=){O~K;=kl*1XjEwT^>*k@zWu?wo*2wqJzcKPNW> zx3FvTD7iaIXvnTvwCL4ELa^brmIM<5$plejc^TtH{@G}t+s{%wm-)c8Il&k1v%OqR z-w&h5#D_ba-PgJ(4H`vMQ6Z9(@IZN|)~c6|Y(h-&Wgh4r$7cI;2-jmgy~Ott&sqD| zNl#z;CI$Fb2=J}_LXuq7|3jq>B%HW1S~pP*jCP#3mG~5exUZMR&7;GO6}5N6Ob)-{ zyqb|Ln5`V*HRh3WX?g{*yr9!%`1Hgg*#1JYWk)PlRor!D`f)?PXH&iV7n9`ENwxpq zEBZQ|2f9oMww@fR5>IZEhA13u{qjKu^#SIzYOY40`${SBcr$kXV2ZyIhx23HK6y-6 zPagA|CXdl_=KQPTnSjjaj#C0f1KTOTpWtze!Sq-y&s)6WEn%v|_ vlJ _p?p=<(61(b60kKUjY`B6){3 zIs{1Ukhp1zy^*JDbohjLdc-=U?#GkbmHl^gc6drh)usOI;Po>7bvcaKUl;v-Jn8KV z1MH%|k0(2Kr9Y`4_)5}UuRWR6p56Z=iES@|f8&yfs+jn!tmSvahWg%5Rkk#C6$_Ad zwOX8hHoywuAB9zY-{=UpNdPR5Ai{ $NW?NxlE)osM?CA4EqK`tAY0c)rCRf)=xCk$gdA02L9d?C(W? z;Bdewq*F+ZU6pOt*-|^8x^@+|=OE==he0 5a= z74a=J|6{l#uN8(EMz}|%WH@Qq;3_SVs^ic zPpN$_0Cxd!kDw8AbI)vYv}Sdp(>?K_G@8~T=Dd8w_(z?UW}D3=SzN9&Y(YqaeO_eQ z{$aumpzxNF|6#K0mRMxuf0*pummcE=OH%LtW}+L3{VyoC?zmjaqA!mY2;$L}DVo_d zNJy*FUiQtT=bH2YGBuG>^)1PQn@pq@%m~O000>XoFkv+E38M(aZ$-|h2-@Eg=Remv z;N^c;2e%X^!CD0;bQF;EKD6P}F7}}f|GyV~Xv6>S^fBEXY~(-q^8}xoUoEyrSik#c zo9&t9`6ce}hFiwlLzsH3F>oT?aTG)NNM3Q0d%Vw2Yw{h1YsWW52X1UM+}Yxk+%yx` zV&L~`>CO$_>O!k18!x%)H+O)!7(4TDW3CzQxyEAsS!p_pQGrVwn}qAcRW9z9p44wm zcPy<=bM=zT&Uv+zYF!h3{^Cgfynai%{bIB6aJj0k@ODjX)8kUb!|B!_8_r0~absDR zuCsNcFKFc>?+vY{XjC6bw=@@5FF1rQgRq`{qtsXnrAN&Ih|OUq Sh(@8|1iSM3>BWbS(KR8E-m!A$#rQT>gOF2`1w=DGo>Gqr-&R~ ~z$Y7%d0bW2K%UrQ4Uf>S{(^$l zbWOkaz #LJcm zWeBi`Cy`+NuSmCbl80;uUF{V-+a~C`CcIGZORESolX6`X`dR<}V!+Cl(0kxH>(K3l zyms9EccoW!4B+W@J@8n1<%Xc^KalQP<&HPjHEJQwl{3EjcmKW%ko7!wx?I~4oY>g` z!XNJ4((~2LeXr&(8TiTWbk|0LXT#;o@<%96H +`5i- z8}%@JTummtW&MR|&4j$tPi#A|_vt~ 3LU}W6nV|ZF ztt~Gr^#lrvZUvt)vm)fB*cu+bSf)n(hP2mL6^S95kDB!Cn(&1-rYGuNo^0 rtqp53*_3dfz)B~qR&m0*)edzdTU!}e+P3^(a & Ut?)P N(hTuCdT=PHgwrobCBrwJ?QYxzs}2MbW}v=Pd@_x+U$E2^Bi8KRey} zP~(xtnP@9{BBowFJLTpRo$RtIjFGTv3!b%oNz#AIL|yO3_3E&~YW1f6+;pe4h)3yX zWbd_iYbVJu+o2jKlz)PQ3t`ko+q>SHky(g%t(E2(0=^jc8NAtN&NtfUckdE_L&@&S z#5JmTEYusdY9ouY_fe^SFuls4Ktl+4hI|4u51(0GIrseC*OvP?4515k4y(#(YSbsw ztu4Gq7v^8lJcE C6c_G%!%o!UqCa30$71iF|S4MWn%#00oekSmEoAq#IL9BAa9p#2L%C$}Dap}_f z9_!_XJC-i3ZFX0>Yw7&b`gVKE?dnun+wf*HxQX0mPG@&tU9K*>JG`jxhy7>H_zmwf zoChv8+PiNkSKc-=Givw0N9-jD%yzV J3X`<;+E#tXh${w#@j+#mKHu3&+w+sKa`rO8t0x!(t1Wh~(fn z0P8V2s?IcKSX^zEwgh_)<+{bzWT;&1KO>=Py_0_>@$-gd{zYrXDGvj$EPFn )U#r%PqJ$+mF|CYXV;7iqXs~IYqCeGkx*38I;F#2sfaO1jNsa$*bu=cWp-L4%^ zcuP4 dy^p;SMXc0bfM*xG!y9awM7b-=!V(tvNdfAY-9@re^7$0tJb`ZZ~7 zq4A1Kox7erdb*PU1UcS1_ZoZj%uT_-{ JRZr7EvA#|9p0sv&eBuZTf)(I&JacMn z^e}5;;JInH6G4k5Cj*VV7;F+-N_u }n?n>I1YtWH+oy%N`(1y$W ze+HTZ@2sTT!dAaAde8nlMelc#^okB8cFi1L7P}uzcW~-@VTqtWobPAs3}^R%361s6 z!j2w>$BK5xb&7a!C)YYooZ=Aj fv>U1Nt zSlK(%?I*|C6WJI?j~*R8JT>W#k9-g~KFX`?A63(x8@Rv_<9^oRR`bw0DZW9QVd)H~ z@EcB8Q|UrbiG#~?^C +B+%}z5dJrN)>Z8-m#SXcI!m1Kl3Uaz%=H_ zi>b_J0gxLe+w#X&vH$+GC(=O SWH;1dXvr4@4yCfAeh;+r|@)BufT+CVJ=F zxnpzS{U|J*hYJ`lJqs-lA!Ub^qk3@N+;lb>J|5~% VyLj@wQ?0sxI@QF&g!|Va+{`twvi8L)Dw*$G>v+}xj!y|cO zvxyRb{tIbZytypd*r)se$jnjOr?A}pkqkQdU#6RL^NYbB>;-mjbFYgy?p{Ci<_acT zkt{d*#18cpx}%-lwePFE^o8Ywe3m@dV}*5oY7NQB*IXQ$Yn4t@?=JLJ%bHs~cIwav zlKx|M{5ou)X+AvBJQuQ^-2btUBuc4!%cei+uB0E>ZYgzdA*JpwZq2MZ@ygjDk5?wd z+X3A|-VBTl-3sCwkKORl!9MD9+L4F%w&%w@ykm eV_ ZzA4{#J1lD=}roULsD*h !UjE7>k3`wHf?dnyCA6%T>5B>etADq(Uq9*AM zb5h#`F}6}FV&*m<)X9)9SfiJ?RUnWvV`jXyXfa*>&ggDe5+NOX09lP&B=ZcH1T8L; zC?-z3cnTo9+j2qoG@K@IC;5ZehzN{aZe36)39}JXB}Wd57a(V7r39+Vsf^e! (J7K5kCH7pJ2f%>V)pGL*`Wt`IZAruQx8mx9lLKTyKnsXk qOh~k>H%g#9`U9u9zF^sv$4;C&J_fWR=kmU6?BwC&r;l(lu`dIH zVy(!4J$3>^`bai4zR$W{-%ih#2^@yXFlBReuSdHDDUHu@26MV_S3Z1lytI6HaY$noQy15GoOty3{S2oTgoJky>(twIzhanya9w)*Ff7#(NenAhEIWT%)UjRDEc?Pw3 znH?E9!3oS{HuzLjVPX!So)|qLtRcnZ=|huKV^gQ6Mzdq%<426xlcN(aCiC{>-P!SR zk^g9RdU6y*j*Lu=Sl7UST)bxhhfZ@UBf@buGdeMG+KyfJFv~B2G85V15!z}xk7Q(0 zV^+m0qvI0~2(0K}Gq5jv$$g_dpAb=vDMmyP8F`1N%GKx)USXn(ab_n+j~yR7hKf5X ze8vUlC1aDLdzi2>a62ZLVyBmk&?$^U$KpuvVv6*;#JUif`OL=1;C S4F^n) z1$N=l iUB{I4^ xvBH|o5X_BUG zix8O+d_5tXDC=2%W!Aa8J4A&^tax~qc|4H!O16j~^YA3A4J^CatcxS1$61KZM)z54 zFGyD*n=Fn=UB*SsG`MtL4r8)0k@v;-AuuI0jo!(?Tne@xv !o9?oQH`lBB z=@0jBdbT|zSGj)r!`q5X>H6sp@7#1<`a`5o-%_vgvwtPfwg~a^jYko9!RzgD=Y-`# zv3SP?k84m&hNi_1#6K=5v&PE#3rJ j})b4862- z1~rMppr&U$=gtK9zA)fxHz=wvB)VL=(J9f%3sH_k34C98O@F%Ay5!Zp$+HHo&x~a) zx#B*{u{b>4SO$~k$_%J_%L;wmoA;p<;rHf!Xdw6E#S1m*<6d&C-)Vio=7*AJ6Q_8R z5!vn@ro$G4*hg1k!=lc6OX%%T-W&G@s)zF42(_#ps$Um+ 9VW`mTSn{0y3u{r4pYrJ;g3Q9P9aN G>GKR{D&C*$>t~xm+b;sQ%hJ^p#I@7aMSu6_ zH0mM&|NXuFp$BdsRPVp`mRO>{`}f{zt4>!BsxL~0!mDn8yeJ1k?0xk`VbxI)ATPSX z*C!=_yy(__0m$Zh^>{KIfNTcH@f^rzfE@3|vbUu`EP3_#z@AtF$nkwc0SKRdIFSSC z0mz9QNDn|x^xhDf5l3A;kwqYcQCCmoK#-r~iHn9xLQpcLI0st*GTs}P;TC|5U+p4= zngAJp_CWe49*WJUDNZN*`@d2_2pXY@s)?eF1!R7G*r2@Uz_F`t?Bx4z5EF`)gpYJx zTRL>RaZV}GmYWx3z1X^wM+gfFrx4x5ZHpr_yF9bJ%3EdKIY&AGZLc_cSMnQCg~8e; z$+F4ZGFBk3TXQTo58!6!4|bxQ6!4dBw?+b`kn40#t`u^e?u`;9g ~$^Wq~}93!+}odVq*y=dNDRdf?jY(_1X8y!POxS5^A2?br%}9uqQ^+a@Gg z_F&J|#)OI*uf9CF*5FZ~=a+|`Dbe%GL(i0G_VOUqDbe%G5$f8>5 })XnDF7yY&M7p5V4Z83?+cf1`$CCAhSV4Py)#8 zt^4R4npDv%&Lt0XG^RlNs;GA^-JM>WcB>?^&(*FU*eYvuVO3einEq|)W`9YSbG5BS znTeRYf>5jY9$<4jcNb+kp1bzC95}Df*RBQl=%ed_YkJO?fNNVlUjnWvI=}O(9JnUw zJTrYoz?^A%sJ1_Ut%-W51Wr@+&=mv4d%!(( 86|04@i!RscNgqqt*WZqmo(pt(2$ey2@4> %+`n2(jPFiTii@;a;i_{nKXH0CnhKeJbFAz|_du0z73Dn9B5P2b5!=2W z%aPv#6&}mQueR^UH~{rwYWsd{;3ig)q)yilZF+5`V!~Zw?T31 aXD|UOwUAo3Z(J#C5l3T>Dsa&}`y#s31>fLXsY A$&Sqbzh0rm~SQC% -T7i@LHWmM(LbleGucb$=U$48 z;=B|MjvP$fweuskD7Fw* h0-ymyZqmsg-JR8^z#b6K! z>bXFTi)B0jwKy1<=Pl4M$6d0O2gUHKw0Mh#9|r?(zU_N9m^%(U{lSPm=(!jScl>xz z8Vt<;6P4PP`CxQCng@Nw16uq BOL3byi0abZ96mti|4wbSb2!;7tpi$Q{ycoR{pK^D`w z1v0#=vSVjD6sVBaYwxbquEL9Pytz2Ha(-hvrR&3MeXbC)w=UWve9DAp!=& tj6OuIua;b<$7gun*XECxsvAP*Q|1hu1Hd;ik{ zwF6MpEI{o5)cc)Q68e02?gN$NXLF%1;rfBf=B@a(G)z>UdhLS@v%mkcLO)KWsY|LH z7b_3w?1PmnBhk=t>b0LPh(_5T6fJP(Qlr#@^3Rl82m}v`780>PqZZmTYr^+K6-+ h{XC(1??le1=fcuSbw32aQ;vQ4a_0&@?TaG&r!gwWFS$DkaYd`UsggU z2;N%d9ajfPy8inwF j_?T8Oo`gX<2HkPY*ryo`Zf||(k zkxG*F|5Remx@hAI+a?Bvp=>$I7%TtD85z$&^;;wIk;XS9Cevj fo;h=`%vY;b;< zzR%4sllaMc_uKqJ$$K|NT3?~dM`c8B5H}Fg6!Se=u(WzgHleTZk* c}NQa(~Jxwi3-REXH|DMGQP_^cb!zi&jR?k`o68~T@w=D98Q z6m({v($Robcb&>I@q1z%au5{B{LF|WR0W+-c?ToE<{X1{ECeF%%D3`M1@2NPeyPHR zJ;z=7R(`2+{j<^!Imf_Wzg|gh>VJ=O3{1j_^-N@xaE9TWl6&(khwa9RB2BYnqnE3g zGZi9o7NNs{K4Plxq~g!lB@#SZR>NbcsL;_*xF_hTa`lFJBqM{=1CBBp%4o(M>%5Dv zPBMkwne@&zfDY&N9j(kf$)=%ZFXWS32cB;WHvk3D)cBF{K|f&JbI{KbhxnS7tG)L| z0^>*!&GI7j{`G?1QpbM1f<5N+#+N{G;KuYdE_~3%o~UpH@rdM!i3}NnPGGwVDT%?i zClyf}&G_<360=XxjJ>uC$$XU+(}2Y{Rk&waoU&7NtyIt~_QYD`EQ1?EXv85X&B+sm z{FHw9L}f=5+juf4a;ot^d n`o+pNqRECAy~QT~lNbpNoT_NYl^79i1Xwe=hFmUD{ed z9|u7RNE9O^T)Gs)Ab4w)!yqUE>GK+doYLL(?k`q0{W*iUraTDD`?ya*bB#pn>5CN( zCN+|7jpTRYNGQ=iMem;?Bl(>;5{fkaoj4MT^#40?B;6XxmnygzwN5DkiDHDLk$kDr zdt-cSm2cV;i$MBP1vjJPgl_VC6^>dQk~U$A5t4M1->Y!g65ayo_bQyWgd&iBuflQ5 z&q^G3;~Vb&!%FgvO11yp$p((XD4vbs%f3Q?u%Vj}>1jzG!@g)fK@oXFhoGrEg+H*A zb=FoN3tVw& O7k+O=;#HZO?M(DRz`~5^27K zbRhnTs0TX{;v$v4zGdr_e`U9E rl2Sib1|!S?8^k z !Js# zxqnpdLCfNgDtImPCiL(}VodWDcS}M2lS*>i#=hdqvOwpHOism;$C&J0mwasnR$0pq z$VcM;{4DpftU;>r+*j-jEOixRBe!#uLb2Dk4o1RI|D &F)Vs!~4?(Tgx>4 zGwB{LFI=m(`VGU(w6y%Q1jT4POR|z1Zs0;?n9ahg7JR6VsZ>0=i Srw9|1)UQnwpHa)OIzq)R(f3YZx&PjRg_wk zz=Wb>LJ>^ PT2z#PL@`1Vt9?7} l!a_f%NL+Iu~&if%NKxNRykOPEWo2HOZzQfjU=p zP)CA**v}xwwKcvb>Cq{3t=1!gyfz6YCM7zj=$%t!7_W^f2`SR_wMj5BDbo3CG2a3t zUcN5D%dcVd7(pmTND||(OM0{T)+#^SlW$QONUuxq^gB)v j`gx^oE4Po=^nR8xl@?Zi66O>fJw@Z2CtKWT1l}1o)nBar`X(u9G<0?SC}EIWI)E zh&XSG#GwQt6de(Y5a&&iI2396rbrx$Ao3;==k3zfwrJkolAx=-0b5rW%FWRhf|g`S z_$o8?5rJ#!Fp{^m&i+8twvQJa-5{gVaBh;2<(4i&aB|4UntROMx{SjR=Ym;YWK?e{ zMkUUDOF~$U$jc}g)mxO@(CNcOy){V&!b?pQ#Ry4hJ>ObD5(VCxaR1pMiF4nYWICi1 zc__UtNp21=CCeyANRnl5OE@I*rjliEORjNVqN%mL@uqatAkp;gNpe^JT^ZML{8|ee z-np3S7fXlh@@;72m(AnzV9Szx+&htw0#06JFmI39K(|;_*V~i6h=PRF+Y?X-ZBfkM zp4|MrSd`m0x$U_DK_I B5 zK=2&}f?Xi^4k7rn+gLSez5CxKoBnmRa^Pfk&)@!!QxreON)LSeip;(>Z>CUZbf%qQ z*;Z+v0UQX&OoU&o_#Kk+%1E<^^s!zn@m9=m9KM;u;s}|wIUbSWz$V0v3QHhBcJT$> zR6woao&bvi?pWa96=PUibg=C>;E|E5qaGcxxP3!H_W32gAAn_B7*BCRkgNH5nE-8k zUWQ3kI3(N{Y-W1{X`&}ZXHHY+wf;+WqyBISi;Us8M;u*FK6N=R6p5ou(59l9qunAR zp^bb-93 BQ`Pe(Op%+-uix}sBypL8i!ACuc_UXsAy0W<$DL`Y|8Ub(2t@L3T1VgPD6 zISBpUg}(KZ!M1a7 3vJ|m>r*g4A2y^TLX;cIuT)w%Q8 z3-l+huTGOJ2#{NrFKLmFpk@{uXJmhrl-bw@ z`Vx}Ju0T(@X+71v)~eDz ?>kC#4xl)A$&*rriIuJ@z19+0@F4W z46VhHeYaP~1jMh--53TTAb9jlaPZNCMSOG$g0!u`