From b9d8d9940a0557f325c03105b090702344284965 Mon Sep 17 00:00:00 2001 From: mullak99 Date: Tue, 29 Jan 2019 04:00:31 +0000 Subject: [PATCH] Added FAES_CLI files --- .gitattributes | 63 +++++ .gitignore | 261 +++++++++++++++++++ Changelog.txt | 11 + FileAES-CLI.sln | 45 ++++ FileAES-CLI/App.config | 6 + FileAES-CLI/FileAES-CLI.csproj | 77 ++++++ FileAES-CLI/FodyWeavers.xml | 8 + FileAES-CLI/Icon.ico | Bin 0 -> 370070 bytes FileAES-CLI/Program.cs | 330 +++++++++++++++++++++++++ FileAES-CLI/Properties/AssemblyInfo.cs | 36 +++ FileAES-CLI/packages.config | 5 + LICENSE | 190 ++++++++++++++ README.md | 2 + 13 files changed, 1034 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Changelog.txt create mode 100644 FileAES-CLI.sln create mode 100644 FileAES-CLI/App.config create mode 100644 FileAES-CLI/FileAES-CLI.csproj create mode 100644 FileAES-CLI/FodyWeavers.xml create mode 100644 FileAES-CLI/Icon.ico create mode 100644 FileAES-CLI/Program.cs create mode 100644 FileAES-CLI/Properties/AssemblyInfo.cs create mode 100644 FileAES-CLI/packages.config create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c4efe2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,261 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/Changelog.txt b/Changelog.txt new file mode 100644 index 0000000..140be54 --- /dev/null +++ b/Changelog.txt @@ -0,0 +1,11 @@ +|---| 1.0.0 |---| + +- Initial 'public' release + +|---| 1.1.0 |---| + +- Added support to change Compression Mode and Level +- Added support to get Compression Mode of encrypted files +- Added support to get FileAES-CLI version +- Replaced obsolete automatic FAES_File encrypt/decrypt method +- Fixed minor spelling mistake diff --git a/FileAES-CLI.sln b/FileAES-CLI.sln new file mode 100644 index 0000000..3574624 --- /dev/null +++ b/FileAES-CLI.sln @@ -0,0 +1,45 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2008 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileAES-CLI", "FileAES-CLI\FileAES-CLI.csproj", "{AE1C86EC-831A-4A44-96AE-CC2CAA585B51}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {426A39D5-8FC6-424B-863B-8AE5EDE05253}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {426A39D5-8FC6-424B-863B-8AE5EDE05253}.Debug|Any CPU.Build.0 = Debug|Any CPU + {426A39D5-8FC6-424B-863B-8AE5EDE05253}.Release|Any CPU.ActiveCfg = Release|Any CPU + {426A39D5-8FC6-424B-863B-8AE5EDE05253}.Release|Any CPU.Build.0 = Release|Any CPU + {B506A302-A7F4-4FFD-8DD6-22119F9AF6FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B506A302-A7F4-4FFD-8DD6-22119F9AF6FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B506A302-A7F4-4FFD-8DD6-22119F9AF6FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B506A302-A7F4-4FFD-8DD6-22119F9AF6FD}.Release|Any CPU.Build.0 = Release|Any CPU + {08B774F5-E7A7-4AC9-AF6D-1F614D849996}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08B774F5-E7A7-4AC9-AF6D-1F614D849996}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08B774F5-E7A7-4AC9-AF6D-1F614D849996}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08B774F5-E7A7-4AC9-AF6D-1F614D849996}.Release|Any CPU.Build.0 = Release|Any CPU + {EB18B785-8D8F-4446-B9DA-3F9505CF580F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB18B785-8D8F-4446-B9DA-3F9505CF580F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB18B785-8D8F-4446-B9DA-3F9505CF580F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB18B785-8D8F-4446-B9DA-3F9505CF580F}.Release|Any CPU.Build.0 = Release|Any CPU + {98E9CFC1-84D8-4BD0-B728-97A9E294DA6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98E9CFC1-84D8-4BD0-B728-97A9E294DA6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98E9CFC1-84D8-4BD0-B728-97A9E294DA6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98E9CFC1-84D8-4BD0-B728-97A9E294DA6B}.Release|Any CPU.Build.0 = Release|Any CPU + {AE1C86EC-831A-4A44-96AE-CC2CAA585B51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE1C86EC-831A-4A44-96AE-CC2CAA585B51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE1C86EC-831A-4A44-96AE-CC2CAA585B51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE1C86EC-831A-4A44-96AE-CC2CAA585B51}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C438D00A-99B5-4AD3-AC69-77EE1781CC4D} + EndGlobalSection +EndGlobal diff --git a/FileAES-CLI/App.config b/FileAES-CLI/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/FileAES-CLI/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/FileAES-CLI/FileAES-CLI.csproj b/FileAES-CLI/FileAES-CLI.csproj new file mode 100644 index 0000000..eb8be31 --- /dev/null +++ b/FileAES-CLI/FileAES-CLI.csproj @@ -0,0 +1,77 @@ + + + + + Debug + AnyCPU + {AE1C86EC-831A-4A44-96AE-CC2CAA585B51} + Exe + FileAES_CLI + FileAES-CLI + v4.5 + 512 + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Icon.ico + + + + False + ..\FAES\bin\Release\net45\FAES.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/FileAES-CLI/FodyWeavers.xml b/FileAES-CLI/FodyWeavers.xml new file mode 100644 index 0000000..56ede02 --- /dev/null +++ b/FileAES-CLI/FodyWeavers.xml @@ -0,0 +1,8 @@ + + + + + FAES + + + \ No newline at end of file diff --git a/FileAES-CLI/Icon.ico b/FileAES-CLI/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f159f35b830c930a45915e88aba1e75bc3b7c18 GIT binary patch literal 370070 zcmeFa39MvEc`jH@({9?B!Ip=yJr*{I=fNJ!!|R6_&ZebWLXG}EX%Si3!#|ri*w>+oRcRr zPi}Q@R%JxPI*RfwZ_N%{o4F5iGZ1kPSj$Pv22aMNW#ryv+ z-utir)qMSX$Br$%@7S@29x`74{v*eZ{mv(j9gD@x*YCRP*k{AM=f4je`~45R^Vn4S zu4BKCSA4_=KzGUi@f-ME=RYCDU2CQ6gWtcIr zRcvn?w1aDv)^HEnG3a1_Q{=OWujBjo^85SSYj2eDNm0%xM5UM#YvruisN}`wdQog| zl*P_gMeO0b{NB|o+hS|8BC@Hd_5IzA@*BlWOq8;*hQGn~WU?7iE*C{Q9-#I2*c-{vk{CaCN@Qbx`5QT0BXbiXwlFEufd$)`7BW#0TAH!GUrL7Gi2LW|^D~iU z>o@XfdmP^{=i)ZLdE0NW9~@Kp8|Zf_pAzY4P%KT3Sl`Dp-U!Z(i|Ep{>u+#O zt>1u*#qo@Vv0>}`@ulfEd>H4z%w@sf31Pg$i&G-9G$W#D6F;8_E{bG$S){-x{%vmL zy!HLm(#*!v`0&qWFP-}rMRS+V{p;LFeVVy=rU?1JoASR`NdI~z8{aD=L%%TiPZ@Bh zLNffH_-uM7ow$$R)u|X>{%B%(<_+}cTk%DM61WF_Qxg7G2rd1Q{+(mTgy@8*XFdRW z2&D8(OzJkgq5ZQz^Voawrw@WY)MI)-eqZV+_52$fm5=OgRo+}*$-lMMODbi*^M8E! ze|r?qf46!zuh+L$hpt}T5x0WA@c8FWIG=xQqcU{mU`y=pZHP)aCo0e@m6g0jtGJg0 z9k*I3)TOo6f>>KE)(~|wf1l*`{HyCLLwt6*2t5qFNS#l;K)t_ON=rROT_^QFoyA=;8sA!X>47Td7X zqzxPs{yypRk3Cv5{s*hYA=4*H=O4TQMug$?f_3mBP^W zW?2;QOsNyQ(1tCH$^62Cs8m+P=H{kICSu@K*|qeWs3m?$e)^_O{(NIAxM@&EMZxD+t%;7c)Z}m7K`J zhUODNJpWT7hpXa65o1zHM{T&M6w|;6@KMf4Tx{U?%Xm#6gU`}svQ$XpGdZyidj8Sc z{_hmhLu>e*H2e|z3eSJ$(;^oSNM5iF*;qhCXU9YucCQS7ifxR}j*B>ai7+UIzb9b> zW4K>ITemRQ(nm9KQG_4I-zPo)=x1uie>wW zUXssG!>^EI;Ale{efHzoG5AJNj70{Yi%pM8d7+Q&)`mQA#owo1dG52Ht{MN0Ol+tK z%*Wx+&{t#sQ)ml$;cP<|x&50!Zx)aYl zEqzY%qFx*L%rM5^i>}Tj3|#XW&wl1pHRHdU2oG_b!;s+wH7S5Xo&p`VNB_7N5EV9+{vKfch_qJpU-h{YeNCC*TTXge1SEw zv9T#aJ|hNjdwwMv7-C<8kgFKvN&5U4hh}Xc78EvX+5mY>#Ut=%3ef*05epcy{p_b} z$A2Z_A0poaX1t)cf$ujPhq`SreV7C=Dt`yR_3Wn~so{S)>>DEA{WD`CN?apm>1G?K zSNQv+XI!3N3M~)uc|Pc|@ce{p8=CP#*ON|OP_OX!Np8-AN^k#9~O%fq)W0rY|}DuE(w3<7$HuTbd$A@$O@*xx_z8{~xxh+t>A6@|!!E#E0}} zI`6++$lV895Y9#Y|1R}D?N5h<|CT zhaUUiKlGs|juQRKFW>ht+I~Oiy?UF~{g(^byIbu*UfUSY5NZ_Z^B&G{{DuD2A5fd9|z8jNIBba#ylF_}oS*+r0gl6Ebpj>$3eu z9^cISb%#_eh#Tu=*&eoOy_jj*{(a;#nO9;yFN(OriUBbv;*}3FPvMmh zkk@*AVB6R6J1W<;R!BE({~r3R=HVjnjoE&K(EeWa0b{HBkOw}>h|9LOH^48<`{j_s zLXMVgTFs}LwtttoU&-ec5%Dj`yh61P$aOUBgOLksga;{0X8vkd!vk}?*lL)AsK`hfr^j!pNDZ_*d^ki9USOK2-TouMci~kg{&h9j~vgh;k`w zwFmaMY5TX$93gdJ2ss4Cu9r>@A*LH|Lzb$1sHa;S=_SsytUyn*Eu@u9ym|Za9XVd; zM`#H-5VW5;yV27p+LR@4eAsc(t+M^FbE-Wn=~&bDZy_fou?Kq;M9zzOvClvHSuuk4 zyUG%BNzG-c$_GQ1kZ;HMl#vsr4Wz8n#yRZ+=eo+s)2Q~8Q_-gF--NuauaI&gi1>`T z@-II2IWcnTC6P~6^TjgfiTqd&d5ojub%#XyG??vuj+H2Tq=JJ!w zyW{tZ`1?Bgq2{~vKCGZ`oclN0gZpHpY5OBu^0CE+~JzDLDEEV)Vp#7ZhX0A7e zTu2rR0;9C_gk^urqF@RYu&&I=fJnzGMY z2sJ-YN`#xXf1UFl=mUxM8P)a=Nm(*-Q3fBFv(KSV%mD?^&hW&rh+{4zg1mhM^9Y4b;0G~TosZGxt{pxf=bW>s3F5pO?LOunon9)XJKMme-K8YP3lIBTx`<*%)KS(aj9d#>qY1i&dX#%LD_!F zQmcKC?T3$`Fz79Qpiat(BJvxoVPktpu!Bw8UxdvuFzOSF(A5dpq`>r~m>oH9%yY31 zXb<(07g>tHo+a=dd;H+;^Reb36!fE>B#yY3^`zS(8VO_W+|U~-fAjViAk!+ZzW|*f z=Nr)nV~z~-eR9svJ0CdyoFAhs>3wkHLpmN7(}*9V(HPpkgS^Uth=d`7h-2BNlyAQ2 z_~(HaHMR?Qwl!C1_8|#*YNZc3=zh-kyZYY5gof!dO5b)jy>Qae6-EW0$QFxHJ*7~69)F642#rztJAZ z@$5v?_9vlhR6W5w@Jk*TbOBcoY5+)ck}gV&5GTaCPSjnJ;6KmX=#tdS^RO+nFI5`B zy-Bc}w4K!7sx4BEQA2?FqmP1I=kLB!$la5G&l^Mx?ni#W$5^l(!n1u2VjSEKS-*pJ zAolz|+WujXtwvkT;eDl$y(h6S^`C6>41D&>h+RiczbG!9A|3ZmCy$F^d|ndoYv={M zM{@p6y|1pu-}&s((?bIF8*icQod1>U2vocE>s~UtycrLDb0xI=t;F2a-vq`keRpZ( z;@>ZgTmW7C9%*@$H2nSL%fsLINxJlX-`J%e_!W(h{2(ws@-pr{d)eeO`Zzbczm`vb zY%LvoOXe65`=}V`R$fb~@Xt5Xv9;}R&=s%E`tY@K@$Q{e>|8PG|K}9)D7T6jSCnIc z@9iWaA8*!1FMofnn0xPPG*HI6q5rgOp;@!m?bnEz|7{HuhneX~TOF2{b~gLW)pX(y zP*3)k5!ka3bZj??zll1rKif}4KiI4to&Npxa^b_^$wywzrtiO=PTYSj6~F&FN!{bh z*Vod?`)_1Y_rtE-&(A|QeB`xK{v%%n;Wz%spdzl4ey^Q&K_B5C*F+7jhcOPU(|QOL z1F1T#V_5U*{8x{+_#ErC?ghR3Hlq93uX=sf-^b@ztH#PU)+PP%Z9pGKAN~NuHG>Vu z;FVnZxAzK}`HX)l9iE-4gk~n!`k59-hqL$o(l4nRxnFPA{~KGY2iLCcira}sUwUy7 z{br3I>n|JfA8RXb-cEgIU*?A|q`mh4+UDxbt5>-W@^+z}7W-ehc?C6!w-e0|pZCoF zs~hP5fl;@|>pJSJ;?bZ;kYYN8@Y*Egv=X4Cq%f`;VJ%ZqQbeQ@4#GOCltoe8+bNB8 zUVHk0&GFLP z&-=NH-uZuJy?m2vq7}u$zUtZvmoZSaqn(Ta>)MR^h|b1_0K2+ODpx^#5S3bW_!a@)`{-oAaFgFb3OFpXlx9{oKWK zp7kHr*56dMuDnK2FRj+6$$24F3*v$WS<`b1^}#0e#@cF0Y;FKIsQKO6+7QJe*DvO* zdR_LRmHzKn(0`?iaAp6CsJ~ESpz2Nz8w;BoE8_ClWs%F}upduW?C$P~>({P}LZKkn zk#6Dd><4SjXItPu_BOaFbrE$k2zweC^R(I+G?Rl{p%b}3!}$vrgx`<3>6-p8pgy{2 z)GwkBvlqO}Kl?B11~;%*28jJH%tMAy^Qh~CW>~n@Ix!v%ShdlrAFcF%m;GnWok=0pf8^VbKl!+L>fwiw zcjx{NM^7ix-pl@L?WZ1SssE+yO;wxCE9-MP$4wbv&Gi$X{3PmrQ2)l-6>SWf$w4PN zkut2X+{{m;zpl5RHDfd9z2kou{a3Z!ysG}QcI^wO*<=4RsC%lf59lY^>lWJf6T!Q6 z?xBR5?M-tGEZYSAR}(KlAF%&=`*}Ze{)}h+w^PjAWSzRA0M-kry3pfKJSLue@Ilma zvH$KmF^8I%668bHuGjIAC<|ry&#Z$c@t*OMtUpG~M4qwVtQBQVdmO)+!Q4s(pQRi$ z8Uw~Fs_p99QvVB?o2tlfa zaGeYHR|wCcZh0Ct@Th0yngFiL<5=*ytmRLk&LRSR8^N4R610xLZGbNl2ld7Pz8?K` z)pm8AIp>}K+l4gxZ`Atp>Noq(F|hiN8U$$*pcCwJVC=iY8g@C-rai1W5M%C3*mn*wme+&$NRc}A{J8G%_ z`P5BSo6oBs_D!xVb2NHW0!!7IAnDZ_4HGy zGg(BxL%5RXamddqp51B=WgF`(>96YT=Y4DaPu`@yR%G;_`#Sin{&UV+=|ndZQA*0BFe7f;K5n7AJ&_k)@|Gb9#KQ^cC+1jZ?hG2j}%Rn*c`f3-3OT%W=I ztG27_^tscX^*{EOx>?S1U8+IL&{L`=SMi^<&q^oCJ+JD@fl;^5v5KJYT(dC^K67ml z_hOnmcLH_nXXLoB9x{o#KJuUYppb8B&6L+MU>=G3L$zI9TkgM#@o`-yPQh>1+FJbw zKiPk44AB2Za=;pW>VP0*e+lx={!tcoU=QXY16*Uoy38c%_692z!tPR2J}~D zY;N{}_NKM|$8YN2XM0)e%Q2|-ANH7QF7z>gy{b0`v=Ir^KZVi%W!MAm+eZCIJ;?rN zF}Ac1F;o7zPii~)L>aFwJNq9K(`UWQ|3)T$lfJB?CAJssVg0n~e**T2`k-bE8puH$ zzmo%h{g4Ac_{;s@xTcJ2;EH%2YXm71a(xi|2=>37F`&Py+HPE<=>I9t_}@s!Zqlz; zv;_Y|tuavkA8Xf*dU)?+kcGT(U1AdBz%ig4Q0^C556XM?9mH`a_S=aY=_3S|=B&0G zeTcNw|8?|V+Hu-)(4t(ggMH25gR1_=QPZh(f~y?V!2;HLh%#(q8L|^a-y^hpSU*S{ z$i8D-i395GcE^DJy54@?Pqn~*?5%gx@ac^G?-t>ss`^!D{~L}$9V~GDA@w}h5O55Z zhR=uu>WTBP5&F7;cE*7FWzt{O+nF1vlPe1%H zYPaVso!D>;>d1le4`Qqz#d;oH-*z$vjGO4M>g~@bgXsTB&-llFRyUPz$E)7|>5CVz z*XCzX`_1(q+#k=d3k}DhjvR0d*#7|fPd(L*e4^^V-hTQgE%iSUzDa*Y(LC2Hv4$Hm zu$oPa7qD)X^?gbw%C%RpjSa`3jvUDT!{1T4bz>ahchPq1aiggZn&nU!Khs}TZRa%$ zYNh|H@z70W*Lj^s`x00;!7<23!{Q5{dsMDn;2ww7G4LP-xI*=THoDdROPx;p4w^^(I@fA&45H92*z?_x2f0qC z#W8ST!RkM-py$%Oj6n`IdVG9bWRUyLVh&_~Zy)Y zsn)vjI){3FwN^#Rfx?4f7g`(xO%5322H@|~Mk$@>6$|l5KnxEfjtF9Hq@(}y^Yg%? zu@@h&t@fW-Rx}4+g?Nuc=P5a``fu8Wma$;U0sVjw{6BjR#amvvgmthpGgwC!M-7CW z|G<9mSFTF_&x8L}-MlC!PoMCt|5u`cn}%*T_CKA4ymMbcw=uBBp#}@aKD5nrVwQFk zRGUAjj)51QNWI8B2lsAG#oz7Xm@q+Z%wDz+fE%%@NG-(ETi|Tqm_c4(EQHNNte3m+SWiMku8CW#ecdPa@R%x~W zlxsyZ$XCez!)HBgIq-r7`fIA~>NmA&JY{kN^RY%&HMa}_Vx?SeO*STBd-$vOOtjd4 zef`Qb_K8vJ^}NbK{W0*M6CFNMYql{V{WZP)yl<)h!KIth-qGfPrqF-2$8;-la9CKN zzoxgJI&0#jclj>{7H?Ym4zfNqd{*|~(-;6Rl)Y~IiLKa1_Fr#5Www?6V{h-9YHh9j z?!_~5-6`iVc(zjj`5>;p<#8dsOiZE#^0P?ih*h(_ZQAH~K&1 zS^pLM3pW+sd1W8D=6Po19CTqbLVh2gt)=Ss_&eTytNNYh&ow@)*2e4Y=l#SRZvQUA|1%1zh5(CosRVbm80+=zGmsZ~B@q zb^k`C{N67Yb60N^vaepvroOxt3%_3UE&f?*Zu+m{)05wdO;5ZD`gUB=%;euBNV8Lt zlDH=4rv5fLH!TU@`%Y?p<~wQ90%`WG%%Y9Hn^~L#&6=d{=l%}wHzM^teum$bzl-1h zPG({DZ*xoY-!A!={%RxWpS<^%?rF+*)qh^m_fKsVQvV=pyx~*z<8?is`j7owDw&;` zcHNgi@2}fE)@k2&fQ|B2GqHbHb3y%Z<(^_&*~H%-BxANS3f=nXC6uH44T6qTlV*>fn_YdLTTHJSl z#29oyhd&02ALI@9I^kX~UGbmzJLc~(*TS>Ix$nqFK-}Z*V*@%8V?bVTKaf8J{Vs@k zLC^c+G}3+e9rB;Q#ozo8h|l33I-dYNFrXtd2IL9lfO%2sWbXCUu@3l^d+)vbm*4fS z``+=6cf9YeyYBiu{3f44-aj~?!yf~9cZv_h;>SVM&%X_#9q2f3g52rwmo_Rtd}Y1z zKW?m*e|)`Cdiz?XNczcu4top=Z*N3H-~3l2a2qz2N_svgza34z_Nqz0+>Dz0j^*-xXVl=y!U-|5wt=i7_r~A=arXgyFZ)=#y$1dh(VqGL&G^4CKO;sjo)e?P=f!13mvC>R3*z#~ z1u<4b7sc49oyPHc{PM61UBY{p!~|(f(FpGCG>O-fOI zm(}ZC{EfVq>$teS+gjs|Js-?{AB=qu%=28;J{VZnX4?+~djnPXxWXPW+$Tov6;s`} zP41b)vtQ+YYT7>3*dsvgZD?J&x7J3<+F#4sZ*Rlc1Jt(X8ul16&UM%Jtj3<(+=p^k z(GKph7u_Cdmt^dxypOBelbQQjE0W`Lp!T&^n627u>A%SR=y!~G;u@~b90PK$laPS} z{Eiy$de@%vAN%mCemSq)OMMDhwDx`J(h7V!+ zuQnO5pHXoY@-PjZ!tXlA-S!%`x2OEyUaR~3wbi1X|7xEHsRvq@f$IK1)CVqlfcRJB zRSz5i8L0A~vd~Bds(OHN{S@pAF>m9yrf1aqz2yHs`LFGtuivjh_uBAJ{1zO=UpsAy>~9Kqf6az7W7gN7&2hv zf1UAHwx{>}r=6=Mi~q#C;=Q`|(iSKkP)`Q5{eq<|c#r{$|DOGU)@8uE9@s_B&BQnis0oWy<_axa4}%Ro~-aGT43;y-n~bKIS;HxrSb#eaK} z|H|*RUnTz$tI_|r?d70!Knu1&-{W;)3$XVM@jp2Z+s|0TKJL!fJ>@_4<=&O?4`U!Z zt*!w7HvXIYgzNmb$$%Lbb~7$$M-TKtY{rVLp5Af5ji2y0#)VH`m1WHhj9xO;M?=igY@KGvSgr2P#&V4?X3-Ja@>5ffxtr zME*};KQU{+L!JNJ1GAw|cxT!I<`H?$)5z$k2!+GKhx3jSi6pR&Saov?cK@n)_0?C! z{{Ftf{}lG@_Xotx%#7HQv5B1rchWN0i3?o+nS863ffW;?Ms3e;57$&PwpW|LN&zu?`)kk3a8uZdC92uW};x z>x#~Q?y;?Sujzp!X$ua~9|(s7;^gVm;?l^7n3=_y8XoaKHHAI&;cr*xDhyt1Z>@m; z;hx2RJHUp`4pIl1v;r(nO8i&%JMD!G^i7^n_tDH)$vI~fiG(EoFJH#KhKYn{{ZIa{ zlyDBBHvYWl85zCff9l*0VkPG@)ob#f`d{DgwxKO(=nu5+6ZWGmD8pwub^450T3Qk} zzwr&v`rp9+t>^zXbfuLi*XB?8UKx3N$$#!~s_l7PBLh}`sF_dLx(xJVY#50I#pq?! z6TqkQ`TTOv<9r_beXnD#{op{{xN!si-+}c1cpfBe1pPmredpxG7WlB9Ecxuw=m4|GO8qpl|YoO>6;Uz%88bM4z5#zgmRXE7<#eZ+Fj%|H`E-_JXdSm8Q#p zZ zuk(58bqV!62LIK$dBzzlc3S{l;1U-c%A8RD(@7C&`wqfks8Wb0Yj*C;zKP$pGzo(u*a44~1JM#sd%0Lra!1+95KDSy! z#`hHeo#XC&y&enoDE>>G+d`d<^Lgqu&odpz{f!c|G>r{=pa(1+06)GHJs|l%HVWJCKK6imuK$*MBo3NW zAL)WE*hAel*EVcX*RsaF4)Kh*wI1_d)!aL;MV#4GfAzZO{D%*~bGw~n@c*2NfAhRt z$iRtbpBB%2>JjlIWI*yCXI9nbh|Duto5qIPS&AO@KwCMY7HxsV9lo=I9B2`KFms{n zjFsW9sr*dqGEl84L1jRdcV85$+4n&tt>qtbN3l9U%Xo z|LkX=10Jg7zfBLg0&m|{WXH%;_I@TAE z--^~?6Uld;*OT#ZFg0o9(EO0 zULG+>20AK*b9+f?o<9TLu`gvj$B+Z`mt$?pfaE)HM!r`dE0p^*ej^t4iAZosL~*`Y z6laV?amGeDv?%g8Tama`GSIpnSd%q>#6Pj_Hum~^Yms2j;{Ofgp7m$x_lo~Kn^c`2 zKpjB*fBw6Le5b#g#^2-6 zM-lv180Q{EakdW6ea_&_r0dAzZ&8jQ8(ZtuwT6^~)@5K-u6HH&^)YweQzm=Me?vEN zJe-tI6aQz0I-6F>KrR0ls`&va2hH^WdB(G#cgfq&+I0uO5lk=YM@yvQZ_(ypN;(2l4IuAZd8v(qR!1pZ9 zqaxqK<=wQ21BZrZS+}0?rR{z4He7>oWGX_j-u` zb=bM;+FX5|Zbs@-o&QP?)bJnUrRN9qT(Q&#mMy6I1H?Gb1d9b0aR&I5JXbpe8K4}* zIPSn)6lZPI<|k=;R>yu{<{^mU)gDF$@`q zfTwZrAqrg($C++L=nC?^Ox^?cJTF-44e}lofewj7UefT-^7y?qV0jzQ*Z`&Qo{|e* zmvQFk-1L~FWy&6OLI~f9;QRa?o^wvV^O{HdXrrwhor?_E`0vpcu(t0g@P7^ZO!~~) z`b_mY2bmwc2>lOyC>y}56aR6X3#eiPZ+ajq^F_=V<$%8=&JT?E=0#v(S}a4)`gmp` z_)c9AC0~JC@+Aeoi|Y`0J~4T&Na|_em7kICnL2>7lLKF`AcuB!eFZok6U#VXZT|d8 zF>&#X+{0oT>)S&n->K^*-|@UOp0x(uDDyJR(dg6-88G=ztgG>MyH>!LUgBT!AN{n& z)aGl&f1c~8%RmkPp-T<^n>ixz)S54->kmXM8K57)vm%*C3d2{Uj$Q_4d4{E-+aU+w zFMWd$d93(s;$F#tj3?mpmtouKI~1T_Qjksh05Sa57V7Il!2QIj<6`{eaWRkc@@N<6 zZ&24$&JxfyWyly~1A9)cbs1bB*}Vxal(RZ=CB{ zm4U|mcaec+aRGERbph=`8u}$pTMYd9OgRVupR@^v4zJ>#e3!NYyyLtieZn$)Ii4+= zq%Q}#WE`*r+rl$B$H4PsU`hC}rXdI&A^8p+PrDJtwSZ^S|CaH%BR|k>J+O`1pfU2F z`H4FC3ed386+CQSZgEHfli59s{o{9g>?%-Eo+1KN`T`h?0Rr0}d5{0jO8 zKH3E61KI@XBWk)oFnUg;=_8uHK_0&mgC6nCW4|5Pd9Gg?!yGpEE8^L}zDsANjiAj) zKyG*q!7eaQz&w$~e=R>?(*wF4;C-96fOWm(zvOY9@h4AKKx>geZ{mO8-{3!Gpq3>6 zFPxF~R`MS*Ks#{anQHv6^Iye>RXKni@MsIvydmR4nHPjjV4VqZ9FaJl76I^|K7q3H zLGXSF_MA2%jnDAAaq5lH^U}soof#6B&%7i?FPs(&kOArsVqWo`x<8E9)Da0hhht5D zyr~Ruu2h$UHe|rg|Jt!v{9s*pd0|3^bJDbE8{%I29$$2_;HIkhnGB+wgB(@aQ^Syxf7<1e?fjm`TqP| z3^ty8FEaN;{^R$U8;By$XXS-p1DeW!&VQu`TBs*f{8zb4xAEtDWzcH4clfWsUg~kR zexJd(+xc(EKt2BVLI#vRpwAxy-X-?w3*i1TeE3E1kNl+$pl$HU^OIi^lko9oAqUDg zG_HsxU{BKiIqB!85N}cjct$$of98RhcOmZ;S-JTx`vde1xi=nhu8+C%o_4Lb{5SV? zQ#p6-s`#JAd8L^MsX7038L;aDueQKFSDc|w2>vn-;MEWQvo>uWem#AIkokT9e%{hW z=zCK)D1U)*LkPKG=85x&5y!f^vZplEJaUAqNV?gSDKQKQ#F(UH?0p#o$BPfh-AdcXi z!Xo7W_JKN{@4kJXJeE9QkEqCk>f?4kMW~X zS7`EImjM+Qb}=p(BmdDJx3O36G0%ON{HO1n25yuN;MI-)DmGNSS65Fm06aFEH_Ra( zq`#k?hpxw!yj}$V1MuBB4?tOE{+2p`^GNg)Xand6FkeI&B=5;%>Js9f`9X<)_yLUn z=!;eBN?l|?>3}ZC0Ot=bd*Xi#{P*`P{#)TX{yO?6jroz$^QUF5U6%pY|LOie@vmZo zMtYzlTL8UH{m*&<@|H5N486Ss+aE=qfOAPX@HhsWZrOau$n@D0A`jluk23N@aXGI< zzDt502*W32-GI!)l#p+;=3{y%16BUlx4(w|?=k<)Tq*OVP9m-h{x8~OpoahOt5klV zBR$Y0PZ$GE8M~KFTRg!n*1-~Zz;$M-#6k2dfVnc)f7bNzaivND-iy~y4`XNC- z0lGu^iE@4kvP0}!wZ-7SnuqDN9^jtotc!OWd-WdU-(K>+jJ~U9Ij_vYO8f(FDN_b$ z2kP_R%n_M+qVC%Q-O?3E$$4Le}Sz?ifJa`3l62ADs*e8~&{BR%K8wRQ)xpx-n1O8zG$|En_K1HH5boHrN+|4YzK`j|WKnFFo#Q2&=PSH^t18~lsc9#B_LaX}q_APc?3n0^)5y}q@Ex!cP!Hjr_F85^*Mi1?TOKYcvNjN$Lo zFSsD*g&AAZCp2>H#vGWN9%$+hv=J9n`ESg3xQ##G>oxyb*TiSIQ4;oc^!zE{AGK1@ z0fr3J=f5EXDo^NL53~~(ur4f&oDS=KuA&xm5Al8mau}gs557zO!&jKW{Ew<5l6D_9 zAOjzUyq7Tn^RE*Bh7PEw2c$0OW?TUMPy8z$yN$nm4?b-ri@TXTCU4kN=d1UdlidTVUgVo$)7Mh=*SDpS9a=#C(awKl!i8z}YW6FQzV>7hinr za|Zs&e?3Q3BLfaw0RO$Gc|!OC#J}P{^J&fZAJFO`Zh5sULz4abqoZj-E zb8_y)x_%4)nhabzF@##lm^k&^vl{=a`GH$v3+lv%)B(&9N&cf2fVISou`L;J+JQsT z0~-~^e*@$7ctBma(kuO+PMzaisEWm%SMvYT*^?r{dKr+^0g!`foC)~)D>uZsFML7r zKZIIKD?iXs547$Nv||g%f7Xcv!GG$1nb%~V)g;Rg)Meoo+XAjB8NoP`@6K^|zV0pm z1Gc&im7n32^|zA$@U3+j2ux3kKmE#A#Mv)=-sJzJmLJgdz+%nZakY-fdtA_}3`qVX z2T1-K_^+N{(G3}BD>iiGh*nWsFgkoe@?RfwxBE(Pxi|4Y@XuN(w`WTJ1M3$4O&Opc znD8x$gN+Sw`uXQf{ZIZgN1$>1-94_>#D13IIH!9MqOzh=RuS}D_H-AnrcVwl>Rz{zx9^?_PQXn1gp;4?sN@7h)E`vQpu*bkE_VZp_#lHSL17-z(M_q$|Sp=3BT;+g%@=BnG_(#r+ z&u}B|dqDihkv~cJbs3l!%M)X=4rms0n27*<1M>ff$bc*V>&SrN7rNBHdGrUIwt#y_ zoWF1ZXM4gY!nqGT{~?*gTJ;k4`P|yVIl$M%tFOE&_x~mTlgSkJi1x|-pE&Hxko>Qe0fXn3U#R%svJ5z4!!FnYo&T&2wsHe?WT0EIA?rt$m*&OkGiO93 z91*YHctxJ=Qsw`4UHp~tlID++F7XQusP$L=W&=!#YbF+xH{x!}14oTabaiDnef|{?8(RD(BSd&KtVxfsSo~ zTGK7}rZd)Yukap}&nCs*9?t(*sbEhstZjviCS~5#jSs!$e}=s0vt5XLAq}4<|EEpz zrUzP=f$ruB>C+~W_f0|uIDc-%^KnMPSn+#AE$bZ^* z=eXNn&-WPrc)lLDYxk1>rwsnvWq|geSGK@yzM%E|fbI`)F5RXF8rBiH`vYB<0q6sR z|G=I$=Fa;B{?;q~|0?`{uB&%GQ@su?Op0NR|8^Ph=o20VTOjKj95T=oThKT*)b#+@ zno9mt_Z}+$@qCrLaa==~JGf?#D5xd{CtKR)#JZi2D)VnFb`Medbzw z&i^|2*ZJQy8Njo2{bsX$N2rFxb8Of_TrjNoUuXQO1A5K>l=%!jx3BIE{=X>qLMQ*b zDFf`AB?r3y(~=Cd?hkZ3E@;;laNQyKuXwD+y!JXH%D&#|f3BOUeWo$j6Tp587f)jU z9OTovAHFvk=$1cVh$r(X={m*l}FYFi+@+4JH0f{=1C5;zzIfpM?Bb z^E=GxXynH_Dv5vWw?O{)N(K(g7Bq|v>*@jIhq_Qh!nMc4XHNll_A%GTpZ8JBy_9?l zJ@fxLM^g3U)jW@JCI2s+#Qs_2e_Jx((H7AE?JIwvb6Y_EU$ppdA9tM}z2`sW&;9v+ ztfL_RL*PBBJsD`h7U+49ZrK9Xx3y72(ra75S^`h}N8H^@{3obmTw;5^=R+Nh&i{c7 zn0qC3qlU!fKe1PD{P{k8?$UDa^nY9YZ_5^V)B|^rEg=36oBwgjALe=8D1d$R&JKOi zI9tuM0iD?bkNyCBf!6(j!;B4E_X(LdIDh(tf&Dt;Po5C}#UA26&OLL?+>YDzMXdE- z#9Auut)<9^dmr{#^9-RhpOQl<=&QIL>+F+E$A&@4z}7Nt};>?s<<~6DMi8>8bv(6hIfDLrw!Dhl z_%r6}E&nmDW^CtnCI2p-dQtiT^aT{1N88&X4eLBw$I>Mc(#*_wypQ zH_T`7Sr)a~hZg&O0iRdIG2{Ix)>XNUx7&L?0&UmggD&e**L| z&>w()3-oT#Jwk}P+ND=8{}+SqclI#|T|JzJXU%)%_jtLwwoU&{{khKf z)ocATxX&-nefO@r?jrAr{oe)s8t7h7XZ+6s|0e%~;Cq069Gb_sDs?An^%rPFvxRVEo>GAJ?|HM7@{(C?jW1sy0YBB#r5;2t% z`^5Ux#nY14Bd1>!!zW)57hd|JNngPA3*vk|8p7WWjXsZO_bZv>hH>RsbIdvR#9d}~ z>gL_=cn5j^-fr<;^1qaS?`Aakc1YrX)X@LfJADy*B@_P>!2T%tf8qr>u4j)wFV4R3 zoH)}%I*s41PtW3Swd)r=*8=okH2tz^!OKV zjJ)s#MX%ysk$SJ`brj#1gx?x{p$_qH-KAIYdxt@F`*Hcj7jBFV9lt(#V(9AZnNtV8 zi|2QuW1}0n+38AYVSea;`jubln$FjG&-<^hSKjwpDgWm$mvV2K^le3_rDyi)<6Ro`{H8qZN}KpWXsqwVN} z>=XLN{{0i^ZS?scchiXbNrW@3zh7rvD(cd28&Yd< zkJ7c-_@b?wh14%z&S!4!#UdZN8~=1(_3Hj>rQ&^GD&!V-bE$t_VI9+eZuuBgFy;rj z)K6Z`rjP&0NB>(_eEe4B1-jsaH}aV`*0G0~+BcPRRRikn7;I(}KYt~k*(oi|z3-lP zzVnt~zMgE{+*rH&^>X2{gKY9gJRiokMoM2VHMsA1Y&gDGv#Iah$fO?p?ce;(p4$0( z{I2&tbiun37x=f*v41Vp*(2IsL+QSc^x!k@-%uf5O3gMvbA@aVTN_|7s@r=Cx$}kKX;RcO5CrH{#F0d%~2;_RD0U2WeZ2SlOyL9yODCceZ z9`p5N;!ju0j2Dk@$HV`~dUCfq#yjb~H0n+dQn7C%ru)dRzUMu+9p>xF!Pi$;-iw@d zyb|{P8`las>&kBT*AdiGtVaU$??xt04E3ddSC6-?y#K~Z@q^dW@z-*`xnBfPQxu%J z%?W*EUti87ufJBv{Z=bubvu6+HsQg8WbChY65+ptZTQ}HEc64?7HA{v|KVE5_rtZY z??;kCz8|fImL=i+A4v-P@i&tBTD@;x*YW;3?}N)f#CP#q_)YV7@%|6-9FlyddN!`# zmlVe}9{Qd^XdBxX5C8p+BD9(9ChZ#6@8bTuyNL*|Z{c%q;a(E@_?NGj3J=`Qyd3n+ zUN1JWN3XfOr?8L-KK!Ul2jArSWg_-zpPf#5zM+zWyjJ5qHfXb`Df&|nM(GTuTz=>YlwjGgI6EBxDX0Ecb=u~+Hczx(UIe$R*B|NeXLyYIet-*eAB zzlLqBe(N3Yc*h4pe*n54pZOT*6QBn`4-RNB1_K!|WZ<25-%We?Fi5wH)B&`Y^qc8F z(~nj;0OFs1Htp@9=l@PU`|RD=SM=epSIXDlC>8$d^T>wBA^jR6hDU?2mYWB_f|JTdK_kX33{mJ$H zEphGo9%$FR@_s;rF&M}|eHkEDcExqz|BfebX1fmc^c!asZ=-Y@w7#(L@Q8|lPfG2Xv+b;r;FrY@sC8_-}31~TAL z1`r3lyjB+RiLo8dk@bW9|FcTv9_04lyoQ|LwW}WcInWCOy*Q8oR~aDwQ&STM{fB?r z{{j97wr(H;oyfod{{#8yM1BU}?Qi+HzFHQ^sqy}^|GNYGKfqppWA7;NuRrmheDkWr zKl6VB8jQg}2HKHz$|5w0w&H)T)Fa`q|XjulXV$7~%{;&W1f5ZM?1^(HG z0S(4rAOr2mK>y-@U0l7g4eSqSFa`q|Xh#OF^t1inG4W3wFrdL03}m2X8Mp%5*|+w8 zfd7{HJpMp#`WgRM4z|UB24gUgfi`6TF;lQ|~?fdyjbPoBdh#@821JGsco~@a!{Bi;eX%{MF5_ z>43h*e+RnI?^_U$efG1Wl#Pi>A!*TSAth{7#A^qw;q_W6T}$PRSaYFuyl1DZSYN3_ zm8{sPA<2$ z*e^c!=w~JNyQKsA8UGvu+VYl&-vNCN*iT0N6945~T-Ycd7c2QhEkRGLXk_S(6m*B3 zR*Pxq3yh zUFr_#4Co6<&>hqtIyv=*^R?6=)EQ1)V(Jm2JJ#`)DZN@u1R~)A(Eg! z_AFY*eU%J7vH^W!67&ZBYB!RyWy(rbzH0S_GoE(UA8tCsTDRh14HNVQYxSuQjvxP` zh(-cpza81H!3y@ztQ7k*{)b%Hc%*pc;kpjF{_LkeEmny8tONT>7r5b{@73U+zJneA zd|iWo>H|0Ym)v{?1OJDn0~G#s9iZ^fs{{XrKVkPBx~>D7;D1-)pH~b2ym#WCzC?5U zQzzKu%fwD?3{9O-&A+?ipS4L+2N*TF)_Ro|bpZG6jKxCY1U`2nl9j~`&^fjT;X z`oQJ~)Up4{C$PzvWj_zc51iPlA z;{f8ng81#}r=FC*-KyNze7@iDPd~1S{&xPI`oEA*y5qk`en3m{z)|%BRIb27KA>ql zu!+24C;0%kSiqqJTJ{5)$db)&9+DrxHI7yMZ?!D@PAu?sU)ujP=Km4@%Q&tL{O5Bm z;=fmZKrdne=iGsOUCjqFH+Wm*1bd+an#huy4yg43?D>GkegN|V+B`y&e1OD1{Qs`m z|31e5L8thC!o~kr_TMcR&?_C#FR_3*7hug9c<=+9IY8&@j^_nD=zwPP0^NuOZj}zO zztDgAf7t&6%sE?mT$RuDaHan*?LYC4e7>Cb({b;-SMvet>LDM%If8m~gSSO2 zpwA0*m=De?=bvh-Ea;5iEStD_16mf z>gquUv^+21;s+2C!bhdwoF5I-reMp!+#N#0JRuDe5}@VK1+(^fUg| zT#onaUOoIb(g6zh`t=s+fHl|pfEMNjdXWzp%nQieTlez;ZuJ4R_-FiY*njVGUyXD0 z@ANnR_1X@v_p}3f%=WwulAX<^^2l1)I(Zu=cpqSimg~ z;Cr_?7U)$zK-qtVf3Gs%=yUyQ|MwC9H|kftzbX7b1^gR6f6QL{OKj`7*Y6eX^=pSZ zz-ygg$FYE$AE4C<-%0ZV&2oa2ola|nI@1Aeet_{_#mxWn_v^`cEALscfTF1QeUVTQt9%`*{3$Xy!5An%*w&dTA8SJ5X$KiifId|qKA=+_aEoe%JB|fz!+8O&A&~a}$tPspyB*8!_O97yuCCzH@m>!0(e0|xT~)%8QpdI0C^j_U)U18UX`+WY{nLpFVZ zI(|SmVu5bW3$UJe1$dS5KWcZawyQq0dPSf68UOaYjx*2W{+e^eIpCPga%55evAk z6>zK@@#vN1F73=eQ}rh`Zyu}IseyZ=YOOAXCL|E`u(au4m;S7!iN7$ zv_=QWSU|_N!n@m5|D3w_5DT>I2lOHq=!FhwR3|u?7ieqE5cla{T`P%fE+>jboY$2~ ziEK6{i^qLRQv9InAbzWewhe)+%(5w@5vkNxc*_(NReeOTTdR<)gHF$eg zjUi%r+&7|hCXM(6_+Q@;CE!06i(@Z9?BV9vH>n2WZhbc2qt57O{41T;(pB33n2i5r z%&%;}e%1T{OAjba^IFdjaPtK`_yI>E7U+|Cfm@Li>}IVnYXpnMteBab6=UP$VsdIq z%*@V;`GrNXWf2U8L^Ku?sZ?6z@_A8SSrKdS@3*&iB;K!Izb?M?r7wwBUU>!keO$HS zKby^pL_7f<5E9GF%VKtRPE1cvi!Ic}7(PLDZA4vcU>vUWVf^0_{!urWQ}_qoiT_)p z0}gXupoLhV7db(t1MaYSfi>jp&I0?V&z=<*hlj-^u)nspCX$I{Pw-FQVja({i+63k zl=@7+;(u56({0b##_w%IKU(&m*iU=c0fTvg>OLZE?;)b=0JV0w&3S=a;RkdQ3;6uY z;-wQO#2Mh9_J0$8{I|aO|A@c%^FJ4Uf1vC3pT5OPIcMYr9eIIjE~JVN`UwO4H_-u% z3AA{iW?rC`Tma*NTNDd)yl$}5e1O8a^Qz(izK?skm$0f4aM1(Knjq)vTcHD*#R4_; z0p?y}^!F|N!~VySv-``x_zRo?a9#TB-S+<{CMHFxn7M=Suhxcpzq;Cg`T&jm0EZ5^ z6*<91bAz|Vx`BH`s$(Vde+UU$|hyKl6XH$oDnY{eJog&)w18lhhL z0WIhNr`>nH?${6TP%GR@EU=4xCYblL?El4Kng3&q-mCoI`1k~3+k{agVLMyJ9V6TL z%#~8E@9KXn{5#K+@$i~*Q^kJ-cAsS0e|4o^pv`xZLkHC0|A@{D9LZRK*jIEL#sUWZ zHT!Ske|%!1r}$5&6WB)qc=teeJpLv2l@4&|0gpPMCMVcP2lSvm;I@bbRF1$yEa0^J zHLp931w70Rdh-J|#HEoD%l9}|NLr3(r{rBMG z=)OPirTtGuW&KYv6A=ZQ4!FJjfS&9j(&?HZ)Ak>!^9H-119(2^;?jZ`((?aXn_J?q z|N5`R|NWPL*^~S~@t=|Q-#lNT2|n&v`|rSiTRMQTfff%8<^_5*H+YoR4N@<(P$N`E zY<>F789Dz)`yUJh#5cbFb?hy)*OU2w=Kp!Nl^5TipJANP&-TB@_v0RNO^CVVj0^tl zI>2Kr;Lrhsc>#|);11eDBp3<+|L4R7;D2mvOiUsF$2#35)a*5#|GU;&{U7mPE@hiy zKw)GHSm{^%@8BFX)sI%L6937FcSilTzt&uayHa8xAa z<^De0Ax4YxbY`ud4$*#sXR{K;;E& zJ^=CEk`9Q=^NDyyk&SS+5Nm^~^+7yq=r%oj+-+XKrADx6eGp^9!=4ww{z68bpt+x@ zStBUd{NjGke66n!=KTTI441J+hiiX#c6O}we_S(EM6D0|zJ;}LlGx7{$ngLB)czyy zZ1lalpPbj%X{Z0M@LyL4bPx;ZcKs;mfL_D`Zfk}Hdy8xPiLK+lN;W-U?Ezrl8$j0s ztR>)@V730gjJ3gBH@J=%*sILDeh#_SzV-jx#6Rbm8sfhfIzZ0{)bj!OzEfB5wbTBq z*PZwQE;_)yMyQ2#gT1U1)ct@4YXvCd&Fo*tb%JiOfHo&!)dqBVKS9O~>2z9TuZ~#1o@ZC=V(p%h>+2Bz*qfv;^MADe$`-V6mG(aoHuC=#{+sIn<_D^^ z!k8;anYzGZonTFU!0j3f^wJMFN;$y}<^?*51-QQNN#LJ4tR4B+zq3jI|4zq$lGs;d z<^gqIz?>J%#sXsc(s?m{{*0I(zhqxC(25Rl`uO$Y0q5uXDHd?c2XtB|NbD>8oAZRa zEGwT@zuu0qzySZ1d*u8dHll?pZHfK^+2r-i2CNm(~mqXp7`V^B|ZMY z1L6goACOBR4r_7EP|bRQdibxK59pJ5fnMkU6Zf0EDjmT5H~l}E2d}*ziVkqp30gUU z4)+qH-=O2aE%|rgq+jj-HvG(X`oFPOK>Q!7`u__14g7!?pL#+(@!%)LlMg;<5p}`n znUhugx3G5jj#)S8rUN>i7f|x+rUUBefuo=U>eUFTSfFMP5tn%Z8~(S-ZOOlmnGKBP z0pf{%jQ=~uKl6Xm@7M9K?oB@+kJnM(oS?nev9Io*{q(2oK0pgPpr%&%7W)CWY~7%n z4(K!%=z$+_E9wK9=>X!}HaF;~2^ipC-1TP_!~d7~S2m!9EA4*@_P-(iO<#ccXUzZj zC*AS?_yd0;V*Z6{F0ffFa0v4PgT2M8F+tD$01r9APGSLtf9C&pP|sw=K`qF?{+$hc zudnTY8~xru%|t40;-5H&F0kT%zE))V0ORLQ$(Uc+eEs?u@E=~90sc8RaC_GXxz`7@ zP%GSvc>xs*@Jd<0RptTIe2_~{pyxWktvk|DwV_=L0>~2e{P=>or1+<_6vJf*tN9cFSUc zPIW+|b%RP4x}XDYMJ&*=A0TUljr`vL|H(JEu+Q-(<)KB|s2KKN;XhC8D^j*!yN;bb zS>OHx|Di_sZy_JhFFC=%9wPc)deyzOtNUv=IBU$|2ehgK4Et}?|7_F#w0{G6;2>a0HCmc;_SoEK;zA7HB+z}h*kiL>PhZo#_2X88cx zedYut{;|h1{r~RaKYi!f{}}Rr#J`38`Z|F4e-d;3Pd!wf`&T)@$LRkrObccI2YZOn z2RI^rKph<*=f731K=&DFPgTCqp#wVh13b(Nc+mj^{8#7y=>KmxYDv7jUWeUD#e#M5 z?~DZ`{!#n$)WZ)+dQ#H^7XFzpFk^tO>Hw#GZ^;jE>>F@P*9{)B4j}dwnHZ;?*Rjue zVEVu7kRcN9NsJ$iIRv{O(6J6^8VfYuLxes6bwm;N|4Hm!wT=FHk@sew*~faKevSW| z_08??jq&gB1AuD-{|`#+v))Jd18VSJR|j-3FW^-N^k81VH6L&k&lq7IOt43wY7ht}yoA{^R>s$O|uOsI2TBR!fA9eBn z75;fO@&Uv@G5^dXj|ho>_yINkzq0?te_b8Wi~0cUGst;EgWL-{|||0KJ|!r{xhEzPkX_C zFLVHLZsNOyD{Bo3$uRaHckC;6h&sSlBSd>jf{m4=UhD6vzhN$yws*bL`T)(&bFQlf z_jq<0_#y6dn43*w{F3pYB;HdO&>x`A%ZHXkY7x1e@UmQAq~`>Cq60kaAtLb)f8Fr^ z5wEl;`_9kP7VcvYvA*>GrTwpub7x=GYd8E;2e|72!~cK!;fKX@!2S!5JqADE;pXgxq^k!6uzoD#W(Ns*YjEHa@*yB|QE;M4;iYJ{qL3U;=iAbkO1s8Yo5 zfL35v4N`j-@-_c%&?+%!>IL$LdO(rEx9Yy)jOpr~J+AQ1IWFESd%p@jQ${;1+++WT z1lDuMBR&xYzGJxZbq4#wr33RKIx#FFk}lyMYrT;t*6}azJDnG3V-Jx5{+?)P%4B+OTx>#b zZBULUA*a)$B9D8CdpG=3A9&CKEw2|aV*vxphTfna;l5?`O$zj_VQX{PFU3iGpMNj1 zy?N>e>I>)s(=V|2D(zfj9iXsJ%o~)Gzr)yG;vUb*(B5N=i1%n{SwvvtNz?&xtn-Ra zjY`~ed`WSPX>xWrbq)z#cXq#HVb_9--aPDI8oin4!BeB-rO#LJMQ z)XbO&T|O@o^OG_*sImXbA5ilE&T9wz2^uy&DN69Gi^Myyo(0y@^sO=03E(YGI}6My z;_G-Ab{Bu=d`t%UmMp$UeNcifpgviJjwin)pQ!_6p1!IFlpmmMy>9RMef~}!I+MSf z#50t=j|3M*IIt)pLEzsHdp~{Iz&-USa8I9V2jg`Wx@|4$6GiBTb+p5Yf4=Tm2e{1( z)QJU%{~~nclkh|7xN_= zP~o3fR~_In7NFgiwjZ(#-=FvokDeD{;JqAJ5U*X^7hk=;k9c58>HzA2G;~7=SaS6T zI`jjit*5P~Ur##^tQ26&v&e&{=#K!~QDO{hBSY9bCAd5%0!y<7E#nH}dnEpypCcxz z8>kPsKSK_`M}1O(y)$A1GbVt2mwJF#lXTqE-W#}&OWdcRgCy>0?}2yXK8$BYFm6%! zQ1tbczaItuSJD2PZ+unUeErK<8EezowAJwBdlX8&vO-y1)GXOfeWi2XyrKlK19J~<-F!3A*u zdzVAbDl$GS-={5OuE5n7=s*XkSl+@t@Jc%$g)be3Jq-ZYeyof1V{L>V^-+@Mr{vX# z*FLH_)(={Rb$p$8ZnQ0G*A0s8nx&Tx&nL)d1{-!Xq*KrBIf zFLBQ{K^GbJe!;*#@E?VqB-SPNc?C(EkMDhDe^cz3*idNC#YQg8v}on!3WW|8g#n`0u_BAol4;u--5Qyeph5 zT@V?+C^GQ>GxHN72AQURAoT-cSk4ucVNY$kz!?Lm*9~HU6<~w0eG&dhj_rW{i~;ww z;{o70Fgq@SQzIe-yBb1_625#vgvU(6J>LsKKLw$)0`R;2Xs=xtnEnBDK?GQhgIA2( znIoXyG3pBq>@!cGa9_-tIeq9N`VcV__aWGMlC=5DGr;4EO#1eNXQzQf#iFa;Tp)7}DaA!3ZafQfg$jst^9#Iclhr3aGm z4VXW)#RMMw0CnCFv2WP?h{({d2F7UbgL4zWJM|6Pp%d}%M*3%X54;7DYx6^wN?kzT zfj$8+NWDV8g7%!gKnc1><{RJ-s5yMb3XBq_;=F*o#Vedet>TKv%o@va!%|KE3l!or^*kIc!w^aJSQOc3FftFcjbG-A_IG9 z_XC=*8B%e69{xv~Idu5wp;_P_&#*A>hV>TSlWhbJrB8r<`7Av!2j6``#_`M(QV%ds zNZeaFeTjR<_ptXE7isgESAc#b-Z>V=oZc{eqY;t9`^@dfh<75#1aTiBTpsiK%9tIcOCOJ_nVj-*uq``*r(q{e9xi= z`v!Q#J~{uFbHTmR12+6WTtELW<9~&J*d|*ZK*a$q z>j3v!VeT=;d4(+ORFZSpkaOC9AMF1!Y%z5Jb%CFAfy5W*2}~V8tTInXJ-~Va;+FnG z96F=O+yL-SpFr0E@;$sypI>4hn2P{AwYbN#G&~b?w6UyF$f8Cmk2bCVW0mldjIp!G zU(zoj&g<#|>IwXg4}Drf{}#|cMN7;jYWYH9-oQTMd^{_H{wdruwjjkJm`QL%ws-Kf3Mqq0QVRv7PyUf}Vgb5jcIvX2o){5Ra5Vy!WQ~2|( zT$wxK+!E{mrTvFZQ#Rju&B51ghW`LCM_<91F9g2n1N6ubuxbdH15`QyxQf9KU@RbW z0l=N~2b3Ow-3-dy9DH?M4*&=B1!#w@+yL}J7B-qXK>GZ^KjRL@8}y}>uCV+37o@G{ z?@+JEygG2_miJS6H|8Z-Q*(e^>>FQxS$yMbuZb(D*JmD%&j^A7z`gI%S+O*HS}a^R zC8kGk_R{D@aT!cbebAWZ~6&d40f5==v`jCg;#Cic6?iK#k zRrvr;9ia9Ha9nkp?|Q%4VJu+g11$Vw{-6GTD{}Al*$S|;*RS@!oA_^_11_IAA=m!8 z*8gMw-vDe-75^UmfDU5;rw$-CQ>?FpFA!zk3wDq>0iVqufSrU5l({aAO_46 zkHoHu31ZL-1^g~;Kj#`Ez>oaA!|oGjj49|(J9UB;=c{<%aixCX_mj{Yn;4U?-nc6M z6g4*+>6pa-((oCH`?+%`#q`;i#MJ2*#n^?@Vs!YNq_L3;ViCSTn0PmTi@!*#=n_{aV~ZunPg zhwJ(Q9mWE>4qz<+F`9v|!kj=HaW-Ru5PWY-5176HV*}2)J97if->cj}OxpPig1&bQ z@p9C($xeI|XRf%XZh@YN3_^;df?;`!hpg;?#>`{N!;-qtF3Uu>S#xc|(U7wqNu0p;OpC>VqWwvlYZO z2Hs7(Z{eSMppFhuv4HXgjzTOTa#I2ey zI98n5>k<;-zyI?uq}&(?i0C&&n7d*j7FS=kTl;AGoJK5Q9D`!mnVRpsE*E z>jmsSfT;r-=>aV+Xf`k4>i_F`!46`9?M>$YO#EY=WGiy-_F2|c_O<_C2jgyiRqxsG z59|~FjdVc!`0s@dXfQ7TJs^Dn$UN%<($HrKuD5aI2CN(*>>_i7%ni^6tC&FISmw;# z<9%XJ_XU)GNFvWiOtVHv5$6+FwI)HwG%niVg4wJ?{RFpBOQh`oI{MkF z>^nct^%T3PC+NHR|6bsqdcdgz5KE6Xz(3FbWd5%?{yoG39p(g;4q%>5-78ITv;TGcfL8I}$OrHi3v^f`1pGU7 zfYJl38IZXF)(!zLR&D_PxZj*FTw=c8krQ<0`RN;QPM+kybO!bp^Xix{RQTr}AUWhC z8F$D!Ug!$W<5OSEoI4>V&z=xti19}*o)MQW7{vQI;1%z_i|@X#-F>_7 zzWI8^#=9}bV22@@d3l*=6h)&b8b#4)G>S%16pcnv^z<}B$QngaWS#eYr|PdhU0vN> z)ywTJ-?H@URQ2ZDr_cBQ-@lyyuzoNdBV^qG_RKI2#~OR)`VIVByk9VB@d3u-Iv{#~ zujU4<=|?Rwa(>)rJc<7|242AYK{xXFoxpt?aNmqvUK4n|&gHFNr|LJnsCI4Lp!R|T z^dSeS_Yn!#0Pe~4Swn2qCRjYc#6Pd8w-`TU4-v*0*fS*EORx+*MT6!AJn&DQP!1iC zfq%{agROlxR;aJT%KsPeJ6ky>=_%=Nq>sw|A{zf1^Me0u9l*R`A^i6uhGp`9!G3NY zu(ZB_ryc-LmRte%@#@$B=46O^fV|(4ZB~w-_qH#<=Np0BR>bFefNj?KTl10vs-^9!e@jn($|G(n+r*6P{+r8=Kob`Y7 z|A~K{I{>FPu`kz|wqIg``Oh3p_YNqJFW}Yz^w-G+*h|2yA0l5jxxbFB!45n606L%( zm~Y&$PTORaoq)u&<^`foSWEh0QTuSWY~M#?i26SDUQ!UUV!JA z*LxLlg-kAhIwj}`!9V*9a$j&puORvXwmA6!$0sP!7x2;n;tN!O2QXeJ@xKWFInKAz zG3eaSu?G(G&))W5xPa{o1jK(X9*~<0`0)iw&kYLxWt8|}h8_TKPauva_@|v`%+0~R z%?aw^uQ$L~ZwI!Cah)r4xPj#dkOK(*$@^KmOU^*s&yh8~!Y9(cem1|4As)#Z9$lXR z9Wad=UhXF{IRN(|vrhnHfW$w01LVTLCl4_4f+ghz%ykDZ7qek*+)UIj# z7g+1&UM{a|a^cY0f6Rl|cPjK4bJS`43*Nm(O9uq8|HOYT9pKFas^bf2J%CyrQxEVu z&c1>+&ZQ<;?m6}W*SofE(sBD1=!S0CY2D9@@3D0NM~#2@{$l@IHe2=k)B_ZY^INfm z^!w}>1MNNSKk&?6ALR0^^&tmf9B>x(g(m*_e)b2jasYyV_6cKOsI=`D4p5Q2fW!pJ z2W(E@(c-@E=?c_~8LTe1ZHiLE!3o$$STkk@03U-JZq2gv?C#Qsp% zOCO*WJb*$zK)sO0y`cwS%lqI@u~vZjJoXbN{ux)~>**VCFL631N#A6f?iR$6-#2@RkT>w0GHw5tJN{X3QlyCe7yRee0e<{{ z>~n#iAec8ti2=ArZ!S=79gwaE(se<0F2KP)?u7@49^e@wf_Lr57r5? zpD_E2a=$ivnTyRIL%d&Nf;w)f@edu8g@4omu@1nl1rXeuV=d@_AijXce+u|V?rI+M zQtbLS-**^1I*j!{^U#Cl_wakowa)cL|KG&Fr311#KwyN#TDYf3KAZTLy?qY;xsL((Py7G0{|5eZ=>R7VD766?ON|Fq z&==7BU+|B4@w?`8y^b}T5&pZh4?z5T@qkkCFMPnw0ZNMr2Jr>_^8n(XcA2(&6ux#Q z{^8Gqf79->j!*9)MBa_HebRSC?<=-_0NQrO>JNiwym|7d?yEnJI9)elhVAqPkUykf z;P?&HG5B2e5@(M=sVOG@#}Ka-{Id=y8~@NPI{(*e#Q&|cM;#6jLHxt%|IcCQ z2V$SKgWNmB_%vhrDV}-8xFBMHW=()&|JefwwF`VN^Zz>j5Bo2Da0}`H#0N_91tjk0 z9!)NQ>r!Ka7XC*p{?A(LfNS6V`q10|BEG*L{F}bO?u~`=|KR_EfB39|cds!B2UyBl zVao>?*6}~t`;?YG`-y+<8(_T<>xgwNG3@rB_5srPXa109l%79! zP`!R+5$9~6k0*FPdwMjWhJbkis|J8EgKfI6IDLNdey&Z{su0Tw>KYsWx?h={4-owK zVP6r?3Zc)y{4V#nS!a(|SqBLIIhG+Wz?>q_DA)dfIq(nsgqr^sgMZ8)ZH4y#ZO$)t z-#s!uP!RvmlOS1wr&cdG`(G&kHdBr};nd&htdanGd8tK>R~kqbvBQ&riG0 zoHcH*EX)40PnmVikv>Nscmwxzk~i>unfPBq9gr_CAl#q?9zgyuPW&VP&stu$ zJr8=%J}u$JKlouW_y?~f{;5M##6Rqo8~1YW5C1qHnz=*f0BHY3>{sn)*3uyd9-$?Bb_Z%`_z+RWx z{qF6vge50Xjd(zbJix-g75|@uZ&b|sH{ZkgK9mY+{2zKSS6nmSo z6aRU1!0wGN<*)yRofQ06Mh7fWUI6%G-ElwsbM1>a?oj)ot2D-de~n*o0oMF_i91NRFZLk6IuH`^@F)dKPO>3-QnUB;pIAJNUQg z*q`7Z;{f*v;5FR)L+-$QVVe8X_M1|I4ya^az-O(n#y|R_J_XyQ@y|IcL8ixv|5!Nl ze`Ufyd)H8M>404Y@ZUrHGham>3=R-P2L$5+m9G!rdEwHNlYF1PdlEPopMW^*2j)6} zf9e3;Pn6snyn$ze5&yEUfZuHxIRuSe@(1vANAMZk55Rl^F>Z=w_pP%?xQ~$BU-XEz zCm_xJ858J-Z^83`7&qYO5dYHaIurY%2TITZRn7}U_&4JJ#6S6BKp~&xnU$9P?*#TK zxphDw{1>4EYRwmjvz8WqIyt}$?CJsVdWi`V%Zvw*185yUKLGe+{*V2~8Gqw`BGwX9 zmoSDm%Dg}p{7YvO5it2z$ z`vN#u1a@5T&luoYoSn#ho0OJ7U0nh=g17iOG>Hy6HL3W|ef->K;Gec1+|}X$-aMcn{(%GP3&sj_^$;mG zCP;3uG_}HJUSP@aX?`T*nr?9ruj0fr7B4`4k2`w5JJH*kOPC@}8i z5N#ho@J~I=d>!pQbAI$4_&(PD65A$kuxfrYb;uBOP7-s(_cB(fxxdT)J9;1^4iL~6 zC{+iPDKAiV{Evkf|8wM*nrGT|>^`qG{w4k=_|KyQg5kgXI=~zMKJo%Z_Y(vL;ZJM4 z!v|pQ?!xiIx_&oH2f%+fb%2fsz<*#}5V^o8;vsS91dV^g|0k{)KV3}Zm2_m;=PM-FCi0Ay^b-I>VbO7+*j<|gnY66%$(Dg%@ zfBr55s2SAQH(~}}wtoblO|D>_HDX{tj}9o=7x2;nmB#dwpZya4(+IIX*n@%Bp&^)YO};9uAOn)ctk_TmE7%nOLE zcaJ6)FnEB*|LAapfAs&Kwc}LuRf7o6%607j0Q$^eJ&R=V06+NOi?il!{HODPf_rl; zuMSu`U%)zFc$mEbY#uO$xc%$L4r?y354m?;hi7Bm!m8!t6Xzn_ORO<%KgRuk8vo8~ zEMMP^eQo!F{Um-T_V(5Ft`6_FYK2Yg%k`4^0!tMWgfEbZfAnt*xc1$zx9tB&DC>WT zfByY}B@6%9!C=!l% zJADjx@9g1yy5Gkstl1gNF<)cipZ9HBaVFT-4O&M~KZu{;`1;5_FjmbyYFXH?kPh&! z52*5f0V5W$xGsPyKzEW7*_nx0LSj{L6ZTrm;K0roBtF4i2v_J4?tp{=Le7Ww5loSlq}p6`yvyi z>42*G0%eE?Soj~(@&5?_wEtYQ!9?4C^q8mp*LGj52f#0NFc2Ulp>zDe&Ro4B7wSA z)SFuT-?sgEbil3+>Ha@2Jo%)0cFm*e>kmJyh39_~{|Q|$1l)7~YYzNZiU(BJ7jV~J zS-IGBT{?UOp4|bw3;r#xj~)W3;iVsD+4~&$H~D{t4yXVRV4XmX=LHt$$^UKp&sctd zb?^0BV&NeCi7>|hwf|ql_h(<-y!g-H0r3BU|8JpIaP#xep%>^z_3fvh*8RY~{_vO8 zQx834;~zCc-0w#GS3w7O`2t1P2XIbv`IScgNVtDiy_H>)Dmox1{;@}35S-uP_QW^w z?jxYi9#9EipbR=7jsM5gG`Uz2>)(72 zv2ZXEQvQ$cPA(r<&}X6_=TEw$hG?P1+wsu9G}?#0mNb1Cs6mL6Fkc(cz2KTyg61v2YAE+DpDg9 zATN-Cf5ZU-uYEUOfQ19g4FBW#@bAF`i2s+r@r>HL75iD*+H@SiiUA7$-wppEbI*|U z6fKJ{VEX~p?IDsQCg4K{=>DH({LcgbR{Y=K0K~Q%_vXEceYrMs0p|6R_yPg;4VI7> zaPa^5V>(w_D*lOuaO0nSu!0HgV?WM|()mBJ_hSELl*cjd+4Qp7{M>V@r>RlRrIKp* z`t_Rsr|m!Sj~@86|038oAUdF0zJM1G;A7tNW%yFLVk(*o1m^*s_(zQZ{eQ9lX5U6% z@j&VV!M!7bsE(EY2bR&-kCl|6q>a(mx)!9+ox!O?xlcm(kV%dp50CyEm){ zw)@o4{flbvE3c@vkA2nf{{{c#0Ny;HmUMtO{wvo{FfjggEr3rhU}9gcE1?4_;R_TI z4_Jh+VB!C9HHG@u+`pwi9S~alCr5uc9UJgGM=O`zlgG!fPpuEVrnrY9f!uT)@o6Xi zFW8q6I-q{bdeyXLi#jwrqyFa7CDp!br+W5L)&N-izYFJKTlU|De^)%9EWSVp^8#u7 zTm8RSXBzQKVW^*m}&xNoAEweNn< za>GCKXuar9|I`!U|HQrsu`eRN0Px@0fOD|parC@9ul7w&sKzau)$@-N{}1c>-!Am7 zh{KPt_7Gcph6?L|+Nu?%E~u0a(D;YHAG7;^i~rw+v&C44Ep@^fqn8d4Jj-a>e)C$M zH^&lnfaji}O85eK@&fVrh+16SuNLMP)cE+g8p1g#ZY&4APleh3j})o@aNdN4e>?ss z_~$72$0#wufwsMBYGhcwe&Pi7whiiBz;lm1=HR~v{q58Ex8eZAf2Iy7B_3e%fAe}N ze1X#U4Hm+`^rOzezXuO+&aM<(o0xZB%WKTB5;`D&FEBri8UYH<8%)bMt_?vfV4sI9 zV!y!HSV|o_cu3=aY6|_A2l^uX7s3Bc`)}F))-(rj=>R@Ih+2V3@c+f}F`Q*%)&H#h zD)WC2t7pFQ6*Y{$_*z$F^bbhu0V^jcaX~vK;M4~gzQ8rQZ!iJ>pYeXn{#!k~c`x=~ z@UMIQ5ch6zae<7OfE)MjdlUb>E>Q=R;tR}7Ce_4PTur1zV#c-g*f^dOv0fL$eM}`$ zqc=M{rw$%GsPR9o@jswOu+Jnm(CtWK5a%uizyz@nR{lSQJYJCRDzD{t=D9S?|HXTW zeUaS0z!-A>Q^P~5b;k}}|1b4_8`nPT@Pup~;N=UH!UM`54=`f@=5;xJfeiekU!a@+ zyY~wO!oT3#jeGN6UL#|PI>6Hx@ZbSbD?Ed92|GI4)UMsT)t>r#)!4LGwW5x+v#U$> z_4TWv;b9ezCsb-|Owq2-&CP-5FRDX_4y&U_kEs*joyU(KSFasA=GcGYKb1fOlS?P(0A;A7Ju-^SX9@0l`1d|6;$;ocQNC zF0lQcJRlzjAg)ckyRQZJ=4jRgnAc^l512!Ypb2%OTTnB$W9Lqd|AvM}jsNbR9yKs9 zs77M2@5z*!oSf1&-opMNjs24+PpY$L&Z<+$Js*QE5dJUtkB#75X6TU4&Mwu`(yCfp zTLR%B)c7CnbN0ycd-xXOA7@U9{U`qY=ztOIRcYL^NxkyIx74QRzp46xeFyV`eHn|? z0oAG#q^&URzg(At2P9DA!#<(j_;1cWyUC{x(0Kt9({9|G_vY*5xsA}k zGeYp6KpgoE#F596N!8WeorQnX_8)`2C;rc!J?9($EzQmTaX`!f3kO1M|9xZL&<{zR z&Dn$AGmQVoZS4Ei0i(e8D6mbRUe^mrt&rf}97Co91oP(Tjej5Y0o+4i_Yld6f1C~0 zkF&y^{$aHLB0hCMMl3*ZZQ|a%mgmi}L>-XN7ohE@&0oJ^gU0{%?b|i>zyG)YTb(<7 zM)QBS{Vx^&d-v|u=cD<>MH09OHU3!-8&HzyPnQe-et3Xm^9B1dn%I}?f;zxE9&j!B z0@?Uyf6y(e3we_?{$0HTg8BmR51e{o6Z7tC6Z>*)@_+NX1YdyIpPopl^&2-q()K?E zyMO-m^J*NvekJUG6Y5k)vA+Fcf@dj)68|{=Yl{3|pR;ZH!G*6){EOXpkA>m^+V&IU zf_)hU_vVZ{4@T)w}SX@0RH3137YFY-*pl-rpprlt(O09;@#`IkPaxXFHr8hfXg?s zV;~v%l03O$!M!

wx?R|)&C@sGN|e3&<%3qSt(U4x0X|AK$SrehRW9MHTk zqyvig1;WV#s1I`K0jIZ|(L*GT8eign20jtb2-En74(PJue`5b-EL8_oJ1@YPAn`u~ z|9|7=%^CQg7#mmbe&;)Cc4np`{y%ezF^zwJm>?FyYX2u;&-nKT753%nLGF(6e~okB zI>4w8a@7eg1rG?TFF^ZG&VLy8og6^$ulN5$H%Oj9@Lv%gK>O~+0r;5Mese67FHql5 zpAr9O?C%e1SOXqle)4pM7<|n#J4;{`*jaIfQ){4*r=h^wCc+P>oQP z^8&Hq0nGuJ|KGU_=OFeEs1wIesFC53itvBN{}Y&FzqlA31pZ^o4gaS7xA9LM04Y@m zl-C#V&JETQ5Afp)5dR6B|m+1dPhRC~Mt1|GPQwO;6gFfp6s+||0AJEg? zskUz2rfUIo{2%qdh2sB*QTu!B*lX(4$y2)i=k%%5zUu#)QU5avPE7Hm1IUG!J^o?) zY5z43D1#1I3LfB32jt2F8C;-ZF~M|=5b>XCt5+A#p3wH6_@~5CL&f~FKEuU*-cY%D zfXVH1`2iL31*ijJBLj%}wWz(oXG?3VYU{wha@7C#^!BR$fdMtF_W;Co9q`1&gqohl zK7jdowYY!3-Uo2_@R2P1vu1d3a7gv^^rHU16ZQYCs=Kqz7w$zjgdYFoIsrxd|L8sO z6ndz}1p5a5YmWzbyg&*ZbF95lO@Z$- z|Ib`NKYD$52OZTzR}g){ttGV*||ya2JCiwg+u&9N*x0B4MX4`hhP-ob^L6#4?B zWfc2=xfjsf|H~KxV|{_wzlj;VKdk(J0(FkmUqOX^Il9q%M&lpcbVQ5o0|*}wKfqUR zFbsKt>iGgZV_ZGMQO}r2biy@8wY5Y_F1r!ti7WPF4U=;id z55VY;2jtcP<&6m%-#0_|*?v%-xKA~G0qTG;)@nm%bL6=-8ux;K8H+q)MAr-li3yr^ zeTj8|pM8UJ4!OwzCea%t9veZdU`Xx6IdmGw0oT48D;E9-LYe=YK%H}DZyo8elYit{ zUEQcXq5aRoKYanyAF!|e>45xwgmhd`_6f)+{NEf4`T`-&3qTLBc1YI=3Fh7766k=e zUSj!t0WU64317g22S^VQQxA+{4xhkz)G5aKVZTceVqp=n$ojY{A2G0@sBfn zvhhzYknIbEr9Qxk|K#NX)$;}9ygIKsL5B~N;mpyc=^+wRvu2I3TnDTb&hQC5bb#4g zocdrC``*5WwObbalmCYm|MdUy_mjf}64=`O__zH5@dXS{P+L48oW6inI}H9$A0U?> zKu!>d2b54B5F%fI_)i%4547$*anc@Y{1@~6c~%Gao@@J$ywotnHxGa=D4Px-=NCVK zqv-?4bwOXiO9xbM@36U7NUpv23Z&};%BKU$6cfzn3z)h>u9wgkF!9eEelhFcd`}$f zYZ2$@g_8fn{#!lwxu@R0uwP%--c0=G)d8kIU~_>|b%29)6aPi)0PlE!Qx_5W0{(gm zSGiU=!w+C?z{3|v<9`k6d^!WIdoPU87KRr8$YVM<5_{=m)b`&4|G9O5krxnOz&8)5 zW?rCrJfPe?M1uJOW#R!#oEON#zej$MwS<=cZ{y#`de4WEWr=^-Suguf{O8sIm5B+K zH#g|b1N_AVbL|;l+FIdI`2tnQ3(QTS7Et^Dz(4Z8`LONhIgS4i#{bSB{y$!<{m0(j z&b_-c{C~l|jK1RmzUu>W=LVhMsVu&LcRZkYU%wsF~0eH~_)3zV({Dv%ol_s_zAfwi6yU-oz{V_{*;|2g>g_)Z1C zGxnVO!9R6^w+_hm1#~>nSFLbv9pLD4_jmHr@fq>XbpA743sU!ybCRppfK(%{_ zn0W#29Z2AuJMI6219GjDDvLNrJ8b!XjeqQYFwg7udrhw1*<|?t=t(Cy&o}1e0a7Q( z(bfaCRUhEZ1N_AUs#z=SqeiG&wZc{M1vLJLZ2ZG7^t2OVU%TslB_z%`N=@U>?!$_r%o5s=zIbCmr7?lHiA0SEus|HE_Wa^c$VuFJ)HvR?o=IGZKV64D1Cg6?-l))FMJP$yO0QFQlH;{L~K>6zgLt86c(td&B zbige70A=Fe-bkr7}awEQ3VCw~bl+{@pg@xMmf{2}(Cx9z`-eszE+{*4%b?kB|i zn$rPMUZ5=J44FD0Urew}wZazudvyPg1ZsDJu6_6Gmp%T`mvRtN5gp*>0cD5>M81HP z6VUy`^7Rj>R$idOzCZ^4!TsHM4th_!6juA6V(;Uk?f*{1|6%`a{8vT?gtb<9x%vXN zUn^V@{15eoGXI}KEnhkDUl|>cT`OExUx2m2W)0*uS}Pp7yg)u*z|0BCwa*?R5&qNl ze;WU+xeq9;(docB)NcDv{4bRbaQ@~z{KbmdR5veBe628Z1@_)S`-~y(9jxBI!7$_n z3fBs=-(Vc`%Ko3MeRbARKn%$Hh=qM2w*OLZ7i1hpzyJ0I;{U4|{9o{2869Bw0*ng; ziV5b{0hP}SL_I`;^cJu9zCpqNnn!i+E6BR{dM&ZAfPMmDtpBC`*YR~T&gSFV!vBu6 z{cmf~cHhK*WpqFq_xkS+qys9kU%;zIsP^*$MeiF7+*7nnHA4A(fq;2|8RCBs_FwSt zW4-6YNa*oT37oJG^#AovINiT|b40p@R3CLOR8d4b}6fvAT_&U41R@K1f=t`WBH z`FIR{FCF{`T>EaUX#9tj|M$TDJLh+CFP=Zq_^-F{?_hsPb%5au7{8zP$qL2;mWl_I zvS;X8s}ZW5yg)Yo{jK?2*kBFYLTK^d<{R_o_t*U2!2f_?Uq&M*C_X`0>I1IjcmQ(% zZYkOqs8)SIK3_m`0p{q+3(VlTO#8ol@t;JEyoqbS*VK7!_1m@oKiJl&h<_1>4=j}q zu=&5q%Sz<|kuOk#H9}^cVBi{|bY8&3zdpO(C+E$DjiC_Rf8syie*Ij}@jIvSpT>T5 zct9z>!1BxsxH*8_dvgIl=M04*H)!n_aN|GM8u$A+>)jWypD2v+|4QJ$YCNFkV}hmR z1;VgzunK*Ji|_>^{HN=GmIVKd2`rT_AUZ%|g1EmHe1WKk$cSPOv8+B~`S71BFJSop zjeSsi6VCnM$ z)8ivf{4dtsTps)nhLit~qUJG|Ud#75bsqEo%%L*gXJX!c?ZgAC!2`$#1pln>EFm|z z6fr@6{R6__3)F5rfE;4DuT%H`U`#LHI`{M3Ah0kWX8f~nUqB)Ldt3IXN51@!8fdMD zV zmh>59LpYDj5c@2$bbk^02@w0t0U4)pFL8m4F@;!xTkQD3?08%~@%Ur#U$1mOv#h(I?7?enX~vi#_4>XC+{cmTdeuW|F{J_b5bz=|>4hG& zq!FXH^x^S7tSw8LFlI`B`(BkLux0&Tf_m+Kmkhu!DkOu@d07JfB##Z@dI+!4BXr@A zr?lho+%k+kD8tZ;!_b9ZG6JriSJ1;crlkv`A?U>xbICAX_tLs=sb`*iBDl?S;a)J} z1OInlcinY&KyHKF47m}q3R0((T2T#=^FQeSYdcFl7*P1VIR~x4{nx+txO(i-N7Um5 zgs&-!Jc7?DB<1?QqR%PMZ&m~INWQvp-Sdc98T-@&u6s95LXCge0RH`@3iZGU{qRVl zIjG?^KwnX>bq{~DSPamooyUH{JoP`dYyZoH|6=DZdSB_fH=4uh&Y=hX{};IZgOD#k z?uQ8eZ^bqF{|%6pkgDNA?7yn~U+jOP6FDH*en(ixV~dGh_uB4l-mM}jFbBvp_5=~k zX-_28p97EIEZH0Ps)T)9yb2xfep)Pwt^Z^Zz~ZZ*cB@2Od?9=a;xPMJ>|3diJ*oW<> z-6!@1_ryFg+rDQjYW*m$sMcMSEviLiC$3GA$BP}!&sxIkX8d2xJ2qENcH*-smHa<^ ze)it&n^dV%&hJs`-{STDqW?bEZ{%Lv*7|=%CEJ@3|7(~7{^{?N^V9AN_Qmh7dfZ=X z4KwV&&HK&RhUWY>&!^3&t=G5*-Z=-HPnqYYZ5tJ(QDo}|)ff_Kz~8xK^2&PEumn<% z|6?g+DZY!J|D%}i>gRKv*BEQWT-RLl8Us5vsd!5x>VFz%fPcY0IX``VVqaqZt8iV_ zxS!zvdk6P3|MvsU|6Ta+gWd0?uh05&=KXlj_M ztE&^cPwbmMf6ZW@I^esf57nI;PhCvGZ;?E+*#Ervhux>%!JfJ{BKax zUF}x~cI|j_)ykC;>t~&B2KI4ZXJWA0*KbTue&J*)afNo@#J{BjB+rMKKlkM_?uVEk zeSi8qZ_v%>nFMI&gx1hX)|P&77aD z16pVoapLX8H|GMW~>-(E()4F9KFW@^y5}r9Q)}+{^EznEU0bI+(KK)o? ze-~l_g8lZLuc-OnuK$|uXxq5z10N87zozZJV4vd~vy(TyIXgXdern>^=O)MAJ3B#1 zy>|w3dOZ2wsj<=bPNfp>ok+&tdo2-r?`UlJy~D$U?;jlOdw*YF&--&dUGIbYyg%9A z`u#w+orhASftd#()E@4hm$XV;a1-8-*<8(rxa*@^3&+pqLp^Rf-!F_PMz z18W`j>osYuQLa_4S*~5K;aFq+mBikLE6J9o_s82>-k<7ddw;gOfSxH|F+Bf=T=`{oLl|&{LE^^23Eg0JGJ`t$??@^ z$5X3MjwbFnIx>96Y9k3aUAr@s8xUwG`nzk2Y? zpa0xLU;2v&9{J1rKfUJj_kHS#&)j>@lMmc|_tSrV*Im!tf7hMQ+<)ht&r&{p=l@*$ z={r9O;h10U$Maco7anuuPF!2^=Xc%tY+kt=&uh60V_F`-bpct6=hJczuC?5~_AlRSM$0`Iz2&ob{Ij1Dxfj=klk3901UwG)TFFp9+*B}1!7rEYFe)_2gwmrZ0zE_@G zdpqpD@O|d@oj89OuumQE&Vj`{E-lPT2mS`SUkhIM8;X7ZTU`GZ*BQdc z%*Q>hGd>H?>(A69{xAK1%KvBIJAa4$xA3+4Z=kb|ov7TSRYee{dxz-~-cfmt4{vZ4QUBG8oMBLvizwjoSohbpZ}Lfpx@@H2O^2)V41IhS$zL}6A5*4Jo$V0y%&#< z#_qo3V;_Ut|AA`)_kw>J-<+9RjqiEn)OhN5i(_#$Gm$73>A2#t< z7p5m)YTB^=##{dQkFQDG3;sF2u`s*xjhU%6&;vg^HkPVQl8_thc)cQ5$QDdY(Lu#m)A zZ9I1=l4uUDp*6rYy+1jkSObT(J~-3We%tLI{gah-*GPQN#B?#&mlo$&zBNDlBx(hJ zb~G8kIxXk5;as-KNTN9i;TqtXf;@L{7IHk5_yhdiADm2$-v8I1|NN>|AN=65wfXt< z!&|d6HzQBb32yX%4~&jr{;cyH(`Py6IQto|i(V7WL9MI-oF?)822^UON2P`%iRPfXYhYryR~;RVv5x1buu%_v#=SrPjLI2Gm|r{rJNt`Q;Gf#H45PvNi+xLUIVl-2VnEj+wRwhORsO) zvgxLqZ@MYs`W4{%esus}hdyKXBkpqfL@M#SDR6;AU%QG!I7Sl9K`CoM*3ryRuR_nd zD_Ca-&~xV2kN@ePM)AEW zq_B>#o?!DQeuA~N=IO6Ie8Yc>a(YY7^-ZkjyGH%sEyx#gU(tW=8}7dv?`c&r2!G2+ zqB-!p2DoPCVe`3;-k6@~NB`N6+;;QLtFB+MBI5fsWcPFF0`wWZ16=I{`m$Y_LQE{y z-J(Vyv2N&tNTNA#tpTnLkuli(j9JMLKZf$O81 zeG^AvzkcVy!ma2*HiJ6N|D5UXQp5P&`P)abeCHtE*{lx7hFG)z6JUSMUp?@^s*glD zy_${hm8yeq4hedW%zTc%-D{(Ip9B8Zjfyq^=NP<)wa|NL zXyBGVyY<$UD^{#PTaN3rl)BcU_ZPqKr_ytWx}jC58+aD6-Jc(d4PG4q59n{Lcg`%A zv&*CL+L{yo#-m*=3cCOI;DVR&```D?M;~4J!4G~g!hOj7{9<$ldJx`padxVm`wMYq zxwijuZZXd-jpW*x1OBEwi*|9S?<(^6zX0}M8miy5>SG`KXk_b`A?{6G@x22F>fV~4 zxf6K;#C{ULn}AQyhck+KPBG6ck0iu%fZve64T8(=#~F z?7Sft(7*Ts?k~WPxOg@-dhzU7>TSf7D3{?=Ts}LNeCO=AC1+Bj@0|9Kvty(0Xu)%M z&pX)HcsVVp%Q!#tGIACLB+$KN+G<_LPyzKy@@ z?bD<2ix+SP4ZaUWel#9`kU{lDTtuo^xUe=VxK|)TMwTQ(xg+1<2>H&!+#$@rmdh9+2PphaAd3{-+cLL+YyMs`&f$6v zpEHMk+t1>=tt#}pN6$wbz+3}=|L(hWmku6`>_rXOi*vD9-MNvGx^pv-bHjDty>zPX zhu{5fLE&#`{-)7&gz;z%L~9^g1JN3Y)ent^Brq8W&0Aew<_2BH~=W+0k@Xa=Ggh-M&~foKMz8Hi>e Rnt^Brq8W&0AmlUf{{ijMI+FkZ literal 0 HcmV?d00001 diff --git a/FileAES-CLI/Program.cs b/FileAES-CLI/Program.cs new file mode 100644 index 0000000..76bf052 --- /dev/null +++ b/FileAES-CLI/Program.cs @@ -0,0 +1,330 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using FAES; +using FAES.Packaging; + +namespace FileAES_CLI +{ + class Program + { + private static bool _verbose = false; + private static bool _purgeTemp = false; + private static bool _help = false; + private static bool _getHint = false; + private static bool _getEncryptTimestamp = false; + private static bool _getEncryptCompression = false; + private static bool _getFaesVersion = false; + private static bool _getVersion = false; + private static string _directory = null; + private static string _passwordHint = null; + private static string _password; + private static string _compressionMethod = null; + private static int _compressionLevel = 7; + private static List _strippedArgs = new List(); + + static void Main(string[] args) + { + for (int i = 0; i < args.Length; i++) + { + string strippedArg = args[i].ToLower(); + + if (Directory.Exists(args[i])) _directory = args[i]; + else if (File.Exists(args[i])) _directory = args[i]; + + if (strippedArg[0] == '-') strippedArg = strippedArg.Replace("-", string.Empty); + else if (strippedArg[0] == '/') strippedArg = strippedArg.Replace("/", string.Empty); + else if (strippedArg[0] == '\\') strippedArg = strippedArg.Replace("\\", string.Empty); + + if (strippedArg == "verbose" || strippedArg == "v") _verbose = true; + else if (String.IsNullOrEmpty(_password) && (strippedArg == "password" || strippedArg == "p") && !string.IsNullOrEmpty(args[i + 1])) _password = args[i + 1]; + else if (strippedArg == "purgetemp" || strippedArg == "deletetemp") _purgeTemp = true; + else if (strippedArg == "help") _help = true; + else if (String.IsNullOrEmpty(_passwordHint) && (strippedArg == "hint" || strippedArg == "passwordhint" || strippedArg == "h") && !string.IsNullOrEmpty(args[i + 1])) _passwordHint = args[i + 1]; + else if (strippedArg == "gethint" || strippedArg == "getpasswordhint") _getHint = true; + else if (strippedArg == "gettimestamp" || strippedArg == "timestamp" || strippedArg == "encryptiondate") _getEncryptTimestamp = true; + else if (strippedArg == "getcompression" || strippedArg == "getcompressionmethod") _getEncryptCompression = true; + else if (strippedArg == "faesversion" || strippedArg == "faes" || strippedArg == "faesver") _getFaesVersion = true; + else if (strippedArg == "faescliversion" || strippedArg == "faescliver" || strippedArg == "faescli" || strippedArg == "cliver" || strippedArg == "ver") + { + _getVersion = true; + _getFaesVersion = true; + } + + else if (String.IsNullOrEmpty(_compressionMethod) && (strippedArg == "compression" || strippedArg == "compressionmethod" || strippedArg == "c") && !string.IsNullOrEmpty(args[i + 1])) _compressionMethod = args[i + 1].ToUpper(); + else if ((strippedArg == "level" || strippedArg == "compressionlevel" || strippedArg == "l") && !string.IsNullOrEmpty(args[i + 1])) + { + try + { + _compressionLevel = Convert.ToInt32(args[i + 1]); + } + catch + { } + } + + _strippedArgs.Add(strippedArg); + } + + if (_help) + { + Console.WriteLine("A FAES-based tool for encrypting and decrypting files using the command-line.\n\nPossible Launch Parameters:\n'--verbose' or '-v': Show more debugging information in the console (WIP)." + + "\n'--purgeTemp' or '-p': Purge the FileAES Temp folder to resolve possible errors.\n'--password ' or '-p ': Sets the password that will be used to encrypt/decrypt the file/folder." + + "\n'--hint ' or '-h ': Sets a password hint.\n'--compression ' or '-c ': Sets the compression method that will be used to encrypt the file/folder." + + "\n'--level <0-9>' or '-l <0-9>': Sets the compression level that will be used to encrypt the file/folder. (Only works for with the ZIP compression method)" + + ".\n'--getHint': Gets the password hint for the encrypted file.\n'--getTimestamp': Gets the encryption timestamp of the encrypted file." + + "\n'--getCompression': Gets the compression method of the encrypted file.\n'--ver': Gets the current version of FileAES-CLI and FAES being used." + + "\n'--FAES': Gets the current version of FAES being used.\n\n" + + "File/Folder names can be entered as a launch parameter to select what to encrypt/decrypt (also allows for dragging/dropping a file/folder on the .exe).\n\n" + + "Example: 'FileAES-CLI.exe File.txt -p password123'"); + return; + } + + if (_purgeTemp) + { + FileAES_Utilities.PurgeTempFolder(); + } + + if (_getVersion) + { + Console.WriteLine("Current FileAES-CLI Version: {0}", GetVersion()); + if (!_getFaesVersion) return; + } + + if (_getFaesVersion) + { + Console.WriteLine("Current FAES Version: {0}", FileAES_Utilities.GetVersion()); + return; + } + + if (_getHint) + { + if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory)) + { + string passHint = FileAES_Utilities.GetPasswordHint(_directory); + + if (passHint != "No Password Hint Set") + Console.WriteLine("The hint for '{0}' is: {1}", Path.GetFileName(_directory), passHint); + else + Console.WriteLine("'{0}' does not contain a password hint!", Path.GetFileName(_directory)); + + if (String.IsNullOrEmpty(_password) && (!_getEncryptTimestamp || !_getEncryptCompression)) return; + } + else + { + Console.WriteLine("You have not specified a valid encrypted file!"); + return; + } + } + + if(_getEncryptTimestamp) + { + if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory)) + { + int timestamp = FileAES_Utilities.GetEncryptionTimeStamp(_directory); + + if (timestamp >= 0) + { + DateTime dateTime = FileAES_Utilities.UnixTimeStampToDateTime((double)timestamp); + Console.WriteLine("'{0}' was encrypted on {1} at {2}.", Path.GetFileName(_directory), dateTime.ToString("dd/MM/yyyy"), dateTime.ToString("HH:mm:ss tt")); + } + else + { + Console.WriteLine("This file does not contain a encryption date. This is likely due to this file being encrypted using an older FAES version."); + } + + if (String.IsNullOrEmpty(_password) && !_getEncryptCompression) return; + } + else + { + Console.WriteLine("You have not specified a valid encrypted file!"); + return; + } + } + + if (_getEncryptCompression) + { + if (File.Exists(_directory) && FileAES_Utilities.isFileDecryptable(_directory)) + { + string compressionMode = FileAES_Utilities.GetCompressionMode(_directory); + + if (compressionMode != "LGYZIP") + Console.WriteLine("The Compression Mode used for '{0}' is: {1}", Path.GetFileName(_directory), compressionMode); + else + Console.WriteLine("The Compression Mode used for '{0}' is: LGYZIP (LEGACYZIP)", Path.GetFileName(_directory)); + + if (String.IsNullOrEmpty(_password)) return; + } + else + { + Console.WriteLine("You have not specified a valid encrypted file!"); + return; + } + } + + if (String.IsNullOrEmpty(_directory)) + { + while (true) + { + Console.Write("File/Folder: "); + _directory = Console.ReadLine(); + + if (File.Exists(_directory) || Directory.Exists(_directory)) + { + break; + } + Console.WriteLine("You have not specified a valid file or folder!"); + } + } + if (String.IsNullOrEmpty(_password)) + { + while (true) + { + Console.Write("Password: "); + string password = passwordInput(); + + if (new FAES_File(_directory).isFileEncryptable()) + { + Console.Write("\nConf. Password: "); + string passwordConf = passwordInput(); + + Console.Write(Environment.NewLine); + + if (password == passwordConf) + { + _password = password; + break; + } + Console.WriteLine("Passwords do not match!"); + } + else + { + Console.Write(Environment.NewLine); + _password = password; + break; + } + } + } + + if (!File.Exists(_directory) && !Directory.Exists(_directory)) + { + Console.WriteLine("You have not specified a valid file or folder!"); + } + else if (String.IsNullOrEmpty(_password)) + { + Console.WriteLine("Please specify a password!"); + } + else + { + FAES_File faesFile = new FAES_File(_directory); + + try + { + if (_compressionLevel < 0 || _compressionLevel > 9) + { + Console.WriteLine("You have not specified a valid compression level! Please choose a value between 0 and 9."); + return; + } + else + { + if (faesFile.isFileEncryptable()) + { + FileAES_Encrypt encrypt = new FileAES_Encrypt(faesFile, _password, _passwordHint); + + if (!String.IsNullOrEmpty(_compressionMethod)) + { + switch (_compressionMethod) + { + case "ZIP": + { + encrypt.SetCompressionMode(CompressionMode.ZIP, _compressionLevel); + break; + } + case "TAR": + { + encrypt.SetCompressionMode(CompressionMode.TAR, _compressionLevel); + break; + } + case "LZMA": + { + encrypt.SetCompressionMode(CompressionMode.LZMA, _compressionLevel); + break; + } + case "LGYZIP": + case "LEGACYZIP": + case "LEGACY": + { + encrypt.SetCompressionMode(CompressionMode.LGYZIP, _compressionLevel); + break; + } + default: + Console.WriteLine("Unknown Compression Method: {0}", _compressionMethod); + return; + } + } + + if (encrypt.encryptFile()) + { + Console.WriteLine("Encryption on {0} succeeded!", faesFile.getFaesType().ToLower()); + } + else + { + Console.WriteLine("Encryption on {0} failed!", faesFile.getFaesType().ToLower()); + } + } + else + { + FileAES_Decrypt decrypt = new FileAES_Decrypt(faesFile, _password); + + if (decrypt.decryptFile()) + { + Console.WriteLine("Decryption on {0} succeeded!", faesFile.getFaesType().ToLower()); + } + else + { + Console.WriteLine("Decryption on {0} failed!", faesFile.getFaesType().ToLower()); + Console.WriteLine("Ensure that you entered the correct password!"); + Console.WriteLine("Password Hint: {0}", faesFile.getPasswordHint()); + } + } + } + } + catch (Exception e) + { + if (!_verbose) + Console.WriteLine(FileAES_Utilities.FAES_ExceptionHandling(e)); + else + { + Console.WriteLine("Verbose Mode: Showing Full Exception..."); + Console.WriteLine(e.ToString()); + } + } + } + } + + public static string passwordInput() + { + ConsoleKeyInfo inf; + StringBuilder input = new StringBuilder(); + inf = Console.ReadKey(true); + while (inf.Key != ConsoleKey.Enter) + { + if (inf.Key == ConsoleKey.Backspace && input.Length > 0) input.Remove(input.Length - 1, 1); + else input.Append(inf.KeyChar); + inf = Console.ReadKey(true); + } + + return input.ToString(); + } + + public static string GetVersion() + { + string[] ver = (typeof(FileAES_CLI.Program).Assembly.GetCustomAttribute().Version).Split('.'); + return "v" + ver[0] + "." + ver[1] + "." + ver[2]; + } + } +} diff --git a/FileAES-CLI/Properties/AssemblyInfo.cs b/FileAES-CLI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ea378ac --- /dev/null +++ b/FileAES-CLI/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FileAES-CLI")] +[assembly: AssemblyDescription("A tool used to encrypt and decrypt files or folders using FAES.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("mullak99")] +[assembly: AssemblyProduct("FileAES-CLI")] +[assembly: AssemblyCopyright("Copyright © 2018 | mullak99")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ae1c86ec-831a-4a44-96ae-cc2caa585b51")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/FileAES-CLI/packages.config b/FileAES-CLI/packages.config new file mode 100644 index 0000000..2cd32ef --- /dev/null +++ b/FileAES-CLI/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2763afd --- /dev/null +++ b/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2018 mullak99 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a347740 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# FileAES-CLI +_New W.I.P CLI application for encrypting and decrypting files._