From f4db3f2d438a17c968d659d927b8e3cbcc1ce128 Mon Sep 17 00:00:00 2001 From: = <=> Date: Mon, 23 Dec 2024 15:53:45 +0400 Subject: [PATCH 1/2] =?UTF-8?q?5=20=D0=BB=D0=B0=D0=B1=D0=B0=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D1=80=D0=B8=D0=B4=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- karamushko_maxim_lab_5/main.py | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 karamushko_maxim_lab_5/main.py diff --git a/karamushko_maxim_lab_5/main.py b/karamushko_maxim_lab_5/main.py new file mode 100644 index 0000000..728626f --- /dev/null +++ b/karamushko_maxim_lab_5/main.py @@ -0,0 +1,57 @@ +import random +import time +import multiprocessing + +# Генерация матрицы +def matrix_generate(size): + return [[random.randint(0, 50) for _ in range(size)] for _ in range(size)] + +# Умножение строк +def row_multi(i, A, B, result): + size = len(A) + for j in range(size): + for k in range(size): + result[i][j] += A[i][k] * B[k][j] + +# параллельное умножение с помощью multiprocessing +def matrix_mulit_parallel(A, B, num_processes): + size = len(A) + result = [[0] * size for _ in range(size)] + + with multiprocessing.Pool(processes=num_processes) as pool: + pool.starmap(row_multi, [(i, A, B, result) for i in range(size)]) + + return result + +# Замер времени +def measure_time(size, num_processes=1): + A = matrix_generate(size) + B = matrix_generate(size) + + start_time = time.time() + matrix_mulit_parallel(A, B, num_processes) + par_time = time.time() - start_time + + return par_time + +def main(): + # Размеры матриц + matrix_sizes = [100, 300, 500] + # Количество потоков + num_processes_list = [1, 2, 4, 6, 8] + # Таблица с замерами времени + print("-*" * 40) + print(f"{'Количество потоков':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}") + print("-*" * 40) + + for num_processes in num_processes_list: + row = f"{num_processes:<20}" + + for size in matrix_sizes: + par_time = measure_time(size, num_processes) + row += f"|{par_time:.4f}".ljust(20) + print(row) + print("-*" * 40) + +if __name__ == "__main__": + main() \ No newline at end of file From f2d6482374befbf1b4dbc302f84cc40557227f0b Mon Sep 17 00:00:00 2001 From: = <=> Date: Mon, 23 Dec 2024 19:48:28 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D1=80=D0=B8=D0=B4=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- karamushko_maxim_lab_5/README.md | 17 +++++++++++++++++ karamushko_maxim_lab_5/result.png | Bin 0 -> 19701 bytes 2 files changed, 17 insertions(+) create mode 100644 karamushko_maxim_lab_5/README.md create mode 100644 karamushko_maxim_lab_5/result.png diff --git a/karamushko_maxim_lab_5/README.md b/karamushko_maxim_lab_5/README.md new file mode 100644 index 0000000..559c5e9 --- /dev/null +++ b/karamushko_maxim_lab_5/README.md @@ -0,0 +1,17 @@ +# Лабораторная работа №5 - Параллельное перемножение матриц +## ПИбд-42 || Карамушко Максим + +### Цель лабораторной работы +Изучить приципы работы с параллельными вычислениями и узнать насколько они оправданы в зависимости от объемов вычислений. + +### Описание: +В данной лабораторной работе было реализовано параллельное перемножение матриц различных размеров (100x100, 300x300 и 500x500). Помимо этого были сделаны замеры времени выполнения в зависимости от количества потоков и размеров матриц. + +### Результаты: +![Изображение 1](./result.png) + +### Выводы: +Распараллеливание вычислений дает хороший прирост производительности для больших матриц, однако для маленьких матриц с увеличением числа потоков в какой-то момент расходы ресурсов на создание потоков и параллельные вычисления лишь увеличивают время вычислений. + +### Видео с демонстрацией работы: +https://disk.yandex.ru/i/1a4-VeWhXP8gtQ \ No newline at end of file diff --git a/karamushko_maxim_lab_5/result.png b/karamushko_maxim_lab_5/result.png new file mode 100644 index 0000000000000000000000000000000000000000..a528df406f96defa296bac0d59d3dc34fdaaf859 GIT binary patch literal 19701 zcmeIacUY6z);Emfj5=7bAfg}{MMb5_C`}+4Q9wj&C^Zlj5HUau5u~K(C?Zm#pny^$ zqM%Y@ga84OI0!^)D3VYUsR0872qC1uVP>B5&3WeaIp1!+}V3&?|tvR z)^GjRT8TSz%3-bQHdPfBm9>t?kDXIdSuR#lS$1XB3gw-Ffx&mm%QD0{2V0fmR_zJp zo9_dTI3H0_Az)WaFa4l=|Ks)J9tahcjW?G5m$9w@B2-jPK5#sCtFo zpjARjf9=zwu}M75D5Fz{*1uY3x)T3t*^L`}1~+87r|nYN2#T@2y|ZiM{0h35lKNq% zipKHBpQCvSJ{BV#UZ(sS6_xs5a@3ZtAAZ?8|N9-yRWZP&8!F3l+Ey-IFaD&i9J}&w z&0Sl-()HHuGvmvbUL07jidwp=tg!v2kgery)P5Z*RY(&!MDS8fis|zRR6hojZ^F{q zG9lBIHfYPOi-nQk-###BjH~-9-^~Zi6AMMP1PosgWnO69MHc`Q$+K&=qtHHtGyp#O-ec1VAEml0|de0d$ z-L$HIXlm~%g5TPQ!`iui%-RUKS4)|7*+61MGGF1Tc4;mtNieohq{c5Rf%*# zpTAB0EcMdCENT>B^$Xxv)O0mK40UfwxwG)26K>ezGG>mF#(7`&V_8HM55-*^g_q9- zEZVvb7I&p>5gRWwqq}dA4H(fUre&)?;f>~JH6~-wWo;kr{ZQSam~^0Y%-MlwyN0To z$$p)`GKlada7OKXWaqd}cgIKZQ>{Ly*TdqAMerXjHOvBOtuc?ah}Fo0iI#_o{NqPG zs})DXSMf?&MHyF}bTmXIo8Q2qc|?ngYZ-laNx~lj7EXfW857-}86F!TQwX-~dK{|C zh_^-fSUGrqlS$hCgnc@g!?E=i8*Wy2hEc&mB9uq5i~n{aqbh9ex=-gV(6iFaoC>!a z2fU3}cbYz#cEKoD920yqhiWqp>r?Qmx7PM2{uY(O05l#fpLhuT=`~xuaaPPPd?}9+ zy)KOlIX`n!8tm>D92ZVcxZPx;DTJUDs)6cX~PI+0N0QDZ{ROK_>J*Npc zIC9S)Jx6k!yA}<379VPOD73jV)Hl+Y_i>xs#Le(x(^HJ%{>(h)5$)6M%p3B$=$fB} zeIkS4%0*wd9Bf_n$Ph6nk<6%X;OB%pk8-!Z8vZcdxZ<*s5O}N9-;WK{1os_6shZkCA@uh-8 zNzuX6!)A~{8&EwGys`mtB#YBXd>UtI>cyd&0V+wLYb^V(%*&U(@6?g^TjBi4t>DeGj0N}oj(H)!Yur_~-{=guQcx6&xYwVa;bO81G`KFjw^zGh^Ia6bQI zD00d@3|!Ck-vM@Mh{}2*7W0JF4~VU~4i{UTT~nEWDYmI+)OaSYM!ggOG6%%<;c%DOoP?KcA8N5R>l!(OoP z6ym2@4g{kyRLLdf(i1JppWWnCa|!Q*P{pqc75(RzRfIc?0oheBHlu&&<0S`xbgMlGEjnH^vw6V8qT%j@jK zAVnW_I$kovS4esD@^kJmT1)Cq2~Oc!?W$kFpHOVzuJ<41e`Gytogmzs+Q1@9`dpITr_NVdI>sMW11{0TEndrjn{tebHtV+h1wMi}9D)YB2KWO>=Kvyx(nf8R)Tk4a9}Xk`<; z!;(_EDk}#V3nz&6k}f zBF+c9JlfL!+qr(pP8QLTdcj!r2L0SPhw}g%N7sr61-+{cJbV~O_LQeH-rs)ai%zUE z>yd?TO$k@ip`~E#LAaL>wU2Oix+IToo!-eoz0o^=*oRr1JrZcE9C@BrFc-Wp5-eas zSBL1@90*1^zJfW2ONi`vos;ap!EVJ*dw77OJhdG{@@d`beP zA{R{XZcNt)TcIua(F%FRKtEgnOE6b9U?d81A;L#2<{Ji~{<|Ef1Lkp~1cLJzC1MD4HsyzBN zQON?kVuiT}H3iDleW2Tds9>E%dijuWMBvk*(lJ^TD99wq+qz7%Dy1;`(!h$L%BZ)X zFk*C!!FIP`;DALU-#}HkK6q^mvV-Z-y18W(mjOW=f{^hFh(f-|F1&w=g)Lnzn*(!A zY9fDK?7osY8P@)z$hu$@JC)s*H|B1Ee>WzX6PNU?mIWqnEc$US&g38){8($oCHebx zQ5z5TpZ|5SenZHf%{!7r_61q`x=Bsxi<_86z_gOqI0C)Mf*~)w3-7vY@M0mfYSFVC zpO&h1snCgi7?9nYxEnFAR`x z%Da~N65GBl6Pq|xrP+(HtRC}SM2sN(9&|p#^;Vxc$=rP)2^G>;t)XwOF#+7Pi3xMS zM4jhtPGMAxa4%rU@c@`*?2+`Qxa(?#CY!}Ibi`Rh*)!>e7>YV`I~RTDOIHlV2FDfY za(+>eiK$Ma$WGiqG{vNb{Kzk3o-~6UFE-~;WA$D@nIjTW?AfQ$oe9!hHR~1 zc=0()Bd?*@m}d)m8Jmvc4B>^V2@%FR%#O51>tnnI&I5@r$tSUY)vOi%jTy@i*%XGQ zU27(sG>IJ~){EbRJ3TWGC?<{`4Jq-_1z|~tFnJ<(N=_W-YCJ5^_w2m$1(MNrUt_u( zo$L|mT)u!P6lEeZX86d&W~JIfJkEE5cuwj0<6Mf>{4+yCu1rWP%u@Rw4jb@&!I02Q zv8Ow`kFa9YjDmB*p%gLH0ibpjaUZRV$+^+$>*NK}n^x$5CJhwFnCb1r6csRUUT!S# z%v_{YQm}OMR@j8V4SxH%Sc>w+3|VLlk@lp*yT(d1O0ZUG5ikz~Ey7TjVG9yn zkc}#ue6Mgc#M9kw8sY_H_`GzYT5naerN+RPeua=zpC46X%f>a$sN6U_MB5S>Srnc! z^J8)F$@eQ`0?`Yst0jod58xgeXUgu^nRU`zfPF)go^4~?C#}>`@D%sLgjYnwUEmEL z7g=?P5eH%9`>FS7sDa*yy;bW$<{=-eSp~DV7EgPLaHbu@k8*1|>R)o7EhL#>ysx=6 zke^rN8P&_8p31opT;EA1Or%$x+FdVqug}h818}46Ipc`8sVS+%AbO&85(tkOcuz5q z?OWwrp6L{_31WQH$9$pm^k6s989tze+A9Wc^$i6T(m#e8U6PwqaEX@t?(*F(mvh>v zd9`p9^8%h+GkVTN#|kJFs5Q1L`5!OQ{H#O1?^;GTt9D`Y2WB zzF3HgxineFEeIv=vTRS+GAU1F?o9H{DbB60DCPQRbDs64OS%5+pr{99B6@@JTm!ya zg-HUIz99!#rilaQQ>X{ONNuTlxaF3Z1gPZB<+*$88Pa*UVp~kAh=*D>`Z+#h2!v zNjx+^`X&00m+Ve@1$w2tEg#|QW)-;4w{Um&?|P|~IQq=qlY4cdN^yvKKd^ydYZ+Sv zY(7cazzF<|8?v~Bp5yLz;()+HziAZCHpod!%RImikWY9FM|w>>bFViV!#<3TYc$QG zQGDDm!9x~Rk`#~LTEwQ-uJTm3MoVwSyz;rMwQM~ca8Izi4vt`(hx4~J_ueH`!hd9T zucj3T-!+*)eUfChiY}A&771G-H_S34;&d|)ZcjUlM#sTino-Dv-KUPEV^4)NKM|c+ z1*N@PF<_Bv#gfYZ*BC}tbx`VO1%YYy|%$^14 z&{i4?VK_9qg=Uv3oFn>?HD*m#43TQMiEu||({^SF>-#})54j}^k0i&QKV%$Jedc&o z89#ayQnRJPcU0*7L*-04r)sz?9lw9RMWp>^6dPz5%?%Tv_OeSxyEXECv(&y+z~*z~ z$vxEcftYJ`bLKOyZ0mhHhQ5EBMeDc{o&J*X@(}B4Fz3YR@P6Nu4=m?aM+P4R7~351 zLWR%>g8au==%A$3k-Y`G0jAR{xCUOg^K|ZxiN*Q>2;!m=N{-2wb_#@MHzngK_Z@CO*Ol35l`TA@8;SM0W*r0J;31 zJBRIL?ugx~kYTe(bae%wPSk;TI=rhtqSSQ%o3X)Wq~V@C)5RB@==Tg{-+@#E^kKPW z5)?r9wRD&e>>s?(tfL6yYg6LpH@>)^;}7s0~G+I$|UJb6}+DRH;eP=<`bZ{hYU> z?)OV{SAw3tX#?0Ne_Gy9zuWjZwWJD^>w|Z@ypG0?W8S!BEqyD|6ebFPBdYl1xgLst zOx+B?w+p}v!j1sY8u20ah4Is#Y(M1N2=GUBamradQ{N|w=!Ghg#i8zne1?ichNI|_A)Ce1C}F_pzBz>tmo&+`Nt!RhNaOx} zg6Gq|7`YTiVc|hT(Kh#Ub(4}T4iAn0<%O2%Iu-4S3R{faTosl!s^DN+KgbTQ;Dc~* z3>fpiY}-Gz{hjwS#qyka_Arp+=!Zt{IPe;-@Y7J-fcNVx8C6J z%io%rU(;5xX!wy@$qR{aK)!JNTZ2F49MAugE&BpXUo8`LHj3yvbqmO-Z+5`XB>tb| z+x{ogZa7}1q}tdt-qggTo#L zDs1LN79$5$kh-cUq={LwgNNBwYB|j=f>$I31B7fLduIA55Di@{S=_Gcq-2p z6M4KJkHswtnu4RQufi_}e0=w4UJJ`+ONPa|)e3CWa9K6r_>@6#0;>p=g5%02G>u1j z-sSN#EC-i4%YMA?5Lsd;;)lrM9@2R)4&t^%nn+?r)r-0EV@qG*W3?Kk_-QC59C@gy zO~`YO#JmZ9Y}>wlJC9-+*X!AvUhReX?xyi#DePi@I_Qg5v5_Z`Bek)n;1!PY?|B`7 zIT5Nd?O8^Neo1)Kg2eMulBe)rJRJNE2-+CRJr3{6*5r5r&bhXZt45p_=8y@-`vO zZmO{x9Rv-6ZF3SqeFd>a7J4FNI>$jTTOSb3Bt3S%ySuex&odXy$&K{&4%%tg`w2l> zdzs}yx-KIbTk1iHbsbl>!WO^m{u)~L!R>#biC%H zA?AJsE?<*tLPR*i=T`cL2eof;o~lkobR`M!H?5mT5Ouyh8@F7P{;AAOL(5qjv>W7g z0r5O>>L~f46<1T5>E1h%k^3rGs&omvoy5NFo}eP39#@pYEa7exw$NKPSnj|{Qo;(i zV1gMhhQ_6{%)me`1r=0$Jse|jH^Q5DdL(lvPIz|Cve|3rHc7i^m|k9*s9*zxb8`36 zIif&*taabqRuy0jxeW(nrG)8f@YU8#kcX~#TZ13lf=bDGv_gRO-E_N5@roV5GTxDM z*nRc0YSpjkHvGZPA-v|O+%xin*6@8)Jm&yfcA(Mz=OJ-w@O#@3BUFkx zFx3p+9FY}>in@S#wvBe5dFU)o;g=Z8{~Q{GxA8?o1tRbw*LbWOGQw9n*q<%#A<;xJ zGF55d7Y%MDa2=5 zMJvzGy}R}nG!Mq*F0y*5*`mOQfL5g;1G)Kw85VL+b>DRf@O}jh{&sfV1!|rNoW+2@ z5>?Guh6JYg#6K+WRU&Cw;8pETAIPQZ&4b;e)_vUA(b{Yis;L)nW%2ddVZ}$}x>nxl zqr;kWqAu~A<;ch6m9U3&jxaw5zDBumhxsVoE;@+c(D+r$agcck1m6w|AN;TD1G16^Sq5KsO^m zzYU)^7m2unS@VfwUSf>%mgMpSFhE=pCDrgp+*)h3(3NniNLen(R9HGx8Y+qHO)FR819L1XD3+a zGRhxwy-0%(5eA8Yfd`#h2l=5bie`PWZ--}^5{L@*I-3dic`3UCu2~96QTW`^Y?3i1 zN;x_o%t__wIwQB2aQPe&^0M-+Qr|^csmh-AJ=|@6X)x!JwYGlnTuYYKp7?>Ni-sK* z+~syC3s;>JE}$kv7ocozc?11yx_OgS^D4)a#tJj?-*kzR2k%FbauN$j?cFV9x8JsA z(FqYB%L_N}xY=cfMmL&u2%?T)nmzde?vT{5YYis!mKLcG7dG<|aoehC3Y$MJ_guH@jUK(e()oPhzgvu(l+LndvXm{raEAK_` zy}QyYV*M_)Wf&vbZx8F^AWo9=^&S$9`)Wk-(SzuSH}J#j#h4q}EFtV(T9^QTHya1US~WMbWo=80B>g2)KPW=Lt9Hwr}FHu%7;fu`t!!+0-T+Q!~&EzNyVdZuB_ZE z?i&a#bL0bTUPg_y8u$`Y-g9HQbbt?gvGH#xYlFk@_=mQHe_+Vd?7srNe?Y(A5g&IR zHZM^$Z~P~a_9tx1tzUKvkvSKjoW$di`yl=??PY&!_B$Bcr6>JLsT$lq8@K0g4V3V2 zNseyTxj%xCx2Ttl<~gVJIiP6uKK{h+Z*`#7nE$^BWByOD>Tj`7tnmWBf`tK4m6%3n zCh${0!d>JFl`mWW*a{{a{~35WDnG41uG|VL+3jxQiX~h%@tY)C36k#$Z(}=pkNfD9 z?`GdYMJfDmzJzGc>Abd3EcBGosPtX9f~N&Fq#CF? zko}APyl~Pnd<@AU^+#Qwvz{V>pl}tHcLz3$`OEdJulC=0U<=TF4cnFG>`K`2*(^Ie z)%0<>NzoC-;P-a&@~=&Fc{EA?@q-s1Ia#g=6$m@P3e8YKv+4cQ&)GPo5?0{*Zj&tNfr?mT~lpcb8f6la?-V!E=;WU8euqz~F1VhL{Z$T0;z)cqS0X%z}EE zr-HqE)uD+soapX3k{*_CJ^2c!KMi}DzaS~mQO3CSmFSkxXn$_+RmR$(bCaMnMd-4W zj^0nu>ss+v;UD+RdUdPjen^ge>Y{cTEa4XY7ohJhrL&~T7a06;qa#rs&&Xx ziiRGvV8`D)dEKOt&lW1zlb2K5g^IDM8+WP(u5_-Qxk;zqcKVhZti7bcsk1hy|Bc=G zQ(j>wwVkIp==2w7{vYoBA6|VUt{ta1m#iyq-UR>t@6DFXKuYFJfn@sL&04)@e{WFR zz9c8<#)&_&Q&i;lNNqS!QKn+@Y!E#^?OPq>s_cJ1zvVwN41dqGp>)%SqZBA9%cv&$ zL;eojl5tSE6>vs*Xb6vLl~&;!rb9Ush0?%Nshvm7DK{w=faMI* zO^Tj0o$DT_RUs@IRrS%!~32N-*pBfS{7@@ z!r^xGGEo!eR39GiWtO3to=qRK{+z!0nS3#ln&f$B@q8oEhxeq1n`K~m#nb9urk;}9 zz}qh=;6A?#s!+vLQ!zv>YaF^~+9_QAHP4I-ijk+4Y+j2yJB}+^G3)qMWU!@0mTF;V zbRiTrcO!=lH&U8pVpUrj!1IINo1k4WHNC+zc}UEQbcSl7seBGW5fuclKq)@nyJ`6A z<-&H}>|0yvBVQ~2fylhfQl-ReqH6MV=#@^$fvRY3>S;NrF?LlK(YH}VQ7-FDAu0wP z@!Hhv@rURVb+Jc=-h+gw+fTO4iRd}2PGG}kOA}x4B(3tH&d;j3pIu_mza{(LGZP&g zeW^5y=bAWY4g^p~M-Z>6-D*O&(;lD&q6R%>0n5iCDLu1+AqHmVL)TvZC4h~C+Ld8- zNBrG#a3e^?(!5iP+VVfq9zK5Y8wUyYt9nsgCdy!U#&4JGX%AKyQ67MoW~l)uXxnPK+tYQ|j8sLMj7aoa2YGv1(Wt1x@D@-#kGmCfAR zxcPVEa8|RZ?)aH~2OhuJ&GOTD3(Yr}kGJS@zWVt}hr#Cq52JuLM=u2cIhIQ3gwAtk z{Kg(lCD*RdMUPMDp@&rRWlx;6lw%)<%b`n|y|Q_-h{{jTU!Sm3NzurtiQRa-ng3B$o03 z+d`CH$(8c>=-2OiY61$D+yzfU;ABt4VMOM;Q{WB7LGuP&Cuj*}3z4?P(h8>^Il(uo zX0=8}XX-M30$yMf!$}O`RK;$Zf$+LZ@sfk+Q<&R^1$e59HID@AdNjZk&U6-p_<1#| zN!-!*DZ?3wP2rQoN6t-EKgl$&_n0G%YtgfLXX*M4)3#Jy+DLQ-9Cda{PBVBsU+t`! zm*x?F-F@mip>hzxBgH&!Hd?F{6yyufV6NrPdu3+Pi4qD3KeHnxlh3dy9tf{iJXI^9 z9NUfC-2=PREf`Htr!xdZ4LRXDXr;=RhnqIhj9JwUkQTrX=>FkeY(GUj)_Og}k}( z!_8p6IW-^FJ!yyaNBtOl7kG2C=i+tc7@x+Ur5i)#j_`h{2LO4=&saV~ic*!i!i`2c zUYgV1iuwr@*TLnhLbs}1-?-!&)+;An>-xmGulE$&PvZgX)~{JH^5))vHREb?B+oT= z!Iyy?L->`P_3^X)A`JmDHMH>AmJ>j_r{xt&tT`i1JzsESn-ceTdyFsF9T(NFin#ed zA$>?f;x45h@NH+|-_Fy{JU0#rp<+#y;V6ThDi=#idVg~D$cDKUPRY%Rb${t#~!n^Fy% zpkGn~%Qu4GE;MgxCD+NPwGkXIgs1x!qa^7LXqdP11pnlv)c*I>MVd}1T~bi(17}}) zeWw!tCuZu8#jJgK3H4O0%*h{Bs;@B%s84`hd+kQfYv8bpz#DoKGbNdNMYc?3DdSc? zi&8w`kVJwnN z$+dd|kZ(&?%gB~vNnVl*vgfW}sbxycYmu7M#@0C*l2SgnEQYS6b5ym;!#0VInHX*n z-xK&x(JPN6o?VZ^x+y0e%J7xadsbcuY=5%(&^>u3QRxQk7a7coI*58bPkoD>r9MR$ zg)%JTUgeVH^qe*|t*ZIknh#WU&MksdYxY9<#~z&xS+C4kAy$DXQ%m^2+6b4T_G*s5 z`G=DWB{`q~r6ZMm0=N?B@HMjgojy$}J8YHar4|@{lZx|!td`YRs;GRqxL^y3xNoFp zj(!CI6uf@~HosM4KN+|4sNwt*f#5twN(kCR{Y`(ahXY-7?Vu(3KBmV^R^O9r_XQyH z>~nCB9t3wKX{Yc8ldKeDX!0%@tXR3A>llIpi70yX&g#Wo#Qt!tcabGyl&PMV)TkZ@ z)~+%p6CsRm#)Yg?%V0mjXez6$LZo z_d-4S&lFbdftiqAyRv;8Cd^bY^f6ec33kVT(@S2Fw)P6?QQiI4)&R)(=b`2)4&OjY z3B|O$vBVyk_u-xxEbPZchZcq_ian>v)0vF09reppF6z1D0CXPD-gzy_Sy{bZX|hME z`wE|A*p+MaUvbudT>!0rPdO|uQPl!Jcwr1j17m;P9XWtWKTkiHqf#;-aJtp^Cz}`w ztS=g4#z|K^Y>F@rGx3z@QrcIlWHz~u({0<|T`q|^&Fntzi9iSE!+u^pYwnneFzr3g z8Oo5tLeW6FEdkIO|Ab*)bOh7t>!-8|(_vlOK_g0Lsz!88*!cpKr}q6)%?;=M7V(Gc zQ52K!Slj=?_xwvM@HfinUzOtg18FK#6w>;5!%B$A<{tSLgL9m=S=mZV{~`tRuzmh$ z*<6K;1z_R|i|&0Z_TacqYR^_=ly|P34$p8l|G>6UtT6hP*+DEZH}ZPneByu49Qj8q zgK$b=PgT$j{y_`<<;5TIh=*f0s`Poon7;nl)X%MVw zuH%xGpQp}I>9A(#%hH_ zmtF?#zl}XZAIuF!Cv7sjJFT_Xi;!F%Onam5Mfs3oR;1Y?5*ZLih)`X18z2al_A^FU zyglKCF-SOaoLTvL?5jK)_PcpeiOzvoC+t@<|Kj^u88hf#VE0ZAr1zM=n3fXP7Hb9! z+_lFWChZ%W`B4cxld=nLgWGClT{yky2NuXmN;ETDo4^Zx3`PyH^zlo!<&yNE7=5rD zcuYo@Hf{xa`s?lq>SwI&Ij23PZ&9e#?rJ5HdFG7JK6%Q%TLPW?^7Yw4#VB`l@hGf6 z90Qt->x~ILY1Hc#6s=|Bc9RvY&;3s2R&KZAXG&c3!>IaL;~9!U%vr|Rye%7c=!xJ$ z{4gUxTnV)zpUP4Epd911Vlje&+rqfqkkh8He}YWC%RWUY-8>$h5nlX^M{WsQrt$%P zSjpMquHx17&3qR9lil6uYR_n6sLz zWoJfs;sYh*a>Cfx>}VKe$y6ohv`tp_(g^!KP*)*j#pfK-zONswi0QtB7Cx9#=D>a6P*V=EX@)YgGM2f;3mao-6wUn+$ zjh3$ke~U-qSPZ%eWr@5At$$AB`%8@2H%p#~R^U8#ev?OXktfKdY028N0onI;fBIXq zrATz<$X&?5P4jA9VEeAWHTW|G@zUkb0@fMxW@S2K;HWeJdpR0N{#J(>w?+H^yae_y z%KUc|@n;?F2c}pi3rjJt$L#jVE@@N}{8|FNN3{J;b6i0zFJEyz&LQxP=w$?Jhnj z_GBRcEOlk1edR>q>RA!@l7Jw5w^Jc!X2}eEF8=KXnRUG2A&jh6oqLkKPL5*6Mwzf+GE@?7kJ*-gs2?)Zmg1pns+V9}~yY!M|8F*%u33##Sc z!RNv+`SdQJy7&WInR3x&3kfkW8MJ?fQC+NUVGR5<p|GH<_zBdXn(MwdG+h*w%(UR&0; z2&Q^7e6pU5xhzhrB!_yh%i8iP?%lj)lJ0^YFFMl5EAwJ}xr9}o1kt&v zkGW^;w|UwV6`7;BOrMN(W;R_W=Z_@G)?Z56N7gB2tzr|&?oq58Or;jCiG=;bC}Q)t$H?rS2e2zvdOyqei~ z4rfgr`GvA9+9SRA%?;ewgLvqK;JE-elN7#1+;>M_CR4O#9BCfVEHn?4GEOu{pGV;;t?S=+tS_7^z&r`CG9LBcD-RCT?ZAwBQaKwzy z;_6j=O)3xKgb&bfFOMy>%^{DvE!iL(S5S zw!uE)grCM7HlQ(+F3|j|eKcxJpA<4ZJlM}f?tiYnvhMZc+FkqSn%0nVDHX0P8HjIF!50hiI}8t|g1fu5!fwP5D4FrwQ}{zcKMOZ3Icg`T4ZO)=rPVP+zUJO?igdkl7A z`$Wv#TNEhE>E17ZaJcJhhqyt3zR4|B#U}RtlU(a9oC5EvMy}Jkd)1#>t7<7}c>H_i zQHcy3=8!tjF7%I!C?@`Wa42gsy{$ELVANtFv%7DEbT*?;+-(Sb7nI^%;5VIz%eC%h zTx9IoDa>JT#LAQAF;vXil*G3zSuYkOjP?(1Q{_gG>*4Dp!pn}@#w}Q7MII?a0DR3E z_q?+KqzCP5Buu#f0M}M1rai^lYiZ&|zUf2XE57Q*9<6l^eSYv~d>5}0(KhITByTIT z2{+`);Rv`4*r`kr$G`qmzZ-&Yjm#Fw^Ls7dmThQ;zhd5DNIqCa&C$m>YHzP2eiUmw zjo@3|n%J?)k;d(98GZyyMmN{w?T+)UY%gnl^48`d6kiVO?pThXf83GS*#~%oGOXX( zs73Pb$1N!9J$7i&9XZm^9I7?s@H*clyQnc_r1QXy)*ystYeCUy1uRtYN;)g!!(qy5 zY>+V3OoJGia$)Q@i-n3Q1}$nj4&{}k#%$eQRpv2=*gs#SEU_!WMv^Pb&NaJ3fddjD zZE8%e#d(gLWc7a<+T}|u!uPtjy5E`RfVG<-+*kBK#ZhT#OL%cbqOvYH^CYL87|(YA zVtKs&ayv_h0VIe)*u&jlMcEOX3-%g?Yls$~hz^{XbB(~bHsOehdee#qaTd5r=d5;M z_D4a|P~TjmtWeOPo^J|L=E}swCx-}i-C2GEtGQ!iy6uitAfUx1~Y1;F>%*wcQ+7Z79aIrsA53#@T3+H?pXY>C}{Xfbj~JrAGf6 z5ibO<3*wlMxfdpDHASwWahabvuitHe(}L?>9Wu{pNoEdd=kcjTAty_c@qb5s>Eq_$ z|Ju`E>Eq?1m@B}ta`M2>_xuO}YO(i~`X14vvqFBaxAM^>sa=D!|H<%M_OW4jjMj}_ zT+pdCsIpqZydD~b`i~1p^ZqX^ASFjycW{qzQD3%`J#qjc%~LC%cWwYximI5`%zwn( z`E0hQ=T6NbP&BNx@o3=Lgr>Oz%{t#*&Y0j_!3D#6WpNN;GgChc(?sfJ7Ic))%&bC< zSLcZ%2f(cyaQ#E#!BO{9pAy3}1BwHy!-o`jVjKkP$a$6&=hMWDd6nqMG@aV+E3f=q zoE&`w?(Cf)5&SG;Qi0`9i`jFhBMb?NGD3olB^3m0BG|Tb&Kv3(LVL2cBDFC-ib{W! zhuCF(eTZdR{~n6ZbalvNAg+c0%^0dQ7oV9Y{ainScE`nzf@`EOBuEQ!ZWRY#8$!>) zIL8f(iwk_BW13#oS3Y%w=95;)pmp6P(9+s=M%9i}?-}nG&LZJci^49^!6N@a@IBE! zhTW7v^<#HD(`_`$G4zFr`Q;ETyqz}9*4rTw9>{F6rkfH?M9d}%kp$gCHHR*N|2wL( zz(G}Bl^rV@F>8K%q<#`YhpoAEWJ~bw>H70z0>dYx^$|NL-t1ED^MMKjbI&G{DiQw5 z+^zglj}HR0+BdzB@W*b>KdIJRO|avV4)Hrsy}At)Ms5_)P0z4alECY7{4y@XOm`uc^51Jx@^%q|s% zfNM+_luNC3>0}gO4w#RixbuEQPulq$lbZSrt>T=d`9H=%hWgYI0Dy0t%lfh06fJ~5 zWn)dRN#POm*4HhETlc2EU-!IEhBR>w;q(I6YA}7{is+}? zadEO|5%mNiI6gvJ2Y)n5MjCqH?T`t#BZ_CDe8C-pP@167{D_5HI1Itjhm=3VKJiiW zL@n2@NM){s;^$jesIeCto*cFjW%+h~?El4ogH}(m% ziebi|?O0yY#R=E;!kiFQXi!dP%%f)0k>GY{VBrBqJ#oz%zHZWhljNWW^9)Pzp&Nf3 z2vGVa4T*LvKn^=mS!zq)Ja%Af!234@;>6j0Ol{&FTz+q!?N-S)s)g$_&Uv)+$L?WY zTdCh<5%kih0Op=PWO1Yydslqqxa6!A1f5Uso3FVKK6p}VJ;o%w9AfJBh5ORXl4Br@H-Mj6{dH(e)6pc-t+mP*i z8xJTYSkp-Zv|XW1BVsv(%-s2?%?QH7djARsk-V$5%TK2&cpY?D6~&m#7kZW+q7zG@ z3DA&|B*PaYQHh^%p$0vqo9V+R{y=ofSWxVv{#7fJ6P?hS@~i>bRzVbbBf=v4bameH zkwLcsS_Q0Ht@wwTjml(!_M4l@#$f4!RGOAgPyp z@l@d`^JVYC=&W<>D)nO_DVOubJ}$^#U~CARDB+ weP#8*fBpMe-yjeEvmfF5KPp615h29{oLCsBkp+R52n|QOQ^$&JFaG+!0GPPht^fc4 literal 0 HcmV?d00001