From 5f925fde15fb22e303ff5675b09d095d3a55f29e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Budy=C5=9B?= Date: Mon, 17 Jan 2022 21:38:00 +0100 Subject: [PATCH] Initial commit --- .gitignore | 140 ++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + assets/crop.png | Bin 0 -> 50806 bytes manga_ocr/__init__.py | 1 + manga_ocr/ocr.py | 55 +++++++++++++++++ manga_ocr/run.py | 96 +++++++++++++++++++++++++++++ requirements.txt | 8 +++ 7 files changed, 301 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/crop.png create mode 100644 manga_ocr/__init__.py create mode 100644 manga_ocr/ocr.py create mode 100644 manga_ocr/run.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24b8140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,140 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..30404ce --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/assets/crop.png b/assets/crop.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ba3a3a3b9e64ea196c421f8b947702e7dcffe0 GIT binary patch literal 50806 zcmafaWmH>j&~2chSaG)&DDDM{TXA;{?v&u}?ruSgTX798#arB63KVy@0yll{_uaqu zN7l+ZE9Ye9*<*WVPNcG;6dDRK3IG5=laUrz1pwekVIM9e*abl9cPASFfE*wr{zcsb z?zm^qxn#kYX8*~39A_QS@w4s?A7Ec{fAyGDT1DL`RXVD^s7}z-yW3{&FZGjgdCBn3 z#c0c)I<5M8>Zl}XE{S^QH~?{edm=IK8+)%_-n#-`R%jFb)ar6g8w(O8FzhJ&*1yG7=ivVjsK`TF2B8aB|sE|a+0piM( z{iT!2^Kkt*CLgV+0dQCWm_3%12ml$mDAk~NWI)fJ2=;4~XrvJtMPsTmfSFu2^7jU1 zgi=BQkQ^>36%(d6IVRR$)W*pmYzmKZ^2SumfT9Rh%6r_Pdtg2g(BqniBm$ts{L2UrQu+6&(6{yIx#Y+q z;sDGLq!+Sz?I_JWs4^(xpN`Jta7a1i$U&G`fc_!zKq?>*j+*jb5D7ELKNLugSsh&2 z#|M%VprAy-?4b?0$4#QVPycPIM@tEij(|Oji%UHYTU#{+Qwa&C-xolTE7g~O&w`;9 zff)iI2U6a5B8i@dIFN~liHm2iBs7y2vU(nhQm5X{>k?Pgjxki(55{) zN2c&&m4ji6L{U|Y4JQ+!8Z;p)2PhDM2f}OzUgW$L^TS5~JY^8AG=MUX8VLU-^7q|G z0GtSzNrIjlNC)@=JDq6|4+>@i5P=eQXnr3+aw3t~L6{)92yBP!2+eyYu98B4wy6kQ zil#O#3<5-Cn1Yx{K&6Bb5#YQs5Wa^mr~uea0EZ-E3OhrbE^3QmQ3qhoCndz^hj3z2!v|1_Bg=-sj2lQE0Lc5CLJRX3ROWv&B2iF!1i@s1 zBflq=hQR`a4

{at@S${XztQEqm^b8S)!h^*jWS2Zc!kKmyc-QOW|~F|q!02mssy z9A$61EL@Sm7g1nt=zJ1xF)+10&O;RD9f(05qUXT6I4W^+@~;Cb7xazFM(T8bDEZ3Nhl3-KQNa>NB}vGL1qivJjUfd(**Tf$s-H=~ zj6Rh(fS`#$Dsd4IPSzqJ5@0HB-iS0TU$&)|h6{J-O0P;B`2{VA{DnJk^lrVCt3$KP zbRp1I!>*P+E!NbO9t0d59ON06sF=Nz$`_AN!VEAXW5!kR`|4)0M0G^Wtx3nm zFp4&TnDl)~Ir$b!DIyX=4iuGx%OmGhZq!V%;GE$=VQHv5c2-M?}fayUoit{$o;n6tJ5;Cntb%X3WT3T7Dt|<5@ z@BuVY@EW^`Z;4aku|E5554ZNr$uIP%kwF#h3f${4bxiZ27FLx|#ris5HGNRZWRxZy zRzV1rI4rQ$^=x@e6mN=}4|SO`6PMJwy>@m%L~MO6l;j{EQ}ghon3x+Q(5e8#Dkku4 z*nO@cw^N8(r_5BKT%pJ&w~;}F2IySVqJ>OdD6GoEthm%2PgK{13k zQjwqQ4jxo6nB|M6e;$ zpl&P>KRD1$n?SElg?{j>ZkJ8;fPa zbI8=+Nr>UyZuwo#{h^}N=;bz8xVwS4Ro{?*U9-^myHS2x5JccMi-C5f^=!3@~mSJY2NCR%iiJ=OAPk~;)}x2)-p4xDrz_t z*{P78fmg33(It`M^s7UqzdBkkkHUKT9LR{ZB6_PHkJkqZb)nM{{SsE>ijIzzL;M{} zVwFh@^_0q9x4Xr6h|cC!;fBZKi^VI#-Jc*hII8?YQIg1&2Y+`D$RGo3T=OIM|Ii7; zqy}s!#HmKVNn1Z1({Oq3Yg}6T$?;}ODxR{&>#Rb__UDhmEqd)YQi%~!(lP#Q8cFf3qs;T9B$tQmh634zACxb$8Yhwk_8sVu3+9yuNL`@gZVzj!{>h zS>HE%*Eaf<+~-RmS+hXGXb$hAAYpaqz$*VEW-^Ci}CB zo3U|SWd-^_yfBsFCqp#9+F!g3G@lW0oJi%Iofq@C>`rGB(SZ4KPrl3l0B(Un$(3VN z5aeiv=W|O8?5YVH4bc;NwNVOlEtc1{*og8IMt$?273D_9R7)n*4F4gq1r{*QtorU3Zw~3Qt|DB}C|k`$W1Z z8q04|k|Xf1@XL>Ga8|6pt^VoX9-WH)54{vuDq}GjruFvwab>+Jult8MGvmYCcJ2=~ z+Syiz*2#!4-=l5=ltLbz_@$1PU$IYaHU_*TryJ0Q9%r+^Tb)yn1Wovl>jwNS?(T0yNG8w( z3_eAA98BHF92M!_a;scV|33dyUS(CLD%<*Nu4n1Tcfk!_brl`k-S@%_{PkG>piHQb z({%Y}>9l!T?EWErxT%lT#pCL(+K;nVHRStciJ8dIpDI?Y>|0i{)tqs>kBsp(*Gluk z&Fw72jGC#`f+y6p6S;!?CY>luQaOaQJN;#0DX|}|5I|NZEnVVuRT~Wz?J89$vW zwchRSvkYI#xvGfp7Q$)-^%^r=hG#&G8tsKs?KcZrRZz5cY*UUAnpWex`Ns=?gC+Mr zE@045-(JnltZ$(p_x+3Y%6Oat*)qh7a_Y z^Rmu_sVhWXzlLlhM^EqD#M@-|4+O(2Ze$LRyEZc~7I2S#K6XYbyy&RcR6)8^la7tN zaUU7D=_RNjk*3*~q{14Si7xLATb9zQ78f&gbaWy+tA?7WwY5F|=2`k^ETr*s#Za1Z zldc`FJ>+u7Ub=VAvn@JSK=-Kq~CdYomG9PDwAV(1x^S5&O{<#pI@foC_G(_AA;lseX&@i#?qjpP<7cZv;rWE%si7q%?^FZ5`e}&iO=x@Z*O)26G1EJU1;be#7u#0#sPaMO_ zVMl0=XQ}m7ewrEqt3jrVTE=kssz`qI6Dk=V$6lCb8a}9No_O^Y^1PK3h9aDp+B=E3 zaK=il9l_LpK{z=wOWQl=sa9wHdi%(ZR~>UF;L%~izrh1-C?G$G#5fL$<&X&g7+N+vF7NJpFAGd>U z46YOZGS988yQkz|A!Aa2X*5@;ZW~9msqd0(DIw6sC`P60S9z2^>#0K{E`irX|4=)Z zL&sh(;fmp*!@%w9)^xBrb#0xZH4aHPUoq-c;L4=qJ@4M?L$n&Q0yi0J`D3*upY<;5 zI|5AtuFekgo0p8)X7q)&0qvd`!>+aFl$f-J0m8VwR=>6m_z_eN<9ataF$qH0n{oqu=8=&-hMsL08yA|E%}c-U&hmlDupc>Izc>Q7dh=3vDN)g?u# zU2HYN>H`#qzoKAux)59#YFk4kM6A7hyL|cT+I~3c-lVAiqVi#wyCev5@Xd~QZf;h) z+h^zTBs2vWwyYKNhA-yta&XPrr5-K!ly}dowH8rYsnn(U%?f*<>-!F0a}Q>$nzzHO z3yFAxgOd3gB)1>D=i6OQ`y34i9Bh7Tp80M5kd$YxRJblyOhdcAv%Q~rj?A1e1 z`qA;nqNH@8(#g7sQ{aA43F6Zhc6=Vh_F{O@nX?Uy)Kd#OmwTo@l| zbX>iQMh!-#%&g;ixA`E`4uV=PoJtN=E)_Lxp>;c3vapiXkZ!-4j|E`*z3{O2qeEM^Uge$ic*0%0_Z|b-jhMwDWfsR z75B0~?J<7hb))SKg|^(dt9fGxKyMqu4{V1xOrsqYv=lfUj|L%^S|c^Lajdv*&pWU@ z<9mNP(5_aen1^YaZ8h|^?eDC=5JS)KdDSK)*6?dF9rZFEIOd*F?2T_LvGBVn=|zDV zZ224c@Pk-H!$n9&r^D&7xTsW}ieFz`@I+&pr*`%}@0mdJShbMi85p;?fN6#SDVUA8 z(`EZqy)ya4kY`boXybJUdSNc7@CHFN5_{&c_rUjXeR8`#*!JctjKCl#0i;m{FHbvL zLkA#G<-abyv0Bau6%`;ZTL$hgLiOefwoiNA{vJ2!t%}_o&E|7F9v+6=&CVr9ga~rSQ?kJ+MnUg&7#m2vAxK= zF}t?5wr@qtKX;{)@2#6Wnx0uN?g<^Is1oyNa(LBBJDm{oW|l%HTl{n9`?|W%zLr7@ z>J$GG!(-!pb0FC9nI~i4dIJ=RO(Bbv1P?-WcQoQ{UEOeYriqTnoec9ju)@)?lQ=TP#x&iqQ0bC5BSp+MW7 zRiQdVV2?H`cQW2|a=b{nifdAGwDG*TUV*;=0Z z_yaX!zT2udm2E5E61>^>+BR}k4Ik-irjaLwm7`oIHnL9z*&eRHkAKKoXjxEaEofAQ zXQ4Iz`iRH6cHc9%#8%vEwq4D7y2f+c*$|)VT2jWB?O-_{av2w5T6_%N#FcFa$?aEi`En~qvV$KBJh;IK8J*4;75!ML^|ux2n8 z*z6sxYbgD#dtL1=wl8+4fOGpV%tW8!zs23}T2ZiR*pgT?PPa;7d|;`F4bS0I&N9_8 zK0efarUUalW(#IcL0<8F_oPn>{WBL0a#fAXJ^M=3F$bGpUbaN{BeBB2SgfcSvcTwp zyKkppNMS8|J*Idf^dQVuA3CT^DvrZ_b}Okn(>h0O*;j4ZL~pDv!p`k<5$+z9lnTGr z#QJ`z^L+aXBek*A| zFL`zob(S2@+!KO7@zEsqsj#R>;{6zXVbwpqoBz}GErZbgn3dB}9pr3d)a`lb&GMA& zl7sQ}E#mVCS6}gD9YQI4G1-uUg_Ne*$P6tyw}gY%hwRrcAEu$SFI#ymEUSJip1$rT zf3nx-3O+lot#^8pC?s@0_c3x9%aUZ*GnQ37btgQR8q6(fK$_z;Bev<9XkU58;O z^o{ZKez2^Gq2b&?X3llCKs*9F2_7q+SC7_=2KMjfyds6ZX#ge}&T*tbeVj26xsj4rP~$ ztR}bPD(y_7+=)Y3CdK&CJqEY;{-MI{Y%NKv&yR__D73;v=IlG*yR_svk`a>&>Y(;X z@6)|I<~%5&X-b8J_}4I%Z&p@TvROPR(b35xb%xHz!tc*3;-;ZT zrRmu%3*6~749?qgHY^RMPrHf!Eu|?xBH$r~f~l-Bckm z$XY7zC)WL*9v7qNszT}vHF7vBz&a`R>+PLF%yuS+)16Y_$nmszn~De~(gkPS|Iv<_ zDBPHB$$7i?d%mn0U-ztrxn-KBh61OMgDI!hl3`)g^A-ZXROArqM~NUoa=# z8?|>RaQ*A=V5o~e$ZYzy93 zD!hWpu-*Tm^9d{wHH{v9PRbk+&7d)(mnFkj-OS0xMMA~j<>X>%F0$d=_!~zwB_S^& zfz!g)&hO>ox6x~Tc!1Z{g%~2SymG?j+zW~2hd=DLQieZP(!%iPs=1YHs;~)p9*A_a zYYQNB5~!Vv{?CP3rYP;5F>Y4EKfe%RPr*-Y6+ttWYVt5bYf`1*K1Xv3l zJa+secyw82eb&U+`758DZP2VggD;UvgRWdq}13{ zEXv6SGdg*)sb%^q3mmVhC!To0pdrK=3#+s&Xfy{TaWSLnT2OSm9kv{Nxv+<>1Y%+7 zP#P0OkG9aV=1$OHgdkBo@t3@UM(c2><^xT;fYxO7!eaj0(yIZhp(EOriY+=f_RZP8 z_pgh$DY#W1HF5inMSq7ybNj8^St$6p9YP zGSJ>(iI-3te;o}8M(*R5TmGjyMXSu8(xkvd#rDY@_K$nxhJ=X7%v@{Ax@8Sn-G@2t zpE>PQj`)T}2SOw4%5VBNpARAvDeTXh+BpA<7!e5}r>{#(-W=o--en5jAO?bJ!E{ER zh$_0ky6X{Y0_BINE>|BhUS{SiIj!y??s!hx==nKWa)x1If7|0#;oAu5tH45~W*Sr+ z4(H^LeSOf0X5#Pp&9uazJG+XCGFk8md%(hz|Axd}uFC*!vF(>>2GY*I4og%TxNlXM z6!#dj2x?yUA5~e(PlPT^`tDCS+)J;#o*HN|KI=wd7l+a?n59{0^@)p_^FfmGUKa?w z32+z+7)NcaSM;+P?RELRuX;Kz7)FxNQ^w<1hZLPgdJ0ReOKP6`J3Or9sQ*)vE+NG0 z{I>XomjsWp=%_vSt5V#{?zp@`B%V}c?C-YfF$Bl@mq~7Pby^|Rs$7H#!8uSx z5T1tqsWtM|V0O3n=?Mi2L-X-dZ}qOYquqVaWMAU$0{U#*19-!Cwxg<{uyb5(GETg% z^XATU1>Mh4t%q)B5rB*vJ|R516cTJi?bP4YImz-yxck~F5s%rsTl=ZyY`RY))!pad zeEcv1#28%-^BmPz)8Rt*@wN2Y$+AP{ z_Ph5sni&4RzGhs_7fU#Z6$BHnw)PUs8yCf$BR#HM}eqF}Hz(rt&iNs3e!b-HezlW>E=TRGQxl=GWxottbK871^yF@CFN8{_q;F+^&?nWWNy)9YJLa2PI^XxUlu9i& zJ}XPhq#1wFS5l42-Vkan#xCNK!>H~`ei>KWQIuCvj-#(+Hhei{23Kkgeoj_*9D?;F z!kSq+UVrpEmQU&H>x(^U{}!H3>n5LzA5E7(_^J)Rk#q`MatW{LWHlB@2_I%b|+h-*AqeN$Ym^WmYv=b&Ai5BNJ-;+t&~r-PW;rpKD9X^O~F=GT7BE zV31W$qq)9%lJl~x#Shh_BoA@4dzpT1%Ny1|{NG&wA`;P0(=tOYzE}O4MD4D-M(S^U=p^h(qdjUZPW2f3>rs{r!J=H6oxfWYJ^y1&Z;g zg{_O;Ih%d@bUM)b?cjcJh75vmKfIeJdHRl3ooqR2SiQKjtl~NOBZjr%q6Y6x{*&s~ z>hqF<;Yzk_%T?#z%Y$E~kAkCozTHMy%^}BLwPKW^+jR}sYL|;ezl`SlhpXVOLP9l3 zVbalgvULNURF}{&c(XkgpF7ES5IQL?+$wkfE9vB1vd8_)Djlg7bib0PP_Y$`L@Lg} z7B*l1a^<;JifjkknpI!rr_0l*twm_F=B;Zp>))-xkQu-GhwPmCH}?9+hKe@+UUwz$ zVu;#Zyp5>mybc%hOYUEEw_#~b_g}YDCJ^ao3mx)U8GqXPho6w<_nu$F+pg9smP{5O z#%63YNL7ClS>Db=85tGOZusNuE((g5BD~=o8 zPWkCb&8W(+f-g5=`O(5>9CkaK!Zqz~H^VJeCjt-Fx^yz(#xLVa?~54An@-n2$yBCR zp~u%tua3cdb&l~IJawa^FWh&Qs;AdbXUoBvp93JqZkw~CaFQ8(lvF@4#OGLxrtJC; zWW^WFzh2lJ|4De%)vk=}^#SS#J-I*9uNFOvXNh528chuwE^YP^R&FmM^fqxC{CH_|r+hR<2|EJk`m-qB$DqQY6tKO!O zQOj>?PFb$z^d>s_KiAlkp79z!oD4^EKN5HQvY8T`z8o%}7gVjztG7CN6T6aych7dX zJR>%v`fc}UsqVoT`5+o%e9k&yn+83U-RXv4q+L}FFWlX>Dg>%b`LNXB?<}@jKd&}^ zlTV}uJp;F^EstIs2=hZE*R7bVySH2Qq2_j!JKi92cval(?>tVfMol|VyNN%vPlXCZ z*RNZTA?sdSvHCfZ6BrZmOhnnT9@UCP!DVxc{kE*R>kB^~dcbE3FS+6W;6{eWgw4D6 z`!AnSyZ7nUPXt~}NS^$BzS=09J!8;v7o$j*177Z>_E>~84NT6m!mUTHCv~4~{Oh*d zl>EmSNi0ifM{eyHbUR#kRwrfGZG3NkG}ZaHVA%pWEl_hhVxR+gQd zuFoB7*?xBz5^i&9KFx~UU}`$$?Fdwk$q(MS^7qyMdwC-DXLz#Xmy2&}g8=`%m5YnO z5nY4{P-AIYT~~jp)?Cb#2sR6L%&rtXZSPoJ^fckv^1&=OV{^SqbKmW(k}_P<*zNay z_3?99!V*oH9|qP@gSvelm6Pc!*B`%Lvfja3XxP|53IG}CMhqT4apn_{gsxQ>|YyxrdhUVqK*nFWu zK~6P8RW=+<@Uolfsy3E=obgk~fBPl19?~`SFlX|vSfa9Si%K;^ey8b;zHS91wtuE5 z6hw5=ZOZ4~q_skqP-L1KR`dFJ+OgoYzat2-b9t@0@{R5a38So47R|enD@Ff2fREu< zY_JsgUmYC+NT6%y`6T4?I=`LQ_OzJRB`QOQC zb%>N|bh6LaTqI~Z?`}$@wEQxJ+q#`^)_SatoDWu-DvG%xx0ZKa9idj=)X@mw)AF@6 zQX|slqa>#i0#re$z-6%i>F?XNl&DPx6MbW2FZm`;4QeYBN1{skHQ%#as?6NSt2OBnXg+#>(g_^ zNMQNuqPlJ(+eqSwk+F?k72$#lsc#oYC!foa-qrx~Lr(Mjt)Qz%LwLaH@OkKmHME1z zt{*(B$6~cCBulg;&*G{PCUe9cFiEyk$|$i9hE4sae6D)E5A4Y*zjd#2B=M#Ask>En z^3fZgUi!Bu#Y5bP%2R+Ykk1qn^fgS`Zd>Gr?>?Hwc)(`wjdffn{gWmV!NwHrmEe&^ zY}FLBG}^OotsL}YN}U}wgWPYrh5Rk&FOthrz_F3NY)HXPHQ9&NpSHrTRMSNNqYk10 zEiIgmd(SV>pJ-YPx1@e0b4L$PBO?-43s*QY79WeLv>E$TnM;*Omx}Na-#%4zgZ!Q@ z5no1V`3{XlFRr$={Jg+RMY>8Kc(n~V`Nqct+8$nlBj6bf;V*38)6;9~*KPjEUC{4z zYCRPe++n@d^Ykz2$}c zsOTBD&skT&(~Z1h*!~~?6w%Wo?S7o^{8pY+T>eH1#ss`xUwZXY8&iiRFvXs*Nv!Pm zuB6;&ja*$!+74UVytWkwDQ*4vb&sysTx-z!H_j*!; zpE3NstNed~k5`urVz-7z_xJaG@?m{yU52k;O(72dh29{{04{#l?LF?jt#|b|Ly9@; zx+J z@0icdZfm|qi|_V>EdyIV^U2|#$&*lZ_OA`{d~d6@aVm<$e+{P2Ghi=kXsWkZ&vcpC zls)%eLq1^K$Js7It8$V<#htYrTHPt3&8FT}d%W=AsHLU4i%+GUot^AOn#w4j8u3AN zAk!4aL1Jk;ul?Qg^5(j$Nee^g!$GUmval19BWxAi8hIrpR@f4aU75TmF*$5&5|%K7 zFh!{NUGJK?--n=~-BcmE*$poiCteKAaPW>TMrFBt-iM^6X?*77q%zG`&xaEa34^cj z!TrsTv_OM6I$tsz!X5}CsRK)`0&9&Zm4$droTeA@?+@gmAH*2z^6!zpWA&KRAvf@y zZ_2y&&bx6I7h9>bCzI$IwRM%S=cg1De|Ah5tNNs&lHC|GEh{aGEKNaQU}FTCSF!s_ zQ?shBGuXg@RkPDa=tq++j@31WU&wZDJuSrZsCqpcTxjy2T#KsUCe`_K=K_k=ch7XpaX6tJ=4LXIA8;R|6@`}h~se) z6gan1+gA3?_&aA5lr9MFmiDcm=j;zzk z8~KV&txg7YvaTBm!TngoA3^l6X&G2Y3N;e-niS!Uz8(_k!kvIp^k>a)9( z+1j`wJZgAUy1@JZWk8kH+qc7}aLBe4q5&bQvR0;au%@q(8w*2)H64yN-4DqvtN*w$ zIS{s>C<`V5RrO2G%8FM8s)CF@S|^+KVyVEZM3jY4a=jCSoHwdAsw7qy;)>w(m^X5E z$)4~^FPLM~fhHXLB@yV|-$~%wkgBEN2ViEd`f#yqq@Y**z}4C+GKEXfY^0Y})g{4E zmPM8p6@TigK}f|#Lq$NPF2b{o9#k2Ao8%xZ62hrxS%th!#}&Gx*TQZK=62_7A;z49 zEsFlDZ^@B*+FCIC6uu*&_x;Vh5L~!wM5@f6)Ml)nH=)S0QZs{>Xafa-BVPH5UOrR zz{&F_XA=ILU@AD@*CO z0HqBe3 z{)p1VWex#QrJ!x%S=Iw9>+pxezEISw-~vN?m#3}$Tq#Hp9>lNK_ik-RBdkb%xWkr6 z{~b1*6&;sm4p%~G;7ZycwZ2w$h+VIHzqSRJ?bj+K6DuVN%}BN|d=O(!lcP$~a(|ud z_n)HTWzfi+hGr>EASSJTmP`w=Bxz*tR#@^AsN#!hKIz-HV%?ecw%}-QdxJWqlZ};Q zc0Zrz!7=)%XhLH3YG%SJJSI47T$Ma1N!)v(MaE-Indt~=mEiyjfd%}TM!oBUZUFtZ2vU~hy+)O6)R0@9`NgEZ^PSa8tp5% zGFi68)*#*6?1Bx00ygi&p4Ko>OyaK4B9FQObfP zOyx%i6mxA@rrpJjMB79`qK!z**NaO>cUl}mK~Nt;oj#s8O0fVh$f-b~_1# ze7Ing0Jaaj0qYr0_67#V7z#YC7(YVn2#Fk_K`MSDn|{#tgG|UDlEJ53H1eTyYG_* zsw?6D7;Q13ZX5j{lbx1#E*XDB167wDLsg7wcQVvyxk5BawJ3%^9!wIW?$F6ac-?2A zHWN(8eainduWS{gkrOf~I>WFqW#BcUhKOO~(jVek0gsRZJVcGYN=Q{yRB-e)3lr1ilYPQfZH(RT6-DLS z5Sacp6<7Mzq};*0WAFB+_)vl0y~+N&LzM@%@ZPCN5%7S7nS?iXMamgZT&}D~ z+2v#E?YLK9>_?dv*?%t)q)%E`rKJBfI{w?*P^b)I$|q&!s-M1{OMW7ukOel@g}UL+ zW8M2N2A!R?)gLLIZ*)$y-gP~#i=k7&(F9}wanjWwR3oYy^cB=2O=i#&1CAN+eCCH; z!wjMoRb4ypLGZHO%CJTfvm9Q!^Ej{vz(yXPX2)ZB2KO~@8T2_91Ggq2YJ^vID6D3U z$V;V+8k@*OuE3$}%`ET_&-w*47z~moOHWuBdM}hq)G3HlvpToYRoOg%srUG2bcv&o zxVhQg$il5F(_^NszDn7XXXh8whkg3dRX@#NW$qJG6E_uRY+U3u@R$%GyFY}nlC4i8Qw9*OGa|$wpom;#dZf|BMh@Lo3lo+R(6Lrq#TF!Vqzy-BNYaqj z*@Fb{mrh28&*|YyTwaz=9EBf@DyQn4XUZXhWA9r29z1Z+=1Q+F%~i2lmdEz1fDK8; z1amYBPEQ1cQxO z85*josmaMXtJ!SQUAjiXhb5RZQ4Y|4r;GTluW0OhJr#UW#AT@DoVJJb?n!ck;P#g5 z4d&+LcO;@-c!WIdymfGnV7u4$tyS^-PvgR_zN|E;b_)|(tJB^^4Bd*=8p)G86Na{i ze7{hIl2Fd=wtHC4dD|O%duFGSz@DEOIA_ADIFJ>Wwo~zZN8JRf&mWZEyK*A@@`#xV%FEQDf{Z(SYkr!x4gD>t{PJW=o@lKAD~ z)qw?$p4P(@_=#J|>Im=l*yD=XIfT+QEsrvsbqWH}d~BEUZ zbk^BEWt~{d;%fXMc_akwY(_YoK1`Nt4zt8%n+j9HU}F4JGCOU6vS|6Mzc8|q@5;wY zX!#+$-ITM@=-?m{XDFAQj>-BnVjU0qXDoC|eBj`HKaupSW&G(u;2*a0brmxi(n^Yi ziR>ci0YL+DuZi0CFT8Q(N~|wicA5sQXCo_=VD+Eh3(46s9V=r;5qB`7r7w`nw|>_D zLB@-jNYcA(GgZxHB>5<_sKfQe=r>15*lZ6wJ{@2H?AZzGeC&%(cEt>(R$OVWK8Rp1 zJ@|Y7bJ4~+L!FPywR}SN@$Ky$lB27#pDlDX6G!4Md#mUs@QzJ-3&Ec zPji|WpRkQ#>ZgC`=i*KiwMf>YLT5I`q8Iw2Apmb!Gio-Nz(6!M$2QBj_`@5|aNml> z0Uazu#$*}@uiUXqe6tLB^>ZxAFE`FOoT_h1k`b&2nRji@65i^}648`_SA4EVNCb&; zWAw;~qnn%5-{(N>Pf7M&aPOC&?`niHxKX85(KfBsT;VdlD_dKmsg|-;9|q@;tsr_u zgA#*sv$7bgkI2VD7uhP*lE)R|7BY|>kl_oRmCp1$Bpr1(eh&u>cnAIo9mlKSH!bue zD~7#zGeAp^t4`$mXvT1*Y;WRbfLD%EKQH|;Iga^RkeUKah(gJv42VKFg!uSfg$CX0aJqv-(ibu)s=l6A^CtvoLk@au>(K#u z@TPARoVzc7R->KBhGo=B!_nb?M+|)L@9;9%;FamUlh8pBmk>dXK!QqJ`5s7r({WMS zuCaNz-Di3unN*~vw0haYY6EY)y9vdKA1Edr%2!w6S{k(qokNW}Ik7Ft>BILaPDC8@ zZFjdl8|{qy*7cZoQiVp^oLcY$yPrPx8;|R*M4;1NXTYL0jWv9c^}8}P%351c*BxW~ zav$fIb;DG-#eb0|eCqF18R|mL9}Pzk*$FjLM%O zrFOYba|z{pbZkOXKgcW0$f?mq!O}gL7qyenZfB2L+opWhYP~Kd{o@TM5Q;wp#VG+t|YaP*tyVpCG zyhACTVFc!;KlggWBGkG4PZsCxm?;0rj;h`v_WKA!$*}FAa=v($@`-03IByO-ek4V|MaDuvFbTgZ`6dWYj70frIN8!7{|2BqvI z<8**Qq)s-m>E|==qeY{uMVrgx$EuaZRhG4Ot}1JD9#)&&T;7+Xq0|s~nhRO^%#XA3 zm7jp<={_Jm$9oJngv_oE|D9{tisuJdki?;q0=%9-&!kDIq9s;@UKz<5^!Ka$E+=a8 z+m0Q}Ca3X{huKXFFkfYEi8k%^X3ztq-D$6;1UB2>tf^L-Zv;R6?unzf&F=DfxYVAU za{rUHl74=<3}w7kuGyuB@M$#>Kue~sW7WDz3q%<;*iG0|sVj;_;ac-}L)=CCN6*a` ze0P6~TnsEOPC`qe)z9D&GDiNWz~1j3!cH%<;YzWezL@13{G!f55^7eUh@^|)u{t2~ zv6Qp=`uLK4l>NUruoWpO=5z~z79s?+Re|$u)*rbY&GeW{12_1ay3ow>P}q!NVTZ{9 z*<{=3@EN^OMTOY6LO=JGYWuk&|TwK|z=O-e==V4q2Gxn+Pc+*H(Dze2bhPv>-wM;&biKFT(I^^(tJ+Kyh5-P=Vyu z$2t~XJoZ;v8J{}OsAU+d;^%NaK|SXDe1vGx3We;wAIew5H~jNW%_+7987=M>ZQ#Ba z0|Nji;-3zSo26fGb-~)IA(FHo^n|&S2-=!_EyO6yuoH}3i`Oj*S*l8_Csq3Y=^={8 zdAEPC?;`2=Lr9?^kNTRm8cm5x@~XC~%J+$XWyQoqbuUCL*k1`xSwq$R^p!8!f@q+a zrku76vB6%NaA1%>t(aJ6u{ZJ6w_8iqkj&fb%(Hl&?#6ayqoN;}#+kHKwgHz*z&m#)7^T%>5k++4G9mElKektM$_CB0AlzWq`PtK4CvD z7w3|@TUdASyt~^PT7R6g$?Hf&A)u!5tGzq_q{^hiqyos~E_dc7>HFhc!!>GQ_q;ne zlBu#W-R$`ELnMv6j{1VqEJB1F(?IPzK%9m5?wJGfE+A4{Z?{L2UR4Tp23-e0z#*_MzZ^lk><4IXke7EoZmOU=^%@gpGDs;X!>PP)} z{I^GYt)!AJv@AF7(VP-l4Y+sYUa9sIs5%s zy*Lr4xbV3|4-Hw{X+^;Q=rHsX3Em@mjXiRqoM-Y72Duxsy#D@U)|c9z1&^I> zR-&rpJGnYfG&?1Jvs72kS;hC5O~$5)-QQI}opBc`Y6ctyW_x=bcI*GjeB!pv^1U;* znw6AXWT%?Y&p{Cr**PurXa89#lpbi3%9_CIOz{w zJme8SYiqtbsvUD?if@FjNS}A6!%W`@hVnr~VGICfJV|`P-Q&?3J-T$2QbG6g9RTe>c+j#O-wW+L^?4XTQ$-)Q}$mc{4HyQ^Pk0 zdA2MyjqGXWOW&X5NGXCBPm8Nv=A(tn{niijaqkyr_#Dq>i?eXZE#_D0e@g!Omhc6A zq>_lBkp<3arT&N!Q4@k4B}N0w&DaB!8o8+Q-!nk){d?PYtiB%InSsG`i0*cvIUOp> z8`6XTBuvZ*q>u%5iIlwlw3n@Wb(4jzI$O_%x#NqBtoS{JyWQ+3K1OVXjV{kCa|6)L zpu4;7n3Gf>HM?{C*~ZtG)x&AOgGNLn9vwLS^Qx$)Jl`)#$& zXCPY$a|L!@xi~qzaiY>3A!Xb79<7CHr9iExPBO&i&-B_J-l=xCxuq1P#pCUB{;!VN ztKHmpNoMbraq30|+AhBw+;P!N)ffDjHTd@E&qA#LZa&U_DD{SOQfe}iK`?uR|ErUFpO2UmIb!P*fIQ_e|+NUG7m3?Q%3@)KyH>X5G%mgy) z{Q@9ox%)dCYEguv!3RqeX%}e!!A4{5?;#vN%J{(Re{&n%-}8Cc_i2579g9y}?$B69 z9S$=P3D{fEkslf`oBJBA1_@(yfesGRQ*%H$ol90%RgJiQ&H4yBU(|EIqU0(B%826YcG^P8o4qfXNKy=)v{kCxbzP-K*1DFQO22E4 z=;1`gb58%h{@sHsVu@-+$VVCUvc@o_*8K=t%l~X*QAj8cVHZm7Dk?&Pq@S{Gm*^|9 z+Vm>t>ocyj6I36GDTf)O_hmG3hMhfGUIDl*y+KiTtaO{ZKp;#{&dmlpBZf@nH zVvWbbRujw6lOmn0eyVKv{1GAojC#XB+EvUZ`Oe8VOi+DzBWpG{V#Vw|sQ;QY4szTkQKJUy@jT8wdpsCLq?eq^v2i!`wnu|-SAlzg{q;Xr*M0-z)U+zJqk}%bNe=T8z)%@ zv8adF|G2hBX=A20 zc|7lPXw({TaQTG%WJ7_Guf4$i@sj^Tz!|hCaL(lhe z-&`U?!+v#+|Mha0?f0tBeheNz4D7Bk!1`d=cc&E=36r*m)AzVn@35s=_kQ~AGA==H zR11Iv4=A{7&qxJ@Y;S6tNs&y@;p3`9iv19jD*G6E%FRx@%NlK%BjEew{Hf*a@$lS* zgcyR>J9-uH9fD#&OFWt)T4J|L>E}`Ic4vTtmtYvY*hWi*b}6C!hlaQ8LcWfyATiAZ zZgNs^=ZStg1Yr?DvF}q^k0&>=D%(Hu_tUs6RY4EaMi-}16P_0R=eHq_lA1HQ_$(8i z_};c3Fhm-7$Cr;{H!jj^KZ=i{)p1$?UviJ;IxHqYkGWeRGhtDHKherev~ghQ7xHf0 z$zjKkrP&})JMBEED1xXKMIki^;t7V&$>qE1tHbQPe}6OLVXY!HlA+$+^o42si1aDJ zB+4X#n@P4Y{zAXg+cq(lrlqCjzRJ-(9w^{EUCY~IDQCMIrNC>i;ns|;1_}NN(Ysi; z$QB+CiztrP^}a_NkMWE^u+(EEt}6FwDC#6B%=`q!pTz5Ze@*#(weG@ISC>>Hmt(L) zr`q{_;8!J|uKbr(8`HbO_dWdPKMw1yb>{p|Cg<=sbG6dFTg82EgE4 zVz5|`b=o&>H3S|+GJ0fLiaTg=eYkWp)714cOLWR8A+Hpi01Y$EMm0GM3;Ulfb*u2+ z{QT1#!E~q>d|d**Z1$%uH(Y@M{v|a8y2~CBOIb1}7z`nNupL+kLBd`VkiVeN@AoIm z_hv{dGkd2m401i^4n2__v!8xPZK!T`9RK7h4CD#)q({tX^>=U#v=lZdXW_W>GdcV{ zHSKtML9BQrR*d2Z zR2RVBHMwZX?p$d(K20IY#!ElCzE1tJ++|)3WO$yO`ygQO5%RBXSQY5Kz`v!WMHQc=@E?k@% zY;Eb$*3|-YA3()*6T zc?DQl%>3!)8%F^*v+%Zu{yA8_C;_IPJme-&qs5V5BMXCIrZ)#IgZ?bn@GaeS=ybwl1*zZB&p9Cd} z+%b5m!h`3Jhx*||gyGYa6iPTj&aij@05Z=679 zsVlxcdaEnr$W0?g%1B^BKq|oin0Larc{)6`zl{E(8-y0l3W{YBToOK3s}T}>^yFHz z#DxwnQLw%5ZtO0G5XO>65Qc|FeS-sM>0mA|u{5^+IZY5pwyn#;X(et+L1Y@H2t|n3 z^+5ZuPx2qn5_lBbJ<-hy`8RxDG4DIRE?oJtDWf9$?FrAkUgVaq;4)+i-c~P>QN7*4 z%Jtkej@&H;I$uAvS!;X$x^F>{fSeNW;nt&Rc7tt}?`(00k9a(d66*XRK6u=n$O1bZ z1tAVS1O>%TZ|`+8n}bDK0cD{a10nC@UITPwA5WqeH@~x&tGWJ$ zSYOa-c_IFTna8ON$El8H#Uie;r;NgP#q5WeiRJY+8kKML;pEt)sF25yIHdD=Z8rBm zQW-x{$xceTGTD91E3hM;hR>YUbbP&DSDT_6P386BvIBKY)){}%r0#}-$|I&H8AAVC zNZ@*dfW`W_850qotEj`ftW6XzC_9K`;pa;2uP@rnGA|0U(|*Wg%Q6Gn&aY#^|xHR*>NIj7o;ARsNl1N(np~~i_3>o zeo$bP1~EjJJZYo*?I`EN1S)D0@5LDF;s7%wLJ$r@&<-TH|5R-`t$6a_QpxFcK_PLb z%xI`F4$gG}0vhr+WixT{C44! zwS17O7Ij2Wzw~)ZEV&7iZQM5*0vK3E1-580IazU8`JfWlC@Bb{W^7Do(*L(8P30EF zNC=8${8X8)oBm-PQmDZg)&WFrBS>(r12qJ7u_*l|k~NgvETL0xO!AZ9!t4)@vQZjQ zGwljWS{;~jY>MmhPpbns;c#f}WI{Z z#Kyzc+F(gNmSi*;xzZOgNYbsn8j4#AQrI<-k%DOplTtRJ!=~Rf=!yN%|2wl|*HC&= zGh#D#EY8%y15rxy_#eVq)LIgKB;Xn#_~#?~g$v^%$Nq*b|H1k^SQ&-n7e4!~lI$=G z%Fwf=ytCO#Ja!+`Du<622d&OLNUh7)`CwB@wfn;eCnqq=SCVs4jiEf!OBwB=J2|y> z1EkBGBYHh9Y~U(=L@8P026^&-utFm?AT*1U8;}%)N2X(fdxcR$P=KR(cA&>mzt*H;tnv0G zIMG3cA^uEH6Y(hDX0wsMgj6c261`QGT;-HUBRT;+)-A{r@buy~a@Wc!AtuyLhe?c~ zq6}_#r!28>9Xw-a&lHLN>7hzFJJb8o>yLMn^$5t|i@ZRW`;{|CVM>Ij9D|tvm?8JK?``g}O2tTYA8iB@q+%uUTd;Pn2biScWRsbfLi(oA3&Q z0Ef6dMB&|1!mRfrDVV$Q$;1kZozb$$1|LWx#78&hg&ih)6K;+~UwM?rr85y6n*wE{ zNWH_$%N43xd9JgUV~w7xR?RR`SUmK)dZb+Q_Lb}CZo|)~NVqB5G$}Dznp9E|ghIJf zd@c6d%~?^ywb{=<4Jg>~K)k$dlLK`mk-ayKdt9Yo4s=nv8);az#2@a#2m{RCQ+G|U zH7`p?L-Clq8>n|{e(4YwlS3`8vgph(B?F%{II3M3eNSwUnv?78I!b|u21I07S*Z)a z>}O$wny1IC5WGDJ_m#00aeAL{t%0g-b%>FTjkNub_jh`8I#@qnyuCtpJgsPsNrIgL za@d!$A2ot(e3~jbUJgOKI}{@-(G>)M zN?OU_tU9IN#ro?CWNHQ}Gx3PJA3y>?*c>Q1@wKj)uNC16oSsl0qsu;N5I!8=6{w>s z`FmecvGKv(S3C9FeWk!U+MKNg8m0r_-mTymUw>9Ki#*dn#8Hm_?#qNlvBy-K*}%*4r!RWF3_fV-Wg zE32U&2~2jV#hSvQ+y6!BAH}%c+@5O2^yK8p3JA*so zagS|j`*<7Zwb=7GWk0cDLN*SJBNAfiAG#wjT#e(d9H@$K8=MRRUert?7$ghpv19kJ>HQQ%gJ} zl0S}b_&wu+Ii0M8_OIg>9k-sX^o5ICW=r0{WhGOap7XLr_sjS@%p~liKzhTqC4)d_ zZ2p&_2~cpMZih|`WV!EUv~G=(7YMo=gTG6D57KxDBF)z9>v}+Vc793vA`sP3BmIMPy9pIBbOpl!ApJ zdw;!LTCL&`T}u^p5BF8_YI29kOg^Qx!?=TmAe!p&`a7KO`0dWk1;;CJ!}eYX2j1d* zHkH74*_{&x(l+4esMG-{t^5Ag%GCf&lxK)B`E#10ySLaAaJ17is>$JSLc`lIj4CMk zcQc}}=XdeI%^U=2i66&dYpgPi#HhhPluV|c1q1DXwG=3*!NSD!O1C^;uINU#36PQM zQ|PVgty6ukK;F>^5_Fh2?w_$8M@inTq>b*&pxyvnaa{NIx_$++zQEEO5!cMeZ0}>soKGI-I9hAy zUp|;|1^W3|t$W%DUbY{YCN(zerNgtjzt1i3B>OHq=zV&O{;kC}OM!`FLi(54ff32C zVBS4{yB#8U^t!f!)CQAs!Y{rTseoaD#6Z=ZhQ-D}tu9WvOER^HJ zE|;x)*JBOt{$jv!92R+_Q=KpnI^-h0o4IoS_NU{Aju-UTe;jRI5W0-uOW#^$l0=ef zaCg5}+mpOWo*6qfhckYf?C?E4sJ@1dSsa|ugCTitrMJi7AY6Ph5~K|&`=F@NqAI53 z{3s+2U95bDCc*2#R+!&m|MrFuh&3(2cno37{6ntV%==lGPRa3_O$AKhuAQr`?^t5n zrkv8`a0%UX@;Yp9PoWY4Az|Eom91kmUZE#bi7uz3O&Y(5@`>jA??2K*^hB$k^sj4= zBh9SGJdx?}N??37-*OAr+eQ%$RTTM;D-o>^f`}w)cRHK);mYW8q7`qfo2 zU06-0C9jj3Ak#;eH0U#Qzb%6BP~X=aZtv@;)?!q_D_9$-<*FKGJp>X$al3)xo9L!m zzPl*`<=4mJ+~3%p;Z&}Sl3jMXz&SJTfUDZ+$>N~zfT-_fRj$*L&ce`W7xrkk;CN01?zL80u@)^ zm1wMqj!qLpojJ3g#-E8_@L=+2f0hzu^FI%Uoxzx;WJT_Bs%GZiILk>T^QpsN>)42? zu6LZTa(RX>CB$5)dvE{`ok=E3`M?BBboWZkHXlbCYgE)XgfzY>J%JmgU1p@Bb0qlh z?d_h=nHy*fgW&_ERxgsyb+E%i~%nM*m(v zb?h3AnTUHC5fC|BTO$(qt=H&1lG9S&7|8cL++$Bi-@q2=K`9oh_Ou(~oW zhuk&EdbPc!wzsyn6H^M-Y_ac~CaKuNcPOQA;{*3V!_U^3E0~oj>Cm%>9M1L*tj)%K zq(GM${Q18(C%68;AlyE`SwLmcT+# z8Si-w+D>}FVv@pOO*}kGlL*vGhA((S_Jk60cC%tBTX-Qv2d0KRb%FS^n@Kl9y@F|Z z@1Ai4Rs@+@t_c>np@48tLyp}?y~sIe>qh~2o}f+r;pA1)J9`? z15`|)9OSJmeNd~t>HGM3K?F%~FnSU#8h}Vu7^W)VA*4}L5_jq(rm^uRs-nq}UXwC+ zX+WjYnjM`*WVLf4+doTEU+T@xP>rbDpVPwbwcl~a)xWJCQ|&*{Wr}8h z7QDYXagB0#=*J70=<+n4_Lxe z5JNei!qPZn;LnmS$5}VmJsyd$nQIu>-qM{Mwy?Px|MYzNCuO6#MZwYTgwZVaF=@NA ztk}Uje@i#6CH~`fR^0p*FWOpJaVF)F&9u0}flKK5S?67gB1j+y`K~#>=f0`9d~t4J zZGBk-0jDvZ@$LFaO`j{^aWvJz_Pdq@zXUMwW^T+D)5j}ou9kHjZk#;GX#%Gj<3a0U%4(( z4e0-_N9g{WoMGekF=tGQi&DYejq`@O$+LEG?kYW5?u;P2zNs2-bwS(TS?KJyjlcJc zcE0IUMUI8VfcSTRm!0mD1^5=f*UJuM+mGHj?wI`k?*mDNB9`xcOb#Elsm+3wrBbi{ z2{)94^LJ@x!!2#`Fg$_!9Rh}jJ{P5TDD)_kbV#K}lrR`ksuo~)(N&-%?7ll)jmPA_ zAsJ}<;Ek@jUf<1s_hQX(Y(UhLRnf-G{F?*xMm^TOi6dz*K@^f2`d+{4rL3xqY$OP9keiKo_}sv_YQd>vei~ zD8s=QEY_+Yn@NpA?VJ~1&U!tIY9%lQCCrwf$%y>_>|nUr@jn#X*TZ~PL4}rozyaeQ z0D?Mb z{B;@V$Z2zPgGF>lq^n%5!J17(kf~U<+1)iFIqBV{l|fdzD}Wfec9Ntbn| zP`~CpT!u&iR)B9{XKZuO>Q8`;t8M%2rgB3DamytSRC&I5xg{RX1HA&j(8F3-g7)^h6wtzj zsX*2)VS{xki$tYXezC)1dxLKsA$g@qi|BL5Z!X7QjvFqnNLY>NEv+s{wcXyHd z*3~)_GB;^lj+gW>`cJ z;1k-2=n^SLWt12s4ENJ1K7;~mm;18=d2h<*8cYZX70s+O4ggxv%5*ELM`2=joCZDC zD?7IgFxOG55tLE?QFIK``u2PUx6owwoIm3L7yye3mij}!3kN|FfB7N| z&f~CZC&?Y2u7(1=0V|hPCc8m5KHVi@ZFVk4M$&d!z%bkR*FI#ITb(7hK^sz+w|7%S z!LE~z8h(-YJDwxZ^R*akq%boCv@k09_d*q!hVcf5G>Xy&I(JWn+TTk8-G{y92CB{# z<5+qP<`XUZc2Q_ZMzGRB5b$3j#bFIP?sFPFLoiR%n}1zk{Av?U7w%;B9p8GIexz#Y zxv}zi8rusqp&&Ixv}THu#nIL1Npu^i`Oqz(5KLmMn@-dopxEuQYZMZ;BQ5XzG#|K0 zt<`vQkY;G3mG1k;$QX2kmBAt^|7YQ>)!xL;WzVY zitI#z7s9Z`^^JF4QtB#0VX{?FGi0S7&cvPl4&Hfs$i9iMjVx|(MRwDR)uvzQu6 zz)&7{qL}l#JoA6FTPG71Pp-ShZ29){-U-dGf!?n6eJ|{hw1t5GMx(S8hP)pMor<_v z8ZCiY7#yG2piCy9>B0SV1HXs8sP(HtVbz2~OHrzyY2z?Tp6ZnxtZLp_x_RyKoz&uQ z>JKTK`r^C`Hg6v4O54qQb{|63^HZNafb_>}rWDk!#S-*NkS}5;ulpNSbuPy|%Tw znbFK_2GfseWk=F?VN54o_C4zCHn6QtYd`$e5_F85j0HaYC;%iX#NekKu*1tm`-Z4Z z*M0qS^I42oe+i^zAFaW#sV`HZWZp_tX5cwCzPUJ9q2`(MCR?lFw&z&tgPdcBfJVQC zn_lJH$X8BJSFijyzOC1|zj8K?DR+>v_Hms3uDe|Dvq7q#zbikd;n!8UBijzcwe3{e zh`Svs3@g3`^|O&Uw=bl>cK;mQUkp2Mz73a)oe&w|=(DKQlOq=in5ZoAd7Q2J){ztl zCowc$`NcAjKM3q1B+^=-`<~=7P1`xy-(R)fX*{xoB&!%fS_ets$kOvm{57edm{scL zzuOs5>ZoaKUd9yTay6wXCQaJ#ZgSXyDK3wyH!lZWT@zin7G1pDJhb$zY{*JiBY)gp zfV*=);^J0nsbjv(-XPwi^43?sGLb1hLFtOk-PB%bj-A?heU!!IyI$}Iw@78ftDT8A z*s|L2?Mk<&m$Y>*kOkHTTzK#_ojKy4_&mM+aN|jkFP^7mtWGh}FzJ?8wVZitQRB>A z)U()TLjYe9(t0de>Iu}(Z=m)$^AyLE!0uiSs%e(w)K!`@TQp<1LUHhTiXAr6{y6rl z-CvIv+aL06r2J(&Wp{q>eXJgZcIT_iQgROPt|pDDNPFAJk7T*K+H+eusV)X^>Udom zHQfUFQj2(lA3Ki(yHL)&2{l*2Zwo6PiD64kYiTnPazCY;dbO8`UHmau0rgLf-EM;J z)``D3N}J4y7l-ws)G%qNjS!tzroZ%^nb0$gbY@}{|K313lEa-$tg5ZuZm%t@9@h*a zl~@)1f(@|y8nnt&R-c>G$yuq&p>K)o&h<1%U&Lck?0=BQ{iPHV5-g?qYG*Rk8+=KN4RMPalZpOPNl0#I&4_jymmC(h4_}fQ(}W#|F~O(WSbrx z*<}7Xo>#3o=eKs?{~qtE?mjnIvA6swPvK_He@?--Kc!;Y3s*Mf5HU_0 z?su1^M5jr6KV=Hvts%-lYUzcbK|x1VtG!`&b{DG?&Hb(F*;-qj*Iq;`BAS?9vcpDm zLN*tJCQe|1tAzG2_-l)i)tMupxNeHbe5 zi+5ncCe5y~x303cb0`~w&Pm_~x7hC_V-kf1fD2)k&}L*TI@MouU++n9YU?d6RbhV& z){fBD@3&n1o~YI7Wfx#+D5~(tdOH*(UH{&FH!!l)8Sma|ar);rv(=_IppB9Q@g8<2 zz9wS7RJrCipOe)Y99NpU*gN*a0G{02T~6UaZfx>R_H*264Umq>xUGSe=Z{zMp|q#2 z2^psd6bZj(+w)%Vl{q^BZ(Hv}%!VsW`IhQM`~3RuwX9j9_VyaHM?lZ})_^;FWg={^ z*ca@`pdZ9hI}&vFLIi%yhV}USu50UuPZe(c_o!i5F^6K+!IY@b|Kd#piLXv=T<&XY zXVGiwTih_xVC=h15svCoT+OSx?J^TTVQ(*Svp$o*d#%-s1JcWu!ou@Xi1#)_oPbYO zU_05_-qqSfYw0+x=Ek6EM`5Ms!9ae)^o4g+pg;o}`^9e*Ap*KmolfMln#$?oq;UN% zZjXDN)g|9Nk5IM)OHQThDl^mERHV#WDdu03-Fj%wLHPXr;7E_uz{WP3U`hD-8zn{P{- zY#c}7fdIWrTKE)4Hfhz#^lF;v9BVn1%#epV>U)#at_f4%uM?@0g`%dvAYuj(3hpR% zkkI(fLN46GfyKMaU7;p=*QB9Cr*b7}M?QJ(cQEs$1cj$*aqfR{ zdfCu>GP#p8|Cm`Qhp(AMsuGT`n_qDT+P#)6`dM+`bzPl<0Ck{s=xE48XQ_y9T~$~5 zoj>a0-O9+WC((xQ@pie~SMx%lcDO2;1vjx``&srqZnrp-tl3ad>qP33J@Q{}R_|WG z-=Ms|czT;ag(8&}35|f919o0MOH#f5Rh&C{SpTxKek2tqL=?uCpE=yN4ZP?u79JYx z@Sjbnxs!IA_iNJL_aW9;6H^{P79F$dpowc?+Glily`4hecX@VA(Su&D&Xz{Ml?jj6 ze|St6s5L*2{mQ^6G7+T-S~p1jK`m|lcsH`Z0oPNv!Ao6D%zAhAsLSTuu(P^yZ?Xf* z&WvB7qo0j(t1$;|@0^WUS$hvTRx5ZzMN$Ke5#a-f(2le|H*l(y?+)%yu4b2;@O;fS z^~!)~8S60J=2jtKPDTeqZGNhLqwcJ=FCGAZx8*rS~LEm$<%0f{zweg z!qwAQhhM zAQPIA5?By+6^s%grt#PU?pCBFQ>Lock|C^wdv(2cz}U@_~)-6D;yj&Fw!Z3=x;T6JahG$j(6v@kK?N8H~`%qt-h0va-z zIa!=JES(By@##|b^j2dk39&0Sb1kUoerivB20X=l#9T;K>cby3Dtr%g?k z-B-=Pw*~+pAc-wl|E5|{#w4TwVR9&dn8ZmjbA=s!O@yKp9!Zj-M)NJ_BLWnZF$N^D zor!HW0<}&iK{szD##-t*ERYV04`Gz$gE*s3?N@k4#dTgUgQ?K@JJyuG?XN>xSGC))BudTSsH+h=aHmP=!8YZMK3XEh68 zy`mDmWbm4{GU|aUy{xZ_GlEi%1~eLV|0nb=VSLO4=14FV@y#XQ3pZuSRSB+feY z5`#7rG{k?aJgK@KOI9r;lbR4M$*+vNL;{~GY0#HJ ztRgk?9G6qOGB(0at*=m0#x$@rObOCXA}WM-pJmSSu!2P(LO<)!CtZ!Q(72?y@R%ea zd}YDSjD&z)Yw*fB8dpsCHYbiGkx>^0&4dbxwkj%uLke{uL*5e}v%6YP%^W!j^o1e? ziXzP0Z2Udxc|J>~yc+)U}r!mnUAq#6|T18UwRJ!pP+a$AJ`ms zJ{!{^1gQ)v0!&O(#GS1>jQEo#_bbp*!#&Ke#uAl7Ev+yh(6EzgwE*a8-&ndHjCxL2 zjxg42gj(ulHV&dXU6l(0EDh}kqw@qB_GR{yugK900Z8AVB3D_W=!I~5>QNWZPB%Bo z+DUsFic=E5wMfWNSE{5RlSjGkns@~m{XIS-xN2z9!2}!${G?iM4Cw@PxII~Pujrrj z{3dgu3eZ7yGGHn#E+46iTDN5!n3@ZQuPQmc)vdNt&2?mA$hgzm*BqR4ln|u-v*`U& z_ zhUW6!yI%Wk_FB_p%BQNP!DHa#b|Ql&!>G0GV8++k(Ly00JjmKq3wBXVsBj7mV=1W< zvY$243`4l0zI}qj!cucrS5I6`l=`Ie&lJ(A#AT~o$I0N#C#JnX^RvadLW`0Y0cTdg z>^d?-cxWdys91$2_#go18mdfk_OfLE#s!MJMgsv=-08Ljxnv!y-(85Y?$YCR>m6j# zsKh~HxvaFB*>=skIB7Ad6eV*sF{$k4epq8~j;xyf34fPBm`TAJeSA(}9U~3qYU7Ez ze+1BDA6=ZBleXM0=&x@Ifo<8v(yuyVc=Irmmh;w^9ed7hf6z;A(FA(!bjA zk=!jBoX{Ju(Kr|AldQO3E>0&yCU9HzQ$h)^k}G10=;2G$o00&CS-sE4r(kmJR?>h? zN7?4APRc{IGdL7p;hd1Dklf&oFQVj4$*DDdM?Rm+!83cn@e`(Jc=r{!-CJ7W+4Dl> zOE+!xQA#q(_3QQZD{#g09^dKJ%anRNS)3jmseX)s4a7^@Vgy$hP9HE02iUy1h zs{&XhlZ%3*v$>vSGh>PfZ$L~REnd{+akQt4XdbUcjEuWHY=&CNj_?RFt-X-(hH^&E z`MYv2NoXSxHE>iR9O8@{^y=F@*ctm+Z8fve{TV}w1w+cX-NsRllenL99a2 zi3Y=&A6KIzY2j)9jLxD%_4d4*OAUSwX6*&iG%B>)ey3Zn)-&+Z>Kf&gQDAck=B7qZ zxIT_WshR$Sg%(P{o`pf6Bu+!S^e4xslJ5YrA6fE0Lx&B9IVc_xYgERRLVF?B>gH-D zq*bw}(j6Ldp6qwVZ|>PtO(WqK%Y+!E#8a8C1JFcSIOsnug(z7*^|bZUIuZBxclWt2 zh`8&%pPZqEM4F~dt9xTnRbprgW!N4E+QyfrsUs?}D%j!AOiHQf>aP z#e-L`NKU)`c=;p>FB>dl9WPg0aFgP$QC5Gkf7AgLpM%!N26l>LL%TGPpQNUHgvg;t zlk#Roa)RNh8^8lrX}aHaE!S_p{Bzx-Y|sE}-LB`PiMhI2 z4ANOjojV<1*T&RD{P{=4Pp-Z?w%!5FSr_N4$`nO1{kM2vx0KeEac9@Wt2$dfa^Ir( zI)chYczQ;k)q4}V9`FBKSY4$P0gsyi2TZIXu8Iu6!^gj0ze!fT29aK4lv|yT4Ny>_ zQr8y0FXDAJlR}Vx`FHen!uVaySB>v3*wD@a$R}CiJh0a20022E;Hl?T#g_x^uRm{q z-=~$PMpV^qdtnMWsaG^pAG4O|r=MKbE=__R4+%STu~_+ie@D8G^ExHg`r4d2zt@+r zwh8W+twY@3(#HSL-AAG3-aD`7<@RV?|GW4DU(U-3!-iK|Z|g&4W|G1E9G6c6O)jYh z>VY+Q^^Wi@ks+{%$r-&I`e=J_k>8kYtoPqu+h-HtU2Z$??uph*;QN(O|0bX_&Zl|u zJ7Y^ko32WOdE?OvDpoG#p(dZcX!z8PIw&wBq_0u46_OK*@C`~TZYpDQ^ODkr@7cTD9r z18PRaxJ{ontz_cuRnSszDaC|Yavd44{_m3}SJDZDeph*k&sS0wnT4IE5u-uT=5!L0d4dIB@zgu7+>$){ zxLlMRrVMC+55dvF_`4O<@ZIk+<<~DiQEI2KzioM3-o&cfg5l0|oDf5b7!@(G`iiq% zrn!07aQ9T-@oQ#U2p5W-oEp8D^^6sFei`%2LgikJv-(lxc135vj%DG_9oI8%jvu$0 z1HaG1?D2i=bUH!A_PS<@iq3}0{)^xLw;8(K?;_-k^wXQ2{;zYgML!H$ZrlPjL*Nr7 zS9vvL$TI&j7(5E+?ReOGu1`^WovZbTsK@GN@xI?Bmnzmu4xeZydhK_ZfGDszv3YI#36 zJ3X?+?K1iG;s>QGT_+)ai60dLo`;NfBtE52gq!_cKZZf`3ZT>JK7kgulLob%#ydm9YQ`30VrYD*>5hPO<>>r!wTLZ>?4)hGun(}z=R9ZYE$ zrvj(Zy5i6?3CsX``3zKts%ri&pNlb-wM4D&dZrU`9d195aBUmXn?{sm(ZC!AAUB~c zvZPRK?Kjp@i2uN8RzqA8Op&FJGq&R!`20Q&}rV1i=uU`!X2XmMxnBuTqeXl7jZTM`Y z)7wuzhpy|k*z3h~00Y}~^@`>N zTfP~^ME>M~TIEF#pD$qso4{!QxX(}@Y7DCgDHcxQ&D2?^=S78vGnzHZ-%|ULxSo7Z zXjK!bHctD?!p;|t94d42;z`1+-0k=2`eiRSlkk&``{g83QdHqkgd@*h~028DPU@Vmpkt->so#O&W_hX-|lrp z{=)zLA^;z_f>@q>IP74U(d7I~`Z+pXf>^vr#oazzz@N|N7PcYyuZl7UV+6WQOBzqp z$7^T4*xI~FBUG*0kOpfazc{=0mP5)EV_~!HUS4XL3aqydRp^(8nm-5wz8~X?KpGqm z8sgXv-xJU%0VFL(e*G;*%)A1vcggpk zU(*8^ikX?7?`$O)pFHaSPYVzMjLDA`Eqw`XaNf5{`a;d5x&Yb;Y+_Nf28RCKo++J< zC>=2dCgJwOZS~lfS{b{B`r_(!`pxvsI*|a~Pc3TnN)8u9gf7(%YQOhB^_lUrR6Hwn>f>wB}-&deWuXZ+eT?X(leKc$H!m1|C%48<GR&|s5X9mlDvtkB?9;X z!QA>k-_VXKICQZ4@^Bdo*O*e|!5N-A`DjNb6~v(Htnuj17uU13_uK>f&(*ak>D7xP zI2^Ap(P2>BaiA|L@NKjlOcmy$)DHJpw(Uw+$$0j-T+ebsqS1g0a&hTj8T8&VD^sZB zvU3IQu&HbnuKK9bYGz1B%S|XsLW3Eobbam~HzPQiU1yGVr_k zSnHMIWD;_x_Zxm!to!Nc!rmM&s{AERqK^GeCi^5QtN*d-{q&i_jUm_pY!(u5zmK0l zLchk_ic^+$4C7Np>2xr%a;FX|@Se9p45CF*5C8xv62tV>uaOUAh|YHIPqSRW=Hzp| z2d~9+yOW;lHJSa53_MN;K@Ps@EZ%l~=U>U3_`FjZ6wP5$(?hf1frDvj7b$qJqWRP` zD9$X+dk2oCfdOw%NEa`gQJ}TJj)v6rt?!Iqv0a}9w=-pY4F1xee_c2lIL$#e=)G#g ziB|en?YOnJh6*i0TiE~I{YPI`oQT&*3H_Z4 zO7qF=PKgNFi;0PmIKqdC{K<7{J-y6+c3f>5tP%|YkcKASU0tWrtl9SN(hJWOye_3W z&dCw*bl@#pU!Lo|?tU&iIbQ3$YkW@GtXa6YdsIpNQ5W;mS_S;T%{ch3==xWGaq$1C z>n+2gY@h#O#HCSSY3Y)bM!Fl6?hpa#Sh~BryHlj4ySp2trMtWT7v8_`^X}mt$FaND zTyxHRCeNAkjN#r%^Ebo}@16=)f;?GIttK4Y)|AF#+lbUIQi>lZSs~o#`K@1|@-hDh zI_))DUCl8xv-aj<`+ZJ_|~T%4CJBd$QhMti>ZvhEulAXEH(qlO>#FMBq0& z^ZVvJxT6AOJY#hDM2m z5${nV>4FmZ?la%Rq3}0yRHsnqsjG2p_<|8@~nUA54F&PwD>~;AC6n2E_a*T&x11^9W7zy1r+Q@ZOYa8 z#A_(h|2e4Zhtq%Cd(L78*&Xd}YPQ~@88NrIeALRP(I&i~XwOyNqLh6k>T@f7olV3? zww^U48#t!z`5U#O$dv!G;dpbp{A84&)KaONtT;x=gl}q9KG(;b1|C{3VDk06@T=7( z{{F6KWV#KFW>)BXwpr~hMX{vo2`*!QZ;toya8OoubBR6sy#L6h?AT)WtBL8?Fh8!a zs`S@|IrAVd;FME5om8(U`;Ta2vlTV$o2|2~&t2<6vk&eErM1yt4jxSpDPx*b zjySLUGuo#_Za;y|(K;YZi}`_b9!%8<%ZoD=Eu8YymT{#6bT;fi8pe%-ZlA}Wlug|ZxrYZM(Erb|3YPs%UrjYQEWKCV{qJ-!oSr( zs1l$Sg#wYkCr=2|6SO`abSy8IKi;jYlht~de=F_LSDd~VoVgTf%Z<_||2X>nO|nJ$ zQ^ECguVUBRYk`{xny*UVzG+-89>maK*{q#oSVRVtdoVYm(eh7RIKV}E*zxNvKdb~F zZFo9bH{>*Xh1!eDw5_bUYP?oVHGNitX|r3NPUaFE+@IurvfiCOPmKesdTP@9xQcxL z1iv?ANaueL=^}XMmo;(Q~PQW1=@^p|4qD23$5X9hy^r2Es(CyI56opa@hA0&mh z?K){?vY}Nph3Zh_AAyh45r37D`_^(^uA0!Y?F*qOUukXGIJ>Rq-#vlnbs)hRV$V63p{XUY0&)3yo7EodaH6mzajP`%a zK_?BD&B@^ZLOOY|t1Z0QN??vLLkWPKx3*|sr3ixteGsSSJlymP!<3Gm8Cb_w+jwdd zmYg3$(;YT9iX+*1DDt@Y9CPaAY4hRRM1cY@d?+2STHI1ZO_eWMl|MXj?08zyiF;`q zFJ5Q{m+SFi9wKw#^R1Jx)PF7o+*hzA-Is576Sz5v-j21X{o!-t*Zg>+dQEO~bG_CFzJDDWSas>QWIKu8o>_?keKW!fq7n=2u5|!V~vfEhcGUBRoIJ=fTp({`H?Va-U=vSrt z2MrZWZj}*~eCcCHJhO+E&r^4lFtKJ_k6Uk@wHxmvyG$aln_JpGBM6{Dz2biau9SDW z?O>gMsHgjkX#TVVkNVtz)}#_v7Zi!xCn;P8#ZO2Fx^k;8J-+q_?8jd>b&4_&uWR$L z%d~Ip&&~R34MgCiK5s)j>^4m1V}q!b+jce`YWNBrj`j-e&8E!EX>}=nl^2hIQs$!z zUP};G6;9v~qv;LV(ezA(-ty&)oyo~_Q<&s{w~(uuI59YW_aC{8tIpdkEl{tbR{KZJ z?dy6%FXCRxHuCCi;Ds$k`Ol+WZeG~6Kjj51t*k_rNcA|1l{ERUsGot3MH=*5v9}E6 zab$+d;p$;`rMdXn{4_V;M>CTaE+f%wkaDu2bN5oJ@uHvTa@KOG)j9nEPiwhVjF;c( zY-+QKvTg?oan7i>>}5M!(HrnW+blfAtG8z(n$v$pJ?~Kb z>X%c>9m`Kn!C&SMw39pkqz^@sA>Oyz{B~Fas@nxB!@#hT$eI|1*VEA)<&x(!SF2@g zEr2|A%_rLw6`7n!H^mJ6s79qgbzy7#%~~aR<*GT!2c%lCbg`m*1pE&YU)IiHjjo%E z7{bfzS{vAlyJqel5;NqY4xCF_Oc>7w()SklIe_*ypcVFUM9Y56tmU1{(c0hTiK4oQ z<07$oK5L8JwM!xI0T6ZFeoWz)&zV{K+E?C2KIGUO0us~~Q=hJ8T76Z38rG`tpLq_I z!a$;orj}hwg@={B^3Y6V4<04>iVKuRTUmy1dMxcC-Ir9j#Uh}K63A?c_@$Exf6+*@ z-CTY-o}Z`zTKFcXk|cKCl4R0i#b5a+`z$;e$^w`1;M=+)vRMUD%e3zbyfLQzN|iONf@l^;7c!V6-F24FFi-h zhG}Nh+glo!2?#`$TZB=n{85kpLT;*2Da4f=tDHEAC06+JZPNkzdyW69^udF1DUb67 ziAKDl+&V|4vc+eatLii)Q)xFLRc1_zQ{L$14&=O|P=GFoL0Jo->f*fn&A3NtG?wl; zJSe>r3t!oI$eKi8Tix-z#?PN}4V()Lw3nZ#L@d=_6lgk(9k^wXFIU;X|6vA=5A`0cd9~F z`&4K|G|b+Y-ZtIq-tbEEBQbv<=h^U&uJt~Bc_k%4IqA?|V9F^s{%uZ&;E@aTrp*>MiAF&j~ zI=?)eIbIv_6hOZg?B8fkgmBbaZk>g%B7ah{BaOX$5;5@jgatF}9bF%D#Bpf~ai84) z#}En-Ljg4=1nN(-mCPE}yWIi8{LMTSML{A0QfRU3QM@5*1TRDkThLwtP#`Y>0g&}5 z^{R!|bCY!OFTUIOXBzIEqav*S#}OocJo_2#ayNYjZlkWwnAHTjs&eWjDrKe5vFB_E zPO-mv?q}|bt6J>QGc|Y{`0^-X4^4~;bOm&dBjRfo$7nS_)+MUQEx(MOU4O@&L9li> zzV68k?`3n<@o;2F8rWcd0C&!%Nc>Tu+M@Phl)wkZ*dt|r2};~|yR(w@m9Mmd{IEMW zk!;XwSof1i(v2xnSOpSGN5h->ynx?~B=V;tN(5$yzlF)^%DO>sO_E%U7P|;pDsJAx z$`j&RgDsgA3`CXC#89AAb1H9GRP5+;e`Edoy}=Fc4VDA?GLHNp48emR^s#&HP32sY zQ1D(*s1BzXY2l?(Id)qo45eB7?bwku1&A@{?GsBt{WYSSjkjQRPo8{1l|F)eTm&%) zanz}mMD#mq-zj2b`IB9J)Cs3u5m|x$ZSC(0KHHPRchW;F(xN-g0e)zSsWNHK4cdPS z1zrn#=+R0=1;x z;!(c^)OA4g5i~50y@m-xy5@o*-`&0zF1R(?d%DsC?^t% z&8?b(phNL{6C>B@8P%L!hLdX~>7*E08F4-?lqf(|D|nI|y7tHV)k9_&mMO~hQK`6A zPTrf}toN)DIa`#{6gzmL-|^!2-xKbdfw=!O+16h|{BWiE%nr;h&=qZ~rbK=FHDb$( zAf^^27RF_gAIwQ>;aLH|A@<^!w1Uour}vRn34)?8w}?~0rh!dh{qv*xo#`Y^^jC^^ z|2`FjN)69qf&h6w0QO)XzVuEsV)VC%Xr$NQPt+Hha6bk%5g;=W%Y`HnnCKZP3o!AB z9*Uqf7(YKl7df(Sy9bj=nZgm2#o^Lu1y_H3KOgl+sL1k~lf z$I54q!k{AM3J{xv&B5>jAo!q-z_x}ug$V+PU4grTm|oKQVgHOXzh>RT>E{3+bcGbP z_V;465r4@rWQB18{N&ZB6dFn1p+yWRLVudAK&z{9sZ~9x)GwcgLo)vhXe3g zfF=naqc9G6L=ZIm7(xcRIhdZV1cNgg(r?Of{`Y(5R(K9eYv%ArWIg$@-P$>$~=5Bo{50KO~yZ%v#RO zCiGRwm}ypugjCaM5{6TudW(?TklKhj=1y_CkK$$QeCuBZTg0wTH_{8BqT1wP{Z$@J z_8Lb}vQma6M?M9mOF5H4ky9v*d+T0NSFS?f?SOr2En zXzv9Bpj2!1^}I9QyeEOkM#zY+ZiSFCaC2<_{M+9@TNv| ziiP(f=KBcmMcgcBr?Js6^I&=@IiH4u=gh^kpw{H}jkjK-b6l+FEeK-`^+%K+d?4zK z8`rFS4@T}Uwe1brRH+Y={fiXZJwjBwxI&zsJA==rd1Pm{7<`i7k)v7lOsR@pF%+Gt z-lkn_DG6qNL=d*O{F?U0hxjJ~7(I}ee9Din2%wrrRi zh2dM{!Uu`-EF6&S(ORwTC@P{;H#{2gp2|ya1V#9Fwn&|Ba5B&Yf^oBWDZfK}n!?v-ZGav*c%tBSjO+6YG0idh(|vYFzZ_EVjsz zh^U*&`w5_e&X@#&e!z{Jv8PSLi4WT6Jx_SsG?_eSMg z+v-0;KhZMZCZ&+Z*ZYkaQt798e%>+mY3O4HruH&#O*gzx(odXSy?}0XlGH;CDO3^p(;cMf!U&-bS(EG*wH}x9jkKrPivZ? zlGZ0PI2F4c3Eo#?sS`-weQ0w$Pe*Q3?0*CouGzkvuEk9AOUu#*j6Yrl6(U2LBcRx+>bMVgwP%tU_8>s(m znH|=(TnQNAhE19CU~abB*~t+d_nA2V)@_uQ;BW{?krJT=uZ*h!k^HxGn`!GPhY z0&>u`Q@A!u@dEjqFG^+*1Zy~bkjzd8Z#}297PKlvqC8)6zDcf2X$wsE-BFc+q^!T;{O0rE_Q??anL4 z_qfh8ph?b?Oe&(+XvlWIln1Wett@Jj!0V;7n}e4nNmw#&`91G>Y~v^f$@Y|BQ;g6M z1n8Hqdpnff<^Ko!S&YC1Mom@ay_IwSBipIbKUFNNZM|yOz|sk)tlIC(Ima3>qJ9@L zP$URm7&^bDn3x|A_oHcLH7t)HEtU3<>15cMa|y>9b;jqu(vE%WKIwR>jxsteb4BJ4 zz5mGPV;asnMF9T-XH*=9@e_{aD(;zLWqfP2xiZ1pjm;1}6D%;hqt9qr)VgtnQ@wmO zSOOD5U6?k81<&P~5q4jqSM)H_1|?AajDyNrpYX~{cEd^kPvB2GySq?Y9a}M{l*=u? z{b{f{nfKM)Fd3fgfORuCs|`29x>5~cR+|yNO;!`3X%|c=TE=g>jVw6%y6|(Ax7vDh zqzgMhOFyfw$%$DW3)t_jt!S&4bGo>~QD0Q&$N6f_gu)o(PLT!rr6ow}U9NBUgG1Rf zYlJ7+>g}|hkL5pm%HH@Eq8M+&06p)_BnW$cM5rz3pDj$mloksNH&sO(Y6qyV%t;FqkDS1T z!1#MON7zq1t1jtlhUP@u9|&~BYf8Ky*K#t}mh}frOGy5geB%|T3vuks z;&Qi?xq~YXrpv$1l()wn{-G}6blkIQPlH8`k^iImRLJ%6iJyCZxYW#p*DmGg3w34X z<-0G18j{!+o+e|1F5o>Su_X4mWCcn_!-+J8-Z77p?k5NLhq)U%x7+KAgWPWhem=_4 zFt+b0(oCiRs__KqqHzr6ZvEtl1tXM>1a^?CM}eiJM=U!GD5=toJC+>v?mf3nMr8%u zDkH_4Pk1|=WPp_GNtV+kT?CEM^PA^TB4gILw77XZ3@;CK!m^wHVT32$EI}?K{6dEa zLeL8!hjt-}Q!iLHiSW3+&X*ae?og5GS5@z)q<6?sov5;zGpeIM1b@PkPvG)H1^_Y? zN;>qc3ex(LwcK*#sPpai@5n~o$4S<&F>cku@sc{KHTY(UXsN(uYHd&4T#ENBRF7$l z!akT^?HZcHw&e%IzqL8tk9O~#VidnEzA;~|Zs%`vI1n`02yqTix>SOCl@%yVp=xr6 zg(K1+n!WU~KKjSg#|srT8{<`JBq0!jTK>XmOglCZgQ6mFGA9VC+ip&56bO^uK#<`` zEYv7bvL-05_!14Azlq!rE{q*5GUL$c;`%7#>rn?1lVR?L2HQefJY9>-E)uWHoNw91 zk3XB)CNkjQ@Vi2as-064?7l9$pBmH5--r8}HELAExO5>SvXFn#M?MAYma0fHZE7qq zR6m{jX_{8{0h?~|x7l)z3m+dV;Lhoct70NU3!+Z>Wy&MVkMw~2B)8>5lxIdAnQ=7J?yYXD_4kWXgUs}t?UqpoJ zEVLTPw@fGsPNbMNcsFMMSQmIb2{bW*^nt~KlN#x$UNyBE4FWD#SDva2Q6#ux82rJ) zv&zOhY0VG8B4lsge4hxxJb4!~2Fc`ply@yk7EO{jP*=IXzjt-rrr#@PZ7gc#b-QXY z%T?5vHo8#fJkmH(Ne4R*81|q(z`P4w(Q5#-rPdF`Bnlv zu@$~MD=k`2{l1(XeqKk{CCJ@FAlqi`qdcBz^)a!7W+=0;a!dB&r0HGyt? z85^8q*+B|bvn|t*&D`(KqU9&Hs8^>EWGrH~yTt!3V^~nOdva2P%=NUHKue)eNgJUc zhqth-#k0A*oOD7$07|V|NfH_Dv(3@zO<4*eXC?=6g7Zm{f%Nv(sODtiN0S&V{X`GD z^#%AH%RetYBQtSe0$-@^P8uwM^S!{G(N#CrS!(snCUfEY+qEajI;+Lr8Fc=ZTXSZ* zg(gd@!|5x^BfBA0l#*lYmNjgu;V8y%CJfG)ZYI7q_l@(TKH;%ND6~eb(uL}31|Bn5 z^@+o{GE4Q7eYOKw5O6>UL2pL?xII4CjeU*Jlea^*8uXEXA%_)Bl2UcOi@d&4CI5f` z52YVPlE8T|vIwMaY?jZB5z!Jj=vJ!ik9@>h5?uU<8^urBZeqF1jMg&Bj}D7z#9ZQ- z^^>y=Mf2{O`1zjKo(i?H%13opr#xKr{jR*dSJo%g(Ddvrm+gB$a?iFL(Yj)>= zTE*S%u15LaXa4KMc(wzQzW{bcYm*e+k8D2?(x&eMBN>oEZ*`e&mE1o<&@+#BRKJXOF z;UWIa3~MyjMRuco<`W%n%jsYMU-=^=Y;@Vx;q8m#&v;SJxG!{4D%L6vIqW^Cq+ws0 zuAdWIcnkm0jf&_TYIE29;CU}NG^YLA{P#rj)!%uMhRqq@z=X{&E&g;aQ|V;lk^I$C z?mKv{aCjjUV32dAac-{+Yv$6^P8a1doReQrE9TpQKjOJEg0S8}PV^6bLX zlVV8vqYPBgA6y8gX!NB6dkhYl@fTA~4@c<{X;v^Qlu)+7I?kZnH|LA4i5~-%n7-j_ zEZF5J@klxzS9L0OKFRvuWBA+7kM|-oiWlk*Qk!Bq% z!%XIy<9T&&d!0TMf+x%*Ttgx*RXn}&B%8j@Cv7? z)f5lhE20WeizQVgDO}z4z@f+IU)=ZWm;K1b(EK&qz|YSD)9uArSZ7sCdcy* zUAx=6lCi;XC?ea@P`h9b?eJdGY z5-_AWq@ritIFxleSkHQ#ELT>Y4yLC{T7N8F6ND-tU5@sU9+k_3!$BY~rhceO^Bj5P zuXaTjt_quVk@(Ih-Y44CFZ|{-8QOT|4p)t%8^wwAeBs&nOF(n#K?@6FM36tYm#Twj zhLFhFW~)CxP;oCr)xqM+$!g2Yap8j$u>a{nw1C%fC#At8B4j7c9_d4wKnllywv7z6 zYjcCe)AL%ATh|1$TKaZ+kXbE0|Kxb@V6W`Hy8x4R$6TYO9*!9BE-?Q7%E?taN+KRw zQ0L=}Q~uz7<6*TeIi%ug`I6ww2odXsI^m^w#U0@YKQwx~xB$bB>SzTQyX_XDmCKn7 zch6?$_0B~iW!G)JA9l_2mX3&@UWSVU6JRIOqT&6U<@1NrLb670{fRP~dDrHiwrMpR z1I02Hzkm9Xe!$<#x z^mDNP{yU^*VupQuQCS-OgqCVQ6xOu}>h&<*HWwPx+9TghZ}#U-TyI|FOfK`=J?2&v z+Fb3R9H~J`t zOtEQ5cz8L{A1=yBt6((v{NZH8Wc7YE`Gd}z2zS;D^T+d!k@yGMfQ__j&~uV${VwjMi{Taf*`>pwNo_a%b>@ql|Z_XB(;5gxI1aI)$}FY-p7|-f!gth?sE zEnA(uI79L%I0j>+^am0MniA*G-)vJiXGsW$5esz`aqT=G@1`4COkq1R;BmVhZt5!} zkRf^fl zarWY9YpB*?zyQ%9j3U7z^;faziG*K%fQUbkbmWIS7bh@iHyN}FGIqlMLm|mGVt!B% z0T8BcY2S(GPM4udncLIfV}b*8%I zsX}Zd*;Fw!o77%V{pN>{+?23Nv8DN*@TqGK3^BGM_<+E?(aWre{()Bgd4QEeQ{ z)I$2t&Cc;MXksV4V{fzbzDaJEsI@qB^)|@o6o8_-k-+fYaiF)^R5%m3ycgSWD3q*@ zQ`zOCZPpjFRs+=v=~d<(0N6v5d547>>7#_vz@YUOUi&L`{ zciX`?l~IXOOvjVQIxBM=oof z(YLbzH48`7b_<}j@Wg{dojkPmWT~a7U>_eXig8nMRufG?=+)Rj^}sid6S}(XKkR67 z*0okZJjfF6_FitjpzYBHGf*xzC^tRK68>q>9f$V;y@4kU^85;&CAZ>obG!GT&Sf-K z=Wvrxp&*O-g)ZooT8yC>%s^&wy|c4qGnA86+v7jC*5glo@Kt#B3oM>M zUhb>Lc^goE93_e1=Q&T@A*XjY7>e;`#pAp|x%rTEsKLK0M$fCbuo2?@6|S}VV@NMH z)S6L{r*u?~-OKF+S>1Ww$rj{@phP?>1cnw%^fk}P=&xx? zNIa+Xj#9FCug&_|MIp5I1ze+|sJ|S6T8;biI$^69Q27uQDI=ehf90?rv!ZEqD~sKxtc-XCWIhMR{pxZ4=wgG{oZiJk z*jaxe}$A8i%m~%cCM0XdKcnKpj<(P{H?kb?;3k8MWY4TUu8ni{S1cDhyG(JnSE+yGOZiZRU&bUdA}yplP^!9MWotFa(dS$>|!>zX77h>QEpenT+K zhg=GoSETugO&W}YSWNnG3W-?BvExZO%h9f69SV)*7+1mDYG=Pke-wkCb5s8r4eRSd*=AwB1QZW`JbPcRAJmFwGL^% zcrGnRW-bNtmpIXrUD`qD zChX(K(o$Qq99$q<1QLyk6QZ|`$mX=WE7&=HZ*-3A77LEVYYwtRaU3m6RWGFkxjL#xfL zYob(f>C4iP88$0;0$u`I5|H^de>K<%w2Efi+eh9uL;2MuXWRRL2qJF2>7n3Gc|`-K8?yq;6uY}(Xx_Wx;=(y)Ocyn&P5b!SaqtfG1Xi~wTm&_W61v2%s(EtK)A z!a`AFec4bd(Eu`K{*f6nSYhfv7Jg9--B_+NQZiD1hnf~S0QIUI=nap#Z7 zaZE~NWmLAtS04B()04>&Bn4k-UVxPtOd)xs@P0gunNAKjYq4;S88SZ*1-BIqW?Sy+ zuFF!TgL?<8jXV+m-rBVYgd6m{DIBEk-2ah zFWhv7Y%`jnAOE%ZM-A&N1i0`@x>zmI5%Nk@EP0YXCCKt+h6b$hU%-Kt{pz+M-i1I6 zkx821!-)>>&(rQUF)UxLG2);Sz^t0W0eJ$DikAcj0nj*RMPSpNF}*JCR}zS0WsV&i z5e+bA2TVwTFQQ0og!Z?sy&%R5CubL^x8=`F<4Q`Bzft&SUx`1U{ndlR#O_h+XMx|w z)%&3*FPEnXc!m?XRMO<5*&_c8N)X8;K6z9Ha`ZP&no*$yBS8Z!Z3Szo#u#GZyjOvz zVNueiD&1W;d2Oy;VbV0xl8;vjxsS#(5l znQVbU9K??q+33wTy*PSa$**KX3wdMYr@cWYP>vg5>GaCM1m{YjdQ)HY%k|&+ow5;) zR0-$->ZB+^j5b7N+bc)R<}b8@2Le}kv3tW?0pmLXe*z>#55ck}e{TRcGY}~zrS5*5 z_FP1q0t6|pd6=2nJp@RQf0}-Oj^j!eD)b@D>-UjizzNJOS-WxO zyq3^@s27GM^*A;hVjrn;0i0QRc;0#&jK*vPP%#A$BKHP--f1K;A!1^040vy#-R4Dw z?(aLMAQ0%A`vFa;%E@*qH+B@NP;mG9<_5Rw^0l(98HrCu9C6HT9fqzS2pl6plVHazG*Cg9Jyt zs3h#N-PhaF1wS*@@BB4V;S$R>mi>x3OW5kddc0g=VhI|?CH5va3?_z8adX>0LMn}- zid7|v#6fgoiAN*F4gHl@v2kJX$Nwy&w0gEG{a*AD0<$g!>;j|r$K6ct@ zKhMAs1-uE}YlJY8$uLs=H~h{!w~l;iH0F05zHllWBI*YN4Me>AL^wEH_tlOko(sw3 zEAXc<@ZE>N-46Y_NY58H7VI?nH-sHD{kgW^oV{#E_2}E4G=ch1Z{?33U0DBlO2!1B zlx@c(&gF8nyO_u&HTQV`Y;hsTg4cHOd}Dc4vV~jt*LYWttjK;tX>%g_1dB|M!6P4me19YQOePGvV0o zV~ z((yEKZqo+|JDkg|WNMr@#9JR8FO5Nd{R~DRMG(bdq6G=cU7S6v^05rGD!a}O7b4W( ztmFsA)~?qa4Y|UwUu_Ofq#l7&+nlYGZ%d7O`AT!jnG!W7n^{&8Id#-sIuc>-&hFWrh0t zCw+FY<=$1k-yY+f{2mA0DD-SB7WdoPGs}t{6qtdy7>4Pj@Km({mg%nh$n-}%P3|Vm zsUy!8NOX2sgnt;@7Q?j~+_JCt8~NrOmNCcEa6!Q!CT>8SHe)wD-G3(2|9QSIqX3@t zxIJ+&_7uQCq{hG7jMsG4fkIzn18fulo@Aj6CNq>va_>Z93R~g6IktF1AAD3%AX?WO z3v)$kR(_wJn0Tr2`RugF;@k8ujuTvwi}x70jwF=^5yo? zSCXE;+QPYfn2qQgpF^J5CbDp74*be*Lzw~KWY3c=p}_TEev9n4ET-z8lHHoBejGbqDloSh2Y;9ATg(G!&!8QVM?b~ z+gKN7wSoqg&`W^#$=aTpf~4b_!KvObC6vT%7!)m;ViIw`5kO|rXng%uJ0sD{a1fB4 z;CmxSm$}Mw-7>^9s5~w74wpv8;G@pLQL28dfoTPu&$flT$x94;64@KnZgapSmu4%j z^73*~NDu4L7o;iM<*@i-2qtC)EuEJN7vB$_!PVxV00k~7s$LF{m+8eh0#LPh2+hJ? zT7VgfJu=B&=Z|QPUY_q~$HL|1BnWQ>e3IAzRWse4c9e;4B7 zq)=*9u*$=mrfM2~+)Cd6Gb6lKN{49oppark&-HecBYpL`x7D9_!1u<=m=i!_%&1c# zss;20aVMwy=>c)9P=Xg=fd6G?I=cvCVKzE4iJsL)cDXq-bT?ABdC;4PFatkM;fuXw zM;ZP>*8~flw(4T|wPV*gF%8|dV}jJ3IH{1cA^ye;lKJP}p|`wO1ChTCp#a_^Qgx!j zM9JOmW=5ttBVUw1LbxecUZz6BP4|;OmncFbW;@Q5jg^rD&Jaa~A4@OuAXxa~ESV_H zLuqvW)~spvGTy*>>nIkbw{vh#XPKofmlcoiF1;$YVez??*Vg63mM!u$5U-YdLE}Rs zqmj}-kGR%l_VqrhK7W7e_HXlKthbVkbQ_W4^lR3})vC;i1cIuBZYXgY3A=!SzJgUg z?r!JQ_s421sQS&qw{MjOZRYaSU35mx!b_m{CiBA5XkOY zHj>Apx1;nyM`xnJ)4|QEWAfOz&^v;}tg5(}mI8Pk0tG*`D9{H=!gQyD!=w@I8ndqR zZ`3Qik89yfnjYUDQdYud4(Dt1=Q8R-K6&2mpL_Jiyt-;_&>@U49GDY&4*P9H1SV!P zJKyGOsYb*@G-~#x{veGiVcGBjtsbaVLTFj=LLphH^`4I>qqWmGS{25YY!Y2_C-1(_ zx2N2%bY%8#X; zyK%_5jQlWQfMj@giJTV`B5OD5Ug}N6(@~(h)zx!GBTDCV{|}X4lXKePBWecoCR+-B zE_<`%TMUw$$}j-+_`X2bU66V75&U+O2`aU zQrmL<(SVSs0FtZsU5^PwzQK+HY=Ze^j7jSw(9iBRT%aV1RWfNMx)NM_1;7_FM~K*~ z;nhO`#v&qP((*lq-URk?ha14H{MjEW+`d)XRi7|&5(Jx28NA9lW(cDn&Ty)pA0BYS z{p4Fr@g?%CFO*&HPY}oIuB(sAjNt8oSB|9 z%;?$I!B8?BXt~@xv#)WpU;_<39Og&_e2zV}{-fNzM%WNu z)A{!O8MEyq>A~&gD)vCGy=w@e+RDkGq+J2v^UU^u#U_LT2D?kiR{1i;HJ|2vU7Jpp z>z$rt)E>_h=QjK$cJQI`a{!JT`h$eP!%&hp5k$|KbrVf?4`#)a-MP)Sm%}qVmV2$* zi&#mr7i-e|d^f++EuZdbhaO@XgOC4-NDmc<@bDTDA@^hKB5|GDM*H9dQD*aV^>W=> zJVQD9mp3a+n-ZTwUil9UjDjb}2-Q3xeEKVRsMB&IeK6dRwECDyq=j!|=HdQQ>zuC~ zI)TK``dp7(Px{rCr#8>5fg$PA_Sit9&-D7`AgKFY6kO zAaz!M8O19xM}Oc!4iY|SA;d}!WxxVbY1xf5U_no#JnPn+htuIC>fGaOwze;>sqSMZ zH>IU)eYnnin~lu+9rUXWKqOE}(?edn^yEG-IhtHpd1)+vxYr?S;ZK>tI=UUPZ`ClO zMRImMRNqx^bS4DUiY^!}B1k^&ybx*C^JVlGEPLzqO!ym_t^B%(6?}Tt=I4dhJBw+( zi%#x7{ts23+8nKvA-_Y&JR&;F1^S~>@(OqQo-dUM$7}w^udXV$JTK?g1uV2ew#q0Z z^SvEZ3`>J|_E#_OO~Ku5#DHZWgBky&;HM#6u)@Q_xf#vT^mJ`1%|EwBwOKNnyzjmUue7x_lf9fzLY!g^h6##k?EuS`9^do8e zRhvDmZb(=7Jq~w|kl8jn(7g1*5~;%t~5NxR`oMtU3qFH<^wP-MHTv-@*XgBn}9|p%eAExs7%_ z`OQ~<#qLmkJfd#kv6T)?=CSBH!C&HdY*Ca=q2f+23DSHyo!N2^^9}|ey-F5XCJ~y$ z^N`p_D4R3cw1aZvUBhl09@SJhZ{cOB;?WEaJf10xZs_yCLhGF+?Q10wi_^CxE zdw5Q}UOYA>72RpyyXkA{RSXm90D11U@r$!CR4A5@@ntK^5OY~KJ&?dU@Md6Ur?^vC zfwjA%i$40Li-Q|a6I*O*?^Ymcq%(HTR-xQ*lDoe*o=8 zCUpH$2glxKouP~q=y}6A_AvU#UISbMLhzA7gci9&O;yqL_v_YKB0zEog7H>(Gnn%! ziN=J9R7$@u!#Q(ji9BXzxukb_#GaG?`R`a}Ca?R35sHUx8}ZN3F_{-<7Z-D`sZvj@=IW+8RBpzZF+Wl?^QMknz-7Vn=53IA8wez1?bpypL7XPV;oWp1*+C z%|))6nJDFUlw~IOdl!KE@XMxgDyG8z;(S&1<+-5vfgk9l?~T{oja_xW%*1xSp*(r! zc|Kd~@`R|hJv5=+I-zMTPqSA+>zybF7`MZWskIo%Az0re1SoqiZQR! z$3haUimV29Wh&C8E^6{;$b3G?9Xe@#dRo*+*67~xm_k@qC)J-o>FJ?(gn(QJa&4vT13l>;lye%@ug=hh@f)f!|E+m|JDY!tX(i zGSgAHe#D}%-@!k1$w)xp2OE-JwImi1dky}bS*1l<0ydC=^hV`RlNbyCKxOH29#hoy zl;OE72(Rlr{So=+<%aFa;*Z!9I@4)r!QnzUK9%8q0z!u-be8o}$^BlYzbY;VIS1tz zNq2DEjinlb7T)*eWlJI{0xauw4l9dis3X%c)3+O0V5CHBcK>#O6^#>jE-h3m2o?jo zeh3x*4%0RIlUZ&#I^2KTf^z3)YbkYAV``oIrZs&Yw#oooGTt0JTg_>$kVBz7l}`>+ z!aMPI2#bgfjRRqwG3{dD2kUu1M)#@Y2)!_xT=T*OMx$`SAG5R3>Ub&>4`6W(nqNsV zX3XqmI?n0J`2#~%tPr+>qPQ|X)_n3rX=+u59RF~kKfuqN6Dw`CVpv2JRR)`P{4tHc zrXt<@IEkkspUYx`Oq&A(FjngmD}=Uc;@wOlhb8QQKd&)$Kq;~-2G~Fp_D@20tJbfC zwf=SkYX5L5?vL|D3PtAmaD}>BgBnSS07t`Z(Q2%R^5||>Y?s4+gqd1P%hxK@BiGC2 zwc`Z4&&x@3?);#`O!gkCmm?QLR`>}YMzuM*=}&zZGCaa!!%2=DR|-$o-tSKyM$z8< zLtq_~?Aj`n@3wLDh-o{3E*k9Xr`q`^S5S|DS)JQ4%5MSxq)# R>`=g;q^OKYnb3Ei{|6!K!`T1; literal 0 HcmV?d00001 diff --git a/manga_ocr/__init__.py b/manga_ocr/__init__.py new file mode 100644 index 0000000..65120cf --- /dev/null +++ b/manga_ocr/__init__.py @@ -0,0 +1 @@ +from manga_ocr.ocr import MangaOcr diff --git a/manga_ocr/ocr.py b/manga_ocr/ocr.py new file mode 100644 index 0000000..c350d7f --- /dev/null +++ b/manga_ocr/ocr.py @@ -0,0 +1,55 @@ +import re +from pathlib import Path + +import jaconv +import torch +from PIL import Image +from loguru import logger +from transformers import AutoFeatureExtractor, AutoTokenizer, VisionEncoderDecoderModel + + +class MangaOcr: + def __init__(self, pretrained_model_name_or_path='kha-white/manga-ocr-base', force_cpu=False): + logger.info(f'Loading OCR model from {pretrained_model_name_or_path}') + self.feature_extractor = AutoFeatureExtractor.from_pretrained(pretrained_model_name_or_path) + self.tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path) + self.model = VisionEncoderDecoderModel.from_pretrained(pretrained_model_name_or_path) + + if not force_cpu and torch.cuda.is_available(): + logger.info('Using CUDA') + self.model.cuda() + else: + logger.info('Using CPU') + + self(Path(__file__).parent.parent / 'assets/crop.png') + + logger.info('OCR ready') + + def __call__(self, img_or_path): + if isinstance(img_or_path, str) or isinstance(img_or_path, Path): + img = Image.open(img_or_path) + elif isinstance(img_or_path, Image.Image): + img = img_or_path + else: + raise ValueError(f'Invalid value of img_or_path: {img_or_path}') + + img = img.convert('L').convert('RGB') + + x = self._preprocess(img) + x = self.model.generate(x[None].to(self.model.device))[0].cpu() + x = self.tokenizer.decode(x, skip_special_tokens=True) + x = post_process(x) + return x + + def _preprocess(self, img): + pixel_values = self.feature_extractor(img, return_tensors="pt").pixel_values + return pixel_values.squeeze() + + +def post_process(text): + text = ''.join(text.split()) + text = text.replace('…', '...') + text = re.sub('[・.]{2,}', lambda x: (x.end() - x.start()) * '.', text) + text = jaconv.h2z(text, ascii=True, digit=True) + + return text diff --git a/manga_ocr/run.py b/manga_ocr/run.py new file mode 100644 index 0000000..3362242 --- /dev/null +++ b/manga_ocr/run.py @@ -0,0 +1,96 @@ +import time +from pathlib import Path + +import PIL.Image +import PIL.ImageGrab +import fire +import numpy as np +import pyperclip +from loguru import logger + +from manga_ocr import MangaOcr + + +def are_images_identical(img1, img2): + if None in (img1, img2): + return img1 == img2 + + img1 = np.array(img1) + img2 = np.array(img2) + + return (img1.shape == img2.shape) and (img1 == img2).all() + + +def process_and_write_results(mocr, img_or_path, write_to): + t0 = time.time() + text = mocr(img_or_path) + t1 = time.time() + + logger.info(f'Text recognized in {t1 - t0:0.03f} s: {text}') + + if write_to == 'clipboard': + pyperclip.copy(text) + else: + write_to = Path(write_to) + if write_to.suffix != '.txt': + raise ValueError('write_to must be either "clipboard" or a path to a text file') + + with write_to.open('a') as f: + f.write(text + '\n') + + +def run( + read_from='clipboard', + write_to='clipboard', + pretrained_model_name_or_path='kha-white/manga-ocr-base', + force_cpu=False, + delay_secs=0.1, +): + mocr = MangaOcr(pretrained_model_name_or_path, force_cpu) + + if read_from == 'clipboard': + logger.info('Reading from clipboard') + + img = None + while True: + old_img = img + + try: + img = PIL.ImageGrab.grabclipboard() + except OSError: + logger.warning('Error while reading from clipboard') + else: + if isinstance(img, PIL.Image.Image) and not are_images_identical(img, old_img): + process_and_write_results(mocr, img, write_to) + + time.sleep(delay_secs) + + + else: + read_from = Path(read_from) + if not read_from.is_dir(): + raise ValueError('read_from must be either "clipboard" or a path to a directory') + + logger.info(f'Reading from directory {read_from}') + + old_paths = set() + for path in read_from.iterdir(): + old_paths.add(path) + + while True: + for path in read_from.iterdir(): + if path not in old_paths: + old_paths.add(path) + + try: + img = PIL.Image.open(path) + except PIL.UnidentifiedImageError: + logger.warning(f'Error while reading file {path}') + else: + process_and_write_results(mocr, img, write_to) + + time.sleep(0.5) + + +if __name__ == '__main__': + fire.Fire(run) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2cdbb57 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +fire +jaconv +loguru +numpy +Pillow +pyperclip +torch +transformers>=4.12.5