From e175b475aa6c961fa324890209e72dda982c0263 Mon Sep 17 00:00:00 2001 From: Sorokin Fedor Date: Sat, 23 May 2026 15:14:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=202:?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3=D0=B8=D1=8F=201:?= =?UTF-8?q?=20BFS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 + benchmark_chart.png | Bin 30671 -> 30806 bytes results.csv | 180 +++++++++++----------- sorokinfi/427.md | 348 ------------------------------------------ 4 files changed, 93 insertions(+), 438 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 sorokinfi/427.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c9ebf2d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:system" +} \ No newline at end of file diff --git a/benchmark_chart.png b/benchmark_chart.png index 84c386e10f4c481abb3587e1873118d77bd55851..19c11bab205be152221dde948b32ceafc4d02367 100644 GIT binary patch literal 30806 zcmeFZcT`h**EJeNK~zM=21->xKtQR|QB6pBvi z<~1!8ifS5#+I@Q;HGJ}$rHvE*kaWL(+g;nq(%tKhs|8B!j=QtHle@jmT{ce(S2r6c zM`3|W7X>6PuvxpiJG)5=3OfAj2mvQoD?zRsI0HBft@BL-Hx!Eg4)Xu5*K#>FD3sR+ zrE6Do?!TNHqPc&phw$#VS5%iug#3A0Y}RWs#{;vVP&SSed#>~F&Xlt~(7GnSXYZ}U zI>)XYsXdQ*&-a)^D|6p&jtmiY^01Fm$p|TBz1`BQ^t2HB9q#_^1#jvSD=VvxZ$n<{ zZq-AMm2e9vRA9u@eRDIrD1YUUr$PRFw`*S)G^Y7 z$>;lDCqGTNDm^*MIsPqIJ6Be_$VkElm)(B7c%4kdEsh4$f7R7D=Irk7)_P-hCD))d zy9KvOn$m6$7;iq}{pWi~*8SgOTxJd5ADuRz_!_e-ZgZ}3L^)Z~h-6<>o8%Ly-{? zY^#eCB%UjHt%Ze#bpe&dtRS+XQ@us6af!K7)bd1}sdC66=JEXEhRE9an%2y@kw(*^ zscV^m@VO$BbTj^MweFOQF3+2@$b;XaZSh6? ztbXKMvG(F9^OMnORPQ)T+@{pEC(7K3*hp>-79P`vx{dXb?O3;|j)WC%jTHO527%je z|qJ)u{p;Pxd_ zwWwY1pSGL@8=g41LfiaZ!2vCO@t5wk(R&n*<>`8eHg0(z)YH|+znUePHc|@=oA@p1 zMimW=&i(8!%~p2EQjTe>h~v?|u|_7|!wP$ zH0|N@aY|8Kt8Kzg!_u9S`i1D284~(K-hx`PWY1K+$82xHXts5C1{eL(OpkC+XuZMI zGiuf0LuW2W*fyej@;3*R?9#G{iJfJ)Q!BX&8-~)ZP$h^tp!2-r1dMH!odj!t3Tf9@ z-+0E9ea*mQj?iNz5tPkuSYh5@JzuX;W?M0-z4Dei{{5uN?8}4KR-Twp4Zp9hyb?^^ zGFUW5b#NcdYHKo^uh4&(BNUi!2Ky z@%q-XGVAWETQCKQ6Dax1D%G{SQ6+6f#rlDkrfLn6xx%eDy>ZD4wkRI zrly(27mLe{Ryq#N&@L9FsSZRh&-Aoz6zeK1(QLoH*Q9#*yBc29>>Y~q(F>QYCWIkd zGep=ARPZYdWW28`YBa2L#J*Cb*WUe_)3tGXtM&rAtU0>K_`;9|njfDkd&YX8qVR%I zRoBlZ+n&6Z)POCX;>N8S`@T2qW@*!c_3QVxHdci!z8))m#&oJ-b9um()GppyV$rHf zn}bEoCfXJK-a}>zv_5X;clcFPhE->ZZ0k3+^ddwRa!u|XA@069f3%CsWcVx+4 z(r`@!itU2UaW4pyGlSKoQXCu~HV2#?Ce&Z$-0fSX* zED%@gwJ>~TC7mS|rZK5eF`OlN(&Lp)uS7!cF>6-;t<@=6(zks5&U(y}ZK^k9v{C=j zAQ~+{&o5z&lfoFke0@{Dp1R=*2g5vX*kKC|lZkfrg1D0VzwbuLT6~SxN!=Cbd=;j( z`7U}UpR=}d7-N?g$vt5@aa-k4y-IqyyIOt}hF)RZnBckb$3;6bm(vx^RNRxXDV2|1 zDc_um!Ub=7C^DSU?;$;8Zdm%RYvvXbP3fY;r^QjD*^tqWM zmE#JN?TP-2*|VgMV1XZ3%krvNGzvM*Ldp;EA7_>Guj3iQC+^W}$?eVSB2b|j&K0`J z$iQ6aqh}RVK8@V}LFZ;9j8Uh~SU2gUEgVjb%~nfFOldDaW~@>b+?{;_{UIP-De2=M z+{CO8X3pBm9^)k8y_nf4UE^5DIi_LfdwaoWo7LWA!QtkD5Pxq2_6H5>dl>ILD&n)q z?JnMIVqt|rwW~!cp6Rf)?wx$KBCKs1;ZhW}OO5@ue0yVFp{{WsxG|}|)JSG=%Q2l9@*45WepXY#kKbOXBdO!?f#P$wRjH)u_65_)WwrLs zESy;2{XtB>LatqCuuIgueMKANy&%_KOC3Qt8HmlB;4RJLvHDzH)PA@?Y@O&G@d6fO zEV(SFH~T_+qNp&vWLe0Pd|9r-4I3%v#`}vs2MM9}n_*A)oVXzxr^X}jDFHeivTR$>e6s-QH zp0T@o)NtTTz+wycu7Q%-weq373jRZ%_8-MX4sW`!_xkq+4g~b^E_kfs4o#F*+RmBE ztB7t&`H@VPg*&D1DYsGmc2p>UkZ#4oc3ULAXH@Q#Lw@0|f=OeQ#ksDd23eeM(V_Ax zYvq2`)c*b7jqv_^YP=R4mA95QzKN0b*1c<|%-IOvUs5M-F>_P%UB^q?^3=pS(_{=p zrie|iU0k@zxxth<`xbAf$$I%bMCtmP^-?VP`$N&xnE8N0o5Tvi%1p0>6LzM1^X5>f z?+<}jl*CgPGMW8Z;bIPpwYMqPSum+sQY`fJ%qmmhE1cPA7axgdT^Z)g2(s?EwSd*7 zqb4`K_0;Qy7^6|+xj1gRKfk`*hi00IZ41$F4eM!Bb^v z)1s%kX!Tnn6*@70T|O!1zSjrqDF7i!nbZFJVmsxtrW5rGyAR*oTw798d_m+Pt}J*D zr|Omu)-DG*rpjh^)36LD*AQKLNJE%kuSh(FexuA`cHHp<9fg%wLl)=)zbv)eD7Kf~ z)G%&qH%=e9gBk8+f4C9yVZRQYUcQP?KiM zv~1XD=I+X^Fka5_CbQJE2sj8AWMR(U2;0Zx3rk7n*QX~8RE}{01BB3i)WS#$$O79uc^)=6JlVDdY+S+^6y%1gWacZw*4%SVb`jy|Q zJvGBr-RRwzI#ch7m_R=f^Gv!L*)-a+#u1+d8B*iQ$20u8_>_&ME00&E${&R+Cz+LV z;@S63C|B zwR^fD2TAj)DpZI0*?Y}&@~_xk#AYfnXk5&C|5xlW+aB||L6v}0vv2g@KVaQ_QPAU7 z$lAT|`?Lhu6kd&2FIcioEe@w^aDbxvtzGHuSRp7WzsESd+h| zl2#tD$L^+tA6wS0Be=DXvjmrsdDb;-@RX=5Z z5nU=z$}1PxPzeo=@%O>MtnL$=u3;sA50*Xi%}r6N59e1LROgt}^ELx(rzf?FyO;Ij zrCs|;nUN*JqU=b_A%~n5j{0SQ8P+W7Hl@dzi#lq_106y!F@l6Ns(n7`^EX&fAO1Ro z%lcS&T+n1N83>HmU;B@@McnI+Fzj_UkR)RPUjA(OS<*VV_rM8vubFQxe!oVqq*@T2 z?@DIgYVchh%u!HQww| z5_W0!qOs(e_{lr?B4b7tOSO9o+WvDn(an%|VBo-Ap3Q=FN)Vu$g^>w6F9d^PSFsLcx@LNgI`C&l*7n0q?foEN%sp0C zN%CKxt2_|9`>dS}&+w0MIY(vcpfGGU8)3`XF5Wz|Frcc7aFWm_pI@#0;1Js&5_3>& z2d3ZH5L#Y&Hix_`V~}?^SzJ$Kcu9qFKop~rhljkgfApNK0?0`^OojR-2YeRMjYd&r zSN1LZ7%C;2XiKYJDf zKWFG;8<4e@^q7hM3FM$o04Ve8(ueLlN?KiBx#4?nRn>#*d;8I__}jK2eM+c#cul>E zx(xR+x^3XlQ9gdAnYO?!Ve4244MmZA7v4H?HD29+{NnMFR)Hws zAs=(p$YnOTwvil-)L3BLNl*j#OHZ-7nhvkn6lEi|mYX38za zweym>x8G*)s5xOXpD0yI1A=e`DL^G(udwYD>4b4dEWhFSY;mI)=Xg+CvXnlM(+l)6 zWX-&lnVx)Zpjfe{{;QwsQbcSb-GBC7nl1_axucZIYvPUEo^@&(qdARLnzuJd8X(3* z@)cEG-GAc3bi!n3s$i0s!=k|rApa9U-6K8c2nqOmU&3C%;2GNX7T73vQFYsr>wQ*Y zfgUE!ECsnQ3>zacPx;3PAZQX(bH~n8_IZwdqJ0t;7JZyguQ^XQUm8a!w^P%--}?JU zlbX$HmCFxRw!$*W4dC+=NlpzfKrE0LU6fm!K8qlHX^_aSkeo;SRuU$xkFP`6``V*# z+Wz8N#fjrH2a(<2Tm(CCt!@ieQI_k(SFKu42ki$9P9w6~pJn2=HrG{PbjL@ww<>Mi zOvp)(2$T-**}_U}L5T_M6dO=43?9XPrRryk!*QN%%OBR zTkW)xs;UUdhPH;96g0h9#=Q&}8j??bQO#HF2Sr&wiRsCBn}|c>dju*)AG3e>fM`72 zr-9&#YVdtLzDp9>20IHF&0VUg^rw`tg*qf3 zcnBHyK&mbz;G*Q^Nt5mOI#F?lcg70B6J<}K{&wVlk6{0CNdG68dLD(4L!trUr^VG% zyeA=u(k481p$PqKNmc9fwONo~7so;cmEYd|JU*2gaL6Mz;t6Gq1s*t$clyFPq-c0! z&{YW^^7GZTCr3-}e58gr5dP`Q7iFDe?8fQ{?}h|Ha~a|adAj@K9tUsIWDJ*DVzX1@ zCYND_{gJrVUxvoS;MX5b;fCM()5~T>j7AHt0 zivAKLk?H?ruCv`7u$|yc9Vr{mF z&eP!`;)_$yadBaWL9&{aneBj~&ztMs?9I4-K>I2)Gc!L>yr>vH{k4LRQl`VLbN!_` zQyviN&D-KH$&%dX2)eMBPLhR(MT|#QQpGtqt}4d~I6T*YsHeL1LU?D`CFDUFLZU=0 zz1&9Eo~RgJ-AITViDo{aBU_>?>=P37w=1z*``iYg1fH(-hErpfCyfpMIBC}PREE_f~ zh_)9vz+^9@T$u&Bs#c@F-zsEsL|K0UKQV=vK3N(zKUACKQEX89WzVW{jr;F9FVH?n z7}zt5aM#M9=C=!p4k@|IO)KmlKSN1h@?u_#<4O#V5qSukr^}aXQeUI`@^W|dA&o>4 zCFR%)HrZpJLz7mQ0{Hlags|>n*_@xzLdL}=GSy>G`7%Mi)XGvmF5E~x>9@Wd^PE{K zu?&G?(S)_QLvp`AF}O}8dnuRO_Ne;1Cor9vl@y4k2|xnCE^D^;y|0G-*BuysH7@lU zYL(mSYNKT!nvepo*zLZ(IMwOYYYc*)_N;u|o$B9TPERzf&kLvGJyhc_UIBm zxoSP<77Z$}_^sAntbJ(3vtBbfnc0;b-6nCTVSD8kDkVFawZ?{G-L85P2Er~P)^Mv) ztv=X$ATi_=B7^37oAuXv74zJ|N4n7smJ=HN{Rb)>WLK*ob+ri<5TOE~6r=C==DSQM zpt3|;7Cu3!nPA`CQCM9F*iM?wQRx?LNJk^!qn#_)!bqWj69}>Mq=V^G^DF^=whCs_v#4R8G!n z+l_TAvbIP2?V4hfr%&h6&W_KMS{qjxpzSFzz?Dt)S2~%#TWwsOJgp(coL?WNM}tkG zg$VFL|MS!1oL=*TB_Ld;%Iix>;b!JfYQ4Har@fY+`a379iNKz)QWDd!Y+6x)udrVC za8NAL{WRCbJBv;%VE(i>sux4v=2VG|*Rouwvo-Xc8}G>A>?Ek04y4X5xX?W={2-KU zDm94noI;8$Hc0`a?}BtzyLcCC4%+P}%U_X7B&8^lzIT2NEmFzw;mUX&%G{zzI#7btIPJ&X<`uf!`MQzlhhB&eT{$haPgArPlUe3tEn<&YREf1gh? zEfA@{h-H-%POn1lb?~>cy|@CpD=Z#DwxLRR`7@{#wW>`yq33*n*iZTy7g0Y%zss~C z@YTfrkzM+xoogGiH6^$G0=8%iY)^p@dRDRI_Wnz*<2P|8gSAg<8q0b~efPp!KtP{p z;Z7A<&`6aX+B1s2m|dT0=sq&7X#rbGw6V23ua3G!Ilp3d*)F2aov5Y#Avq>%RY^(7 zb+V070z-aX2Z5aHR|R2veH}ta8x`Y1%IFKXi`FKOr?oHnVeyD+k~n-ZQQXNfD-mWC-iEt ztGK8laYf@IuNndUsg=%qZ^#E6w4+=3hgUW-&0m3ywQ=n1N zXe#PD`NyqXtnt{s@R}VmvRnMf?~-FFsHRYh$2Fud>&y z{^kn~OW6g8O0!OC_y=hcZj=HzIT=lmG&-w`@l)(E1I@s z5<7Y4)8ivt_wg(4EQL(-$({1vztkI{%&Ce~-*!-6z?78*OtvLVra$P_>~X-28mlDN z<6k9D6Ej8WMcB5-qcl`QT-LUH7V5dfr57Iq+G%pXoYOPs;T^R2v!0d8A#VHk!RR7p z0&zU~B>&vXuzv62()$OV1g~_D+f4(Bb)62gYrh(Y4`T$p&M!#cQI#S*4hR?7;h`I<-bPc)-WrUv7XVsJZEISy|tO*P0mh> zl9l+D;~fh;Dn3QPqwgs$N5cnO9;dRoyDLv;*z_sdLfJ`dO{6!;-)1^^KXcy43{z^! zbC3LYO*3eO%D(+}y1<{^I)r_=C#Z}m%Ja|nA!5^C6~vJr4KaT}Jy?c+a5e-Q zqCe+kvPy6->R!#%d7>Vh&8aQ$kvZpD!w3tHM<}OCa(py-Nzu5(Oyi*lf5HXb3~j7F zi+jscsw3DuRjryzoA2+$`o}I$d~yqS7`yB;?;_(8?z~lRWOv?HaB^!`*rWn?d!-jk z`C4i0ecRFTO_colDJ%^&L9cI}yK+*IRm-|YeA6L2b!AwP$=s%9QbFZ5|C)Duj-Jwr zKv=h5S}We~$B+q{l)l<+Vg6anCdZcPyj_p8jHN-j8oH!d7waLzByBYzHWB?JvlYv< zcdc=IDRaSYSNhg4Hv8Z{ncZZ2rnFfG8Gf6UEiGjy+8Wut-&{BfLoc3D+2CE;7AR2Z zVz^P(a-xZcJH^MIq3MZR`0Nv(houV>OrNYZhSoH12eSqc`P&;bYnT(tI|@`sN-RSA ztq8@Dv2|8GVyng6`IS9~xS8n}++}hYjvgIfY!zHN)@6VX`9h5*1)_!|UXQVG5DXsr zvrpr0IIW=v;&QI1x)V>u2sZo~+lzl?dLgL6h}^2e?WBkLF4$ESZIiVwD1MfRQJ{@x zxe)G&6Ge#~@sz}gzB_b{$~9m&WV*&pqwH0ysyVL_Og?won?5#$`M+`ZiYX8HAH>v>b3mXZ-s{V zvZc4vQHFkV#u+TlP}{Lk{=5J>y-I{Of+QUz?cc=qX6KNlr3z^F9cM{+7_odV_ud8D z)4UFfvX*V9v?Yt`Yw{6-VEcq^+sa?rOvL46LAenN*S%mm1;6Bfc3M0ZaPO_B$N9MAwl~~jiy4~t zQP}_JRg=dJW$V*_y^7Qxa{fqX`T9E`d!?30&d(FBa7B+(Kj==2#iu{Jckdo2@6(I> zI5=?0*dSLt5C`{1?{*?4g`^?M!oiqB#@|HE=`O^`FApuJ!D7r?TsBTH+%oUl}84WWF$a4l^S)n`qu-< z!ZCMa+7r$!r8kV3|*0N5SCA#+P029$%ZfS=o` zXg5zgGbtk^EYRL@j!>RWUe8W)+%MS){4rBLX!ouW+|dc7Sgs?Xj~4XqvsthSzDg7Q|>J! z;xy#cL_48$>@XY(HXTIs3D{mYRSNB8n;xpIM1bcwy)y@8ov|gADp%n$uDq>yf9Qrv z47ddNfvQB%%l>&6{Wy-_u(vKJYx+l1c-+dcPiKJ&)eiu-{Zk~gYq7((@^hvtxl2xT zDV@nuakj=()CVH~+o-?;1nVi_I}Nn~6>GQSK$Ia31A3-#K(NuMc+L+py025N$Plv1gd)pI>(n;kL`d$Zx4f3y4R;WtR+_@U3@L^ndD# zdq&HrJopRo@A~ArjLWQFAbhk;s&VlvpPHgG&7m_l%UL#mLaMgtdvoUsDTBG)#>%T# z=e1_K4#}FQsv&2VNyz-M_u(|}1BhE{GW{K2aot_X$5bz$iXj@IyjYIzw{rA-AbzTy zvyzjQ%OAGzrU40BwsbEGQPTYAr$r9k<-8kUkxH5IGxkIj@R94GC)AcAMgjkc&34U@ z(fe6mn{SunO@wvZalGvs;hCA|0I-DR61KP27n0u9f@p<=kgP;~*2~lJv%@m)snoC0 zB63;;m38}@*Jh!Bob-`5(4QaVI$_G+zx z02#mhb4^ozplBV3b@q#Jep{v>?T1R6?W!OV)az9fgs!M`1($o#y!p*tNev+kTR%e*CWGJx+UO^GmF zN1+>2hazRU-S0l?#>^lsCZ^YsD%aU?r6Q|`z$4MQqqhd4MBcDh?Q-VnRyqTh`+uax z{I3LO%ANe5J`1~;|ivk zGhf|{Jh}O^*B8(N*gK$aVDt3_8NrM|+tC!pcovdIG$Ik(+uP@@LKxuYN0(hhJYc$G zV`JvCy@km9EQ?dl;RcCU1WZuG;rd$l+1~cLUU@$d`h;w-=Rm_T&07`S1VaSk^Jt0T zi&Mg35vd6!zpNO@!hvRLxchlOaip=4n;#S!pf&<3u@`9nB!KLs$0TZNo>v8I%J}I? zK>-L<#pJmGeU7tdsr)Cw)@E69M#{5oBQ-wWn#-eF0QQLRAtT;x6%74tNA;5zk-kv~r;xz?V;PQ>n8 zsHzz=`g?RL@fJQb zmql&AMSzOX3XIopQ4``WDeW%gHCgdzptmM1c`t;3B}fV4e7iqx)9lIf=dp-G4XOj? zP0yKA5Uv>d$NWiWYGmAAAET13*D8*JaTl(;=41vmp1tb%@)%L)Qa|^p)WpN=+()n1 z=&4t`0_iZc(y8zwE4-aNZVf#fdy0IN3V8H zEc<_ZpmIa-hJ!*;PfxkdAT~#XH9;<*;ev6ENRL&SLKUq3_yfI|wXB|TQ}9Rv6!EH2 z>1qXm52U$hqy**g#58Mb+j!zCp=9u$y+e;DVgjR#VE^sVsRPCm;&FL4U3iL|9IlZ&F{=&rdhS{jdT zJR_et(eQ$wN(icez2ztW5eRN@yWF`U^`Oh-?8o}Ek6kw{Z(be{8jIDmLNFcs4f|2) z=(K@Mnb+HZ&`UgK^(3Gi$GATo$}ZVM_o0qdI(eQ#8(gJ#likbXRzhmOndnI>Mm`)Qv|e~CrcipR^}AjA%<3f7Y&?fXkO zg~N{^r)E2NI4ws3{l2;p>Z!t%+cTs20gs`Ox;HXDo|09EKJR>fIBnn?_!#=%+zHko z0BBW}S^{@>zwu6XqTW@bmMrBJ3+kRaRO>jWI#c5SA9U0?;}n`_`Wy^aQLq%;5`-+2Em>J9mxxcJt5Jg@op8_}QM}PT$-hdi zZPozK3$6b_zDIr7!#OR6SikSyyQiH6MNcfZ*-oYV&~Eo6q)I4knR&3=V($bPFH=Np zzcv4Js9%pc;(#q)0K<7C(3=7Bs4Ub0NGre#Ea0|1Pf|`3c!jn`O)XL61z0c>MmL}` z8;e-wbi9$eDZ-%tdAjpgIs;+ezk-KHc<~nH-gal~8OjF3#8;?GMDQBp8n(B5YC|at z@Ex0cWv*$Xe`IuYH1E)yXVMDg7YM;j0u*q*CtqJ9#stK7a1sOvxgVx{3%}u!ltha; z4Zq|y4kqp1yWjZ+W%UU?L=9yRIM%9RmVfdfbxqn1h++K5uI<~om4`BL;v3J;*eHK3 zSM~wa*sfEE7JUK?1j;)6KQ+!H7m)vQu?$}RRiu#%wCzRTjC?WZkL*N zPLX~7N~I0hZ6l?;93kn7;ldb&+x|@T+EGp{^x!D@;Qb%Z#LtO|^=^P~MTZd_&A@lq z6(~24LS2VthLr1&)Yb^SK`*7e)W1Au<^yT@C1nZ&51xg6^^~tD;?lh@%_%ZIZQHpj_;sD9kkwOD=F>M^sf^Mv8E`!?Mr|kP8NtZ_uk@_xvbwBwN!f z*jz{@5Mt9;_(djg5H0Ag(5NLt7l;_&^COhQAPiasF87)=`futGnE|hb-Gkx>a0mq* zmr5G|A2#Zqpq8kAjp4JBOttHKlYYUl;=*)Y6t~8SxYh|_;uLZ;s-G3Ms*Rx=U09*X zU`#`A<5GZBeYHk{&~>n$a{`YQe_!n>i7&BGF=+I!w>l*r0DM|(!LXo?^79gLzt85)|Vf_|LrglrfAu^(* zAZg;|-P$HJ06svc6RZ8HLX2u0gffF>fXxBCQIPs?!#U{*ghb0t&gXh)MK)_g1n|M7+e?2qKDrw zJukpwZfLU+p%<%5I%*xhRzr_$bX(!u0%dCaV^N&40m>#Pe!8@*y%MOdH!3;Sk{r3U z`Fvl$i&m!gXY*7uU)!q>U*0@ML`zJ3$>nkii+FI0!z)H(nU=uq6c$~zo1<_{8yo(T zVU?F%i&wEW%cdpz^vrW@juEHuXu>7OT!yH~qE(!)n85c~-fkWuAAODa=Uu=nwEDmQ zSK<8MAk+may{RKN_sPT!tlv5yFb%o?K;NaLl)<$3PO=a(Z16?N-1RDP z0$MOzv=}dqdS7IG8GBUBhQqL*3mHgdGxKh+fCB z$+X-U4$iU)`L8^SV{V;&=ho`o8_zzd5AXW^xG$4)FyVU0ZQO*7#{e}QQ~ao@%2>I+ zR}XYtAv$Bvx1LbJhVzKm$7U8>AjJ)9c}U!6!Az&Cwo;N4n+Twc5=nytU(|ad4lzr{ zS8#&cBvQs_IsQ_wReRzD@vw3H4su}M!EU7G6xBQos4R-Q zEr^h2mqf3o;dGj;DQniH&hw!@S*hAz_}oheMi-UWrEqBA;j?1SEHIRbQeH*eZ1{>1 z1a;&-`Uf&Xl0NjR$R=O1PI6`*ro@rJ&=)m!@|3?iw;V|`&6J<(rX=+@p}g~AJw?U? z4ACHSp&jd&^n|mkEkJLnpr?di)ShWED4}D5k zZn}oAm_i&3QVVs$|3WE%wE@VTmv9+-2+>2RE<4ItU>JhS*xBEcDm@R12Wa%T(s+R9J*+CdW+$!lwGZHf^mI)eFx{9DJR%{=Zt$&S+o&1b@}Cd`f|BsT11~BZUpd&tJBL{IU=t+bk-Y!ol|DeK(r`-2h)osP3J##R+3rPH)=JO})CN7B zT2W%a;|nB|DW^FDuCye?sHP#eSr&Hc5{E7Z+C#EHDo*hBrQFk<2XI6g8tKi8=iLmV zVTk~;AXWMtL|8yjZO9bV-FGnnsGjGp7W(X2d%=$#a3l=iC>LPaA~5mR$@ZiP#CmT7 zcH~HKO(2jb=6KUS>n%utv%ZYrmsd54DR&Io| z_`Urnwg=Fg3pBUHe-pF1xiX@yMhJRo3~j+taA_r=a#_#|Tmp>R-ESV^^hM59P$Ww0 zca}0jCUF4ig&d~-3kF<;me@>~u*qHWpj>u!I`o%Z2frL+^?c2&5WgUDn}J;!dt@G# zN&14pD+}>D)nhyuUfcDoLf7lwO;xD>xzBu4dUTMH19Y^i%zx;l%n+Arz*m6%d2Sw9 zl{(%PDwo`RdIb^SqV&OXaByV8;w%9*IxW=)=@%ld!K9yW1pD`1yxa0m17QQOC|Pc4 zfD5l<4b&&L_o z(cjZ5xmi-BmBq~!TJ@Q;nnSBXnA7-N+{oD?QVYl0@7Fp+0hcEO+{RwU83UY0#$uc0 zi2{|^FcX~p{E_3HN|~+vM~1z`%ra=5NFKe_gzC`Q}yrS0OEeLSZ)UG-PZQ`7twzubJn$A;yV<=kwR zcu{3FTRzHq9<{nLsY*~gEFXDxqMF;wf-3ZxRTHG_FOZoZTF`85e)&4BL5l@_4iqb*g= zG*-ZPMtB>%P3?P^pjL~RnpM$Ift_f6aaIUww1%A1&@%ZVn1)^%tbiXYJ{4FcjGety{GxPW(h^stowtRt<*3D{+a?|!20P~dhsc?XJgi=P-Yn!)Ei4vn-( zTw)(e?Fnpvr6gq4aV9m;(9|dHwU55`DnL=SG)Fa%9z-3+mYn#HQ_`QgY1x&=ePF{5 z_x<&rCi|R`l*8$ZW`TvBvxn`_cZ=rkAdb;T1~^YPLVoQG2$i|i#dFObFUg3%cZx(P zy0)4_$u=ddyUC$xx&x%~mU~;hD0F_|KsVwsph%YHkm<6iY5)s(OFjoomz3K;31H2u z5MZ%dPNCG}h{9)sn;YrZ!Pp%4PTmc=lSyJ~vb4ABqh1OIaApDW?EZRpD-g6<;h$QF z^t8~71Rd0e{h;Cja%xXJyMqhtM4TILN)D&RX844QQmzze412Ed_S+8!gL`4;^+TFt zXq-Q`1wP2oPn3vH$7>)VM+Xj)soC zz9|{Xoq&Mho&-=MGM$;?)R0G82k$)b|Dt>2zZKKELTlAVz*CyIQ0XwReD^tJO|Yo~ z5l7UBRJ=f(3c#VM1pqp2Qb>Un75L@~7bt%*U{X;)3R~ea%kefL&?n+r4Z-to zqP2Sxl7h;RO_~-} z1z|o%8J~_%D*g_Ak#V_sjOP8`e5uYvXqlYaF8G z{q6*#1{Z>H53&OOS ztrf7DQ(n2aU2mJ}+KS)G5H~bNv?spWp^U#l$myc?BVx0J?tM8Z;X3{}0X*GO1`WQ| z(u>V!4cwxUE1@J z?S;QX<;;)y#M{%bGNF_;(kZ)MaPZ9Ki~s)Z=b>z`VQ)ofL1C>%n(i_|TH`|28zACV z(CTIryny~D_>}G3&x%X0!z8a4&K$8h*S&jy^V9(1Hq~Qi}#YnSV z4%n*GDKbJRhXW>NCo4HYFhIyM&T}i8M_bin6_T~e$47J)(0-8pQG(f2ModhsX9IRz z%q}YGo3IrTTXpuw8rT;J-b)m~9r!a;Y?{$|<{OU$^j+j&*1>cI5R$VZPWT`7blMW= zNp#%31g&UE6MJ2uK-CK6C;>QI6jCsNMjK9~s0;km(p;GGWQP!%oa(#yg!c7;6Bo`y zS4?`YNl{im*p_4Al?o~>e&lX<{wXK}m;6WNJ*CKOWX`h{Vx_(E0Mg5wMj{69nZ5G> zUP2VVDhEMdwHM<-(H6b@-IbMyUPQ-ZquT?w2D<&QOD z|83x{8DDm7`I~|Fh5B)@>Hf~8J>tr7E7NWw`gBfW-KDGhZ#)^)mF?%YPOZD7HMak8 z*;5TAIal@Z{D(Jl&&(nIUB}l_>Q8(dWwdOYs5OKaihm|?>fg$i#dsC+V|24ve3L4j(j4_p)%=aZ?l)9zj zjqCk+97y%YE$HV^EuP!hH12|d(Dan5vq5g;YArb@Xr`T0&}k)h)kjf1Dh<%y1Qv|l%E zB2vuHF1*KB$_#0lQ;^b zZXTXKC(vfCc$i>kUgfptR?)~oS}SNYJ34a#&d>JgG2KgUk50;=sL{x?@|4i|H$4jh z#~D*5}@mut(FlwT;VlepQAJFa#x|8cNTeV zltdGzy;66^bu~jWQZ=ubrktq{ zDG-8_ArhoDq&1Bbc4!J2!FwQz*;8ueDAX}n35}b}Nl4nx#r^=77cioiy2uFv4+5Cv zK|IHREp&+RN|OjEzgYdG%n0fO3;YtU7K0d`!EWbdQfnlDTdsp1CZtpB(ZBcuKp#Y* z`p4VvB>dLOMC^K1p|o`lDMrSbV0eNB8K4in3JA(s!IGe|vRe+S6J!$+E=HkRPE?*rsV0i@(c1+_ap#v~nAW^lKB~unj;9u%v zLM_lI-0o~ADGI%-r6(xz;64U0z39N(%L0i6>P;x`xlVVnKY2V_y|af9stNt;9EgTF zJw2^Mg!xsDq0lOM48jq?vBe1mV{QlNK;+ulcx-21hdM+Z%0gbB1jFzC$P?*Ohu&5I zUQrdIjnMtKRY}UoP%WN^l6?#SD1z}Z$`LFu#PEtV{6+vsSva?KkR%bGgDcds`~G$a z6wfZ`5};R$(oqSXnO5X2U>HoQq(|P+b;{U&IJFDI)y+GvN5sqzRtwv`Mb0015d`Hc z2*tN2l(m$}b;b#%+Jv*bcHdFj$!RCOlFEiaU~5-XbV1%V2qH=n8T!CA5pnNtwg@6( zFUp!g=nNnxAFP!7G#i-a>i_Aq(FBwT7K~f|f4WDJ3?ey8A2HsEo2!opZlvlz3=t*o^ze|J=ZyZoc`=GuitvU z&vQSY`~IGT{@euwhv3bnw2&f+!osNnlm%7rkB`CD#YXf@h2c+y*d?~2$0GRIFrGq# znImW>{`fcy#Ek4t8AALh+LUjyN5qs#>o{2m6T}Y++EJI2Q-Am$0`XEhI;LXI5EWlK z)tQTmVi0eFLf!{a_-1mc6Q0DtxDS!@{(*LShie4mXR1#gB0Gwsnv-LdG|8709mT4^ zCjacWl6THP^EbG|2$-F1z3Y)|j+`wwI5P^_nT|^`|a8A)kKagu0!wV4L-kqgG zJet5XZvbO2$eS3DtI0YQ`}>Jl75Zf#EFXAA2C09#JZza)uW;v&m z$*{z>3JwkhAi9^}`dq5}Io6#~_~!zl_*wRHv#nNdWtF03R<`U?LjxLjkDwp_boT2< z>#B>#T|GamJTGmzMWenPhvy7-0x@CP?fW)u3T07MB1K}2BK+}&*GHMOv!D8lKCvOQ z4k}E+Z^E1gJ1k~bWknap;h1ST@Jnm3N8H|JJF%%-h{BJmudyLF4~wC&!cpm)dPLJ5 z*rz46I-gZ|AeyGZTuGg#&*EF4BAb&288@06E2S&&Y*z=~t}_ zLslM+*jgx7_(3lyGIZ64g&{4!^wN*^C9}-jj9AE?`)5@sikEr@NC4mq@)-rHb}&AaVnwnh)%0(8a-0$Tm~zoM|Hv#FMOzz0*{ zftd2>j&H216w@&Kz>RG={C`Z_RXL=1>jHEX_WXE7mj^|MBdyqz6Vay{`uV7YBI&F| zOJ}KS?1tct7NXpGj`ZKTT_w`u3&KWoygy*3V!7ahX_j?aOVv)7RZLg^r)IOiDD+dy z_oumDGEzk50VBeW%)qK-(Z}TsL}e26DU9Vd&kF4e(O#!DS(WtLuuB7fPqX5Etzm( z$R8~e9VQ0VZBtY$8&N=t^S_i8;Coxo9p)5putI6UHx3qDph)b|h&(wyF9|Qdq5(Rj!T9mdn}aVlq|x_z_AFp4vjyf0)D^q~7kw zR!a}3nxQYh(H5oPNho8x>d_E96$V_mhCkboT5cJ?Gj1olw)q20^9o&=Q(xsNX>n_L zN%`FoO$)oW^~)K#rEL1U7<`yMx|~*=6%MF_VX3fR=n`=hNr!(*Id%Q`Wy97!Uy9mQ zu|ND3_SWnr46n(F-{C5}28FE-H{ZWTXzmJh^Ff57M)8zD%k-n_l(s_@pCQj*?Apg*^xJ`WWkM$?9(%hDVGs))8xTRE-;Ibug*+g&VCXE$ zbEaO_6n-AJ8HT@6XjsMsBacE4)h`+iUJ4puZ!TINJs?S&)Ud>mt&HjDkQlJ^xLa0R~~YA^t;A{l`rX9N05??TZ*BA_mEN z&7v)c&-N%E7(o9nZ>RppsfGyZ#%Q?p+IoIN$|U~gU?aoMeH|0G%u3tAJ@w>b;pYlcCiPF*0(MNp7A*}OK4!-0!Ml%q%*(2q7 zyK!OBS#?=6uS$uG5dB~=tHzao*WtJxtIT|S&6}CrB1fO(JY-~+oR0>PKWY;f?%WBqE-u58-m~6w- z01;2ygq?NVs~@uyeLiM>6f$=E)J%)|Fj3>b?cfZe#EFR^%BLh4>EiTm&OJ za%}ORrjK87Mv>-{klFzae=&ZPl+tugg4$9HcqiCTnpTWk1XSN|{$Y3Aq>FM}q05%Y zHmNH|16Kc?I~q@E0{^WAgAyHGr(F1Z1p9d&KO1p5|Lb%Fe@J#@9N;~VDSg@BXiC;c z_)gTCs&8|5V)}Hnlw>~{|5HC=-kqi=5UlfG>@}we!0>UBd=`Lec3B@ zLCVeJshC`JJyvgW(p!z`I<$32#rWwbmrW0c=BYReE)t`rMd3gvdspKy4T%a?gG47O zw%)x@!~^D*FRO;@_CRg2;?c4vS7;25R_YgA&SZ{N-HnxYU42kM-6tB*?I%*x^pJ+N z0xI9E)|jb!Eh~sx=+se`?>Mmr9Ri6Ls*K;IkG0Y7nA|S&)OT*sKGc);x^t8iFfAIO z-&^EwH}(04_+gK7|8PmF`1^}qWpv?ZZ(^sUi57!D^5_1uxU_%!De|>kw*UV||KyDR zM`vho+ZfzdK`;(f6?f9db6(kHpuXSq0Jb-@!J zhCnX3cyYMx#EZ*|iqwbd#Yy2tSX2SXBS}0$~ZH2hFIDG#9%$0acRa$oUE0qBM&HgVWw##N1|En955S1PqyNb0T=7JI- z#vP}_U9#=(<2V&tZYIVXr4u%^N@e%?<=+~z4tJ^S zC=V!hpI~Pnv-G9gskkXFZ?`haiA?EQSM`IustF_Zqle#~h@rd1S@=KodyQ?AoY{=n zhfJN09-qXC*G?nqA1%uAT;kVv#MPgDc5Wky~OwG#xPy}uO4-B160?B?Guz55w zR7ZMqX>Mz%!et&@4n{up8MX4 z;yp@9ZLv7VEsxfJq_E^HMST;NYDeNj|FRuuvQ|V4o(wwqBYmb(GbDWH&c8MP4sR3r zWUbTpTk6e7Kjwg}1+0*QFh6__wD0PI?D6f`l^FNZBzR$j9nX-*No#Ne9!Z-juB>G? z@s&kkQaciwhC?jO>fJ7^O33OdReZOx`amENMu}FMQSWehDqs=Nz|A%LH?H_;N<_Op zb4Ho=0|- z0qb{FAO`$`I}fFs*PEMJ-yb(6M`{&JMTO$${mOMQ4xvzy^^moda%@;Oq{wlHP%(Ps zVl`~EU!|x~lxr?9)_UQW3KrY^%OP746nN{tlTfjB>Rr4~Z1Co9p^QX7*n6+~`}y<5 zp_)HRv|`pOl)@+xjgx|0U&58JLQG-l+%uS$U0Jj{OOu_wzOxQopcbpd z_Vc8et)zQ9gW)3yXF9@XXTQ4-%S(8-J72!q+$Gp4D4(C+g3X4{u(>a%;{9jXYYzV0 z6^@Ct|6`3w147kpsuOSCQg^SO)xc{jW`{o=cjct9is#-Y^Sjh)6_v0E{`1>V5FWjoXwT(2#IIN8vqUjC?#$h;oe8F^ ziGhYhokA*+1I9wH#|C}M-A0lZiMx&HX;yA*32qJgPj?M-03ZPi7ccJG+N{4QGZhB> zql`D`YYJ~`<`K@P55n1Ku>z3(0ER$WYPA8%Q7cg_xkr03{z`Kvh~1m8wCM6n)93-! z@kIB|sUF>e=Yk}Nw$-wH-LOaaj`}pVD{0%^vxUagexEz9le$(SU!@+q76)W<8Pp!s zdQJaeU*!hW<#@}_i|yA8O{34tm?9imJre|}#U|QbTDt=-mo@tm2i-0@J z;^d13h|=<7u=po;eA+kkfY7KUMikbA?AYpS!LNBgFa5?*lurd5wg-|uC4XSaZ61F! z4yp7N78BYLN)+}9#A3ynXE3l(e>N>0!o|axM*&2%&Ag`M?S-oa4x#+Fz2peH)Gq@y z^5_Z)=75W)cyi?6o`lGl*bz2X@(>MVQ;_9*s__A&UYHPSqudvRmyNUIVi%?hF)#`h zNm9<|XwX~G+iw)xmhnp3}ekL9|qjdxc%Mf!Bt~heX1dFyo~umM-s{ z9IAHhzA0+9w25|t#9b6(ew)ez#iEBwcFx3i+^*mzkcBg)q;IKP$1?66&HLrqI_z~F zX-P_xjv5iiV4zrhjxDg!^)&HOG3-d0<&pj_X#q=S;mqyPQbUo`PTSPS?i} ze_N0}C@;}Qa3pj4tj);85{HIvtZ-aN*FAjA{fqY9t)s*j)s@ic1_FB@JO@e zxl@-L_;4z?>2gAD6(-2xwZQw21wnX7{n-dJhi<)pI&#Y%AZCJfMgQ3ZE#`GB4rev?<*1etb z4I<48mJtOtKGnScW$r{~wcHCZ&Nmh5-7ytduS)u9j64_?W9?WwXCVbI@h$|m^p1@~ zMh{#1mikSM<_V`WoQ_XWQQJJ{ zyz>EdLH(rA@%qfk5_`9b_smeipa7Vb(~}YV40m+ zOqP1iNwvjWmKvNk9_i(I@}i<=jF5x22RfV zD3r01?jAV7d6&qiHH%c+jdc#}UR%9{8#dv_36-6V$g_pnpf+{&RX@Lw_8c4+ra)?>-N8)Do_)Q zkdQdQ@YGM-lPq>L*1y(*0mM_oCsRYW-}$b4phjZF5!KowRvEi#W5cWwo~H<=#Tz53 zz;xI4@eh@Q5hJ`KBnYZ%SDLmYXWEv@>h}SPYglrnmxq^8L}_Z+uBEtgk5q)5=Z}kG zW_I;%9=T6t`*lLS4VCE?+Cbq0?~ug78r#R>`z6ep!*}kQ%)Hl%-qrlyGuhW4EYkKhtn5lgdlD&X zIhtDL+gBU@xWPQNS%>-SZTD_v?oFVA7P+{HX#R7WlOyNKjwDacg?D>FW16Uc-`it2 zfdas3-^h&?7*1WYVe~;+<4VdVKqhO=NFPPf()|*y`_&c&AM@WA5BEzbE1MBM5k+Y# zG6m4GEJ1%=OIsbjjX*ym1*CATmluE{2Xq1?$hwvA2jo_q(#P-YAJxMaU1A-9hDiSQ zDBwJ`E?j^W)~-NI{KUdZY{;M&HgLB=XAJPYcyR_fa!OT@nIaC|P^m7~wQAV9ICOt- z!f*~Q$vFf;F>+V{Q9MKSr~ID3c(E0`g;ug%L(NpP9Nor!fBPqzdnNqL;KwA1Dn-oM zWJtnssMcdXx_#*Kq=S>{s)?dqNIGJo15)U)&H>DA1ZdTE!Yac)qUJRUKrwd$C0?39 zg~X_0SvQBGWlE@x^FgpV6p772b68>}^aOA?}g`i2ZT5qG{PrjZ#p~`^ek> z{+6pP)#k^Qc#@_E3aIsZ6LwpptCEGqvQqxzJP~!b0`xnrID-QL`WdJ=b~KsAPLCva zJ+TOeFjE&Ol*kETp)0n%$aRFx>1HXpl%RzRvA&H7JW?03so~rtpHbXNunO~n-AJlvP>E(xXOHnk+b6bS&cPzYwa1xI%fvDL)y zP7+D+;Gs0Fe$@_$R{1U32jV8`!|y?&(+#M^aB7nzW0n$CO29tDpqR+hA7*B8U#pfh z5~@aeExFMy8i_TMx+DO7rXyj~zd7JJqiJtEBhqWab?W9i#G3Ud>gYQUu(Rbsro)a2q>htbsnmn0%J9U8=HZCfp8v6Hq&s)i-o#-7VRWb4JkdI} z0;*gS{VJ>{72WK*j@<3lxyc4$iiK*TWqe}PX3?FB>k%szQ;&m}7|f9zkXvI71?Yik)2REjt(5}OxS%jj9KYERj;4r;c? zGVFl-k*~t%>4i;o%!mgG*77jT9SfnS2|6-yiPXF7B|WZF$PJg2mz+hoQY-$695r>t z(T4s^GAO83J`BUEsR>R+kjeXl46Kz_zpr-gM9|H;U8QNY+38+`F%lnfflE~p%ng?2 zMXd6@b{UK!4FpX{-(|%QIOiZ0IcA;D^bBBAN}PPWmu-SW7Se?n+(2Y|cc@W=tj>Lg zS>Y9i!jh=55Os1Bn-#6xckzUk*SOPd*Z%z%HR-RCdP*YI>na7y2Kef(k*xil`7G&e z1Mq!qyo75C=B`6#-LbQdc8fgMk`-%dBi@n(xCHMTCPl}rxZ{o%kMY2eR{o=Ox#PHY zFbBY)+yBIyr)`qZ!M=cb)_+Ta68CGnE3gC)+O1?nm%*7IO!!%n`iB07X&?tX;DdE>-4 z%OXwuC(dR|)%=P(J9*9MB1wvSK~*UUSK72Y)<$|_X>a2k8l#>}<8v2!iyPaXx2t>7 zqpP!5S+)~|3xt;Bwr-44ha^0;?nX4&#ATZ9XQht{jg3|~kA^V>1X61@U>q=1^-zz* zFG4P@^nQ4cnL!iySbHOUdKPuu1DpHw;JX{*ji?6_gmXMm4pgqlZTShBLRDU?^4WNB-4XWqjWYdC(R+*@Y)Xw7ZVN4r>r_mb5s5 zm9#m&Wz_#r-%mva45YG#jD`e zwAw>{OO)mH2kFE8W zB^OYjdbr57{xBBZFY&Q0$>J3) zDG3eNIQ-xd*E5QkE#-aj?=b7v!ZT`DFa?>gZ8-8NO?=ktTQ+6sao{pSS>oP z&h=?5(Fi)q&R47%Fx`3glq4#*d{JJz($lTY*k`5du3D~vNPR3{uAXDNG^gXVs+_!h zLmTJV=;(NY$NbxBzaxojyhP&4;v|A7lsH2N?LEH-q@wTNzgMrQGHs=H8+*f-XIX{z z-JMGGk>6Uy8`t=s;&fj&qev24?R|u)@NlVe8?-Lc^S~D@w#(4SEeur{cYeIX;FGOW z5JGy1cfEP5nQvIOHjpY+_AMQ!_qOZOnnSAyBe~eN?ej>ty`8n#uRFCgK23Q$2T*;_ z8pr;)ev2nTp?u@UtM+zs2OK+;^6bWLr|XsE8Io*%dhk6(IbJXi-NPoQs2JwCvA7YQ zgic@UG4zS2-@u4(7W5c!&9Z4`gvo6!cc`Q~OtmcbnI_h=77aYatj-UzoHz9RoR98l zIn)=Sz*Zt{ID0v*&(2DuMy|o&Drc8*q&|bwY**+4z=sZ0Re}}*KR&Do#|;avri5mAFte+ z=h75AexB{dV5w86-x2anR`k!;lxdC)IuXRE?=Q$B$H$GTHuCf3Bh8h5ygJX9s9WJ) zFzmUR5Mh59lTmn)<50xwH&jC1+p0axIXaqmmo7!ss%knpiIi4;T|tkG&Zb5haNkN%~?54Ry zNAOx<>-Kin#J*fc`5Q60+(n5;^p!Y#ATi3~jn-*Mc^tj#-{t(V#9?Z+CG&Bz7ERa4 zeRwI8N4AH3_VA>OSxJihVXOH5p6y&s$(18}Z?DQIp8TcI!(-M)yY$_qBTb3Zr0D`h zu;pMWk7WP5>f#*O90`kcSA(KXi?hDf{rvFR4ZY&Fu$*}IK@}ZVzF^VI#k-rc6R>G` zw?5x~b8!)tcpXb_Io)heF8Rgl#PSQfQDQ!oim|-SmhXw5=T_~O>Nzy?|J>iS9mYY&b@zjw-!8T4o-XHI@3c*o~}H29>ZlC z=*F*J>S*q^+%D5hPy<|GGOu6mWlWs?~WOWMwm~@o1rfZN-;(`tgOGfH^M}(FQ$^KoIZWJe4$@EO`66R=ae;7 z;pBBdTnfWHkMhmx%GTvm(a;E+DjN1ySV`!|^X^r_=yV*%(_vvxHAQm`t;xK(XpAv! ziu$D_gaprt0heK~gzb$b4~Q2NO6b14)M!tUl}>dNH;>i1KWVtx7u4?8yEt_R$Ek>X&xLuC5LHcq~pf&zAi8d8xu2MpE>_5r;|e z+FIRU{Q?0ep||(mf?bS|OOE!CRng#Nz^hkFaiU&WA)BrYO%Zs?GPk`it)fe5hF&XO z35{%JO$)9wCH6ng-i>O#m$k(3djMPJVw16x;j=aGF*tea*)ccRw5AxIM01ku^3D0O z1x4(KL~jcNMtXWTX00rHR zwd9vVD5IOKD_tRjvpHpKn)RW_vh1_yzgMQV>6E5*$$7oFvdC&BT|N#POATJzc?=gD2*O>v1nhc?9hA@Y^I zebxn4_weEkv$Gw`TK!o%1sTI=(xdqqpSl?Cn)9gQqvZVf^_}l0ox9i7oxx_wYDjb8 z5V3+y)lOmbL35{juZW+QdQ$ZZT)?OH^}srwDwym?5&d|U zoS|at>Tmw*_z`&`Ns%-ir@NUVXea%6OehU$;C%5IS;uYt{)pKITueJLD`=M6kTV+eZ7-r`QinUt+_906wIWb^79LQ z_IA^1h9VJ zFKFMfJ^fq#v1X-L&)(KTRb$s(!}wnzg|IchevS!uwoHw;)h4IQKkq;qHy380`(4gl zHM6n(Q8pE3BSRxSWW$i?+cKN3-_>D;Gv=CSyDg>@Jr@H6&Q<@M7Ck>KjPs+yf7TbG z=|Bz66zH|Ol%;My&YRKe@w8|@z}np9mDDWnDfA%UL7DiylA5E~(+1N|YL3mB-DXGA z9(;eE_P%a8Z28ElFil;C&b;oHc##SXW}1k6Sb1={cxJ;|WW9YOtXuRq>CXZRMXQYD zt@e3N*6vCS!wuBQdNV(mH?Q|^UUG`q%$~gUSn|Q)OybP0RIh$-G;Ok^1g^Kb;n+t{ zu@53VXd5inEef+#frAHTv0(V1zfx28|*MDZAAw0FOLBQ3*?l+I4ZfUZRNQ zlNEkrj=VX@=F%cWsOasTDY3nqwc?Dd$=#>N?~@zmcXFL!l{SPB?Na<%Tt}h$SnreY zTWJMz%WVd~R<68S_4lb<_H0{f#rj|!ipZ{fBzHO3dZbL!%($z>8%Z<9Xp&Mb)}CKW zPvX^a0*sRFq9>l{FI1bc9uOH~uUvoFCVG(*L#$8JcBp?Cuvx^$@Y;jGhzzvK?j~)` z+LF$9$t|T%*pS(iPq2G_L+?EmmRG1#w`wmg476~vHb$^=?Od4_MA3%ac|wLd?_0Rl zx!SuaIdG9$k%)cgbB5&e4d=Af1O5>w(Ht3FNjw+KyR)MCqA(-36pj^GsMqnlUr8@$p*!A z@}jlUGs$XGCEu89-p8L*_ERK1lmCT7sfTRfiBnDF+nr>qj|J`}3mj;R-cJvP+_-H! zJk2z{vpKWBJDSIukj@pPNqk&w7R=Sk?DoBOCOa>uR$pPj$(vQPrySk(F*RH#l=i)& z;cT!gr7>R2i}oFT8&>QIPfDC(_dI=@;s&Rw_BQ*DKg+N^)xN#WD$R zjE6F`YVpi3Cxj-OH6Mf(SbFpZE1BjdUe{sLvp;FpyX^(}rmbo#75=`;S_Sc9X}nhL zOZi-F{J2U`c%VZLkKwXs54v&9^R8fi{Lrgq>;fkBl^cI*vzBAA;4sEUs8K_!5|$+G z=(Dm*ZYcjVf{Kx3MOyEqNK_Jp-GsxLH8~{%wI!{!zZ>J)6rkYA{b1JqE&&P|_flv4 zOkb5x)o`98|4k~)b;C-}1Wx0Is4Gd8JFEQ~lEye&)k?`5XPMM$I`YlcTcO0=j))w3 z(0wD6L5cIb5^mEeij9g)ap@D(V<*VJqRJWV&eq7_T!Wy+u>Zh@lS@z{6kWmS`LP_Io@I7nL_B*LWPa+H|OD@Q#Ifh3B zDU&m6 ztuQvfc}Wq`$5~cKod#2YW`UzY0wn`Z|9l=#0+RtyoGk9v3K0 zr3A4_L@1Qe0V-Z4A-7JljgxWC2S4IR3;4XAIG~b9ks3du?Mka-x%<;|=g*r`KSZH+ zrIFGf{zE2y>7Sg^>3{z4Pjbnh#D&=QLCK&sQdON{*6<%v10KrvXxde48WDGmhA^h9 zckYA@3LZG%{Pv+u`eEPH= zskDB@pS?=EeO)4m1JLJoZneMx!hl$Ai?6r0AzwqG{)XKmJSj@z8Y5#P0M|agx81V^B0Q0p4#q9;qm#r&(s^9rDniQeOp?Qw{inQxI{w1dHY z-TQ)#L)QxgQ{0>4++i{zKLlJPN*op0_(N18@M}q2#YyC?pimw<#)h`Jr+* z2Za1#QnG;*AXg*|tdsq0c9DFUGrsA<(mDMWK!D>*tzvxi^LU+%x>RekJa8Suu zgCd0%D*lK>@6Gyh2v{$n1fw6%^PStLOvPm*4ZTZ-RrPh~^%d&&*2l=@l$9eO7~MN| z?#6WdWNRWjgoQ=j+W^DITgCRm0;z;zdLGpVh6CHAkFam@ZGP<*%R8GZp~;djVrEvV zmuI>Zkh)fWY}k9tYUyHK%lcw8o70QK9t$D@-rL0k5E`y5+166IL`|5T-BL@HuLoZ0=Ub`5 za}@I@kacC7W9YNfwXniowN0m)sTE%8G#hhzS;S*Cig`Zy#ASX}07`V^!oPjZ9Snfh zaRW*~DSQp^O*Bf6$a&a#l2JJ>Si+CE9-UheVG_PVC;hSxh#Z@U?tDyLrmcK?bjEsaGAC&6E9(T^)i#u zJZ|`QeeJzj`(r?a0qM1-J0(NoWrWSw)g0~My#E#DHk1A#1roz$X(NxYq^oqA7k)29 z-cG@CE@Ev>A;=g}T=bo_HG6ZBhf@>F^RW_AQ?mz_asXIFQ|!xy-p}7pd{49L7IK`X zm6MY*5oML=xi5M_KVh|I2$GR{sW)(@?h0)MVIm^=OM;}B$8ldLJ`>-RlH#`?_s1EH zK|G%{H%_4wX9NPBHcI`2a&*YZ%d;%RR9F_wbkw-uE`L|8!=!+c<%qC`-G6iJ`%&nq z1+3FK%8`Tb4*j2I<7s0rhuvbZ}Hbdo@EN!k0e9^EG;IdKsl3U7~m7B1mQYBxIsTJEkVAA*) z%xyEI2OOKxkVDyES`F`&D-wW1uR<<+3-QvU$0~a)R7LbHOHT2(tUZhZdpLyDt%^h~ zYS{gzyP}TM!7e2(LvA1BwiX-NI|`^@RU(vOJsO8eHU8>*AS5ho+^Y&!?vT?|Va;hyBkc`Sa^Rac;jq6O7AG2ax_`y84^I%HS}717oX&Iis@&X{r>{^6IiJ{|G>pkv zIMQ{)u_hOnEpjCXVN820KY2^$a|7%0&&*u;86UTgXkia?c0V+*a&Pw@I>&e7%& z@JtMLhUI|>jhpNJEUA-k_TZpSHfM!pA7=^h6Xg>4V!N^NiAci;*s+Znnwd@ZK-szX zeR|+$NS)w1N`mXjP0YIY`Bn_KIbDywOZ?n$)o|9Bp4-tBxAmFK+$YxPk1N*)BY$1IWN8w+&j8VYk=nJK5e@R2aY#5nJG^aEIj?zxk%SUaj z_^_}F3Su33)98Qba1JI(5S6TtzDflGQ!QJEhpUQsa%XET5+sPIe4xkM!?45=WUy#- ztt&T7((k-~ULVA!?)ON)wq)_-N1NeF1{5hnr+epYZk6@H-5vuErHs3|*7BJzNH3XC zbC@Zi6n3{anoHp|+E`FcbKbbC?-V{@S4%ayR2m4msXl;$Q7ydlMaMvi1HvQPw~DMi z6=JEA`o|-E(2Q?Q5J3x)e=+Ma&7Q0pQ)1AlpGwZO}l$hK&%(G?ode#b#mD(5tQ3)~h7ul?(nbR76x-YSGa%^X9 zn2(421_C6R9`uAbkPZ}JtGvB|@$}v(#uxTCac1FwIg<~+>-FiEP%F@ZQ5MuJ>~?l` zm}0v}8^e3Mk(0ZBT!l@BPf!VVE>s`P6C)^bwBO8wXU=RUNo3B7!Ns*>av_<;9HG!r zGU$KiGSgWv{909~LVvg;V@F3m+XwyIbFzuD%D8;7fn`zzjX84oasD~q1z{{Vt%kw5 z8~5&0hYi>_vZiHtUtg$LOGxLj19)iKQ0eQi4<-8aU`ps+<_C~;S|xs0NT_3Geo8G< zi&cFyGm#`EwHA9NdLb{ol1#6#u&2;$%gIV6N3#as#yqPNlSNhYETr3gc@Ka_teVMi zxrMGLe!S%!eJfVkus;zkmrq=ywdERbC^XRFJQb;DA7CC^1#ezsqm6m7^aT3Ys9}(y6+JS2+rqW3zs~syyWR89PZ5eu`Xv_j#y;D^3wGPoEyZmhs0&s5w##u$ML< zPZ?*Jp*dWDz)oCR!lvme1Qop5z@#cDP1)$+JrGjfOFxJBDNycQ=2(`}h;`A;>G$4^ z?S*p)d^W~o3l`fX$?E|hDVaJrzrM)RkbizH`yKW5>=j{PT=J~?dEM53y=dOzGHK#C zP+Vx2Ct!4I+KvCaog3xs+wMx@jQgG&h_9*XrPtDkZnTi&O3#Ej_s>Bq|`1mlb0 z?KeB-SdkVa0KjX2^xst2nWL`@*~f%hjZh#owka<=Vq%VzQb9U>A+3)6HBhlO#IiEe z#YNRp@%!8H#r3fu1+8{6yyIfC!lwj$_L1Y8C?bK-#xdPBB7p=^$}VPZcfYO~`L`L6 zAWqj8zAon-0Ac&<+x#KQWy;pKK1=AGw=f_K`KmI$L zA)E%_*mARe{PA}C)mzy|j-H3Q1Ad1{(#sqjSLl}IlAL?nV6!arzN*f*=xR8@cZy%% zgO$n~`5M3pU+UX}fhmEtAICV^3@Zmt5VaRt>2f(ra~OL5c{YbFXcWpesKB0h+zz1i zc!CRZZShGuaq{;!AN`cgHK<5|$YpW^2_*6mY9QJ(Nlf+JysQw;JP|+H6#ZxtN#u~_ z=7N+*zm0=9kOyI$5}~44nVIEvimX{*oo83>;Y5NjB%oJkuB+0H3x7~aQoSgNkpyF$H!+cDy?WMgMKjvEF)Xn;iCP*%P{&b}4HpZ!k z-c9c`J#_$C#QdUczKX#B^;@GLg?IYY0gKILGQ$piScWAZUVdePKLd|q`IX~5^i&3} z#(A;#tmtkW>!ytMX5hl$>$03ooJy&b8$FbV7|@F%McK1gf4fVrpGtaBU+J~g^z06Z z$yJVC70!69gSSC{2KuZEDW-$-Va-vfv+rdrpJmZwD_HIEJ!&5Ub*{`@i7VN^+2PP?0Hp#Sm=)58e-R_Z;7H}&yCMK?h7U?(TN$jw2{ z428^uQU`nebJ9yOD;x7Kka~#$RXWUTGc>0Z1o`|Tk40TeypS=di9^c{R_d{bimr{T z)HgmEWYc!(rRUSKRd_qVgd4UD3c=S(mufk09UkkTct3tGL^ddc$#BtP=J|D|3s>zG zq>BvOM4cq_!&qrCY**-a+9=<)o_?QdktL%OCSQ_nEp}zGxzH^A($rgbJ0@I=ShHzI z2zC0o*pN!kDuoCzr)-j8%Et;O74IaxV;#~ zs6t&I&Jx*2J$wX(tqm6C;I|unYKThRXn%30Hi%}epJB%;Epcs-{i2b1X^u({y1f-G z%Hvb{>}Dys;|8o&o~_z<8*SU4l-|0;EpwHURZJet{qWUFa=k?Owff0(o6@SF-XQ`B zw>hRJc6U5fr2({;38*uamX?r6$z;B^qb6@d;tuMr(cbP3z_MTdtbZ~&f6w}}NvK@z zyP|vfL!9gUXQj)GEh0IL^QT%WBhegRoMyF_RPXsEiib5N_?Rz&3{K~@xqP$g@k05M zatV+(2*!&p^&#qj=U{(9Mip{J@_8Lp0VdQbLDV9fagCp^4$w~|V^-q2@fFkWUX>qq z>|RO!ETN|t=l0R~2k}vM`L^#Vu75@+kN-;a+5Mx?(}S%PX5CDgMev|$qStENY&(0z zeM7d*iPTVb7T=>rUI)_nL~Kha<$5m3e_B>`%a6@D@G0O^M|92sXO4@(M;4zdx*S&O zp~X_&7#!o2aHA!~gj$V@Xt+E7&1PuDO=V9U3f0Cr8#x)Ujq|R|5B9&lm6BSyGTRdg zfOVafon^7N#KF`Yo1ad=)?|B7Ppf;eeV}Ii$A;;2diML5|I+|1*7i#n@Fma!pyW2+ z9M>|ORbpX+^Y6FD9jO`xvNOG2BE#K=d$0HN5`1u9r`l z&db#gl!N(0iTlSsygR?ffw|JnpptN7p>it+;`?pHD4;HwQ&E~}Jy^QoL}%LWJaw@X z?Q{kr)>q~^N*;?a4bbsBlRBB30k4+3Od%mOS4#5(*hym6a!O}1G@eOaltL$moTIhs z%lpw(Wj`Umu+=KO^tv-$y>@F8)I+Y+Uplw4@msoumgdh-uckJx1Bg`Gm5*ezy3LN^ z&R(=mS51DxXBa^(;_iC9Aj|5{&TDq1o;9MWE}hd5P~R%W@qouBch z(5tQMOPiq*wxkk1vIJbxYmbtH!@asuyAX z)L>PBME=xJq*3sE4fr@pZL*odsS&>FwltY4pQ)9Nb#u9o zlr?eEej`ATM3c2~%W4Te6#rtv+5czW%x4*Uo z7CbdjXjzf)T|MRvgn&8=cd!3#pkv+w5g{<0x4E`pBj25k0|rEqrxn51LmeiGAS^{7 z$R`9?h#9Cd5ZF0RZcDe1I%B`c7k9jq_*_^G!b~_Q;g5bk^#PB7Vt^}%+RYw1FGWEO zcLTztsg#?;``5Gc+oHMjYgi+7g~fs}oxSdnK9@L~Mu2T8Q23g7ZmM>*tt@prf{)`v z%m;K&&Sb^m+d9lupQ@QE1TmqZ%cZNtGUdxRqWj8m{12#) zl|wa?=EwgveIJ|{Ip|31XFd}HMm=rHiE2sLAWGe$cWpd%+kC&MWYt4tZeA=Z%WsIik|2s|b2969 zv-)6=qgN74Kb?#%BT^n+Y@>ITYX1Y!7Y%9 zfrk8Me#9nKA(EGV3acyR`#XuiX87BJmy2`kDG?Iv{|WW}gCIUC?qoB5Ca$sXIDyvu zy$7V;1Qp+n^ zRv>$dH!g@kIsd)`MD0@5*%YF_XyU1E0n(|f1W@N`7ElsMf{?b5R*i>g`!N>yusBop z{p#`L#om(xsN&%1Yse1$Th{phTeivXmfxO|s3qSzj5q+ftq1N!+|Ul0+(r^T*k5EJ zA+WkFj=x1nPbjpVsuzzV(^hx!rgpww%J+Qpjua^SI3a>i#6c;o1(XR3RLY_2>+2dz zi2@F{vH9kYhGIp%O2b%nwRU&6Y~bx4-MWNaBu@a!fs0%wuMtwzeRa;<0G%WX7LjNm zVozM)pzYd@@dp0{f_laq!W&b}aYD$S(Qdte=@DgSz77RZ3Rv%$j$CDKC^rD%rLENy z?2MQcISTb36~Iv=UdRT-uLlVIJjWFB$G%zOB&A9L0Rf90Dq_(Y69}z|U|Xmvl}57g zbscCRFd05|i}y!X8k9L(wY6Ffm1}!%|B=CA3o^}JD#2;!_PhGX1T0YSO132>3V3bi zN8gYMynJ&HtTfT}?i@*>U_T1|A>ZTaE}Yp&p4Vbjr4)Y%+`#o}x7!lwcKOuRKqEH4(JtEY~XDic0E5$h6EIh9wSG`VMK8)rXSQp;-> z$G=vbP%LB1KD8CFp!Z=r@Te!vFB#tiWg74GdlxOodud<3)CkC$iFlEe=z z6^R;s1TNlf{gcar!GbUe35khLm3IZy%)PM&>1y<$K|o+Nf(lWAgCF?tznuCi4=6+Q zxCTsx$?%2+q=Iz0PZnLwHZj(Bfe35f^rX?4t^}&2(Ct$)IrELrpFgWX=tNW|#AFi- zg_T9Cu$smtVa3m=Iuo6f<_El)+mNclsBmC zfP1SNmOUyKS-W=U_!G=&dy%(gE(>f3`xnM?w`IW#w0H{~BAa-E8ERV>C?+KZ>jQr*fj)9QTNx_jSh^tk5X4x#4RvZI>avu-FoB)dKJa8 z?&kyFUZF&&K&aL2D06o=8!0nxJf~jj#fEk8cz^qi(f0bE$pV9?h8)jB9r}CxVc2s|DS;?xlhYGS z;p4x%d5Br0y5#R5Z*$E|SA}koHK*-}_`>#PrB=ER+(T*Q9R82KP(X+B7_xs+eV44- ztgxj{nM@O8DP1y%BO0McF%?-*F~%0sOFlpGcCgGvAzskQ2%OJDfn$#PT5=_r44h8P zUhkuz=+&!&WTnKj*m(kR5nOTS#~=e~O9AQnkMo9eN*%v2Ko~#3dYK&|Rldy=;dAFl zJQxg7sJDT=U)?^AT8C;00UutHrB{MEVUvdcw&Db#(g^m6wnG?UfCAK-16CO3Iq6sD z!lBZQW}d_fjUqm|--?9Kjm{i!CtjZIX>be>vY`-gmOeN~1-SoAVG+=+84@I*@QobLkpFTQj=y-ZxW+V*qxgA zH?GPA3NH{HM84^-2xBsTVGGPySyL>Z3SwDQ0`08;e5tHof)Kt7MSH7_crXo=CCs5w zL@>jhX?d5517)mXZj2ym`kxF->d%LO5D*lk67G#`3*UX(Na$#r6|&`<;siRju*VvP z-Dg?NF)0CqKL{w|zUq&`wDSh85@20qL`>JXYOjG}yU7KZ+(RCkYFX8<_!}&4B&<=Lssp zbfe&bUIK*y#@7$>JtO7fj}OM(LGI&w;)-|??)fF_U{SBlIuL2LpDcOrY}SK_miT#p zDE_W+VGywz!otwutMHCv(!m#e`uurDsC@$0DUencRPfCcUm_ke&x7O`0(SDcg{nO^ zSbd@3q?UueECRn7B#OOAkTM#d=2EP;!5vRVajtgw~sc zCz7H)xa{Z(USLHb2P>aS$nzQtG{ADg5A?_?1jmBP>cVj1+1mXf__Y&@P$B9kcu&I- znU9$4vYB82i*{bhcysJsGHT)L5a%LBf4ouviogh%$Vm~xsOD(JRT!ymDSd#rRS&i6 z4X6={;)LBWhbAGB^Qdc_IeVJ$MM_Cu>rmoxD6^YJ<_RtVTK<=we~T>t7Q?yQ72(oi zt>u??AU2J91`^&U?X5dctUF+ZG9j8T_-nbEVcEU*v98#^!`15&t-f~+y);M1#+rva zKBz?Ad4F3jRX&_^AIhRsVHt<<*%%-!@J9dGpSox+QzKZ9A#rg{l!WbB$8pdxmJQ5L zltRu~b6^16HvFi1MZ3^4TF-4Fd=VbmXj_)>gmf1Vlq!L;5vLf#E!Pmi%0fhZf}^W{ zsyUVs(afN1Hfg>?*n;D(`4UCxz{2D`swLBgWD2=M8MK=Tt4PF$W%T1F;cHSruAXQc z!d?P*408oIh@8BCHtXlgU=78)9>acxRD|sir+q&)UT0m zc85tTE6N4&?UgUJ2-$Bgn^S`5i6`O!#S`HqkQH{3&-#W!#0?SwFj@8RE>wnk6XHPd zPP<&366o*E`SD^_SZ-W@QLZAmY7b47&J|kqH^8JqyN&3yDG1G$Lq%1%Q3}wPm@lR(OFBd=@P2_iR##;IQ*9=00Ao^YBm}gtl#mHJKxx9nVP^k9 zADaV&Y^e5s$(ajYh|7x((9gnE@goxQyrb$GFd*1L!anpRf<>tQmQMPK7R#EeFoOsL z7yZV*BAdkMB7m&kxJ`EuFeJp(L3mRyH30flz;pf6YibdloZ``A6e*0?t{vKWUHGP_ z{-KDJth_vD=*oR@#-e^JhF9S^8=ZKeyY7yT`F%&a?Y%lQM=D9ebEtmf;Af{2L7)57 zlBtR4*oS)V+DQ7w`0Hy7rM;YFQ0Eb(Q0w zlN?~n0GW4wsQ@tXq34TauJw(Dm_^FG^IV#5Ujy-|emjx$zev*g2~V*<@v~vWryeg{ z-G-Qm&?6g$?7mRFH|p9{&;yVOKb{O~pGlsXtpVUUH;B8&V5620xwM<|GRM=;y4YDoCxC$m~t>}_udG4_k&ayAf*yPAnk=oi}fz9&Cp zKh?qt8)2nU(vO%_QRxY6f{j7$i@cU*-BVjhbYN0b1BkzL{}GTEL(32lzK}c5519W< zDT+hKVy_j`U-6MQI5+29U;3S`@w0Xy-T_Ox{meiptr&PdqQ(d0NNU|1Q-! zPG;suY6^OnJ5fo&Jw?Y-esgh$O}ntw7#*we-$Z6{fd# z=Rw_LXPK`dxw(X64nt!GntCMgA_}nfcCf`r&zDJ4)Z3g1M^G2THod?vfMb*BnfU{q zW_(mF(iQ=R;g1bv97)_q>&W^>|0f)~Pv(+rX7{3gNt3uoO^0S8WdQJ?BcyFBbe%mF z9%~?$EPvY^3ldY5^S%xR<4tv1QYptpWBrlGS;qw`aE}|CWlM)tpQOHMct7Y!>Z|lL zzQvLBlV7{9a4@4$DT`Star^vz9Cai~1Ce=fg5}kPWXzZE|A}4SuI>bT2n?%uP8k#r zpGqE*S+|vH>DV~okS3XB9#EoHWCe}^N)x5b=zA5Vh~Y#dvBzR&2D-b#K_J(I?fX!^ z&(Ix5zX2v?NQL zg~4DUb7`iiCf`~FU>|* ziX+IleXGd%1fS2YXFAa6&z(gHBRJ>&zxZ}CU`Udg+QQU9S^8z&Ckjl`A%09!5psrj z4O}Z72){Hge$p0AC;`fISN6uo$FumAk?Z+h4n*w;3kDEIPx}SQY)En4zd^X!y}yQ^ zXtz(7Q3BLdhopE7Y%}kW&dLu~Z6tqvlyCs)KmP4oBL@df>mf$KKxs^6szlK^0&b;7s(v zMS6t@SpX?b%fM~N1jfB9{EW8Y4Xc5C4liE9t#zBL4&+; zSI_R5oNlpgGC~_;ifo3n_-`ZM^gSvL1p!P~Dzbb*FKPVxm`F(n=&JE((*#(EZr4}> zPa)r=JqT}n+`dGS(N2&`#Jw}c{3`*VeBGcG7b8D3Nw`|mEqLc}UyP>@0Qe~fVdS@{ zQ!i124EXE{!zypJPxq^{1n3A~_LuTaIG`f@=a6Iu;T3V79s8GIlya_~uqu6?SR|q2!wM41z{kWIRysb-t56u3coU-?nyLo3Qtx5-nAN)YtfX--t_lX5XrY z8bQHiJ5Ge(P16oXI&X!CAMF=|;;@9e($yLNsx9HN%MC2K>lH%<=txAo0^<_{h%2c<9wm$KhYdW8yXSphSmp{5j+RnIc9qRV#+vTfCX<)qRJ{^cF1n| zdQ&3-9yeH4bXmw*(ZKcBVYkU>Q%f&{TE&H~%*f@rK6R+ym?#*PxyLfW4Mjh08WI|s z3VH^oWiQ9l{yq!lQvIK5A+q(OD}qg3pz zVm3NL|DGMR0iDeHR8g^7Dr1SX@MwtM9j5;15VjDOkyAa|MgHEx44S11dZQq&>PL>- z$%VOI6TDa2c(q;B&CWwAM1(EC+3i{b-vYH4f-ai&`bPezTz_g^^ji>wF0+wX(6pCa zz_h5;7HKnUD>Wid_Th@)giFnzvDzK)t5>%5sE1`(`5CRa=KHJr zsaysguyKg|F@)ZD4SM_J=^r2C8(4MnWx*sks^kO3x-s}y79kjJHv243-*J$rfSzH* z$rsuUJ<|fvtRE9!bC^Yf9kC@2R~bTKbNMs9wLf(Ay6XtRP&!RVk(7zpyaCBB ztWgs#i(rTj2!@>b?+IU(J#O{)THOE0m}KTw0%HQJZTBz61j!qpAIVhputh2W5?WgT zjMF4UU;}*pB_P}MLf|hRwC0*0sidEjCqe`T<8{IiQE)hk6|;V6 z{ta+-ZC6+i3L@&sfctDVC#dTGL=kY$lxkP7n~ukzbKU}=mIGFN9DJ6+P;tuxqr~Zb zjc~bBZyGgGV`UgY=~8)rltnW7BWU)4<2IvO}JL?#G6ePFu3% z5bu=q%QH76_PHj)a$f&4W(+oR$hov!H8H8sfPfs6U^Gojco1>lgvZLGfODaLOxZws$HZ4@w~dd+F;h!#>YzzO{tNn}}rpQ_L{WD8LhnW5o1^ z7$N9(pAztn(FvGz=oASWZ;Vt)@ZL0sLsy;-cyHm;_|_m=$-xrkbiF_r%G*Gc2oZF_ zSul{cA(moTBhfxagpW==Ly7o-6mb=FQ7)e{JvKOlMaqQwpWri;KNgJK%!v0ry?ZFn zSb+;S>@r~Y0wgnjbReOQqpiIv-YR}+87u{wCM|JHP;PK`fOQ5TH^PCzXaDPa?*YnQ ze2q9x5y!rb4iLS_{Mk42^!#h$!6Ej0(!HTTgqT5 zG>PaCE_fL!Bp{2JG`}TGg%mfubf|`7cw`6@e6rolFW~^9!9u$6$Sgu!>F3xD;`(X{ zjO%#rBX*AiX?4HHLu}Y}+85 zO*kOpzRW?7gK!%HiDfwdNRhgI4n!eF5YUlBhyLLc4NmL`S%AyNtVqkqG(x^$gF1{v zpsHmmmd{H*ZTZ2I6>$lg6Voa5>w?-@j?Euzq+hAxVraZIiR1OmOt-P5$3= z$4ZC#bV%DD79JIxJ=Y#on?nNzM%IE2h}# zS-&?R9C>sUlzRVfz}mX1aJtw3PrV=TOV+((QGjEx!jNA41eK*JnToXxz@6eG$UL$Bv@q(I=8I9c^7U{X;QWv3r%=ka@ zGxQfmbDM`a;;~&e{C-gQHNroxt$j2{hcJZT_zMPXeJFd=8*<#gXA*U2p`IW#%7EhO zm=1~JFUAF-uN<2e=LgGTLmXLo_TX>`BalzhX0{-!#q-DzVs!8rBG-}f4bbjw4eyOZ zKtfJOi}Lk?>oQ~msQj1WPCrfA23?>CpqixFSCeYq9TFje?rx*!8XnL-I1W?|gB9>B zX;^}Z2t_FYx-SyILG@OE^U|OhTpD}?)QI|I{;Cpe(H-XqqzbAG1od<E1|bYjcrPelIuLiE8V*IWv8H=po-xu?7pI9#H$nMjf);vU0p4oh5Ys#m zQAU4JpD>B=)D^;Twut@eoc0oS!alli3Te0kP$@8~vd^vk1V(8Y;hg?)W*n5xOwb}9 z26Hc)eCyfx##CbK$OFRbl@bK`Q_jPt=Vlum^7Q|DGIjbITPV^@ccLgweeCBOF7#)@ ztRF>QFxZlg$K+VG1zi@PJ3@9j_~Z2i0*8*8L)3V{oJfygz?(Np;X}alY2XO+mvRKk zVdw;w1|4_@1I`>8ihZsv_*CbQLb(@e$e}}^T60PYT_)V>KCBSA{upRZ`LQ=&9(AE3 z(*x-U1}3YhjPUkQYr{QIC$=l$DPEMVbeGL?x(==jPJHVUl1<(pVbLeR z5?YaI@VHpH3<0IqaYqlh9OIrGeTE%411bX0^uYWm;juYjjPAg$Dw=P=ockurO};h$PUpU^pbUPwT4?22+u}{5v|1D_+Q@?A$s`ek#Sp+1m(v5 zyO21QWcn3^n+d4sBmPNAhXIb0hpLb>kDo9ZpzroT^_~K4q>Ip<86&RGxKjoq%Rh_^ zoKHZop?06Xf*UCLQVvIWou;C)!T^Cd0fu$%g&p7{DFsgw7DwG}Mmt_Bpb&vWpCWAu z-yJNnF3eOS0+`PNXO@u&?v=YOjTiP?hl0bQ0ce9%IA&onac^4&;O7IE{rp2V z2IXIZttp*Qdy-DAs1LNlO+aAbGlvrbUNMmX;!J_#8NUnJ01=PTi-?Hgv+Pwh@WAsd zVe!tfNxG3D_rLl&OiE{VqvcAyD;FaVp4huQJM8#Y?|_qPOR4no*v)i|{^;o-!_xWEYtUjX&fHN8G?g=H$Ybi_I}!UKlp~Kgv7rfF`g!k4F*E836?mMd}Dx5E(&0 zq&lFe6s0=SEl7zJsZvFBMJ#|+0Vyg01d|{VB1kB9q=OI*QdC;N5GA37cE1%v!PDF7IqZ&M@n#Rdh$DjXzOq-dv?7@fb2jZ-*njUbf>XombL=*aJ z!N2=Vf?qH@zwei6^XEDy?Bm-&*4Xx47^No6fYV(MI#v4M5NY>(f%#pN$L!L=Hh#rD zR1Y>7LsK?q;-38zImkzsy%$F0!1c(LZ?k}W005_`;xKf2C<~-=Ro*sz!%a?|yi%{oFFEX7{_PqY=^+LyQlz%V1-7eU z)K>@YZda=j+{ZJnpA}Ch-@!i-v30PAAS#ctfNf0O$tZ4&ML|rDuj2mLVuyS)NlO*4 z00}b8Q`Ln^-j!c3(d~y*?7Y6(#m3%UXi#l_+s$>0BQL;w135Egh%dyg@A+Im6bd-dpo}z^yMz2CWh_wxi2vbrbwQ?AFg(n{Xv{Nc> z=oTF*zMhpN`(A$>D}R%Yg2Ib!P%20*V(|~|umbOE%Zq{4sfsR{|C?5!PZPzydgDWm z7L{JT@x8E;dBV0j;Ajw2HXlkbjM1_VDIL0BXPlr&c9K$aAaB*Q=B(FQdP=kExVG!J zjk!XCOn4_MBBx{fo-mxGeXztZIKec%Dm7uMpY3gFVPUxVy`k{*`d`%xf?|Z_b3rdl zfDY4t+9T`Xyi1|e1R>t{w>HVp6JSjL!C6dS2E*(4V|ReJIb<_0TmjuOO`XH}Jq?D) z7N6gjTb6nEj+yFF)kz0@jDJ~3s@(RLkq{8=;Cq6XyyokSDgdzcc&y zT8mFKr+nwf8b+Yfu^9U{IQNE}g#ETrW5-R=tkkKzBQ!0ek8y;Q4j1p##PX{+iF^mA z{WlWN)n6H>$Z2kMIf3;IJ>C--35x`f<< z>tSEKP@Q`&BW3&b;ojBU_OtrM?D|i$1-xR{9N*A-!Z>Vt8<K!-4BIPTOV z>Xc6bkjf;`xTQW>aTDy~sW3|#o#uwrhHh@^T_2pD{WnyiTYkz!-LrwuQgev)-AX0K zE&Plt@PoxSJbV5;EvNU2z$(Y2oah+c@Wv~pa2WYSh9~7*W>8ZhI+p_xZme#6PoK zf74I?2AJ*tSH+GyPW)e9$H4wM2S8Xfknkw(=H})o8g!If z_j9XAc{JN5JO$komHyxM&ks)*Q^ciq`RIcKQaRdD2WQqg4ZYp+n>Jnj9=Cx`DH9Hf z$cJDCuITJkhuNLxBcQf5R+gGO=CCH^ZN!{HW zmtmA(iOcTLQL0-)zPe5mJ9*u^!t3t#mrCXzQ-)>et%EvOn?&X7WZMJYRm3K-PqG}H zE4JHFk6|+er3LHDQ$>jRpDRpBmm2GmMz?77ZnPPoZ1N-Ie-4RTS3J`jUOTbo!PN43 zo%jx@p;a46`0jO?4YA7LuAx9F+R2K8;$A)u(J-U>Q-&dNvZ#*MvC!q-I>U!4wJGPOki%07RqykUO*y%0|-#MmL4G?>?S2Ntt;5&XW4|1)W zL37^@D3W+M@uVH=jFr~&3JEv@`g0=kv;zA_;Fbz5Qw&nW+mIE9S~Dg7bPJHeEp~ki z_r|Y)U$y|4bR|%0TCZ~QGJP2TeT6mhffZJbqQXt=t4_{9(^Lsn=B)6x9qhiQb;HF5 z8QPF!+iBg-kGb)u&?T5Lo=DasZT3BGol5_0E8l;)a{Ar`C%T6pve7uA_e;~99)6Zoz6ATEJB<{ zU^c$iY6iaw2k{pO9qwVtJ3>y7xheuC?Ju)oeYy4g@xfGVvGjw$b1PkwM78tP=yBng zql);*K#(<19?3{D%CGw_*srN$q5QSltHj|HrFoIBA1ETRGj`F8_7Br=Pl@xT(F`c} zf(B~j7(QX`4#<7Pv|q+7Izm)uElzfMLzU+A0_1IOybohFmOwyci~XbG1Aq#1T1Q@~ ze`+hdhi1NduZPUX`j0HI1g7$yzj#s7e*S0B!L7==7T;?`HtbokJO088l@4Y9Ot@-e zBiO3(z@Dr_4mC)N2~a<<9;=%5x@UpAVh_bP?wSTC2yb0G2(2+)!QVaA2GTFZJ&e9o ztP^UmjcT?)U#WwY%N`caaS-=r8&yG)O(Y1lly;hcuRj1mg$S107dTnFvla}5bmUON z7P{a2%kx9kzeU|jhox9gAK0ix$BBc?RmTJ*gtzwTol?twMV)(=kL zJE`|0bibr$s$o;?L5v1YRvdvETVwI{@Kk|oR`5QAwoBV_;u5(tHl>MYT5QSgcpjJ_ zOmwIFctoy^rruc?UI2t03Ty}lbz*X#f^D7)Ej1NrWsAJ+f$WSzjst`xGni5f%zwnOwwL~fKPOrQzDFw=IOxibe=$T&1T>mXex%NlB)irB}LMV;HD z3p!KpPe`#{t!$?@ck@vuNrTx<`R$@d>}%aIb9#V2(0m3?jOW3;B;DJc7OJLKAuoiu zoyz+>u>_|P)AXG?^d5Pa53FVBMt*T1t}RN7X-n{%UyVgLv4Jk{>f}Ru^HxAFIvLS2 zBIHLQAjI8ZYr&Mv0jZ(bA}D**fSBhWrkBZdeZ2ZW~3QW~rZOWuC*49NDt(QC7*L4yo2iY(%Kf##s;y6XD_p z14nqOG(r+KSHfyr-UC!P!qzs z1+gVjKPV0G`*?wfGyXU$nW+{IwI2v6?0FFQHV=BmG7BIaEBFBZnq=5rvB0K*@_r_r z`bd&qZnR{1tgydK^k$G+@3ncgO3!jW*;cQ~hL~_-UPrfo2&(l1-b2Hw-*#(W?Nam- zdmsc=HR_D8cuxs=w6>dtL!B4Yl>XE<+0X5&UjC6|8|o=2D%0gaUU)^7$^qx@ z_`#1+0;Fl^@uUT#mM;Pq%$z~H1;0byqzsW1T-sg$Mp2tp7uAD|(&hIUpX@}XFUx@+ zp>Ap)<~~GNkE13y#)aVNK~;fGd5lWZd_~~OeEG4E#*vVTW4F|gwc4uM7MXQrk4_N6 zjX`bRb}~PKW>0{mf5drUuCN0Lp-H;;+fQlHPC1f~VCQ%{IZJ*Lg$2~WjrhvO+I;@w zo5@TLPX#P-c@>3$uW~bMhI@C1CGZV$27-0T@CwUpNmtQ-<_sj=nkT{=9RGx%^LQd@Z!|ca$ZCC&Gq{V?uPG%=T_WE;f5D2mBj9 zYUtI#xdQ668e3v|%?G z1m8&1Hyv)I0=NG8+&mClU%~1vi%c|R2SO#;TbKFuY=bXsI}CCYBy`f7VF74;oQ2xy zvuP;e1Flv-bU0L?Wg8z{0EN;z1GqN`@#(xJQAQCAwG2jk<;WZuQ#M)9)kM_}nX2nvYExN6nzz|Wge~uTG0u`H5^6-VHSnkxKrM{u@Ro;pHCh4(dGsf1``gdICK9(&FR$ z!slTxON%T8yEB^V?{kaG6>&50gPMJiH}h#}MYH zKR;~dFch6Y`bh=EV0!d&l>4r0M?i5Ysf)&_qj@0_QZ0weyt=mnd^HsYIVae8_QKkB z>g_l$CX%?W8cwGD&S-pqq$Q$GD?rRg!yR5ybsPmO7>fv&n4--#>+}(*c%Wf%kO{cl zr%CIop|3m+e7tm-V950;w4hSpipvwS`p)+%LOAsNfoixkZVsNYo(Z=Yg4tGebsN;U z8u);iW3>Yy`kE+3LU_9#vgxuw2>p`b4Oct0<(Y0^O@Z}|jS6?@#gltH4mQCToMBc% z4YHVfDUj7sR%Qz17^B~7yryZSY_ZI{$-j)FZ-|w+c$IGmAqKR@9vPrcD%^Rrvr7OI zX^A*tm)F5T9DXodY7*{P-)iA!Y+`b4r&~+SHoIhKaiLj3B&iVby-sC9B4FI^lCE4! z;RI~hs<@AVZXKQi@73Pg*eWeRYS@G%(HrKWj~^`=PrG#sv9vX;yCx{eu)#POr#273 zdkBF6`Sp>$5|RxJ3F%RIyVOrw%`n9zd1RsGWeVnCQ_*Q)1zc*# zkV=KcEiGEy#t-}?z`jXhR_(Z-K);^{cr>$lI6vf#l-t-*C!4EEFFF|ekwRwBq=B8W zKIb@Mxmt-)~E73owMLxH;%X6v3?qmg}@fKjEdT@tMtGN zpMiO~F?VUI4kR%jI%31m(92 zZ=(5V%Z`C%JGh8Yz|oLT*u{%N`>PE?RjI-!JQWGJ76>{eL&5enuoJfcem|%pRTY}> zBA>Be?#Wk*uj251u${N((HB@7pxawGxE62YMWQaiC(xt@FZmpoO0Ww(MP;-G@c(E} z+Ni!4NJo@2#x6fZ^G=>+dq4aqm|L;kd^d3gK-51;O2#5icZZLe7XSvG=6#{#p> zg}xiuKXM5Ab$%S-Fcj%LKQP#4#?MJVJTB{|_UXl!by5Ap&*n4=f})6}eHi_^3{$gW zGf>G5*Dxp!q0ZFU_d8#8j0}P2@_@8bz#^bc*pAW1fN4;rmZ&T+t>(;l_i#uvHJ{N+ z8X@tK0)HJ{ZcTAuO{3YehZe-_@uWQ+y|4ne#{<#ONP$4jlkc$kB6TI@GB!C3Uq!4X zt8M8v6PP5u41^az)GgX4PG|DwJ+tiOQobnNoR&Vjt^#aV7(=_63a1#?^ff39oR{l} z-4zC7U!M2^q+AklGdvg>ioKL%q$s?>6JvYvp2UE&BxwESY7+Ubh_`rkl{IQzvpdyp z)>F!M(9&VyKILHZ&)Aj_Puy@_%lK@XDtX^hOJFP@%vS)KX!n^SGp zJ`v*8e5G#=T-L#3=Tj>6AX^TlpTq99;d<-vG_T|)9!%slbnzJ`Z5VnZDQGWJe+Lkr z*9qZ8pNg@h0401`SLp1_G-Owz${04ZyOn|&kPA|Y{fhzvlJx$a`!RaB-)^D!7k2f3 e@KJ;#7Wr|@vu>((U>DK19N24SNchD$>OTNUP}Ot* diff --git a/results.csv b/results.csv index 4891afc..fedd423 100644 --- a/results.csv +++ b/results.csv @@ -1,91 +1,91 @@ структура,режим,операция,повторение,время (сек) -LinkedList,случайный,вставка,1,0.13309969999954774 -LinkedList,случайный,поиск,1,0.009379099999932805 -LinkedList,случайный,удаление,1,0.004902000000583939 -LinkedList,случайный,вставка,2,0.11298999999962689 -LinkedList,случайный,поиск,2,0.00728259999959846 -LinkedList,случайный,удаление,2,0.003859800000100222 -LinkedList,случайный,вставка,3,0.12435430000004999 -LinkedList,случайный,поиск,3,0.006995800000368035 -LinkedList,случайный,удаление,3,0.0038894999997864943 -LinkedList,случайный,вставка,4,0.11281289999988076 -LinkedList,случайный,поиск,4,0.0073154000001522945 -LinkedList,случайный,удаление,4,0.004016099999716971 -LinkedList,случайный,вставка,5,0.12206900000001042 -LinkedList,случайный,поиск,5,0.007770400000481459 -LinkedList,случайный,удаление,5,0.0039008999992802273 -LinkedList,отсортированный,вставка,1,0.12199670000063634 -LinkedList,отсортированный,поиск,1,0.006072700000004261 -LinkedList,отсортированный,удаление,1,0.004619700000148441 -LinkedList,отсортированный,вставка,2,0.11778119999962655 -LinkedList,отсортированный,поиск,2,0.005873400000382389 -LinkedList,отсортированный,удаление,2,0.004716499999631196 -LinkedList,отсортированный,вставка,3,0.11716749999959575 -LinkedList,отсортированный,поиск,3,0.006211500000063097 -LinkedList,отсортированный,удаление,3,0.004824199999347911 -LinkedList,отсортированный,вставка,4,0.1168800999994346 -LinkedList,отсортированный,поиск,4,0.00615879999986646 -LinkedList,отсортированный,удаление,4,0.004850500000429747 -LinkedList,отсортированный,вставка,5,0.12217359999976907 -LinkedList,отсортированный,поиск,5,0.0060359999997672276 -LinkedList,отсортированный,удаление,5,0.0046704000005775015 -HashTable,случайный,вставка,1,0.001177799999823037 -HashTable,случайный,поиск,1,3.729999934876105e-05 -HashTable,случайный,удаление,1,2.009999934671214e-05 -HashTable,случайный,вставка,2,0.001008700000056706 -HashTable,случайный,поиск,2,3.290000040578889e-05 -HashTable,случайный,удаление,2,1.6900000446185004e-05 -HashTable,случайный,вставка,3,0.0010118999998667277 -HashTable,случайный,поиск,3,3.500000002532033e-05 -HashTable,случайный,удаление,3,2.0599999515980016e-05 -HashTable,случайный,вставка,4,0.0010044999999081483 -HashTable,случайный,поиск,4,3.1800000215298496e-05 -HashTable,случайный,удаление,4,1.700000029813964e-05 -HashTable,случайный,вставка,5,0.001006999999844993 -HashTable,случайный,поиск,5,3.1599999601894524e-05 -HashTable,случайный,удаление,5,1.649999921937706e-05 -HashTable,отсортированный,вставка,1,0.0009728999993967591 -HashTable,отсортированный,поиск,1,3.0100000003585592e-05 -HashTable,отсортированный,удаление,1,1.9299999621580355e-05 -HashTable,отсортированный,вставка,2,0.0009723000002850313 -HashTable,отсортированный,поиск,2,2.9599999834317714e-05 -HashTable,отсортированный,удаление,2,1.919999976962572e-05 -HashTable,отсортированный,вставка,3,0.0009663999999247608 -HashTable,отсортированный,поиск,3,3.0500000320898835e-05 -HashTable,отсортированный,удаление,3,1.9699999938893598e-05 -HashTable,отсортированный,вставка,4,0.0011242000000493135 -HashTable,отсортированный,поиск,4,3.400000059627928e-05 -HashTable,отсортированный,удаление,4,2.080000012938399e-05 -HashTable,отсортированный,вставка,5,0.0009773000001587206 -HashTable,отсортированный,поиск,5,3.100000049016671e-05 -HashTable,отсортированный,удаление,5,1.9699999938893598e-05 -BST,случайный,вставка,1,0.004384899999422487 -BST,случайный,поиск,1,0.0001329000006080605 -BST,случайный,удаление,1,8.230000003095483e-05 -BST,случайный,вставка,2,0.004304400000364694 -BST,случайный,поиск,2,0.00014240000018617138 -BST,случайный,удаление,2,8.129999969241908e-05 -BST,случайный,вставка,3,0.004376699999738776 -BST,случайный,поиск,3,0.00014179999925545417 -BST,случайный,удаление,3,8.269999943877338e-05 -BST,случайный,вставка,4,0.004673599999478029 -BST,случайный,поиск,4,0.0001511999998911051 -BST,случайный,удаление,4,0.00012150000020483276 -BST,случайный,вставка,5,0.004335399999945366 -BST,случайный,поиск,5,0.00013080000007903436 -BST,случайный,удаление,5,7.93999997767969e-05 -BST,отсортированный,вставка,1,0.7882552000000942 -BST,отсортированный,поиск,1,0.01960369999960676 -BST,отсортированный,удаление,1,0.013939499999651161 -BST,отсортированный,вставка,2,0.7601769000002605 -BST,отсортированный,поиск,2,0.019820599999547994 -BST,отсортированный,удаление,2,0.01359989999946265 -BST,отсортированный,вставка,3,0.741146899999876 -BST,отсортированный,поиск,3,0.018209700000625162 -BST,отсортированный,удаление,3,0.012622499999451975 -BST,отсортированный,вставка,4,0.7348717000004399 -BST,отсортированный,поиск,4,0.01830170000084763 -BST,отсортированный,удаление,4,0.012606900000719179 -BST,отсортированный,вставка,5,0.7420961000007082 -BST,отсортированный,поиск,5,0.018224400000690366 -BST,отсортированный,удаление,5,0.012539400000605383 +LinkedList,случайный,вставка,1,0.11277499999999918 +LinkedList,случайный,поиск,1,0.006451900000001842 +LinkedList,случайный,удаление,1,0.003666800000019066 +LinkedList,случайный,вставка,2,0.10957519999999477 +LinkedList,случайный,поиск,2,0.0064522000000124535 +LinkedList,случайный,удаление,2,0.003728399999999965 +LinkedList,случайный,вставка,3,0.109341000000029 +LinkedList,случайный,поиск,3,0.006500899999991816 +LinkedList,случайный,удаление,3,0.0038011999999980617 +LinkedList,случайный,вставка,4,0.1110247999999956 +LinkedList,случайный,поиск,4,0.006476099999986218 +LinkedList,случайный,удаление,4,0.0036711999999852196 +LinkedList,случайный,вставка,5,0.11070879999999761 +LinkedList,случайный,поиск,5,0.0064365000000066175 +LinkedList,случайный,удаление,5,0.003677400000015041 +LinkedList,отсортированный,вставка,1,0.11145989999999983 +LinkedList,отсортированный,поиск,1,0.005919100000028266 +LinkedList,отсортированный,удаление,1,0.004607999999961976 +LinkedList,отсортированный,вставка,2,0.11035959999998113 +LinkedList,отсортированный,поиск,2,0.005787800000007337 +LinkedList,отсортированный,удаление,2,0.004521399999987352 +LinkedList,отсортированный,вставка,3,0.11167460000001483 +LinkedList,отсортированный,поиск,3,0.006033900000034009 +LinkedList,отсортированный,удаление,3,0.004642099999955462 +LinkedList,отсортированный,вставка,4,0.11137540000004265 +LinkedList,отсортированный,поиск,4,0.0057623999999805164 +LinkedList,отсортированный,удаление,4,0.004488399999956982 +LinkedList,отсортированный,вставка,5,0.11472939999998744 +LinkedList,отсортированный,поиск,5,0.005918899999983296 +LinkedList,отсортированный,удаление,5,0.004527400000029047 +HashTable,случайный,вставка,1,0.0012038000000416105 +HashTable,случайный,поиск,1,3.46000000490676e-05 +HashTable,случайный,удаление,1,2.0000000006348273e-05 +HashTable,случайный,вставка,2,0.0010017999999831773 +HashTable,случайный,поиск,2,3.1499999977313564e-05 +HashTable,случайный,удаление,2,1.720000000204891e-05 +HashTable,случайный,вставка,3,0.0010786999999936597 +HashTable,случайный,поиск,3,3.4999999968476914e-05 +HashTable,случайный,удаление,3,1.9199999996999395e-05 +HashTable,случайный,вставка,4,0.0009729999999876782 +HashTable,случайный,поиск,4,3.090000001293447e-05 +HashTable,случайный,удаление,4,1.7399999990175274e-05 +HashTable,случайный,вставка,5,0.0009918999999740663 +HashTable,случайный,поиск,5,3.049999997983832e-05 +HashTable,случайный,удаление,5,1.6399999992700032e-05 +HashTable,отсортированный,вставка,1,0.0009690999999634187 +HashTable,отсортированный,поиск,1,3.5900000000310683e-05 +HashTable,отсортированный,удаление,1,1.8599999975776882e-05 +HashTable,отсортированный,вставка,2,0.0009684999999990396 +HashTable,отсортированный,поиск,2,3.0100000003585592e-05 +HashTable,отсортированный,удаление,2,1.759999997830164e-05 +HashTable,отсортированный,вставка,3,0.001049399999999423 +HashTable,отсортированный,поиск,3,3.1100000001060835e-05 +HashTable,отсортированный,удаление,3,1.8299999965165625e-05 +HashTable,отсортированный,вставка,4,0.000957400000004327 +HashTable,отсортированный,поиск,4,2.9900000015459227e-05 +HashTable,отсортированный,удаление,4,1.7500000012660166e-05 +HashTable,отсортированный,вставка,5,0.0009610000000179753 +HashTable,отсортированный,поиск,5,2.9500000039206498e-05 +HashTable,отсортированный,удаление,5,1.770000000078653e-05 +BST,случайный,вставка,1,0.004438699999980145 +BST,случайный,поиск,1,0.00013129999996408515 +BST,случайный,удаление,1,8.220000000846994e-05 +BST,случайный,вставка,2,0.004387300000018968 +BST,случайный,поиск,2,0.00012960000003658934 +BST,случайный,удаление,2,7.93000000385291e-05 +BST,случайный,вставка,3,0.004303200000038032 +BST,случайный,поиск,3,0.0001283999999941443 +BST,случайный,удаление,3,8.050000002413071e-05 +BST,случайный,вставка,4,0.004263700000024073 +BST,случайный,поиск,4,0.00012770000000728032 +BST,случайный,удаление,4,7.650000003422974e-05 +BST,случайный,вставка,5,0.004260499999986678 +BST,случайный,поиск,5,0.00012939999999161955 +BST,случайный,удаление,5,7.969999995793842e-05 +BST,отсортированный,вставка,1,0.7347394000000236 +BST,отсортированный,поиск,1,0.018492599999945014 +BST,отсортированный,удаление,1,0.013188500000012482 +BST,отсортированный,вставка,2,0.7407673999999815 +BST,отсортированный,поиск,2,0.018303899999978057 +BST,отсортированный,удаление,2,0.012820200000021487 +BST,отсортированный,вставка,3,0.7382302000000323 +BST,отсортированный,поиск,3,0.01834120000000894 +BST,отсортированный,удаление,3,0.012760500000013053 +BST,отсортированный,вставка,4,0.7377933000000212 +BST,отсортированный,поиск,4,0.01829400000002579 +BST,отсортированный,удаление,4,0.012722399999972822 +BST,отсортированный,вставка,5,0.7360582999999679 +BST,отсортированный,поиск,5,0.01833809999999403 +BST,отсортированный,удаление,5,0.012751900000012029 diff --git a/sorokinfi/427.md b/sorokinfi/427.md deleted file mode 100644 index f2b1dc8..0000000 --- a/sorokinfi/427.md +++ /dev/null @@ -1,348 +0,0 @@ -import csv -import random -import sys -import time -from collections import defaultdict -import pandas as pd -import matplotlib.pyplot as plt - -# увеличиваем лимит рекурсии -sys.setrecursionlimit(25000) - - -# 1. связный список, узел: {'name': 'Имя', 'phone': '123', 'next': None} - -# проходит до конца и добавляет в конец -def ll_insert(head, name, phone): - new_node = {'name': name, 'phone': phone, 'next': None} - if head is None: - return new_node - current = head - while current['next'] is not None: - current = current['next'] - current['next'] = new_node - return head - -# ищет узел, возвращает телефон или None -def ll_find(head, name): - current = head - while current is not None: - if current['name'] == name: - return current['phone'] - current = current['next'] - return None - -# удаляет узел, возвращает новую голову -def ll_delete(head, name): - if head is None: - return None - if head['name'] == name: - return head['next'] - - current = head - while current['next'] is not None: - if current['next']['name'] == name: - current['next'] = current['next']['next'] - return head - current = current['next'] - return head - -# собирает все записи в список и сортирует -def ll_list_all(head): - records = [] - current = head - while current is not None: - records.append((current['name'], current['phone'])) - current = current['next'] - records.sort(key=lambda x: x[0]) - return records - - -# 2. хеш-таблица - -# хеш-функция для вычисления бекета -def ht_hash(name, size): - return hash(name) % size - -# вычисляет индекс, вызывает ll_insert для соответствующего бакета -def ht_insert(buckets, name, phone): - size = len(buckets) - idx = ht_hash(name, size) - buckets[idx] = ll_insert(buckets[idx], name, phone) - -# поиск по хеш-таблице -def ht_find(buckets, name): - size = len(buckets) - idx = ht_hash(name, size) - return ll_find(buckets[idx], name) - -# удаление из хеш-таблицы -def ht_delete(buckets, name): - size = len(buckets) - idx = ht_hash(name, size) - buckets[idx] = ll_delete(buckets[idx], name) - -# собирает все записи из всех бакетов и сортирует -def ht_list_all(buckets): - all_records = [] - for head in buckets: - current = head - while current is not None: - all_records.append((current['name'], current['phone'])) - current = current['next'] - all_records.sort(key=lambda x: x[0]) - return all_records - - -# 3. двоичное дерево поиска -# узел — словарь: {'name': 'Имя', 'phone': '123', 'left': None, 'right': None} - -# рекурсивно или итеративно вставляет, возвращает новый корень (если корень меняется) -def bst_insert(root, name, phone): - if root is None: - return {'name': name, 'phone': phone, 'left': None, 'right': None} - - if name < root['name']: - root['left'] = bst_insert(root['left'], name, phone) - elif name > root['name']: - root['right'] = bst_insert(root['right'], name, phone) - else: - root['phone'] = phone - return root - -# поиск -def bst_find(root, name): - if root is None: - return None - if name == root['name']: - return root['phone'] - elif name < root['name']: - return bst_find(root['left'], name) - else: - return bst_find(root['right'], name) - -# удаление, возвращает новый корень -def bst_delete(root, name): - if root is None: - return None - - if name < root['name']: - root['left'] = bst_delete(root['left'], name) - elif name > root['name']: - root['right'] = bst_delete(root['right'], name) - else: - # одна ветвь или её отсутствие - if root['left'] is None: - return root['right'] - if root['right'] is None: - return root['left'] - # две ветви - successor = root['right'] - while successor['left'] is not None: - successor = successor['left'] - - root['name'] = successor['name'] - root['phone'] = successor['phone'] - root['right'] = bst_delete(root['right'], successor['name']) - - return root - -# центрированный обход (рекурсивно собирает записи в отсортированном порядке) -def bst_list_all(root): - records = [] - def _inorder(node): - if node is not None: - _inorder(node['left']) - records.append((node['name'], node['phone'])) - _inorder(node['right']) - _inorder(root) - return records - - -# 4. ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ - -def run_experiments(): - N = 3000 - HASH_SIZE = 1007 - - print(f"генерация тестовых данных для N = {N}...") - records_sorted = [(f"User_{i:05d}", f"+7999123{i:04d}") for i in range(N)] - records_shuffled = records_sorted.copy() - random.seed(42) - random.shuffle(records_shuffled) - - # подготовка выборок - existing_sample = [r[0] for r in random.sample(records_sorted, min(100, N))] - non_existing_sample = [f"None_{i}" for i in range(10)] - search_names = existing_sample + non_existing_sample - - delete_names = [r[0] for r in random.sample(records_sorted, min(50, N))] - csv_rows = [["структура", "режим", "операция", "повторение", "время (сек)"]] - modes = [("случайный", records_shuffled), ("отсортированный", records_sorted)] - - print("запуск экспериментов (5 повторений для каждого режима)") - -# ТЕСТ: СВЯЗНЫЙ СПИСОК - - for mode_name, data in modes: - for rep in range(1, 6): - head = None - t_start = time.perf_counter() - for name, phone in data: - head = ll_insert(head, name, phone) - t_end = time.perf_counter() - csv_rows.append(["LinkedList", mode_name, "вставка", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in search_names: - ll_find(head, name) - t_end = time.perf_counter() - csv_rows.append(["LinkedList", mode_name, "поиск", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in delete_names: - head = ll_delete(head, name) - t_end = time.perf_counter() - csv_rows.append(["LinkedList", mode_name, "удаление", rep, t_end - t_start]) - -# ТЕСТ: ХЕШ-ТАБЛИЦА - - for mode_name, data in modes: - for rep in range(1, 6): - buckets = [None] * HASH_SIZE - t_start = time.perf_counter() - for name, phone in data: - ht_insert(buckets, name, phone) - t_end = time.perf_counter() - csv_rows.append(["HashTable", mode_name, "вставка", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in search_names: - ht_find(buckets, name) - t_end = time.perf_counter() - csv_rows.append(["HashTable", mode_name, "поиск", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in delete_names: - ht_delete(buckets, name) - t_end = time.perf_counter() - csv_rows.append(["HashTable", mode_name, "удаление", rep, t_end - t_start]) - -# ТЕСТ: ДЕРЕВО ПОИСКА (BST) - - for mode_name, data in modes: - for rep in range(1, 6): - root = None - t_start = time.perf_counter() - for name, phone in data: - root = bst_insert(root, name, phone) - t_end = time.perf_counter() - csv_rows.append(["BST", mode_name, "вставка", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in search_names: - bst_find(root, name) - t_end = time.perf_counter() - csv_rows.append(["BST", mode_name, "поиск", rep, t_end - t_start]) - - t_start = time.perf_counter() - for name in delete_names: - root = bst_delete(root, name) - t_end = time.perf_counter() - csv_rows.append(["BST", mode_name, "удаление", rep, t_end - t_start]) - -# сохранение в csv - with open("results.csv", "w", newline="", encoding="utf-8") as f: - writer = csv.writer(f) - writer.writerows(csv_rows) - print("\nвсе замеры сохранены в файл 'results.csv'.") - - show_summary(csv_rows) - -# функция для подсчета и вывода среднего времени -def show_summary(rows): - summary = defaultdict(list) - for row in rows[1:]: - struct, mode, op, rep, elapsed = row - summary[(struct, mode, op)].append(elapsed) - - print("\nСВОДНЫЕ РЕЗУЛЬТАТЫ (СРЕДНЕЕ ВРЕМЯ ИЗ 5 ЗАПУСКОВ)") - print(f"{'структура':<12} | {'режим данных':<15} | {'операция':<10} | {'время (сек)':<12}") - print("-" * 59) - for (struct, mode, op), times in sorted(summary.items()): - avg_time = sum(times) / len(times) - print(f"{struct:<12} | {mode:<15} | {op:<10} | {avg_time:.6f}") - - - -# 5. АНАЛИЗ РЕЗУЛЬТАТОВ - -def plot_results(csv_filename="results.csv"): - print("построение графика") - try: - df = pd.read_csv(csv_filename) - - df_insert = df[df["операция"] == "вставка"] - - pivot_df = df_insert.pivot_table( - index="структура", - columns="режим", - values="время (сек)", - aggfunc="mean" - ) - - pivot_df.plot(kind="bar", figsize=(10, 6), color=['#1f77b4', '#ff7f0e']) - - plt.title("сравнение времени вставки (N=3000)") - plt.ylabel("среднее время выполнения (сек)") - plt.xlabel("структура данных") - plt.xticks(rotation=0) - plt.grid(axis='y', linestyle='--', alpha=0.7) - plt.savefig("benchmark_chart.png") - print("график сохранен как benchmark_chart.png") - plt.show() - - except FileNotFoundError: - print(f"файл {csv_filename} не найден. сначала запустите тесты.") - - -def print_report(): - report = """ - - 5. АНАЛИЗ РЕЗУЛЬТАТОВ ЭКСПЕРИМЕНТОВ - -1. Влияние порядка входных данных на скорость вставки в BST: - - На случайных данных BST строится сбалансированным. Высота дерева составляет - примерно O(log N), поэтому вставка происходит почти мгновенно. - - На отсортированных данных происходит ДЕГРАДАЦИЯ дерева. Каждый элемент больше - предыдущего и вставляется строго вправо. Дерево вырождается в связный список. - Сложность возрастает до O(N), что отчетливо видно по гигантскому пику на графике. - -2. Чувствительность Хеш-таблицы к порядку: - - Хеш-таблица НЕ ЧУВСТВИТЕЛЬНА к порядку данных. Математическая хеш-функция - превращает любое имя в хаотичный индекс и равномерно распределяет записи - по бакетам. В обоих режимах операции выполняются за константное время O(1). - -3. Почему связный список всегда медленен при поиске: - - У связного списка нет индексов для прямого доступа. Поиск всегда линейный O(N) - — алгоритм вынужден последовательно перебирать элементы от головы к хвосту. - -4. Как удаление работает в каждой структуре: - - Связный список: O(N) затрачивается на линейный поиск узла, само удаление — O(1). - - Хеш-таблица: O(1) нахождение бакета по хешу, удаление из цепочки коллизий мгновенно. - - BST: В среднем O(log N), в худшем O(N). Требует поиска узла и перестройки связей - (замена удаляемого узла на его потомка или минимальный элемент правого поддерева). - -ВЫВОД: - - ДЛЯ ЧАСТЫХ ВСТАВОК И ПОИСКА: Идеально подходит Хеш-таблица благодаря скорости O(1). - - ДЛЯ ПОЛУЧЕНИЯ ДАННЫХ В ПОРЯДКЕ (АЛФАВИТНОМ): Стоит выбирать Двоичное дерево поиска - (BST), так как обход дерева (In-order traversal) сразу выдает отсортированные данные. - """ - print(report) - -if __name__ == "__main__": - run_experiments() - plot_results() - print_report() - -