From d54351113115f8e4378d6ea2a487b2a4d98537e9 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 22 Mar 2021 13:29:24 -0500 Subject: [PATCH] Finished refactoring to SharpCompress. --- API.Tests/Services/ArchiveServiceTests.cs | 136 +++++++- .../ArchiveService/Archives/winrar.rar | Bin 0 -> 24 bytes .../ComicInfos/file in folder.zip | Bin 0 -> 124383 bytes API/Interfaces/Services/IArchiveService.cs | 2 - API/Parser/Parser.cs | 2 +- API/Services/ArchiveService.cs | 311 ++++++++++++------ 6 files changed, 331 insertions(+), 120 deletions(-) create mode 100644 API.Tests/Services/Test Data/ArchiveService/Archives/winrar.rar create mode 100644 API.Tests/Services/Test Data/ArchiveService/ComicInfos/file in folder.zip diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs index 8f30a675b..6182cac28 100644 --- a/API.Tests/Services/ArchiveServiceTests.cs +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -1,44 +1,51 @@ -using System.IO; -using System.IO.Compression; +using System; +using System.Diagnostics; +using System.IO; using API.Interfaces.Services; using API.Services; using Microsoft.Extensions.Logging; using NSubstitute; using Xunit; +using Xunit.Abstractions; namespace API.Tests.Services { public class ArchiveServiceTests { + private readonly ITestOutputHelper _testOutputHelper; private readonly IArchiveService _archiveService; private readonly ILogger _logger = Substitute.For>(); - public ArchiveServiceTests() + public ArchiveServiceTests(ITestOutputHelper testOutputHelper) { + _testOutputHelper = testOutputHelper; _archiveService = new ArchiveService(_logger); } - [Theory] - [InlineData("flat file.zip", false)] - [InlineData("file in folder in folder.zip", true)] - [InlineData("file in folder.zip", true)] - [InlineData("file in folder_alt.zip", true)] - public void ArchiveNeedsFlatteningTest(string archivePath, bool expected) - { - var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); - var file = Path.Join(testDirectory, archivePath); - using ZipArchive archive = ZipFile.OpenRead(file); - Assert.Equal(expected, _archiveService.ArchiveNeedsFlattening(archive)); - } + // [Theory] + // [InlineData("flat file.zip", false)] + // [InlineData("file in folder in folder.zip", true)] + // [InlineData("file in folder.zip", true)] + // [InlineData("file in folder_alt.zip", true)] + // public void ArchiveNeedsFlatteningTest(string archivePath, bool expected) + // { + // var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + // var file = Path.Join(testDirectory, archivePath); + // using ZipArchive archive = ZipFile.OpenRead(file); + // Assert.Equal(expected, _archiveService.ArchiveNeedsFlattening(archive)); + // } [Theory] [InlineData("non existent file.zip", false)] - [InlineData("wrong extension.rar", false)] - [InlineData("empty.zip", false)] + [InlineData("winrar.rar", true)] + [InlineData("empty.zip", true)] [InlineData("flat file.zip", true)] [InlineData("file in folder in folder.zip", true)] [InlineData("file in folder.zip", true)] [InlineData("file in folder_alt.zip", true)] + [InlineData("not supported 1.zip", true)] + [InlineData("not supported 2.cbz", true)] + [InlineData("not supported 3.cbz", true)] public void IsValidArchiveTest(string archivePath, bool expected) { var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); @@ -53,21 +60,114 @@ namespace API.Tests.Services [InlineData("file in folder in folder.zip", 1)] [InlineData("file in folder.zip", 1)] [InlineData("file in folder_alt.zip", 1)] + [InlineData("not supported 1.zip", 1)] + [InlineData("not supported 2.cbz", 0)] + [InlineData("not supported 3.cbz", 0)] + [InlineData("mangadex_131.zip", 577)] public void GetNumberOfPagesFromArchiveTest(string archivePath, int expected) { var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); - Assert.Equal(expected, _archiveService.GetNumberOfPagesFromArchive(Path.Join(testDirectory, archivePath))); + var sw = Stopwatch.StartNew(); + try + { + Assert.Equal(expected, _archiveService.GetNumberOfPagesFromArchive(Path.Join(testDirectory, archivePath))); + _testOutputHelper.WriteLine($"Processed Original in {sw.ElapsedMilliseconds} ms"); + } + catch (Exception e) + { + _testOutputHelper.WriteLine("Could not process"); + } } + + + [Theory] + [InlineData("non existent file.zip", false)] + [InlineData("wrong extension.rar", false)] + [InlineData("empty.zip", false)] + [InlineData("flat file.zip", true)] + [InlineData("file in folder in folder.zip", true)] + [InlineData("file in folder.zip", true)] + [InlineData("file in folder_alt.zip", true)] + [InlineData("not supported 1.zip", true)] + [InlineData("not supported 3.cbz", true)] + public void CanOpenArchive(string archivePath, bool expected) + { + var sw = Stopwatch.StartNew(); + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + + try + { + Assert.Equal(expected, _archiveService.IsValidArchive(Path.Join(testDirectory, archivePath))); + _testOutputHelper.WriteLine($"Processed Original in {sw.ElapsedMilliseconds} ms"); + } + catch (Exception e) + { + _testOutputHelper.WriteLine("Could not process"); + } + } + + + [Theory] + [InlineData("non existent file.zip", 0)] + [InlineData("wrong extension.rar", 0)] + [InlineData("empty.zip", 0)] + [InlineData("flat file.zip", 1)] + [InlineData("file in folder in folder.zip", 1)] + [InlineData("file in folder.zip", 1)] + [InlineData("file in folder_alt.zip", 1)] + [InlineData("not supported 1.zip", 1)] + [InlineData("not supported 2.cbz", 169)] + [InlineData("not supported 3.cbz", 1)] + [InlineData("mangadex_131.zip", 577)] + public void CanExtractArchive(string archivePath, int expectedFileCount) + { + + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + var extractDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives/Extraction"); + DirectoryService.ClearAndDeleteDirectory(extractDirectory); + + Stopwatch sw = Stopwatch.StartNew(); + try + { + _archiveService.ExtractArchive(Path.Join(testDirectory, archivePath), extractDirectory); + var di1 = new DirectoryInfo(extractDirectory); + Assert.Equal(expectedFileCount, di1.GetFiles().Length); + _testOutputHelper.WriteLine($"Processed Original in {sw.ElapsedMilliseconds} ms"); + } + catch (Exception e) + { + _testOutputHelper.WriteLine("Could not process"); + } + + DirectoryService.ClearAndDeleteDirectory(extractDirectory); + } + + + [Theory] [InlineData("v10.cbz", "v10.expected.jpg")] [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] + [InlineData("png.zip", "png.PNG")] public void GetCoverImageTest(string inputFile, string expectedOutputFile) { var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/CoverImages"); var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); + Stopwatch sw = Stopwatch.StartNew(); Assert.Equal(expectedBytes, _archiveService.GetCoverImage(Path.Join(testDirectory, inputFile))); + _testOutputHelper.WriteLine($"Processed in {sw.ElapsedMilliseconds} ms"); + } + + [Fact] + public void ShouldHaveComicInfo() + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/ComicInfos"); + var archive = Path.Join(testDirectory, "file in folder.zip"); + var summaryInfo = "By all counts, Ryouta Sakamoto is a loser when he's not holed up in his room, bombing things into oblivion in his favorite online action RPG. But his very own uneventful life is blown to pieces when he's abducted and taken to an uninhabited island, where he soon learns the hard way that he's being pitted against others just like him in a explosives-riddled death match! How could this be happening? Who's putting them up to this? And why!? The name, not to mention the objective, of this very real survival game is eerily familiar to Ryouta, who has mastered its virtual counterpart-BTOOOM! Can Ryouta still come out on top when he's playing for his life!?"; + + Assert.Equal(summaryInfo, _archiveService.GetSummaryInfo(archive)); + } } } \ No newline at end of file diff --git a/API.Tests/Services/Test Data/ArchiveService/Archives/winrar.rar b/API.Tests/Services/Test Data/ArchiveService/Archives/winrar.rar new file mode 100644 index 0000000000000000000000000000000000000000..2193513aff00fe5030e585408735b6ffbabb6828 GIT binary patch literal 24 fcmWGaEK-zWXJj~dKR%3^k%d9FJS>ozm4yKSN{j^! literal 0 HcmV?d00001 diff --git a/API.Tests/Services/Test Data/ArchiveService/ComicInfos/file in folder.zip b/API.Tests/Services/Test Data/ArchiveService/ComicInfos/file in folder.zip new file mode 100644 index 0000000000000000000000000000000000000000..feee23120a55ab7126c8282ae9dbfaac933a0beb GIT binary patch literal 124383 zcmV({K+?ZZO9KQ7000000QpTiQUCw|000000000000sa60CsO|ATcjcO9KQH00008 z0PIaVQVNesHdWyP02t^203HAU0CsO|ATcj+Wq4(5b1iUaZ**@hHZ?UdIW##gYH(+) z{B=|u-_|vZHX$K|5Q4h|_ds_e!4tgE;4Z=4U6bI@xHcNx-GV1bV~x9q;2u0^Zj;|R z&vVZE-uuTL-&fFsJ!)6YEo-g0=H6BGpV>b@0N65;5J>ONqYH)Y5+SbP<38AOWBPm;rnrjGZ0cy?-wU z`2TraOe3#G9uw>jSb+ck4h$1hXJh2wTjWRI*ulvK06@`2mY=)3I6RaskY#)$>%V26 zhq4p0gUE8sL)rYFa^Bx-{waU`dyT5H7_y8&mfxEHN7?8<%KvKj;XpM80sdbaIS(R~2` zUIqdH4I{>`PHz8dniTmNMCnI0eiDan{rm!3gg}Xmi~5*321G0nC;3FlUGKo!!Rtv_ zb*fL9Wry!X*AC~OKYtbgfq*AyXiuL##d!W4;{_J-2M-q;8yAm)fDrjZ!Akau4Ef8- z@S1@Z`4Q*g=y2nPif2jx#U zfC6c>Cnyh&{O(Dt-@dQh%0$h-XdLi^Wb8C8D`5BLA9%Hg7)y@nsySBy!Iny; zn%q4&o!9}ABBfY6Fql9wzstWt{tFMnV?LGE-saF9QF6k6K#rDCl=qnU?|TX;S690nlT^Z<$h?Nh@vT{Pk_&>d3H2F`=qLV)W@Gt$ey-fGhsI7$+ z8c%us3Hu&#hMgO`+`O5wuNp7N(=nm@yRKFrMWNc5*~It7^u&Px6t>y4)-684_`C<4 z|28&6c|+KE&AU?XROIpKjn1YBP42YS)vN9$M(4>h9a1;hSL1`6?&Yg~NY_|KCnoh`1fv5}sN1tQ^t)190}qSXUJg6y^@1jBnj- zeqnw2f^%wctIBCxr2z04IeH1OUv@#Ia=s0YwRPs0j4~oVzMud9c6NHH;p?hVVFch6i6rY>i zOQOMcKB>CuO_~T7yVBtVoW08E#5Cb=x}uE(@jN~XF@XLh2& zNibu5hyVXFn(9~kWWJZWXDfnNwTg%KajnfEt|DyY8WIaI?w*h(M&$g?{g>IY zzWaQKdudc%nUA=)k6tAY?j0R@YUWY~)bC!)w>@_wCjfaO$QO5A0Vr6{U<__Iv$Rz> z>#eB%`CBjD#r*vimnMdt65^2blJQ?mpp|YgknZolckg@J5VA=1#v|XZ(7kW<>GFYB zMToP^Y96Vl;E@O{OXdpz2xo@Ttys@yMELv~&_2#AZ*YLHH58zt?Py)5$1?Vpcyz490x9mdL z&yKW{DlQ_MhUV~V(=#UW{tv@xy*QbP^ir(75*fbEa=1<0v>mhad^=}<;cFn)lxsH; zo+$zjK=!xZA<)sxBrbX(Co`Q19`-Uf)>&5Ho6K!#T!Pu`#NFk;1EZg@hj)mQV$u6$ z%x}Gs>UOu2v9rO?0aDrf*X!Zc$Uq#;()wszXT5KID4aU5f*fiU< zo@;WuJCz@&mgQ^B;Qvn#2ARak;%*K3J=k$o1;t3A*EwASf7pe{X#nUV3K!wmoKEevGRFR&TE z8J*P@J>D9>wbx@8Ms0@ zPRKf_qs8@LmQP`wTFyv*{lw*eEyo}SgT*OaZC%B09T}dDko~gux9~Yw*Nz;&^5*gq zo+;aQJv-8jVKF}W&8Kx%GK1bjXl4%aJq}UR8*XLbT#?mYink0K*bs^!WMr1HL*@wv zw|}7J`eCU+bLAw*cGIi1**mI!AHtD2f1xYBI-b@k@EJviN?TK|(?ocZB6|QVO(Eam ztz!hpP5!c6`{VqVQp@L{o~4`NOEyVdSlMz7M8-M3`F|q>hJ+3zm2n=dJ>?h?F5K0( zKW&Sy6ZSfhoSi*&a~;3P5D}}*x0>uyq)qvT7|vJ!DuE6LL6VmUi?`0S_%6A@q6?{w zc|Fu>U)9G)>-nVP6OisKmyz)oJ(Zm>@B<3h*z?HJlgp9z*n?%U(}v`kETJnO_lDM? z$!7hTqHXRo_DtjA*uhm(^YKzmT5>H|ob18R&Dlo%+)PtGwlnqMY016>w|e$C6}rs_ zwl|miiyk4$8Hfgag45@tAFv^Ua@JvY{POA8_0iT5XXUu%)wt!^U9?_XWwy=u3td0s zm#qAeRzCt?4KT+=&&NhiY^=~4e01a9*-yaYB_7K6TV+s=vuFGtO3Ee1G$ytV&fBkM zH*z&#^10a&?%2!{oW0@wcKb!go6_!>QEATA7p*-q_YL!!vt|?DgA=ZyMbP!P&j!X? z+I%hF;u$X2@v1Jhm>W;Laks_qVcYo2{@~gg$OKsO5%y;mSBp3MLl)*2RP;W70K1gc zn`%iSv6T|bFM;Y@SvKiB4i6N&$HcW^i|?oaE*Z}$?Vi7Xs*&+Mu)S~ zsoKSer(S4Kyv7Ol!EKNsv;!_svcP=zMBBy6c+0|4BTFiJ#V6?W51{-yIsUgvd($rt zLCWQkOt9we^?i%Gf#}$j*PF%R*ZRKv_21q|vLWI{<{z^qnKlV2>rCPql$GgJSnh7l z?HrKyheKLg9`bnq9KSpv^r_V09pDc1H)1|iAyK)ld}?YzpEZtiYewJ&ZuGpiROJ@4zzNv82rwP?u3ufGZ7UX z@<-l9l9_u=R`IpkAlVTq=g@n={PwkOZPAQLTfg#AV#3FCPd`OgCgNG_Z13m*`}z3Y z{}GK~No;hME%VbkEz)apg*KL!V>`E3jC(D9h293D zt0`QZO$eLjhi0$K?F`)BtfhEHko-s#L>rH{yCIZHM9IZsd58uldQ?ff$s2B;zF zIg=CW`00>-)<{>mZpM>&{ruy~&)(5_SM~w3*E)SZ8bvv8Ak_^j7U{Wj~*lP@A%SKji|3^63d?o)1N?9tP0Fbgy*JPgOo0+YbG zy2(zY?nfK%kjpV|eQu#U(S$I^v4Ppy9{}60t~-e}VQ&Mm=95DA-JAB(FVmx6O$2ZC z&GA?wSrP-OMS&ItvU`2=qcJ6Ee41@mQ=GU%#b~3I$&{xqcYU$6%XdsqNeAgFV&()o&?XXkZY+uUCHJ-7PcPHdC^SeKcD3u*BlO57; zWDIZpcy4cRXKCq7nRrZ<=q1(UDfKaJ_YVN@^QrTfpA;L@Zg+kc!$GwrXO4X7x~`P=n9z%$cIOqViO{j8pnQCW58XQs^$5C$F+^ z;TGgZ$hApanRsb*=^N}&uC3|Q{Q<~aDWb7bFk&4Ech&9jUT~Es?u~bER)d+8i}kI$AG%{61(#mXcwAwP&u~Of1jqxbT{u0~W`H323T<3(0rKNEQ82r|-II-7}n7w{z zd%Q#a4?wEJ*YUpgS902Q^l0Xj)vfEU&fhZEX}9G0uV?CZnqNecnK{1i+B^m`O%&>) zkkg{qa%s#>ZJ283y;G$t+q)1+DLwu5HN`jVkwyfH*8kquY951sE(B9YDbOJBm{9 z4?tt&g1jL_D>`>VyRzR)qetIhUpRR~pM#^IHF-qJ{mYti^}L&q{$V>(`&t?~dw3== zPnF?dVFwx$nqK61f^tBIKlT=zV3KvV%R;J2y>E5|2Rbt7^W z${o-hptNXa_I0MraFrb2D7`Peqq$C*$uh!@T0S>~8_q>Lk%Uh8dFgp4?sB;VDB<;T z?HZjf{l(5ArA=X9K-Tlsyr=s*!Ecf~Y2)kkvjyTN{k=lKu5$i3yP_!~RR%iY~ z?zK4{uW&i%V=*W#dY#c9fEiylnX6UUMz$~ zC_0zU^{c5>x0$PC20H{Dj$={ln`zasTR))A6b`o?sDjDKa%Wj8*cJ!q{{d)C>sW{f zQDbUAU|@-C4c?cTr}v)la2H+59%L9&sBN~ta<{s&?>JK+sZq3WswE-H^)Wzy7hb;~)D9BcZRM;F(xD~@e6 zsbBE%yIH`21af|4yf2@My>xOvjFcuV(QsvQ&gg|N>+ShvZ7lOF@AUloQ9X8i;(SSw ztk_iS)t`q!d^^lwOX^zs(HKfg+>^6n@|K`Wv+;yolfhQNXgq)7vHSBh-TC9Z_qvox zGg98#s|66qxCb2g5qx#XD)0(_o(yjuw!u~kW*;+j?V$9mEWO@J_W0@-dU}Xacj38H z-@a10+sJLN#ZoCtl-4zrt6c67g^g^hPG@hoC((+2Xb#OAH^F9GWWCr7YwabsG*XCODVc=@sc99=#Qj>x!@WOraBXqL)*2Ssi zmD=q~ZZ5V&jqH#iqs{SRRTO+$bV+vN#;Mgx(_*Y4)!NRZ4xlo)pylDEacbJ zJrwYZwpKq6;P%oKTxM`3O%%n6qP6(`W#s%Ft7f6Xut{R)gk>DOuRA66xpE!(>5IbB zu?r!BV(d6~WqD#K`5(aZ=;w3U6qZ!9>gy5wL**kQIWaS)X2b*79#GVr~B0 z*46xZx3<^A88_mFqu(|iYl~INa4@i;ug0J{yC$rhx!Ohw8lZLe5LC|U~m|4E3FT4Kz^8WeA znzK2K&i=B^U8S-x+pxM^Hf!_PxoENs8|nz9B}7i(&*6IIS+oG$4AyJ>sP5smFB^rX zOyrkP(uPa-`Xln%w0wYSr4$&IkGo``LM;^|A`?M*{tVAJVqaM7N1N3W=5MiO~%((!mM!9_H_|{dc+<+SEN6|oI^qyS8>uG?z5kA7375pyJ5M9oiW(rrT zG@I;O;5ok#g@7d8X14xE?OX&|FZ! zmohD7sMaiW_kxyChM*);jEWAYNufU6C9^13dkG^c&>OGCKjQFS7`c9tyYMGG`EgT8 zyT!r2C}pd^Qons(cQnt2nla-1rm4-3Q$R{SM^+LP-Fef6HPF7o805ImG8-s z6fo07DgAicG5OwEoPSA`a>diKz%$6OuDG&)jO0s|z{cFCSr2)HpPB-(b`yvuZV zs+eee0nkm%4m)SAqI*QUze9YQPUeRyi;4)qL-^?YHXi*YXki9)1C$u zmYO*`V&ST86g#C721lrbCk$H*F$A!L|CW%c!!fbGC=up;>*J*07 zJ|?7N*>#DqZ7*qybkcL!8jn9x<_A)xz}bmwu3Ho5YYA0a#$Wpx<`F2IuXTRg*N!wE zV1cXB*Nab|xEj4}`_*|Jlnm`9enF8+Qt*jRz`issHu6;D`Mz-WhOoTGr01bgb+dx! zf_wAcHHGzMxdQiT)1ftc#mJ+}fDd&{H$aat+$>+VCIqL)pTV_5-&Xg=eGqQff;JMv2uEh24fm5FWpG{l-oamsW#rh+lJ%{XWfs5VB9lJ71AE>Y&j!Qwc*uK@ zDaHINCFK=|3B zK1Ew)ETny;wFH)9=UBKbW(N?r6{*!0z1E1k>WV+JS3T+AsoWz^=6QB5c%t{ze(Fqn z=17Yc6`ZiEs9sSw&=*C=Y3|Q zGE@0ny)1Q4Vd=OnbX#2D>j$?A3N4d{F+P3S%_#GZ3z1i+1IvYoQ|!!p*2Z`9=WST^ zHx06+SFJOAk!h0k55v(0Mo6@mz8P_98j<8N*GKcJE0wIW9$w1c93CR1CR2wo&8J8? zG{0R)9RD&VY^n0zyzc!nHQHnn z-rz1UWNbEG0zh{}GJr)-dns3bw%xtD$Lp`GayfXrTG5Pr%vhgSWcTD@vn0#PmFONCbc9i^zATOMG0$7Rlxe^u5L; zsZ%90r9(2fxFu1eoTaj#t~xT$s0>d<=qh(^D@ES8rmy#ox@EZC_bfD^2V^0~(Ued! zjh;;m2U^tW>@3)z&c+0CSEH(^quOz)ns{-SDo??2-;WIOz$0&77UwaGPQe0;qEwWb z<0WW9!HuMSgS=r^g+yO36d6xnU3ZXu9GO0iWY1iwSf1%{`;P5=HEfN?6Z!rz=Ytz- zv!B0Z%(O-$r)6gh{bZ9w%rX`3x?Rnf$@Wpwg`$~gyv5idyvalfM3)l(;)~3ZzoFSKqFW3o}MLtyuQ-s+Ur$p9&tBg*(ybgYMxl=0!bN*daqxDRHn~q z@`SfR##Ot0$tn4dm69#GrI-E_HnvMmhSg~Pe26u(t?3Htzs-!|UzVGalITEpYa0^@UoRz&kfgs&<&DlYsv zPra4{V2Dm%4Z*?UgKOVN?~8q$Pe}LjfF)Qx=nF!qR?doe+wmKhw@lynfy3SntOGnB zk;{+P-Dz;yCR*D}ZKD|+ifNULPos{Bs@a~{{kZVitJ4}SRLM+xl2Zjn)BSdxEp7oH z1P)$Fm+R=Ip73=3O$gn)2OpkuvHB<)NXq`O^YXeUG5ma$`b8nruKT=?oG~9o5U0x2 z7dDT~FteEmV~VOX~rE}Ps|(?;Cvx3wC5;2Pi?WX7H$WJo!jte)6I4{ z^9}OOu(HgR?*<8sL| ziPuIups%)U3QjvUN?@g$sXzElvImlAIbQ)$CDemPo_70|)TBvknwXNTzD`BS4ln^fW!V zm>XAf*lNg#_=Ysey@_^vgS&-ih_vQY8fx^Fvp~^h7R!(7HZsPvkNmm~S$c~u*9$~! znGTg{L(X64TuMHo29g3JnCkq7hvVLv(8{#CvUJHKt$PD>_SM;kh(@&oWp(BO`UU)l6XB zboM#qF=hFPo{e6o&4ySp&hFWh_+~R-XIZx${)1kCSJBr_t&!|;l`J9YKrHrCnVew5 zQ~mrfBHg8@Uru$G7M-=LDkfcUr+$!a*x237-nInv9Be!9QV?2Y+0MGmU%T7P#*}WJ z`dqv=Wl8L2Lgsrgn4>DptOzh#hBiDj67eWo!JJC1+AdwTRC&QdyO9;`!;qwlGdSnf z)->!OUh+t3{^WLJaW*}OvzH9zWs>D>ZrV0w@A|!e{Px!r+LvmnC;I}zX*$XqxqYsu zeC^&y2e4WtULyOJuDV{`Z z1&~ma<Wf$#D-|~4fSRHNz^A;g!*q8K zT2eD2+a=#U!^Nu>BT+lG?qGGkGq1nu$XdIY@=OWI&5KyRpkU~^Nm9tw;7H%9KDAH- zh`&LuX3fH{%|xG(H))-G$BLrBMm(<5YdLq}I`1hG)ojZB;*?&=SM><{=^M|h%Qa&e zZTD*>lWu9dHE1DmXGiMnl@4m|r9aPUYx^EAHtljbt=m!v<{7vawLeXiWMUR*y zUl2xsc_)AYL1MyHO&e@wJ6MU48M(|<20F6B{pYsZ3w2^zFj{If0tt1|9Ng5C(YDcv zY|bb%>;dyCI`(6~~WJ#E7<;laRvsaTW0GhxD zsSImR`%rSM#RcA(D5>{kDVlGn)T*}j+NoP~KjToC+h6u12cmbQ1D~i$HL|)l7LCOO zi+)r7xQVNA8h2Yd;+na-rSBNKytS%_kGXTIP!E+VK@5q+PuTukpTOh9$C_JrYXc0ClG0u3LNBwLABXd-b?Z0 z?}ZnbWvc1&jO=Jiwx}-PO^r^)R_c(yv^Ls~8rU(!s6fbLjG&9Eb69P>00T{cFLG#j zv(&EqGY*7|M{bY6O#|N?&#rc7yl3sLwil|*DQt$Fv-*az)xS!ib7=!DdVD3==Eb{g z<>bOlpJUSRmg>2;WP4pC1?}v1=a*8jjyVI%2DsvLR-OfiJhQZTj|yjzAnqQ8W^Ya1 zTm8Iw>3VX+HFD?-T-C@4^2OS!*ycX7ndPUjX?I7Z1x0c`c7PgamR7Dr_F7-P-JThK{Pa|nK3#X1CaH^bj3Je9e=F2EG_e?~%`#jza{acY*W2IX zyHj;HlZx=LOWQ{n zWNG|TwN`TxMh;;cq@PgVMsk~!4D}C4dvSh2q<^S?Gx709R>IHLL3s0#`^gda@Ltzv z{v|z+#Y6s~yK*vh^tJND5kuq6u>wF8js+OW{=NqMYP&N}v;m*$OU-c3K8_h5S?yai z9ch9QRaGa%Pqnc>0Bsa{atGwD>uKfV>#ZNFu|{TGW#S*87Ic);>E$|x+x}ePneV1N*QR|QoZr!Cp!cR`4FSj z`8e+aS;8?8kv93^43So&CcD)eIBJIdO;G}axBmGTe*nNAPWav*Fx@U<5t^q zby5_%74FYzK|!2o*ifxpv_L>G!PYuL4G5)?2%Jn>k!g?FIVwYHP$_H$iiwBY;_ zIST&O2Sza_jPSL@z%JI$*REPbuau4C6iHdL6s`UD~rIArtlSt1-4Qx-#vu zAs+V+`MP5G`F$sp_G@Iz$D8f$v9p__1PTR3XWo8|IWwd6hUFMdx|@{3wk&Va*B*>* z(Yxn!{OD1>dK0YQg6J`7cf%?w`ix?2p=Fo_9F|aE1~mk}8n%+*Q4NN)$baJoJT^^c z?7pgubj_UF5_XNAj-V{}%Zzoo5pK+#ZLyleE;Tuw)x4@Jp27YxYWA=jq7OQC&2 ztUpQV7`ndz*mSF<&|@uVU$3(4i)Wh?#rXh+D==p;$IiXcMt}7w0)Fggxvs}p?a*!= zwyTwXhQk+AW%Rv$Y_ku)5 zDdBUF4CW9{Q9gjuMr&x+ZtSrZ=At>{rZ8~A+dlIO&ig@(0ejo(rF;7}KZUJ;8~SK* z?8t|8Go@lpBk04r1lFGAt%NR{MQ9!3!G-(QTE*s^^=TtcT^+|#txH20sZ#)>!*>DE zYPt=WvLVSwLTL1s&sMajz2$B?Z`SGs!LLr?PwG1@3L#%+#~Yler+ObI$6~Sq2aY-R zfS#lxWXXxn`uGi24pU@eA4W|^z<1pe+|2u-&-!hKQAY&CQEczRTM~iJU!wtA}Ueisg?Sln@~tI$jfuMiOkiq8=J^61U?T%@ex$bZ!%mmUk7 z@A=T5|16YFIW6wsX&nw{`Sxswx9HO6VHOx!JI~%3+06FYeU4vTLzoRB#9dC1!}`J4A6>)ENyCUTbyXk)M2}?!gCupADJ6 z?oKz$80chrt3eS#s(z?nZ)Ml#fRX!JDxXi=5=XeV>J{i{-}dD|K^I zMTVm0zy-Yyu`#P1ts2d!0uG^&hY_HlKkU)uB#%8?vzwFWYiXrM35|t@(9EY~9=w(2 zUaaucskb|b*hrb@{QRM)&O~(2+WE}WpZ;{EnE!h$S?`OJOA+KSo^+ku6$tTc zxV2^Jg9 z`ab88?#xHFv9UQ?tSJVi{oBTx9Y{FdAm%_b_6b0~e0HS3Sj&Q-SUmB|L}uW=o=}Wj z57W=CK&fYl&*=vmxj*&!M#LJfdkY&*PEdSmlV`mBpKtnHe$aS@v%@;KvfnI!m+_nj z{d-}^i1EgQx6%e0jat-cdFyD`=$JGS2qcj^ibrs%;Qm_YjCyZYYS{47YbpoiE(Yy9 zdT-B)`BQ6IWJ|Zfp~0_uzs_C}e&~}GJ#&4;xRt(QoRKosj1jWak{RJ`EZPIBDqb}- zHZdD3)uatY@{v}~@;+#|Cobk#XimDE@k5=s6x)HuV^TLJL=fyyyPg$YDfH=6PEu%| z=QPGuWBT~|Nyzv$?_`n!2Wjm|yVQq$pO-iRV^2wyrj_?@C{4Dk21}R9#1f5>?^287;dI%5NOtb4`}^`6^=H^)J>R+qhH~Gd;G>NN z8WVV&^e{hXKh5fhgY_Sld(twPVdqrHLSL`bCV zp`cfU7)|BHet4|Zr&4AueHvd7o6naj4m791r6qoX11C`P(yB=;ag%pe&P~}ph%!c0 z-C`tVRi6q<@lH+TOIC`Zp5GbBkMC}4ajj|xGhn?|HziH%1a<-g9}=9~XdIuhNxvu^ zp8OXcXYE+b6Ck>%q&N-RvXwkas2D1M#>=o&#*w?ejW`l$o1;a5P)F#82UB->3_Dlxk!%uwhe&deP_9GAsrT{Y zAzRGM0ur!qIPgsg3ru=Ap^FRRg@+b>#FH$%t`mJ$SowZyG(phlOdpx6YS~3w=JG}U z0%O8Ev6rZ1v^+sFKk=!FJJ|_MFWA3Uqifa&6Xz6kx~0NwMUx;)>-+JdKo3j@ z0tZpf48h&064CpvxS`Lp9IRXI_M0y3*CRsT&0J97?{;DZq8bgdCtJ+AzLES+A#T!2 zu>43%{_xrX{)(v<3+;S{Cs!abNeD?CSSUdXSe7cD)-NGY6Yy3>jtTHqTC6gQJiL+V zjGOC)Sx@$+rvb_a$)#`F(;;TtUJ%Mo>5iKa&!tqM+fYc5&psQQZfi3E0H+fNsf$fk zEHtYU2KmG-5^1D9a?5LLmRIAuuR1@;BdYZ#L z;R=d*EHAb^2Ft8-A5vQj6Wl9(? z`6OXkA`KA;LpOp5Fo7bt9uFwLCuX$gbY%&3{iMLjF!46^tG@plc_i+28x{Y+T$EGs zsF+yOE^oud>si471CHmBjG^S+IzTz@qn${1QOpi%eTDH@GG186GWkPcC zkKYG?oJ4Vqlwz1v2n@dw*ero;56y>fons0)R4c!Ka8U#67s^mjA_ZfEtKA$pyg?s} z@U?<1=@;x(VlGv!c;C@owjOu7em+7Kh2t;?V|pQ1F2U1;aZ9EesFp-N6I8A9`xj0C zsn)MR%LA*Q4u0HlC4Z&tF2ggU?hh`B7dHx(xpNa87NKfRzZ@KEoGsPRrO@F(xm5Pc zz&J99To84r7KEQXj88CASq8^Klr2--qqhG?*JtHWF0?QLqFkv>yc!BE- zVdnRM1EG>{T9-s6(n%jh;EI-UMzvW@ef0B7j3l;*CxaeC$zkrbYt>#DDYaO0`xkfi z5@S}nRq9W47ct3g(&yDgak^~~2pC5@6v9R7OwGtQ4Ef0?<1B~Bm{iqf14?9I+IiNB z8-FqfJjTR`$#rP83LX+@bmWUBS+5#d+4lSc5E+|5MA}77Wv&$MG}awaN^?73?IW>w zxjzz%0?kbNledBSjNxJET9C;MNvsohr2q(nncVk4E%A4BOHAmFz{l8;!9}CBsJ8~ArTFj(f!JfC|x@Gg+AAypX2*k1JHH{X7 zxn)cogtRQ-Z&9u+rPgA*Ra5c;u?sTfrT5 z$mM#;3P$>`Dt~CK@ci zsEvI4-qVN3)ubjjL<|v{bV&8(5*K4f#i^v#O5(VgDZJq_C4@e~sS`&tPp9CT%ONV( z{qi_JLumvwU2QZ&{q48AfcZSQbueSsI6&VQV_QHWxpZ!<#ZOJO zR*{#HOGdKV_`ZIf6Q`A_;g6r|TgqiP;n-$KUBSD(9}jNL6n8m19D7f^`qYz)`th+x z-Q%&)9^z*bvC2wxUC(6H^75_nKdA~0&g#qm6l9357(X7M@N;{WJ+4@A;PpDo>^v7I zK!X(-F8w2gnqt^%gb`o{gPd`blQ`vsguDUf9H1!MaEeWQYr1iS#7CxYN?Zfo0$)iw zr4*>sq(E=k%n?^l6Ml)GxA;i}Z1WM*K2@WPXx?u2^-hXrAkeMwMkQnAFA~LxdV!2X z`Ri9Z%XXPE3a9df(8mwEf$t!B;$vnBM$}b?>q+`$q*@D)40B$-TND1^T1rmj(Ls4q zp>*f86=CYGHCtUi8B(=>Eu5ylkvsgVG=A7{ZDX`jml_`#;-GN*(O!kaU3(JwLE<_U ziD2p|JK*;p9-1=Jj$Ws9PZ^`xU8}DTb!uMZoeF)H6pY*5lc>F|?E0#UcddRDu5##H zWkd<@(CJuk;lDT_k9i^(<)76*n6Ld+^v%1RA^d*70E9^zoSjcy?X>b+%oml>kEfuP zOlw{aYMuSoq$3?6f!kp>^(>{Db5^x&_Jc8x;JPXo{)iVC!MVd5E-7Et_~yyYpM`l> zJf#X-c5d2l4n1#sY2H!jH@5{)fp1kgId4w^9s|F_QklVb$30c&b%)b^m0=l0x_5P6 zo0B2TAIY;{3KvSH+qHbjf7`&kr_V@?R_F6vHNqIH@|_WPL*4E+nLysUOWjUd@lYOy z=T6h2uD(>vrkB(Dv~60O+okE4<@Ov~u66;hP*@^Tg*$|!27o0%vfIl>@7_S%sn{gw zRYaSs8-!R{b15xWDFE*q7vhp4G?%sJO+765Huz@KS2ZL;#|UJi`Rm^4=i3Yjt^ng> zVZ)p1-3zs8q-owl!4G?JdUfU$ULLI%uho4?zo2)&sRc`9WUYKCeV$5#E{>@=s2Al@hKu+H1aLF7&(cA1jryS;V@L?y|Jj0DGCO6YKG5ct|BYV zXu$AOo=B-&h43KE(z(XWsssiUChpLrd}oZv!N#LfZKhx5Eq?VXX2wQqofL$<5)*D@ z%`@z{qLos3nec%Tq=3YRkC~Yu4lc(FF=L`>D#T3Ir}Hz?Quys<%6UIZFe&tyL2bW% z7G)1^$}Mu>i5fg3DpyoLABsv=b_x3;iauqzYWhR1bBo1%!`zH4HV=4Y??xd7Y0G!( z*MBwAwN+i?T&!9_jR8c`5M3jxWV;J7kZi{E4TPS!AO9jh*I)lWF~hc{*-Kmfz;aoV zd7ZD#^W7&=d}ehD5A|}LXD8sNDj1nUx}zF(H9w_FIu}=tybj85F833EkP@d~Fetc^ zegyOogCf8JA|m+Heb(w*g?7hB+m=gX)%k_~Vuo9_W+tNVi_pCAdlh+7O1F%YdEdT! z!4muJ+4p2?G}ll1iDFun3P3za1-Af~wpa+HY3dpcejl_)=lCdz0gF=D7bCHgx|3}T z5@%pZq$ooKv2%!z1L0ex(?-;=yu)ROT;*^%{Hi)Wt=*kQ4?(X5gKH~CfzuJ8o{8Jt z;=@*x&U>ppDXuHrU#4olkpIGNDtyd}MeBk(6**rRx-8yoJlj#Hyt}=S*zze!_(NyW zl+~5Ty5QG4yS?&VesPLF3(xDKJs-ooVk_)Jq_ zHYlCRQ%X0wIi)39I%=`!{xjMcZ7jHCeIp z$#vP}(p#_VMUg_mq<`E_ea_UV=kAeawY}usLIYRb>-78@tMgB9iDyBbU--LTcp00L z@nB_EouQ;!#|QSX;w0`SYA;Q2G8&}u>Ngrzkk$bmsvT># zRm-qDIU_&{ao1ZCYt+g<-kf=Cx7P$L8pGL=8A`bC%4ia^AH^Y7l_i2;(vba@7$Q>{ z`g(uS0#EZy*@o0$B^#v*05e+9&P&-h#1xHUOBW0Lgi)&4qupKI@cvxoDlzmIqcftp=m8%}Vk$}M%6}4rUP^`gFY34Rd zEk0Dq_}K836Vi;n34ji!?%s;x;vn4ZU zAa^BC<3pixwVobkYACLKXdoXk)c5tnyGh-v)r6Yoe_nh%{qRcn! zH8hic05d?$zk!l~4=GR#rD~=q#3!|Vg{s#UXbA^`o!%@>`Lu##6Xf*jbdRA|peY-7NyZS?ES{@=QG(gCPzb3SZAsbsA z)0q_Cs4Iu0^Snmw3o&P;zl5?NwE${jN~Dx%eIJhjy=X@HeQ$a%lyn1YVe)!8M0=^L zAFV;3knpvnD@*-1CM+D6{&9criDI|1byDu_Da>M(5E#O`go+ zkXmnsyM0r)3~MvynnW_=g-r=>t0A`4)$0o?_K~Y;w}OUC4*rc7`P-DA#?G3PUnf~` z*E&==IyqZT0v^8+ecjKmIIW$X$Y|3vMV$ZWElPE&N7d_tW39AOoW!0{#-RS*%~X= zr6K-_h%a=%_Sb%=6d8cFE+=E?bA?7Hl-BH~a4aU+3CT`e-x-e(cf?oe=^^q6HLlcT zQmq__)c2R7?P;x?Ho)TmqJ1YD^Ik5sR^RASKq-!o42evB&^u7E2$0DU<4r-a4V;k{ zE*2*(&ueCphZyds+sP2j7&kMsKsWyICKF`l0MGYS3jOTlsPl5oPwY@IQ(s+6^wRQL z!+XkRSNE%BXPaQFuC5JYmwWG{C^^20K(Wa3PCQtE4i;x-GDK)@5(g2W8+VV->rdtU z`0YkKi9U*$ICTo(SHuG9cK9M_cOSe zBxuERY2^}{WYG146i(uYmg1Qh%)%XeQjCJE>gTd0aS=h}hY=#*9DGAEfBudXNEoE` z>NOa(TOMuj6z8gO1fGDMw`WSI(KyW@8FTGdCNPkaTrNH=2Z89Pi>K=s%sWAv2sS~N z;(!M=dO|w(u3~CFy_(nhwm<7=v61yVD*?XE4Ts94%}S$FcMb-hX388)m1(+!8UtHy z7?w%pCqajR!4k9>%#f>fkU4}dzNLR@4&)92*F8lEe^e>@wNSs!$;{kL$;~7l zeTZzCawSY!i=rC2v72+c93-fj+)kXCTs&Qz35?M_E*!F~3;~OxRH|~XiRKl7#jC2* zO1phFbQT%6()rL?NgD4OE2dV)>TN1Gm3#Z({fOa0f=l4B9kZ%3Kje%ZqTcK6I zu3>h3bVPhchD^TUV~0SJ99Z1lBNqfB9wY~&+kx@R^~1Qd1O$rZ!Cd+ZI~kLrqzT_J zR6psR>O8x8M}64cq>j6`6=i8 zZlZL4VXVn8j=~CQ@+&RaS@BF6@Udf{s;ag~wz5f_nHdC}7bmw5n^XZam>`WV$rj)2 z=B9)#mZebt>LUkhIjF%kn*XHTdtukJk=|;W#9VRd#@052)lE9JoZQF9r)=?>z*_C& zLq9Q74gPckNKpW&|MmSi007D()W=WI{(d{o!`D0g?}5ec6P@i;49Crvu}ibr{-5*U zO4@mcB}Ktv<+K9$_5YlHDRi}bx4EQ%9hR`0!aMqm=U?Za2JHT(QhcwbfX)0lgVR2n zE!WECUsb>EsGjeXXgLqZz30#VRA-v*V(IejZw*>>)`bsM_PCV`6jw&2giJKlbGKpn z<3G0vyU$$x0Thl)lo>NKtL{{3$-?pr)&EsVC9v=F2QY5Qd_YW>P*V7o++~%$v}E?5 zN=mzXk){$w$alItS2@(!c$tRz*?$_u!V8!lS86@YW~NXfeN%$LJzr<~&pqTy?R!sEqVO; zSzJj<&t`J55VytafBHe*A1`=6~)Q{(6`8u$Yua=x z6LE)#kbCG&8*>}*4I+9w@>%cu$kc6znlz$3qjNc;| zi?9k(OwZM51>ySHiR-Mu85F5Ml`t+tg5QZe?CBhLvfAyCgC1)v1Ku+k|p z5ZV2mS#O~3wGm-uDqtIV9FPo?b4T@Zodqajex2LVkP6uK@GD2pUR0C=oO60KY2~^zXj5Yorm*lqmmVEq_HjyOXX;~aa#Z@1b;0+a zUhOZdY$r0muFr91sC>|U5$`#~lOj;g&m2x0K@*$5H07xu9kS1U&AC8c#z3HALq)($ z|5Eh1n(Cg8xU(@!U7Fi;x==euY5v)2g_g?073NvS^iTSxRK94du3<~GsFsulOdbo# zEZF%T4|jf0tWG5^rSPI02@!qac_1sJ+x3c;y% zPGJO1N#`B3OTXG|OAFI%Y6}W53TB1rP@CjgY(~Xm%Ql$DhF{9A^j!K-nKi7W*_e)} zu%r?H-guGtiY0qHmi;+M%7b}3sxtH1KI>w+<@8{LTlq_gjq&Lc$u>Z?V2R7@eN8HP zSz^m^d)j8(9oP2ScCSG3dzAv<)js{0C^La7a~R~McvxRKQS4ak_fKE6Y<= zIQa{jZ9C$k68x^=cXP5}A+;+i`BVK3+eU^f39c`NawMHGYRby<)jKS>>D!H8{L&ZW;1)#OOFpxM(YUrN|T6G0IZ^1NMa zokv^km779s*12hZ%AFsY3ph`|M@7;+b>Vvkd#6z_lLUs$d^$H^KiI!^n2Aecpx`&g zdiFtnvTh+JFZ8Xg*G>|q>b?7(u)*98Ki|cMZTu58UoI>WN$Co7)o__aguR%+O`&ih`I6(OvM=mB zyUow(bM8`rQDQhuw_B<0{OmE;L6}UqH=;z$fbl|vd+%I0(`%!}@}257Nq2_Yj`JgC zI%QYTv)7@JDq+PvKl}MzU-GH`^151A`6?e;x3l_ZDkMxcF;;E~#Rcv5+dfnV<*v@c zwk&asqQC+=~LOW-Th$z!C>aPh}ntr+*6-)JaOI4_MOxxV^Wq57^eS;K4(izuwZ zute$9ZzXxpbwo8ZJD0i_eKKl6rAlsZo7)LVlU6@?zqH6rSy8;sw>&1uGS_`DcooZI$5BGs4@w zEbV+wWb8P;#~+0QKS==5$&Bc!fM>!Y#q;)qBs+2`EGe_UgJ&0rF(306#2M~%*WJtR z-cqSFxg4{d+oUj$!X2Z!)i_c3@a#Sks|-q;_uTa&uG_YxUVARp7`n`MB_=TJOx8(L z*UNwGq%vpnQC#*J$=xo$IvGK>%x`17{%Drxn=&VvMIn2)Adi)lFZ<$i^@ATU*{Lu+PPj zfq4X~7%AN`fq+Te?$-+b?)?i*2ZO^GIc6BP)d?u_p++doaXR#qbgJB&TW6HUN99dG zuQ4!c!7SOw*=JbdG^S$tuk(tF@_ROYMKbjE{N&_|U_;HepT?;_qD#jpCnN+j1da)F zj9pEwQ0S&NTbgte$XD@;bE3#ty`z)<&eL7VW4zSaJe)~s>r!KcWG|t2&_|{ilA~`k z-ZLy4dkITbkM#}~G|0VENa+j)*3skUl{{suc(t!6yWuXdLb~kb(Ns4-*`2U$OlFtz zIe*?FWon9#_p~L<#3Lef~6Fj+sFo0Y_=X;QaYFt}kT4{8$d{Ij9 zPL;Km>i0;#C&tWJDtVCrrLG}{g>&1@)3ZJCEqZ=pGPP%uRgan9*TS&X38E6!3bYS$ zU5CBe)aL%?h9o}GgKW+x5D0awwieLx%gA#K^at#;>P$X z#g$P`DS4@!QDEUL9KNyR@bz*$!5p>Wn{K&46Ppd`;{@#27G1oGG9$iqXLYN40hsO& z^#$`US(!gWb9u`T+L{P>7M#_g^31D)W825qL%7V&pe(wBCWu93uCoY8U zBj9xkPimN}I`QfFxpRfq_FP$QqC)UXhR@=0Xw;zck1xz$>U@ZL?fdvjAu@H4k3xmm z=#eNc8Z}mN*vCSF>F=w9Wf#HViF~%&;N7ARf93VR4#596d5!vSd5t%PIyQ2a!iHRG1(BIWvhknKsZ}dse^t2I(7`a@Thl`i5R=(WAdAt04FB`>SFqv)% ztB*+Fqu>4#SHj+FmAne`%?xHn8gxY350`KI`EUC(XQpTBoi7)IVX+>X+~p4)*>S%9 z19+Y>IMUuc1%{=N+nF{`BXLj;yoK$&oZIzWr;B0f-4)EF({&GO`c7yW(>_Fzq4{tD zd3E9llS>2g>Zg9~M=xJz+GXmwO*P1wiB~A4xt1^?(I-00BS=rrPnNH>haKZImzgrtOXY{7x`4Cua$*QHu)7?|&)=Q@wrxzzj6(#-Yn@=fQs~YC@J_7JC zmu@&lf30rrZO(XGg2Q4~D?D4Y^|S#fKnB+i>unFSHhNrUhOC`z3yLz8_*(2RF3#@f=EtnyoR<>y-?HSrUsoJOw zczoKWvod+=%aKvx!|!?RR!#y##GK~nn5x^$e?%3ePn*84Oy0jO6yf#fP-xbMAqE*U z=u;!g7MC-Sz!~-BzW$8US6*vfjcJ8e4PaP8G!Sz^B5falhiINqtX{kB0BfFHoF3K8 z!w>^fiL5|bSBeIJg6@J&;ry?=Xc*sB3$j&ax?yF(I4!5TH2I5BRPvwOjr$(=y+bJ{ zuB#K(5C#*|pAf^z(p=vnG&(jb-;SqqSGB^zt^DWA3?^ZM%Jj_Ek}ab|%qcY^^{Y1q zynH8atL-}wFdgLQC)0QhNa^w?8*|`m`}tqKE73Dq@f~S}CV8+p@#B6g)q1nihEKMT z^bMl@-|aJq84gB$A^wDTka#AS4k1f%dmZ~^oSB)PuL$qlmG2u*UrN8W56b3D@$hG6 zxvG-QJL;41AeC*$8!CY}C)aOW_vmZPAk;q}vo&iycQ2V5ql;HNI=PEZ-`G0$Y(5W) z2Xn^v4e9pH&(SqomX=$Es_fqW0o0#f84qo*F66O-!E_$$sd4m{&rH*%D;ljvvkW%x zI?@I_ef9m?s7+u9@#Al>s!8nXa%-KX(mch=)Ap6Ybf5bUUSFC5=LD(X2_TF#eA+qR zT6@P`LpsZS&G#tU)ALT>?+(nI-cKXQE0+fgkBe|GMK-=5e&f%2MuqEq>h06!wW(|l z67?v6>GshLO zoURo8zTJwS=$c7OHAi;8I|7W8Uz^|DFo|d$9~TirD$YqCf1#7>*89A_08w~+;?qe- z+6`g!(+M0q9pLNA$gNC!11d2PY}h2=TNsGhwfu0w2(A2?zwFh>xDQm&uR=J<6rA4w zbU5sZ^3tAH-6yL+zxY+(ql}Gq14Rxq=R`Ae(91Nop_&DDy|bzJ+K)vPk?nSz{1#kJ z_i_${K>I?5<0P7&7ndK&uxrZ5UUv-LN3UOHDk=zhbmtA5y}z1Ek}NMM*ISSn?_?2C z`qd$J{MCGDueUN23`y^QcDg>GZMCPK-w3fQ55xEU1IW0z*GRn*@;qB3$s0D2{$-s$ z11xAPwRrBDBVKaTZcuu1+ctjx14y5t9U6ggU*4eRTj@uoV(AXBFQrWz6-8#3f z0LFqrVS>-XoSHf07p!vG)!r$N{T9v|K2a2D5juv3!Dyt0<7pCgmZs{YOCH@vZ21~w zt$X^~OL}&0fyATJ<%(E#_cT=k1o~IjT^_L98teoTD98~r;r``2n*sIe-I>Pxck0D^v_R8vC_eWG29@lMrYcOjt2xp54 z;|ud62#)XlQT(OgGD+9Mb}wI=3Yb#?MY;~f3Wr8+$yd?5=SH`cWNrTlYNic~r~dXH z<$caGoU{)6`P-xEt<&?ag{eW%BrFc=6+m115go&kV#}}gysMj&8zG;jO+5x@I`X$D zHm?$~U+8)H_)F=_u3rmh3Le|aLDKMI0QsM>F`~scS_YSYp4{B&Iu6gnV4;oxEvp!i zciJ)CNO9U=^w><6pQ3+m78^Sxy_2E#c@7wNx0>O+b%A}_m;A8F>0I#o^z zJ-}6C4YtxL+f#qNL)zUWB}{g9CA186>dAw}Bu}^|K)W&fIpa+%KUHKNsV@p<3LEGY zVrgl^VAMdEnLA7Qbp3=Lhpe?wp`9n(<7{=_xg76q@KY2K9fye?_wvvm)-H2+;hVg28;295^q7BH>~k&k9@fkhuX-trkjV`eJ*y^uMpn9 z*H}wo>3#ZX6TW5#uo;LWcROyR)4_<_hn+3Kw(4Gzj& zgKtasd`8(^C&L|ndGh?d&oSxS>1s-g$*Z0*|(YKq^vTm=Pc;4#Lbmrs^ zKi)W9k@S=-F$X=h^R>q+hjTAPLkbRb_|1iY?d}=QXM6g7loammnYy*Ec4p2Pm;HIu z?vCaCWd$6}b6apPtwF8U!b(BPtk+&E_LQD>FvRB@(_v3rD55qnu91C4zdb2e*L5UW z1pk^+xN&SDTCmY(SWEe^g5mHo%I9i55k<>D5^V1;DQF8@-B?*nrjyFc}lWf%nmW0E~lBxN*^|>s*QqU%ksG zBvi`2@~gj>pN6fyiuHqnYIO2hPbVEj;Tq0>(%OU4sUhvZ2OQ_vSG-x+GK@ zQj^PXAQiWTig_KSwb8?<&!C^hIWSELwInc&iII71&;8{OQ%78 z^K1ejb~6ICP=R|G>piJX)X(p0A%00tQCjA@#s;bh4&fD7Tr+yfy9C#UoGHs7aSk?9 z7zWA1eU-I+Cn`ain%!Qbb97C`M0c$r^v+3QrN`&Wxk2EFX2bx$^DfIBXA0B|q#H3v zVkSC33>VqUPLQGB%AkQt=r(yAGW##|IbrqnU0ZdxmzVf{@Dxxg^;K8+133R?1jLpO z+JM$lo8lwKSEzOcK6tf`wm-`>}Rx-+um^n-EdsPA~J6XO~-%M?l$KJK`uQ> z;`noS1v?7xa6*y3%9ex3e=y=7fMiN0o1IBt1|;$X$gJ>E^-I=`&nJqj0sbJ4T{)XI zK}MJ0>!!o3olmPk?6*N130g5V;YfdRT<=$~%5J{GlSLyR!mdtBp)crA`vXvkft)`Z z^rag+=NtxVEE}77?v}RpJeUz-68F$*Py!I@KjSwc*htG=UX#Ejem#UP5B5fmJwa+R za>v`ltZkD!v>?^&vf9(& z>;(NfW?e%np8A~347aqkHtG7b%?__(zEOQvF>64mYkW#M??u9fW&=tq9hF$tN?#_W{_0q* zwQXLO5^c1aDj8YZHKrbG$||8CcaLk)-EW)`-tm+~#d(+%u74XcFS(lLSaH%MtPEPn zzIhRgWfix$=pp(C5WL{3(5^d2aHFMVHnF*wr6O3Fnw%OR^-9dFp)+?J3#8W*+ycR#X1)m7e^lGP{*_4Ns8S5BXnO z;U}veB~@mJ)=|C+Cmn^0R7wqwG>p}CIFcELq6I zbvGe%$0*nYX0yCmW1di5U$3G}?cWUNRm&1Gz40Bv2Z4MZ$_>c*ahA2rXp%2MMy?2Iv1_BH76?^t<(Y^hV>m4xFEb=uoKJ^h3 zzC;?Ln=;d+)35!>)wR)C+=mlq*2i>5i6tdel%%4IOu+jL{er@YeN#Fk>q!HIQ@F# zd&$>5was8E#b}~QJE$3E>ufH|s_<@WZq&a)2_JH)$c{7fOrN(YD=l^@#gG1E#&UYL z+;QbJsCi%M^JKc|KY&G~9!O6fi0C1%kzdOs?Tu!@d(DmGo7=cJE%pV(Q9_Y|(DIxz zeq(Nd#I8!|`_BNHzKa8?;=j{u@dZmc$Wl1)DQN@=EqYQ zLbak(tx8yVv~uhD7#&V1DEP0TIavJr+0dUEl{*X%%VX9tX z96FGr+JCY@V@FNE9}-^F!yhj1-zWjwi|s4&q*OIx<-&5<3~+fj->!1V5*6BS@E#iU z@jwy`b*n_A$T5H(RE4DIz~AXDg_vYWEQ||*zmm(XsY`5RK*iT4lc7O870%wQ@*)=` z66tZL5O|c!C}&=7@Ni zQp7YY!BJuGEFh|y_8~}VxN?fsxEAl+?0kdwkf)^HDA2XnJy!wGB8?xkXo3k_ zPVfV1r2ZO$CKgC~SW&De^ffmp3pa_M)ctHD|LK8y=YAhgyihii)FkMm#TSgT<`@zA z>&L)}(&yJ^-krnSwL7aEMeA@wzI>0h8KJ8H6lA_bN&;w5!h5*L%WK9}p~BYs-j))f zLU2>Th267Wgx_I-R=HIY_eX=0`=c{s+w}@JD}u>(%3Qk5UiaX&wK)0QcDkeI!kL2{ zyZmOfE6E&iysA5TM}#Ek8TP-JqxY`x3__&JWGv*XIikl9Z80LRSiVkPC@v}J4Eh6* zxLetV?`-rV9CcSy9QAc*jz{oB=xL{ckeDNV(!<0I+}d59zBgmD+3D^JYo};n0`17+W(W?p%^yZ8F6wX&AJ0>s{98E7zEXiu6u3WieN1 zkaSIg)>(T7hTKPHT;X~X-8VVIpSV|YNg_`VgMX!;Z(^e1k^IX~{*l*tY@dtD8Y62x z8Rcif`)SK;7uBcKx+wUdev1`yBKB#~aja(s+l{VTASX}bqCsf)*RLmz$C6kYuP!w= z9f>#v4xjmsnNL*u?z9?3nNFCK?^D4z+30YQ(l5aTgvLEPG4OOd4#daN*(7 zD}70Arg=>-X$Gv!Uknv?oTU{e({D8QX!H)g*}~|FmyJBWO^y^7FYehbY|EA^ zI0dG#rt#3C%=V^m5<^Ym9&*87F@lt%cv|f1qf4r+E{p*jgDP<UN|+8+5X*!!6uCq+0B z)cUVV3R->W{$I7Do7Bn^UAW zZw2o~Fl;w`&;l(W*w_c)wH{sZ^cQd}DOYtDnM$OQITejS%S4FEH&8V2f0%*l+>arH zuR!Hz87%RAc+v6UGK;l*VQKt}^$yk8m_(>EpCc~EA)-E+LF3J&kDZWiFG(j1w|Qpe8o;ywwgF0X&NUU z_|i{J{67FU6Q9&(=OC@&l!2eQl$a4O`n5c+oalvbV}-;ohA6V7q)&Riz$AMJwY4bc zlwf0BXOhQp9Ap3302#V0Ry|R{n^} z5H_pC7amtE)x@%2Ns3)`-1!8IvJ92RWqhZUpxsxVOy)06TWfIwyZQ;@jRDeTKDFVxaDFWCJ_$>$@;XGF>9 ziRtOf`THQ_^>?N5Ns1*fN$93Yf#a~t6>^dLFR~>3yAEk%jyG~>G|&D6y*^uqJ{uAKgqz#EQr~aG0j8%_rL(Uk;U)Az= zT{5L(y><>k&yPBRMAqsDLW3eGSiNlL%Zt;CRJo&$CnxJJZyI)5Y}dWU893mO#K;BN zu~ZGt@`Y%tV7IBB_Q~4f$jdUgqk+*lXL|kCv%qd+x(BZr_`41mQsuzNYe-1+NDNmk zk&q?tK+gy7c56gy1sAJaB!}mvrY>K$9oa1%xh<_E<-qHX3&t5KHTwjMhq@O(c;?VH z@D97V$|&r?!GwP5Qfqh{^;;+(;qT}k!b;^YcTUPrtKN~uYg_%2o@tnjyWMkYOUv)@ zH#KT@6fM&-OJr<2np@~wzSyI$u4}Y7uWu9!OXMIF3?|>bqbu0aFsu4`@TSfsWzp@Y zvZKdsnd?t1sbB;$i$9M0M~h}d{paE?q5V;n8(KIfCWDsHR5QA0MeQ)2+3p=0sa5uI z>YsxoMt64^H!Ul{ODc-SB>F6{U)J=6fu*uMYy|{a+=>maJAf+bZJF9@Z=(7ux4n41S2ytT;Df2L&T7WY5OPc**fql5k?}Z~lNOzP$urVL{+{ezp z%U-rx=7;t9jd#hFka4GiikK2NXg2sfid;KTH@vaUdvuRdR=;l0N%<@yJ$z!NV<_qJ z+FtddcrZ)TpFB#dq&)#twas>d^Ajig`9oc!B|SK`P>gZ(pA z>~sec`I2C2x}mt#<B>@JqddoMzlQuO8P6Yl_eC5GW+^PlenJ% zn{9Iq$hh6v`B-#!e#a7yVfC(>sIckt%JW&n1HGcs^npt+ltks<4t;Q83aIC7AF3@R zSTt56;V?NDW z@B=*Lf7S+n0PXYS)6_sYHG^>F;=O6e`{EuCwFa8lgL*~5#LQwU#v!fEiF^W{Uz^_Z z^uP7VEJalLe$C`??Zm#BQpt4uxCO&XWoTK!HLTF{fIE%08gizD(Z%{f|J{2lk|tFF z$nPG$7h|f6CPg{GoFFyI*%LJp5KnNnQYBViSikVN z0i>TY$F=vV@DCV5AXARZ^sVyOC>f z38r6xFp?t{ronL>=$*zuTy}jl)v#aw|S$YGwB?nN~S$=-6@Ix}3UQ$2$lQ6RQ zXQ7>ciNZ`7DaENSiWj8M6Z5#Xtxf)f$K5F{dqph?a{RJ)P-lPYYl}SsF0BaKwZteK_PD9rdHLsE zbiJ-Dsd0gDAnw8zv4W}6ByI}~=PCV6C?ANo6^$tL6E4SC(qF~=2VjxBD$u)|SV@`) z!7O+`J3$`aR@qhDqk3SX>~on+Vh03OU&}QH7Nxm9(GHFY<0+i(=do=A+x{+O(l{94 zZ1*--&|35eczmKG7n0RQ@^LMt?}4V-{?atn`M5r?K60%lmSJyrC!wv4Ys5g_E<^50 zVzF-9)9UU+Yj{q-Nv#YSBu#vP%O*@d?6*EoWUkb!fMm9vIK7!L;CjD(_iHh+2i(wq z{L=Jcb6{qs(?aX6$QCQVPIdo`D3Hj5zA&t z_t1?5SABsI^hB6PeC(QBXI0EQ8pgAKG5!*VBn#exU;mor&HG@>Wkqg`M*HPRDU#mG zhL}8fb*ud$PjXS=j5aC${=E8V>Tw62enlh4GB8|uP%utG%v>4VqO?YCP8G(7mIY;Lunr!kRYmbtvKBuF9HUQpinMjMI*1Z?q-)~ zQjt9y4Q}=3AmfP%6Xvn^mghPpuR)Y&D3J){D23Nj$2c)9cwl0nKg@{PLoW1RGHZ4T zv#=23>0>TrSryF)*S+S+$g5RY02hwFZr6LX^;yXz!;jeE0 z6-~VS;dgvY-MFR#-(y_re>tH4vc8NY-$`WZuQVM|c^ebn*b||h-}1>3YdO^s&+&^t zLlWd#L+TR7iznlX>8ttu@E|{|j~=4lAQuU2 zifMem>nEaVbX>q9&jo+iuoASIO3!7IP*d)sr9<4x-wlCIC;YZq31qnv3OtX1t^`lm zEVy`Ovl;7lWtuSU(H)FJ72n)Kvbu2B${wCBbVzE&)C?f=P$qLK&hb37l(xTtMYUMH zTO&9&*G9Q}dm-BL^=sef5aTQ@OWuRJl@O!{S?l-ToY$wMN$Of+Lh{DMLvs_Hs!pgg zBou^yIMFAHU^@wN5L4o!V+UP>par7g#D4%CHPYv2wRRth4PoYp(f>F=DszP~ZKkL8flJF|oAnu-JFuPf z8$NKxNC#4T{wqb#XVb+DkWRp<J?VaHib?p+%?tY7$W(=7whcn1DM7`SV!41AjZjeI7D^y;1s=2t{mbNk z0NH!2`t>X>Ajej1%{!g$%eEWa>5Eq5uCka_<4NQG#F3Ju0@ve8+?u?LA%d9CC1mAO z)<7QcU03fA~=fpt|j=RG;NH&_%q&F3^t zeS24q(ZwjqSoc%tQvKH7?SsE|eNe*%LawX7&C4J;!C;CHy&27tW7{xVN^Ujbfw~Zo zG`x=Q%)%mRK${^)o$$lZiKF9`NtrcvH$5lhVDoWPui-&$k*0ySGVQYjKOB9fkN@(- zf40O&;6olBqv5Ix*(^oEd-JJkmLPg)YpihDG*dRFO8HB8sUkHhKEZQ1pEZF)ZZfEWKGKK9*JZj5=OFcpgKcaImTWW6 z2@Baw>F0c4@8^G?0zE{$*vS&QC1xd7MkRqi&CtHL4^*nGx$BAgSe}J)v;+-Ra8_Em zvQgohPOu{pmS?etWpU!QZFU0xI&6tTBWkJ_YNm9RjhPtO4SDqN;Ot+i%r?rBhlR}O z7u@USpzbb7%Hn%m+`vg;o1IlUU7VHtzP^RkQ1cRd!@OKR!&jxC(@4Iv$*b90>lxZX z-2i4O<;I0peIP9S7o0lA5QzIW@PCt}*~F#G*!~r`(;lCd0=qDQXsnJDqxb&>9iThbYew%dO-5-J^wfa@+s0 z6GHPpuCe+DAb!_)w7(OlVo$Fp6*+nRp*7k*F=}C@KZN3|ctautsWn_HUw{(v+e%uw z@tSaB$t{OX>CJz2*HJ^QOrcva%wNM9KPpDY!kr>JF#YJh8NNd5tFeE{leuc1?F-if z`AN0#8a&knThhz2+FrQYvcxL7D6S~cF5EI9wfOFRav5_bFi|<7+hY8Vq@G(SmXW=- z*dw=I85Vxh@CTr4hKd7?MgN!6`L8IXE#FlX6&~5X-(QxidnZdURLzuk=UDeHZ|u>p zK>IUe;$E%_A>Z`=V)2yeC$NsG=s}zkSc99~MuY3~=LhMSowfYLk-185V5>MT^}mttPb#~=7pTZjy=lGeO`PdFkrkgIv^`j< zi#rm@pgmf=N-v0MYeMH*^- zeWgC{L=#Ejf=<<`Dv`||qp5jxaiYIqg=>De=hLkmxS~{%ksO#ad%2n51nUxD`*s3C zQYPDD5*=R6CXV~?h8e^iO4p?5!Vu~|7xJv5-R`CHn-^AzpW-!KFCs%pR?EX z+7hI@jHrz!@2!)QLkz-me@ahuhZgFrG+Y$i zR72q=Z2Bg-kGhRtiT*n*kP91_W#LQmX5pv!WoPr@J;|(nwcn!&)%Ko~26CW7IJDJ3 z^4?@}$<_C98cPZ?l22S2WPZnUC`b*ELxD#$+oh`kab z#?@+JOlqWkVE+6NIKLaGS6zz}+ktt(1V3goi9;rke<9BskBLU~t4I+={H~DH>?!fc z6(L;nR*}KS{naHciX9je$tR?H&6OND@hey=kYhqLDP*;SwTt*Rn<6{%PV$68h<*`I zoG@j=3z7mwdk_ZdCVwAhUnV!|EHxGP+fScb6%sNZSBRi({9=5uDJd8yGnwNr4u)73 zQl_3(Q})MkF!|whOlA93b{@~g_`Wsa&rw+HWeX8g?BtoI#ef^ri4tuig8xRvLBr1U zP7QoKCrNM;@;;#rsMw3gz{@%*dgm*#%22maDOq>R!DLWT%~0TPx)FUQW%6!CB10!V zqn{R7V&C&D$rwlsHHqjvL0a&y(Z(#`wQrBdA_z5hO8Sy(gmiP2t$B3iwTly|JymXn zTz79RB)2;699wv=MV=2H%Z?asxUcC!fQw-u4BPDAiIN1N-TxI`7VHS$b_L0ME0;!` zy~D|D^b%ukmIB5FiXNbc+`NC6w$qmOIMIHf2*;VFr|oY`()}>u>{R|74ZDe)=TzI_ zKtV|mgy`>f@;`fCHEgEuXL}=!(_a+HD#P;i`+*E_3Hf0O>6O3>S^Kl;`f_W7oKqT} zand{T-+shBYqdH@!ALw!=W%&97zwed& z)gHd7q(Y=q5*{#TVPCbIo)>loVb~=c7LpVCylwaM+?8|O8~$o*HK}@QL%yQ%jSN~( zGMmlv+~L5YR}Z`lBK*tC+GZ&ONdo=JPBQ0b)8XX#Pu?d)siDU&%yHQYb)3EL9{K}d z?_ljU0=KBTx>ihz(d7hc$7O;kjDT_PXzqvy|8X{Z%LX_w0Z13qYGIaMtDj1<#FJjf zFRV3CtbWN|e-GuM_G`IwyS=a#KG)u(e?8Tsgi1oswFCL=hz)uCpiCZK4Z6SY8|Ptm z$xH|%cdMoo6mQSRnAtQ$+*8+NwAr}Q#svV$?WNNPc~O!zSt?jHT5t_ zT_G`k*j}232K}=;qq5RITe=|cAyrg7o%(AzXJtDuR+M~ns5ByV-f2Sda%H#onz4hO z0lBowXPBRNt`h5hZ-Q|iql?}>?27;Oe0zH{TS3$5%UtcT zz3YRz(L(s~#^>PH8yb1(Fg$rav&)7HZ+k!9S`UNnWyoOPhMO+dQQ$58S`wrml%W~5 zIDsSoJBQ5DP!mCi%!6mS)c+)vw$?&i>8c}buIXq!)g}vBnb<}hKf3BVkPhx>a^Qu% z*-&F!VaK!n`h@ipf!E_sjAs}6!b%>?%FD*oGjZ;CprP>&5T7In(+Vlg|2}tnK#jj* zuEgY#F*JFV4)?p^67MzH*v zqDZZ!o+-1g`-O0}YXwPetiDQoNPq)KXGWU+{g$T!j#?yuf@~?diIq{mX*mGO}=_#{+_+XVOr{N5IYBDvD_MG=qL1ly89r+$KS{1JYmSoetvE* znVR6W=epXKD#Q&MmzLF*M&epaTP~bN-tfupQi|u9GOar{rQ0}$^D8(V_kl7ZO^&Bi zvK&m9I(OG0lwsss z=Du#={|^se0oB$PZOd&-1qu}RQXGQ2LyJ3w5Hvt>clQg$wMcL&8WOBnA!v(3aDux_ zad$qw@4bHpHps|6YcH8|uD$n3m`TNiubGZ^7#EMu+b23C-tJa6Px)KMlXaCK@kT>l ztMhyJLb{X|72Bz)@u|O;VdK+l!jpA*56Mhq8H<8xYM3TR%`~d6u1g}^Ss1IWg9~Py z1anM~2A#J6&A-iGKJtH(xUSrquGuQExJ|aMuvo=b!P;xGuHZ=o-L^^KpG;Q8@=i8f zI~1+@W)O$W^yy4_=q5N3lkC6NeT(^_Tm4yjg>d($zu?DIjr?!L8p~Esfl=6y?5Hgm zPw8B?Hl?mS@cW>3p<-{kO*0^~)0bKT?=r_}$~Gaz$&h%q)|^Y^82$vq|Azm!(Qi(Q z$(r|f19Y;PR`0l+i)=Eau0ZKr@)6D8A(n1JNlQZ`cDc=Lloi;FB-y0Uow1ZWzB z@f}==0}RjP|6-o*UuPXXk)9#1ZFk*9#&L0KEPY|EwU?p$z0sfISh8^y-i={+CZ{@0 zccNHbR{JeQa&;DZ&_yJX2~!n-%d5MJ1oi(9;{DxAC~O1W{CV=pF4VBKQAtlpZz}X5 zC%ydBE>bywcU+8yl(Dz_B2KCMnytAs>gq5@l_DC$`l=|RChjP0z~;^WGW&n}uI}zB z8*ctyPXo5Nms?Fe>Das{pYIL0Y;NR-Wu(CrRfMF#Nu+%$x;paDz_-96w#5T)R zh%Ki5N7nUKS?A|Fo>wuB&x7C4{g38;;;ctBDZRInk$>3%UC+YSuo0NK<-z*U7 zv+DJl3r1&D@MOqSBF5kT(fgmdw5>RH&$L9$1r~4(eaaOVclgvm#_%=@+1xGD<0mtl zSwJdvT=vXs2oU_{@4KH;=RZL)S+}J(b!UGVSW4O^NcmG^Q8tw14v>@x7r|zb`?i`L zAU?+Tt#hX~iZiplVfXdB5Dr%Jl>dQR+l#3?|AN5$<68ARf{UocBqL(D3k@U9*SeT6 zsTij}^<1PeipZk@aV`p1(r0-8XL3y7g;93qJ>Ly*DeAb9oR4K`&06aC&#bCqeFs=( zj+8wIFUp)`Oecnco-X45&+`%OpSJOU#r;gF@+y&H)AVdV*Q5!Ac38tg7`9$brC`!r znd`T;^k^wBxGi3%$%h25zvpNFL+(ek*tYZW#mhQFH=%R9@szY(;;zqmfGk&2aOzM@ zY48vB9hG&#P07KuV#YU^Z=Nx>|5sX1sdwi25O%rd`**L=_rb9{H#=jrQa79-Eu1y| z{OWkfK~;3><+rUQaM^s4&~L$s#R1lEfac75nZao9zxmx@%uZ36t)LPCUTtD>OAZ@^Vm9fg?A z^d9OjpP%|WuKy~FD*V2_ZQS>`##f*v^S-|2@Rsjy@T*-~;KwcwRVNx3m)AsU_BBSt zU757v!hitUbnhj=-mfDyx1G_RvZ9~rJxsr)P2K7{{%YbEvqU7#xPw|J#vSSE#pI zA%CZ_3Khf_3VDLI(d7RYJMSdU2oKNfue@8g7zIwet|7=<tpx{mD$KzC{jaX8TX7wj=5Xa)uerQyE#J!G38C4XZq}U1~9AOy*gZ zj?X%OykiKx;g0^FDc>VV1ANzI16wjIBu_2&B{(u0dIpDkyN2R6E|5RhJxQA6kj>38 zOZ@tLBjz2K-VanJP=SC)+HwCYyv1y#BJtgCAQi2fkk{FRc3)LO+) z;rRu2oZ{nqk?3LrY}N4iv8C~inMyx}5A$7sEO;3a-dLa~~ZZKiuiN@et3*Em|6V)J))&(Pk5diUCa0@ zJ`_Bn(e*7oINS!d`qj^9TU?*^_x0(vYG*RR;~f)EZUtKY;K7b%`C@-}a(??3`oBl< zuL5V|qnGCXs)X_JalPZclY8XG{plV{t$*9*Bbw0l?oHT3QQx`5wc54Jy40u~=DTot8Bd>^FV3Hjvi$zcD50mN+zsU(dBQ zsDCm;?E2;=uC=HVHifztFR6q*qV=`)x%kT&eGYKGG)na^-3z!p2-w>6CU=zgrhuIv zW0#wi?cU$xQh4nip9Kc{zgjNXX}A&dr=*g8L<^N0`Li7pC|#Lvxm{)?FDE6Y|0nfx zV^N2fm_hR+nkV>XFIQ;G`^1&oWr-VMzT zwqbDY>4kKWw^@gcWshj=e6}-nNlVr>WS!2v^1(0uqKEnaY#ci}ny%@HPdKIOUWJZx zK%qOi$9zvV&{D}gqJ<5Q2CgKXf$ym#lq#XnJOjNyshE4Iq+iC{G7rR8PQ`BzTTlKb zxPSCsX-(hUu-Pr+4Ex*(WJb>F`dY{_+ka|*6RfBSbCNIdPyBZWE8<2Lh)+-Ds}We%SE z2Pb}|iPsX|;H}}?N3^zzzKi&u2IUtV)fHVApy}4Wi?$U1%)KRt>xtnCm(5n&4K)@< z4jkLeRQ$_8Kg40`C5J@+>0KLR)A3LGa+vF%N&~wK&;7%?=>3PO{eYf5?Uz1({_r>- zi}S92NWeV*pU6>N-u4XmRW|tzxA^VsIad2uZnObz$@Y!xueE0blo-u!9g*V56T(5i zrC$HTMe*Mr?!$gdEq*e$d2)E=Q(1OVjb95-^-R?dAozOy;v32i=})*e!KwX&V1@RhG*pC9DQh+I zzf+*4Rp38+ZFIL(Ee5e35($1igW%h}T#-X6mV;cj6LBMm#r1o&)OBxhqXeV28s7`| z{rwhJ+n5Hfi2y8r!Pb=ALgLZrZNv>AAm$P6osp8Z+!gE(H1f}-ZLNQoXW+Wp?yGZj zPsl=m>8V6g-!yy2L95H+RJ;$8V``;3r<*74OP1}s$iFpc@xO<4>lf76Ywp?v=KY2_ zkSBNXjBPc=mo;;9OEZ`lYXL&;nECO=&>fu{DXLN6ncY33gksP5BU=1bis!WW_$g-d z-Q_jb<)0@1xr5T?r|e;=@(Wsj1lu9iw_c>l1 zmy(83{~vh%l}yxR=Q_j~K9#>Ypi|?4YnVGiH{tg}mo<6X_x{oK(0Qne3o*U{dZC__^2=XRDYesY~kG(~5n z>C)^tXYB*{T1&UmhT>;RdaSX|B5{P|la~JfRb@U|LEN!hqs?{^kGR`Cr1HG(S=9Eq zomvWTzpPsn-?$jA@jGn1o-|5W_ZAxz601#=a+t84z-TqN((Ig$Oqp(Gb#f?Qk4fgX ze(iPuCDr}8R2RtvJ*X^EI zK{izhEzPzc@2ysO>u60UaF8LEy-)sxHWInHzG0Fx35l2 zOz|%+k~njCMi&ibh0jA@h|1DP|92N|qW{4P&1SBtzJqwV_c_p-O1z6G<}1a|@?_y9}4?82#L~7qgw)xV)f>^=ap;ogGURPF=Z@ zO{Zb$DeKnn?l1E;)Nf1OJkw>pKsxJ{dC>|blJfMo(yeipNxzo7Cqe$VfcAH_l7Fd2 z;7|G0WZ~kSd^pIF9d%P<6P5C5ccneqm%eCC10L|Ev&xT(yk|SfPH6(FSZHrxn$~Pf zCQkl4s<>rdNYj*qvYW}ZH&R@Yzaka4%UO%|KiT=e?iX089juCk*0?IW&D#7N)(wiY zBCC28u>3w=>(Q8ec_NxC40YJAdn566FBfxP z3nMf}chO>VQD2vv_2EyqR9KblbJAF9`Wvp~|5~)C0DQmWAUnHiCG9%)x@G2r9Jfv+Cw^su!5FzTF(xd#ooT6#5i=i%4p zX%M~FMt@nEc0K&VuW|7356Q!uHCAkHY%zas>i5%&pe`>%e7q-?U^Qj^Z(YOm0ZA4P zprCGv8z&I-TEkzva}IJUtptO*Xw!WyFZw_dJn;gJT5Z4!_mh`uar+ zZ&(cGn7?heI^3sn3erWd7791*S#g{Yny!|>uZTV@!uy82M88g-eQ;L%qj+mo<;)_Td1)v z`uW;@+nj&tihq9ls^vB;-|vYP9?^OORGZ{xTE|av6a5Z*jf74Dwl=PrRfNxgyIZ3&Z*IyQwD>x6 zN^yW!EH{C7*8T!w!Z)sWu2dS0OPvp5$H&gc&MZM$_g_>=H`z$Aa_NQ$YzN$3iRVIn;pUY6@UX!>&A?&{H*=P`(A|d)rtgmgIYL+ z((0G4ZymqY1W)dMOxn$ddY?WC2XF65@1bkV1Ppy9jl`TMD1A%VS0-^tol=epxN32RZs6?V*J|HKt>f}<0s zBPZMFi>3HhgnP|zFD=HnhSJz$vsM4fxtzYKNL3pI$@d=btNZZx*yX1K41QjBz^}}m zf}5{mP5&-Ua3lX7@Oc|Rb*AXjDz|XIwb*JhRBfV$({)i7<@Jd6lnSMPsMN0T!x;yjpx%GRscwuW2Q zr$^rQ#ik&XptGukF5&;LzCEHv2DoorubsH)O6gBp#%Hi! zVzk&6dGFQ_s4I(E%dT0kp#I8eXEK=a<7YKVOwSwV0lGv5iBhKj#f+!stiIg#Y$}ZF z`pGATh{9jD3hNuob@6qym|R$+k(Pe=@g$nexHR{qGAZgZ|5^0Do6E}rMyouQ!!I5n zI@(U->zz3)c&8qA{pxM!(Kq>!|CB3%x)jv|hZI%V=ew%9l@{7D#;WG24lkB^FPBq8 z0t>RyIAFbDOD= zSF&>j1~=_(^8FU!As;$Q$KWEJ`e%i+mE_` zxq)FCuMN@xS<`5+d*r9TwZ@HP`fu^I{t?YRnY&wfG~aJ}Ae!|2jXLA&167JsY{7v} zQf13`-5*0ZCX#h!h}55&%%eMrjmJ(jxp!#K{(1Hs9sM~5`t#?{Upz-c`v>oK8p`wFjV{{KGl{#@dp zhrtC6KoY`*v(RbAj(EcSG)98E%^Y{cdX-&&{1uVHikGk2BO2}_8kG@5qTb{YZJ{O% z*_^YwtwN*urR{BjRsOh3d1vAT=2g^2mackav}AGij7{nh>iS;$w)SBm`Vq}zh+KfH z)KCbhg;&g>L{masJu?-iV9%>SqEd7zrz(DS;~Z zX+I~Sfl{A1@?n4h| z!O5>W8;Wy^k)6$STO>Y9ECsH&)ymUUoN-AA@N)wEO&Q~`?<4pM)gAlnKCvd}3;V9sk9s!wwS z*=ruFxrg8SRzIRmr?B?+lnx+HMH#H(-cmrVI}GVQLlZ?VH;n*V-0nc$%0*Uz+MhQZ za|_&q6RThirH76YRF+LMGX6@LSCDA)*-<~&Hu>*@TnwsXY&jvZKLIq29+@Q>z)OiY z?Lt4UcV!qQZ3Mu+Cj@C}QSgi?{gsowZQZ13El}Va86c_xPh#{A!LfR@1ygwv$CUCpom{dDa0V8B7YF>@X{iO>m@R8I=EejB`x;5W z)bQp?>R|(5SJk z(uFFbZ#?ic)jaqO(kt*8mLw-P%`c*<$W}KgdB5A%RuR!*>2;!C+lC);;3OLT#-2b; zeWFHPHG|+0jaciDW}|1{&TljK9xmbNA_Vx_Sv6mcPcZM+7zTp;%zQ?me$&C#M|%PV&-~cZ_E2R3UoNPmayWzsI)mcF3Y5u+5%@|aBg^nQu@_U4e2gQG+IgliR&l1g z{CfWPKB{>9QDUmxFw;l^c=2(vDe!Ii-Wk$|{^pGd-zpd(crSaAd1knt$MUDQxCBt> zw#9B!XdiqLa6>i-Iu!)>uMp!FfS|DMB6MQ~|5AMG=MXv!x?=~ss*6Y2ol?E68Yp~_?|l4<9ybhjTgwq~ z-)Q@-rH(4WH?gZHd8K-7AyGm4V>k^djtI^YSnkatFnJH2Hk$PD()tA13LOCLB`CU?VUQ(^iI{hHGqonD~Hh95_JjwY+3dC9kW z=Chq9##bw2_kAYGo{OR&-#O-2)6`3%|U z+twK)_REoFk-c2+O-adWWNX1d-kyV{qITXQkhuOpC!%@!Fg0&U{SmEB&g9x?A5~$F zS4Pu~aB7(Pp3;nrN`39NevMUf6`erLWZ&1ro~c1$_|7pR_p@9Wqe(NuF?+|%K6$-)-8LXpYA){xb4;X!J` z(uUg6qR7C4RcTW;E&D}0w+Du3xGbgqY`xto;#h_QFXB!t`u1zOj8~+9b0Y;YU@1UK z(It}EZ5!CMDu_%0;ozmkzMRMOKu1Nnr0@#%WeMLxqnOP_>IC}I_|}9W*K{V1e+FQ; zYSaLYE#bHWp?1K$S{61OK=m`f;RJ>QTKpdP3fQzXHYetq8TAR}X3gLFh<^(pHEIxlFh_d{; z^ZPA@YP0x%TXHVNpWsgGrmsf51`cb2f4BhE5e0s~hd-jxwiM@*CyQDoW>}jP_~aBk zFrs@=F6Es@AcL+GfJbtkYDvgI>y9E9=x%L-U(>GN;DDZ}m0DGx z)09eGVx=V;c5dl=8NP#~j`tVt(wo^_WH{=YT`ia;v6HO1JnsFJ=5a36zdzsit%9^N z;z)B2`ygUYtv+dS{`sVqRiz>qC59?%+XMq&dXaM%yv1S&L7xluIX3j)0%iKy`nd|A z8X;>>srJ$Pf^;;D-$?O6GaqE=^8&*bYY0=KX36^Armgbt;3@R6WrO1eUCm35qH;o4EKp#nCIVm>3=l8|6+kWeb5+Vw!_vw#8bDWIdG z_?jjL)VP!fB7q!imuddcBCyR<5l)_H;ln6Xv<_{L^0GG4DF}$&ZAcNQVcu}ZC13loMTUQT{ zfNBo}EI8XlIl*%zyE<)BG1FxT0p6w9sV#kHfQ3^)K6Em%;StRhyS(paesGF*;b&;V zBO1)^fzDXVZ?&woK7GDY-NCr5sb4WLyciBs=p>xdDB4ke!XI<`qr*!P;>#E7wL!7e zT)#aNHAc?KeWI~TEGcX0!oTn4X?zbRSvGi)l|-8qfxzxkU5oYaz?Q>T`_w3~d7=$& zthMUVRB;SXFyK3C>iXX45K_mIJsnMQ*5N6zR_Z55w5ulq0Y-{*gFu=Pz?Xs*`Z6b zi71j;$6PZGN>?p}1=d91GjB2xt-{2e)KOu=IobrNDxOi407pBaTrU>plinX5;L37yXSiApDqP;pVriF;#`Q5h`4ZXav>xXRPrbw z)-ToR^75VViOb&JG#*!Sx8ffq;f74_=IQ8{M@G*UHpbqShBU`*7HkRTc+-dNX6t`8 zHZfiWw6?B~0o7`N!gnrfGKPbW)+!iSdp3vTyj44ika*0*J)?QNFmUl3=6RJ?AN*bw zh!xka=DArWgt2@8<0w}uXirNg{VlOz~|?5efVGs1 ztAVKE(d21n6F0m--<7GeBhR5uo4fduVG!Jz54UH|JZ*wXS_7}b_X&x@x@4@D65;BL z3RKK{hh>xtk`L_7P4jB~&XqKwvXrfVSUn@I3mN^}Vv%ve;xbs-e=(6jI>trsSxmwg&ne$aqxwdD@TCV&b=ire7NI zvu7KmcS~{bfu48~KmNEIp(;{Rek`|#YyQb=$SYpbNY%R2`vUcuYS;;eo#Bal2WiWT zK-XobwBx{n1NJ>Z1S{7>G_^oOtTWBF>5dNH+8s>si-f~U_OAP1wIm5bPTwNe`MK9T z$;|SKrc*wRxF(PB zO0I5EW3CDa0~$u&Bm-qsp>M2LmB#uv$=whHa$L76;~pgx*Z6q=>_;?9s_Fo_VHS1{ zQ@vvfTp3blTDgQ}{0=;wO-KS>d0rO~W6JKMx<{Wu^+WirB(&H{8~@Za~I?`6ExAwenomlO_H4C zB9F?i(3RwH)0GlHd|SzEs=qa77NV(J`wr_|tjrdTvWU#ypJ0Mbw5Uhyz#Q94N?*O2 zVaO;c`Z=}2MeRLZi6uNfw!t?6EY*8NbImG|!(ww20B9v@NB(|KEBErbxb?Ow>JHbL zmErpEjj=}liD$BSDLb9k5e#nM7~YJGIJ6evV%EATRqeWOKY^12iuzjDos-y|!3%H= zs@l|&nRje+d|2caqOS%*7?m;P=-6Itb7b0eb|_3J6UxsaG*fO30O^!EwS)UNB=w;! zDq@Pxl!SafWg17!#Z8)JX@`W0MI`$5&bZ=F1pXP4^|7R*C>t3$_Eu$(7hsKK(usgg zECZ#IfqzmxgZ(xyoOK zjmmc2q_fCENRb+{;;4ZtX0>S)mjSIB>a|2IUQkMS|JI^_mi-1g-l;3a?gA;4XQHn> zinp+f4%p_BjtJ9B*PXuHBvk)Cg;xhG7WG1BHK0n_lW$<%@z&ML9U-GNE2gpsCrWE} zx1G)!ZCy_m6QU2}jYv_aFb8L-cWREnP60lI4vk?<)kM3b=vj$+awWY872X*aM$Kpg z{DE2uo>eI$s~RCf0d%j}k$I=NL6WBZQ{`^oib|;&P?>PZMGkf-0smZcG(KL-pAx>n zkmB$+SpZOspmq~Q&A%NwHoF_9#RCo*3G>U|3Bk?r*`So&yD4T6a_5FZP^p7m*ss4O zBmgfp>aONc9Xl5}jWAhqSm`5Xr{+E2CX6f)Y<^`>0ckhaOSH(z89 zC8JqbiO!wOcFn~MH=!V$;BKvI(gX2C;imymMJxqA#@qh7pEdIw1ry=6ZM*^oAxA$0 z2SA1|l-p6U@VeBOm#PFHzDk_=*cov3nv9xdh4#ZILg19g^$-m}H8Rj+A^JA>q7Shr zBMAm1#QSXSJ88fW97-4&wO1STn&a=3m=&xT)d{5u&ID2#u{ONcrIbr$rRe>QG*%Oe zd0>v!;4oD36cDdGE-D)e^sic}197)nE)rE1qn+g#4)zLC$&yeIU@_cp~?J2prTT!3fsX`X>zRqwiT;ZZ+HeaPZB z)vPdST;LT0=5n`tK(6Xou{eZ8Fk?$WigsbSrC*IKFxJ($n zyfE))*Qx{5Y^$i2Yzmhy#=hHux8da-WWx6#9C>mzZ9xH)#601h2Oh4C#S(8$8xx!l zCfB}Y^D%G6iYBU_iDCJ(EK=UEMmosOCxHx*bv z(RaP4T}*_QM2@r2fycVIN3v;LU+&Tsfr};>-@M=nD4i}A4d`LBr~vN2gIQ~6hmGH3 zI0NjtvxsHS1{AdTSro^e#}-%;n)(%7K!wu_D^@_ed_k2(fDcA~@_{r;!m>s+l+Z4D zc$w;0CpVLRZ}!jUdTXO~CkcrQWLz#+OM=9Sp!HoztHG||E%7A=O788DO7cP7su0E7 z^0-W1r4LdBX^z>2`mKeahx<1O!-LcDlCXtv6-7q|Dw^yae0WD1EfeFn^B~n=+dVCc zZsmn_!wv8?`SADgDt$^^5c^uHx{}II6{jxr;?v%h2!z)5Zb7g6Ts}Z8G?upxP?55V zM-!Xwg>69y_mQ=6xr6M2#=SUJqNmn}}O2n&q94@b!5fNclbFSPY&GWF(u4!2129VnS~OVXzj9Anr~ zmt_#xSSRDfNts7;RhX-3OpRou()z04XfU8R%8!$K;!EKo_q6-BM9b;Gqvrzfpf1kN z-PRD$a{o4LhY};(zSZ2VP7@DqAJsTkTD}w%sseJbnuy)s^;TG@PHt9>+ajXc5cuhS zt$v!NCXh5=e(fg*l7@4y$$8}2Dv}p(JSE$?XcO_}3p`<$FdYrO^)mPZcvSYFo*~LQ zR_L70TZ(8ib+~hi5hhnte3?~ml>UhJYvs45jo1vkVj6|DnRUrS_m&8r!)aet??$wf z8-jX3H+F*Ifeh;LK_k&8-yh3CJ3O)j$}6<7_Cg;8^*)TB9Ub@Rcz8d1@So)7-A6^; zzt*hem}94teMzN5v=!%nP6MJJ_24+b&QIX_I6YC_0NY9~PO(9s&VPTl4FyLfHm9T`L?1dhs%TYZG^@)8U*+R1COXqCImI!gnY24((~5BySl@gWf-12ra$tED0))5IYe?U31Tp)$E# z+^Qu@mM(j)-kTpqIYg&fy6D$eBrZoum27Jf|3Y;%aua;8>1ItES@}{a_gE&5S6!8e zqUmF{T}%Nk5fnLJuF`*2C8d4O-KtR*%{R=b2)Z{%6@8;i{^Y@!xEWQSjIG6%`p&Ei?GqcS(g*!LIR)2+VxW8cyr5KD{e{@ZD{+nI4!RJZE>|E*|XK zQCbChCtIqYRH(C5#P3vypwKZ&F2IXwbjUAbD{hUQMi_V{AU)3s`B0v2*EBt30zZoD zt*U}#R2OAV*5t6n*Db=x)e__(B4e=>A9sCd`up(CXi8`*pG7Wjb6?A9oKqXV+$Q{JqPXP z`8AbbHq26(sVVf|+Gg#+ww7aj!KD&I$hXE+|)2ekv2R88g0prR*#}PeTNCHA+`12GoTjKCfqd&&U%J zbQ;bCQR0%z1ekX$0Nvt^1H>U zA)Re6WLsQDG4p~Vj&5B^62vcZ6{{Y;>&fR$yTx~%N>+Zx06P&Z33x4sd+Otl%@Dn@ zNPWQJ#ziejv%MQ-vo17rAKH{BAL)toDJxHnWXQ&hX*}U03hfd2uth)POf8@BGn5;~ ze%HC%0A)-hzj=8$@}vL9u8K{lL4ciGRUbpX8Bc`OB7B_-H7B6k5+3^Z*3^OcV0U(n zD&}M8J(8PHT#22Iv6|MS9x}vhy)jeY(1=rm$}2o$UUz6u%SFvhwSk7Ux}dCH?@St#JZ_2(Ji(WBfjpYm}x3kE#YX zSnnnPPbmW<7O8cwJnRp!b{%^AAkv%Bgp4ICdAOUx=^6+ngHYjLyFOXE{7!kc#PpGP zPWapO15i&5lHHrpLV~_N`r>>5ypkIZ2PlvK`fTm5Xpe2y$mEfu7YlMpmy5HlN9k8f zu?ohV5%WaT$!Ab}D^w4@)5*c6CI& z-$Ix-m6Ih)yEoq-;!HA>{*<(D4G1Ol*Z*L=777*?n)V2Ce9#qbTqkjV$3{}-n_Xss z?1Tadm|#PS&dT#_x)Fsjz${bL}7g)CrQqu|zWWJuVAHG<)-l>wIRPj5J)6 zy*4_81YU4^!tbM_+FdkigPnQlfsONABO5w)p_^x9CHZ7l4lU9<$Jt6fG*cW5f0*4S zgn!@0N7A&Jv0_63JzlhM#*sTuXD$A|u4E3cjEkO*kY`Bo)3s_*S1Y-B>>5DrX z<$wugoBJvUaxd6Y2NglMzLwn~YrP1UYyJHbSGOgp|aW4p+H`tORdvn4x$X9ELs*?!Qt*lpt}R zd+}j?Ns2ehQH#2e4`(@|E`}cE_qeW_+1ej7^VYq1UBhAsvN4%|!l#{chw}2CgYfQzj z7zayD7T|82Ib!-5W(`sGu=sXo<_*OsjteWvZFkhXi+chOkw#ylOGfIUP%ehkL9<;` zR;K=IP5v!rZ|*f4%=LBs<_LIaih^#6LM-{XLFGufdU;s)jvhv+n^G#2rjjdP*EfoQ zJ2@xzq+wAjQE21UTh#H!QezSvQ4 zjfi5tYl-7^0%jvqE(vVF@Z^*h(N|iCJQuoF)l?h-Qkoa?UDh&ZLT~NkEcUC{62`gS zb7)dA;Hmgm6P?N&<5W=Y_{F8mYS0Sl8 z7(PW$dO9>9`Bh^>h2XdRTwgA47g^CY<#~WN+iY{^tUrM7gcTek5?!r6d#*-b8)A9Y|-qx?dE~fpiwOG}x`T$__ugq%Z z;J|e~a~Zw4PWAJht1Mxk#0Y_C0=o2VrAM>`cYxMZH_?{b0k&U)f41jb7>a|iiqhc3-AR4Ti3 zmb6`bSESv!PnH_Jx8F!no+d;Iw$j^hA52}W3btA?$V|O;9Z!`^+tYBUFo-LBYo9GW zLnx90pamsw0Xh~&JQ5Cd;6-Hmsa)NKH1Im2%TJ8w#hs2&)%)yR4%{h4H@g>b(o<@D^59%U`W{% zp!u7Qo2mp}UN^8UtgGatu385!zDzI|y(LCfjWq1Q6-*hK%A>FRBnCixEU{l!y*&?4 z;@#UDJp|QF9tytz*XR@cnmU~-x}u3WE~fYeU^OI&)V+366U^jp4bktC3w>z`L|1tF zEVhuI^Q1)0>Tt{i8G(vQI$(=ZIKCGpNN{`M4kM2`E_+8PrT>B|vTq)$o-N(1K!&Pv z)wrf<-}Ut7E@4aL%(onIVWKW8e%0(;5T&|?bBc3iv)qJift?jaRtE8wd_bsG=lfEw z3Tl5tdN^K8rlk|agek{plL6G%nfgcMA_dHQ`|q1P1Z4+1D=R`lO$g?^!CYw-ZMd#t zfx9h0XU@6T)!C`e0&x|aD4=#=bRQ!9iG`kG>t~|(Oe(vtN=Djo!q`ge22x~6D3ANP zPCKu&3lY-R7d>ra$)`QpS$MAlNeNAGQ-1x^;K>REtCX7ktqxl--{_Hqc;wz~jKK(oI%`vGfW zq!G<#O?E+@#M|;DWdubi0w1=hc~hU1C~PfO`8H*@%GHR5GVburBU+MJ1-iA3FpFD5 zUwPg&HlDLL`&~lO5C_mBl&n_7D>bHJ)cin>EM-sAy+8U;P#7nj)SV*H*OB_mXiJMJ zxPmp+CR|29>t3NvOS5ha18%POiAR{8Ee>8`l|4mgEQbO2Gi8tsX<8rsehBFrF$mkl zCFH8U!7tXBSoTFRt;dOow;^6bW_FS-T{X7cLpS?dLOr7?)R=laZVP-{h>p9o^V*$# zvd2so4be{yi5ouz5hK&qa`Y0C+qg3f`kk&ZNdeaCij2xrIs_X+yaP-(si!~wl+zDX zq>M8wo{OAO%5gQ?IV^*Keq&0VaZ*zf|G0@_zWxJ=WQw-U1!wb4Z5vcIeu<@`#v5e( zwo{63lRa{$PYV~vVo$LrT<33tw77?v-c9{Dh2C0gYH|ksc8kQp=lRNK{a>{Z43pm6a zwOI6d0@7>wHs{s9C-&Fhj3jL|=(W|Jx66^LYNQ7DJMErPs|m3S;W}4)m;*Pke6X_= zVY~gX9}q&tbg6L`Yv<;qvq8Oe*F*x04+lS*0aQl~F<~bGlO@|u^}>&62=~2h+M?n*0obHsw0yN`y|HAKR0W{g;w6S}tfOi* z$UuK+tJ4ARDoO|Cwk@Dxe~JPh^qB=Or_W**_kJ*X9Z@3Dhcl8OncypMM4?lK{8meFY)GoqT`|9NA3Lv? z?7iX8!)wDtU@jUdoLMVD_6$2|xUT>wfj2bKbh&BSU;twR zp;V$n(gKGwE4tzR)+dO{NqXpvfs6MY`i$hlD4xUmxET>|I>UV73bMK5uG8^4DMCt6 z*M-+b6h%C=%C;>#)Fw241@TpcR;Y^U3c6L|hX!c$uAU1jr6MCK@N6Mnkd|LfZ(OLL z#=R#n7r-f?h9ZUCuuDwWTstzPT=S0wf}Go<6Ao+58W0Rs=HO0W$>Tt|Lc|?jQ%AP; zDDTfm4s{_LNNPEVL`Az-xZnls;l7_N*VGq3UdOxnXIgTwQ2p3z>ph@K=)OZHsTjUB z9E#^&42|OeHfB{qhW0U8QZCV}lfIp(8kquG;0n- z2tJtV23S!ZX4S0AXHBYkG{MG5hEYQYk0{M^$axl%^|88bxzBi+OpIMU@!TN-J7ULsYRzzp%Fh}+cPW+vL#E&{Q zM&gnMA`_@c!B>$KwgYz8*(w@BfkoG4FP-&p;mlGMp9pBPcS+|T;&a5$v_ zRu6~Nv*P^X77PQeTz)UJ){NN;_x{U4M)zdP-$vPm;1yE+4xIVefH9?|4SyLO$fJ}CvH&o2)>tky>2Ar+iic>CxxEBMGL?U@8L zJ8^WJyy8A*z3HJ8ez3WqdM9aX9*3PcJ?zqceG{nDw z_$rV^M zmy4U+HNEV_1fN=Wl)%HQ8=1G|@^;}BPT2tw^20!a9yS4V)7n3^a-?yG8BM(*KDfQG zD`GM>m-`TjAH0LU6t9;9y!ChN{8r;>zvA}>j8%#j;MI?E%)g{nH8q7e{ z=TymSXXE1aMALG7*;ys%xghaU z30??O41k+!*5ifZ0aY}V=d}=xP;i31oSF?TMRbHB<~<;rcH1E}d`zd_*w@DXQbwcP zUD|ZA+2xSs#HiuY>YSnSMh;`+UKKM+Us|-n)BBjrH!L+b(gRjt(Pb`Wl6&E=-Q>HC2*yx9p&UrSGvI@OT+TEFBhx zSTpxT%Xb-p?BKR>Pn0)BK#Z+TXAXkx<}UR>s7MZI)E}1cl4Ag>bdVsTjS3N+CvH&V#_WO`*O)bL*FCQb=qF+V3NOQ=opY*V zog8ltYol*zhpVv!6p~&{%l$ogf|whDPR&IW^eQ@~uZ+sB-G;+6%@vf#1Ei7c(y++S z({+YLnkMQX03}OaY_#4|r4R2mBN?I6PeWlsjoR}gatiBVjdlWm^x8dHrR@rX`)7#G z+;l(a_P*VI_@=)a5dSJ;4!jRhqwHA`EGTY;Qsw;uR~x=!t#E#FLLvb$v8y55N)hUH(H;=pSeo@DUa^ydvB|@3$ zU^^*w06S0<2uQ$`a0^If0ITOkN1tn#R&!c|j2j_p3VIwG84kzRXPop(^}k8nrU=He zxiHjaDn3~G%{Ax$L6RQ$U5IG&9;<2V!P>L3;_SoQaJ zeK6fpr(434h>n%tEQ_*DbPeY%IM5HQ>sVr{CpS?iBDWomc@?wr5SK4%BJ^YL32zMs zC9;XlcPcq5D*NuRwjz?Rqy4FWckQaYAog~qct+%LNoKFJ<`GQ(8AR;#sd@F`tFzi$ z_E5D|2h9K|*Xb1{k0f(Eu6(Im`E=-Wt@m2FRYp4|#Y!c${$GRR2b@9cLiu+g6WSw( zToTL(U@Wx+Ft+C^PL)H0xLD&Ui80q(x>yrKJ^D+oC{;ZWCQZsS&y zPy!K~!QG<7^^iT`MFdTRV)9f(^)7gv$y|uJI`l%{A8V#^jI}_VOoFRtTkDwFuYkD+ z7WkC{5$H}F|4)`7^cnSE@{R66u=DbVwaAcxLsvCXD&fA{dWyT%ddvV#-txY4a*jM! zo3$*6xM?Mel@U`vNo1dY#m0k#6eR>%Wh24m8Wx@!@QB93Aezv%Ehrd=o*hTq#Bm@t zvC7`DF|)=lqeAOibWZxBIdjAn5(2gh&s5GWI=aEUM<04Wcf(@*U_#1*!_KNkEiC@B zU?Ihsa;*Ove9*(ly>b8R)R}Y;`Ki~gn3w7ks_W%}76BF;4;6^E zrNp>EMs;=2;ncdGC~o_rwn%7_H`q5_CXU)S>ORUpG0?j?@t9I?qvQLOF%dh{NY&fa z#H|d?Khp}Q%(s#;`xoTEO{7njrZ+KO=P}{hQ9%={5$XUYGpWrUcgTziPbHq)pOzfD zo(`SXU2G4|2`RfYOOdIO(kwg^l`a+^_G=i$+4-Wo7|)=>a{6xjgpasR?M_7kAYq(( zE>hbUa}f77n`u!YgZL7w32P&utHzdoW(9dM*yq73y0SrK8I{1==0M>m@=n!55O(r@ z*Wc{A)10mC`31X`Gf$%oOfW()j=)B9$Li@fhqGcIPNhj#w5oy&V@JJR<_#7H{fT3F z%WuXWrqg{@T9GJ)*>vYa&Hm*0CwUoQHr8B?U_$&-QI4sIz74*fuJxF%FN*eMJkwIv zbtu`5e3C?!ZVc564oD_4s%iV&2~iQ8DhdO>6Fh0#3Vo!K%kiEk#5=p|S*dmBmdlp+ zv7n0T^VsY7nHz2m4#?1Rjjrmp1}!aCeWsDr8Cyo2UR}{5fe{4DC#>}?K&e`$VrL81 zEM#!=`%kBv_^Lo?%$zmxV0|{9zTBXg%Y_$6YuvfdM%{2?&&FMaf_Kh{DkwZ$s-h9X zTVZ#Bf)?SV3T(}+m7a1tSusB_v@Fme9=6=K^#@AbQ$=d6qBoom%%W5J7uOJcdNcC3 zT3O@pnVJrMpfCG?Ua8&aUi8SC{ z9))54h5RZz7_qQn`z{V|aoL--$d(j1P(jc5e5gGpv%ga`om8I@B2sTy#5|zjav#~h zj)(M5uoMD84O|vhKvJ>0@H^h~(`}B@@QycyZO;N9)Y5NV3CmyAbzZnPCbsSg>W^9o zw8#V+X8UO~POq3vDKyor@}Cvz9}YB37-Fa15Rn&oQO*jssII*AHlTP;%lO(x>{pY$ z)rmn`{|s+F0g2vHukM-9`s$0F=485A6Cd1}A4plx{uznO$qZ6CxBm_`HkRX{gFz1{8z-!7&0Gh0JlXX$&SEc4@*MvV0|_@ zTo>cBWHyv!fV2!UNk$AamED0mQ(&KWn!KnT*I7IL@+GVuC~f3~ zjDDS%j|8vDsnWOv{4Uh6e=A{86Pc^)1yK)TX4u5=)YiVmbS9?#$2&{+7+1mc+kN|@ z))3#m{?F(QRGUSo80H23))~w8-5VCoLl5?F4rX)Su{o#26kuJ;MDq`r$MLZRnNB7g z5vcteBg?%t4-jZ3)?a!ityyT_Td_|w^K(K*EgWz7K6>kQ3oY~u9J6|D5k~8iJyl4- zTlw50I?Hh&L-UMxI40xG`)iZMW#9;KCe>M~)vj%{qw1;N+f00DxU;^sW*1R3z85+k z-!wv{Q%uJIIE%#!+7dYvZM5o{+#Ox*=YF}b0+>^sZ^^7i)o=RryBvg)jnzY@U=e>7 zHFsR+zO=*BcM4A5k5@yrr}7T8HxU~yOpd?Spd$;@06uoM%gN5)=YG-ZuW%R0%uORH zXI!IMe1q5D>Vm_76kYuIG)pRem5`dB>4N>zO#p5qDXO zn%?t>-=<=F!8H#=a(iYxws9>J0s)z_?Plxoyu$U@FEVKs-ubQO4X`OEPlM>E#Kb7B zMgfaqW6H`L$?pjR2a3h48JXHkd)H`9p#!Z3r;;Np(BA43!KL(t8%vk%<-T&)wz-kz z93_T_P!9@^`s$s7*Bn{g_sybu^aEG6FMEJ0Li)usZO!narCcez_+$_NI{{gS`}Zo_ zrw6+yg7KLnHP`JYW*SR8yWYHt1kp3BZ7v(59m$qm7uS2>)H58l@A1yRY5lQWf_yxD z8(Tz}Plm(t4l!M^bDSaJ`^5e(lI^4)a|w5Yp3>a{PV04WT_vyMI{2 z>R@c0go1xq0hG@brohgSVa*dwc*A8HtCs}h8@XNy+{zr>Hu9_F1-&r`PL?hYe~QIZ z0_N1J7Bepj0#8~ys#N&IHCkWpV=;0gm38U@bmgp@g{Lp4(z`3Sjo2BSe)ekKM8Xo3 zPDSdokp+!(Q3dn1sjUu9)sa8bb=0#}==9pC^+h&drVW+74n@ntRgM#>te)|`wmy$& zZU@_^G}!!3#4;z1BGv7S5Az7S3i{;g*on!P@ELM@VVp7-L>JuY2>^&2iXy2f~FFK#srG=qK)z>n3Ncrz33&d5Wy}li#RsrZIKp^iU z+MrxxbCj_cZThcR*HyvS43+y8bZmYuaqZqZl3_-S8f1e2)q_fE#%<3DZhhP)u)Fl# zn*w0?Ksb5}mO}s9!o$LHOo_X*prpIxuGBvNtdtsEBp#v&NkQmMrF%wIS2=)S^l1(k z&;3!4P4*?DMXhxGB<70LZ|&B(Vs^u3_rlTbPlc1Z&h}mzu!c6nm40Wp{oZXXs}+ zacZgv*>s|f&0Y|Tj&@~9ND7<>o3MSqtZ)Xq#m?K9Ep{s1Df-6(3$v74!OF2q+yQij zaSSTV#7{8ak(4C4G*6)ml5Jka*r{Bl2O2WI5L3wg2dJ%iwx{B_%v8?htN1+}GQ%E> zC+PpCqzdM8twKj(G?%hBXicF8$OfeLC8IK6-W0%B-06wM5ac)c$;(*TeZGlh&zRK@ z8EKbOyAqaiNg}mi-;$7998Y!z{oAi`es5qK!+=B+77o_D3YpZi&UxFO$uMm(I87z$Flu(S(mozy!lszP`m}in;qt&>x?* zIpoJqFgV3fwg|b=u3|J>T6?NNGooO^W54Z=)J~qSY94`q@6crQ7J#VzQfzK|f_}r) zWhQ8^eyU(@`Y)j>zY3=(q2a{Dq$Cn8DTEa#s+i&;DX6-im~ljlyMAB!y;xLUQ-bSL z_ubIjqAfu)JS(+}4%4i0&>2JgIWaSfs_uMt5C_xf0glr$tc&Vz3t`eQw zxH&VA32vg4QU#SZ9QTu1%k+QLNGi8`q1v8fXY9cAHu@~WHt0DdnJmt+G2>)Q1+8K3 z2tiG-9R8_D3QLqy^%e$^*2B2BgJ5t*avnh6hbBhROQnldwFJ<UxqUny0z#MaWIr zh?n43suKwTf#_o=ObLI2EBnk&$3xrCZVi&LO{uc@DMK6HY> zU6QF(Zq`82CsExuS=>r;Pdtnsgj!oQabda8ui!A@Vup5hMbqN4@s7ZZ7jV3+%w^=_ z?5fxm>&F1W?+dw8fG-66U(S6%@bQFt(PUiM;F+t;uUfio;+@APi^N=X z3qPS_riY{2^F@`#w!?r%3=W;;V1hGq-X2WE!&|4OpOUMenf+Lc=G>FnaLG7O@Qeva z=LA2h^CBw4nc2`hU=p&wm}rl8+pClwiFXV?lFzWoQrt@7TF`8>$vEZ$%+y;|kZrBn z&++L`Xu#FI0GXprYk7vW{P1IQ$vD|jMKuo}u=~hmspdpp#Ggkr;Ici5=aR>|y~;3A zBgv_rjyp(9(Z&d*G^xm3>fU+6SyCEVXm`aYtxzql+`hQ_IbXfTWJlsTcH=`SXJe-L ziHqIY&rvCBUSmdF1}uJ9auIKSHW?ynb~(yV`Xo*6cyiefY@Y0<@4SDJ*Ukc7(=Bcj@(&nV=a-?2v_)T$!g5S@I&VU^?GJbDmf zx;WjHo%M^bqf#1iwd?zr063&clUB|<5nigDOH)2QUos2sdOKI|D92-6R4PH9X;!CL zRj*Zn@{TKndM?{zq`dX));wp=yJ~ivj0$nQ1KkfLmi}+>HImcxQ4`E@8 zbvFtsoCQRF>5)x7EL@ip@Z6KCXpjn&jpPb)E1N${Zds%GITcpBGWt8remW8U*}itX z1GIdtFz#o*9owQUJ~6?*;gzPEu?rKpvQr0v)o?2mP^MoV(eey;cV05klQ%##ePwXG zrK+lL6?~WQEh<8lQc@$sr4K+x$$fmPk7(N_59V zb!H}7m0Dpm#gwuFKq3bdiDyvF!G73E5`HN?7^*S{K~_b}xWXbMwN9IB@IvzI)-`w4 zb@k!rJu#W=l=zX+UB~=B`K1#Qp*)rm7i>4&0Tq3ZXxIGdD>Ia8zp0o(k7#pp2ljO$ z%j2xqYTj_Co$uFbihrOhjQ#FVa>MKyz4Mg z6&Q?4J&z4_y;u4Ah(=m#oVffxM|JuZ4DzV}8KU!C z+Bxw-Ldh~xhIHE*wHrJl9?=w_>-HS^{0GT*Dor=GtM*m?OOf^U1fz1D*OEq9jQw2a z+MRRP2YxE$Eml{V`V%9j$Sg(mN3=_cAnB5x3enhvM>HNHzrjo&|DV*=C5K$%4BgjL z$NcD*MxE2dC!_zu7IfTt5<(u)Qk71LR|=J+Lq`lSd(|py+$vtUz8 zkM$*~h~y7Lkb`8WuQP!^kAFV!P*zq9799UH1(n-X9&;V+4&z~)yh~+m#)!vtXV;($ zyTLjK#8P=uIUF@(Dr$eLqbDRV#yH+ETTD&Dq>EfbMXT7t{Et zSTrBe#^U+?;7fnaF1WJ3%4N20Y-Q}{vu(7GRqBK;+b8+7NtQaAXs?-sUseTva=7IMidPJMIn}0;}uoIoy9Zo87ZEVHA&17RY4xEj_aB~)aJ(Eun5Y{ymdey!DF^eVRCm}KAIl>C^aMb}6JI^Z7=`&zQU{?h1I zcc4pUQ0*g{Vr5WW+d9gA_?q=vGI0D}E!ha5g1BFgh2G@m#XO>=J-oV}9AIjFMC<$& zedwo>;J<{LUfZQLH9|fCLGD<=!?>A|yB}6cIPY}6g(K?MrrnWUbRxfjM&Zm7on387 zRrRm)|3{=VVJe#SP*vRy~EuMYKLZI!gJ;g4?B0NfHLOpyU zQ`G8#VaTrb9%W~HKxDCV zSe@Nu7l$xbRxrsMTh|pYlG>XH)y!K3v0C?O(E~qM z>lTKh_sJmr+surd$pL}t{W0o;cmPeJ9!A?lE3`wuze?)2QF=lQL$Q7~nJY>s`UXj)YytJnZ>2Z`I z&LR|mb6IVR3NyRHT5z+UOzk`tmEUA95>qr)S1oiURyRil=T{W@D;Do9_~g)-5NQ!@ zNA%^Ln3B?F!@<{BdVAk@7fuy-M>%>%0O%l0_epgXLZ8@@ZN^2#%`Yx7+tR4 z@hLs^Z!G%{4?dk_PPzMJdY&`$$9dJ>$=&-XzxP$-XZKY&F#ufc=hAUB4<~T$+$8!z z@b}bDe5!xT_T1AS@#_Vq#Jty}jp~0R`fg2HQ@ghuTaGNLR8UKs;{d}_UEIu7R1MF1 z3Lwqq5>%_HDGrUeiQW3#-xy!gEs<}^vOQq*Tl?3nM9~v2yieov!)h((1c++{_F4AF zU(5C922nA!x)s6=!1Pr+|%DbcL$J@^q~CZ&JOeRZ_A#7Wc1uRu)lQKzEYX2 z^;JL4H6ImI+Xl}DAQdI9?o$|Bet)BESpndjn(W~xX{8lc(L)U~K;?TuNJc}zaP+t`<*zIptY*w6!G9_71HY{dbV zxeZ@`qUiC$YccX%K2%eU@EqR3%JX{hUfYe*0Zb*0(Uxk#5oT;QM46mza^B z%svRA{I_bE&QEGmzgj~%sXf?L=%^3zT>CrVd7pZ+QxR$1Y9n0nJCpK~RK{;ht0+^G z-qj?S&5^2!x63gR-5#YNx|?f2(wAPmD| z)iwg^Gmu$NF9|cuWBX9vkZio;>Q2~(+w!HzD-N90JjA#zB#6b`)->HSoyg;l(TJ0$ zuG1ZkI>uFyiiE$Kh|C1roJSGTyK#`l$$W6Tp8g>!Wox9 zS&Y=X?(G4e#V~>NSYeX+wNcHwKTi0F}RCm zUWLRTK>~133(HSfWXxp@bk!LEBbDjs?_UxN51?PhW;m)>U1xIZk<;83zXB*TUh*<+ zhnL5A=JP|Iyi(ihWZKrkAi|Z)FNSX)R|GUCq*EAtymm;NAQ!a$&`D6ItLRhV! z8BEN$lo+CK*-L)wp<*+SX)U0KHzxR&Tl1@KIuUFw=c zx516Iu(ZSU=z#@+lmfUu9K$-$P!Zsh##v!Jt~MbV=$2eqX0s0wDeTdT=v3UrIFoSz zRyBeym91`ySz4mn@R+wWICm1naAV&bFzpJRB10A|-`&Tx)Re0F3L-A~m3P8vHA<}sQvJ!FR$S!PzkxKeornZ+Zl=20_>lBR!mgQ7UGRFvc9*&olftE= zV@loHgSnTHez8R+0K;b>9=sSirS@|!@<%k40fFtSq_24iT0|M zu$NN~_%h_k>EI);OL$fp(MSx+$oXnEy*r<*soHfQuf+ z1;VS)j*k1W08Ou62H4n7Y2ILYBIRIpt1EyKk0g9c*x=@>XCG=$n6s5(pRKkJ)`lOn zVVv~}e>i%cPeId08`ZUI;%aW7*a%TY2mwfXl4D>e7PMngtuM!sFWZ9Z9?@jmf@%X5 z+k$>h6l2LQ4Ws8W_1xG#tlJMmFi~^<#p_IW;3svP76^+TCiS7U+=>R@5Y%@>YW!j7 zMNHnS1o`(oqPdEz+V1i_qN$&_OCWRk{j%=~{IVTZznVdnStV}OgZ6hiqsQ{x_-(91 z!&PhYYET(oZXN3HjF(3dk|8QsN{G-PCC$dXt7H}e5JCb3k~pG^@+Q%oFwhgOJ7W$i zUziXO%c0kwV42S|7F1}J5g()n%tvK({b^};6yrcuPNEB>0I#TE`nM&n=Qwvs_z*cQ z!D?9+&k`SAi6(^@R9e=k_KN6B6K`5vX2lH+V0_Jl6w!Nh0*=OTkUNurQY7qHKtN+# z7K?dsrZT-9ne|z+WSRXG;pn7!lXh+${v>0JPT>4ocWtP-+<7B>J3rV}rkd~$;Gy#G zVSnHmajgwhlO9%cUb$+Q3@i1y0Z$8!-(=$FY}lHbFaD(D{2~nuRc>|83zq`(&bTo_ zzkQ3HuvgSrm;I)|W;9^0Qv!qNl))W_@hYUKWR-VSBOx4(Cgr%%BV9)LJZwq1^Y z5vy%Mp;x<{`(5h62#Ls$)*U&?oM6#c$ICBfpXs4-NofXCD$d zW2py(W4$w>Z*iZ3K$Zb@+IU5AP~&o~;tlpocHydR!bV&WJs8{0Q9>%D4My|+5ayvT66oSf52|Bu zO>)mf9S-*8ol~-_>_oqKcW4d1E}kBrSn=-6eE`C+Dz=^kZ)EKR!F5ao$MeeH`n zK6G6&&r3a&CM#IQ2@7~Nxbufwa~2%hw(WG2#WBoW*d!P$(O5ZM!w%vUsG6XNF4&?o zZZz3VbSgP#$e@xn$YPx2rREJ-TjK5Oe^?E^=1bl%nPHn|cg`992RM|^?iudY#>VKb zmj0_ze!|^5MKGO{UX$#>w3#EjtzpVS$*kMCt>1XfcmibPu7glJ)+}b5g>QeqZs8h) zjJHtzGZ8h@?p(dS8X&oFE;4Xv3)NxU(o2y&)<4>h5J=SLvy>XA#|VRL?+#G z6a4kx7zOj{woCH8ITm7G_UJ4UlMA*~-n)_m;*yqJ*pjAo>H&BK8Dt*l^oaJ@iN^Bo zAGBxB{(1i5*|TTQ|M>?E4ecK^TxzaQ@6?SyI0q%zH{PD~Ge%|mu67SBJ z9??SG35{1MMk$K{b3_B~?vbGCv(t!ebAi;kL*`2cgMZT}t}x4cf>sHb2>PM57W(~` zBaOR@fl3?Jwdcp+(Xy zMsiqyKZ#7`D0)P@VpRXvBW?+!)%6wkS9aogSB$s6`(h%~wOaO4b)(*{ubqCXX>d$j zZu5GUPiWvW;4Sung^ zrm`D7q6N95<5;^!b8+7@-~Y05N_#M+Yry(si7VulO7Fft9)Yg0Hf_Sg<1ZZZ+5|@| z@eI@9MtR(@j5}#SW{j@O#_w(JjYqU$VUzEh zbY%Tv-`7dp2bO;DRHq1e&|bbqmHab1QjctKio2CD9~oV<=JeG#idbemo#Rhg5FD3pIn>LpeXa!-kr>D8A`t^3WBuwNpw zvU@(TsC@2G-PE?U#^Tba6TE$@nB}) z_gmw(>|;TVTcDF!?DHm*&gZ`*TuQQtPf77}H!?rQ3VuNf$9gCzju3kEypQJrDXr{S z2!pAKaX-Ce*qdcGtQg%jrIIv`sr+cnS>VesYwnaDyb;s&n$+pb@2?yWmU7KB??3pW z?6iioCAgl;rRgYtwc9`sVcpsUGt0h^{V-R{w9zn3>V6n7{)k4w>E!RR3}vFrK{@|r=cV{q8}`-o5D7Si`K!N(QryYBK4sB zO!x~L29D}ht#ii@-8yA=^pZBto$0r3Vmj9uTw{>3X1@S91IBl6=<)N^w*?n*XtP=e zFI4B-G**%6h?wO;T&aOcChoNz-*~RWA|JeN4!Kc(SKQDJ`k^#3o>x}#ldlw66`Y6V|ZjQ-~1Wydz{dsRyiu57{h{VeySQLHHOACd2y21zFG9q4aA zVW(PHlgQB}L#@7C%)@^MKmV5&{onTk^2p`OxkWswCdF0-Y?D>z*XKm9O<=(+AHr2E zYGfVxcblcVh&YPx1zyO;cD;J`t}*PZ=et`7F}iKs2%QVqy;K!oz%Cs zTkqP7y+Zy~kA7GsW5sJpz8e^80?t;AH5!^UW@H27<(%EhxGeKzMugu-KX9N^nW=x; zdRKv2?Losn#q=`QE29ywuU_af*bX~Q5WVOjNxZSeBP@KD=CzLh04R=d^Z6@siL~9) zpos6tzewQ}xQ^li&Rau%IoFo$zkT`Rk|vxW+=ihcM!&pZgg}CsBKzQN6<8GiTXH-r zo^S|EeM}X1J4`Ds+ediUbz388fl7)55j|=;c2D*0!x~emV`l@l^6?kd(U4{a{|$n7 zgBQtX@8_>0rA2ZN2-0yo(Xh%SlrxzBX<$=_7uCAiSsYcyd??j zvr^*K8g(F;tG-iY)~`P%|4MfDjhF2oH}yO$6;^2(!sp;HybsB)uAjy>3(awRB7V3> zoVjE*dPa{Xn^H;bG>}*eob$LU#S}WEl`aV^s*_elPRX+I2p&Z)GvW7mnJ-fOicZIrB<0omNBVA>c%84C zJ-ckLgX0L9tcsh7BSVyA(_a4LM4|W*zI&IX`kVo^`$g8o#K%`P+<*egR6`{hJxYR% zFWgawAKpfN=#^O-QXVg(xc#L6W$}&OJM<%uIJWI{oZ{NN^xRh9r$n~)2uBw+p zB{(N^LtZR&7ImZQKBaPuJXMq&Ve+fm{21seZ35>y$z@R3Cv4v>sfg59T>mn)^h?&f zyFh%jY!Y(vQxaEt$Dl~z&HnB+XWEx9#Dqw#GoN=0tS#>(-^VHS0JQ)nCedOtBWL~s zlXv~mDPP(X9NB4Y(0K4ey`9nj)rEbd7u0+|D)WAvh0QxT)6O%%Tu4R;zjpRF52a1! zknb<8pF+VGf{$k@WS6JkW8iE0CmdnsW(B`U+s7<~m-n;|nw=TmEr2u3CcI^4fcTd2K z$IV%~9!|VTDrMVdK~Yj9`FvV?q>itOoqeMDtg|e+T#h*7DuxFq?RWQBYFJeSt*Wzh zOX4dsz!7*;Br-0xuXY+>yZz6oRBP1MlR+XeKJz|H8XBu*vO4`1rv&qQC&MVou1}YQ zi{FBtWtdE~#vA5Cb#D_S^Rue_<$(=0RIp{TRu9lUkKoTnt zFhjvcCTP#yuOV?ovOrf2%;IN5N$O__!9xA6S@&jKe*!YMA!`f@+AscXHflzH^OKNT z8-$_$h}Ksz%Ji@8DH&W=Uj{jC&4bs@yLIq3sFYTBCS{*Q+G+4(%zT{#2Cr)H*Ox}0 zo+Rj#SU{$}1UIyiywEy)n_tFVQW4-l4+_%YWoMq~X^3s6#Wa@5&-@Uxzilyq3;$*M zxpsEne^T%2_`R;n8ditv=PXx_G1{*a&H7m_HeB(tjY~!A)wMaMpI6`6d?%o^d13pJ zhY+`RIOFi2#P;pufhw~7cV8~Y(`^haUIPjGvHG)I(c!DFIPui^$b~|%t9Z=5x=5c= zP;=zrT(P9Gv+DXkkKi=#fkxV|c6*p0-(N5ne(do)$p}@zix7>NB0)AmR_SnF_%*S=z_ z5`&<%^ypInj~7*g$_Z=OeWdpzT5ZEtNgqGsYrYpk)Z4=B*(4`7i?dwuS0CFpEkmIw znM&?eWe#T|Yi5n13ePIGIb!~+@L%mfPm6+|^is2AV1kNg%Tdi8HYpH7qHsP!85V%2#vu9C;<7o4R1)4NfdRmerI+Zm=9qT|Oh*8%b!gZ?Q6*cYtr1!w)U zVEBOv@8sIyS$z7(M&*y$3%bmyffwhV{ImqIdA!spLcZV^t4vkzsU!^}y1905oQZk{ zv^LUO)|%lPV#_ndjTEI~Y2|1?zr5*`T}}xw<|Gy16TtnNAfEPYLRviw%t`+5+<~U9 zQ3T(67`5X&!mN48mz!M4zhAuLG{$+DWYuZGHhA{|m>zuK`~BBd>Z-m%NY87M9GYjY z8L2bruq7!zNAVIF{8qm2$dAP4wZEcI@cmbWC5|ILQr~9m_ok?) z`!(jaoIh>lCo8EDIRk*zAe2L!KgM6Jfbn58Gkf_q^f%`z@eZc{a#?>dIERLecVa?m z*mgMb=jhuiNVj5oHv)2$cese5R}+N)Rash}@cEmKS?+nn5KS;fM}e~5Yx;)d-Y<`6 z2YU1QOkyvnAJL|}qKTM(54~O}fwEsgHYh&6F}#hGs*@wS7^u-wkqci5%NhOZ+tYyd z56{6dM_pqH!8CD#(Q*cN@t&@^mV(~rPLocVYRF*Lysv453l1o z!T!^iJhb$NL$nn9v%VjXeiG-5Th^k9bj=IT^}6oA+&o-*@rYLTJdA^pOAdzw7SYg> zoI2vl86He2RpPoWt=d|)@dpvFJ>jyp)%H${Cq0Xh$2uw$Z4Y_;GKn}X)<7_&{5?tO z_q_J+jCjR+#X9bfXs*wrQBa0H_k`>KO+d20Zb`C;*OR{Oq1rhkS~SV+yqBEF##xIX zkxwf1@5E`)lTRn9Uk9FZnRF3pcFAMp33ZUuOL1nkshUUrj)-ze9Ag3=bJ(!~yo;e; zq5srrxu@k#4mZ(P%f_5^r4h^W`%3z3wnd9keOvJ?;JXz`-tWYVzHinL~Ede zX=90YV)uCk8M*5s)XCE&zf+^U8Is~TFuzsyGx|Ye^5~O;zWie);YxWI!TTmxwoh{VMJHt<=FA7RyR|4Hk^T zxtt&-yCWI&X!F+N??;;(^B);M9y9%ep3fa^ei`Ggo-6RrMUwBPy(<&3|MZt;DcV_< z0Ob2~zTmR`uixMk*U2pKUnw&=G&aA!?`J}Sdhg`^{UG2P+YZ(ZF`xLu!554hC0LJR zq$bZ59q_Uzw~4vO}Dz0PoOHOP)}t=-TIvz4 zD4JNK3-NJFom1FCzWzqBOE$aD@+d{{m?cfq(6y~Zb>}sffv z@p`i5k7ydJ>*IQUNZn0(g2lCl*P}&A`}@p3Y4o_41amRt6wF7?Xe!nr)hs%_dlp}8 zW4bZ9o07}N*;!~TS>w4@`@7}iG`>+ENTZV;VnrchzQnu85P$5*dqf-Riek?;xrhUq zcRr^swqbjoaLQiv!9VVc4oLrlmd*C*0BNjDRu9vhoM|(U;`b>>&Mg)mCauA%h)U4) zzsh8l4WrMs?z+{F?xn9awh7wP*RdatMpe5$y)P9>@4p5h-$TpFtRa{*)i%#cGY<14-=#iHzME-PUMM5NVDHeS3S=Y5 zQJMgZk2K4o&r1RI$pPrA#-f%gNk|e}ykE<6xLr4#vzVs?7 zE1t0Q0tF>Bl-4VF&fB~(_ztkd`z5pF?MoFgL1OH`91JPr61sRJZL*vRs38uYpVIjL zzG(GX@c-lJI{exEzHp4#BX;anYD;W2YE!FX?-jAPT19J%O>4wxYt-I5h#j zRH|B36;-sqet-YK`?>FVpL?I@IrqHhJpZl=WJ=e%?~VX0XPI&)=seTLl|fc~Mtih!OJ6MO6{kGe8fADZP zLnzteA(DG*VTCk^CS>{KVSGYSn_6wea=MQUF!!qAwOv!Vg~AliqLT0d=*QqGK&;`1 zETheU^4rHpAaSB-6In_h!{u^KZ!3*eF~{(doVXyqc(F8Ty~~Mga(IH}T00~r zAx;TNPl?e^dM#(>ew=-M1UC~sB=O(yW!=X*wL-(cSNBNWmiev9=N_c=6BB*}os{?7 zyj^hyp056iu5lbj9P_;0+Jje$z#qn2A;|VL2euKUU_I<0!9%08T-ejP>+Xf5uIc?K zQT95vHN`LYQDW?m2+iyvPi)C7!m)tYHuTR>VBZ7E-e0c2qJ?L-D7T_AeQ}yS;?sJf zHdF(nvq@y2IJQ5YYF5Z<3f*#EBs7@ln?7@|c#kj98^K6_OWVZujV_?n<6ap$)%oL4 z^R+@0i^m&hwr;>qQdVW~5qw@@5NEp~_!?VvUx9PpT)5@ves8yZNv)IZg0S zn_q$V!<+@~HG6UrQN7zDDebh*DibOTOh+`U8l|n+LVoqTS@KTb7%$dft~A6&ZBL|y zy&@P2t$4BRZ@-jkxvbJnwxJZp`gKhoo8ir0eL`|pMJ5EJS2-7}=oS+))4dS0cC%hs zO&>`mXJPM(e{rB;e|#o z@KD}M`OPu`y8rXxkarAntlx1QQ*M+^Njj1nbtu|NRpp&(pd!`~@2&Xp1(NmcX{t!K z4Gk@in`=lzQKS4lX;@#kh6=Xk)xl6@+>|5jU@^yFx!)3JBrjGa24dVDv<37bKm$UM zYR_^BoSa!Ncg|A~GP@NJH_G70zic~nxt-lcYk~2UHkLmIQhWqbRv+TDo4J(GY9;3K z-kJcKv8cXa`p~h&p_;p(<=dbS6yj>vhS|&!3=&D1(@_-pH#X45@GW9mYcRF4o@_@r zxVts&Y@t{jS6g4zPiv*d0= z-H{a0ak_oP;E5e!3eJ=_sxL=0U8{2c4Enm54*m;>_i=Qt z!+1Juk%AH|PmNzy*4lcve$wbMD=j6alKc#>U%4yaU=MABX!Tyt+If$LeMDyJ{DCC| z{8^E0v=Id(D7f)9dpzrTEF<2h zamJl+k(L@?_~y5JO}ihV!at`<>f4ja2Rn4tl-eO41=BUiXC|w&*Notw57p}o*^ec- z=C*6e949R#i@Lzs@9d9hyabJA;OL(AZCtZwl5c4tmlwr^OEP?a-pn3-cp;099Y0r(sV7Ui= zoDd}^tYiiDsY=hxa-vw(PgNP9xz1Aqsp7;?|Ci*sB>A84K&g=}kL$t;rf%xc{ z9C;8CJHAUr-pLW)YiSm1^l^)tK|Q*m`}O6+b~sP9bDV}CvqkymKh#+d|Lqbf;!{b3 zzJC2X$+kE-TRwa#)e@5}(tY=aiFJYvnQFg;dDY<5G>7MUGCM(=KQr^ISI|{{wfw<6 z6^-={b6J>|w`CoD6m`3IlaM6Z_*qTjxv=YtlI=vRri|v=tFh$0^Y}M3nxJK5xu?^^ zB_;lMj5{R%j?&P-fYC`TUc$EOz~BS3N-_;}_#KNwV2dDwr2k%1Q)<1g->_kNR6=$g zJ?8VkL`sxe1q5RLY$rajy2o$;^0}Yj03cq6Z+Ugw;@{k|44hmAr4$y@4*p7S{qjJG zexpzOpQU6_SP>C$$0ljVD%F3D9{n{7xJ~v5UM1bjXDbkesE*YxhuS#*K#Rv@W*{># zPvaRe+|_YnzU9Imk4goXKJ(mIKLk%f&ypgQHkvgW@~u0N<5IIl+K+bkZDNwvg0{Fg zn^k32oux?+=@b4zE_d?t!S9F4q;q9!I z*OLZl<#aN#d0(|{u>?=}yUv))lJ-RVJ$b;ZEV@@>=2n}Y+rF*jVac7KMYpv8g4O2^ zwvKIq^MuY11r>h*_C+4DHhBBd9jKJl$Cqwixd+0-9H~Vfny9~k{(G@ON4^20n&e#& z%FEES0dYNta9Ws&#^q;RO%-7D~o7TVh3oqJhL9ByW@2ecXic**gay22AIJ4@tcBJ(k-#xR2u zs~|T5SzzFv<_NsP4ulS7iOgbq#I1;d6oBy*sp?hNRVxCc5mdsy2K@=yd7(SwH}iQ5 zrkm#FNn*9$BqgHxkB`AdU;axUE{0?>18W+b=FP1IHl^DBV6@nh%*6&p;ijHZkORJay?yg+Rm z@jD&eQnrfAJpeZtS;@>x>(P%z z#GWPbWW%5(7DkV%48V6OdQXEk{3lul3ne?H-S>1T7=lZkt_T9SN{drY!;D65o+6p; zYT2ym#a!(-*Yy7)2L3H2sgj-2A1+z@Iayev^(18=xo^w7@Kn+XKPlVMKZwR}-a@ifcpFy(*g7D!3~;?p>@sm!&LNt0%rD|?`0@{;Sq^CVH} z&uiQAnIppjM6kFzBD6iIH%vOQ%V_z>gw^hcUn#hhw!&j+9GJEz5 zIK}%g4)iP`_9Fa6zY4h5xCzT8jMfNOk_$0j!4q})FYN4=wPVed*P0~``aRSLs-~)6 zQ#E_pYA-9s3mrb8_hKDme2EFkld7|S0Tkt0!n;%6`x0rjbTvHx2q!-a4*m(>ml2IF z*gcbMI!6X%CTC1RAnz zAeckOAWog)ILvO@tx4jc@nJmSBU0%O58THGZ*eTFh-HbkFcYdNi#7HV&v?E=V{1x( z0x+k6bItz+=$I0pgm5;~&aB%~=-H9K#NWB|AlT!%{eW$ zaeK?i)V&5`#9oI(&`!dVTuaUo!6MCDwtcp6t>BB#1Urq$x^A;u!^Cs|^9G!QP)58v zE=g31BAvxit;)-Rz)vMUTmyqTMiy9_Z9Zmv@~!6$c%b6k}$uaAduEqAQ#t(2o%`4T#!lSjuY({uS> z>GEqV#9k)Wv_*B-;YcdsIlgigG|i_R1zTDm+##a8zh!i8KCu$88ZsU8FQY`&q$tX@(m!4>MT{#I0_$?^aSpAehP9N1o=9&aT z17FnA%7#^^-J>|`pG4mn{HHw5?CkuEUc9`n)cRI3W7E{6V&vqCVUQYHrFHv!tLNg` z2cucC9YZ@<61d=kua4@_E(K&3bt>NIJo1ty-y&`={8((SFhFf^Owv&e-~6oN@-wWC zGhRyO$ul`}ZhW(C(?8l7W9={407ILS-8OXI$@5d)CkT?xW)UoVR_;P2pSj)!D{##c zmuebrx~mqr`%!3d-#1#!ib5Tngw*`_Rp`KmUUgvX!ZLGkN}vuU+EDc?bKeUV1_?mn zQC`{kE`>YEM7DE&gj?$Gmud!;GE3-CfJSg!t?OJaF*WIDP^FtAG*o|ijq$$C0}8MQtCS&UunI2e<)m9y*t3u*dR*b}y6eH3ae)D}uu z6LWp9m73AULfY2L>Ij2w5^qoOE=a(949LUk@{|i!I*>?|vsO=MdXfuLQi0ok z{)k#hq9H;$&)p#hCG*oeEF0>tnb8_s+QB*wMUwj{fhXd{Sva`@2t{uArI4-vN_9<6 zvNVsIBVRQ(kXw3QsP+a~=qV*UK1)hcAQkH(bDZ6u^A?3vutHqvB6HYc^)iWblvS@=VRpZ^8!j(ROuU+J^4LusAE7g0z{aA_(zXo-y~ zdv8l&2)|dk3#uxX#<~t%J*qY<`mQHxiZN{WL9NK+>fh!Drx=a5-6E;#jJ9|p8)4OV znJTJVmn>NR0$Y2h8sr=tyCfd!|JvSwLR(i-tDqj8Ip@%CW%3cyWjZ*^Zxedyi%;Ev zfYnFQC*z8-WzPj+u;7xHbY+hJ*XIhp`kup|jDo$E=<8 zfHiIKcV@rg0Tn4(RR^FgOXEQDJvL%R+d#%LLyR^vg!TtD0>o@~nf|SsT6{C`@ZQc&tM_8D0{m*ER;N? zSYmZefZBuKXiSmP_Ii=z{;;?oCoq37|Las`(9 zQZ<_#LPq`d4x6_rIp@D(i5L%++(JmZ6yT`CM+@GGDfFT8Adx*OrTAfbnL<}*vMx~; zEOktXhTA}^C+m?w2z7Cc$j)sFmSB_b&;2B0^YzAuF>j9yqU&^MV>ofq~i_tG7`9g83jO!uySm? zOua_Oju$-EYD(Qx@lAn$#A`Ucu}}AA*=$E zk8G#58OVeVTqO+}4)IMh73YFp*Z!Qb*8T|cU4wEEZD=^b%t~nq_B?UJdt^uG?=zAQ zFAJvik$8zoBC1R_42ZQjFW}`QGgy0NGE=m`l^~5HK&4s)%(g0pl+io&K?Ee}$4~$pC%*=l&-GY|h`3Wt zL~w)MLKqVfOmb3RK}8j7BCdW?C^f^sM)<;F`0`wJ3K+w-2Bc3~^T*)iWuOy@z1%t}|L3WD<(9*UR~e)#ryw5?%ngHT?^XCD$+tIt4UhXPGDH^kpqJug-1Y)Wj#sjJ_IvMt&*DU+gG;?XcAL3ME5k!aoBjf9Ll;eqgf#7i zM%x%mr>ZF5f+1&Z7Mqf#;@z{foeLRB%Gs*)P%@OGjj2*St?ul>JaiXVsaxc=W@qzF zCO+evN0k|g%84{k&-tYKr+DI9)*mTJJ-55*q` z1HRdQD$3;mfRtz@gf)BZeG$gTgURHoEyfBNrH)(WKfAzO02ImSKqHz7YH zqcc@^v2Lc+muV59PA5!vuv!_TCdYUd8j;|J-_JfvfIO;)rit}+Jz7J?uQjS+1+TiF z3l%mn87cANtw{n!66oTpBvJ9J{)U7$erA#f%KiBP*^e2oL8;()8+w-OX&F|PKn1Q& zqhBoblSY#IuV(}fU<-V%{}u1q-G`|QD>D2ASdODUa?JuG5gfC2!;7Sf#=z=14YdT> zH7BjjkBOoi&|@|W;ciQeSW}8Q)d=>bY!17YBPS_Y$72y{K>aYzy~`5ZtOI*0xel4x z>CA=1sj0q{p9`itAlA6(V2uf(;Q;=MUzaH!pQQ!{PU8o%1;iFkjKd>uSfsfr86LcR z#g;i;q&x$v{W6#tPLY#08jm%eOjDG$6)ENBctE3dON~>u{PPz*Xs$JM|E$FiMby4< z5?7_QLQJbqa0Khin<+Dh=o9#-eQ;6QP zC4Py`X|#`6F;heU%9@>p{Qb>r+cgo3vsrt?Lyg0TX8xFaE^Le>WqhnSjkaiaf$%lU ze#{1IQ(=kEDUjnr$1pt-Xj0MsHTcV0hOa*|Lw+-5*`7JK={Gd!fP_s?m~$&%MB$M) z{D>gZfuw5CTRRal{q9!suI?H#T81dai#5)SIf!4}-dFh;h;PM~otyD1rz?%nT^omt z`WhwGX+KKF)Cuj?V}?gNr#J@J;^7dEr;n72xHcn-9X`Imb2OWMFvbNo(liY$>0NvZ zgXkgYKj26jBEDwij`GBQpUO=53y4m*uPz{8`bWs~+m|gZI`kdGDN!oPu_}2-2QEj_ zKv6LObOVh6gQ6aDS&5L!<>Z z6woX1!u7n6Fk_n_317`9yX&!8#Xcf`$kZWAqKLSeFj`Zuw)bqphUtW{Y|4H}BV=7` zYXl6A=w9aebyqGu=y|7Y6noBRd7x@E{FC6%??flB$cLE+;kMHn?hFp8-the++g}#S z8FL?7?KSy}~>6F$stcoKbnpv)v=mgDBUh zcgpCOY6@;06RCWa`5K9Qz!#W65QE5N+LchNTqKTG$L$?@kDxWJJAjx7?Pp77A;EJ%xG zv|`fxlDaF*+ntajxcorkJ;qa}*`4O@gMcO_*=B+*cgdUR!mAlr$>mFS zs>b-dH6_Z1(x#QkuCCAGC|N-nOJKMa6h7=I~gi znUA=OBOr(C-MtIW_IAE2y)4Y1ZJS%jtquw1cR4@4EM}^VHiAjGkHm^5&=Jh7_q+W? zGa%;7tQE=WT8ztJ0sQ%?jt7lQ=h8PDRn{!(C}2Idw7u}L2s{(DZll{G)Ib*JF_7=!ku9q zue6?3qZscFb13o294cR9Nt^59G&-nqz{4w_={b>u&i3qD!Z1YTN!?kX7mfDwa>Gqf|i>%AUf`UHU ztCO~vyJ*WXqWG=tH{GD^vS$|6OM71zv*647zomd*8GF*5($j3H4L5xGt@@2D8(?iR zKS0}xb=`1lS1T#IC;d4EEygy{?gbr8K+9RjNhhUZNe7J17LVHYyH9b3ixOdxT<_Bd zieDWQ)tO-XX|WtQAK7r?K~6_6BB}IG$4atn0T)=J{?vJg@h0 z?mDCPMft)l>+qhSqt-yza``~eF{3E>geh|;{4n#cCrN< znTE3cDp;9n2@2}ghFgCP!Zbtr@HO6)E|8fyUTk|enVcoy8*}g}rT7~rDHWq>zC+0b zOP$()@TUa)!pukSO@rqGT$bi?!=%zba9xF`Ivo+;W@!p?c0>T@OZPl&ij`CMW7=VO zvk0YdDZ^r}2|%Aso4@grm)@^ps(vqF7bxu(p?Q?KhX-1LZm`?9Sb?(1mzMM=h7ZQu zg`{z5K47?D_uKFVx)nsXC$J=)YmZIzCwK%N`~`$X@3M$9USnM!5h`%H-H{w=y|Q#7 z&4%>x=!K|$1HJzK+wC@Qy{n%bmuG1k!%2R-ec8DSq5?m9t))!z2+ZT~2x0TN!b)7* zk&g*FSPair)2sifDqF0#N&la?{26C=2T7*aUx13YIkHwqumM zAEl75?Jwi`-VR04)1|nkAUu783zgpjO(~_BcW!`Gk5F20Gw?R5Gj*x$KzZ8x!#gD7 z+hb$OC?K|()FHFp$igf7VM+ffhoh!Vj*#NL62~+ZY=C@XMu}L7qL^?P>v|(P)!6zn z)eJ|KGuI(5M>`7AMcL|y98ItEPU>~Cor<~29e675NO8faQk2JY#5v|m1K;mu*eW+U zH83m3-ANirf6>pC`&mjLMz4dCcgBN0N~1rKUZXLU?hadxdh?H;p3tAr+?o>rfMttf z_g1BSf`M!IG#G0V!XV_Cb9-i0M2u<5 zh7Aw~9WCGL_)2Y2OnvzafKA4_Q)I8ddeYj-<^`9@ep=`SVn2zgPoVic!ayURJu1=W zKCh}NV^&AD=cjBQmD$vlcfxbf*$EW~1LDp698%x&5%BNa_u^h`bhoTiQquy*E|~qK zd#sGY>zG%w#Bs7c>J1>+Yrz0cFG=c5Raf%S|ZrS*Nf+RrX%G^%2#Gbgl$8w~MV2vLB;-^iO zV!3z5Ef&w};_hhPg`PJI9mj0`*^QJ*jKBg{f*=LTX1aO7`8({B2C z-9@cHvOT2E9B$}U(gw(_upZ}5+$zD8^{!bZD0tj#Yk<5u1{h)kf*v)nf zu$mzTkb)&w^hARCfh>_jScYD4r#^I%6J97~(j!MajDq53RG95|R`(Kn&G6@(Q^8pn zm8%jTv-edZLwb>>CBWt;S_~_wl5qp~+bWBG^FcDb1ed=t4q^dNDho1i4tj-eQc33z z=&8x5xC6ha(=+&ohGYIaDH3-w?qmU*eDHs`YR z2pF=l=NNIbt4sEc=d!3&^`_YCH8E7$r6sNBX zJ(K0b0}(CAPvya{9a#_6z`yTlx%lh4PTA9b+WZS(>Om)zls1)RNm13%kffzM&E*mK zO$Q+@AobN)61Qn&k%F&EjC7y;7J|jF7^pl3;4`=OgfiF<2r`jn=Lcj|+*k%W^n7NH zN-Z-qKTol9bDECcC{E*r2{$SMkFK=|1@B|F6V2N-XdJNAfM5q~M?sj#t5FLhJYcf; zW)N?|!TJ}#K!R}Gy^V@5Fa1o@GG^HmwR{3v8GB&!qQv*~b2n90Cj-=(-RS-s>{~AH ziv<4)xD{2roA=E{R(tE7<8NpKB~rEpbws&8Bb zJB8+18!fLRH6bpw3Z09>qL|L!miyse77Un;{=H&phHWLu1oIApSMQW4K6LEdkf!vy zGT3Ozl_oyXx6q*|NJRJtG3L#qN1te{;$vqfPgr7-B~{$7C%pltEC(d)pyOkvCLKFe zv8~%X;L_Zk`({}d1*>PTrl3F7t8z4##sXy}R7#}QrZFtoG?Mg~@XKTfw+I5D4L)9TjUF{BzOU3H#FDeK?R8r|ef1gpQjS-_0IzHb(| z3KIB;6r47?d`-h8H^kl3*SCZ=jGG;(l}pk-Vz?<|g}-*AHD|xDMaKQPTcT-cKjTh1 z^opZexlsJ2(jQe5C!4~szW`&72stm_RZhol`x(ktt6Snii)%H>wPW*8m3TtxZgYn> zl?9%(e}HVzvD@kemez3U>?w{rua66=Fz=KwQ1Xfh-oDZ*B5+a-RqSHmh|a2LBq$m) z*`TUEM@dNq;!W@!Y-~a6%mNeXGf>VS{m&`v0z6wOY^ee(DC`E1V!M#)$^2Hv96@+D zP%i+kRD^sX%xP=mBta*2L}sDrb_5ws+duJy!>h$x19P6UZ%% z3tnBIgr*`38Vvc*m}uTg40rsO%WJEupv)Xq!$T}<*nc7MRmosE+GwO|hY{mbjH}9u zpq`V-fLhJ?mqV`oCEL@F-Ar)lvYe|27S|Js^V`SqM)<1UD+X%cT*jiXHb}ZwR*TcM zCgl-_C*S0t{F+!%%!*q;;XGS76`A4XuTu)C&0{t*Gvl+UuFI@+xXDZ=b>HR)1KWy% zB1@Wj5T?U%+2*n0mZPM~OH!tOf14*#YjHokx*vHFS@MKH8mHc) z?J+XY=GtPW0Uo z3DyU0euEfe)W(rIKP`*pU%&=)PdH@G1=Dix(^M;fnOxoVYjtT3j5z0ntPc$=d%63& zK&o%rCnFQH+vlA{+Ks`Qa;U6Z2&3>bj||4UmB|J*C>DOZd9Z%;!i6f(ajRToe=2Zq zeH(1NqvNv$O|TbFyU}|qIk8qHVv+4D$0Qdp-K&)P)O0jXqfhdqOmgbN>2oT0urmSA}P$xxq6Os|+nP*{l5cmvPr z&m!J>Z45g;GoM!bjO+3g_SL=YH_3nWI;yvDRnVJ`zdbtVm7*s|qyiy#D9`>zQ2yT2 zE!$brPBsYBz44HPEO3X3*Inlqb?>M;vaXP6!?W_ z(R&^phFX3^FKb9Yh!eR?N*c0!+1jQqTxvIe#Mm(nvh}soVoNtN;tLTPuqMDr4t82u zIi(BJ8P~On5~P)YCgc%}nyu1LM@sx7Y8@BpeTpa(ex;CT=M#v&8LQvU!W^FvXPJ?R z_!9PCyS{&ep*8OI@LOjrCUTn&6_xriw)j+gysVs7v$tFpt=%ux(va1Mq9NPiw)1GY zYB{63h_Z4tg@>aJoEeL)U`5WVy3bY#4pUTx$X4zcO(1VnLd{G~FTO^0i#h-gTrf<- zr}DEYN=rl|%Y%+-M*T-(ogTT37rs2*iaH5)8Dcc4LS}67hKNL!3A+1|O?TIan?XJ# z_|^FO?CZe)u~6my^uo`FiNMdWId{yQ693zz3FVaU8q{D}ygw}$V;!%VU1b=d#q|xjB{4X5G)ojB!m8zC?&XT%grkml@vKf<~P^Yn2MsZ+uMs zU%P?yd{!C!{4O53SxR4EB^Mk%KMoztBH7Fmfjv;Vo|ITvoxAOQXxG^b7$JZ3wy-NV zDkV4~rJ|lCJNGW*h)vnynrvuesjA7|w^S*qCZQW0mf?^!%So+A@CRgNPO$m|p-@&W z+MH9;gs7;jE=#^XoWH}Ji7IESYYm4pz*1PR>kjzU_QVTRsMS7yk+tycW1%V{y*sWSp z25=lDkNGJ)2Rkl=nGPjgqQmAsJlbt^h|atfW0;HcRblXy*f0@{%YQ%bM3pd-ZYHMIEIMg6RV)W_ci zzPq7I*W=(ygSW{d>&dFKGx9cmRt^O%wiAYz{YXYa?uD5*L&a&DET9E-q~jNuR-923 zZ}#ffgsg98^7{h;R9LG(kAyV>KQ1>aEKTZ~ku^hx^Wtz8Dx=PawHKcN`k;baHK$A* zxkUn*<{Nl`gPo8+xgv(Nz~+LDN|uF5(TvALuSYGbF&H?Rl7VJUNUfz(#;x&byk>+^ z6;-)aW_rlcp!qeF3HCMFG4aPqcv`fDT{c5r@?G8VL z4Hn$xI_-R|vY9tQHA}XZkymOAD8IvdkK#A$xAnLGoeyo0jdmB%QqHfe_MYtXM2|P9 z^*)TrP8Vp(@*=SyV`YFS;aFVcv~zoz>>t=^Ad_ofZ;`PNW&{||GHzf6W`yK9J-%xI zVK35$siRSXZj!1KBJw@iDQpf^;^IKO^`E&V78RM20)VlNC=t6+pbAkI{6&AmwVJwtEaNIWE$qTf) zRl7z7bBqnn%HG-s&8GGI_hlkqyHcXY36buHkAeJ!dMe|yP)Cg8%jV{)QHFlEI&6%( zpx%Ro#yQ;2LxqhopP*>C|3NO8ISk6+|?~uv0saUrmtLKf6W(|Vz z%dw>OF{Jk{WBhkb?LUoB?P3zxiZfN@A%`pN+D-_czLD)3o=O0=dC9wR9`6~igoGU;IaX1p zB*ni9tm2X>uRGfTJRi_ShjF_PtM8($86I%WQN4z=KFx(b5OeXm8(P;Dz&X5_-wabs0oM{kx5xpZO?(sVYn6;OoP9mO;pQ67*qk*{_tsZPug^7+DC0z?@x}}^KjqMHz7WycezW`$vl{pe$2N5y1v@lSDvCdYfGoP<( zXKM}k7Ks>SE4ra_efk#5H{O!_eD|@P+4de2?%r)kwg{_P#;L46+r{nFiPvRG5o)K@ zf>fY_>;nkn5j`gLT?STUbF@n6mZg6Bhp#?z$$|?Z%BCT612{PNEY82P>G|7l5Ik_$ z;N>Z*NJ-lK$u5K66WSgLd9eyRp#gM-%B&Cxjs?~p4sR&X%U~TxiI-BJDzmmB1(l=} zJLc!#_F*`38EvR3i623J+m5RCU35SrPioisoI)cyiCO)`rs2cQ6&JJ(nkBIr)mz%c(S zw^bIpPmCKAFYzRuE|jj#N3cio7LQ9}=b!@TH~ejmvttn{vJTb1GN7)sDYWv)w~)GT zg7UtFC}y?K4|b&2?&1vB{HI^wNUx1H0H_jRN$kw0Gu1l=`qc(~3vrZLa9#(VjG6V& zLdvziddVbC)u(nvcMvWR$#i)UnHIO98Q~oFqf-gGDq$=8G~nmpebN(!#lfN`9?5LV zCkS^dt~6kuN=jz_u*Sp@^M}EW}x& z4`~FUCfbpusX5S&Y!co_MF4!0lP63^H8|BToX%Khu2_ZdDKc@nE+ckn1STl`An%2~ zVrr;bec~5F9$$%2{{^6HO`>tUjP)_EdgAu#Il{^FoF@1_V;VP|Rsj-{;U96HViYJV zwq|VH+cn?l3s$(wyOO)f9~o| z!Y)oZ7Gc(vuvZ$dFrI$)vs7ZCvwvthC3wakGZyucV*+xHwavnas!>T3PqvADZwyH= z0Qt7lERZz!EeCK63l2V>Q6^z?SFVaH6FPg6gJmVwd0q%{Xc zEpzZyX7aCcXyj{R5u!EqZ)5lW0w_P#v0CZ0o7fw-`B+iDwNXC-b|kmmq{7Cg6vfxc zaPLUCRW#nb#s-y6e)9WOVoWCzc`U`$(R7~f8dMlvXr|aS4H@UU%zUYTXwc$p20*Q*hiYEyz&pHe0E(t5U7ImRMkTk{Zu{QnT3%VOU9_HWYNk?qw zFl)hC=l@CtXHvwuD$<2%dD0{4aicB6=i}h>yJ%>Q?U*7~XgtZ~HnQ++>h@92ZNl_N zY`+D~n9N%V_i>SlcRbm`xX;SJnf|*^YOUVqtO*I8NNpc`MG#GG<=#%r+3|O54o_Y0 zS^89bIbr%o$c8yy8cM<=n&faj#+RjulbT5L;8}5lODoE_EJ-fAbSOZqd>+T@2sL9O z5|08M95R&kSx&hX5jRsn!AXI~j~QQ~q^FGkx2z z)O30r?^rAkTNmcfPe5zUeEqyn0KlhC9n97iH8Vwdt1~FY~rW9~wW-RNMWrqFOetFEphyuR=nQ5bLNFkXE?ei9oVgHQw z{=+UP%!rFO-H+q`Yv$LDA1?r`?Wgq$ChXf)+jes@^`cnK*gFaSLdmg4u#XIW*3gui zBf$akKt5K@;kWahRnHOTzv6e?2=bR{2X?-6Pt%P*%X|rzIV9p70f|d9kQSz~k_|?u zizRD$8QDx+79P97$o4ORBTIe~S-bb2pQL^jif5Tv55*=)Me*ravPl(P+qZmRO`1HyOL9z2YWNx5Cj+Q`eADKLPdsH1<8c+KqHTQNR)Co11EQ@D zE2NhCtOvZ~^xeHef|xh2GIa|qF2uZLVH(p$1jX(6?5U+A5GajYbN1~+x?H`i&GOIE zhS03X*pkpu@mf#5sK}yf>gLK#C4nb-{SIx6t?GheWf9AoQgW6K(o;g`TAYcS!!ZQm zmez%3qeEJB49L0@>%IXJ*T*~i)_y7c)G9C~kle0#|6z8sTm_WsDuf+`at@JqVCt5b z?9%*`gP`BWh2{sJngz5BajESFXuE38s~El}0fasBy!Bu}(aQ&B$Wpx~Z#b_veTAIV zV5u-urxT>HX1w{8<+jcfYgmzbyoOE|d`|g0-Eht~8@Ha>KG4P_w&`4ZT*O^cc8H>0 z(rVF`DVO<{&04N)0xx(~g&AGNY{Z0ZDcE)-Ztl6Wyo*5#SUib}(OM#5TRV`k@|2u% z#A=CDwMt{Y`6|O5t*`^KG_=<^9T+Dn=}B%>hFvbmzGeDQIw1#s_k+6vN0zSnL}?(+ z3`zb~LS#o+ty9+xRKj5u3C@4$D9t=k6DmvXR^?gi`~}FCj-_VqZ}m2zfH$;hQk+G& zZ+zZ2hV!)9G`%gQvZeM52R>$;b7WK=XG4G@mIe*tjwt~M5+?S0+iPo)VH9=tk} zsg$2ffyckfr9#B@naGL6`jP1Bo%eSM#R-D%vI%txkH^FM(L~DC>!id zJ2Q6}ueb}Buf-Me*p#PY-*UxkU~6W;x)_z>{RjiI) zgZ8@eDabD(j&U(l2YFYDa?8+f2R%#N z&b1{4Z$b=1!QM@oB0iCbr4LGh0ii89L$6-hpNI6+gM z=Bp)!j@UR{P3R7y@IkCmWfVABUz2qiG=RU=A0BxKNM&Y8a-3-Ut|K?t`Jqs2xA1_k zsSTp*cv%ARdn0=*m<85hsp)I4{B0WWCU6mH_HHgBg*=i47r;LA?e3N!)nMrLbk@%D z_(4KZ4i18nT>TZFU_v!>;@?l)CJ*fp&-}b*yT!955HiZwK%3t-0>2Oe*qoR`cgFE?pe0 zSYY4_fp2d`;>ZEh%D8T3-yEfcpt8PXt2iCnZQXAKG2yM)G@dM@>n$@+39ep1LAsBL%SuYCRFk5C?ts~OJarM!Nc{A<99eX?@5nFW8pgE ziE<$8X>^hs+kHs;R7MSA704oTp5fi}^UtdHimC>@T7NBf|jBqG+<>o1VTM8<;{I85;<@DkSndY^Gdd$Y3U?WuI)xI-xkBNKK4p?g=5iBqP4>&Wb= zsgQa=P&I7N+OU}mM^5IWXOandO=CwNisdx9&>j}_9wy;h)>vGNda?~oS zFs1c^w8C{7RgbAjIFE-t*<=u^nRJV*P_iH8CjqmBj$aeIk#p921DlWnxZ~STEXmfS zFWpH+dch+vm<-Yz4_TD-3z{AnG0^5v;o1!06}`ZP3QNpVg@WwI1K~myYpbsj+kHHou?>A1VQTef+?&S6*;zxFou#^I&6lwkqMC1_z^|6RZqW%ap zI2s89+RQkA-0kiJxNaD;(ZYju_%&5l+*x*bvyC5FMF?j>Di%ZR9jf_#JfG2;p`x!$eh^1oB0YXen!e`P8iLpU&ca!2v4%W>7juLf0hlq|a>QXBp%kZ3f8dpE!R~m<} z{bI3^-nFIlB44>$19!`N(S1*3qTZJord|E6d9(b+5)S?uci&L#M{89d6{U+zmWgzQ zvk+^}^2rHE39b9`b2r9x&Arr3LqUl9=AFhvf*%uy8o_%QF?mPJ}VI$oe^4W*o{mX|+ZrlnminbFgTTm5ps2 z0n;12@qvsipa#c@SwRbKWPhFpiG?oT4IW=M*=k6MnC1~A%g&VQ`wQrxGda4GkZ-u{ zi<~f7{oW%@lp=bSnwaU+x8AMUVh?F)o?Oilqk6+cOqBH(utdvbJy#Oc9ejb#C~8e% zN!MV+1xzr?K8R&(^krW}sCUU&L^9aeB_Vf4(imEsS-$B4?>I)5y(SWq+}J&axbL`w z_XjELAq}>eag`@OgrB?>q6khhe`njV5YGN`E9?soa=Lo?C-h5zp#Yy(tJO;>T9A{Y zQ&kpSRK_OPflsDUXZQFQdYJ~lV$W@}M>QfZ6LT^@!1s{7tsVAAMh;tw-8bGg{VJH#1drwpPW5mp4faKE)NW)z>sSd=*| zOq!b6hb0&us^Fc@0J>hO1d=-fBG}PhbNAuegHzCe)iGN{Pw1$(;cHfQJi+-#b7#b% z1X5>Uu7myyCY{B)$-R_V09n=IXzL2x-=s*;~K?nkdQ?N!P4L zmPn3ycq=52cewsm?PW z6lBeRD3(+#hb{|L8Z2^5pq6iws<)~}tdTaQu&z;_YYD`kaQ7HvEHu=2yT4g3WU`)T zsg1FW_-N?HcTlq?u|NauoNt4@O$=Q3@Axb>Z+`i&)cW8rATgQ9K)RkJtP7HTjEo;X zmif>VJ3xo$M)P5!F>}A{KYH6-rjspwNsyC-&~@R37YcS+z=aLSXS)urZ)Ap?$AB|+Lq-xW7@sPg zKxlNDFxbCWx(k1bF>7_-ioOR5c`U3ml^Y5}O#CKi{3njMk9tqPC0HvR=;(at% zvl7vTFYewNKMD(zdX_$M$jP7Zz1W*W^&`&CG{oghMl1U~Raf37ZqJ|u_{%lZPD_%^ z_s_N|&!TCY^6w&h>JsF~Xy57*gIW~b9(@Q16X6=N#StDRe>3J8Jfqu`2H;Cp(LEo5 zwZ^z2z{Q!4pYLAEpuhjXSyBbYjV=$nkNQb*iKDV-hWBszw_ zn+cp-9eMfBOY?rGtm~pHTIVBkyeMLRqewwOEOpd)PPGQ-2rvsqqFeJWYgMPgzEnEQ z%Xeb1U!*3WSzk^>#RpHr;IT7`S4HeAZ6zsDER|IAB#A zQ>QygxH!QAEKjKjjZR+3adCL&zvtUTYmxi~z&L}ZDoEa>KVrXc;be zHY1_}MG?f1Iw+HIe9L>|-EZVY!RROK%l-Ec(e0DnX{EX1h!<9m`?VFRbXFwn-Zmld;)JFPnF-Zsc8;rx=PHe{Y_%zj&Nltt zfHF3@0)mf;z3^`yLe^AYpvGyy;#l%$y82Y(0|nX)&LZz+n(S|MSS`uc%UGguwqm8Y z;46+7!6b226_Fan;&qYW)CF=ioalt9^ZDZ??f~7{Em}Exnkb?E29)JJpAt|Ams6j+ zdi?{^J8B$5&W{S<;NQGfN3STH1LZAFx&1S8f;F^x#N;yZw@(&)s$ z0Ejk*%5WGLGqSN_)@dF}mLrTy^VjI6_@PkoG?E}_cv9fLfqMs+ItoE}Zb^P?xlEkRlScMhiN zhKecAjS4u^gUBeTw)w?es7R9(mUcna)n0_rh9jT&=Jm2RV}%*h&GuR7=sFg^?9tuW z!@>X2^C#2lEQTm-@J5HE!8raRG1oVHc~PDD<$I-Ht}7PIS4P#Y<~9V1G`R!v27^&F zk=oRq-^a>1jVr4+`g&RK&3p6e@4-+ zdU-?Jv7H`Qfy`yvk7cT7v$f4E?s{P)Ep?-l24OBf-V*${{fTFio~B!F z=UwR`19TKcDY{l-*G8>{DVIsCS-4xc4nsby7d>Uz){m<1BgpO**Sq)XxGUU+wJml+ zKEQRYVz$vN7Poo8YA!i~k}SCbA$Fx~(JA2!5#=-M zJo_n@&3cMfIQA5+Slq#;jb6Q#bJQs?H`dUa>xkub)69fbc9>{BnJ zwJY-~wNKAti*F_P4`LW^l}iuea59Q0h-x;p1HVI88?f@|Id|L7kX3bGWOGNy&9ZcV zIpgs?Ehm&UohP7v!20A*#mvl;zCwYkig!JD)9*3?IOCn(%StL0FfeWje_G}0VJub@ ze&^h=-267I{6_A-7BK3ApOiFs!k9x-T2Gmkry{rR%y?J*O1NjboyPOVJKV1fYZOEt z{fseRCgrJWvpqn1&>^{~lzMaoH?QEvZ-Myc{_47EyBedLEwjfuINhoZIYg`fc6fXx z+4v4$-EY``6kP%nH9a~ZxA7dD%s@o2pW9Lhv{EEkIosl1%9NxBl)~vE zsXn;9VKCO1lRuSD$qS(j4)zo;XkpJqWiqA;G}^vhET8tS?(RbtQMm268aBHVQ?LIj z7@DLRRbe5XJ-)QPl|+ojnZG5IsvM_u$kd{`?@2k_QbaL>IL}Gn@@Cg!$#?DEAewDL zyxy|4C0%K`{%ls*D60LSkxj?FdIw6eA$_dW>U-z5Wj>+yJ=YT)&~YsEEOxfwM{#F> zeCbb~G`rdN)jYYs*ip0_Yws|`$5J(Vx`SAbDI4h;AV)daDiw;;)U|Zb-f|vrP2)d? zEb3O*BmzU#zGh+}oIQ3=M!b2t^U6NTV2yhK@78!pSnPmV0cCrL}F3)lvHB7 zZ+d9->(IPB)j+VN^-RJrl$z7&jU47zx>XcHkp6_Ck-mG3dhK*gb&9iyqkz`^w(RZf znO>W&H9T3DB90u@O2K>|l&OsVX8^22^3a7J0GGwp*uC?l5biEZ*BWa+RDaKVsF8O` z0S&I|3+4@y*oN~eUg+>fcXN~4Uu$sUuxKLcQ{)5*-1aVu7Ad`~znWw-R?l2q*i>Y6 zkyfY{Ifn-%SJ%Fmzmv2dUOsTY20Z<~_GVeEZ`WOE_k($J-^Ssn$%29Qx!?(q1 zCe02h3%>Dgm@BmNB}7GItc=_hXf9GesBhbl8u1=Umm5EO&z!LqhT{*Pkm(gPybTe+1F>mvxd}+$%$*fuBGV#dX+A7ygLI(Q zX-RU(%Gw{bk~6Xe+nRd+ z%JfBvotD^^M{T(YG@CoD@w>l|{*+0^ddjGVWtecP%*GGxCeX2r;2A;E-u@L5Yc@+J zM3H^i0374-c@3e_@YMev?=1(DD# zYw2LpA}wfDw?-hXZ&jdzXaTJ!7s``V9yyV$+lWRJHzB=v+&7vEO*FC7enlAgni}2( z&(>|+L89a;B~U9S_{gA^FZwP>()p7{2fT8}%`h7SZ9Tp97l1MH{-yWHztrl@9YIlo zJ+_25+8{(lruvllBT_JHjp|P0KON_J-15(5{C8wvtfMFdtONTcL#HUD8Pzn&+TPQ6-~nGW^_w%5oxu}nk7^*cHcK=^4sUJN z&>CoNh`v=FqQLNNvrAes*B_$fQ#3^QkbFmcguom^E=PT;NCYb?vczcM7M~-yq9_<& z*UYuECqv*<2`>mDFBy8dNV56U5dc= zwY+7R^0n2iO73E>?QUWT`50ywf(6RX1{WmuWK>IH6e}KZWX2B&_-fuY0DQ`UezIMC&xr#s<*>-g2mmq}A4zg&Ggz1rM`drB z1597b&y6ukzSxko$c*H$2F2~8ipA=V<4vPWV(*%L$u8D>4HhYeR-|{WshOltG>5C* znR{WI1>cXOc}T@ioj+Tax?Wb`r#vGKe?c5?QpsR0Q}i!;&7$ zVm8`h+hudMZ~++w;@wh6GWyvVxU;f&ymAGezD63H09xA;NXr7JWHn3PNpheSn%C7F zaY+vsjh1`ko0&qt7cF zXDm6AGL>wd>?Y$AwitP^QNo|Kr!{FGI=^YwgZ>3jzr}AbuxY6;oYn;0DI$J+|477i zd|Da9f*`U_Ef*+eZ$`q|tZgXw-uoO@hcTBEqWzRU7sNu~?6l}6M`e2N zUayM-)!&IB{ua)^iPl#N1bj*kQ*+ks_rY)G_1aMhAsJIO>x*x&OeC|R2Y)sWWHhJNpY6Uk(jmqX%*(>uFeuCX9%K0Y9;$!@6g!#>6~|Qk5;X-q_!-A0(ql3P4rlmKMWg&kV7<@$soyakBoae(7uv^P zItIHGou7Dw@U-o_EIyG!h&%GeAn2is#6LrMp}E~$KlYn&r1xB%zHL>Qccyjobnim0 z`2sRjn=2SAb4)TN42+E=146tQXjYvaxeh+ozt+!xA9mM#l65S3Ne-Ap0d!hT<0i}* zKj$NX!AWUGaWvi;2x?0gzm&Dor!;KPu?(TeoD1oy=>q|}rkp9^(4R&EyD%0hJ16Gy znT@0CS&NOFt&{jABitR5l9vc~m16~5WkMMn7M$S1MxxoaktrZk-mlx;*M2{|a1f>$ zlquLP^Wj%fwo+<7fwSW=wrfLAp4{i5#;Dskix}|1l9&X)*v?Na=$TQmQx=@3t!BT^ zHey3$UcVdT>?vI0mmXbW*1#ZhoSqc=wok{(DotIW)lRP>yIJkkA-2E%bw~jL;R;gU zBd07nQh|}$;}qMFGCdS%>d`(4C#F}fq(%{eEe~eRvt57WA9^VxKLZa~;{CV&+_N+c zA%}IMQB$yT>WzC!hQo%n$@4!>)Y1NDStOtsA*&$6!JR6_? zR8%?kQr|lk_1T1(wz_HO2dAa@w-F-y7mZvL8+1iNoLyAgqgrU$wmdAno^Rp>tGm+e zUa}_FeDn}}P>qu$tK3UR*%d|v8>oGC>Nyd$87a);N z)z)R1js)Nsjz+UVN6XTOB}z;U+Z|$};q0irX2$bQiY@`WCCZb!Q!QwVgf*t}u*J!O zHNn{rY%OB3C&UUcs#>yLqVdOOV$H9}eWe|BJ&>T|Af|sT5}nM)qb)g}A(MFob55+B z=Md5pB&g*d;Tgn|b)_mgiJ)Y{FKPAn(<)a&&+4ac>sRwMKO~;h(p`tN$ewUSPbZzg zqU&r!K8$P}Iid;Ae{6Jr7IA5R zYGgh?N3s}c24!mj!(`axH4utH-;Ls%kB-QQ&vh>|c1|Qlp%*g69>Ktkx_i$w2EsXe zQu~*b`s08Rr{oSOah!cfEh5c6L5x6~zaLMp=9m9Xs5N*j*)Dj)kpum)HdYfWZeE;J zp*H|Fg4f6E_8^MTj(TfB=%@K;Z^Sz{0bg<)04}L{l(w`RW6UB@D)?=tI-_j6(S})5 z;{Z}u^6awoQm1`7E**wlR(p%i;Yq59157ACT!OzVar!TN;86|D4nZ~_N>V9RAnj8XM>4?GzBvsL`bcn!w$cf^E;+GjsPBikT)D^c2L*kXO<~cfAO41#PvL@xTjC<}= zWsFopYRg^(`4lSu&ZGm^g8I-6$>2C#B9A~p(@M}tx-kJ?Iz!wc`oenyn>|abdrDrh zh5qa!YJ(x*^*~DV8q?wRn`IxztV}qCW8x>`YX_d$&GMSVTti!&6 z*4l)LWmmAH1QHD|2dvHMG!MmUrwkc=#9s*!DL1S77gG5&NzGiF{5eT|g!RWX5tkxU z_{O#JIeWOYsDxiaem)}-ub7MT?8w!B`#UOiEmqU?ppp)}L*`!UDb|%N@B(>jR)@&_ z-484W*+-Oh2A9-d0F!|=)%sRN@oLUDGPF@fHgEvS5KpB~@*In!@3pmYVW`8{!lIXq zRT(RKIk1CCP@>iHFWUW27!_vCBEHaYZFDj2<$IaYQ~aziNf+a{FNEo0r}kFOii&2+ zzD;s&xDLPFt^MsDM*KPTHZ+Mb$f>4}brsW8{z7`mP`J=9E0@DW3}H#)_1!xtYMv7Wo~piGpLu6NzuIm-?Ej+Q=!=Cv z&Vn4yL?l*oto2;V%Yyb!(lj-?C+#d3!mksP?-CL4tJUj?o zKJJ7b6VHDWVdk0{wH(s)bA zn4RFbnZx&a&HO0}^6J5GNv z3X~tt>+PGzCcFb{70VG>)~FQ6*Y`KU_JxXtnxNb4-bz0O7%P4f{v=QRlR{u-{^TE) zR>vHMS4BV|T5S*FKNL)LI3C$+@$KYjRWxI}C};|&_;uZ!BS|v_ueBn& zDDu9(ToFF7i`x^U;hTmfIkCfX27n!4ALSFJEzeXA&vy^gkZMw>#lHJ^H70KGhyP~Q zv}iH-`~~RpkzI};v;E{w)jg~e#a)#`HBRtH`Xbn&1rm%$J~2RbT|%Dv@Pq2 zDBX8KvIl(cH4;hTe|UPKxs|!KC7yPv*S-#XIw9%)_YB8Ez?1#y5|J=+vqr43>PAJ8 zAx$9c2FLAK+saaBMpG;^hf6G^M*&VJnbHe@mHMAPuhZ{4Q=k_%# zz>?2@oW>X&s4sQ_ThrYa24-)xsi_KCJ$J9-or{0w9C`mP=9;nlB=qC+fq9|#jctlF z_y$A;EKa`!t(kv?fN4+HL}bwC$HZ5RD78wBQ#66o;Ai5vuc;cTAWydNsn19Q%|8<$ z&y=19(Fw%tGEQx)8VB0R((ETv^sDHoBa}59Kz`q{=~%1TX@nj`ff|)!b zK&2(Ep)ytd%$Cu{&T|5B@X`Y#mm(X3y$#mAjIZ)|Zm3nThmxuhQA?4FH_KqjtS`Gm zHFB9blAb2)BhNGK8pqZw^F7h2J-j1&r2e8r6D2a6_)!Z7maub@9V+AbvB=GF|I_zL zUmtdRA%}p7nT`7>PmWCg#;RdqrQVVLkX>?p8Mn#E__{mmlViGNlNTYtk85Q0e1q!; zAjO7^Z0+P}chDiwAv!yf&NSz#_5#J3^=)Z$)KBVH)#k*wlwOt^_8wh zNN^C7x1>gu51vn_P3Q$=R>-NaJ{=fY92f>pl?VMQs_cSR)~A-N*I#6II?_z_WwlBx zoiI=K?)Sta>qyp|CeEkG9G`#$r@*wwXU`(mgR0 z;LjQ?ki>3s9@)*c&1g&B_;aX^!4-?NI%5zu`HfdF> zbTA%U)d9H|r%z3AHrTQ`DLa#hW&wcg(W0;xftxKS}bLTwR=bqu3F^?zhK5oEQn$IA~0h?l0P}d6N0)8 zW3gT*5^^#8H_z|+E^G6@Milwh>XF1rG^#I&pDKirR{sUSy%{JnxVQIDs8%Wh_JxA} zlxC4s>f_1csdk+ND3(8OFEuvT{gT0My=Xv&tAEW__a5MrK9=Ojd6Gz0ou)eJ$uUmF zSI_a2peR>9Q1|x#YzDt2MHQi8R7G5quvbgajhtx7y^>!$z&I95r&;3-WR(9dz&W zN=e-*xULX2`~D@ZB!?T{WbN+VZfnB-)A(W8KS2ln`B04~*Vu#x(n(F0+>o51qe!Pr zF8>-_KGXjgWWSRQjZQ3h&Tu4M6HMeRXd~N=jck|+Ym-SpeVay!BiJ*DdvQc6^Z5F! z_#u5kNtC?0cbZE&>Tr$EswrEF?-XY5ItFRWGIqGuP{4hY!go}hXTj6EX%=POd0cn7 z8Flw#E2gBL*O)|S-=VNGY&db8tSRB|v7@5K$>#>I|NEu}lK^G~N$=iW$?L-{Ws z-wXbex_@XclUS^zt0u7Rnv*kBCqx0hgv{5(pQM~m8B2;(u^QHdIYTV%e-pE+pb#fBXU3<9c)? z2F#aNjG5|>_BBHmnH;+%lQ8r12|P*J zuXJaMp-Z82C{R!>FF>fF4OQZ%eGwKi%^_%@^ilJJcpg0zc!9Gotv&(-B_1Z&=xC{9Wf5*b}{)%u*_QSfMeo347y48>mvW|xA1n~2Z zOFcZF5YN9;+>U}?q&!7!apvA436|7Pq~Uq_Q0^~)rux5H341i#+HIM%f<9^(TwBU@ zOm$3baB>?XG|H_Z%^>Pyv!(Qo8j<*p@jI3(~Ni1eN-q-%Q_$Dg<{iE`(|o zzy#KQdZT7Ct1&oS^WcqB)BG2l)&yv zmYO1>zGu0nk7@l2U}$A^t2=UW>?2;);JcAO4jwm`-?o0gb$eCDP$a3Wi;BM6aqa1m z>bGi|`neeVo`Iyrw*sQk{c~(M;>9}|ZF}ABG4JeHLo#=iMlmbBx21}fC=wwy*3h8z z8&3MZ`cdl^^1sW%;V0*#8%k}AuRMyH@D?{3fcm`x;?bQ(tlrn|%2GV1t@~a-w@|;1 z{XV1^z&$|1WDtK-A+|#1%PK|TBg;Yg2Zdy-Gk7rnMYUqM2ApW0mc!MBj_g@07oZxM9$hpD&n<551Y?uU$I6vWD1pudy-P@a&4<3<6&ee!AYJg@91 zIoC**#d^q?lEHV_%&V97mLA1VL31n5V9Av#q%XI&i`)ra{W^2QUX5CMQN!V_RX+{rRkNVrD&kox4O)4S`?BOo@{gO{u(%ip}&BJyzlwu$G<@e zhoLQS?y<*qC6l6EpF>t0KVAUD%_b=*e;Ci`w$W4@P?GAr@(U-?9Rn^cJn$jCQzTn# z+NOC%^k3ipIKJ);^FVn^5@&ck8>=U)Vo4(3?I;7S1+qTn;umO8*gc@{!KD|x;uZeD zvT@FF?jWq=FQ6ZuXbZKp6s7L%TF2GUt5t{++5SR(4Gw{*RZ^lw@{+2UWpQ^%Nm~=6 zau&x06uEsvxb7@9L~YeP$LakMz<_YsEmfECwK;*;h5?Ee1DjLZ$F#~xV!@nYM>bf) z0pz<#xCd=fC1kW?I81s=W;saUjXbgo?NCT=Mzhb-(=@Sy~Ho~ z@g_ZYmdK?;i9W_Yz!sm)j2)=kE<1^Yg+W(4q>6%{)RHHE?@KN8zwtajAG-4%^1R0I zEXZN>zJp*D+kMwYj_0F+-lkPm<0P=)aa87p0oLe^2AxnK;8;Q$AHxTKr^>$=fa9Cu z=G!6NqDp1Ra0h?pNqKwwKoSn|FWg=g={b>fW+trV$Z-f8wSh$IOmx}h@E)C4e*~I& zL$}dpte+lb4InU@G%#RB3ax@&o41VwV=R=BKXv;@L{wT7Qnk|5Hx-QtO7Z0#4>%?A zY_E4$LK{gqb9b8l!5B748UTS^&lGFLRdX_KGB_{W=&Jn^g6<%G<51hdpuDi-c-(bmtbuTKde@c}Yp) z_q)b5owHVFA_aq=yX{KEb_WY)>*Z)IuCi?WHLVTa9EmlizZw*?LnC{BkZO7s@In|C zSdLlNah5^6Gmtm5lh!I1sad+sp_F;)kJR{GQQoi8}u-73Xy!6Suq8 z&mSKA_#4RBNH|joz<7kxQCRKGe-=CGssE&jz#&kICUwAUPX-E8tUML`Ae4V9CGTkb zkR)D*wm#4oeD;N@df`HOK92J@?7xXLE-qBFSsx$OQLsF%Du$LCW|~()G}6VPh5ogc z;38-jo|Mu|$RV*J8N@ZQzyjzz1NEB^Ky!`I`B27NffPR>n$}Gze$6f$gecBU-01cq z7YP^~*r+6ijE{fv$u3Y?!0Zz*lCQDp`5#yFac+wS#8VqKP~v9Q<7lr!2<2O*BgGy| z**F?H*;#DAcirUDJbLyN4A=@k2D%e0)7Z>bOggynQWWAXh9H*y{%oUK8t^{HKE3w5 z^moVq<^bf@L8udov%vDiAE*kcH$1Cl1Z`t9sl7|}^66^gaYSHeKH~>;Nlr8z;N#kE37 zF;JFVq*eJ?fFBFMkkCO?)-87K?3CuNv_TrSrSRuRmhm569F-5^7j^)BpCC0?QqQpN zJ+DHEGS4~Xyv&f;;(=w{5@o{7ZwZVPd?ffRPE@?Fc=x_(VG6oG{mzMKXe`Ci9jO^^ zk#6|KfWdoV%%6{u6izz^XidR0uAUdgk3C>n(5l=MuQ4oSw6Uq?N%&Hl&Xd5IMH(w; z#h2t6U~;%*ICw*)fg{}GN<^&?|6EzHoWH9m@GQI)-6Tz1u25x%!0rm z{t#aw6O}O(^S8z#k7fVgy0I2p+iQc8inMKAp?xlW8&RCIGWRO?x%M(*n3-V|{Ggxw z^jaMXxi!CGxs?aM#h7#iDYRf=R4ICHC*}nWZ&PH!Ww?T1wey z;Dw)`K!}3{*;M@7q5`I)pp41SO8$s%wOs5C(n=!pNGP*TUvmSgs-uPUC;~Wm% zF?hxD=R8@O#rC4WpNKYg%6$D-vCMbNp=BbizW`&LqK`vjUe*&WVa_J3#Y4%SD&J+eG zk}p7>P}afrpWM5xRijb(FMu#X8p{z4_7KF}M2%shGh%H2nPz%-7-~sNKJB|sOcais z4VJYj$`Lkr>DIkf!&X=1eY$|}1AVu3K`oWNw9Yx&RG@X}fL}^!9u_&!Ru0JDdw#yQ#f=*^L`+d8ic~AN0 z=}+PR3epDn9ym+ad@q@3c%r%R99f?ipYU&)PV~Bl>0*`!`TLrPGm8EY#7~(Wl6R)b zXt49!)BtFIR6f=%YhvPe2A3CuMT>F9i4;HcrYyksG-OYyaYR^|;Opq^(Diwzg@N#uyBg%}En`6wo%&%(=0 zZXQB&8;4jZ?~YOB-Mf`8e2hkL*w!J)Z}7^$0E(1v~NG%{&`tg=+it6onXp%FSDT3#Iq>0b{8w@ z?5Jau$*|)6byqI#?wM#>$MrN2-S0ZNN2LgtB?(EjLf= zv$(puT5#U)Huee0&k#a)DEP*?sS1fL>z~vZ?uWy_Jan;vWtnD8M|HRsib_fF>w(eL zV1Ym8xDC0Ea8@X`uY3IrIv4F8XzM^EjqSzJKQbn^`M1+fH*i$6RWhA zV}F}=@s3AMmw z$A$Nh)YbsEaCrI*^XA5ENE0eY)ubWQ(?8mN*wu6)&>g~ZLbN)F;<*qPMd+Frig6~% zf|wMjDJ$vtr!{$6+vgv3ga1p-Qxg4K&yz|bV$%9&Vx*MjH9B9+hbYDFZo5x8+D=KJ zA!)^H&_^lK(2Ux>?}yaNevA_o7;VT>|0DS9su&22(+xjleHl4|cb2fYDi#H3^1~l5 z&39=2)1NCF;4CLmmyiI0ZK-iSwY5|-*Wy+{8f2ZptH2hst%`?&o2QQg3S`Y|pl)_1 z)^IA_3T;@@MaEKOYT0wphgh5zCuIf&C|9q`ZiYh563*-No7hGt*D!(Np%$qcO`H`Y z^h?=(=iX!{tAuTbZm}pS8ZO1~(7bbUzP@QZ9On#oP9VNJ?7cTFZn4W4C=FDCo;JDW1*DOtEbj66JUwzrp~1n5<1 z@vvt`KbYt7TH(NXb5xPoQl?*#kRYl34c1GFpk7Ojoaz2| zDmYJ@o_ci?&rAL<{9oLSilrNPvikp<(8ls_z5O9@hN*{{Pr#PWY>ZC2V{BXY6>KIt zm+)l#cy)*Dwafuc3SzT`~mJ zJQK`f7BeB6CAck0GgrwmU~~kSXFrqJN%^x&WQo?Qr{Wa_T?v+qVs-S^NZ;Y+j;VE) zlF09a!__#Z|J?qsRs}R$%&SSpEnT_aAIB&5+Uz-Jp<^OaPOU@9Pazk79kqDbVhGOLo6xzheSjqiIqifaZ%&z_duz~IT$I=Ug z-xj0mhQiZl{y}m)KNqN|JH}%k2GB17sFU z*H6$u#%By8Uv}!$g9-pnO z{QOnR)mT6uGl_YP4E@WBXoc$}F!`1fAs$ztl->2plKaVrtW}uM1bI^El$w8v3<6 z3-qNH+v;;X^|5qhA19y+Y%X9_Y3nh;{>P{4@L^wp)$o!6cCsJ^_ByrgZs`(R9i$+% z!TD(%xqjs|vQJt6;J>*v%V!(?{{23I-(zQ0-jtjY6D{sLVtx*HPaWMU2EtPE{kHC2 zFx~y3zpH{xF%ahOe5Nbn;@v(sH_pgit2)scPwT;fc==^ZG}~rPB0znw7D+9Nlgye{ zlblK1Qj%X|tY>v70-jqLB`QdA8MELm#ERSN)nA#J=XgSd0wuFOWhopu8 zd}GDW7nWGTm+@Z8{fNK{iH!L7vXDGEZXEU6MZ$Q(I*v+pX@HhQsQ~!-aVilh87mi5 zObT~c=6Z`WexxY$93_A+DW5+b90PUD0*hJcvIppLwQ?&FWe-UfrqpbIAM+cxOY3wI zS7y@pdxg3@@O7v3B`=A0n6HknelEDQM`z!WxYlg_*vwxsoFk#<;2(s0Zy(-b*}nc}M!{#<9nJa!wq-F^{jT; zs6(-lm;tj<%EeX37`EQ-9HN=Fs_7Vwx>Hnyxe5&ZnfQr!Iyy>PXzkRDd43c{tDC*& z?PIE!if69@3-9_E^?rx^z2Bte&-S z`~|#{@Tr@V>9+sWV%f$i-gm2^ze7d{ZwpwKPkDl(i-wAGGLC}TbiukE`Xp^TbwuI6SDYnD$RyhaJ1^?K%V(2Nt*fBcQwjIMUdq%Ce2r6 z$Ly>tj0f)eBw`#6{{7B&nyg(n8gD(q#gtk!KBOXpB{K4|&k~Bgo713VUJFK9PSOm4 zpa_6!kpyU_*RbYX+w}AjsL)%Rtg&jg4lk4^zAH4 zvK5Q|Qb>K+)z9`tCiC?N)zCfsDVf0vm1`V@SvvFZIto0h+JzveDrc#-GSvlDkTkr zHCkX*m>WR8F&cPr0V=tl&I1P(F%Hz=T8n5N>{f9b>*qW&W<2-`5I7DJtbe+qPUxjq zS-8(;=n1GX#eDyZdXP!q;1Eydg@oW6OU*~GrNQp&2a({AQT1KZwi^F@qc|+sAKMvM zBR&+rG$HY`#T2X9QN@(8yD}`oWCmh=w(0km4UWYWXVH*t>?bd3KmvQ5=v9b#rnd#31aZ>usx{fh? zepo4u022V|1+HN~0o4QN6}ALldyiD^nssA4UwRYdJC*+qt<9?7cwVg%H} z`l&(+7p~3v55#Pa*qW$5=z8j4kXI22JRE1c$5gc1Jl*3VVRrCIl88v2V~Cv zGD+XlS{2$ww%C3dH^oIlf@#@>`;3=+amD$YxdJm5i4a{&mN@g1^MUGy(z?LPXqd-Q z!vG~oJdw58x%9f-%v;g;3>Mth$Bb_b3ZjA1a9NvX4`#Is?S0;p^)r$cZCdak?F~V= zEH(IsLb9p;!CaCC;^_2bWj##7iYY!aBGA=ereqFw)W?kD#vO|;R>bCYM3!H;Zo0G6 z)G-6!7p`-Q`wL&Bz$y{cXIYD^I#uQ_#OGQFKkk}IP4$tB42!?|Vz&wuH$Yp7e}CZJ zB24BhR>Ss@ps#+h>i<@yV*?*Lh?0tvIh+%cUogj~x>!rH;gS}Za+0_P)|Efa+*~3R z{%pZq<@;qn01fs#{sEKbgQ6j5nwuG8noGqYDx98gZv?p~fr?}~!{EbsFTHmKVaEo7 z-T;o8@FqMq{x4}ZYeCL88s6%0<2&kgKU!W<`t7w#k`6b^l}o=)S@#UjDePV4ji$VwLWG90tcRE8c35TnM?_ZnLV$#Jq!#A0Z!5Qnt2kMg4zp z>NcscR8#yCuN_L$wBh7{sx6hmt3jk8-Dbl&V?W^##yJ41WuD{j`MG6wL^MM**|(Ua z2CKLUuZ+VD4(G^v9JQ!lm0WhfBN6K=XxMa|J8={90;jCx9AVJY8Fk3~EI2z6=@9SZ zb2Nu-79(Yzr|J}`1+N(ag5JTFZj1WZ=ZZ|HWt%LG)+teZq<`1Gg& z(qB}0$?PM6hJ|%|A3F{HcoUuKt`cwsLWw;@6nyE$|)cRR8j)kAOR5bY5tR&a2vV-B>P~C1eZ!68CEh0nMx7J5c(s>Ka=i z`1|j*-O9?llBXCR@}KVj2-i8$uUq&CL$@~z^eDP|st!tlsnd!zR-K&2DIzW9{a+9b zpsO`E1~~_3TSb_}J*S-MBn~l)(MBVT3)awIpq|H9Y(k}KGi1U}WLJ^hh0P6Y9`6v? z=ugz4$mBRgAjDU!+x9rQ+aTVfQXSrNy&7sKE&083O&ife#z)oP;lOBvpK7seidk}n zZx0)9D;bon)r6m~@6q-3WP(~e-jL9cy2oEq-vN>)V$DvJ8?A;c+EM;`*e+@YP;h4p zSN`D&lwew=M9_VWP7=@8nj}U;k;fg+5T6C5d#6!!19r*QtHl1Xavb{r5HJ3fNGHiJ zN0P?+%d|@w8Go!%dBqNhrlp^8Q9s5pWlqA!9`>s`^B*U@&ZL92>lbi4yAeY-T|@Tn zcKg?}=Stkl@{oqgQ8#Y@r5hD{?4aTmOxbDs=fXk^Uo=RGE;D77BGQ>6EIp|}kc0xl ziQtJa9OqAx5`mB~eCLQ^W|oSisZu9$;YEC@$xY_M>3~J-HVi{^kCG3b9R^iOwh{%G zjtbo@VNmJlJYY$8xz5BJ?QbL_(d!8hix_U^CU;4_+!qe`c{bNyVu?*|9}lzKYF6a8P3bi7Q2T|tk7-78 zg|2^r;M&c8&UXN(3H~WRJG`LqBoo#->4iqZZ{PGaI8!I($&d?*sz>%dHG^*ye`A)m zES8=#O+w!o#uJ2w$tbb0!VW#CEsDx>LzchEwtK>kLoIf7R79`n91%Z$h|`oI;zxR5 z^8clMYh<61hAtBfk83LZIddn2sAQApm$XfVIb%EZcQ6++2W8dz=i*p}O9c-q%GHGO zy-AAQh@8)d$K}BEKbJqo&`0OE1_NaUk)Rl1XmS{H92QJ=6Zxa@6q98*QJoNd{l7>* zf_6W+-=|%_?WwNh?%fN;Om(u)E_MkG<^-@8W-L8MdWgAqz_pw4yiWLtWwD7|@Ja9l zpb407(XVxFS=44ZzI@Cf^~sdAgi@=v7OGv!n^NJ2miwBzo!5bGG}@TZ z7L5CjC^Rnbz|k#Ym!?A}?~G2OuunLDJ2QPJDp-Tv8Gb`y1)Lz<93V@0&1k=9rzYWK zX%rRXGB~|2Q4qH@ti9qM#2(lWsmF*S6mdbHg3H-d%V|v`0S$u+A7xun-k8whC>SvJ zLYC)9D3?&}h47H)NIODEa`6erve43QzO>0JHY1YKmdRxT(ur)RuuH$yO7>ozvSClM zY1huTyTnbCJ&zt5dh9l^_J8ZNQUtA4ba(s)ktJpu@&xS}*ZieaJp?d6D|{3go*K8z zD#bG?UOOGV$-S_}{@$9kYFl7^TdMhulWB;8NE@G(NneKz;#tJCyS)Wmkq9ke$PPHv zTcm5H>P|Lq=C=`UTC<^rf--S~Hugf{T7^(tdLgl{J6Sw7^;yAlBYK^ksNxOXjwOeh zn7h%0j;9+JAunJZZAt6^8G7-J$Z$^a@X91*e`(UFg*eN(=r^?7V_{%`AaekoZAU#e zkJ(RZEOlMjHg{qAYN8Sp7DGyR1w@Q5NGS?St$Z1biudrU=iWvE!*>04#4*A+-%DLC zW1!ZpzL_rfz+Fe#_XtSi2!q3d)-@h=9bnYJNnAHs z&h*14@W0^0*sZEm!7V~?7l}SAP}*aQU(q12%6eu;cqAP%vtcPA(YqYoKl&-w{2aNK z_Hb-7I9zTfmy@n)+x#LpfjUdoUJ`hQ)^23fO9B!TX0rL~`UPRP&w}~Lw-PaRfY_?p zHi1={e~#SQ#w;s9spatq*+5vfU1z0Oy};5)IS|@)XeTu*RqRzOb=3XJIr^f_j7FGk zPm?m&)v7)59Hw)>W-$d92CC7|_MW1-XT#)Nz@FlmgmXPZ2vEq1;2IVl@Ch+6cUc|O z=F~0@Yz&;_YYJLve%-V6MBF*xJoK~qn3%&hgs>0@Qo%jIZDUx&4$ zrYifA39R;vDD7?`S8CZ@$KKR}m_V{m*v%35Uo@68*yo;eBJbJxfp1hfC?m)en2Xqj zPg!8hP{j0Q3z4YVc%~;tguRis)s*2_PV4I;m;UFR3a)U%{pkB{6)*DED0CVOMGsa5 z0&Bj>-b*7y;bF@wNJ|(&daxVp(sLrJ!HGr-M~j;}v_tsEU--sO4W$$kTqde?X3=sY z5zZTH?8FCgW9Yv)1b2ux#Q2HOFgE@>+y#fnmc@O>1^$+?CkzZFvQKKrS8RPzs3ppE zIQ=U%DfA3a7^Fm)ftzBc6Kt2E8VVa1Fx4!wlK$=9ypHtF@Qkx4+)WfqDTq#05(dh| zxF1thZJsXZu_SZPe>LIC@%$+1#UY}@_`}u zC`A-{v8AJ8(eS~%h1EdMPtdqQE*vtGm+de@2qtyQ- zq<+;Qx{-?u(gtQW^h=7x~qB=I3y_rvnV?lNvzM&WeJ+?Q8~hZR~9)=WE} z^p=!E17q)@XImNbnus3Q7Af_^6ZtfaJ5})F$u!{GD$b#b3yVOJd${a-1uOp26C*>2=`#}8WdR;%Xx>{@Cn0!zP z8jX!G9U>~rA(y}~tA1kSX=Z}RPpmX0Aa^J0DwAApjpBco)-N$psEsyrU3`f5@GM zzkw%(Fy*R36+gAao3|{W)M3MW5ZB$`h>908IW}+bkTJM|&84NKj%MT3IG|L4NV_Y+ zevWYP;Y28fU_~N{8|&b2Hd!k382w+(3vMcDLtcU{9*2WJq!G|&q;@%t=(;X?!RXlslgAQKw={rp4vsIKxxfg0O`ORi+*-OJentr)ssE6>F4A zh&{oR61E7IVv&(5x|cYJC|bq=Elj=36Gh3FFbhJj*1&a)L`>S`vD8s+?}IgQSg10` zZbPhmBFb4lmpAzl8^Y}_<@2Gs@J>3?ZAd>ot;&3W^$Oz?C4w8GVd$WsyaDxNMk#i2 zxyk4bNu<*i`(pFW2a6on#;HnRS~{#Jbs6m<$_AC$S^$>r^in!A9sxg${X#0_^X-5D zJVwR_Y69FZEQB}|(h#X!nag!h@5Y05o*lrMqL2?_V^;^CD3(QiYPh#54{w& zkeh$ZPNW6VJSN@_AUEGI~LU!iRA5R~oIH z3-bJLt&OuYps7~BScC>BUkon^Pn>+zhC;;DB}YUCB+ED4J=b>t9dYX^QgSnSSYQBO zPyEsd^Uo577QPR_5u_dMXo^ptwcJYoLF$BW0BQX>j0wCS6}ZfcP`B14GmFL1rg(b{ zEoX+TV_D4iz#&rko4Efd-%7QR0UeuEr!Qxgp(9#=>dk%Q30qsRGsq_ekKm9cDd+7<3Yd@XK8=3A-z23a%cZqj8OsPam`H?tQXeu}+MgYe1V25%w)$g5Fo zO=t!Ddn6Q4XX#LXA<%V|1+5ehoeB83N$(>vhP9$5S{|Zqd%_h0O5%UqM}wtY<;2q| z@@;yAi+;)7>=8k4$sL^2)%$he)0$t4F+g$wl?9Bv5+HMw90@k6)g$q)=+IrpW;Q6s z2O}b5S~*=itd5dUgl!2E!Qg+)XZ^H=aqIpH{|x}Zx2lk19SglGA3I0RPj7z1bB$-t@KpMUz{eM& zk?Nz%0laS43$ZJ|VlC`y!1Oa8`^kV%!w;TA-~OU_sIMl->(u#h4=HhKtPaE5Vi~Ska1@k zEYYN5%0u;u9;0IOT~%QC;&v|QRBBK!?Uw4Xd*hr@j!-M5hx!+b(;76d!DJ)~uN#wB zDic#bpLvwW2*P(?#X%CY^2?Uwq*kjRI%J*A@irMC6AD!9>ZQWEHwdj7R-^dCmXb75 zezQ2yQX%coC~9p3mvAL?=YuH77&Iz8u?f}p^v_#=3egan1h=&H524ZuzQ(Y7SjuvL zm5prTggqW6iN#1?$B7qM6113UvXHUnIn=fjMiMnUUg~j2-4^+agr;^b9U+RNxvj&C zy@~%7R6+k2kt;XCO!QQ~R*t0EsWfQOO^eyOB3eH{35H$$bfbU3sBB4~(x%0uQ@WWD zqtU{0*30Y<@A1K(tHg)DaB3bT?%DmR>%|I<_Yl-6xUXqdgUWj@;s>_Kf6Ua;v!o!oT^Ytn+v(Ofw)5ItUu7GAJEnRzo5 zJ&AKhIr76(4&a6VZo~$uJx4_J+SlAe@QU{`V6s0`dm%ncLfFQ&DW)k3UUYpwo5fE7 z4Ed2beZ*TR-lzZsU)vNfc|yMhDuT%rt9|He4BCso1dgihfdnVHvyV6^XcDmEH1+uB zCg%-r(4o;pPk+k9bCkeXy|B7Jzi2!`K0pY_iU> zttw>u)40y-Q`pWFf7E7(&|Gx%xbm{b6*(s2^@|90cX68a`q*UQtWXR_7Esfh-B-g( zi(zskemWT`fxU%?)t;r{K|tt9|R}3x+$#5LNl@|saAW8mID@Nuo0(t z-3+w^%cw3{#huFP=`UzdVT7U1wB}oVIEC}9Y;6}+>mNW3C%6dPM18)#x&Q!-4>=dh}tR2_jzQbr%-L~H;Be$N&j24RP%}d;~9ba2kn%m z!a$Y#`u*~vfCHilMUS!_Aw`jiF?T^Wl5kOdGNd&l`f~jGg?I)ugWqd3T^ghO9XSRq ze_?luY~Kpw4s;iN0Yygqiamvb|3Jqf-q@E$ zt4Krfn~zg%n0bA{HZGW*YTM+^(%Z60VQ6<^Rd$bzZ-vdqYorpYEYIo3!j)J(fNdlS z99tb*pKO65AVuk}^Y2y=1@Ea4Y0_UjCiAiwSm{f}KIl zv{*MM$rQpMXy*jXxUt?xXq7UpC3YV$ z>05lNPmKoK6nQMNBA`B`nE`eM^H(RC3ym*r0O?*@$rxB;rbTT+cMN_6W$57bp&pu?`%etXLJw^Cmh3HNJInFacH>VW zv1itAoDr|@fR06%2}`$Q>ej%C@e5*CPT&|A{15rMC)WiX)3APn1m#k z=@PlR9E=(c+pQ6Vh8o$3Y$t+CWrpstU(qMO7DWM{InIOOk!9WirnhkR>Lc6_c}?f# zS)a{5a*t&5D6m6nB<)i{y&x9v4KxUnG}~W1`r9g5F#XNHv2`(gGPBu)MLc{|2M8Y=qxR%n7g{7alwD)oL_+%?*L+9)k=Vp`1HXfuTp0aJHvLD;<3lU zO=l3LG2#5H4@WT;ay}6>PG9a|wo#VO*5pf^wvz({LS9%Ns7dDzi+pYoAUWMkA8!Xm zP&6d=UekUEwTVru*&pZB8^uzYI3e^!1;T@*D6_32ejH}yAe3ZUVBJaGvnv0=c4mzk z9YD~a94r#0(ZktC4U1A#2`ibakY#UAl3K(L1^xN2ElcT%o12?u$@Epqx*+U@)k1<; zqXY=-jZy&V&b5xO=WdCKYUzaf1FFEA-3GWg&C1XP@txPp4L3E4w zD$+_0OD6|S=M_lD(N#EBePq^ZctiWg*&9*`Q8JBmG%Rw`N0#!e5=~YrzKH3wjy6rI z&*mIh&y>;N>I4-HDw&11=8(s@uzn#$F5M{$41L*Xwf#mJz@wSSrTNz!YGQE=6Kal$ zU4x$8@>@+NiopICT>L3|> zpLdEdbditgM8n8DUZ_`VEUXJ$xgk7g0Wo+xQNj2nQ#BgXW8F<009D`kheZ2oQJOEG zY`>cHE=)MS=boakQAlyNUv`hNQGRHN_A$32u&kJ7dy_X&^Cw*9REJD z0nrlc$5m;3U#xt}^RM|iI{Qz99z3a(R%w)ds*kgfjz(5I!u|&*l+!*oD`Nye92(NC zfY?cOvihaomKPY-g-SQ$Qgi|$Byr_lQYK{Lo)CSJjj{-KPqm1&V9^Wn9R6&xoR#Db z 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%0DPvtNhh-h98|!$~ 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 bf&ULymV<`*%K!%Xw=sf)fo1Ri?ZEyY6`28T literal 0 HcmV?d00001 diff --git a/API/Interfaces/Services/IArchiveService.cs b/API/Interfaces/Services/IArchiveService.cs index 1c0a638db..65b9d65b9 100644 --- a/API/Interfaces/Services/IArchiveService.cs +++ b/API/Interfaces/Services/IArchiveService.cs @@ -5,12 +5,10 @@ namespace API.Interfaces.Services { public interface IArchiveService { - bool ArchiveNeedsFlattening(ZipArchive archive); void ExtractArchive(string archivePath, string extractPath); int GetNumberOfPagesFromArchive(string archivePath); byte[] GetCoverImage(string filepath, bool createThumbnail = false); bool IsValidArchive(string archivePath); string GetSummaryInfo(string archivePath); - } } \ No newline at end of file diff --git a/API/Parser/Parser.cs b/API/Parser/Parser.cs index 27b6309c1..ec7cc8223 100644 --- a/API/Parser/Parser.cs +++ b/API/Parser/Parser.cs @@ -8,7 +8,7 @@ namespace API.Parser { public static class Parser { - public static readonly string MangaFileExtensions = @"\.cbz|\.zip"; // |\.rar|\.cbr + public static readonly string MangaFileExtensions = @"\.cbz|\.zip|\.rar|\.cbr|.tar.gz|.7zip"; public static readonly string ImageFileExtensions = @"\.png|\.jpeg|\.jpg|\.gif"; private static readonly string XmlRegexExtensions = @"\.xml"; private static readonly Regex ImageRegex = new Regex(ImageFileExtensions, RegexOptions.IgnoreCase | RegexOptions.Compiled); diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index c54be44c2..1d27c3b42 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -1,14 +1,20 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.IO.Compression; using System.Linq; using System.Xml.Serialization; -using API.Extensions; using API.Interfaces.Services; using API.Services.Tasks; using Microsoft.Extensions.Logging; -using NetVips; +using SharpCompress.Archives; +using SharpCompress.Archives.GZip; +using SharpCompress.Archives.Rar; +using SharpCompress.Archives.SevenZip; +using SharpCompress.Archives.Tar; +using SharpCompress.Common; +using SharpCompress.Readers; +using Image = NetVips.Image; namespace API.Services { @@ -27,20 +33,46 @@ namespace API.Services public int GetNumberOfPagesFromArchive(string archivePath) { - if (!IsValidArchive(archivePath)) return 0; - + if (!IsValidArchive(archivePath)) + { + _logger.LogError("Archive {ArchivePath} could not be found", archivePath); + return 0; + } + + var count = 0; try { - using ZipArchive archive = ZipFile.OpenRead(archivePath); - return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); + using Stream stream = File.OpenRead(archivePath); + using (var reader = ReaderFactory.Open(stream)) + { + try + { + _logger.LogDebug("Archive Type: {ArchiveType}", reader.ArchiveType); + } + catch (System.InvalidOperationException ex) + { + _logger.LogError(ex, "Could not parse the archive. Please validate it is not corrupted"); + return 0; + } + + while (reader.MoveToNextEntry()) + { + if (!reader.Entry.IsDirectory && Parser.Parser.IsImage(reader.Entry.Key)) + { + count++; + } + } + } } catch (Exception ex) { _logger.LogError(ex, "There was an exception when reading archive stream: {ArchivePath}. Defaulting to 0 pages", archivePath); return 0; } + + return count; } - + /// /// Generates byte array of cover image. /// Given a path to a compressed file (zip, rar, cbz, cbr, etc), will ensure the first image is returned unless @@ -55,14 +87,39 @@ namespace API.Services { if (!IsValidArchive(filepath)) return Array.Empty(); - using var archive = ZipFile.OpenRead(filepath); - if (!archive.HasFiles()) return Array.Empty(); + if (SharpCompress.Archives.Zip.ZipArchive.IsZipFile(filepath)) + { + using var archive = SharpCompress.Archives.Zip.ZipArchive.Open(filepath); + return FindCoverImage(archive.Entries.Where(entry => !entry.IsDirectory), createThumbnail); + } - var folder = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "folder"); - var entries = archive.Entries.Where(x => Path.HasExtension(x.FullName) && Parser.Parser.IsImage(x.FullName)).OrderBy(x => x.FullName).ToList(); - var entry = folder ?? entries[0]; + if (GZipArchive.IsGZipFile(filepath)) + { + using var archive = GZipArchive.Open(filepath); + return FindCoverImage(archive.Entries.Where(entry => !entry.IsDirectory), createThumbnail); + } + + if (RarArchive.IsRarFile(filepath)) + { + using var archive = RarArchive.Open(filepath); + return FindCoverImage(archive.Entries.Where(entry => !entry.IsDirectory), createThumbnail); + } + + if (SevenZipArchive.IsSevenZipFile(filepath)) + { + using var archive = SevenZipArchive.Open(filepath); + return FindCoverImage(archive.Entries.Where(entry => !entry.IsDirectory), createThumbnail); + } + + if (TarArchive.IsTarFile(filepath)) + { + using var archive = TarArchive.Open(filepath); + return FindCoverImage(archive.Entries.Where(entry => !entry.IsDirectory), createThumbnail); + } + + _logger.LogError("Could not parse archive file"); + return Array.Empty(); - return createThumbnail ? CreateThumbnail(entry) : ConvertEntryToByteArray(entry); } catch (Exception ex) { @@ -72,45 +129,53 @@ namespace API.Services return Array.Empty(); } - private byte[] CreateThumbnail(ZipArchiveEntry entry) + private byte[] FindCoverImage(IEnumerable entries, bool createThumbnail) { + var images = entries.ToList(); + foreach (var entry in images) + { + if (Path.GetFileNameWithoutExtension(entry.Key).ToLower() == "folder") + { + using var ms = new MemoryStream(); + entry.WriteTo(ms); + ms.Position = 0; + return createThumbnail ? CreateThumbnail(ms.ToArray(), Path.GetExtension(entry.Key)) : ms.ToArray(); + } + } + + if (images.Any()) + { + var entry = images.OrderBy(e => e.Key).FirstOrDefault(); + if (entry == null) return Array.Empty(); + using var ms = new MemoryStream(); + entry.WriteTo(ms); + ms.Position = 0; + var data = ms.ToArray(); + return createThumbnail ? CreateThumbnail(data, Path.GetExtension(entry.Key)) : data; + } + + return Array.Empty(); + } + + private byte[] CreateThumbnail(byte[] entry, string formatExtension = ".jpg") + { + if (!formatExtension.StartsWith(".")) + { + formatExtension = "." + formatExtension; + } try { - using var stream = entry.Open(); - using var thumbnail = Image.ThumbnailStream(stream, ThumbnailWidth); - return thumbnail.WriteToBuffer(".jpg"); // TODO: Validate this code works with .png files + using var thumbnail = Image.ThumbnailBuffer(entry, ThumbnailWidth); + return thumbnail.WriteToBuffer(formatExtension); } catch (Exception ex) { - _logger.LogError(ex, "There was a critical error and prevented thumbnail generation on {EntryName}. Defaulting to no cover image", entry.FullName); + _logger.LogError(ex, "There was a critical error and prevented thumbnail generation. Defaulting to no cover image"); } return Array.Empty(); } - - private static byte[] ConvertEntryToByteArray(ZipArchiveEntry entry) - { - using var stream = entry.Open(); - using var ms = new MemoryStream(); - stream.CopyTo(ms); // TODO: Check if we can use CopyToAsync here - var data = ms.ToArray(); - - return data; - } - - /// - /// Given an archive stream, will assess whether directory needs to be flattened so that the extracted archive files are directly - /// under extract path and not nested in subfolders. See Flatten method. - /// - /// An opened archive stream - /// - public bool ArchiveNeedsFlattening(ZipArchive archive) - { - // Sometimes ZipArchive will list the directory and others it will just keep it in the FullName - return archive.Entries.Count > 0 && - !Path.HasExtension(archive.Entries.ElementAt(0).FullName) || - archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); - } + /// /// Test if the archive path exists and there are images inside it. This will log as an error. @@ -119,62 +184,100 @@ namespace API.Services /// public bool IsValidArchive(string archivePath) { + if (!File.Exists(archivePath)) + { + _logger.LogError("Archive {ArchivePath} could not be found", archivePath); + return false; + } + + if (Parser.Parser.IsArchive(archivePath)) return true; + + _logger.LogError("Archive {ArchivePath} is not a valid archive", archivePath); + return false; + } + + + private static ComicInfo FindComicInfoXml(IEnumerable entries) + { + foreach (var entry in entries) + { + if (Path.GetFileNameWithoutExtension(entry.Key).ToLower().EndsWith("comicinfo") && Parser.Parser.IsXml(entry.Key)) + { + using var ms = new MemoryStream(); + entry.WriteTo(ms); + ms.Position = 0; + + + var serializer = new XmlSerializer(typeof(ComicInfo)); + var info = (ComicInfo) serializer.Deserialize(ms); + return info; + } + } + + + return null; + } + public string GetSummaryInfo(string archivePath) + { + var summary = string.Empty; + if (!IsValidArchive(archivePath)) return summary; + + ComicInfo info = null; try { - if (!File.Exists(archivePath)) + if (!File.Exists(archivePath)) return summary; + + if (SharpCompress.Archives.Zip.ZipArchive.IsZipFile(archivePath)) { - _logger.LogError("Archive {ArchivePath} could not be found", archivePath); - return false; + using var archive = SharpCompress.Archives.Zip.ZipArchive.Open(archivePath); + info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory)); + } + else if (GZipArchive.IsGZipFile(archivePath)) + { + using var archive = GZipArchive.Open(archivePath); + info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory)); + } + else if (RarArchive.IsRarFile(archivePath)) + { + using var archive = RarArchive.Open(archivePath); + info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory)); + } + else if (SevenZipArchive.IsSevenZipFile(archivePath)) + { + using var archive = SevenZipArchive.Open(archivePath); + info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory)); + } + else if (TarArchive.IsTarFile(archivePath)) + { + using var archive = TarArchive.Open(archivePath); + info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory)); } - if (!Parser.Parser.IsArchive(archivePath)) + if (info != null) { - _logger.LogError("Archive {ArchivePath} is not a valid archive", archivePath); - return false; + return info.Summary; } - using var archive = ZipFile.OpenRead(archivePath); - if (archive.Entries.Any(e => Parser.Parser.IsImage(e.FullName))) return true; - _logger.LogError("Archive {ArchivePath} contains no images", archivePath); + _logger.LogError("Could not parse archive file"); } catch (Exception ex) { - _logger.LogError(ex, "Unable to validate archive ({ArchivePath}) due to problem opening archive", archivePath); + _logger.LogError(ex, "There was an exception when reading archive stream: {Filepath}", archivePath); } - return false; - + + return summary; } - public string GetSummaryInfo(string archivePath) + private void ExtractArchiveEntities(IEnumerable entries, string extractPath) { - var summary = ""; - if (!IsValidArchive(archivePath)) return summary; - - using var archive = ZipFile.OpenRead(archivePath); - if (!archive.HasFiles()) return summary; - - var info = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "comicinfo" && Parser.Parser.IsXml(x.FullName)); - if (info == null) return summary; - - // Parse XML file - try + foreach (var entry in entries) { - using var stream = info.Open(); - var serializer = new XmlSerializer(typeof(ComicInfo)); - ComicInfo comicInfo = - (ComicInfo)serializer.Deserialize(stream); - - if (comicInfo != null) + entry.WriteToDirectory(extractPath, new ExtractionOptions() { - return comicInfo.Summary; - } + ExtractFullPath = false, + Overwrite = false + }); } - catch (AggregateException ex) - { - _logger.LogError(ex, "There was an issue parsing ComicInfo.xml from {ArchivePath}", archivePath); - } - - return summary; } /// @@ -187,29 +290,39 @@ namespace API.Services /// public void ExtractArchive(string archivePath, string extractPath) { - if (!IsValidArchive(archivePath)) return; + if (!File.Exists(archivePath)) return; - if (Directory.Exists(extractPath)) + var sw = Stopwatch.StartNew(); + if (SharpCompress.Archives.Zip.ZipArchive.IsZipFile(archivePath)) { - _logger.LogDebug("Archive {ArchivePath} has already been extracted. Returning existing folder", archivePath); + using var archive = SharpCompress.Archives.Zip.ZipArchive.Open(archivePath); + ExtractArchiveEntities(archive.Entries.Where(entry => !entry.IsDirectory), extractPath); + } + else if (GZipArchive.IsGZipFile(archivePath)) + { + using var archive = GZipArchive.Open(archivePath); + ExtractArchiveEntities(archive.Entries.Where(entry => !entry.IsDirectory), extractPath); + } else if (RarArchive.IsRarFile(archivePath)) + { + using var archive = RarArchive.Open(archivePath); + ExtractArchiveEntities(archive.Entries.Where(entry => !entry.IsDirectory), extractPath); + } else if (SevenZipArchive.IsSevenZipFile(archivePath)) + { + using var archive = SevenZipArchive.Open(archivePath); + ExtractArchiveEntities(archive.Entries.Where(entry => !entry.IsDirectory), extractPath); + } + else if (TarArchive.IsTarFile(archivePath)) + { + using var archive = TarArchive.Open(archivePath); + ExtractArchiveEntities(archive.Entries.Where(entry => !entry.IsDirectory), extractPath); + } + else + { + _logger.LogError("Could not parse archive file"); return; } - - Stopwatch sw = Stopwatch.StartNew(); - using ZipArchive archive = ZipFile.OpenRead(archivePath); - var needsFlattening = ArchiveNeedsFlattening(archive); - if (!archive.HasFiles() && !needsFlattening) return; - - archive.ExtractToDirectory(extractPath, true); - _logger.LogDebug("Extracted archive to {ExtractPath} in {ElapsedMilliseconds} milliseconds", extractPath, sw.ElapsedMilliseconds); - if (needsFlattening) - { - sw = Stopwatch.StartNew(); - _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); - new DirectoryInfo(extractPath).Flatten(); - _logger.LogInformation("Flattened in {ElapsedMilliseconds} milliseconds", sw.ElapsedMilliseconds); - } + _logger.LogDebug("[Fallback] Extracted archive to {ExtractPath} in {ElapsedMilliseconds} milliseconds", extractPath, sw.ElapsedMilliseconds); } } } \ No newline at end of file