From e0608337dd0169dbd8d4966ec5608c92ec632a02 Mon Sep 17 00:00:00 2001 From: Ala Date: Mon, 21 Jul 2025 21:52:47 +0400 Subject: [PATCH 1/2] feat: add lesson 07 --- lessons/lesson07/images/git_show.png | Bin 0 -> 76658 bytes lessons/lesson07/lesson.md | 532 ++++++++++++++++++++++++++- lessons/lesson07/task.md | 27 ++ 3 files changed, 558 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson07/images/git_show.png create mode 100644 lessons/lesson07/task.md diff --git a/lessons/lesson07/images/git_show.png b/lessons/lesson07/images/git_show.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6ab5d23400c391829071541ce434d4f9348bd5 GIT binary patch literal 76658 zcmZsD1zeOtw>OG{1&D}9qbMmLxinJJA>D{{F1@>?fQmGVG)s3%*TPCI-3<#1EZrST z?6oD^Q^0L=#OBhFG!!AeC1j}7O)hj-@|72e&yNpP?DE$aXBzrV$ThyRc8 z+jw}vws?2`l|~ik{(Yix?_ZjKx_5ql!z09fJ;A+S(r^8X5*MF-``?uK=yd#l`)@zQ zrNfidlvYr{xtiv#mX=O#HbD3CpG;)9fcwt!`fhl5&tCt1Zz*WJ+Q;#lu+`FY*Hcjz zHU~O#npprpS#p9Mo&V;8CkhtEc^xg?%^1Lr4o+^uV6m6~NFj{#{|)AP$?%UP?)G9Y z^;Fauq=BxM4E&sYoNr%>KVV>B5OuY%64sD;|1Wafm)J`icXwxDE-nxV#0lc%1iD&t zaSI6valPf?;^E=IrQmRbIJujFIh@=W|C!0Z^O3Q1Gk3LhcDDsOG5pQf>=V$#UF_w{ zzl{Ft`DZyT!M6X+$;s_s)xuSf>u(GfH|JZf|H>OjD*886Slt$E>7XZL>xgSJ91n3J zA%4++r2k(r|IP8Al-h2VuF^n99HG1Te>eKSi2pP4e-i$KrT%}j<^kCymnGyfwL*UsV(M7jQ}&%_^istc9ix{=0KMokOn;s)H`=hoi=%<@n77H)|4 z&2O@&J;K9#ho>MTsRh2ZZA@7Alz&oOY0t=OPy3zM-iXMEHz{jisBt-Cx?koeEWtl#7{ahi_)Gy?byaq--F>rn9HHbS~Syl^{5FAPO!F@m4cj_0b{;upLFrc(x zYVU5apUPDG#EZLV^(M9t8Lh>=cS-V;hDjtIL&a6Jey0a(}VvkJ8rtGRTBC-nw{i#^gT(3Gn2j8+q(v+d~+#rRd!XaA?yHCuKz&et7@ zjh=Lh$-GdmMG94ubok_rLi~Wx)sLgEuo^mzTqOmHLD#jeK^;DKD$QKAjs)XZ9>Zpz zhcZ8{Ds8>|TA&x#$F~uW&C+!8f7+J)vS69u{l)>9g;RxU$7gwa`p@7Y=e<|=Z)>x8 ze-{n)+-4AVdD*~n)ph>bipIsoW%4QIV8RcZZmG_hGwI!v$#@6oEa zO^?=!TpwvOL^Jb!#COGK%ybTmk%N-55{_p>?IFruXNcZMC%@Ebi(QY_j)oo%l9IER zu8Wc}y!k2L)^4@HkcqvFUEcwGcU^n2i5#cuxtUg(F{oiE)a*5hbn#uxIS>5;qk=FG zN34kbdL5Q&jQnu*k!LuR90A%F)0jbSKBkdwHAb#4FmV+p$+os^0!Av6MZdktJIR!~ zn|bS6(ElQp|KXYl$pr0rkPX3PJ z!b1}Cqb_M@sg2)NQ}>68fajnYWOl!!iD1VqVd0Z49l|aFT|t_KPFs-;0aVI_dDqTN zw+*#Vnm~|E=fFo$os44geeKHJ;F&6|D#*iO*j)tw&2Fw}d+?!u;G;&=Lx0l@)RRDI zn}QZo#eKY^$E8XURQrIN2pa6|VI;)F|70E##lyoob$Bd@@jkILT^KV`r&di?rK97X zalX7KTn^&0Wc~2duKAEHM>&3CZ4mSOx*uS>m*-Zjim5*?2`bPlGjR`R-^Z9q2Q|kx zU3;>P6jXZZZa#tD9H|MHdy`yWpHK<^4yXQZ;d6pnd!|UX_WBJIrCU$m!m$hUhH&GE zg^JQRRyR5Hj8m3%G;gdOv&Zj0oO?Mj0ynI$eCBM)K`WtvaOtruLD%%I)lWOeY_ zEQAyw$uLa%{3JS9xW-zwjg0Sz0&H{mR5qBnJ`52R&bVG(XGH_A4#u7gZBO4o7vJTl z(#mO-(ge*2!Qg+K7w5gt4u@!K-PY`zGdT=J8;(%*F`16DqI?cA%iwKc-RI}hoptV% znTfn&Ro=Ck7-WGhGJ5^!E1ef+8eDHI>}@l|A!F*_A9o9zcZ~P$#E#Bx@)_?A-R6AI z+{;G{Oj?BO;(IEu*tC;uw)HZ#i^(1U7o}vdH(Re|oP@8OMm#CVwo=84lg=gBcS&m; zO27=E`H#>T0umn@;q46Bu%}SroeUGPki#`bDqhuLiWf8I^0sbSL2%EIv(@*60EpT6 z+b6_2@E@sj%jL;l0bbMjKQcYGzSpIxOfQL!g>1cc!}D^vJ-n@U&EI(No@tcqDXqwE zh7htA8$$>`JWT&^jgdju%}v#!P;dx7>E3*V4VIp66XDVCRj-ho408?&qJ}%U|IQ^F zTy*{e%G=3K_HomUN(P`C#FFYtXAKoZPwx!pstoa+hyJR0MEMl?0{(|De- zyt8+rl@Vd~wMk*6Rm(aPU4JeAaH?w4R3NWMyXaZ9ajoQ~&_KI^al`siRB*|lsI-X0 z(uc9nMMq^KiCytSrD?8&H_vnV-slE(Yv#+Kn%!@vxP{&J>6yx=SsWv2W;*G6o3mGF zMTR3)(IcTn$N~splSfW$6ftRq{yIyM zbHqF_+Un)D0XL02=Mexk!N!)3YJR;mSHxV8&bix+N-D;_cuj7n`-RvS6g?5OK&-+8 zPc1c!QFLWIT$tRl**jp#J9l_1&sIN?Uy-XKEpfV|;3E1~*QG~!#`jIlX>-zC?rRU0 z55IN|F8G_OcdUyx4^!^l<4YX>`M`rkih9>T8Vfk+Sqkg^@<|r5R88~&kSZ@aaNYg` z)L3=en&h$-E97Q%{Jg9ePJxIqIJ`Sc^-2RH6g0N}2vgCKVPi?}3!;sg%({`X$J61+j-6q5s1%#th--kgpHC zPU!p$*9Gg_%EY0xn8qJpy+36WL5`nwUK~6EHXo(`_QKL?R9Zuxf--&UEPGe`dj~1N z4hQZ(1&Vej*51(;qe{mrp}2*ybv^MhP57g&ITgCb0tyGK-Cjd7Q-MypSiw4Dmly#6WRZXn;5WDav4iOevD1t~-oy@+8-JkT>+L-Y@1(2dl6LBmPN!R)D=ooIzsRhP zmJo;Y0+Wcbq}c3SHO3C)ObsVDr7k`fo3`r$haW02+#cl9YmyUsgRnrZ#R=Q%NMJME zL)lH|DF`aqkRX3`K_>K!T3a{$MRSLCetN_1Ov#+RC^mCYOiQ%8#rIFW*#rN?(DDn4 zwZW5PUAvF^(9_aJO#Ya@#^uPotAh8A-zYPOj}xm#jylwTH)pOFW!SyuC$>nwWeXij zFBJwH3Y^IFZ*nI}9L?5FU?PgOUND`6om@p^n~p+CJg#Ajkwsy^#F0KmiU2OKRw|Nn zMvI-avyz%;K*#(6ZGk*PjuQPeiAA=`)?Spgqg0P48t~I^)%#P7i-4)tRz0uZp4iPs zo%xqqbSJO^Zbj= z%q#a4PuiQ~aC4TqZRA{b$p>j5VPgNe2aRkP*n_6${7z4^_p&9NCfwej|@{2)vy zd)}ulOB@_OR-8D{Hj~q@Vp7-A5@8Auey*Id5dD0|;$w4tN#}61IxZ%kBC7yUPc{UT8 zoZhcp3BhGFawbp&Cm!jD43~!A<}g@)>l>A3aXbF%ez74>s<0+itgxo23qQmPq?XJG zRZL?JI?Vnq`ey|JOmeV|Wwx|Pe4odszwP1Fm>aVT)AgxJ;==Mi>&y3|r^=qYgi>XW zto5hE$@laX8$IUdAHH`N$1+70xeUf}LKQb$BJth(QkWuoej@a5j3fB;(S1D)R*E~y zlc7Rx`J_b2V(G&#N~Vmxbgo?rdt`9PZ@E4HUF)yYH^rIqgEA5*`8J3Z>FR(M0ym{0Ts}s zR_wTDL9eGW(FfbCn4E6ivz|fLIZYGSpCw`CW4h|G`uo?VkNB`%&3CW$#q<4?4HzkL z8MZHfeVJ9D+B#-dodOhU!)CafGx#UB-Waw;Q|uR`7;L2?#&^mpdxli2YO&Y1iO`X7 z3r5vi!CtJP_A^YbJ|fPMU=rU-R`&)52923w($yYWz6;;X6Y6P)Un&tUb7ND|gTGlZ z`Esz;7!%z+te=Bbs0SvE>l1IUb+IXUr#YzVB6z=fdgJ4XZWh6ZG&(xAfoHLL&mhMv z6Kw2B2j%|0=7%L)N@*rCcMp%KECp(f8xhijm9`$)M6ad(N(pYb+ZulAz#sI4q&zV%K9N3RJ3y@c69WJSaaEOOsh8T7rE& z`|74VftUAwY26_?OR0nYj0muFg6n?f(96W|EpI(u56)W4Z@;oaNpy1_UGQ%5-{hS_ z(}BB&a`3^~ojijH9v3ZhALAYri~*wI^3EtU{_M&tJkCQ;z7y1$Ox$>o%xUdacifF?YiD`x@qP*~Z&&~nvu6qiF2U4`H!oW}3Hy0Q+ zgK29@=*`yC1BP23s7bZp%VGo#1{4Mgu#OQb$ydL8>BZal)K+7tA*0BqGka&uRY9c3 zTk{s?<{$zla7Ae9ql2PVIfQ{PxqLQpo2||^ z5JmHT+;C<4B}69np-6aTja0@6doa_!6q7r0;I_6=FvD*n)A3-27CT@B`?FO7Pv5Ic z32xY2?NuT<(D?D*2*{JIs<6hzD(ri6n^wd>l1(Lf#bCGc#BOxq&~jtggW48#Kz8iY zCagvEDsXFdMuJ#U+PMZ0aF+DE>=8{Z zi8Xi<4OfL`KhU(kaA)bgW8)LlFa~p$R1BGuhFDf2|Duk~H5ZEK7q~p9m+NCHwojC3Q;vcom2r=QakNO7Khh zomipUC)wfkE4xx|V1xqDpI6b=b7U&i;CyL^8y_oj3T@zN4Uy@5fqLAqo>8)DRHo;Y+P6ZAKAnQ z)|ov~x_OW8))OsnA%D0XD|8ol4c^;%yuX)0D2im(b)UV5J4WD(&%iK0TvDHtG$soR zi5I%_7_z;FtE(rRwk}T9vUcSQh-Zdm(ol_IG)F(gd6SUDZgIw)ydb8HAzEi z4@WulNL+dD?V^5{`G+eEHX?5k94N*hvL+o=!TPq1mzqXrJ#i=M>`a{uXw_?}cqRbp zocchKn)R;C(Q33iVHq_sEcEH3$K>d3<7?EOe{@K{uss`Kj zktr#9uf=L}EP8I+6HhMBfv&k+NMw}@} zxPvBJ%{f-tQmf9_=rdJQg3o1lrsakM@WI5*FLU~-ZZ{IcPeX%U*EIM(GQ{X|+ShH4 zuege)9{4=l+G}!J#U?N})j49~0HDU%txYD!_mTC%BP~9A6XR_`8ln3l=iq=+s zS|&by8D+9o(e6!o!MUx3_p&+gn&a}p7aH%oU=WB#7`eu={vze??vsO9b@u1GuhJ_n zd?&Y)MLyAgev>Gs^=(VrpVKfH3=H`ZegT(TGEWtu_V}=It6CHSE`i|7>Jh@Obu%NV zgSIGV3J;9@`f|1Q;OOx1U`1*^mm~@&=eMsWYz>#R2!m3nX^>Shs)zlKVgj$+FS%qy z>NzmUvnl-&k9{wj6e6&5Dl^LR%VpF&bfu#2a${;{+IOmaox_5D>@ACL;EQu)eGWFL zeMpB_^G!{WC-sG?_-4%>$#JI*9jI&8aZ0A3?p+BjPlBh5S*(+#IUd>78n&rsEH{G4I%TZ4L>2y<0Xvy|7@kXyE?dE(5w5ma;n8t;_Vw(^( zL8PxB=YJ|t>~s|E-}<m4WWM#oh{viQN293BSnS6IaVOF$Ovs zH@&?Q!du>+xwn<`b+4M!;&$icWFel`&*RNa93{mlI8I1Ete2NtQxv9%Q24qna23W% za9w*IOJKf$GHA53l5}{_+DX<~Vn$0}E2*~yiUtnq!l@NC-(>g4%w~Y|+Ltn$Wz{8>Nw1@MA_+QCnH9IybnE~$D+)|d zLbmlS;LBZ~F{#O~O8DBtd%nGKnIr~$Ib3H~s*V(I4lgM6O5Ze%7IR;>K^s#jM@DbW z=TtNF&h$14QH1nLT_&(R{d6@y1&atNt!4DF&UtYBsm&`1kL%Kx-nR{(W+ib5X_P5Q zcKGnuiV73E&q28G^;j7*`RcxDIlQCMpE;F0Pn42ZU7GIcbC|>3>ptlB3Rts?J)BM) zx=rVIzQ!<~B-DAfQIDzKNG*)rFrANCI_WoLRSEs&4jNbd6-h`i({CuRB(&GR!WR{R zZHL8gn||ADn$#n4%IS}dRHYY`rF>|aiEfPikozfdV|kC+-EhBmYc_$w`@YunEW3Ki z{gWwW<>54>6Akj5q$9Q$k!<-a?_nP2P?aE%db`RO&kPPR1pAQq`$vnH(ZcUXkDfl# zt40ldt2M$fnw#{msJmET_J%*0R1UDkqUZKYgkcm37aXu${*b1$s#d|kcydN4P(=G=XS7;bPtUJ!dV zS?2=7m3IC&>{jAn8NV@@IKJi`ye-&kEJ>SAI|BxX^@Xn$uE3m9RKhL*-4qlgOa;|N zFqD-uysOJCMt}@~l-~Hf7v1;`?G1Wa@J4?L&92=OhEE1eBi4%#t?pKfT6q@PmLxGR zFBK1^8b{Cd0o+LPg8rcgO2!@3Y*IEWu?6u z|I&+|WS94?Z_k>hNH?JNB%vgKOv+?70w!zBW4Yv8>M#0ns~2T6`px+~;)_w9)#hRk?$k(i z&|piCT)>-F#qLvwRz;yvdGcoAiC$&W*uq_yAM)yC%KwkO3EiiDaPJDcc34iYkAH-< z56x5EjST7P@JJLk9nODaQR4>;rPblsxNn(DETKZ-liQ}{?*ub_Zh!toJn!QXvZ6LZ zeeP^`)Wze%BadwwE|F}_966mg%=I(TtCXsK{4;Nx7Cc5;t42}CXQOHH^udfnpp5^G-F8oaQT9xF(v=B7Hnr{-d1)F|n z)&$0CN}qUtC1fkQVQw0HYfk8Qt@`Lg4nf@gWE1OrMB5RT< z*a}i6v^aFvJlrdubH$rpvoY6BxA?nX+C)QQWRYTN%FGz;)G@1OPkc>Jy{nCX=Qonm zdhHc`nh3@%>Yg`r4Tq|Sn**WbWBB3YHO*q~36LFwO;FupnPy0)czyNZvQ8IQ0+P`r zX8uR4)0mmAN8|L`H{kGc`H#dQkr)@_n-7F+NW%|_IW*UUMB3V^g&7ZOI5OdYlo_q9 zlqOeIQ!%!Ab~@8BK-aq4vX1FYN)1T?XrGw8 z6)r2PZ^ICSKHX+iiupFCtMtwtMyoCTn@Fh4u#=h)m|55sD6>Ea(<=w_?6w0x!WO&g z#(|&8D1#k}$*-2pxmtXJ2=7GGJ$_?PNO!aQeD_+Xu|~ovzyfBg$@QKfIGFyn(7uxu zfsmT`YHW-I98Tkd&Ps8=3UUfze&7u7S16GVTQ!-ppA3x}ZFk&dp#76CLZ*QJ=1oIJ zR|h|bHSPWwv5M8Meh@P`o~DT6VR%#-ar)m`_(VCU&gEY*AxEb?XK4E321eigy z`_DVXeiA#p$e7?^Wzim?Cluki845D-g-jqxDnH3KCCmvAq2|^}6@qOJTkqqxSx>U^ z>VtdHHk)?^*3H?UXjgudJNWthWbx93<|5$%ePn(f3urX&@ZF;F!a#6{GfstfbsXCGB6&ADFx#863^nj)tLT6@ktmN(J5lL8hLQcf z>UH3~Gm+g`{d9<=1ns-?OPbTtJ4&9F3q!;>M2z zzJ+7`>?On=566`Ur1%G;3Mb6~99r+-gASuo!Poh+n%4u3sh8aqjOdHH62Xoyl!v+1 zc7=)-M8*>l;;IwjaNiivA4@;NCY^~qx%%yCcO!<43E$h9-R4#Qnp45{=;*M|O6mJ%Y?Bx*9b0X#S@t5d?>ePN2n&cAgg}c}5;d9;~ z(P8w8g!r30wZ(u?F0{xA6H$N#(%lYxT~Vm<)sow6%XNAL&&H`{JZ=?x9rc~D1PG@rhR0M<>gPXA^J~?iixCawh`3sM z>*w70-hwOgY~6Umbj^4(nePB&d?i$HpNn8?;g#e2W-{7lqj2M%1>inqth58;e(Iyq^~#@Bz{pwPb|E~zu`x3a z*d>^Dcb9@*;3u!GO5%&y9!-ffzr8lwo>>-ntFl)-ZId?J4MBasxP2B}*EjcBEk2#t zWyHR(+9Mr@-CbsCUYBzn4hGet)cd}i*0!5#ex>Eo>9^p*2blkPCX^EMVMkfw*-X>Rcui%&jn!$ zAKgNw$Gkw7@s*ZYeoDXXI@N9hC;WNP*5)*f@{Z-)$P1#S48Ah4R4ij03a7wk-2Kk7x>?D)|6<7kZ zfVC_$318#ZsWXY%b+15oK_J;PP`G;@hDhoB+22(^YlD z!b$4K!(=;8Z(@(SnPIdslFvR}jccTOK)3fuHvSxNbt#+Y4s@1nf=tdzKHfgqmEnqG z>UVyKB%;aDCAYsi1!weR1hJEg^Qfvpd9C>DO7cnLiI9<44W`X)yl@`2e68qC>zXW3 zBpU7gE6mvfX$x_l(P6x?nISBi_Y}P27j+!D@=pG8hcR$A^UrSuSwxuoZf1ysKhrWf zosYUU_|N6!4ycS3d`-f1G1KjA0lTzxyZ9sqv35jE?wAg2@`ESx6^2Yx35XzhuKt2b->n|KX>Tz2)i0W9q!X#J8>@SfpmBeWb#s*EC6)@!18pAA3}3#`T0X83Y|S zb@o6AmOH{=0hxLws(yp%edVO(ffE&{?*@}UJA$qVzXA4sbk!vW>=|Vyr1c?<1c>y* z5m$2w1rjEs5~xGHWdrL&?spZLN`$o5@sBrnEv_J`Vse;Al>XJ+KuqhN4iB-LYnFs^ z2N7Len-49j*lKgt+iE`X=B6-~+|vcH=)XIud9do_$FqRCPYDQOdpJ{l$ZH8;+5u^? z?bX5n2(*hz$a^4>s3@dPF?k};bYX1C(~etdn$n1F(}LQwZC zHhxJY1wlXHcO7W`jA$dApXUb2n@~-XCLZ&Q`78u@*kFoiZ8&|tc({7vsa$OFa7){| z{}H0k{dBLnw}>L{)|(~%dwP@SCv4c0H9fiS#Dl$LOQWBwy?Wz*&xW;B_6OL?v(YMx zs(v?M85z!i0vu^YWa0&~@CmHmoepygIH~TTyz2+wmMG&l<7T-e|@&r82WH`TwsclnJJ*bDXHY+CScPUNq|z ztD82Oa>g~BE;t#1$>ZchKUg`>k^k!bsJPwFMux{<*yu z8Mkn*LMZf<63ADQxXY4ET%!rCmbi&nfyQVD(>K^sCcGx06#rs6-=)yPN8`0x8Z*fy z+9&Hx_Z)W}xT~k^@1}?-KdmH8&QCtZ9Z~w2MKm+|#LtYXn;=NAm)i~^x%uKMv5GHc znIB%#nvJY`eM)P!Y7OS#zGph;bF)IcI_pnFnGW};h+ek&Zt#l7&p97-T1PVYz;Lun zq~fy6hNcW%gWKP~s(0!Zv`P=?_?Zj=$j1TC*1mKxxbi!kx1Z5#q^IVd z8l0nI2Hq<$AZINWFs-4{8-86^JhCf#_m7!2c}Q;l+Wguob*{$x{tNVZ zlj+;|F`Alo{)6Bq-1aKr2SI^hO?%ectS74LVT0Zx`F9^;F41T!_fCR4WQ*nz;Za_X zndV!z>f3Vok$_4Qh9Q{@8&WRfsPNFvwYIY%{lycD3-nwPvfVy*Ius8oDUBdSeP1-G z_1=v0i?Zk$UIKUVsSv$7VVIqd3GzU%|sv5an4cVG;ci4V&Yt z$S!V5OFmr4E%BTc*YiMBQq$aSGeDVoQ+flz0Q>3&LUHE1lxi)|9TP$lTb|^yf=T7^ z_T+j!ZhD2m(cc*Z)*?Iujip5b_7k@7h}^+@hIHZEUy!7z2omvjFM3t?Cr-ya7JN@B z0n|`4G;d>~?feHMXxDRw#un1={g#w{roL|X3kchkM#2m5OCA80v`zYBnM}d!rd3M! zcjmX!0$`;gB>)sBaN(J)70seqVC335U*{HL4hhNgzPkjR&+10Ev&A@d2_DN{%lQ`BQC2mW-2vW#BxaklhAYG;pSFA{ zxU`byfKT*h9C(bTN;*k(oksw?E{Q>czX_y`{N$3$@huncMs!9UO@9>7?R_Q#OC(=p z8MGZ0YtM61S9A(*IH-1x(MB7316Rl?^8GUVkl~b#{g#*DjWEC!y!?-2M{m zb+*ELUyY2La7e_uL#`^9c-i?n*&d{aztB5MV{0zToknn`F9bE$cpbY& z%=_2OteYM(2ijI|XMTOhSQM>*ym(1td~zyNruvA5J29jFC=e#+{&wT?Yg8}fRA|H{ zjz#i#y-g-Zk#ueV>@dGg?&c;(B6j@wjHPgc_ku+*vR0aqr0JsO<$$udV&ovD|M*sX z6gayeipcN-Ns;tOjVYoEEOSn5q|_ zHE9!!hSCFMd}NsVu}Ep3N6h@Tt(}%G*9+IrZDt;c&xe=uP(+#+wVhaR^2vr#cpHaN zteJlSqiDxQYf;?d&@G$|X}EiyprE4?@|P*#WJyw7ElG_dBev-2^#LJ$TUTd_hs|2X z?D^TLNNEhn&F{#T8}liQE~&4RC&Q?@Z)e&%&EDy>*GpEhVucL z{?nBIZ*FK|dHl5%cXrxfLLtY{KS29HeMP5u0r2bAX|a%+ovYDNiNK1qA9KeyhrAtWDct3GMrj;}s84Zj zCJ7THikE05s$0-(Jj;8ZGN^-*@<;UClu*$*flx@dCm&l z2sLzd-qJ72n)S;Tb9fM2`+?D}+UGS?#Os&UYQIYSKw7O=7O{lGVx=qlh#Hqlx{Bx~ z!Xia+KN2cehqqiR~^z!VD@zRl>fAS4Gbj8{&@yHu{dBNfcITaBn zIe&UU;G~srOp3^6P+38Le_XnmK!v$i1=aK%$~f^K_7}lsxlfOhCP!-y%+%YSb&A+} zz{{%i0DjXj=nQbXRjwc>8=HL2doAt{uv|H>*HkOu$;*v6+plj0UgfVG_SK2c^wB6- zjr_sgkNQf0UR@-`?f5o09|nqh7NAMyShRD;s;(o_Y>uW>d@PLp?A{jKrw7G{_M#qO z9DB-y9}TvW?G32HvP5Yyr}W~vj^t@ssey%}`p^eF#Qr|zQE?vO5;_k9oZGq7UOrA! z&Y6v#t)q{Re%NW@xHLbhC7K*@L`7?)j3~g1KOm{O&K~SWkeZX#c3|t~5L+rHjw7FYU!3&=fEjNJMu*;s z)B6DE$#lXeu?syH6NDI;i@p1g<$u)H;SD{%peGvCoUSZyi(0sa5u>JO_dIO9yQDI^ zKEOu4@%kpi&!(hy_wu$LT|)R)R=>%G8N1m2iSQ?0kEF>AqNe_-2%`)B@z4_{8D`=pS&nD5Sz>OU!-XcM8Y{!&1tW~( z>m&6_$LO%+kh7rlOk<^?MS5b5$U+mJypE<$xs-Z)rO)`KF98%;h)RRsS7AQe%kRbK z_a9rL(L@l22%Qtd_iJ4AlB-o>LCQ>Mj7?>1G1f#iIC<;qnwVDbS@<{e^Aw_kfjhftl7`%nysAQI~`IN7^#*Ivp<)$dfoS1`mh=vG9U z|0%Je54LGgU!qQd`t~nYH0`S-v0y@9lTa@BjYi13r!LP#IGy4zL{%~w<;0F@$QHGW zV7mcWXf}~q%H|(lu-8J^Wc23NphU>c8LU=x-|NFtGvgfYu)Vs3y44VT-(prr=E|_7 zEX;_r`C4Z#fDwV;&o!>Vi5fm*D1fRDc0LX9ShN(+{}Iwpz&IQ^NI)u`)y2;^zxO zPl?Z0tDx>NK&QX9q z0&$+z5pkq{5-OeVj^l{`y+r=|SyOsOTgc5GcH37@39*yClgb^WbF!ntZ<_FKr7i#| zW-bhOdrxSj{a!*gmd-zLuW8FnD_ zdu6vF+0SS3?#$&z%Bv83DI&_+_xq3?A@_4{x^cKqj&j;hJNV3JLS{v>y%eVuelwJi ztq8~m{=!4yL(9b1{24b7mQrPb0f#ies$=M>e@*AKyIeXi+<@3O0oQI{v+X zWr)D(W+Ai!cEAa}|GYl@)g&wBnsM(2b>v!_W?sS7uSEBkAJzNUzcd>1L>`Uj9b9ZU zhEkk_B%bzqHrTHi%t+KpM6tbBW{qp;E?iEpCTD1Y*ZK7RtnF$gB$Fl<@-;@#VD zB61Jw>+=n4$F~q)29>+XqT&@F#wT)KirD<#KUQE`&x5o==w@e$4he3oVY5Dn;<;=b zrl-t`s`l}0#DyObZ?)&WS(g;ejwz|Iog6dWpe}6_J0(j0MX7Pfux2FOZXMO=NY6l` zyOL-3c+Xmrb+jFQi7J!ZI7)Im7Fyj$<7N|-O*fdG4(xY$U)D{0C1C%4^wWz&Ml{Oz z%y=r%g^_qA>!T#yt=<->&TjVSD<}~sXh!7yr?(<_na>NP&6iDgL^khRNkfLBJa;}x z?Mh7T8Z@N{g@_!`Er|)P15+a|JqQi&(Nt0dN#dWQTKrn8c!l4Vapc;Ke;?vJT1ZK? zB>W)1PX18XVkuFPEI^=;##K2M$bAj_uKWDZz{MB4z^(*dzx}ZmOOSW0m!9_FmdsNQ| zB)q|IO60(bn*5%iTIzv7Q4-UbTNrpGzJJgB*KT=4#Gg@}bkG_HWv9w1xbIiY5uf;|VKNEPtx7=rY{sqH6 zkX=VL_{<-BCW(mu=C3&A(C&7A2m{*P7j*|cy|gN#WGWik`9`-<$eLzm)0? z`cEt%G3i1-(FS=c$9MD03UGO_PN|NUkg6+XF(^U#fa%`)^uY#wIeAwZo!2M#Rzl)Z zfo$L2UzvkAV;eb+N?<}0wAE^L?qb$KU~rfAW2$epN8I@}>7VWMYAvQ~O_0a@+aK!H zg~9PA?1lPJW+VUC4O=FAuJ(CU7e5YEk_F1A-Hf{U(W+lVCH@nExc&IEhwLDo4AkjV z{d7Ato`|$R)qG78c_&~w1doew)%P>lmW)K4h$dUgK$L@ zwBvt(ME{8#E!DpBlbmue8Ng*Zkdo-RJ>^oeD%Y1?WYwR9fnAvTU3BQ=J$bFD9@;Bs z_@|9~eiFL}$JU(Kd*D`y%`-1Q)xwHYPGey>b?xt*|c*hwCX_a{qR1k7{nB67#AersxKK z^7B9JW*%?w*lOL3OE@rQ)u$D99|AvP*Xa{*%u$RTLD`Sxn_Y^PpY$bgXBkvlMPROu z2Bi^aEAggu#IkZ8XMKh__sH(L9fNE&n`rK|@ z&_eF(>a)ivmrh!YH%mq8Qw#~UfU?KV%(xDHyDkjuqFrI3@HOCev@5d(&Em^$mC&m8 zm(4#$616OiyTIF5=j~E-S#&`@D7Qhe2iYkl##%pK%8oUi%@@US8W(PXKI(gn=n#H$ zIZT~${Tkk>st@{!U6MOg>iPWZ7Aw96L1{0~$Jc08E5tB_mp600xSaB%eCsN~5QPa? z67-<$t3u&`eVt%gJ3x=o=lW#QZl=n%M$hl+pz{GfgRWG(&62Y;BI`%m(A#cOR5sg| z6vBKhnDg1;Ij#hw_!gcX#h|@;yQTIJ$(=}?Ri~=StJ?NBb_-F@9c%3!jBQ0ZHNT%iTsys$TA>s_-XI=;ZOnD0@^V*_hd*KK1j5?qSD~ZxdJ_tZ`A* zdmfs2@9;-hr`y^LXUbMzcKu*%+caYy9pKQ+Rc3RXsS0`7+ZE-(Lo8PIwE26lZQ>Wx z1zdqy3oMrJ{@tchzi?Hd;bje@ z;L;(Y78rX)x*8s^Ab!}zxEZT!a^ID(JcY+HG;rGa<8x+OZg$B6wc(+ZopWsDpa^@Z>rp!yzf;8#YFpHs+eK0ezjd}E1pbx zGdS4)@vz@DX4(&jKjczzFZu@XOSo#vaXqKE^5 z=NvfB)|8}~CO{+UB}_{6%B6Y(2mUNi7y?g@0O0+Pv~-X!@L+nssl7&Rt}VA$JiA() z!q?wxwTpCW4sPT7$juv~L5C??=kuPkj+} zHlw)_gYe{v-Q4D{FVW=eI$ANzYC3~rXDL0=FM`xan5TpfG@E@Ou^fg1U#mB}+FVz9 zrV(a`bvh*mH7My0@)9Fvk9C87^IzqpjPKWd0944n zrtT5^_Xv!?1+bubb({K1^mNMH%aeSWn3p|(q4@^0RkH=}{l%IkB5ifV5-sz%-r4_T zbNr|qaObWComcvifXxs?lL86XN$A?Y{|jKg+;4jQC!-v3^~aXmC*!)NwmiP0Du9hh zrmLo-0THi>&hrl6k!*$kN7`S8Rk?M2+^~dz(jwiB(%mJEl!78%3y|*akdO{ZX#{Bj z>F)0CmIeXodgt2L_PY1JZ=d6MkLUTgIrlo(nq!VR=NP~7AJbVmqTNb8w(vo^AXa;^ z!0{d2p@ad=2G@!^G#8(xg+_x0npM}`qN*E6VoO9b{?)-ko!Nae>DB4}oT{D(4BOSO z?X?&mA4GehQeG?s)Sao45=1c(mH>3pgA+uLWDb)|{>3eKIPUeV7<;loYqQRj-VPLE z1RNH^K((6Y>NL+QlZIIGq{Q3oR_@n{?X|9Ee6sOOMPuKrS6*=HHb0n17lr$PFSFNV zeSdp?eIprd#<;7nOZe*><=RC48|A)uW>viYo)rEnMNnTI5%TkIx>yaV)zlw?TkO%A z(u#e6b^(r5u6oD5M1-!ozY2JxjUIoWcFS@(*= z)Rb=Yj4=G0>yzDzHEZ0!f9l*jKh-^>hqu)aWLC2v_!M! z^{#HK_k*?)VtlFjt*`n$4SR9x3|l7e^Os5!a)SXPODi^S0!Sd!jqe z2h4MfsMm}hP(?aRjbbKmlao?jwmIoO4G+~Y6px-OP-SLBpH^?vvwoPOi-A~Bm%N$X z4CVtKlZ8*;>tU?jUPUCWB1u}^r6s3o1l5%KWXdFWJC=0k?s#67?yZlSn6A0K%+`Wz z>#Hi3EnSE{2C9om(cFa*(rF~Qn7gMu9<39%?ZSA5v`duc30^L>t~caIf1=Pa>gOfr zHPj`3gi#UGg~|zqzHE&eg@WzCe=3|aBO1ZJw zI}E}tJtSH_xh=Yxfp-Qt@Q}OP^QH3`nAQjQVADFQ@eB1c4`k!6+=;{+0v?JM5JaI} zufZQ3gjoKSY=3g*RrOqyjhOz(k>zAz;(lm(%0ZNLIVXy}90OZ;MfE!bA2sy?&Su7{ z`OL9?W5ny@u6)0k|5)<-Bx-^-T!B*E4~;Plnc`==NNYKbYCSv%6H1CKBDzKrMSS8X z=F}^s?mvAh+mT`o5QcP9^llOQ9`wI68cJOlTG*kTFDIZb<@|GTy5v^Q8y0L?I1GY}WX9JJi3DhB) zdIuw-18}}g5nJlQ+Ntz2AzD7grQ0=)vf0w(dep9qzNlA*W_J^>?fQ&vz{fSvjr)R% zrct4f>K9udi3ma4cCeM@dTpLnKxmeEOD(J$Wjcw}DDCLE$P-IWH8d1tWbf^<+ydst zi`J?{G6n&bVPk1saIzgjKO|;(Ou@Us8dsw7RY{aN?DA(D`f2l{`ET`zaL-tpy6l#9 z)3HYPa^#Zg9Vn(Q9BdKsyU4O9R^eBMQ_~sSoeDm`pC!J*(HmBguCZ?}G?YpGBJkVm zyw}*4V?zxFIQdwzq$1APskx2AH~Zp;rb=b-+LVt(@_O$3Ad>vthM@X| z)5zf#rEo+ZDM^K>wb7ii^Er@FOJf;58WFANd{nNm4%Zz!K|It+B^VjHM%a3~H=~@K zO(9@3Y4gJ=9p%K6vxmnK4^ho`o5QF}Zxtn_ba7z|cVDpd$U&VZgV{(aD!h3iZ+~=E zvN-w5sGH|ZoyF+-Tf(=omOR2B4kJZYr2zM~RJ6AR2>iT8Jt1nAu;p&Lew?R{cPX{J zQM;9BH9aBgv0WvNSNW-&oj*Jhs1fg`m!J6Qz9)@Lb9`z4Ins#RaCE&0tERIghQFH& z0T=dGzleMEqx{pNrA**l&jOB-`+wH?E@en>ED@9lybP589g}3EXm%MkKf{*_d`g_4 z_V>y1S)VDa_``c1G^l>b@Mnrx>mQKu7WB7i$ z0kH;T4{`7_j!`!7a>>$3^wl2q&Lvwl;$!00ITu+ftk)L(?OH}hqDelag;s^h=Pl~6 zZg1a}at5w|iOTdOUlMq~PnHe`M>yuLCgK6L8 z?W?tkmLgo})+HAnjGinFW9MH%(t#t(ZQc*xG`!UPZLx$4zpGZ^9g?oGL;tYee*T-L z_i0#!I^2d&*vs&&TXnJxVgFi~!t(JPYqZqmz%Ogpj5HOL|Y zE)pGLcp8y%I^H2Z)_*kiuDf(FGa24Mi=wf`{)sWhS~sCN#ArcaKt31GILRQ4znjRO zPP6)39O9FZ(=MOgZwt{jk;wKt>E#Z@4Kj+~olx9$#i+YGEVmtPL!U7iJ<)p-8qWNa zlU=A&lT@!%2B$yDhjKDdznnkei^6A~S20d|Ip(;C-8@Fz1I1_5va#Pz1HTPpABQek zr?_$3>QNxiba%DS>N0>8t4!nbi8l^?5}zj=%{a!ugY$TtZ+RK&k2unu8Cdg5%q+_R zt_G?knKtFowhSUEK35f)y{&y+kE1TBors zza_ko!s9U0M0RthL#0B}th*Wi=nmLMkz}y&_W}ROpmIE#o(cK=x%dl|U zc(j!Nq-1}mk)ztm!hDhgoQ2&Vg2{}; z|53E7;GI z!Y-_f8y=l!l}gb}Xy$$NxQP0176#^6eBg6;0T0qcVxN7!mTJHhcW(7R_6I{voq zSquXEZ_~}IcMT&no-evRZgPL6OfP2sicd{u3oI?WMv z{A1vy+u2?Q7OjH+$<7X849+ThXRxvQ)_9(BaVt%LG1nN?0m~T34uj(H{IPq?L>^tW z-mkO;Za4eDVYc~WJ3kaU-Xl0-5I*`L{cFyuNy`WCHp|+t#H+j8N{$BU_!ZZyrL+Ax zDdVBkFd~-Fi1#}hcs8u(&z|ihua|Ns&(x8GqNB!%Z zY1%UBfJte3z-KSiT)B`D{FfF@VZpxWEXkb@Kl)x~!mRf;G+s<;s#xn$c^4c4$}qb+ zYjN#YTELEap2CJMzek46Ec5)lamGcC-0ykfOJn2?jfDyy#l&Fq6x?jg{_mgud9B%UKH0KVXQ>|u2GtCWj`JZO#Gn6(c3C$- z|39qj_vO0}#bt8;7o+?8CbeY*7@#a1e$w=NnE$?GO@spa4sMHCad7RIeoiV<^GBrL zqx$z{Yk)F(LNxow#agHid_`6%BcH!{UTeMLOW9(1!}o+P^#;S*&kAsb?bVJD&lRx- zs!#JuN7UnjI6y-c=%1t7iu{lJ-K;q=t>rrT9d^V&J%2M=t6gg!98MxA>veO4$f!{n zdUt);RFD_|A$8iFEXo7oMc`Z|G-h9q3bpy;94JhZH12aK4lq4~+u+APY?J zQpq*d<4oBG12cOmW74`=Qa<~j!Oy$~pSK6Nm$CthxL7Rt z(dPRQnNGD>6MnV9bmF=28y1lhkd=)2p$lzodRFMLLAph5ug|Bvcr=^=W#Rxhl&s>Q z@!E1{Bugr?&PGWV6RB?QWVp_L`-L9@YGz5(U6SYJ25w5#M1g9q5;xHK<2HS}I zmzVK50H}72PW0A7(@0z7+UaWcTDJ#{q4cc6B6mB z6ZyS2M{>FP6kp$Er3=%nnciNV=8O2iHd=Lj#8wt4|C&JdoMuzVsqSagymQVgMzu03 zQ8tQ>D9uK8y|H&-N8mR)(q$`l_$=g6D;q`eAuUy|bK>G??RLJH>ujShURB5a=)T3Ox@Tq+z` zTI-GyWyi`5p$pkx}E*nK!-E{_%fSPMC5(|d?epZU#RQF z?EF?_f(fo#OVf#Our9^_Wcb+luyM@4%n?1NrQq>Oq(jLH1AXEyX*nz{KtWm+iys}0-b0*7h+GPd8)|= z-g;1O|FsdQI|TihL0cl?wcRQ^p0^vi+_*j&5-xE@M}#u6yvvi#YY*g5esB$Ar@?tR z*UBLOp$eWq@(l^H$x9Ss*fHwEI8tZwHqj03-oRLND8PnVEhvvIQi(0R{imy};7e0^ zyb`a86mT)?VeKx{M3t3J$F5xkVZZ-Mm2?!v6>&S=xK4xX>5Zq{NU8slajJ_Xr^%?e zk8YdXU5eA<(TTCWD5598dwgD@W_e`BvyoXqM8V3L|-jyw`n?d%dijG(@(;j6eq9rCkZU+XdRDyANcfZ1UIEL zNn2XV5FZ8=_34m>N1-Ags7K%}1m3j}2P}s-db1Kp`g{@h1uBUE z&+1+S7I9`2@(sndSzxI$cXwr92%%-Q=+v{t`hj@i_fASbqKso`$HUdzg(uJnppQ zp=t=g)zl+~H~Fz=#@#$Ys8)}2?*Ve9w0LZ~I6%xEjiA(@;9LDOKt_n$oxPou{iw6# zbdV6TjqloDsJ>uu%FEj0{5?UUwKLKN<4vSWVb_naN{&X*)>Rmc)=uh&K*tSW_t^$= z?-MKQoWe^qEtFTJY>=QKD=K0!52u$qfMFK*u^+;wE>{=vEqGq<^WB2;E1YgB4`f4v zPtaJpbgHd0u8#Yd9U8>6SI~_*@TALgINo`>SPk$WomK*H|Y%nXU`WkMYErAV0jY|t+#oAfS91JTKMi&jM6%%+-?z^h2wEbbxqW+qzY%k4xl`?#a zzkz9<5oR#Iuk`@doR;_48P7|4*G4oc+sT?m%w(mD33HEt8%w@79G>Wi!CCG1OYd3h zS_EhkGrp0sbCTWB-97^6SAI_nExmy(sl2<79w_PMu=@0PE>|^!&TzOkNmr+jes9oP zb>HH-^maK*j4u&z&6i`{f1xqeq%uLdZ+#1mQ~4U-g+|&>kUITqdM`6FFNxnx1C4|zA^uka0Nv{Eikf| z6CUb6lS975A}FXC@&}1KB4g@kl9WuQOY47-jakFs~pj4Zh;@{z3@R z^kj*S&gM0-(|iV^LH~$RM+olJ0lL6X5hWLqYILCsks{5SQ7hFOz%SGSO+Ymh4UWQ} ztz%PQuGc!bN}(Q0<+ZUT-cIy*T-48E6}}TVfk3!x*TWI z)?mHT`W$BzCk$<6lzB-%+n~jwZvBJqKT&zCkAJic29^C8%1o;{#Uen$Vd>@N*K zbgfb95HQYk@~sp%D0IO{-0?1^K!Xafc(lR|R5?<)8lMIS_KNIQhR9GcTnudct5Um0 z@--HTuIPt#3rnn7X!p~4OG!AfGOHYL5tu6clWbV$tm!V%ZsdkZ$54&!ug%CZ-fv$%(T{8 zWCj{~x!!HgP3H$5@hc$uRZ!Vx?57|fq%OI>E znEn}Pm*NRWf{S}QHjPHixAg_q2O^-}Pw{0aJXE#dt^6jlJqv`$R@?nZqKNRgjuAATF(nz{mgT+nYf}V+@@h`Les8!^ z^@^>+nc5i4m!0bCMq2!xD7Xnc!fu-D2;B#0%+KfTB6M8CIuLqGqtaAt!`!RD!X_%y zC%3S)w@&svVorJfuPrRD&l?f)8GC#RZ0S;R@3ukc*4g6(t)d4Hv;+^ZZTBa#w-e%F zlJZN+r3Oz?W2Lblob;`KtX7s4zWE7vw3m4{_1#2yb;fGdVS&S9mSc6T#{KSSxZ1{G zRY3?^W4-vw!RK;JwE(=P9X{DvzIuo`xg5)hCD>TrK3@}HLq1a%Stti{RS}P$(uve7e0KJhGU%fE$fRBWK6A>6maiJRUkgi6)K|CQ z@})DR%dfVO&o+7hvADBRC>qGCzD6JfW=9i}^O6f^6|J|hEC`VZx^i^u{1x7dKEgo! zXUZAP3KGp5kRnX1^AX`osf&ID)fAoCCa)$MIkFFvA;$fW)>DkxD^Ak9?(%|pg1C^- zrTK!4mO0I*S@f~Y^w|w>A7$Tzu`FezEUBYL`MkV(`{?~zXIMM?kp0C^J#bHu)qJ&$zbFyL4M=JbJRMI5%d6p!pYHgg zxl_d-vL8;D^kG>&{n`_HCJTaqoX8OVD(`oefx&$R8&~o}Z0Go?=?_6BHcnO|K;LexyQV&mc2Tz+9>@ zi%mHnHzY0I42v_UHed2Z+gFga$Mn*j~ztb{&CThroy2Qz5_?i|5 z7IXcEwoF(!N-{P_2vg~5jrInWquS=$qpZND&E`6@%&^bmWlfh zZQ+02wweh8FiR~+Io0bw*_td4JSKTrL;nAu+x!1R_;+O0bQ@P@H1M3Ty5lukFw>t6 zN(4;)w}a3^Zj$hGZClNe5UMigufWsIubwvlV&ZPrqi(O17?GmI#rfh-D(G*9PW$5tW6Y)*%pAB)fR|8_au;PNM;=anUCt#XmRZ{ z&|$^(exlEn(a?V$qhgDt+~wbGI-Cw8c>8P2{_2;>6)2UP0Ex}7%`~ssk3{T7p)~CV zUEvc;K)NMi_oF`}LilcaQy7eOyvfV!Hn6t#{Rjoyok!}$%0b;>4u~7xrQD=`dJW&| zd2?ao`&qx^JIt-G|F`KimylG7)ZZiuA57bQnK-n>Q5&%K0a!+sAeeT{MIhRxyQp?yE$Om5!DEm8s6K=?3u}0J*J|sC=4G1FWdc>tXQG^=@Ve zUzG8wAIr1X+15`7gO}{LM|nplz`rMAAtRBL6}8J{A#Fg_52bQ}9!VS~H;bqW3Wt&B zJ+x_bk+T3uiN`{vmK`|Ho*NH-o;?JBxNsUW&#VdNZ-O#HAoDT6fhRbAMxa?dx!3GT zgxlBe^C09k1+MjRU|a0!5%$~p7%L4r7g`tE|ACU(C{*!m%f>mLjKmh5?JCK6RtvSC zbkB$n2n3wJSrIeb+ya&hU%u8H(t{-kV*6O?mpHCKUTJcFcPqpURc+8z0Z5(!R?yXa ziV)8P%&}$NK3Bd*RdG1_uH9kv8d|ICB5;fm5C~e-oyGM;ab0eR;`YWd5^B{uM*;pU z!EQV_PSYx>_?g}7u;Kj4P=G0Lm{VLJ`SW$gd7Vr`=vCcT$nz#&G&Bzqcl`w_uwcVD!DRKPiM|0lp@K})4hYqghes>KL&l1ROzoZ>PMDD z+1g?1O_~fU?ye0gd;UB@qN6_H0o=C$Z0t`>UxRr4c*pNkTjwT!*$>$dxJ7WEEan|1 zZ>R3ey{S@IILK38iL)yUP>9PW%UUV6Lz)t~Tk^X1U^km&s0tuF{cyUBjLT%NFtJQD zf}Q~(N)ZOG%DLq&x{1zb`uGErR&4^HA~PE)<1KHuw6!T=#l4X*U?@c3gC1a#!E$~S z(Mrn+KP`BnZ6~zq!0Rx(1J;Pam(ny>t>0m5cb^IblO@4X^U3AB|UUnTQF-X}A zt4c~~K{YOkSj^%BLPzabZw1Dr&UHWXjYcX2M?*Sll9GQg47S=H#G}E)7dvl%l3oD3_;QhFxR6UY5SD8D8oz;8@Sy6QTtVw|n7BNwXTxbOir zZlzr@roSsdGFPsIBzJO!T4AcE(CM1;imfgNnsh;&9K;6_TVMmWTU5A z-;dqc4;Rj_47HC_s`c@8+dM!VM9{zr8rESi@^SXLAA|nK#ycka{^!YDVVb!y*UDSvaRXEI$R=kS<*CLp+}Y;c z+{i`%&>E7Q)8VVyYGbp7=PiGG)MQ8d2;D||tCGF#t>J~P36jtjOKa%kTgLE(V{>YH zeBociVku0k3{1>nR4F$+M_SAE`Ca@a?)a%ELs5S_;NJt$O`P*q?5wFsEbRzld5$#q zQa)8+rU(m4^(h~%Zu7rKE`EWnB^QXn7XECVOr?v+PEPcRU*6UV=0hfTLk4`V=N&5 z8_YZBkzC~%E@}x(S#fE0G}yxM6^02dUgH)5b?&~GwDkC0>^@O8P3&~VQlnPg24V_TP!#ihvz7LC@i1dE5rN*M%Q_S`!ZOR9U2iJY_+l`NYPttVZr$gk?ai{AqKo zMd-Beds9sZqQCrUEB0Y|64lzUX#LMQaK!ZT2GaXu5q0>u?+R^}5v%KWDF}oyK!^rU zMShJWVm38RTkUa%yWP%EbR4Xl&O1>Yk&*ms4>0WpPQ>J>3@OqMo1h-xluG>g_khA z>*tJ7vIWEH8kL~gj0(CIqM%Vf9`fOjpKRf5oy3EA?vn0Ml(wRtfM?^hW zA;r|N>EN?jqh_34q|E@Sln&xNscfeWdN*ff-SJq*)nc{rj^#pajl=SD#MdZ?TQY{d zFK{aA$;k3H7RKNxyIMl`k#u%R=76|_JBrgG3!p%3-YtsBszwGl>laH~n zH*IMXGB-?dnCxlOX6-13HO)<^40nyW?ZVn9?bO`m+zv999_zqNJtcSQeU`i4e$6Jc zIU7ah){VFjAB(d#O$Xi8|6WwkL4LI)eE)M!#Y|=@0jRf{j5@GYIY4)bW7FlEDhv#L zL&)P=6VS|2u=W8NH;L5qg1j^`67#hov{9)X(i1J7m=qqHw=T)Y+kd{~Wd+(wAdQzl zlE)dudIQAUDXXFeu_?zE2Y^yy<5*f=VEF}fs&FDb!h(9gmPJLGQKFHA@m#QjRH`V- zJ)iwmBC8(cGRP;a56AnVMK0foq58j$ZE-SsSYC)bh^-K)03WA!kEMh?g@eK0;98v@ z3W|3;85TpwS0l9qDw7ZDyI*Bq5EDy}*1U&QdPf!A^b=au>p?)98OS7K+VQ3S6AAo& zzbQ6M^pX09v_veQUeRk_9bIx}OG@IepyKzdg1jR{(16D{kP@U~!B9j7cwb;x#|vHWm2*THk}Q=PNS&Nc z>BLXGzhy)8!GH4Kpagtg1qGIB4O{t*O6)&^mEZ5(c?=#pe4$Z8`yIyoegeM!D;~Ub zCw)%-S2_^h{NwL`{l_>qc(^MoUqjH0rtdD_QIQ`GsD`42`_5rA4l=fj^(MF1XtdTTHq{|8h3W#>T;@U=pJ{@TB+ zb&g;1|8lgzV`s{ZlP8Nbl0i{aRh{>bzaRLWC|O{rU6O0ZI3f0*{PM9Ra6Mo8h%&qmNSm<8yKmHf^<235($W>yhbbWZ=Uu)z}w7J!=er6oVqpv0O#& zrkmrJXbk)Z)mhu~HRUxRMHm2`7s+;v+fpE?>j$zFbJw#y6Cf1Y`rI?{nRiU2${8st zY)NCVNsN`gs*L0Pa5FEgzcy4HwLMo=0(NJM>>u1q?gr3!0op%F7fw5aN!B>?4YX9| zT>_cMeBHA-;+5BhA=dq-*Wvp2Y8}6JCko=#48l13L35|E5KzqNujWme@aGMy^gUcn zMwM)&EniVt%Fe$^Ewpkjtrt(1MKZ5m33w~~;;Thp9Agnx!sQqcaLxblb=DuMu>z;Y zcc9#hspB%A{`T2S#s$fws-*t7*D6nqzI`zT+Cu7b9?(s*@ut`&BjJ+)ZvYB@w6fKU z?kv8E7?7&1Pnht=eIat7Xx#oQtDi9|uIZHRN@M4&7XxjzkLGd}(}>(+&?v3}N0>7i z%c1sUs@=*Yy5!*3)ykfdATX*R*4YxK53y7fJdG_c5<}yqiV4g9A~Tn#Hb>sLeQ_+9 z7%o41qQ10R@b{41bMhf@vh6nFUlrKUI_|*PHwQS!LUF~Ux&$H9kkEDE7!2w)BrF(}5@AT5r8#yhy2fMGq~ zYcMBv{Gi?O+yT z+?z`#px?|L`}!*DiGwZfMhK+-J1**xeAj*uWw`Z^Q$YLF`&nKkLy?;14M;q&J3yO9 zZffrblD-C}-lJQLk2dn%sufXc#E|-Vi(DFOoj8*xI>2{k372AeDql~WL*Cvziw_mH z$uq8wMaGYJ7%grIHQDJ1Wf8A@r~b*kVg63s_55I85^u?Mmoem3FO|6#b)V{6w(vv( zM)mK~a`dTpz4RsKs#*?j=o=9}_6BxWnv8XR^zzL#$rr-=)RSo!geIMQ!Q{c4yFzc~ zoZ^z=@+0w;R#D^C&RIc8qwUcysY?S!MaR+cs(qq(4Ki zQb?1Uyii=iZ?7MxP!4RwX)ry%e@tJf3mP1s+$z*n<%jhHQNl4$x*kiM1SnKk@RJ{= zV5l|H#y6(DU_p*5VsgJs?YCGz5ljpTY~%*+HE!=L*BM`p5l=+;vxg_gEYl~3k}M4I z{v1ccT<_?(^}AwW*Hc89-jc#%d|?3Qig+r6g%T=1b4<)DI)R|WZX1H1_c-eGaf*eWkO~3l>!iw&tB( zT47%>K-o6I^?uRqkk>|zy7T=eiQ8UOyd{u}?!%!AU|iBPqecQ$H+6#K6~u5C^sOEi zk8F9y`R;O)agyMAqh(fq`f4~sjFB(+$3XJt`q3%qHVTIGt4<*Jqdq zcURUI$s!oWJ_kV~cFStmY}y(QFb({Ud+z~14DV)oMOPTn#qQl%YsId%hz=C+-_zWW zWfsdPvZT=K09L*peaXC$9c*$>>hUXT0r1B?uwPjMF1KafF$F+2PQ%c+QMpi8yWev&WF$0MDX~RsB)G z*u%ph5c!qrBFb3ID0I8gipL%HeA&;!=zjqzAOzlenJQlAp;k{DvzQXvx1rqb=Pb^( z9AopH?s3$S$N2&`h2SdcT&mq5?-^itcBq){&+wPPPul}6(+h~%#CiZ}@}g3`S@uO{ zvYr}i9RA55@%Aup-@w5jK=@c6X4mK?BX>?crT4H9$al~7%7+}oyxLbDrp6rrl>!Q; z)Z6DIbc)E7IWyYUz1gB(NH23YL5ym3`&$?Ci+EV*H`~ zG)U((yU=@Wz>PICSc(E8sgAQIXP}e2LdWa2;-nAr%5(VH4UpeL6l#u|yuB5~nr_Mp zK7@2#lftBEZ>Bh<@^{7GAugvD4wa^PW}Jwj3yyD`0CroqiII|s1jG(bLyJHqJ%31F zTum{`yL(-w)Ochj+lkF@&!w2aLca6U2d?Ep@CuwPwCfF66n*FGqX7^kBl0p%ALgYP zcSWXx^X$eGXR4KKRLD1nvp#Fcor%JtTA1fqk!h(9~F(4;p&lONs+ zv{}2(eYCrpudgLYc=80dw~v}i#{^Wu*$mTXBY-I6<#|q%(HrBc@ zX3R<&Ci5Oq94NXVj!20hKFDdOK&M^{LVOj)IIk%niH0dM_$D5M_!kLLaEV_TStB?E z3b0_GJv73jMv!^2`DpK|a?a9jsw<3ev-q&_`T&PrNcYfF*P@RM!Gw~$^Fwd=<}c~_4$XRI)#C#i z3{S9lf`Cg|TkiO|6{}!uC?#{h=g6}wz)nyyKg)L*KO>VD>OxEP9b&a!b+a{TE26mz zyhvSlvsG)L4QY^a5rh+sIVZQtr^Q>2P!zr>kR!y0wrDR1Z;vSorx*}{)YbI;>^IjR ziN?00Q@eMp;*(9x`$S>WV3(Ra01{W1G%d#&YUA&;;*~k9eQc!(M#GjvX@ABmnRPGblkAgwZ%)FS2`)40-$a-S7A2w+3n`Kytj8T zX=F5n*m0ViRuIE8QqVueakfWGnJs*~+!=>MaVBuO$A^wCV<_J*Cqru0Y~k1Xiwk}D zrz>sf!uAf{BQo%zgRoM-o*>R4%;bCRK2qvSjllPX*mmpZ=m7e2wMPu(j@bfUB=`B<%&wMsZK2#cEm0<^N)~)bW@CKUS89msv2hEUVi%OfO zkt1JwS&w_1QJ5*vTDLTr$k)%T@p-WxIY-**9kyW(z}ZeQ7Gme4~q317)bg=Rj(AzS<4 z%d9b$V0el3s-c_+8gQy|$gP}iAV=9aNc!WWLb+AVkfPWScHMXICnmUP)YS~q1#W`# zlFC`rS3<*Yi0yqYGBezv%!UJpQ&G?;>W$)UH{xK^FKxj_P`|8(C<nUNC zQ8+KEAtRzEtx*?DS_n!gOGTBly)CG2_&nCS92RP&UO!t97fz9x>sd+^u&o5<-r@Lp zJB$#Nbj=oqVCIHeyMi#6U6FZ$*|Y!HlMdX{jUTePd5`81e(N?i_$k!j(NoAUd4RVu zM$;Ok9yqJ|9YG01pz#Y8-=ib67v4qw4k1w+Ze?uuz)kyU;oKD)R~OYX zEZpvIJ5Su}D1Z^6Br7~XoB)3cvjy;e_S~qI7_^kkEqW#Mq}twqP{+V-)2oi~gtx&6 zDmQ+@B^S~vZ)cJ^8T!(sOKo=@Pz!k&HW zzX= z*gZvu=Z?Tw30xLQFS&)}iP5+*M<+uK1U)luUb=)Me+dLzs6$d?v<>y94V(7PbyWh% z)u107w@xKMEokiSEqR}{3oPbd36?cFk?F{R6S4P(bk&V5jqImjjeVug`#J3;dVwEv zPg%)nTA-(4VS_y7+E2W&uMj#5Q^3#?w3E5WO;*-R1 zP(k!>kN;pt;m-qBv3P{Qv2=L7m(|VuUmNC4oQ9EK^>qn54+sOEO> zP>%pzC(0wA@$o9OaFc{3?_wq?3-0b%`>tWMr!iNv>YeW}STs5nm5HmdDc9bBIPd1> zL~dLMgOyGUgy zvM3p%jkx5JkPDLehI#=ZVhrYB6EYqoni_tu6+L;i5*O3#I@}?9u zU&(Snk61(6${wlCrp&=_(}8UTM-NUdb)I?Vjisaa-vX203zTT92+t0!m^57UoaS3mvlS4DqF#{7%T_NQ$ zvTvB3d7^)MnEK~k0!;@=cv>0qOEOe=4kTUl>2SH=q8zwQ3#4}^!KWc~xRM9o4scV1 z@frdcCNZ=2*195`P#r=|ec_vX$Y6;^O_IpV67(OJ%p!qo;?tZ0s_PDyN26T{Mj0N| zm{%{*TdI_E6{L|#TZVNLJ{%9sGUjA&MV|ir|C-D z1(EKy@^wVX;rYcUhYZxxa`kf1M!W-Esm>hwKH?w1m>`g!w$;0wP?U6f)^-fC?(Dh6 zB0PfviG?dsxd@47S6gse1lYL?dXx&d3!W0~D&Jl&FA%V^L^hEM-TqSEBv)&QF&OyD zXL7tT&UO3h1Ve3W6!dBpXmpv(lC1?2JH87qCWo*VptYZ$B5(_V3D#-laSHo03?I@T;MGluaJ8YHWYwxubB zhs0Y%6v!@(v~4W(i0-ef+!gQcNZ|x7QZ;L@k+h9xJ@a?mo>U);p}dEiF;8!?%0l;z zX9aD4Tra+cMWUVaZ@??oT85GHZR$% zF(etTGOo#P?RLqW=>Xc*1#(J~9MF#|DVY!^cY0RLAowYuHtN-T$}ne24T24=l47Kz zaVv0%k`*Mor~9b^WeSSq9o=y>V!$e7uzMUrDc&D+LPxn9c(RUx2?j8e*{_GJfmkVX zDaJ(gbj;@>AU%>I5m6sqRuna-q+<-rX!w9k*}Qq~v|E=dDA=4I z3F4nEy+#ADWm}`3)m^d7BFzl*Mgl&L7@%3r97@8(Ma{@iW`58LNjr1b6_l$$xyzK* znoiEBEE*=)#I?HKO`H`XK>mN&E{2b*4`9z-@2hwoQ{b26JKa{K{;#?k}M+4t3`Ju%@Dw3dWAJ8DbvvJw6tT=)Q!P8G1!z6ztSxPN%f zxEhqfn@^PK{t50D1AZHCHlW1(hu3~B2M?!a@(o-5U1s=eeCe8)-Q;WY#`T&7!LFEp zfS6h@00A{#Fm~@EcH#hiQCw3xUJY~k1vC##=BrERBIeZ1pw)TMSQ?+yozrW=Wir}+ z129|Ss0p~%D5l_`j7)1!XR+K^aqOF(Se4=pkZ+;x#E|3rMAp6sgt5S2TE7&7q7Ibu z5}`@qtVLbUDC1kldsieh^0ID&57=*6gzqj4D%O7N4%z*CcuH%(u_Bi_z=|zAuZ2M# znE8pZmdrE|l`!tPDqR@E6zHelJZ@G6UASfpX$-aPhLhTE7JrdIkP!`TUw{tCIgsIx z6a(Vu;tHsptM0_@ zpr-4K7YKA`09C}k5fNU;rXZXu0@aW+sJfxrytD&n;&r7n$e{00@5T$43rUze|XyNN-_n+ExIrvV;rTU8tT3FzV+`ydbH zE8KZ3{TT8x8AD^uD=&mna;|?>XkVL)1oMQG5p{I)c;8$v-CF`;;8-`QZuW)Czu>WR zP4rP1*KD^h`~&*PA<%cp$M(?oCkVRuVVC1?W0e(b=2z}-o9;J*+CaQQ9CZwOf#2W@ zWAMXci~{~y^9$t4g2;jyU54>mKZSzMZ49|XzDMBS@Hchz9+U8RLDAFxp%os!nPEH8! z>_Nc@ygRti57QEe8Y4zg^Qt24Jp{@=uX%VYpz0Qi?)Ntd!v|uht(O8yHw)s5&g};; z!ox$FZuhO;#!b8vP;4Z*a|x0U=)Q9KDXHp^Jdz$_vXgrYkjce zwp43u59fsdfeVizvg>DkWnlN|&0ByeuJS^F!>(mHhuWLEmuNR+g3gvM{+a(DZEqb` z^|royiy)v#sdNj9(%m5q5-KR&-AGKjLr^9qB3)8SN_W?!n@NLocjr5%Ywxw!`t5bj zb)ECR@1N@eS#y44jPcyh=e{3cDU-6z(4ENB;Eu+U#1PxStU}z;ZO`xt(KCX`X%MDn z51S}@x|%4G+yOLIT3@8O#4_5?DV0{2!zLl_MkxvyAIE`v%T;v6-EL?a;6mtKJre?LOL zGuT$*+EBWieUj1YW10AGT<3SY+8DX(6VyQ6JQ$ymjr(O0@JRNDbL5y$3A!G>Prs!E zWvyDtasqFAwFRNfh_jr>2ySbXvikE+h+CAnSr7JxX9_z5249OhCOo3CGJkA%sD-(0 z76w+Uj7Djw32W_Mixz!{14*(y${yI(nR>v5q=KZ9F#*S`v47WkPJwm(`8vId5W~d7<&5h@d6c( zKaBi+0}|6LfMZwW7G4diEQngNi7OAS6eeBC6tSnSx_#_JNxu8%js0Q@`txYEawK{P z%yIe|k!0uY*_8nv&WU%?tK&)R zjtWkgr+eYSh_XhHCy?%}1xtjN_}1$5i@*z!IP@#|=F&u5t}6mWVyUfv18Yvc!0A3b z&;V1&mj}yU3c3y2D0;y>V=1ARN$;EP@*d;VXQ^tP?o+LupJXI9J94&kI3pI`{ySaF zIM@5p^^aQG;QTF5#SE_moVDjELWiFhQltKD`S2`8=w{$c76OD0LV;uKkA#d$!$SIt*=-N0RyQ^5EilZBsjX_RQU22c7&y}0Z!PGbZ->3XJ5KZGdj_|#eGgr(wWL7~n}79ba`{d^ZhAgJbIoS0CZE_EmpfUUt68#uE&=;5wDWEmk(>vLuFWKbrkbC<5V_6X?3h}gp+6*Wu^t7G34 z084$`amkQ^{SF#WlLqLW?eE?z?7$fp9or=)dGxmnYKr`19NSrTr@5iVIyg2x|StHn^4Q)g4S)ilU4Iw8Lax!hHO5-2-4M4i}S7+<%Wi8YqZRb9n zdk=95Q!?d+29LCYF4X#G-$Uk-hVHEKzntt3C1G{ zjWp!Qf35W$N-j1y;`WK`U)O2?DHRfILIm+%(Q&eG*o+0@nm`jH;_(aCYu>m#$oM;c z@~i{Z{4*4Ujy zKygJAwR4AN3ZKL-=eY)uMxFZMG$2jpmCvlh8o|x}B^i|3PH}VE{+;1{QRYziNG!>= z;O5Wf$3%-1>ReN48)nI%Nt94B*y%SQp^N>hxCvV9xS-AM$Q zC+CIyXItp<*~`4D_3VkV(6U=Yf<-{%n~D@~i`w*YFeuRwt|H)g&|al3{0helOrdgpF|W$)oq{M$DDqB!Qxu+Tst&9-`IdtE`Ih0yutxyB76ea~o? zv_^Ow8g%1?Zu60G)aF8b)UeQh;yr0>z>J~HL!)r-*J@w256WHlq2{}bqe~J)G_Mn! zOpt@2BZRmd42a8tSew4fZizRCBH8AaEZo_NMeJrhzL-X*E3*II#Qs1~Uw_6NrXiwu zvSIF#0dzagwu%pH4d~Y;HZ2!Ld~DZE7|cB5;GO1<`<$m#Y%8!`vA|G6ec_@%+)cYd zo8+wD3(+Z~TT#u*MXI7^+GILIh1o8jayF|ISUNj}m+iLw{zKv9jhuFHfl4!jS!oL2UXiS-~OeyQA*ft<_ zI?uqg;wX!P&H@%2fsF_MED`@?p8+;P zZ?VidE%t%h#%+b+7hgC}-5UMIELH(WU|;d|9sW{#E~Z0+H}pc``ktOrF4If-^4Cc+ zaL@>gYmtMmHb3;#EQq(R>Uf7XgGa?h^q8bCvi|J9ZkrWCFyxWVRzR~>lWb$14`9)2 z^8a3lxihj}aTkc+IR~`PCh!3h3Unx&fq71wo)&YH*YyEKxq_w_vt|X09bHz@JKo1S zS_IqtHg0o1Xqwla zRpF$wqdn0BK#izH6GCa!$`!Lk{6*Pa~&i|p|?2eanyLC#45m%HSK~k zG2LLa3SFN2d4axd0E}lFvyn<1-_iG0mOJG@Hmz~o9IxaU2qR8&uFY>};8OdPJJU>k z1N|R>=gTsrWN4ZmiD+A)GBL`Xi;oxgR!5E1V5dLzn#1!*7+cg0c)FWh&7YK4WP)Z) zgA2*+(Kv&?_i{3AbqlIp7`JDEsUQoZhJm`_Vc7$xaO0!z*D&g^FN-kDjg&V`P*Vd; zp539mra6DCbcsS91U-vIc(;|qRX6wo;>NItobmviVg))fXj1& zPc5|iZ0{rx&2f+8&7q#6Teu2c{okCKsQ;WF9g2Pn>Z zIz@&bn{8p?RBx)NiugMD?U&^)%ImKf_ZFB^YjjUrL!V6oo6BaB?R4y|Te=p4 z0w=o%-dGRQAA(aWLlUiJM3DEuUXq|&)zxg_+dHYM?UJnVhpgxkM>`9=H{SpA`W5+P zhugx5zcR}K^bVV9VXRJCP?=f~$Ck$!;dOYLEY|jmlZ3j5Qp3~xfWz5XYC#MBQ4G+b zWgP>UYwLVR&L%!OA4=?@=WWOiZKk=iW+^Alm0zq|7iR-K3Kx2pi@wMYwX)I^Ns(Ff zTP5gu->t4{TJo zl#NaM)t*V=Kk-!L2pEeMqB@%U844E@(~bCtU(y|?0>5No-*Z|-&u0JluOH&ypXhZp zLQG-0?oRv%YHghgNIgeC2h|M!u2cLb!@g_%0rE{#(fX`K_fFi0_@t;V> zt=~9VL!KkOU*$jHWLGZ$izY3|4Fn9U6VyUP?(N~$B)r6GlB;S1m|0lajk|wKDUaGC zH_>rsEmb+KCWaAOO`CfB)`th_ssvBGmAlG;ziI4nXLfeH6{P3&0CGjKi1mC(p7FvKgZ57J?EgtXUkr@?y&ivNjmt9A(Ph!hNM?F_IlsyBue+ z31GF2Zuy|E9`he*Et7>j>^9~3f;Pc1&oWCs{_ANacx~(!hmveYC0w=A^^_;~fQv0y zTLOeI_rC2b&0{|(5a2gREbRT0L4Ga9l_E|mh4OiC)(4g7929P(MC$;JvseY;+RKi+ zbB)_+dAi`ItQan@KOzXK2iC2r-`EQYbleA$JkQr0LFC=`3CO(L0@XDMZULy!W?OH- zQTiC1dwVau8whfu?Fxc{Cu-=MyA*|o!$8p^dJC;81-7K?`y&~y#%ij4e;&fVr*XYt zOVTck*72;Q<^@FFOPX8T-`pdhSq7@Bts?G2w)~)~PjIOPb&w;#-k_U1AY{#c&uJQ> z@+iyj669!w%-{Q!LSxD zbVN;6JK1nIodT^z4XXH5@O~&648cLEq5V$|Y7*=w-}b4BKtM)e2r(yJT;{qT?hpfC z;Hr1Y#~sCL+2#{aBiJuPK;K;wQVNa{lOXrEv-JiXs1d@$w)(pcXDj%fO{DZ9u!Ou( z8@WEL$c6DFy{SJCJ2(jgO>8fnRQvQwAm~Xf>F5RES%T=NZ?k46pP{t%^+UV*0(;;7 zbBa&NwFDNSJ)jwlBMvK{(l~=T%K~HVC z3xZNJ%H??g*I)uq=7fHUeVE`eOt#$ZWcwKCNk1voi764caAgViaWE=Kt(@Ivc~KS9 z37U6(8o8XuA-ER7K0N?X+6v|0HeKn7&oUnaeqOf6Uaqf#uw1c25v0o&$jf+t0uOAq zLGtCnaFBu~A@^m6?@eT5tWE<6+YJb!;*K9h^*jWUkQ|85xFQ3fuM&6$JVAnqOP_KW zx!~qEiQr9H=GrfjPcyH)K(X#vy;W8Wf{-eJJukHxFvK7du=jIf_{tcZe~WY{3gMh( z6s`aSyjC6TVU@PaQq;CqDH!lkz1K#vvRc!Muc4~zlX1^E`J+<3v`IdZ$-?8F8NyeS ze^U7`Vkbc5D00ans-!}Pp`?!cIzN!y6$Y{g$Mg5XcsLw}I$c0JU92U-mxHLq;+gpG z+M5>jGXhO_>*ZbHX+laYoAtbqMuYm+g43)5es2ZHyRv@8w?>2E3tel!CjNz^2FuO=C62{9syiSHSn%<{p|Srg%Iwl%R)(_b01Po$8n=$z%bbEsg~zB`>&>)tRlEC z0u(vF-p=2(^rO*;H0nEg!!}*CAX5&e|9?RcX<6izGVr;5x-*w*H24Qd^eE86xt*%v z>|5vjGY#G<=W)zNvVk=SLP4^3KU?J5u;0wmSp|M7Y{*#+IKAZ`$R`&9t*F|>23V=L z&+$|=ao1{qGAv03=_lIx41AZp9lyHZ<*#RIlrz2B^doag^#5?T{Yx$rB9ijU&kwid zIA*eyD)(ez9kvb#%5o5O7Q8L%%AzT{A0^qwJ?)?rEiB0vQIMIM zh*E_2=24bEQkvGwhPOhV_akbLCoB@PX7uI`BoSzy5P4q4_>|+gdDjAu*da9R{mS{M+dA{|yR`&^@E zj&IpQYb2qBde}U3x1t$mR911kBc=U;yvgrAs%bCJO&rPtvp7%4)b6|fDKkbr2{-YU z68g87>Gc3tcoa0vwg!ZZO@MDozf;`BRJ{o89R6a7-p_Y5MA6fF)e11FB0iwA1YfVE z=|RIK+eE(Nu_vmyK)9oD#|S2`Mf8mCnix*fcu6p8UG827b5w(w>D2vQlh zSi>sA`xXaFe-K?ql}+7BKt`{spQ1EDg(jKZm_LMfw%&2pnCxcn-HWYYuv`9-gAydOB%Y9C8s7N|0{9*Gf=5 z`%3uAK|$*?v=~Vd*6SQ{Eb{NN)rYMdQ~(BVxvYR>QT@7MH9^@?zQg=nEfh>P%1|Ou za`reAHPj?i)9W+^8lv6y!BD?_DZ;_ ztx{qr=DDo11~W(=b2gks&*Zd&89I$xLLjwt8qgzqq3CiD_}s#03A7#zsrhOLq8F_0 z1XAsG$R#8DtOC@V%?qyRR?Eb$e98qK4d}m`O5$t!a%D82<%o z-`1ZNKJDO1Ds=X|-sxW%1FC{1xJu9$sAT%+&Zv9*3T*>=-g9A}#6k^gx^HwdLI*9q z_gX&urLh*$ro?4UhNqnm*Ywf#ca9001MA*ck<9`}w8%_Y3 z_%Lw8aArzwW~kY*4d@vX`J9opQXX=rDO>A_vSb2>c1~woxOZu;s_;hFubLQ3Ajfmu zU5OP0n8Xdv&p^)n=S1*Q7~M|fUPb$cKA$OZ3pamV3|^{Uqm4x%>qMSv9awp{?Fy~x zUMzCz#ud-#OhRn8D_8hRb-l8c3JvhtK++UPw6%NBDL7{@&JX=BDVqFZ)nkw=Nvd^a zqLej4&=n6qYk&3cJC6`7QsgWt{h=x^GxSh!sk_iAY3gQx(e?eFEn9wQF1gEM1gXo- z%xR^pblo8A6ikws7ccQ4tFQ03!FlTJ>jlIaE#lQ@(g+A9lJoBn%y!xTAq2CaJ@oG6 zbPoXBjz$A&q(Sp)1%(#YUITkU3>2RAq_x_y7#C0>cM*U+iA#Pzv(c z4uLM|Q?G1AW>2ky1n0ka#lp=IGP@5W2U}8{G!d83-0nT3wD;NElHWLW*DKm`lvphv ze&M*CXSbJ@36{taTmsT$JrsHb&my9a8|G2lKU}|sR(v~@I zU&yaJH&^*8y1!cTVmH|Z`q`pg^M|3pBJc508(Rcuoi(>zalUx^1q!la+oLcOKgOXY z>1|myOMJGy9>}rUmDc#r&KofHLJRnC@$gYdR>s)wijb7@z&R_{VfPe1i{2+Nqx9zS zq0!@Kdr}sMl~7Kl+e165YLHG&?WB4V{DDKVfGQZ$LaF^1>O}A1zo?V3azgD=-2AF_ zy7ENg!xo`d^uJ&yZ0LW*PA=L02|K}>8{VEnyWQJ3?AV#gl!77Y97U5hbc^fb)fRKb z-0cf6*rq}d_RfTq)eRY`58d&0gT24mIU%ML8nPjad8qf=Dvt_nC|_Rvu-Uq_#va2l zX-@B|;Sl4UHwrZ-N5rA2hVCHHHsA95D>{Jf*k?8v7&SeVvdnkhK3BLbK_&JRD9eHbheX~PCP0I8N3OkbHS zXlI8x8V67tV~SXg^Jrsl+~tLjzp3bNbTO%yz#yyN1;5H_eHU7_-1ngVz8y32nIjS< z(VTL@Glttnd+~_04>(c-@3Z)D?}L6ug+{h$8z9Nmxx#HNNrJrjkdJ>uI9Rly>+dMc z*4-LsgA)xePfU8+<5pS%{RA)`yG*dA7lbUs5Ychv0CYR5Q7Ez<#cc7iUG_ z8dEFP9(63Ai;ZoS;`x?u;1b(lkFGWv4}7lXx0B4*d4 z%ZebN=E_5P8rkRXOf#tdq}*|R_qa%?9fr);`PPoz?bwnX+>dNSl4*KbeW=4}r4wh8 z0qWoC$4-fq-pIYqJYsW&|1!c+-i9E&lvV1*4FAMId|?DNwvh(sTj)O(;B*L7M1YON z_K|YdC=@>O$)NI|pa(mIW&j!R(O6Q(N`a_9fwD!+bS82FbSlN47JJ- zSie1!@zv)vQ`mw{wpH7{hZCS_^^oPK;$4XFin3S9LcGUM$;6LAH>3>YgvnlNIt)ng z?wdhctE3BpIl9gH>p*(aK#nw@BKwHF)kgOveP6GtNiO@J9oyk>%xAdmxITuLPAMWE zgnm1wKqAa0aTWOfm1H2l=E9Ud2K=;Jl>F^{d}ut>UnBO%yxe9hflf(QvS(Eym~wYf z>%6BAaQO|%77H*z%xSOw`aI_fT-yU7%H7uWjH!)zV5Td1HVf=oS|tpvo$Ar~k%$5u z@*_zNf0X@C{cZg_W;irUWfSyGwxxR!W~jT~)z5%qYmE@!)fQ*gVJeho9^FJ6loa_| zK*^)N0NwEa7^1uYDCer%MXs~&1%*Wm6$wEUJa3X&+YaP-7 zrQ}w2PQE#as8M|@Bwhw$amwDLNlFa8^yc z$I-}^ijK$9yw~{}?c`sbP`4Dv0sQwp*WAlhQ`wNT@B8do>e)p*C}ryl`gsR6tt*$l z?HBxPx>p9A&I3CoZZd5fjmZvVs$5@<>!Dd!|N1sBYJVSjiJuV%w7ysaB5mz{C;b*M z8@;h8YIQh-L&f^IXPlcO2;~-P!AT5*>#{W>YUIKRG(m^is!*14ejAn45nXp)TV3ct zFU_X+25>0pij;7?xCTX7Ul+AFJ|^N3oc>hI8_mG-Z;uj>zEvSlbups3k8o2aa@!j8IBN6_V(AQj)LAkTx@rqeQ;S)rzB9SW@aJLvNa{ba1JSOPhsZ5BC9DNbOHz!r$s z#T|cgFW_j;8MWVRaZ(N(2tjt(1yHpY1vLON@e^PaMa;E_iVATt$2Z_v8V7|>FS+OG zFUMa^0a(Dz3+_MfPSgKN1DK!w6gu!9ixOkmSkr9`hIigjo}*xgncLww}pi~xBVBvCH;$)Xp46xVF4XY`WRe7ij1%~KY@TZ+0jG<2f0C8GPH??BH^r8 zWB=tQ(tl$Eqe!0xZX(({w@05X@WC1Z{$o7rvO-1>2C4oe0#ueT@{cxp?jj8wtGQ5c zcAu2cBje>$#F4xza~B0sB@Cm1VMOe0BL^?(^B#>v>r)7iN@~3b#N--lfLx}KBETm> zu%K+2WhEMe=U({&K|2BaW!JajEY(}&>Q6mJ0XhzQh6UdZ74trjh-%#fa7saN^fb;C z?w{tOSJq%t_dE~i#TGn#9o+|N^_?U!k2Ww3btkFz4hDY327*#bKd8IdCV>o#nAFIE z7B?SlAhXV_sLO$R>@`uae3A8EGGNwYF^3^+p^|ix5Xkx(YdfjmGwwTrLg%OpDpJZI zfv9#1n2sCUBK|nX14wM0c$Bb16C8okN`7wRiIhG5H2;M~w?y`?>O?c)W4EnRcva1d zmaFGGl;`NHw;H~vE@l{#?orYe1;hup!>De4P(^2}2ftN|0X;6?M-6Q5DRuomAx&qt63)O9|hcJxT$32fgVdXe&6 z9TsEXsdGSzm++4I)Es9b2OCzAzjuW2jW*Pd+B<#Y+$#5GWUU>DibY_b=&5Y47tYDu z6d{#2nAQs>`N-FxI~((n4W!zeK9>bF{DQ_RD0hwXQXc98>zZRs z1MMvqMEJ;*jYAD(VlZ>v*cH&5v+UPD8`fZ5-j%(=FT&HN7W$8P+{_go06keB=}Ll( zs#&WuWVX?n`9(gz9L1JgHGj!9j1Gx&b*HBZ*9m`#!r^@7FcN{63FQKbRx5GLSu0Gq zXD_K2*8MSPNLs{%t86&7b*xH9zPYnZtCBg0NPYR0;)hj4ITDveUJTPW)Im=0TB~(+ z{}n(mwG{bEXk2T^HN;6=H@g~@BAS8ER2!^+8C|zN{i+725pRVaGcp<$G?S737_1g4 z)t=y=Esy+|4~a0!ZI^7QG7W(nSdF#@DM|9w8iUcyS<&kR!lN`G+Xla{?}qH0^x`BF z2qW+ep{fM5KFaNnAd7^M@-%HeoSLYh*{hdk?M`x6iAnID`_q3Z`zhZnDKUs<0g5<< zPM_H^kBp{^9;29N%cFm#FW>ROH{0+MU8h|mJDqd)Fv1b8KSBi-)qf9$BY^G@gA^lRZPUipIpWe*GA6d-M9j#k(DI3 zd?k$IEIvGbW2yykps`TOrK8;9TNpmLecy7bJ_2 z2DW&72#jw$<=O+3cu};RH0}|>IffkiH-PX#)Lvo)HMZ!7G&ej*R~MTisngGE2g7@R znD*X>PUK_sP*C5XP# zlLTDOnBgCUWp`f^`zW9&5Ni@6e3SFO3&rUXW>7YZz+1;_3Xh+zOOR+szYD_|2aERX z4S;pqdtLn>{=$?>c5M^4TOvd`9W*2D$W z3u8JY)J9%c8#;+%3>@meT1nHw=yF1H=V)XWibx~yZwEb;eo#iOq@Q!rjOg&Y>xXb= zVu?}YUPy=$r@_Np`SfuL08m=}flrcC)J(k0TfPIvm^!Z`arV*FV> zm?AHkBV&4!6yjb%BRIcEW`+|}nQuF3oqk>$mXst4k;CJje?n&8W&i2PUloE%vp`XKh=CKfbLr1;uj`G4Uf`C59=`@!g*r)CT6Yk*|J9MPVyHQ>X-ooeZD)shVs zk;shbDq{uR$|A;j-gR(QseElAT-&wZF&AjR|F_z}e7s%quDI5FAbdl%I|~{RbtW z6VX*?TmPv3Pc3;eggL^#$C)f!4L{)jYo*|SD|2K-?zM%4oSm&$R`|n=Wm#3TeO7gg z*C&6bvesV{CrCY+dYxs9URaDX{(!EmFnzYt-sAx61aSbeP4|D)x$#w=dwO`QXcugl zBXRmmDPnneNko663Wj+BuW$;S$#U^rR*L0Z7E^V#YLHcyA@g9*%r^(i%h69{yH#EZ zTM5Oz4>@xg_(u9()X?5KH;l0G|H}M(oH)o3SzLxBv zk0*I~8OzVtGp}|Z$^|FY%BOv0>~XTGH4>`2o;B`R2wQ;#T$)xkV`VNadtl7$H?GQt z;E`I;4MRvpHyOmsvX2JTH+Mi&f&;PNRnC8+&yLf~o0-*2IzkMFhcMhH7pPEnc#cMv zT|9><@5U{QdpRq z&~MQMm_jg^DjITuoM8-FFA(GK0ob6M(#6Ky^f{S#UV8Jck_(#0&7|91 zI6_W7aK__9;q)N?8wt~i;{#5?{p;;7!zEMkI1hvp+jT4^ugp}n1q>%Qy}Y+Lw%1qH zgDe%bM{wcatu!n^8ZC{q%4;KwBmGJ1RCWJ!~9QFt;T2%x^2*K9_ow!yQAV` zUWW8!o+mS6&zQu<5?<-{DSUFt$`4QZrYCc(Dv_j$`(~r zeDC;ve`*q6J*sgA!y4cND)VvZe)LkR0OZ{^0Xq~;B*V6k`)CPOy{`ZqGsEEJK~5-j zr^>TL5IFcuDfMyzPMLhCxZh#njOGgK$wC)1^Ugf9%n0o zlYqsSGqq6-ucsS2{2`Tt4R^=pSCUxs&aqj7Z+ZzLZEoGV|3OAvPj)*t zL6%8-(*gUpv50cQ5Xo-dS%la^tL|m;;@GI=6XzH`py;`4^*yviRs)aXRIGp&+K8U zu7X@FS7!`ud)3FeD-*nb#vKoG&$Ea?Cg)lG&4sYv^Y&n)H4(SH!uK0_<#C7z**6mC zK5QUdxSDsj0lCLKC(jrlJ|ygbEVS=<5*_n|br#7&W*VqRg~p(eWF35MYvvAGuFF8k z;{d(1puyotFwG(k5kw;09(QoH+r?ZTQ{HldG@2(2{vw@mui%Mh?B>8&0`N2&M{7B< z29nwZ4K0D@I0wRBfpE7bZbnFvo1xw(#F;(;UKL_F##i^Kr9wIA^GZJRf|hEJvWAsW zC~$%dfoSIgutddxC*#%-iG=W?L{C+o*C2oO@^Dz+?>Pf z7j18zcN&9sig7Sw*?Y*-w1H)igu@OhT~35Mj)>bjp%Sn|)M_^p&lpFBj~kmm!JBh+da zz;DUb%;*+)U8XUxo-<0L6~&JNoMI;)oJ~nc7m$wbU%j3I$@aXnXg?u3vn551ANFbt zBjlSzAa{Ro*JkzO9(e)YWO4P5i@+;tNhk{n&*--Me;VyZT7sm{dC%Ow) z@JK+ibx^JsMITrezk4CF4Z(n(3P>>J1J70WBhJvx(kTb_A>%-il6_0Oc42u5|!A1%Wg+SOCzF!nrv} zzTtUr|M4;C$`NxAaxj1`b6Xqd0_07{0fCED-EA}c%1yEnf%n$?MNbjQY zqO!Ih+@H@uG9+0;j5tLN*$8aGMi~sWu4}FYc8Q6+wKflgv&)AT5vpi@z0(y&g@VYR<;^GO{ihd0dUg>FdI zD|0=I260k7uvxSemk#}9!{ zcCE`mU3pIcg5BS|7mD|8Hob`I?p)By9WwIFFv()E|MvU}O4;^CfC53d z>E@ibf`EfKmH!-ui^GE^?iL_~?O0;iez&i2JMX*+p(vW)m{r;oNVk-x&%sJv!yi&A zpdClfPmSCGSI6mi9}wT)osB(g#pDIrSHHJ--QlyJGc2j{oo6u{Oi!TM10Kkzy1dch z3#2~8&BeAxpw(vy9+ra6E?tj}QG%DYKEov+Q<|`~IPPe8)RMfCNT- zmJ}vz#@|(C>lNZMG~==9I%G1TZD+M56KTKw{2km;EUc_HDNZl`c=H|Onh18TM?3K; zYLO&wur}mQAPzqUFnFXgQ-{2#N11w=HgoTJ&^o1ATon&}vFQ0GXxUJ7P%#p%*>40G zp$L467Pcp#ZK3{jaB$RT^kwp%Uisi$aZY}fc~T9|*90Ca0%b|E#F;^FCpe2lZ9nk| zqJag5XLHe#>7bcus!`c8X%X>;E+Sx!1c!iU8blx8Q>@+2KE(dH7aeUUawI~`t;dWSt%Ks$qZS7 zz;Q%$NakA3%(*2Je@Jk&{6aAdzlkb+hNF)`it1~AjXJ7spvf8#_50k={O5ve0-)6; z8O=0k6g3p?)1tdaJM@m^ie)%tqJxZ?XpRn7X7?mu`FxzB^qX-mQ9Q)ysmQH zux1>UWa7wJz)D5vGDw{4Exg|Vov1*T$A3&M$nx1Wo8sp6;sOobM`+jZ3)*1G)Z{QI zPo?wTPqNmoX9ZCa0${@RTR?42s>f=RXdUddR$4|ZZAV8Oy(PLK2gu)pt2ROyk8~!~ zn>OYsVX?iQ1HB zlrKEpAMgf6%P;-qAxKvJ_7FSKf{nVZjlW2APh!Sg3Fv5E{_#T0b=Fj;=O=jled=84 z55I{?SAkAkLD#UU$=z_j)%oMuQD4`u`ffCT5PRhgi6q>2lWZAk~_olSzXPV-x!I7VYWozy-O!^b zIGS^c7g9FuI9WMhJ>@s!87sLhnK$pUhW=O*vH<_==?67HVO&#J*Q9z3b?dJXZTAu0 z_jY!8{K88!EK4iVkdy}Rtc7)0fc0Kjg#J|?rj!>A9^CL{hHN`U<%pa4zA6;G>#c2; zO5D~d^)lfA3Vx9%JDm;wbnseA3>9OzP%M*8tCWcN%)BA#F^$5&DzG*|= zKmZqJ(}3U^$_ZEbjta}OWxlZfQ&e1ut51FY(pdY>#)g%m3Z(Nx=v;@N7QmWu!gu9> zLVOZ9hofkt-o_yHm3SZOp1{ z3RsMXD+FOtfn8^yK2!li7g;gbd93DiBFGqeYAEn~VF3AC9_St{X}8aVb#SxFb;`o+ zZz^|pWL;+tZ@yK{VpAb@7{s!mMnRhdw`Y60gEjHus&(!L`PQwQn*fZvMgLAG+nPp8 zcqB1#x@Yp0)Jf(s-R-9=^iBmxt=?*^y1hY!uUQk4c98^YN4L-=oHw3F` zAh*XSNc?)VW^FlTLj(ZEWEpp4t36jRPf_kDufh&h{ z`OhV>7atGmB$9Yabhx)$m!@*M8j!NonuM8dfJT(J@Nw($Z29yhy;CnAu6Y zU~R8(pRg%Cdbwn928iTn-G(9dK`#=4lbSBK2B^tkm!(HACtPkP=Q$sZnTgEcxdHyk z8Gsh!NU;^O*zoynDdIdy?w~d`xP2?qCoU4yo&E zY9k1S)${}jmXhzmQC)J747g;ir&C1y9(Q@Du_e>W$2}4N7O=v>b1RUJOFjkS2YAaX z4|@6i5Ge5IIl^EbWz`+SS~?1n79fovgIC3(a@J(ozK$&yv{|i%L5QW}=p_QXoCDpk zyNW-)Xm|nJH7bZ2FwQFh6$|7HN-kJ6TGhQjymW!cY1neg$t&xu(xJZrvQkkQiN&j5 zW$gMb=+P=u$8#HRzTej?2Gs)^VEI-1^R=o|bm~2=y+##0v@0i?0lct2nB;YR#-Y;ePUnxSuZ7Bsgb+4GiEU{oEp2TQ>Rn;W_i&&3ESU%0j#w0<+3)I zq2{+|9Y{ugSebDyE|5X1W0aHo`MO9Jvi;}_WGBfpna0XPzkG9mdTj1Y7}X=co;7@l zc24F5el#bhnKB7tL^STYl8 zpG(H?A27OsaEa-T_r}B&l!)Z7wFNs6hEjE_UtxxAh``l`7Wd{r_+~*NW)r1P;rk_* zqoPrl0zi!q+3J}l?Zr?RK!q1ZAD=j9^3@1Lpf)0m*6LmCLuV&vzI&iEj^@Z_NsAB= znCR&-l7P_~CK0Jg8`???)v@b%(mTMkf9ksAIwMkFkSjZLN)r!C#|b1 z9T66Zip#5j@b~ZIHw@i=V~Jo}tDi&wFH8mQ?LEFIItmoff(Pf^u+eb|=A7a?n#VIt zbdwk0=+0c5$5`Gs0J0@FMgy417tOK9Z{L+Afg_#{2=rhRS(d#VgY^vA`JuBm2b*j?-9KsW_ zWJT)?Y&JTswbO#-DWlh$=`0CClN%rIwN+b8B4+wdCw>Bl>`^+n%Sz&k!g*I$mqlKe z^0s?pMMg4I%vUIx{2gnHZP?vpapk|}9 zW*|*_Pc&< z$vrgfk7Xt*%F-<)MPfZ)y|0N+72zT585n4>UPKH~9{Iq!`8-}x!*4SKw zOs8b1Ru6v^FdL|qTaRcRa`tb#T_mavsZJ#q)~>&p-kH+kon+Ev@+u$PzNHbaN9zkr5%Ri7-|tZVDxoKa-u%M$l6HzL zyTy=@m8hx4@)NYxQ61Y4e>P)b0F$1XiZZkjuzNBEQVQZ0lP{DLemD$ICpyF*c0lKx~SnBj-nSe%P?hiix{f z1uMWKxFN^pXFE$?2F}4wzBcWBRgpG8bYHV##I6oDoi?zF@yjc=E^?f*ln%5qn0C9W zb7!doT0(UR{tMNg)`D*tUX=BHd}RSCHGp(6mZOZiwYX-gYV2+?UAlCQklWn>PZB8_ zz3k_O^J>vfk53pBt&wYxI3)$s&dETLZCo85v(*# zH`>EXCw_Mp97Q_IHEs|&Ulqp|HKFvLn{UYpFOWLj&&5n< zAcPZa?*UykXl5@WJDaZl*}kTbWlXN)yiC!m@J&Rkjyu)XsJg7W!zv{ODa0Q|_^PDI zjGAP0Af7Xyj8+R3yEk?cj{Pd4z`Cv@k9pRLTkYU;SN0H-2A$%l=-10#KX)$A+)EA% zaXIM?w*B{n9eRjVZdwaHiez$bAVDmO+n^E3I zesuj-X&?%ihu4|^gP+4O-g4kuz^b##fc04KHQ31`LCD7&@Xk{c69$JK;R}jLQxMcr zKdV3Mu`vWxz~`?MA2w4371N7~6c3rIYrw6ujtxD*Bdex!olk)WDq6>0AwXMPvfyXL z?&;BI1jOE*z@A7)+X;VqlP@~P^5jK z`=!{cd_xfYd}MP(jSCaL-ovg0TG*MD@mX0-ro0Zo_82|(JH=mfX!aZz3+ed8jH6N^RMjk@naFQ zd~(FV-+I76p!r_J`RHZs=nK`urjHgRUgtx}MaxE860eq*5Ol_*<7FG)vP#KDuBq-a zfsqxqr%@_fOl(qjl>n#nas0=bk9f837bmWOQFrsJi3Rpf{Y{-IxAw`nv`x)r04mfD zcv*wAb>GWwR*aj>10^aN{Dx4Xrl0KqhT7W6anr;paMLmoI|OTcOBW2KVtmsYl-TjE zGy-|DQ9zt|iHI5sLOsvd8Z&{DS5Ek$F61XpnoPhMKl&{t9#)KV1&|Y~R_z48ue2n= zv=pz7tuC`p&MT7dv7E+8`m@b<9{Ni~Kif)> z$*eiKKMR-X+;Gx_CmUe4O`Ei?*z{rGGlT<0Pj1sbhd`?-N55WSpD4Rv2koLL?m2i7g$sr^B$7|q%(ftwy$8`VpM_=0^X|vsFYd=g*bS(+w(H%n{RI+j3{&X{v zck0O5qplBTm0ziMO_W5n>UccIxV~ITINCQF+3p*>D56hacp49z4cwgbwX4skNtPW> zC7ei~iHHP4o;pASbJf>Rv|Xp#IC$nRK86sZbd0c<=cxQ4R=VoUM9*ZRu10^VJ-?y6 z1qP$;Fu%$-t(Iwt(wo(QVlYpg*W|oPU5{1;KNpcqyX`xJ?aJDNQk0GT3 zYqmK#S04^KRxBDTjxBMkzejKV@>8pB&}*#ldgN!r`lZpW#YH<}pQ~+!M?p)OM*eg* z_`|v9PcM@alTd#@Tb<+dKXyfR9r7gH7b&rKTedRu862`;EYhWxM7jJ+zjTkf3QR}2 zcy`D8BXe?#e;m{f2uz}Gr5=V>qb^tzisbj@g6Am5rmTa|-l}BvS>y%$)f4+`a~>bIbSNTI%zV#M>N*a%7af)FQ6S<7z{!r=y-E=O*-K zI+(L{EbTSJ6EEhi*VRSH>G~zB*PX^KzPleZ(5Rh{sPv4Y1RA@oQsdQwXlyNR55d$h zh86jPM=63F|4(u60o3HywGAr@qKH@lQHqM7QUwL+prWDzVgWHUMLG$c&=F8kX-X9k zL8OTE8Xy!A1*A(!gb+ZH8bj~(Tes&t=aHQE{pSB?{+a*G9LF)qUG}~AzSp|ex~{9K zPc41dlOrGI&K*43!t+4UZWj-`mGH$Vm%|S>&@uA-^T*x*MP7E?{y6l#6rJ1@Hr15l zjDLQNeDSE@&aG8UD|y;mi6QYv{`uu!$GCQiZgZcq-LYddKZ6rK+1wWv7Is}jLrHRG zz;-%?fBk_K-!h)}wkb}LtUYOv{Kpj`$8EU!z@Q|O)B3&Nx{Kv$o~L_Z@T#Njz}kar zbenf7ZrJ$GA6`i!ilW`qK_^e2|Knfb^J8LOmqZ(1P8^nz-n-?$-$(uyr?PFQzvP$7 z%Zcj_wQ=(^Z8-nSpdCi%)*s6>817beGVA*Bf6n{+h+g+tdDuk;-k$5AIZ#vr3~wy7 zt$=l}^85GiqwX7}>|H+&8|XgszyL?8ma^~IYV_wV!J$n@kQ1&j-cX=9Vf-FAVez@M zUbH7H-caFmL*Zi^3(c(#Z9ZHv|4Pa(p`_&1)~;uxq8dCjhfLyy%McI{NQ{s7HYhpH zd3VHn{peq_|7-O9M(3~5{+RC=jQ(bp6SvN;AF*SYjouSK~X=@+fw{PF|TetG# z7mBDk<5X7 zE14*xuv_;(KHNGy_nqw`r$eYK9=fH!Xq&_w1@EKW+c9F?;hFuO(1czKR1-0+LAP?C z>(m~N&o| zEs0m4mq#HSRCfwTS5)erf0~12F&JQ`XEUbkkk`Jltv!zDPe;mNGyJ&~^bn6i{i}19 z=+7;yP?&c#T7k}?pMZ3|K;%_*?Z=-&WN0Nd-|Mr2!rD{}?3xF0iGE-Q*ftG^)#=}k z&g#2AlOKYSQ6o5hq#n{Dr?FKbf`kI-495b9M{3{ra-D#}&*MDH4zcSc*82|&Y%9s0 z#N;+eNZl|RI6#y%dF-s&<{&eLf7VI}k-pt+Gu1Gwd!3D1K@=Iado_Dt&hEvuxRsHA zt7DpPi^mdmunYwzUK*+95W>H*1S=rhN@mF#h5e--aHP?(S@GZ^+e{aUm(o*0*anDE(CGKWF(hneb=1THC>Zm@O!6H8_kP$ zswV2#1%M*nj#0WVAr2v9{ z7Iyrm?0?d*ss`L|NBO#Q<0@+JvuPkLS6cU(21d)4FvD#rAu^hX+^c2raFQ)(0DtLO zTg6HZCxo=H@%}nb=qAxWf{(xS8!dGJdfLCXI=1!`PRAl%xJUnrRTAVHQEsqybD*mP zud=a{dI&`pJYx6ilv%Khl;lO%`&Xh z3~zH64)z%6E8z4j`6Z5KD@zMl@@<#`GL8BZa!kHryS(r0xKX1PE}?&hddRKI)?I@7 zF;>?9Og3*f5A6y=w;j}1=GCpC>yX*N|#i0kan1z6jt;iCGeH_*zCH2cxLm~r_r zR6uf@YG|!HJ^`AEBq&5eU#9i$UW`5>IOw7ujxBIok?)h`M;_#vrCGC))R?1Y@EBoh zt{3}h!O|_E*%sRpY@^uV>CsXZp=bOBw%2r{=7Z( z=rPZf>!;a7?Chq}an_V`!IS2qqmzsgBs~k!QMZph<$o>co=yRtW| zGFxl6SLN5Gpgg|a^-Y}0md&B>bBW+>mIgopMNYA+%t3{EAlga9KEha z)X}-5o-^KX``wGZ(kIn_K(Y{4AsqK`E>*XkJPC`hTL||+Z7h`D#Y8r^5!~C7RO56n z`1}TIg;C9S*=`BO(38Kr4_ht?*WmUHk55{9SsRnx7SEVX<%^SWQny#-)mzWC(GTuL#@0+FnhN#kM72KrkRK6fTrP3Kl-#5FGCU=@{ z>DQ9`x6j#Ng?yqAl%u-_KWyn!85x+$8FcHAW*Z#tcV)ce(^{9{h0*=IU zcn$`WS2h=VHxcULi;wYp&U1>he>s8@U4_>R-n~=2^nY!#LYcUH5W9m?(S5XUiPVV)zFgy$^KbVtP>>V38())2Y@ho`Y@|J>Hm} z3-~8^MN;{klCN6t;OOkPr zmqS|w{B|T;^Uo9NDo0mIJ#gbU1oZVs&oq56;8Kg##wC<}FWFX_k?9zokY4SORm|If zE9*RWNUL04Wl43iXncWW2Zfa20>g^=+$MR7i(q7QV@R(&R@&{8ySz|MUcWrM`gL4k zf4=?q*`0&AW~3pV9bSz}KWfKtX#Ef0rtmt`3neB}dL-Z4aDa$1$-;&x$mENzPe)gy&hzSaFP~CLU?DE8Am7l7E^> z4^hRcQ~C;JUUd*Dj^G_YF|xol)|tOH0tvpl%6SJ;o2p|qAjK??#|GLoL=q-Wt$1j-ECWoIWVe z`aLhQ!s&XCwcaB=qL$2+7DAu&ZOEQ`tWjA+hp$}QiaHk)sFI_DhwXa)n#U|v)FsVo z1H8={pPQ7Rr5Eul)d43fydj2PQ-Z-6X=+_iR_sq^6u|s#H*CO_Jb=pD|r(#gtZQdHEj(=i+{ouwnRxdFO z6{|p0cS6~t*#mm|`cy#`R1n3WKO@skD?#odXKtxlr$?WMu-IJKn0Ragb>5(B5_d>k zBD6->u~U{!;?!qv>m}JvyO!cdb+0l@!ZU;eKO=IMwIkJK{6bbO2C}1A72P%=%P*9u zF=xT7zbB^`-&Y0>F?QTm@~@x5UHeFCn)X%ZSd$B$cLX@EEy&1z|4@z9AjVc+PR{i) zaK2r(`rsj?21XvsajKn!YuKuElLujSvx9ZJJa(w-81n}a(p!p$5$i4OR$tsqX5Xu! zs+k5>|G8fs;#rs(Fpb6bRjhcRmkVP`P*{!f`q%DRY+Nj{0z=~=rH_0M)`LlGzVCP! zT|sGkg`flL^7QJjLXxuA_$t*Q!$3B}rymi_PvQ@rsyva?A6+yC^{G(Fr&eX|#u=%< z7dXGoyG*zA?JAw;k_BQxBCR6t4HCd=B{-gKV ze7;lBouQ8)L@qWZS$0XBE2h6ekdu<->rm6QEDE?)pjaU(xRQPc*R`b&bo=a(__N4} zwd>A?!8Oa>qIH$sBo%*_s+r`r7Bah#X)eY;-18iLUxCO<>1{UAPF(~1CQI@dI?2|K z5&N|u4@n2j((B&Eyd%ZjMj7|#}5`} zj1i5C3T%1^>10C3?OV|szXiTP?~yl~Rq_o`%FmOyTH)<*pw)^$pLKkxWFIRXcG&mT1Q!5!3=M8df6mw zq)#a3!@+qyys>`P`?tA6NEc%*idi6GslfH%8fs!JZhE^`4~0ggDj@kKJ8LWe+6PW& zd9wWSPIs3_=cq4rXZt<=?&qXZ3vXUs#+kLGc@qT_uN9dAUHFB{9V=rwujLZ9j>o^| z?PVojgov*EvJw1yn{6m$ZZi?ZR0Ppqk+7JBIy}d1>(Mc>#S4S#nr?Gv%iT(62!5OU zBswDdwT7CCwHFP#TJA(#iB7oWDJkO~Q4yQaKBpe7t!p_c&h#lA^;QHQ_Qj*%f@cJt zpzu+GwVRJ`(u~?Mdb{JBmen2)Vf%YrMB-$gfozGsj3dEF$Fo|JQbtYaF}^oTy6qy9 z(%#b$m;f&_^+C$CuflRg!^49aK>-VSGOqIJsx`)Z1WbKJPkt^s4Wr^Sah95fCKX`r zN!3Z(HTpc>UX|`)<6h}uqfc~@$z4H0=RlNuKN4sW+ggsAm8;0JeHYuiSdZ#FgXR}! zXBn&1BdMS39Bf8{0oKOUYsiFN!r-2Augv*)7Q{(SX$b^}63cLIdPT3%mc{J?Fy#|w zj9LAcROCTWaij*DqF!kyE^pQ=395DH|-i|3CJ zCL^NAzz~X^O3L&LLaGkL|A`kWWpUi)zC9^27mVJ%auLtnSbD~tT71%IFsF^kE+p&hTo zy8&GsE13!$Vn6LYaadZBS$i+HKjl1{xd=7;2r#3)>57H`O!_HR{0%O}snK8NV^;um z3L|L9hnh^pK1F=KU*OTb)KwvA8+F1d!FoUtU-$UtGx9VqZ-zS6!jbdUHh53NsMrms zFZ=~-c`fcf7HLpYwxI@hp%-+(_i|noas2MHWj!#XxUzMpKQUHFiWV(>ehcs#P=vZz zTUY02Tkk|@$=$gg7u(>qd+%Ss>Al=G);`OTqo!A0?4m&hYfb=C=jSXjla^?5X#J@H zt_37c&wES2VVaYN763A6#;tHUXg#EM%^N}WPWByj+I(DW{lOH!Yz2_c_=ZSP-$gH) zi@1CZ0qML@Te*~;`O_TH7C_6R*qURaG>1!J+UXy$xGQ0q29G+*50`A~>rY2}$q1O4 z!mU(Gd&&RrPXGh95Hk@hn9ZyYtEcUMBq|1ZM|Vnaf@#r9CkeIK04NdNaj`R9(~ZUXRpCO0Lb z_U_wPG#8jC2+zItVo(n4b5DSASK*S_7CSX@xAgs0`u+8Pw#CnWb73(eP=_80!o8WlI7?}48101-Q|R0 z`*xzf;67)wyO-zo6&jF|rzv?OPAuecAUQc&ie0pSiCHH!Fu?EmL6A=}%#qu0bL z=C^We4r+U_q)`6k;Bwfd`NwDzW{y~$TM01?*(RR+lOvNG914?gz0Mh!sVLzkO-YV8 zrM^avyq3Ad!Zg1p^kJyRbdRyM9{pDNtYjh*=SaT5 zrG?$Iz|9=$>v4Q?YSQ2oX1^OmvARDEnTy>;%U=)R9x+rMDc`j~`Z02o^;i!<_opqh zi-~d3v0liY3mtOv^o7Yqqt9ps zbwfn&VCuk{dYxxUQa{a8e16UVR4TpJP{sCU&A_>0I^s8~zNs9ll)O%^4qF{f4+zCF zlngtNg!GfK=03PnRI(gzbFY{#H*=OQmkUm|^y(%}oM3KuM+;X5Nqhfe$9Emw1(fcy z-jenUW_Q$L)q};pNeJb?3deQNs14fmPOhNaij5-~`h>}^sTSc2?#A-`DJ11$ebU-M zl;@e)BW=WR?!E7GXHQv|6{wz}9;&O85j_%Q&7pU(Vf=&7KMDbV<15YENxvKUI&zGp zd~8a!IV|Hg-YrmIlCBKkSLqygT+l;_%I8LGzTtA&I)dSwe7fWC4&$^F6+-0HO&7TR z^~tyBO6v}$wde4qqeFx~sO`=gA|W_C3W~ z(^-`Z`t1Z}4u8DMv1~rKVjxh;_?6H8YemE%4EfjD2f9~Zvggb|@*zTb^nB?Yr4hwd zIM+Ddp0Ofqt#Hy_RO}A$#Z7ePhGScC)ILH( z@k@pG4o>&V0v9yv>U|xEW9j{*3BQrk<*lQ?2#@4iuZGmTUo1~P6?;;9@=JZh+`3Ik z(QfY(PX7aH+|1u{xHc?_*%LQlUoupF z&nw7yD;%3)G=G8ORv5_Hqsi}hAahCn%3MGHO^Zx3xa~<@U3YHcgLy}x>J^UXq$B#G zTwLNAavSdZhbxWM*J-$H{8;5mI)Wh+2on?KT6NX-Y4c||kHjt%Y7x^@m%fcojf`#x znO^B!Tz!9V<6MOKl!@F0S(;Z{4&y_7%9h1r11I~MEat4!&suv2>>>)cFPYC-Ql52d z;V)PbGm@fRlKaV}WBNxssY+HnTMYA;iUT|gM#us`uJRtFB)yh0cB}4Z*y3B|Se+j2pe$L3DsC^F zFAg7;rbJ~{xCC_ARtuX`TPOVK{{h+l7LY+g>L(oxmrt@2W4pHLwV$kKeXfs_b?VZq zzKY_ZRQoHWR`gM#l6)9~%T69lS1J+8wZE8tUlgM>B-n5TpN!{`coo~DkE|I-uMf2a zHl{fRycLD3dC??2Pjf-t!9vLV))-3P868nE>`ptVF7s?$nyNJvWCU z-iG9AF}J{7S&jqMobd0&JHqMDbkYoo=cP7jy4>4OtFe ze}h}QIOMd*l1C|%3vNSm3VkZ=e6;3DE?UuBDvwCGA0pv3^w9QtV%?6f!VBMfSh!Qk zKV}X;k(E_A+EmZ->9N3c>)j2mBkI*1vUFHu`=w0bU27L}e zEw{psla@E=UToziB<9I@PM8~ymQE#BjNAiqJ z-D#&QE@q+Mv^SB1rq!sEQVl=Q>_^(a$DE(We(tx95vBI^W8-ttn(ww#%z7=nmVBeC z5Bque^}ac`vFo92tZAgjiEDfUc>0L}8Ld`|sx9qloc~+T*LnXwk3}-5gbpykCijM~ z`$2q-1$TRLLfv(ZMdsQyuxWmX+`J0va4f@vjoNEOQiy3=k>YYVn2)Htp>ln z`b=|EjAx*XznS@a)o8n6GdjKiHxoF&nKM>S#PFbl_peLO)`v&USD{MpWMq_h^X5%! z6WNP~&2PTOD}-rUZ+8f6(54BdA3WFt36K4adULN+K zt;%BS`y@7Q9=QyS1{u6xXu3%@c)f%JoqTiY@%qttpr{LJ)I>+F36L;!k$fRz(rR%b zulgGKsL?RZb6((otsev8XQj99NZFT1McD)9=jG6SU56e^@WHoA}j1?fJFzAXODgg_mHV_Wh1ELfY}0Q13&#dxxJZ^^h(w z=AM1u{@P_b%eKSDDS=Ur`nov3)%297cg#Cjp9p%WG+@5YF`?^5E(W`iUS~FrxM z*dE9~kl5tjrW{n^ePDXNlxmmm5!h#OypOBTdi0T-Zkbg5_0CZl9oExz{m+Hc`#Eu# zvU(w`stW1cCbM>{h3uE;O+K5qs*Xd9@bS{A}6KQDLZ8kV_pYTKLjwJImYiZoA_F};$HJ?eZ5vS+EOK7~twJlrHyU{!X!_ zLvDY{%=POhHAsG6$bc}Z+=tXc|2 zJUnn6&=DH<;SU~^V|eVGy3a&hU20U4tY`7r1zuf!g8JOjv&}J>))mLJ4jh9@hAeu= zd+j8zI}ZC@+XQo0911-aCN;nImkCk>Q}lZ7)!o$eaU2xVFW0tTBKY1EA%5saCs#OK zdt-DuIh>^2S|BABrboO-8d*Vr-c&iZ6PXNt?K`3f=wzaZv`)k}X@$~~k}bqgRT0h2 zIhPw;%VQ_`+m`1vf_N9qMY(RuW_pUe`}{m=Ie*Yw0EG`R5C1%qpL0~IO2y5h9bKeb z;26$}4lWK$e~Vr;O7C;lz*-Rwzg<}{{A{O+0{P7KF{@WRW|RC*+@Lg5)#+Y=1JC<1 zd!9)?nT^oeVwK_#6-<>5y8N8>(>!jPK3_?1H>%BV=x4^DMppG(sADxb?$Q0uJ-Vfh z-V=@L3EpZfrY?A=UZ14DTo$e#Z20PvWNUqd z6iUV~M&d5HGX)o!NT?B|+$b%f)(qL|UwHlRNF(&ZfhYDiV#Q4YLn9)HQ6JJRg{aR; z6S-RYgK|zs1nrMaU}9ZN>EEaJC#VI1IxfjrWr_;l~6o-hcT*U{(z8x!1?~q@CEbJ?K8)p??^uG7Z{?Kq+5h@La4IHMWf6ihdwiQEY%@=05fKOR+JG~(^ zurE(ICRDY$dTp}Ek;46k^^IW+uRbNI`z&?UqH^O|@(lW_O9Y$4)kW9ik)Bb3YwEog zMyj^{A@hsHLNTcUeAAcmw zEk1LKRmLJ-km&~Xw3D0WrZ1AG`Pz6SmXA>~l?KRPdA@8hA3oWao?pLmO0<1ql<8F5 z>cZ%?igS_uOqd%k8u9mn!<9s~36{v`eVvTp9Bnf|@jr~l`ROsTYjFCny$ea`m>)kn zHsm3~l+Y^2(Y30;tf)`4nIke_>gRK?KIa{n#*kWH42vMT-f0VS_pgta+rM($&wTIT z%;PGWac)CGKOrh9Kt3~FY0Tr!D$DfYCtUgpO1i;rLRony`)+OVy^^s&$=Q~#ed?TC z^~loZGQ#K&uD%3xH4**YeSbeSDI|p&;$H9cCQpSzm=Mm_3W}{#7Ga#^?1g$(+9_$#E(@*gx&+d}WKwCo zZl$lemLpj{Q8xf(xo0Hlbr$Bk`=C%}xay|5xF7vDo6WUSwN98$P(~)rtcOPSOE3){ z@E|+hbm$Bx5!+-`%3zAN9yv`~EJ2N-&~f60TCRNK`Lg%8`yQ5QN?KTyy;^lngh`r) zD&DSZ9#I+LYhw9F>hV{x?`RhT#F50_I&bnbwte_>%ubXe_S^FU`wDtf8or;dv!gdh z??~UV0X2F(M55~f6FrWziZYwo##Lt#l2;^V+KXOzw0XbQneRu+)0|U7I_z&YU z@D^hxpdB3~zejUmU%w~$3VZW@A$m_t?vIL4;~?H+lH1`syp&>YTuR?2suNoXm<+O) z5{W`O!mgz`$dNl%-@CfKBc`~>=J8*ApIH#iN%amCmXRL`*VgRrJNF+=slRMR6%QO6 zmDp)fU&!^T=IvJx6P;>zY~hKc>A1XkReoGc_TW_J*TM3UZ-z0UmJ0UunU9yppP4J&_;!G|+}l zUmrJal}lR9QQiBJH@$xs4iiq`E3|mKXDy#QDbwLKgX?DLjorIXqwLE&R}x+JugmPb zT9CNE2&xMO=7}z51_|QsB1@O96y!}@ju?60-<%`3bhA#h98;^Y*CDmpWq7kyO2Hk; z(%wV*={jUVcI=+Q;RHt)te%N&YdO1~DnTnX_8rFMPzB$E+{huHqKRLp_OYxB1@8gC zy9&gkOM{Iu77a;ypZb$ckMcamlmS zrFK5+shwT>=XT2y6BVQF@}pg_;82-M5!3olk?QZ%rM`_bq4M?eW%USO| zus(;0v!`dQx-$1o!*<>EKw)Sfw0wWvbTRwSi~!P{%UV!1h^QU&j}VrmJ&EFjjyAJR zw295BLdBnrXB5zc-ql|;^{2S~2$Wu1dpYIZyXTOq7++EfqdDJBQ+5O@kC}L^WFkUy z=mr$rtTVT#IZef;nGva&>@~SzMJh;#-spF`hJwcs73Li4?;md;D8P{KgbQjPR@(XL zvif1#``*od#@e8FEnEo2YCqEUCB8g<84qrM-bjyE7#e)~5XQPUuG>WbRPfES`ome? z)|qYCa3BRyCqpIG$(lCD^@5((c7*Ldonsw?=vm@CfKhHsxfsB)PZkus@>?)DU-*Q{ z&^{WY7a@Q~D1n`z*&q}{m`yPp_W|S5!!M=mk_0Hww8QnvvC~W`RWtqYu-igfz2+=% zMCA~9cya+)zcob>tSaqn3bX>5s@Ls*8-4>#H609YJea20V*>`uFdMfEzC_fgb+TMQ zubaUn#zAwuRv>dTxHN48n-^xbyb<00ULc8WgD%bNIB2cTr|W=L*b`3RCFCuE?kseO z&~q^x2Z<)aWs{0x`X!L^vvASP$Xi*O!)@`FBMl+4h8~mm}Ztd^C;!6uZBUWZV z%{C>n`a{Eeo$!2tK|A+1=<5AOpPl^5_OeR{+}1!iGpF>a()t!Gg&^bvcj$dXUG8+L ztkwhAKj)!8x0i0LL9$1-R79W>q1DzpBCU`SnYoS9h@}2M9C#OGARBg>9wvqdp&ayw)2*!yuup_UIi+mx^9ISgFBbNf zG2u@ObH;MY0-e0#NRaIA(6F$?)*w(Jr!QR4sid}Y@)%PDPtDLJ#s@}yUbVO92r z|H5|vXmuZJV>rC0u)SS98d!dvRMedA(nO}`$`w$48|oCeC-~Js=M=bH&URe1cXM@N zVs=yBr0)!>$;xAa$r0Rk^(SqCnpz888p0ee{T#K~sKvryKJe5OJ7F(f>L)B6h^h+Y z6zELXIpxI086u2mQ!SAlO6`QDJxGZ-qI3popfM)8yIb$uLyJx!T@2_vI0L2GsNpox zz6pAM*r;mUDi&6Js!_ZgPJZ3ru@vyP-tjg2SN>$aSSDD5$CF3ZDu0xgee~W@(CL4Fi;uJ>-Xy!n zH0!k<7W4)SZ5@YOj+WL(1Pl&MRBigNcJV*1S8+c{if7nG!aCY2hg{fXn(;rp9Ji=9 z1#; z+m*d{&M;>#oc+T)^S{&bXbZz-P!WjbCBaCN$DUab?bsfoKHy>N>))P(7|yW`b*jgO zMMMlT-DFy0FQW65Ofk#*@9p_;C`4T2GHCLJMSBy6>=;stQP&5c3cce`~ zpM|bLxz%fJ`R<4sU%|KhTdD*4F3`qAam;O`mo{h}ht;f;ec zH&JtO9$-?4?DXF+ejh|dB2(?khz2@&7OsSoec&AY%rd!Le3Z{s-8IHU!Mh0s#oRuJG4k53~P>OMy);88_7b`43dMYNb6P)$CiVZdGQZdpPa z4e3lVP6<%ILI>Z1*o7RK#?SLl4)|LE31bxZkt+FxiYaW|Ednx#&k>s#_EhCannf8E z3CO1>Yy%0<=A(STpA>^$lCxSF&Mxsa0}9PO!(z~Pxrj(B52X!=S#_6`kg|5K4@ow7 zJ>GpR#Xwg0@`!4*!evNzkdt^a*o3f%X^J#O*to6RZf zAS7TWPO(B5_*p*MWlH{L8`uB%!`Kh$DRDQ}MRNf44hR9|tRzSwpC+&}-3)=%1x1sH z|L3vE=DvUjjlwi>P81Hh5T@i;|8-HjATm6#F-Dh$N_ol(35&-3CC921sWivpxBxNQ zluRG9Poo~~^ZDOT^ACuA>DH}VNA^CVJtI%EEYe&-Zi}u~N)D&F-2ed?p2F2%oHRp< z1b6_RTRj$faAJK>%Xq2~?${?J_Z&?GHXsa@gZ<*&UD2CnXa}1S2K(_fV{V$WGd_et zI>){a{Xi}x?hrC~XCvKdQTUy^dDvO*j{ke+?S$!(YtjULYQ@Mfock61uirKcBCNpN z6v;XX#YEbXzYP(oS49WSWZeK!ect+!fl!*`fBW(a1GmOkQrGqL8aHF|nAQ&u6a+Nj z>1t_eURGA7uW*v{4mrJkWo$q?tRN8INjpew<%$~geU-i}5fH3=0aCRP!RR&30@*;P zsuB0jdt&Pzz8Vl=LiRv0(D+FjQvI7%_uuBQ=a)pgzZq7+OZo&NhN}a5LX*(IYU4yR z<#qy(6~ggslN;spKYsg3ghIe|r5m^`d|TCM$*?=0du`gnuqx7gFW8 zLqLm5cVC{xl`{iTQAq3cqHyK2pPoR|+l;sZWdU!a?F7Cb2gJOh85E|-h%h6N(-hWW zoSskE21>X2@yF_F+kDWJxv3{2W&cD+|LJtTVEP+cUEEP6#7MOHF5F9a+G$Sz^zFqU zM+yP-Z0}H>y|I}dCCfC+%vJz7E;8Q@91vN+L1cd(hAd54e4J6K=StmI0>&N{(8;KN zO|OaVCCB2oobn6vISI`BKF@KWV+;Q9(NqjE+r+%f-`8gxe5dGrwy-q1TnCw;>LP;@ zpj2uT*)}bLDAOQa7ev$NYlk+?Kq4TYQ*yGd3p8~Q>09O`)#wY?)Oc>4qUM}b*z+se zv*e$?>5%<;UVqUY>1D~C;LA0m_^w@dldOXX!K-^P?L)g|~3OVHXG-WVfO2UhUp?c<$~HaLpmmzm>fe`GMg4+;l z>QFE)!Fk%^4cX139w<)elQnk+{^!qkZv%r7j~cS`Dj2-mTHbQ9K}O?1w;ga=`@z>H z7`)8B1RuR}A3W1-fm2s4E&tukiKg)^>j!dGOYuWjyT!onn(g-5QqP*BZW{!+pG%Zt z>7VuY_fLXw=7Qz3$&Okx>_@PKv)F&~-a}d75sG0)b=aP>8F}Sj(;R>(^~XT zVkj`T&e|J0Er46L*| zBQ>y)zF%4;>J_%z8SxT2eB!QyMrXdopttpbAV^?cy~pEa&hBOW^SDuOAsWb}Z0-6O z_dTwQ?~V*OH(RLMJGQ9se}R0B4|bLp@Z{u6oWGWiLdcCj(jBkNl>M|hje>oZG0&|1 z0@SO{BN+yi%Kb;goG0&(K9u~q(LjIQ-ln+2i-Dz*vj_G3WImZNpuYeSDKYkdN3Uu{bCa@}cZq0l=FA({DJ z*63w42%&^Q=78rdelNLgw+v0q_n0%hkM&~7ZCCW3ZKHkNT)T)AeK)H}th;Pj2cP!A z`)1~3v`d%wa~jS%gdB(AovIUfYUWQ+ABOiB2lDEFIT0@K z9^ciS<>t^t@38zSf#&y$JihSe-SN`WZ);UaJvkOx{4Us|osd9D$u9>AFm zL$tP3GywW~_~Poi*M^s|2pkTHSB2QuKtK5>Oxtjv$4Y%d1pYt|R$*=tHl7erhaUJ; zI^A;RXxQZ`0H>RKV?V%Y}#B z_+L4GmO$G_Qc&DHB1QvJg_;r|t7q1cllV<{0RsJ-oq1+Qv~(T9wsV|1R_eTSGia2> z)(g%;hAv%8rX0k4ZWtD9IvM!; z;42>n5kM(nah#6ZA0ehAMrfnKOEX2@6X3v8Eb}A0k!}?7$QxiI!;eTE5+)HJdfQI3 zp;f=cT>=;Edj63o?bpC;P#+?zugnG8P3uY5;K; z4J2bnIJm!nVm~a~x4AET9%OqR*%*HbuYj@S^KSX&AF$!4`g5GV405KZ{W6Z0PPcv$ zH}_?yTzazp74rNdL_{QAs{^hv7IZiern#Nww*Z=nM=BpP*F~aR47x^hnqp*#{c}M4 zFSO~N<->?#bX%}J?$}{69^0Kg!un7FXvMaWw-jfLN(nqSgve?KJ1fmi@%~*;!(7h; zVK(s0J0c-Pf*}go@iLbxWG0FU$z$Fx_9=iFhoKTm$y_!*HdidLrE8#nn#3QPYZMs- z6ujGr&1QDS1nher10&w>;Fxy5Sih7Mc^`Es$-`mpn8~Ol^{@r*P4}gFM8lX#1qS9r+ zasJL zQyiB&x4Ez5=53mOmFG8k97QqZ{2rk1{blIuTV1U&H<`)bZ70;mLi#?0Ne+~qI|zW1 zy}uQF;^Wd3(5$aj$q{`&L)62|m-|KTDc}b@E4wn86i8ODP#-Xc)gg`V)kL|%f3APs zKltzr!JFL-tJWZr{DJ_G#y1oo{FxlJQueW_n}!V}0(KP=)nsvcI0u5s_QjY9%ZmBt zH|G*T#O+>4eZT9sm-f-`Mj;6NA~Pz7;`(3iX}AAiv?|%dqu#^O5}@B;h^K#&n`&X2 zXVb4pXmmk5Ye?V6?KbYUom*aKw#UzsqQ3TS12 z^04Ug@a;0bIkzx)^_3CKan`-8ht_NC@Up_fRRBQD7N$+zlU+x2u0>l|$+P!>Ox}Ia zflCXkukt31MUsxldZEs|ao`8N8ApOam+^Vr{#MX(KuP)(lk*i||Lgi>^<7p>pTuh= z;f#6{Cub+K_S&H9$~a9&R+bndQbid+i>CmGa>*8O9F?`zmE2L%mOgE*k&hsxa2~7^ zsG5V@s;H8cuoHa)o)P-CrY0XC`eCODx6dI40@<-w>*mJA^HF!0YPEhUiIyEUxAdXe zCXPQp#*PaBkAOYdHh6mQC zUS3yWJ1sOqTri$F9Ek-d)?Z+^nFFtv!dM>4w`@b>)qvUV;w(h;0g|TeM6x?D%R&HU zQUU6QX5rP%eF9gjAJeS1LrBjMdI=O5RFbYn9tPrg2m&KHtP}|Mex76pn*fCQNM=@8 z9 z>dcRyrkM?ld$VDvO(bRx%U|EiOmoLy7=g(Xc}_)nU8n>#Ic2zzn}K_2Sth1p5O%5# zT)V!D=8mo-a#^7A^I~$+md{!s?CnJ + +### Вопросы? + + + +## Использование СКВ + + + +Код это файлы (в нашем случае текст) + +Задачи: + +- версионирование кода +- просмотр изменений (что поменялось между версиями) +- применение изменений (как применить изменения, сделанные другим человеком) + + + +Частично задача решается современными редакторами + +- [WebStorm](https://www.jetbrains.com/help/webstorm/local-history.html) +- [VSCode](https://marketplace.visualstudio.com/items?itemName=xyz.local-history) + + + +[Система контроля версий](https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9E-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B5-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B9) — это система, записывающая изменения в файл или набор файлов в течение времени и позволяющая вернуться позже к определённой версии. + + + +Почему [Git](https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%B0%D1%8F-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F-Git)? + +- стандарт де-факто (вероятность встретить что-то другое очень мала) +- удобный инструмент (позволяет гибко делать очень разные вещи) +- позволяет работать без применения удаленного сервера + + + +## Вопросы? + + + +Для создания git репозитория нужно создать новую папку, и внутри нее выполнить команду `git init`. + +При этом там появится директория `.git`, которая служит для хранения служебных данных git. И вам станут доступны остальные команды. + + + +Немного о терминологии + + + +**Коммит** - [слепок файловой системы на определенный момент](https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git). + +Визуально же он представляет собой набор изменений + + + +```bash +git show 8d02d0fb279f7ae7bfc203642b00b48395412de5 +``` + + + + + +Атрибуты [коммита](https://github.com/vvscode/otus--javascript-basic/commit/8d02d0fb279f7ae7bfc203642b00b48395412de5): + +- sha-hash +- автор +- комментарий +- указатель на родительский коммит + + + +**Tag** / **Branch** - именованные указатели на коммит. + +**Tag** - указатель на конкретный коммит. + +**Branch** - последовательность коммитов. У этого списка есть `HEAD`, который указывает на последний коммит в ветке (в отличии от тега он не фиксированный) + + + +**Merge** - [слияние двух веток в одну](https://github.com/vvscode/otus--javascript-basic/pull/1/files) (когда изменения из второй ветки переносятся в первую) + + + +**Pull request** - [запрос переноса изменений](https://github.com/vvscode/otus--javascript-basic/pull/1/files) из одной ветки в другую (запрос на merge) + + + +**Remote** - удаленный репозиторий, с которым идет обмен изменениями. Может быть папкой на локальном диске, на сетевом диске или на удаленном сервере. Может быть один или несколько. + +Remote по умолчанию называют `origin`. + +```bash +# Посмотреть список remote +git remote +# Посмотреть подробнее +git remote -v +# Добавить новый remote +git remote add new-remote-name https://github.com/vvscode/otus--javascript-basic.git +``` + + + +[**Github**](https://github.com): + +- UI для git +- сервис централизованных репозиториев +- социальная сеть +- вспомогательные инструменты (CI, issues, projects, wiki, etc) + + + +## Вопросы? + + + +Как просмотреть историю коммитов? + +([И как сделать это красиво](https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs)) + +```bash +git log + +git log -n 3 + +git log --all --graph --color --pretty=format:'%h^%C(white)%<(25,trunc)%an%C(reset)^%C(white)%<(31,trunc)%aD%C(reset)^%s%n^%C(dim white)%<(25,trunc)%ae%C(reset)^%>(31,trunc)%D%C(reset)%n' +``` + + + +Состояние git можно узнать при помощи + +```bash +git status +``` + + + +4 состояния файла + +- ignored (если файлы подходят под одну из масок в файле `.gitignore`) +- new / untracked +- staged +- committed + + + +В коммит попадают только изменения из фазы `staged` (из индекса). + +Для добавления файлов в индекс используется команда `git add` + +```bash +# Просмотреть состояние +git status + +# Добавить файл в индекс +git add file.js + +# Удалить файлы из индекса +# все +git reset +# конкретный файл +git reset file.js +``` + + + +Для просмотра изменений, которые попадут в коммит можно использовать команду `git diff` + + + +Для создания коммита используется команда `git commit`. + +Особенность - при выполнении команды без параметров откроется редактор (по умолчанию - [`vim`](https://www.linux.org.ru/forum/general/15057697)) + +Можно сразу задавать сообщение коммита с помощью + +```bash +git commit -m "My awesome message" +``` + + + +```bash +# Для создания веток используется команда +git checkout -b my-branch-name + +# Для переключения на коммит (ветку) +git checkout some-branch-name +git checkout some-tag-name +git checkout 8d02d0fb279f7ae7bfc203642b00b48395412de5 +``` + + + +## Вопросы? + + + +### Как работать с ветками? + +- [Удачная модель ветвления для Git](https://habr.com/ru/post/106912/) +- [Пожалуйста, перестаньте рекомендовать Git Flow](https://habr.com/ru/company/flant/blog/491320/) +- [GitHub Flow (ru)](https://habr.com/ru/post/346066/) +- [Gitlab Flow (ru)](https://habr.com/ru/company/intersystems/blog/354158/) + + + +На курсе модель такая ([Github flow](https://habr.com/ru/post/346066/)): + +- основная ветка `master` / `main` +- новое задание - от основной ветки создается ветка `a` (и от нее пуллреквест в основную) +- если до завершения задания вам нужно сделать другую задачу, которая не зависит от ветки `a` - от основной ветки вы создаете ветку `b` (и от нее пуллреквест в основную) +- если задача зависит от ветки `a` - вы создаете ветку `a1` от ветки `a` (и пуллреквест будет в ветку `a`) + + + +### Когда делать коммит? + +Когда вы достигли промежуточного (или конечного) результата или сделали осмысленный набор изменений. Делать коммиты "раз в день" или "когда закончу" - плохая практика. + + + +### Что писать в сообщение коммита? + +Что [и для чего] делает коммит. + +- [Как писать сообщения коммитов в Git](https://medium.com/grisme/%D0%BA%D0%B0%D0%BA-%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2-%D0%B2-git-9ed19ebc5ebf) +- [Как оформлять коммиты, чтобы потом не было больно](https://habr.com/ru/company/Voximplant/blog/276695/) +- [Как следует писать комментарии к коммитам](https://habr.com/ru/post/416887/) +- [Общепринятые коммиты](https://www.conventionalcommits.org/ru/v1.0.0-beta.4/) +- [lolcommits](https://lolcommits.github.io/) + + + +### Когда делать Pull Request? + +Без разницы. Удобно делать его сразу, тогда всегда можно посмотреть изменения из рабочей ветки. + +Если вы не хотите получать ревью - создайте `Draft` pull request (черновик). + + + +### Что писать в Pull Request? + +Что и зачем делается. Обычно это краткое описание задачи / проблемы. Иногда причины, почему выбран тот или иной подход. + +Для этого описания [можно создать шаблон](https://docs.github.com/en/free-pro-team@latest/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository) (один раз) и пользоваться готовой структурой при каждом создании. + + + +## Вопросы? + + + +### Что использовать для работы с git? + + + +Варианты: + +- консоль + - [git](https://git-scm.com/downloads) + - [github cli](https://cli.github.com/) +- UI + - встроенный в редактор + - отдельная программа (например [Source Tree](https://www.sourcetreeapp.com/) или [Github Desktop](https://desktop.github.com/)) + + + +Основные команды: + +```bash +# Создать директорию +mkdir new-repo +# Перейти в репозиторий +cd new-repo +# Создать репозиторий +git init +# Создать файл +echo "Test" > 1.txt +# Посмотреть статус +git status +# Посмотреть diff +git diff +# Добавить файл в индекс +git add 1.txt +# Сделать коммит +git commit -m "Add 1.txt" +# Посмотреть лог +git log +# Создать новую ветку +git checkout -b new-branch +``` + + + +Основные команды для работы с удаленным сервером + +```bash +# Просмотреть список remote +git remote -v +# Добавить remote +git remote add remotename git@github.com:vvscode/otus--javascript-basic.git +# Скачать ветки с remote +git fetch +git fetch remotename +# Скачать изменения из remote для текущей ветки +git pull +# Отправить изменения в remote +git push +git push remotename branch-name +``` + + + +## Вопросы? + + + +## Github + + + +Профиль: + +- отображает основную информацию +- отображает список репозиториев +- отображает статистику +- можно сделать красивым ([1](https://www.youtube.com/watch?v=ECuqb5Tv9qI) и [2](https://github.com/abhisheknaiidu/awesome-github-profile-readme)) + + + +Репозитории: + +- личные и организаций +- публичные и приватные + + + +На странице репозитория отображается: + +- статистика (stars, forks, followers, contributors) +- содержимое README файла +- дополнительные ссылки (проект, issues, wiki) + + + +[Создание репозитория](https://github.com/new). + +При добавлении remote обратите внимание на тип url (ssh/https). + + + +Пример работы с репозиторием: + +- создать репозиторий +- создать новую ветку +- внести изменения в ветку +- создать pull request +- вмержить пуллреквест +- создать новую ветку из основной на основе прошлых изменений +- сделать новый pull request + + + +## Вопросы? + + + +Практика: + +- создать репозиторий (пустой) +- создать новую ветку +- в новой ветке создать файл README.md, добавить в него строчку '111' и сделать commit и push +- открыть пуллреквест с изменениями +- сбросить ссылку на pull request в чат + + + +Практика: + +- внести изменения в файл (поменять `111` на `222`) +- сделать коммит и отправить изменения в удаленную ветку (обновить pull request) +- сбросить ссылку в чат +- вмержить pull request +- локально переключиться на ветку по умолчанию +- подтянуть изменения с github +- создать новую ветку +- на основе изменений поменять `222` на `333` +- сделать коммит, push и открыть новый pull request +- сбросить ссылку в чат + + + +## Вопросы? + + + +## Автоматизация при работе с git + + + +Git поддерживает [хуки](https://git-scm.com/book/ru/v2/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-%D0%A5%D1%83%D0%BA%D0%B8-%D0%B2-Git). + +Хуки бывают: + +- клиентские +- серверные + +Их можно использовать для: + +- изменения кода +- формирования сообщений +- уведомления других программ о событиях + + + +Что полезного можно сделать с хуками? + + + +Серверные хуки доступны есть вы запускаете свой собственный [git сервер](https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80). Но мы работаем с Github и он это делать не позволяет. Зато Github поддерживает [веб-хуки](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events/about-webhooks). + + + +Это использовалось для интеграции с сторонними системами (например [CI](https://habr.com/ru/post/352282/)). + +Тут есть варианты: + +- Jenkins +- TeamCity +- TravisCI +- CircleCI +- GitlabCI +- GithubActions + + + +Предпочтительнее использовать системы, которые поддерживают конфигурацию на уровне кода (TravisCI, CircleCI, GitlabCI, GithubActions) + + + +Для работы с интеграциями на курсе мы будем использовать [GithubActions](https://docs.github.com/en/free-pro-team@latest/actions) ([краткое введение](https://habr.com/ru/company/microsoft/blog/481502/)). + +Для подключения action нужно просто добавить [yml](https://ru.wikipedia.org/wiki/YAML) файл с нужной структурой. + +Примеры файлов можно посмотреть [здесь](https://github.com/otus-js-student/js--game-of-life/tree/master/.github/workflows) и [здесь](https://github.com/vvscode/otus--javascript-basic/tree/master/.github/workflows). + + + +## Вопросы? + + + +Практика: + +- в созданном репозитории создать новую ветку +- добавить туда [workflow для добавления комментария со ссылкой на codesandbox](https://github.com/otus-js-student/js--game-of-life/blob/master/.github/workflows/codesandbox-link-comment.yml) +- добавить в репозиторий файл [index.html](https://gist.github.com/vvscode/24df74ff0771e09bef53e40cba819c7a) с заголовком OTUS и выводом `alert` +- сделать commit, push, pull request +- убедиться что добавлен комментарий +- сбросить ссылку на pull request в чат + + + +## Вопросы? + + + +Короткая вводная по запуску тестов локально: + +```bash +# Перейти в директорию проекта (репозитория) + +# Инициализировать проект +npm init -y + +# Добавить node_modules в .gitignore +echo "node_modules" >> .gitignore + +# Установить jest +npm install jest --save-dev + +# Создать конфигурацию jest +npx jest --init + +# Проверить работу тестов при помощи +npm run test +``` + + + +Для настроек Jest выберите следующую конфигурацию + +```bash +✔ Would you like to use Typescript for the configuration file? … no +✔ Choose the test environment that will be used for testing › jsdom (browser-like) +✔ Do you want Jest to add coverage reports? … no +✔ Which provider should be used to instrument code for coverage? › v8 +✔ Automatically clear mock calls and instances between every test? … yes +``` + + + +### [Домашнее задание](https://github.com/vvscode/otus--javascript-basic/blob/master/lessons/lesson06/homework.md) + + + +Дополнительные материалы: + +- [Git Book(ru)](https://git-scm.com/book/ru/v2) +- [Git изнутри](https://habr.com/ru/post/468205/) +- [19 советов по повседневной работе с Git](https://habr.com/ru/company/mailru/blog/267595/) +- [Курс "Введение в Git"](https://ru.hexlet.io/courses/intro_to_git) +- [Скринкаст по Git](https://learn.javascript.ru/screencast/git) +- [Первоначальная настройка Git](https://hyperhost.ua/info/ru/pervonachalnaya-nastroyka-git) +- [30 команд Git, необходимых для освоения интерфейса командной строки Git](https://habr.com/ru/company/ruvds/blog/599929/) diff --git a/lessons/lesson07/task.md b/lessons/lesson07/task.md new file mode 100644 index 0000000..46df8b4 --- /dev/null +++ b/lessons/lesson07/task.md @@ -0,0 +1,27 @@ +--- +Зачем: Мы уходим из песочниц и начинам работать в условиях умеренно приближенным к реальным. Тут вы настраиваете ваше окружение (гит, редактор, тесты и линтеры), на практике создаете репозиторий и пуллреквест, получаете опыт код ревью (когда ваши задачи начинают проверяться преподавателями). По схеме из этого задания мы будем работать остаток курса. +--- + +### "Закрепление базового синтаксиса языка" + +Вам нужно будет: + +- создать репозиторий на гитхабе +- инициировать проект в репозитории +- решить предложенные в подготовительном курсе задачи (разместив код и тесты в директории `src`) +- покрыть решение задач автоматическими тестами +- сделать коммит (а лучше несколько - по одному на задание) +- открыть пуллреквест +- прислать ссылку на пуллревест в чат с преподавателем" + +#### Критерии оценки: + +- создан репозиторий на гитхабе - **1** +- создан npm-проект - **1** +- решены задания - **4** +- сделан пуллреквест - **2** +- настроен хаски и линтеры **\*** + +

+ +#### Задание считается принятым при 7 баллах From 8b0ffb75ac232060bf1b50bf6cfba93435d3ab73 Mon Sep 17 00:00:00 2001 From: Vasil Vanchuk Date: Mon, 21 Jul 2025 21:18:51 +0300 Subject: [PATCH 2/2] Format code --- lessons/lesson04/lesson.md | 2 +- lessons/lesson06/code/smart-getter/index.html | 310 +++++++++++------- lessons/lesson20/task.md | 34 +- lessons/lesson22/task.md | 90 ++--- 4 files changed, 244 insertions(+), 192 deletions(-) diff --git a/lessons/lesson04/lesson.md b/lessons/lesson04/lesson.md index 4152392..a4b3332 100644 --- a/lessons/lesson04/lesson.md +++ b/lessons/lesson04/lesson.md @@ -657,4 +657,4 @@ describe('createCalculatorUI', () => { -Опрос о занятии \ No newline at end of file +Опрос о занятии diff --git a/lessons/lesson06/code/smart-getter/index.html b/lessons/lesson06/code/smart-getter/index.html index 8fe8d42..79147bf 100644 --- a/lessons/lesson06/code/smart-getter/index.html +++ b/lessons/lesson06/code/smart-getter/index.html @@ -1,59 +1,91 @@ - - - Safe Getter - - - - -
- - - -
-

Задача: Реализация аналога функции _.get из lodash

- -

Минимальный набор знаний

-
    -
  • - Доступ к свойствам объекта (через точку и скобки): - obj.property или obj["property"].
    - Квадратные скобки позволяют использовать переменную с именем свойства. Подробнее: MDN: Работа с объектами -
  • -
  • - Работа с вложенными объектами: - - Для доступа к свойствам внутри других объектов используйте последовательный доступ: obj.user.profile.name или obj['user']['profile'].name - - Подробнее: learn.javascript.ru: Объекты -
  • -
  • - Работа со строками и массивами: - - Используйте split() для разбивки строки пути на части: 'user.profile.name'.split('.'). -
  • -
  • - Проверка существования свойства:- - Если обратиться к несуществующему свойству, вернётся undefined. Можно проверить через сравнение с undefined или оператор in: 'key' in obj. - Подробнее: learn.javascript.ru: Объекты -
  • -
  • - Условные конструкции:- - Используйте if для проверки условий, например: если свойство не найдено, вернуть значение по умолчанию. -
  • -
  • - Объявление функций с несколькими аргументами -
  • -
  • - Обработка пустого пути - как проверить что строка или другое значение "пустое" -
  • -
- - - -

Что нужно сделать

-

- Реализуйте функцию get, которая позволяет безопасно получать значения из вложенных объектов по - строковому пути. Эта функция должна работать аналогично методу _.get из библиотеки lodash. -

-

+  
+    Safe Getter
+    
+  
+
+  
+    
+ + + +
+

Задача: Реализация аналога функции _.get из lodash

+ +

Минимальный набор знаний

+
    +
  • + Доступ к свойствам объекта (через точку и скобки): - + obj.property или obj["property"].
    + Квадратные скобки позволяют использовать переменную с именем свойства. + Подробнее: + MDN: Работа с объектами +
  • +
  • + Работа с вложенными объектами: - Для доступа к + свойствам внутри других объектов используйте последовательный доступ: + obj.user.profile.name или + obj['user']['profile'].name - + Подробнее: + learn.javascript.ru: Объекты +
  • +
  • + Работа со строками и массивами: - Используйте + split() + для разбивки строки пути на части: + 'user.profile.name'.split('.'). +
  • +
  • + Проверка существования свойства:- Если обратиться к + несуществующему свойству, вернётся undefined. Можно + проверить через сравнение с undefined или оператор + in: 'key' in obj. + Подробнее: + learn.javascript.ru: Объекты +
  • +
  • + Условные конструкции:- Используйте + if для проверки условий, например: если свойство не + найдено, вернуть значение по умолчанию. +
  • +
  • + Объявление функций с несколькими аргументами +
  • +
  • + Обработка пустого пути - как проверить что строка или + другое значение "пустое" +
  • +
+ +

Что нужно сделать

+

+ Реализуйте функцию get, которая позволяет безопасно + получать значения из вложенных объектов по строковому пути. Эта функция + должна работать аналогично методу + _.get из библиотеки lodash. +

+

       /**
       * get: Smart getter for object props
       *
@@ -64,65 +96,101 @@ 

Что нужно сделать

* @param {any} fallbackValue */
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Описание в JSDocПояснение простыми словами
get: Smart getter for object propsЭто функция, которая "умно" достает значения свойств из объекта.
Check tests for usage examplesПосмотри тесты, чтобы увидеть примеры использования этой функции.
@param {any} objПервый аргумент — объект, из которого нужно получить значение.
@param {string} propertyВторой аргумент — строка с путем к нужному свойству, например: 'user.profile.name'.
@param {any} fallbackValueТретий аргумент — значение по умолчанию, которое возвращается, если свойство не найдено.
- - -

Описание задачи

-
    -
  • Функция принимает объект, строку с путем до свойства (через точку или скобки, например, - 'user.profile.name' или 'user["profile"].name') и значение по умолчанию.
  • -
  • Возвращает значение, найденное по этому пути, либо значение по умолчанию, если путь не существует или где-то - на пути встречается undefined или null.
  • -
  • Если путь пустой, функция должна вернуть сам объект.
  • -
- -

Когда бывает полезна

-
    -
  • Когда структура объекта заранее неизвестна или может быть глубоко вложенной.
  • -
  • Когда нужно избежать ошибок при попытке доступа к несуществующим свойствам (например, - Cannot read property 'x' of undefined').
  • -
  • Для обработки данных из API, где некоторые поля могут отсутствовать.
  • -
- -

Где такая функция уже используется

-
    -
  • В библиотеке lodash функция называется _.get и широко применяется для безопасного доступа к - вложенным данным.
  • -
  • Аналогичные функции есть в других библиотеках, например, в Ramda (R.path), а также в различных - утилитах для JavaScript/TypeScript.
  • -
- -

Пример использования

-

+      
+        
+          
+            
+            
+          
+        
+        
+          
+            
+            
+          
+          
+            
+            
+          
+          
+            
+            
+          
+          
+            
+            
+          
+          
+            
+            
+          
+        
+      
Описание в JSDocПояснение простыми словами
get: Smart getter for object props + Это функция, которая "умно" достает значения свойств из объекта. +
Check tests for usage examples + Посмотри тесты, чтобы увидеть примеры использования этой функции. +
@param {any} obj + Первый аргумент — объект, из которого нужно получить значение. +
@param {string} property + Второй аргумент — строка с путем к нужному свойству, например: + 'user.profile.name'. +
@param {any} fallbackValue + Третий аргумент — значение по умолчанию, которое возвращается, + если свойство не найдено. +
+ +

Описание задачи

+
    +
  • + Функция принимает объект, строку с путем до свойства (через точку или + скобки, например, 'user.profile.name' или + 'user["profile"].name') и значение по умолчанию. +
  • +
  • + Возвращает значение, найденное по этому пути, либо значение по + умолчанию, если путь не существует или где-то на пути встречается + undefined или null. +
  • +
  • Если путь пустой, функция должна вернуть сам объект.
  • +
+ +

+ Когда + бывает полезна +

+
    +
  • + Когда структура объекта заранее неизвестна или может быть глубоко + вложенной. +
  • +
  • + Когда нужно избежать ошибок при попытке доступа к несуществующим + свойствам (например, + Cannot read property 'x' of undefined'). +
  • +
  • + Для обработки данных из API, где некоторые поля могут отсутствовать. +
  • +
+ +

Где такая функция уже используется

+
    +
  • + В библиотеке lodash функция называется _.get и широко + применяется для безопасного доступа к вложенным данным. +
  • +
  • + Аналогичные функции есть в других библиотеках, например, в Ramda + (R.path), а также в различных утилитах для + JavaScript/TypeScript. +
  • +
+ +

Пример использования

+

       const obj = { user: { profile: { name: 'Ivan' } } };
 
       get(obj, 'user.profile.name', 'No name'); // вернет 'Ivan'
@@ -131,10 +199,12 @@ 

Пример использования

get(obj, '', 'default'); // вернет весь объект obj
-

Ваша задача — реализовать эту функцию самостоятельно, не используя lodash или другие сторонние - библиотеки.

-
- - - - \ No newline at end of file +

+ Ваша задача — реализовать эту функцию самостоятельно, не используя + lodash или другие сторонние библиотеки. +

+
+ + diff --git a/lessons/lesson20/task.md b/lessons/lesson20/task.md index f60ca4f..d9b3743 100644 --- a/lessons/lesson20/task.md +++ b/lessons/lesson20/task.md @@ -14,14 +14,14 @@ Вам необходимо реализовать собственную версию метода .bind для функций в JavaScript. Встроенный `.bind` использовать нельзя ```js - function greet(greeting, punctuation) { - return greeting + ', ' + this.name + punctuation; - } +function greet(greeting, punctuation) { + return greeting + ", " + this.name + punctuation; +} - const person = { name: 'Алиса' }; - const greetAlice = greet.myBind(person, 'Привет'); +const person = { name: "Алиса" }; +const greetAlice = greet.myBind(person, "Привет"); - console.log(greetAlice('!')); // Ожидаемый результат: "Привет, Алиса!" +console.log(greetAlice("!")); // Ожидаемый результат: "Привет, Алиса!" ``` ### Цепочка @@ -29,8 +29,8 @@ Создать конструктор с методами, так, чтобы следующий код работал и делал соответствующие вещи те запуск кода ниже должен делать то, что говорят методы ```js - const u = new User(); - u.askName().askAge().showAgeInConsole().showNameInAlert(); +const u = new User(); +u.askName().askAge().showAgeInConsole().showNameInAlert(); ``` ### ForceConstructor @@ -42,15 +42,15 @@ Написать каррирующую функцию `curry` ( преобразующую функцию - из функции многих аргументов, получить множество функций одного аргумента) ```js - function sum2(x, y) { - return x + y; - } - function sum4(a, b, c, d) { - return a + b + c + d; - } - - curry(sum2)(1)(2); // 3 - curry(sum4)(2)(3)(4)(5); // 14 +function sum2(x, y) { + return x + y; +} +function sum4(a, b, c, d) { + return a + b + c + d; +} + +curry(sum2)(1)(2); // 3 +curry(sum4)(2)(3)(4)(5); // 14 ``` ## Критерии diff --git a/lessons/lesson22/task.md b/lessons/lesson22/task.md index a21cfb2..d2de837 100644 --- a/lessons/lesson22/task.md +++ b/lessons/lesson22/task.md @@ -17,8 +17,8 @@ - Функция promisify принимает на вход функцию, которая ожидает колбэк последним аргументом. Колбэк должен иметь стандартный вид: callback(error, result). - promisify возвращает новую функцию. При вызове эта функция возвращает промис, который: - - Резолвится с результатом, если в колбэк передан null или undefined вместо ошибки. - - Реджектится, если в колбэк передана ошибка. + - Резолвится с результатом, если в колбэк передан null или undefined вместо ошибки. + - Реджектится, если в колбэк передана ошибка. - Ваша функция должна корректно передавать все аргументы исходной функции, кроме колбэка. ```js @@ -37,9 +37,9 @@ function sum(a, b, cb) { const promisifiedSum = promisify(sum); promisifiedSum(2, 3) - .then(result => console.log(result)) // 5 - .catch(err => console.log(err)); // "Ошибка" -``` + .then((result) => console.log(result)) // 5 + .catch((err) => console.log(err)); // "Ошибка" +``` ### Parallel @@ -48,20 +48,13 @@ promisifiedSum(2, 3) **Требования:** - Класс должен называться `Parallel` и быть конструктором (использоваться через `new`). - - У экземпляра должны быть публичные методы: - - `job(fn)` — добавляет задачу (функцию), которую нужно выполнить. Метод должен поддерживать чейнинг (возвращать сам объект). - - - `done(cb)` — запускает выполнение всех добавленных задач. Когда все задачи завершены, вызывает колбэк `cb`, передавая ему массив результатов. - + - `job(fn)` — добавляет задачу (функцию), которую нужно выполнить. Метод должен поддерживать чейнинг (возвращать сам объект). + - `done(cb)` — запускает выполнение всех добавленных задач. Когда все задачи завершены, вызывает колбэк `cb`, передавая ему массив результатов. - Если не было добавлено ни одной задачи, `done` должен вызываться асинхронно. - - Пока не вызван `done`, задачи не запускаются. - - Если при создании объекта передать число (например, `new Parallel(3)`), оно задаёт максимальное количество задач, которые могут выполняться одновременно. - - Все задачи — функции, которые принимают один аргумент: функцию-колбэк `done(result)`, которую нужно вызвать по завершении задачи. - - Результаты должны возвращаться в том же порядке, в котором были добавлены задачи. - Продумайте выполнение задач без простоев @@ -70,10 +63,10 @@ promisifiedSum(2, 3) const runner = new Parallel(2); runner - .job(done => setTimeout(() => done('A'), 1000)) - .job(done => setTimeout(() => done('B'), 500)) - .job(done => setTimeout(() => done('C'), 300)) - .done(results => { + .job((done) => setTimeout(() => done("A"), 1000)) + .job((done) => setTimeout(() => done("B"), 500)) + .job((done) => setTimeout(() => done("C"), 300)) + .done((results) => { console.log(results); // ['A', 'B', 'C'] }); ``` @@ -89,46 +82,44 @@ runner Если запрос завершается успешно, функция возвращает результат как обычный `fetch`. Если все попытки завершились неудачно, функция должна вернуть ошибку. ```js -fetchRetry('https://dummyjson.com/products', 3, 1000) - .then(response => response.json()) - .then(data => console.log(data)) - .catch(error => console.error('Ошибка после всех попыток:', error)); +fetchRetry("https://dummyjson.com/products", 3, 1000) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Ошибка после всех попыток:", error)); ``` **Требования:** -- Если запрос завершился с ошибкой (например, сеть недоступна или получен некорректный HTTP-статус), функция должна подождать указанную задержку и попробовать снова, пока не исчерпает все попытки. -- После успешного ответа функция должна вернуть результат без дополнительных попыток. -- Если все попытки неудачны, функция должна вернуть ошибку. - +- Если запрос завершился с ошибкой (например, сеть недоступна или получен некорректный HTTP-статус), функция должна подождать указанную задержку и попробовать снова, пока не исчерпает все попытки. +- После успешного ответа функция должна вернуть результат без дополнительных попыток. +- Если все попытки неудачны, функция должна вернуть ошибку. ### debounce Напишите функцию `debounce`, которая принимает два аргумента: -- функцию, которую нужно вызывать (например, обработчик событий) -- время задержки в миллисекундах - + +- функцию, которую нужно вызывать (например, обработчик событий) +- время задержки в миллисекундах + Функция `debounce` должна возвращать новую функцию-обёртку. Эта обёртка при каждом вызове не будет сразу запускать исходную функцию, а будет откладывать её выполнение на заданное количество миллисекунд. Если обёртку вызвать ещё раз до истечения задержки, предыдущий таймер отменяется и запускается новый отсчёт. В итоге исходная функция будет вызвана только один раз — спустя указанное время после последнего вызова обёртки ```js function onInput(event) { - console.log('Запрос к серверу:', event.target.value); + console.log("Запрос к серверу:", event.target.value); } const debouncedOnInput = debounce(onInput, 500); -inputElement.addEventListener('input', debouncedOnInput); +inputElement.addEventListener("input", debouncedOnInput); ``` В этом примере функция `onInput` будет вызываться только через 500 мс после того, как пользователь прекратил вводить текст, а не на каждое нажатие клавиши. **Что проверить:** -- Исходная функция вызывается не чаще одного раза за указанный интервал времени. - -- При частых вызовах обёртки исходная функция не запускается, пока не наступит "пауза". - -- Аргументы и контекст (`this`) корректно передаются в исходную функцию. +- Исходная функция вызывается не чаще одного раза за указанный интервал времени. +- При частых вызовах обёртки исходная функция не запускается, пока не наступит "пауза". +- Аргументы и контекст (`this`) корректно передаются в исходную функцию. ### serialProcess @@ -136,19 +127,15 @@ inputElement.addEventListener('input', debouncedOnInput); Функция-обработчик вызывается с четырьмя аргументами: -- `el` — текущий элемент массива, - -- `index` — индекс текущего элемента, - -- `list` — исходный массив, - -- `done` — функция, которую нужно вызвать по завершении обработки элемента, передав ей результат обработки. - +- `el` — текущий элемент массива, +- `index` — индекс текущего элемента, +- `list` — исходный массив, +- `done` — функция, которую нужно вызвать по завершении обработки элемента, передав ей результат обработки. Функция `serialProcess` должна возвращать промис, который резолвится после завершения обработки всех элементов, с массивом результатов в том же порядке, что и исходный массив. ```js -serialProcess([1,2,3,4,5], (el, index, list, done) => { +serialProcess([1, 2, 3, 4, 5], (el, index, list, done) => { console.log(`${el} start`); setTimeout(() => { console.log(`${el} end`); @@ -159,15 +146,10 @@ serialProcess([1,2,3,4,5], (el, index, list, done) => { **Требования:** -- Каждый элемент обрабатывается только после завершения предыдущего. - -- Обработчик может быть асинхронным (например, содержать `setTimeout`). - -- Результаты собираются в массив в том же порядке, что и исходные элементы. - -- После обработки всех элементов промис резолвится с массивом результатов. - - +- Каждый элемент обрабатывается только после завершения предыдущего. +- Обработчик может быть асинхронным (например, содержать `setTimeout`). +- Результаты собираются в массив в том же порядке, что и исходные элементы. +- После обработки всех элементов промис резолвится с массивом результатов. ## Критерии