From 45328a6b72493987575ac36ad521811ca7b0fa28 Mon Sep 17 00:00:00 2001 From: Jepp9350 <2jepp9350@gmail.com> Date: Fri, 14 Mar 2025 14:56:55 +0100 Subject: [PATCH] Add PDF generation module with HTML2PDF integration. This commit introduces a new PDF generation module leveraging the HTML2PDF library. The module generates PDFs from HTML templates, supports customization through styles and templates, and integrates with Minio for storage and retrieval. A test route is added for generating and serving PDFs dynamically. --- services/nginx/app/classes/pdf_generator.php | 264 ++++++++++++++++++ services/nginx/app/classes/pdf_store.php | 75 +++++ services/nginx/app/index.php | 2 + .../nginx/app/interfaces/minio_pdfs_i.php | 28 ++ .../nginx/app/interfaces/pdf_generator_i.php | 67 +++++ services/nginx/app/modules/html2pdf/README.md | 23 ++ .../html2pdf/helpers/html2pdf_template.php | 247 ++++++++++++++++ .../html2pdf/helpers/html2pdf_template_i.php | 26 ++ .../helpers/html2pdf_template_styles.php | 106 +++++++ .../html2pdf/helpers/html2pdf_template_t.php | 38 +++ .../modules/html2pdf/html2pdf_templates.php | 41 +++ .../modules/html2pdf/html2pdf_templates_i.php | 8 + .../html2pdf/src/truckwash-banner-png.png | Bin 0 -> 208588 bytes .../src/truckwash-banner-white-compressed.png | Bin 0 -> 5046 bytes .../html2pdf/src/truckwash-underskrift.png | Bin 0 -> 49275 bytes .../html2pdf/templates/wash_certificate.php | 179 ++++++++++++ .../nginx/app/routes/pdfGeneratorRoute.php | 72 +++++ 17 files changed, 1176 insertions(+) create mode 100644 services/nginx/app/classes/pdf_generator.php create mode 100644 services/nginx/app/classes/pdf_store.php create mode 100644 services/nginx/app/interfaces/minio_pdfs_i.php create mode 100644 services/nginx/app/interfaces/pdf_generator_i.php create mode 100644 services/nginx/app/modules/html2pdf/README.md create mode 100644 services/nginx/app/modules/html2pdf/helpers/html2pdf_template.php create mode 100644 services/nginx/app/modules/html2pdf/helpers/html2pdf_template_i.php create mode 100644 services/nginx/app/modules/html2pdf/helpers/html2pdf_template_styles.php create mode 100644 services/nginx/app/modules/html2pdf/helpers/html2pdf_template_t.php create mode 100644 services/nginx/app/modules/html2pdf/html2pdf_templates.php create mode 100644 services/nginx/app/modules/html2pdf/html2pdf_templates_i.php create mode 100644 services/nginx/app/modules/html2pdf/src/truckwash-banner-png.png create mode 100644 services/nginx/app/modules/html2pdf/src/truckwash-banner-white-compressed.png create mode 100644 services/nginx/app/modules/html2pdf/src/truckwash-underskrift.png create mode 100644 services/nginx/app/modules/html2pdf/templates/wash_certificate.php create mode 100644 services/nginx/app/routes/pdfGeneratorRoute.php diff --git a/services/nginx/app/classes/pdf_generator.php b/services/nginx/app/classes/pdf_generator.php new file mode 100644 index 00000000..b3692617 --- /dev/null +++ b/services/nginx/app/classes/pdf_generator.php @@ -0,0 +1,264 @@ +html = ''; + $this->filename = null; + $this->module_path = WD . '/modules/html2pdf/'; + $this->template_path = $this->module_path . 'templates/'; + $this->html2pdf = new Html2Pdf(); + $this->templates = new html2pdf_templates(); + //self::create_tmp_dir(); + self::require_valid_paths([$this->template_path, $this->module_path]); + } + + /** + * @inheritDoc + */ + public function require_valid_paths(array $paths): bool + { + if (!self::validate_paths($paths)) { + foreach ( $paths as $path ) { + if (!self::validate_paths(array($path))) { + // Check if the path is valid + if (!is_dir($path)) { + throw new Exception('The path ' . $path . ' is not valid'); + } + // Check if the path is readable + if (!is_readable($path)) { + throw new Exception('The path ' . $path . ' is not readable'); + } + } + } + } + return true; + } + + /** + * @inheritDoc + */ + public function validate_paths(array $paths): bool + { + // Check if the paths are valid + foreach ( $paths as $path ) { + if (!is_dir($path) || !is_readable($path)) { + return false; + } + } + return true; + } + + /** + * @inheritDoc + */ + public function is_writeable(string $path): bool + { + // Check if the path is writeable + if (is_writable($path)) { + return true; + } + return false; + } + + /** + * Add the HTML content to be converted to PDF + * @param string $html HTML content to be converted to PDF + * @return self + */ + public function add_html(string $html): self + { + $this->html .= $html; + return $this; + } + + /** + * Set the filename to save the PDF as + * @param string|null $filename Filename to save the PDF as + * @return self + */ + public function set_filename(string|null $filename): self + { + $this->filename = $filename; + return $this; + } + + /** + * @inheritDoc + * @throws Html2PdfException If there is an error generating the PDF + * @throws Exception + */ + public function generate_pdf(): string + { + // Set the HTML content + $this->html2pdf->writeHTML($this->html); + + // Generate a random tmp file name if the filename is not set + self::generate_tmp_file(); + + // Set the path to save the PDF + $pdf_file = $this->pdf_path; + + // Output the PDF to a file + $this->html2pdf->output($pdf_file, 'F'); + + // Set the path to the tmp file + $this->tmp_file_path = $pdf_file; + + self::store_tmp_file(); + + return $this->tmp_file_path; + } + + /** + * @inheritDoc + */ + public function generate_tmp_file(): pdf_generator_i + { + // Generate a random filename + $this->filename = uniqid() . '.pdf'; + // Set the path to save the PDF + $this->pdf_path = '/tmp/' . $this->filename; + return $this; + } + + /** + * @inheritDoc + */ + public function store_tmp_file(): pdf_generator_i + { + // Check if the tmp_file_path is set + if (!self::is_temp_file_path_set()) { + throw new Exception('The tmp_file_path is not set, cannot store unknown file'); + } + // Save the PDF to the minio store + $pdf_store = new pdf_store(); + $pdf_store->upload(self::generate_tmp_file_unique_id(), self::get_temp_file_path()); + // Delete the tmp file + if (file_exists($this->tmp_file_path)) { + unlink($this->tmp_file_path); + } + // Set the path to the tmp file + $this->tmp_file_path = $pdf_store->get_pdf_key_name($this->tmp_file_unique_id); + return $this; + } + + /** + * Check if the tmp_file_path is set + * @notation This function checks if the tmp_file_path is set + * @return bool True if the tmp_file_path is set, false otherwise + * @see is_temp_file_path_set() + * @see store_tmp_file() + * @see generate_tmp_file() + */ + private function is_temp_file_path_set(): bool + { + // Check if the tmp_file_path is set + if (!empty($this->tmp_file_path)) { + return true; + } + return false; + } + + /** + * Generate a unique ID for the tmp file + * @notation This function generates a unique ID for the tmp file + * @return string The unique ID for the tmp file + */ + private function generate_tmp_file_unique_id(): string + { + // Generate a unique ID for the tmp file (numbers only) + $unique_id = uniqid(); + // Set the unique ID for the tmp file + $this->tmp_file_unique_id = (string)$unique_id; + return $this->tmp_file_unique_id; + } + + /** + * Get the path to the tmp file + * @notation This function gets the path to the tmp file + * @return string The path to the tmp file + * @throws Exception If the tmp_file_path is not set + */ + public function get_temp_file_path(): string + { + // Check if the tmp_file_path is set + if (!self::is_temp_file_path_set()) { + throw new Exception('The tmp_file_path is not set, cannot get unknown file'); + } + return $this->tmp_file_path; + } +} \ No newline at end of file diff --git a/services/nginx/app/classes/pdf_store.php b/services/nginx/app/classes/pdf_store.php new file mode 100644 index 00000000..435aa7c8 --- /dev/null +++ b/services/nginx/app/classes/pdf_store.php @@ -0,0 +1,75 @@ +listObjects([ + 'Bucket' => self::getBucket(), + 'Prefix' => self::get_pdf_key_name($pdf_id) + ]); + return count($objects['Contents'] ?? []) > 0; + } + + /** + * @inheritDoc + */ + public function get_pdf_key_name(string $id): string + { + // Generate the PDF key name + return 'pdf_' . $id . '.pdf'; + } + + public function getDownloadUrl(int $id): string + { + return self::getPresignedUrl(self::get_pdf_key_name($id)); + } + + /** + * @param string $file + * @return string The path to the downloaded file + */ + public function download(string $file): string + { + $path = '/tmp/' . $file; + $result = self::getS3Client()->getObject([ + 'Bucket' => self::getBucket(), + 'Key' => $file, + 'SaveAs' => $path + ]); + return $path; + } + + public function isFileInStore(string $file): bool + { + return self::getS3Client()->doesObjectExist(self::getBucket(), $file); + } + + /** + * @inheritDoc + */ + public function upload(string $pdf_id, string $file_path): string + { + // Upload the file to the Minio bucket + return self::uploadFile( + self::get_pdf_key_name($pdf_id), + $file_path + ); + } +} \ No newline at end of file diff --git a/services/nginx/app/index.php b/services/nginx/app/index.php index b96bbd9f..9f449ae1 100644 --- a/services/nginx/app/index.php +++ b/services/nginx/app/index.php @@ -49,6 +49,7 @@ require_once 'classes/request.php'; require_once 'classes/ratelimit.php'; require_once 'classes/wash_certificate_store.php'; require_once 'classes/invoice_store.php'; +require_once 'classes/pdf_store.php'; require_once 'classes/redis.php'; require_once 'classes/slack.php'; require_once 'classes/wordpress_bookings_remote.php'; @@ -61,6 +62,7 @@ require_once 'classes/backup_store.php'; require_once 'classes/motorapi.php'; require_once 'classes/stripe.php'; require_once 'classes/form.php'; +require_once 'classes/pdf_generator.php'; /** * Modules diff --git a/services/nginx/app/interfaces/minio_pdfs_i.php b/services/nginx/app/interfaces/minio_pdfs_i.php new file mode 100644 index 00000000..3c10a683 --- /dev/null +++ b/services/nginx/app/interfaces/minio_pdfs_i.php @@ -0,0 +1,28 @@ + 'Truck Wash', + 'address' => '123 Truck Wash Lane', + 'zip' => 12345, + 'city' => 'Truck City', + // The prefix for the phone number (e.g. 45 for +45) + 'phone_prefix' => 45, + // The phone number without the prefix (e.g. 12345678) + 'phone' => 12345678, + 'email' => 'email@example.com', + 'website' => 'www.truckwash.com', + 'images' => [ + 'logo' => 'path/to/logo.png', + 'banner' => 'path/to/banner.png', + 'signature' => 'path/to/signature.png', + ], + ]; + + public function __construct($data = null) + { + // Constructor code here + if ($data) { + $this->data = $data; + } + } + + /** + * Add data to the template + * @param array $data Data to add + * @return self + */ + public function addData(array $data): self + { + $this->data = array_merge($this->data, $data); + return $this; + } + + /** + * Set the company data + * @param array $company Company data + * @notation The company data is an associative array with the following keys: + * - name: The name of the company + * - address: The address of the company + * - zip: The zip code of the company + * - city: The city of the company + * - phone_prefix: The prefix for the phone number (e.g. 45 for +45) + * - phone: The phone number without the prefix (e.g. 12345678) + * - email: The email address of the company + * - website: The website of the company + * - images: An associative array with the following keys: + * - logo: The path to the logo image (e.g. path/to/logo.png) + * - banner: The path to the banner image (e.g. path/to/banner.png) + * - signature: The path to the signature image (e.g. path/to/signature.png) + * @return self + */ + public function setCompany(array $company): self + { + $this->company = array_merge($this->company, $company); + return $this; + } + + /** + * Get the HTML content for the template + * @return string HTML content + */ + abstract public function getHtml(): string; + + /** + * Set a key-value pair in the template data + * @param string $key Key + * @return string|null Value, or null if not set + */ + public function getKey(string $key): string|null + { + return $this->data[$key] ?? null; + } + + /** + * Get the company logo image path + * @return string Company logo image path (e.g. path/to/logo.png) + */ + public function getCompanyLogo(): string + { + return $this->company['images']['logo']; + } + + /** + * Get the issuer company details and logo for the template + * @return string HTML header + */ + public function getIssuerCompany(): string + { + return ' +
+ ' . self::getCompanyName() . '+' . self::getCompanyAddress() . ' +' . self::getCompanyZip() . ' ' . self::getCompanyCity() . ' +Phone: +' . self::getCompanyPhoneCountryCode() . ' ' . self::getCompanyPhone() . ' +Email: ' . self::getCompanyEmail() . ' +Website: ' . self::getCompanyWebsite() . ' + |
+ + ' . $this->addImage($this->pathSrc(self::getCompanyBanner()), 'Company Logo', 50, 250, 'right') . ' + | +
| + ' . $this->addImage($this->pathSrc(self::getCompanyBanner()), self::getCompanyName() . ' Logo', 50, 250, 'left') . ' + | ++ ' . self::getHeaderTitle($title) . ' + | +
214|Ty7!GhWxpUE{rFCGWwRrt^r>dL{$SC z^EB0hjKlDq_2V|I1q2n!{Dt?=`16Dh{yUn1?ss#~1kMO>-KXn!0!l~n8UiRFlP&)# zcK=VO{|)rcB4|DstsL$S`oidSf4l0=Ygt%ePVBbacK+4Hs=@OXS)I{;shBPnKBrL) z1$3=2K%f{Ck>A;b5pu6f=yZxyD?VB5ve41cAYz#YP3(A;3v28WwgYeUY_d=eE8l_6 zfCzP@8%r#p;Ir~CdEhstiqYWo?!Ojtkai_9_61Qsr=V)1;B V+tQJ<9 zsX`7!I)nfe9r KnH?2ofL9M)rj3CAqV)I6{ z#(Y4#(JRHolsu2Fh)S!Y%%HpW)t107pg%%w8#i_@X#~}T{_E5Jf6OD<4RXNV0Jy;A zK?#L?*- MIt*;}*a`>w3U{q5Yj(Z#it*8HmY(T=z}eH||1hR!$7i6|&= z^|7@NS0!)FSGBS@@m75Ixt)-rqaE+CHp@gKENfR;gJ?WIL2j@IqEV@J1kKDbq{z_G z$!zM{m0iV9;7AbT12oxISl0%i=Wvnz>+xCNJK zW hP9~7C^r&T8mp97VICMXzBHqN2`27Q^Fh;`sVs|$o&aao;rO9X$2@-2VhZ(N z$$foKl+j&PZ!0FVd~tUX$nyie(CmGOWXzLp@fpHWs+5@c52*M5iyZd9k#h^rj5@gt z8=B5;dw!cLHbfmXC=?WMqB-p{FZ!eLO@i`Ux2K{x Z##-q{e! zHaHfbs3-DL F-PnKM&q1!g+j{RM5N5?{=jU1&5R5gwi;FV0lcOkEML@{f%@=lfp@y2$ZTouEn z2y-K@Dl}G^6Z}fcGUzqt();{5qeD(h)3bq$t(W(ud><~I2g}YaMs4Igmg;Q}iW<$^ zl>bZ8_}}K+#lg~i_mLZ0re}0_r%KDD*?&{Y>b7e{sO=zGT`*{6%+B3rU@V=?lR=!d zFnSziU!rFKH;^nZ5 JE z+Jc`j0(RU!kReAqpOy^gF(;ZDBBqq-k2>yBP3;m@lsF9Hav)1BE6ngYedhE<)C3Gu z6cv^u-KGh3U-e?jjsgdvIiiUdK)n!MxS1y>l|6<^Y}J+94>^ zeqrCSV}U5}RgfrR#c(15!sp4n1GI!&A-~HxvVRulyjapJ7rfbbaW ;>VvlW>Sq+Hh)^P LobD7Xw-lRM+rA14Y52a4T?^ zE^0>+gVPIamGbT($}H#^U@{BAE=QcHg8K0Izjr0UMZ3pM4w=9OH`~EjpG96X3{Q() zT54Q}Umo5g%yK~|I8Xlk2%_!AAHe$A!$+n1xm+=2$PT#}j#TC-xIyGkrnb_|`k|u= zPCy^t`ci$&q>&$bTCA `BDMQ{bqB({cvi7@Qh6%VZncEZ % z)EuT4sUlMQza0iR{q7o-^-#5QKon(~hG%HLi>0|kxB+>|SnoCM7<*42(L`4lCk>6f z(Wcjfk;EB@;xa@mtZqX*%S82Nki3zEAIy>=r`)R {h+=5(4f`%Z#ktQfesf=Wt=4= mCWXNESGJ=(qwq%Pf8r}813Yzso?TW`KD?B~CNR>c? z^wO`$O#mt-Mpdk@NY&u1M9&M;tjWPrQXD7YVCZ*tP39%4&_ZaV16Qy|NbazTtGC}< zMzHyQG9?dKXpCzx4?}bfFXD<|XL;!1zIvo2RSB%-5qptJRymCrA*WgoO^YVm)X Oc~Y~S|56 sG+DbSleE-L& z+yyi1U9WnmDs65<;m2pm4%^$V2}BOKDL!@D$#s>5KEDjcCK?GVB10blX}Rt+sBvk0 zpQBEN3zMP+q>Idz1vpf1AY{&cVQqMmkhZqMj*pK#g3-Z`q|Zxbl^hD4d#qbAh?vEc z=E9mbb>LgJXxV(Wf=p!!*1>bxV0~o@HjKAkFYvx1g$|77f;hN3^P6%ayopF-2`0Il z6HUmR@=s|RKJk-DUS^SYcYm}H*{c`p`>xJPk%%)wmi+;~QwboTU<~BMLy+#iUDhX{ za%17|>eIb?6CTHZVb^WToCYlXsxI|m)j~$KqM6>V-5NX3)fOpqIS?lsovPJ<)RH^7 z`Jy1_anCu|eJ 7k2(F`a=vyqT>TtNBojA9Ej!t^BwcJ2{w@zKo|LgiTYE+S4m8)x +c z?O%79m+w7(JHOVBEaX^;R(j`EW~h}q(|w-$maN#qqHuH;!tgB21F0nU6mEfi;xQ4- ztua9Pt!knx^#Pq-Y55iF(6sy<(mQU(b6@h$#+>`UW!uNoO~ niifxL_<*GL^^QK K1-PGi&C (w*2*GJD- zmtf*VKYZk6(|3vrPJ kUWWD8Xb5g$+zE^Ms`tzDeOCXg=iGNmlK z!HX_gCfUGGzlPFJ809qEc2(uw&Ei+*=4#YTr&<0(P5wWy?1} ScCRe<45f1p&( zng;cZgh7I#ICrc>KM8?HKgb{AA<2pdSCk%|@@iU#R{vGoOw(>Yp22q0$md0xp5 z=~C)M*TM#+G+~?N@O} 7BKAmmDBYNhC 3I#!Q+uB~&{PrXkZZfsgw`WgTOIdF4oHr<1CjOX6?}|F zG2b^y Dvdz+{YE@ rt1@*}d_b?GzAAqFtE;_r2D2F1AQKfH7F6BARJGX77*c1k6kO<=}ho)sMMH zag80D-z0_+>!JUg2XR!ai-ISxoP&m)8lE z+rSK{Ukld{RrzXcry_?6e9KE%rnyq3$8*khX+@Kx$x7kuLOX}E%TC6bvJ|Qp*>8jj zB^*R+`QbB9ZXO}@VaLkk%#)cM2pzN&))<6Y8vd&WNZlw}zK=El-&@j{;18lhEXO9A zEs4%wgAWNW`KWj#h4LbIVIzi$NWRi46J9e!Ao@ZWH5eO(j*6iYI4%tl;~ER0rXqce z7Jx(;6U4Q1Rh!`@LZ0UD9>)4)lUB3lHD5L&=Rku_5hT^r&y(GS+NtnEDe%7R?vy+> z?+}U%P{7Hw?MlpD;tRZ-$P2oudnWtaXu0{wOLs@Wh$mw#?jLFKd0gkKQox)g_|bwN zUTNULd|u#2TF33}rlrFOwkkRnNwAsMrTW&Lpy2%>r6b$;-dgLkyEn6z)zP9 YHXO$xvPoqUG-;qV>CMU7jZ4@SNE;HstGLas zAFSsMU4WG2)g$OiEnyngjAid#;r8M38jmA*#?p!U_KA~XyJPWd6^z2)Vr~R^@UPv9 z5U70fRKOSnOu?(aA(}bimTyZhNJ7Y+7V@iyN{l9to54PhUn9eQOnn>&A}J1H%6_wI zm@iLHmUVx`og8Y?jP-$Jq{Ip&Fp9hm76%8Um-A72Q?S&Sr`a|BqBUWP->j)gp`ai0 zALJ?Y8KYRGH}Q@rf +n{9z%D(1?W+3TWwH&23LC#qwrN8q4 zlunRn6V1#x9XEcMUluBhRSs#BLpY(DZKPp65mhS6?_e!ulAHNjGzn9R9*B4D*)p|k zrbiuL<>f@WMeurGS#Rm+?e1ea8j!OfXehTVc~bMkk {QBPtgVEqd1EU=y{MDkg{qTJ9Ep3KTUlA1p^A1 z=?}?vS!I*1CQAg*@iFA`p?B2YkBa7{i&h&wPT`00OnMfRPtC(pzP{54=Kz68YQT~# zRBWgO4un0?R$roBQtaaj{+earpx#?WElD0UGfDiQVuNkzw~!lX*m{U*rx()Ppu9JD zpegQFpIr3Lr_5a=*kI*}@)X55F>`TQq~GU)o5S$+o&aFDM)0y+${JLMzvbaxQJ>NV zL&VpEL$S5!r%woxt!S!MjgxaaZ9A}4&*RkZ*wdKzU9V}poT4(n&^8&U3fgoaDFay# z*}M8;Cj{HWr&_~tHnnl>PvJVV iDfH(or|a84|_h2Z?*2>u->kkE!`&zEuW75 znm9YD`p3fNh)nV)7~L}MZ00udj!(#U&+LBvGk#iivww|w4x_1K8UBh+2tW>uZOBsL zSq`gEk;dlh{sn t)n;FY)FR%0`JbKNLA?jq*pUQIJA;8#LbFI zzXS2dVTKSA1A6g6b pp;} zY3Mwr!f2P )TpyA#0^4<7r3R}yJd*B#Qo*yq!WSH zb4|_8Ljk(cmAd7(5pN_gO8p*6fUTm=@Q2-I<=mNe!P;67?;4j$z#1zt`j$nI?rbk= zv(O(2Mf3r0WSY>fAZ#=n1jbAJ^2uuP2$>Jdkd9&i_A%~)G`cK(wxm8FZrh^GApBP5 zm4$(F@O1K4al`7_n6ipV@lafMPzqO=;b+;Au=&uRd#F0=WkWvBc%F&AHFqH@+zG`U zo|N|PXJAn|RJ83d+`zXXZvS c6;RQZ5zeuvmYkVYwHJmfyfo;;{!yCh^ zN;I%mg`}NTwUM`u`y1_EX&yM~?SuGjMpdv~gSo#Hjz0J5JC4VJ#!h~xdj8~*M^Y(W z$9&ex5c)1JRZjH9bcAWd&pp?Cd>VUjAb*Rc_tYa7-=j@h|E*$8`wvn!x#j@{|4^O6 z*=uxxiAe0CO4PTz&91MxH| k6?CK;`z<0G71GHT`#k52h-q zqT`d&g8-aLT*PZYtSjCWygA&`=muO(6 MCf5TSh-n zP(wL+l c!Hed_U%t zvW?r()S=yx;*NtN&;%YrB=V$s6!Fd+%{3f&4ex2&_*j8qN}Hf5QIrQ7j{RMhW`sTD zcO|!iw})!*A=4x_t9LnGIrdQbvur-miLF>sqOqZRR1~H!VxTqVB 6%+jCnJh>C-bZe5?Ei74qT!`rUvos5;G#+wtvyuh;o_pbbH)qm<* z>39GWn< 1@l64Ff7dA^6= Cs6fi4uruV{BTvovrz-k+DgIs@I!3z((loU!`oNxBesNu6SS*wT#1mSiC;w)FL z$jBo?hbPOsot;xvu&MbBohXCTQD64gm(^I}HWXLJdYPaEbOog={?5uaSdY~`s;u~s z%=m%q{I57g3bw$BX5CVz3EG7P%`s|Rhw_Sg)&2Kje=w2z9DL8IYk%ebWxCxyoJyJ; zwRvRRPdJg&O^{cf2wgIq 6hj> $ Vk*xk kUPX=fGR33&1p|uc-h7d3T z-iabr=Mm#`vNFz^15pEt__H@oN8Uuh-O~Dc&4-cZ`JQx1H!FGkl(zU(B!cIq4MvvC z9Bkesc!_#d-rZudWW)i&R_X(SP88!8p@T$ZbR2q}<150#dg{cyQQ zH}enI 9Y4sUC^H~7w4em*w;DF2w=keDN0HYxmMvO z`Gdkd7-f9|QD_h(qP&n1cm}{Z#X^wOakJeBLo!CQ4!nhC7EKvi*UhAh|ahNHN#X zFFc&*0ZAl%4|XYg$=$45@vwqOVJzWqy8rgYUX5dyr$AI~!XyvnV63jYOo@y%nuVgX zNt*8pal-*R{cqgj$7UEA+rO&6Tk8RKp+YoDc9rOHNE1XS1v#E7mBD}JdS)7!2jA1_ zMWJdj04%)$(pdjM&{u -*k`$J|qbsK(3A3>Tunl|F0 zGAlt8O}(_nD}+3}MjEOxxf&i X1%G-O#V%bvxT}Eq;-Dw(H_ZIZrZ%N@Yr9xO8F$W z8DZF>cWn<8G{8bZILPE#%drhheP{jbV1|X|xhw_PJ%zzQTcv30&uNHQgRdURjxT9B z^C^$LH`MZnVMHX5PUq+!W-~GV7lO&*7ohIFKdr17{^))jj99HSI~Q*&!HxX(Q~3bt zR@I+z@@Ns7{;&!IrC>=|n51xk$mAzws?RNUHF+8!jOchg)1M?wS02ttD9aOkH^w_Q za2c1wOP%AeU&$WTCMocxdLc_#ycR=ovGsB8aLD`oweUMA3?EOe$efO*CoD{#_^B)F z16S^yu9KcXtqLWmu=-P-N1o%7!n{##5xg|MnIJySapp(i6XP6H{9rT#IQ@GI|4>B0 zGsQ^`YeZgIXg`Dp_ZYmKy4hKAq^i%^9e|^WV+$f)5J2mb)VR4aZ-i4IH8=Rm&)@!d z%lDzh-SNzf)a7>GP}6?71x9Rw{x@}QCH!yDbHW1~Ic4{ j{^A)892S zzeApD1$VXN;V@6PW;`9C`?RY&sf2$pPm3T3X9?W~O{V3;KyMt!+{Tsk)H+#@vAwO} z3?YC(-h^>&OPHvl-tOX9If4K!96fR1m(18Zm?Dw|P0tIzewY1%f|*d4TJ@$`Ni }fqB&j{b#u~@%#lEH;W{^=DdZ~zmkiZlff%Ie6bG$ YP|^6X)ZOR`-1`t;`kDo4Q9lB)f62;PiMm5EW{^ zA=Uyd>RX-_pvW&8UX6U`n1SHWq{UKRr!HSMc^GR}!^ofHO;7H0M{3y6h4?TsCR3F` zC9U`kRY(TI1(Fn?-Am3Uo|+lKVGyYmRUQ;wEBBAiJkA-~s<@vq4Ra?d68(|98aAA- z1UWbmHM1~_spU`FRDPfJpc?emelSASBof2(xL=8xB@sbJRA}i`4$w*q79(|YiKs~# zd&QG$lV@G=t< X7+Rmm^CC80R0N8R~|^!rt`#fvFA6*1~eL9?=Jr z#E!qefXE-W6wa&WGTKU?suv^;_P43<2=BHGirTdvoFW|^sJ?N33w7fLyWs*2D@0mK zJ{+cW`Cp`H%lPTuo?ZX2y4{LkHY2@E-64MX-)G8#)mG9~R?67n&PyWR*Uzfkj)FXW zwbLH!zf4R5wAS;NvPnSqXsAFBKo=-^WcuNEG!UeG@k!NJyLYJRtmb(vk+BbZdQz}# zLKmZ{>dAX46ggxiH=IB@)xP^c^06{QuSzW}v>-59Ii^@tR;r@z!Q|3`%#cOGhZK}u zc9}gHgw0LNK28=yi@_xsRKXSYl6aLvlS0;KkyGfhfX7B~tKU>WG#5j`6Z z-StZtanxVQLm>S_k9v4|@_U{xqMYY6W75jT-}a!aaJ>-1LwGmG8{xNJL*11disz?s z`=9u_zEjx_@WnbozF2eeHzUM6C?K+F -4tdyiCqXI~W(J?XZa z6QOHuspiAL-q{s+yj_?Pz-w5O9#U??TO>vcV@{!J2A>S(43OLT578bm!y9%nB1n}2 z3u8w#C;iPEBFdbN%0lx(>|)i^@clKn18d)z4=yine;=P9r^9;N#~IYYkqmyxkf zEVh~sUp@T#Hv{wAse2K9d96Q7Mh;Ft>XM+Ft+24jxUAO_KE4lyfKcl&HYRURh%qUy zN-#u1c~z8&M5&;GH=?iXlg>lPNZNDU_eA6PD2pZttLfG-Wya6PbcO8mLT}k=5cp;c z?nY7gebZBX;aRL?oMbo#FiHG~TzyB_8GexdfOTy1mV${f^CML-FBPvTq$U{LBoxE| zQ{6l(c=E`Hj+Z3-Zgs2cz_kUK!p0Gif_1Y*%Z juE_ba zC2aF`O>u8^w!~rOyhnN5h+Wk!s<<338h;rSjGJ79<1$#rdDnQ2Gz5JpFy|d|Gt+U; z0=<$=Dt?dP#WKU;Y_G7v#TSbG{*W(1Vw6 ED9SX9k z uW729)PMbh`EC*F1CK;m$i-R=E7O<-9~cocZ3f z^5We;$yDmB*!a}l3fZMW7uK(TeeJk-BXnk5l}60XkfjkF><4n{;bBy~Rxvn^sop4y zj=&(~L+=lF6A`4Z?M3KCHLxfu6^j(T>s5O3pZ+|gRTSV-nV)bRlYSvyVWXG>aO;bb z#=>JS49#mc&^NfgR;g{o&*~1tzGE^_ORvSbl =%Q=S=?7xN+C1KQ~3AHY1z=OqWGC9 zLyc}8Y49DIF4$uyUB>9aYYz}BN4)YlE{9IDd1?hS<; z4Y(~w} z9ooL~CoJxVtGwz9kT9u^e@<_0mw#$Vv1PB=^<>3g+d36ei*1z#SgtB`qVZ-*c8h+g z>Kg?t|5+{<^JPfkZjUwSZo2)~Y0q5AS^K}?T0fhs0U0ESu}sHj!RY>=<#uOUb8zZ8 z$ zO^Z_fOFSt;J&cbhOJnNZ(DVWONhyILIjTE+Wstg%vJJ0T>j}K%eO3THU>*?SA7&fg z2WjQ~vSHK6LeyKyVYDFyQ&LJz!Zd8o(!>M6RH+LUrU`5HLsrok6v}=y3dbYzWdl4B zo0X!HKeJL9YRIBuQel%G!G4&e|5&{63S0&sgedsKBxJKYG&u>QsT`Ex6tIu36x3jx zUOntU9{v}qwMgD53yEl8tJ+}I%fje71DXb1WBTN;;tj+l)(&ZOOZ5cHJQ@*5>5w`r z4pYP_hj});MyTSI(lK{$Kt7xA!w`(c<#UQbLPi!IgJLqXaYkyG6o-1~`ez-nc4DW> z>axEJXc7gZ!G+K8{4G+KZ}=9g+4MjJm)XS~ !WuGTOHTkvVqXZa+5^lrn72I> z+>DDz=@#+ltl8-jC9ma;Qc+I;R-aWyN6n6LK}+nxx}<~*p{1oG6so{)0lsD{AOpxH z78Ne!NoY5Edw&sn{l~X+Af;Fc^zM2z2+mnZG}`Rq2xJk^6ZyNDh@QkxRG#p>PHh^0 z%{&-+PNIixV$J;#qvh(F{I`A*>J+&tq}z_Xe)>b2et3&woG@&r^8}xV?N;^hpg&ak zjwP)E!&y;;i>IN@wms6R;6NyHR)kyl>1n2@5WZvgTW+1)ZeAl5Ng&0O89|fBe2xo) zYRVMgBg6eUB1QGpdAPm}=aEtu_-OOtV@l*0VErUj>Z4*PK+9=8nCTTDE6lxq7qy{x zKG=J!Q>u^Yjc!xjc=+e+yP%&B@Yh?pb!RAHVgg;gdy+xuCD=Xo1;>cb^1b; o1rkSx>T94>mliT$1(*5(<1CbUPHcFZf$AQlX$L;1jtj* z4_4eNEP?DQOih{?4(VzR 5B`#P5 zHAFLTMZe=0_c{r9(i6K0h5b|%H00Q!I&NyROuedur}k=O)^4^LKj#x{{B(dX%B7IP z8~t~w*2x@(;8k-o%@f x0Q4bX-kYS9J~C6luh9#QlEbL zX}}+AWC;*Kh@%2WJPDqjhd?PHGViD9p~DT)Y`wdD1|jg`u47#!%aBmaT|!pG!W5@0 znV>UZtuHDK2nyrX>Ukqct4~@4{v{`wG6*p>5skz0GDig;n;NFONsOf9K017y@~lt- zxBW%(xS~(#bF9AX!6()W_J5UTV$L#nGztq!JZHEgh+)K|79bZZ(3*O+WL%!R!jo~_ zYJ3r^cGQW#*_!!NkgR;#(?*&nIdndBQ5RbVTw#}tn|k#!r+Z zhAJo>6RJ@+S0);oO*mxyiml*5UH|eF?@+pGM^a$u+n@GUamV&-+Bkaz^J>r^;_gu{ zR_C>>H<#-j2fV{ltA0S@|Ic9Ge^>#L)FG3E0{agdQn!MR{S jwBs|Xt( zt!D1yo0G>!c||xX-oE G#gw6n4xhcwy zQi4qj FN#eVg3$h BUtyayy(9bW*VF#5*jhllwA& z{vX;kf7|lGQ;E5wo3v*5v_YF&9rxC3Q>T+p4B;36y9*3R_t{0ehZJY?&32n!_%&1o zB2QjOMHBj`yrEol#hL9d-%wm-FViuJenh*-a-d{OmeUIu(o)QT7h_*MRf@6UQUq<7 zs^(H>@uPW!#=BI?S#O&NUl7$i3=U_u|aghK3NDRj&%Z z<6sXb7>Fc)jdM{o2{~O}u}V<~RTFOzHQ|(L^V7wyn`fD-4lQ1FJ3jx~@dhI2kg^}6 zh4a1CJan~*+jAwo)tOS1h7@m`M*E9Rlb{d&3Tq{=cX(|z)3|!LKand}Gj@k>$^!Q4 z__SbrBv;vU*SWvrID?(jg^zJ#$zfWbCAyYvz3FU;4>+~P6wi%G`k}sw=#x&>bdJ~C z&qVhVe&BnR+OiO^`; sds=RXl0eiBsVxvr=}g6R!wMmQeoukfu2k+f2ye-G@(E(Yk? zWf&7^>a$`5f@76^OOzw9i>js{uhuujhz_@tFBvVdK-5KH5q5q((BK&a`Q`^AGRl0M z4LieEg8I1KIU1xSDOItdSI5E_k8(B$m=*8Fry6Bt;7(k3YDj&@MZNMCSYR_tLbO z82WT=PK}1MBAd1{_6WbakF x-A9#1YGq9U`>{UtR;g z&Sd@Dwp_B}3YZ-pcs2W7b>?<;$!ibB^?{!Y^N|82!{KC=(gR)lMS{HpVZlf;v)ZAJ zqrvy*sP@<*WqNtKRB#pk r;R#UcxUP~xg3ce&FDg6UraD(t+n@3^Q*9$d<0np8!~rRN1uoH zR} $M?*9OGgI5u{+c(({f8`Ycgg{$^18NXI0 z<#aGjg@Ggd0E@3e1cT~D@J59z7rD}}e_$H`mTMIRMO8%EDQ#jLcgP%Jx_C#g2~{37 zZ>*)~E1*1wNGxif4yoBR`RFMQ2nDKV^zudM0P?7_>{>`XleH2)lb#X&kPj`>$~e|b z=9XQ1`6Lp>(2UBxOhuG1_T~Q;vK-3`x;r=s*kGLs+MlYnU+YHLx; ua-@e5wyaIFuHE+}4ce%y_r@|VGE z0{s>9r>!%fWTgCdo1L0Csr1l<;J_((df+g_%JPw^; @H~Kc^HVL zww;b`n;qLu$F|k6?T*dKHy5-1GdJ_yoXfM$T4(R7y{n$zQ;Gp5VaZ%k6j5h L7Uo~Gw wI Ol2`K_6)gCTGQGr=w*c&gpH zzentNW2A#+Sr?z8z!$cIKP=UeXm1mfSVpM$Tle!tOH8fEf@FF|3l2^i6gN^*F W{I1$88-!Wv8m|I=(#wg-RQlNW3;?yxb>@@1JuXot{NH=d-xoJh3#y9t^$4 zFl$g1DiPlGwN;JQ>$oSu&scrFI?JQoAJkp?|J{D`{?BhXSTbE_>iSpz>#LUSiosFX zd-g7nvJfnh7+^R=(i+w%gh>X#tJ^D;nFkd#WhVN>N7!S_%Mn`O7e0j;*PHVk2&5JL z?HSjyHvzRo%O_CQG`fNdkW>tf5QCW<+E><=x)8JtiqCU{f(h&mq7_S(VikiN-sEG# z^O?}>riTnsmOFrGjk#|vGbS&a3rA>evz0~LIZ#@(QpA7{QZ&P;4}>dV`Qe^MF$#0Z zk!GD7x{o<(Fz$eqwnZ%UY797pd>YDC&71`f_J+A&Ul>PIeP?<}{-!?$v1xrF&r%yy ze_oq|^k9@%^m>@9;C>e)RSw$X-$${f(d<#nwSgt^7ZKQcC3^ > z2K>9u;A)lq(Y_@@E2$KL5sAPlhJOXNOMLEb2PinuN&!FQuvEbkEy5RQ`og7JSOwE$ zT&8b)Oi%&e^3dd6YGqsklqnLh1|&XeArW_OJIL{H6xuXP=i`X-JM18QU{rFDvKj#S zNPPS7$+V8R2o96A9xOQbC83X33M`8s7#7aZ%YkiJv9-KNIVp`xM8K&IUx8zQOkk;( zV{MITCWG#4PDp!^X##fzD`OV`LnfRrtxIG4ga=#TPNd2zs#T5A9hs SD%#*-T14_M)NL;HbGV<%3*CSScU^ezCdpZ4V{$bw4Q5mxOFCiJwGlr zfoX}x@$u1tl8w1+ tytGbxB+1!2O+F=T&{nMw7SoBMe{eYy5u~ z?ZROQIMMI*1-gITAb+~dc&TGgO}v{pi((#@;ee!VA%$;f$FrtCbNR6H#S`5p8KiHD zIBc2h=%;1{;td8O!}u^6{LTjJ+o33fz7bLtlIzdo 68RQccs_wl7 W6<~4`>GdLW)zQ=yrALtGMi@(|Cev*(Jv-Jpb=h zU$LMNNbsNyYlzN0UheBD>pE{zHQAQeLcXe~hb7y=akpysdq5tkWQD+8u4K$a&3NJK z(GxN-dG!o1Ql;u-gPbm W0;-bl+Fp0_!2=1i52H zIBU&B0@5+$3kCI~{u>}l{e24k5G28Ov3JIzSKc*{79|W0y^IlVy(Pl1RIBKyL<~H3 zH~soGzT`w2a(-ir(Fq W%QJ4cj)_w0&q1Inxd#NfJNn^FnNa_S^iKElJ*4AAXttH$U22$m z*CF(TSI4%4=X$&GPTNvx*?$pT<=r8uehc(K`{NJHdOJvd1`=<3E}y?uJQ5JY!9M$o zQiDK3vR&W`h5Zmtm5h{aIRzI%hB_TU@d_043!;EXNf&{b2oqcR%h2CPlmNJgEo2SP zMv548xDwE4T%j9uXh9L}2vIx1mO=p(EHFuHbA?aEZBb7u3$vT4C}SEbzK{^Oo0C}N zPKQrk;FA5_h)w^&Cvze!(hyMGZlcAg1~x9_;?pD!sR|BL@K+&7k8u8kz%&H`g=tHu zXQkT?aoiA5ni4kX@_>^M0Pw!3EY-w-O%6jVF9PiIQsE|Bkg6Av0I@O>A_8t1m?qg;)=!W()#F i|=kE>Fohf}}0JCyQDX=)PPC+QO49PemLLLr9ICU4i*t0Z~XrJ0FF^ z)9u%XTmkog Xtij4Z zQ+#TWK6Cor7$E)x?SYKO872tBY#FWsvIa^pCvH$jF;PGnm&CwKpl2{mWYfW6=QpB( zf*437*a)dbVBo@m!ph%JY@S`X_l%>js&!d`9Kumj6A5LXin%{OEZ_JwXuS~T%60aR z0I*84Rp@g@+B5`FA@ 5xJw&3wu znsfmIQ#=SQUWKLdHA((yTgbeTDfVIK&ZZJ*K*K@jozS3Ab)eVK4?T93ma*yhYg}Uy zBH~OzXA xrP5 I4kM4&tRIL6QY3mp zQir4l8b{lPTnvUf+RmjUDuu~!Bn80V7R4< ptpO>3JLeM z8&d+tX-H|rg%o@dPQXa )Quc1`==5SW7N%}s~c@h*_ zVCLqjLMfbs5_J_XAxPq6<7ucOKws;CS;kJ#6wvAEeBH!U%4A~vOlx`jb^+YIFO+;r zmtjWGz9c+4URXuaibR3O(tyb8pSYZ?Msv8>unD&DzKonwgaqr*JZOUlX-bL6)DdLh z?iDE~d$0aUVT+RMutFp$9&GM@j$3GczKm)FsDIFKN70FiDSq3yZ6ql$;accUQq _eaAjQ76lF3-R$vzsZ`c504g~|sITKQp+5}NR hPu_ z$TK^T%kfcBisYT?BGfFo_*=$`g2@;?$be(~tf&ybva&7WY@3;bx1xz>yAIO;-M!N7 z*ae*H1g8i>G#c!ymnBf~U+`ZLlhv*hqEN kTH;gjCKluCJl5Bc`foA!Gihq8bCH3 z5{WU7d%qlibd{g($C*scu5--O%O$oKyWK`5RC8e&C|`@71MjdyTg;+pRkx5%Ukf!K zbAT0l;%~9LU0eY}J-wK0t<#OLKC(r%zXb$;f|tB;h+DyOhgsKh+N`zr{EJxWI b`t3oNC_w~c4&ct@)CDOGc6Ya&O&TJN}-CxkO&=^XqQAD ze4lj@kU~I{iIGM@J?k >(8v3ME+Adt^L>zG$^{~1e@QM}0ScoR{(L0s zecGf~37u8xH+@4glu*fNogMU2P^==fUJf--azg>%E(Dbg&Xw1%t|Ha@0Sh1*{#Q!% zyJ+ZT+Vc!-A&WoImk~LjU3b)U8dz7L9SVHlk_jlJHKQY~a%eG#^0ZVVn7pli-lvkH zijq64kw =`s}(#=IvvOYpdLd_~B)tmtmBv;yw;F z w;dA`ECCKclmS#QTULHpF%^7 z >}0_5Scncn=D10cS1}hVm?Kiw
!@$I}x!U zho6>a(Ke^v7R+yhheRgJ1NYr%g!-%$^U+Wt=(R9^4=UIW%*dUJf(fFhj)SR#KB|di z)XREhGCSKwT113Hs%O$d)397MIS;-XNd>Pgk#PcaDdiTGZlh_*ehf|AYLl0oaOd0` z^gVqTYPr)5dVpfC#+T_Ciqm5o2=x@&LEEdj*cXve*g4N@hr*{Y&v7he)Iwi>S;%sQ zqX98>5cyQ*TcMBMbxp6{F+0Mv;Lf)`I9a;_{zoDmVF2qotmv|KyK0)!ZfPRvAqzQx z{flh+GaQt%Vv;iAzFxX5(gvr@;gFg3wqIoxN2wd7xtuEL6mGbzFDs)FYW=5ndnvnS z%08BmkKzAyUzG=e;QWPrz-hZWAG@ND)jcYY63mH}+QfyL1g|s|Y^r#s>%N~?*n~G+ z*ARJQjJaKF)Op(6(u`pyo7wH9r;SB5_P Z2YuQ`saS+znL{9G;?H}5<^NA zGXDaSr0GbjdScL9O_P3lFHDN#epr%a_hzo&(u!hZyE;}&C@`7(1YLasbK7lFO*u}# z0ee-6r^%{F5X{oZLay9$|H!zUn*nyyqQxNkFv$f4H|`%EOXH%8(>fJ`MZN)`o_M-K z{-9_S0m|B!y>|5-)`g=}dchz9ldY%+Et(>5!D4NRDAf!qVs{G}1({Sw%-C)_D#DE} zX}+{1c<;*HS5djowb*`-GWuPwOiz5zCP0y$gg_@v#cI|3);u>DPbDchic`x#R{fz( z-Tt*zK%%pJztr0Gw12&K dpqicd3mytGrJFi{HKIR-UBZ#pxzg~-CM-Z(y zZ%cYlFWGQ<`c{u3F5FqnS8*gioK;ytH9Pp4JHQC)sZX+v9*v(59p40fkqR>vV*d!W z9(5a2M8`Vf&-TJL4ft-28n0X*h5(4vfd{}RRXl?=nV7CuaLCE&*yms9cIVrxWcv?& zpUZpOu*T{$pZ}pnbT~l8DGNS|&E_?)UazwpZr+_Ih}Nei`Eg-w-{rjafy{S*-*NRh z^6uRoFM1oTq*h`|KsMGV&gUBu*5V|Kz{bZBs|v}_a!EictSHSsTJ$%hRNr-VjauJ( zPQUhTg1iH~rJo?~w(69vU0$2d_#-(vTky8*gzf(+hv7u^idysXs@H07+x?VBA4Tj? zzG3}x-n?RJ+mGd)KE2owz@MXCcg&h)pAsuqm0ndxo2y@`b`6GzNHRIVsXuEoq)ibi zn~+>{?C1Bm37jtFKTPcTdR}^4UV$x)9@Q*9Q-5XrakW86EoV=#;P#&~Kp82s;qP5y z(cQ7H&lh5EdyVFgc_Uitcd}qes$>jBW)lMxy~M)=P4)2M#WRNn2viwiQaSlo#nJS} zEb4LFMG;8 #gKrfoKF;JKWobrIWllk+bs8_bdS#= zW|AxaHm(WU00*HqDs(?CVZchU-rU2pPr+K$yc&H}avrKj6-n b(uR z)Q$$}X4E%vC^cy@#?bLG{Pjl7n>McRaC)clkAPlI>iDPW3pFuBAUOK3o $Btl!YcsU$=QH+u)>)jtvr9)G}>$+o>Vj59NyFisS zL0xfAL;BboWrgIdsmE0MqV@?b2BCr{j0nm#i)z4ft60nJj1|5#biB9nHyD0C@UR>q z3+2icPZ}AVa &;-AA8x6rAZxPGyH72t0>L> zh)XRAm5ViX&GsFqIakOK^b_@B4G_-!e>sO73kV|3mOr*rB~w$P10f}e*pu$p`6D@R zPhLct%JeDPsLn3wBNyhGY#}1~t5U@To*- TenCSW>Ny>fBmgn W8Qk@UG2V?R{K7A!p(i_Z|I@n+koRi5Zd4HJT zpn)3?)--yj?I~HNthm7x#ZkU}stxMpgloZd!>fiWkPHV~rE2ajo}78ML7Syz>Eg~Q zJEQaoyPP}t31_Ev@LOBlb6AH(hcS{h@XDdZza5n7Sj}xmU+?(>KT~-ar7cBEMcWNy zBZo%K)7-x)-%m>D6UQx`>Vzc4@g1ZnGS2@q5Ae$lJtk_NBu_apE5JoE5%LsDdqpvi z!aSFv`RZ~YSSN)U-_dE;C;1bff $dPRK(Z`jha*yAeALrT&sQHW`{oY zO;3@d>}VGS{Yat3blIzxlPjpVt-zu6SFG1Gi+q!Cn?f^D-J3lrlm|siYrHk_4p`qc zTdg|~YGX|kgHi)(v4e>sijRh= zSi&1DO~2i3y2ke;+uw3M?tIR_0+}}5$nMEILZ#*VT@k2FTTL~%$56qT!FZs&6qtv} zwVxhcw?$E!v28})J_CH!dnRtWok ~a=~}vGGeIV27Kc~}ACp(w@Qhlp>pQ$ZO>9pOr<<(>#R<5c5`MMX8+Pm1 z$(tvffLkcJ{;f$)*x2O;t|+=1& 48Ng z2C}9ZY0S9& HDZuUM+V$$>5T{Zvuh!T7@Js!I| z=Jy;EKd!c!Aj&iW&Nxt-mt@1SCIJAcJ`x+3#=+cjy*Mh i&(x zjokYE3E8v7doq;nMMCtbuq$8NS{bcsMYlV}XVk(9{FzP_<-IynGOym}Y8uh$9>E4; z{QksYroPX&ejRn#D@7$2=S^4Qu}CA8@ylI=;V{vjEI;1l7Z{rbPk0arlTZj~6eQdp z+B$iC2upE=aovja;#C7b8yBk(E?yyrWlsFnWH)OA;r=a>(pS8Y*2wE8*`@U=_FzuU zWSHt$q=XQ@s_PVeI;fw#37sb=%tsx|xvV>*Qx*HI?ofqju5vI7&U)(X^-}`eMzGaP zh9qzjY=#TvuP~*o!naqVBr+ft6GT4#uJdCqMTJ zG8r%ab7S|F%zO>8E>8_vCj4NBU3yM~#i1%Wz9C8?VW_7~mDcpox+9JhdU1WsRp0|v1dm4^4qw~hv zcBhwqb@LO=4srL~Bb2Df EdZz1zH}nq_>-9PehWrvtwp`I7RyFM;_mmTH zvRQr|iR&MheXPGz=Mh-mU^aid0`{r*nWQ%v4T&0s-|aEbSr0m~bd7P^?fx)idyDKd zLI0TD+y`q(7CBCPqWAjX_ WWi&Xn+Dt_3IAAI%mBFD2Q8z{6NYrJa3LBi{21CnG zl<$T_X!-ii&gARAfVNfube7}T$F4fw_2H#83ZgnUu z5Vwlq%56*`iblb=9Vnkc8i_+3tS Bua*d;I?Sn z^D(4$_p^#|8%X)({uK1}c!}(HduC)%swja1hYoSVL)PplXz(`yQaJt^OsUtWob!OW zRyJ}~LkCn%w2^sEDN#IMc~DF;t9Tn|spwMkld&^9yEPCF5Yo`8&u%pWD`B>4vr06= z{mf-vt{URdIp{T!Q5i)KjAuloVF|a$un?4* 0hKuVz}u>*$H$5hNLemEP2!0M}WLlPg>2D(65p*KP67|+w)PtiSn?U@sQ zw7AjN#a=~>h*mEB*?gKURJgh% Ejri8r#8y7HHpBTevKgT+twCD_iOp2bps=zhL>>ejc@+?!8>M z?dX`j;ZYUtIurNR`xY+Sk9NwQD8||$p6=Y2S1+e0@(G3Rt3Jt^6Jkcj=D!&boz?TP zCZi*|2Oq~?Dh!1%?X6QgAIKm|Z=6XDp&!zg*Y`tFc0OZ`wcH1f9`Uv(W$W+Og3mWH zP~(S`RR|GF5%IB8NSu9+$_o;>ng$E>o;4H EK$+F>33t78BfP!nI;kKY&9s+xxJn zeg(!Azek0JAVAR(wi%{>ula7D>%TN;BTa}C4e|aXq^0t8`1kAU=WV5V-nbWC6bU(a zjnSKX>*7j~Oteq5o9t^$v_^q#VLco%9J)#(NT+m#X1QtwOwPkw${w>c1=Cv^c8|qN z|EcYWPwExn6Fu)!f@z#C2e(f8m 0^_RT zpnN=NBi|E47)>dyqYAF>PYyquiIO-kJ`KB*N&ffe$Pj!k+wM9m9u-ho@;XIRVl*`= zK)nLV`XC4yKBK7ag`^^-h%00|(M0ovI}pVPEzS})irxSvaJvGw>2KeWj_Xj*=iQyX zY-yanY|mYiJ`>I;vc4ujLmnz~&HyLeM`Nxw6qMGjutuEZJXp+`Dw-A}Ku5ce*rUdJ z=Y=tNQdL}@s$n(qZ>g;A>yn?>DY&F#np=O?TE+C|lHkYT;|s6rQ+9)|^>MM==3B3p zUb=-OUv-Qf2$Tc~k&!A+jPZK_Uo^msez6N!b;zB#&&_yIT}A*UjMIhsNEmD2i`Wws zA%f8tR}Do08f{#!+JhIBDkHASn$J~-Z&1Y@E+uMcHGS&2l%lb*xt6TuJ6sSF*S(jK zM$eCBx1l)3_W6{#?b~u?g0<(Z!~_K@&4)kNsFG``zuj~9 98zy9&PE1^TCm@+*AU! zBsC_5ZiQhI1^MFaS)F3{jL@ho7~!G4>n|l5-M3-YtM>*nkuXv76}lbv=qY`dF0QXx zomU1<(TTdu(ob_(wg6H%)6^7cxQ@u4lzIgh+@Q+kh*J`;S6aw;#F$ov^x-6gUZgIU z#?k34awsUz1nqDi5_y~kzx)oK(0BnvK8M;l=N%`4rWfwagyYHcI3TJ^=L;W93B>{x ziPJ59S|m+r7Hn;T#BNX?$tj7k1prftLa$K)3m2XO;xh&skqKdo5))|9UP=2qgcDN| z)}K%`ezuzA-8g6oR(wvx3jbZ6{&mLRpL~gx5~k8BN>*lH710g3NI|wYVMo|CYC{kf z)psZ*qVYmQt%D;U>RZcLE)Dt;n5J`X*SNcPwcYv7vvS~;wD==#_@ipI>7k1F Asj>aI^`eq~yDE3uuBVDhT4<7Dm)_bTg=f3M8P@4|H- z@?iht%0BnuxW2{qT#)!Bdo}n% n2 zeV^!h5;&*sdHD;k1ODr6^gzNyWI S|74%z2Cy@f5jZg!qnn3JDBuaMw{NhkJxuBwfySri;FyIj3hIIqQZz7 zo5gqEVq-isd5d2^?&B;ew0*n!+$-U_#5oZpq!hqsc4lFIC#eyJti^*0w51#sGw6%Y zhZb0;trttkoisNh_80EF07I!e?oo71cG1-o{=BJKRyUc|L?;2spMam@z3hI<3QJ@3 zT7&*Pwl3XxJ?5PrD-;6-#-=hS*j0$&P7KRL29dhgI2lFEaKEs}L-fUl8xu(hiW7+P z@fm7Wx+mng8FRxRl}ad(?Lp+7Xmf|7_sFqi{5i~JdGx2or5=My1jYlxOGLV>egj~7 zcoL>L1=s#~4bPw3Yo3HNe~lj5TK{w^kJ0bCJpOXuuhf4{8m}X6=3ILS?o)ceQT=Cf z?bq|ZNyqyJt-yska?gX6)FiN%LP}=Q3JoZYs>1_=qXn cV7AL#?RAyG_dB>UuBciPvjs<{s_miA`JV2sQUPiqd~OsP^l)8-p1wVp&d$Y29l_ zf>B;=Pp8k{s=oD^rXRf-cB&|^6o)#uLHILq7-^_&c@RN~MmZyTH-R&1RvbY`h7LTa zI0&jr8s(ylQOkXQ_S zl*t;YdN59+4V+L*W*5%xo~1_bU;o{N_F`peF~OGmw!yXA(GhFjx%}kLu>ErLQ2W_) zZtpIIqn?R4(hLXGIpF;!q;R%m3GgMmN~~Ibx$hj(h>|!V3=D#mAdCTUsADNaWS9IN zedw;6yDx3+U;o}jn|j-}Y(HI_F6%rsx?QZSav=|Rnbc6TvI0j>AgNyqk3Hd90mDJW zYUqYcE`J(CIP66G2hvcFgu<7_g(KsQ@p|SsUu)gZAX~ckhM2l(tlmZlo8qdr1^#6d zzmJ-8*{-@;b?>$Cj796-@H>e@O%ly=&Kbta=RplNl*iuJ3-3_cObDq>`EQ{RZM}?k zx(;|Wmel@aBk0~c2p!yUgx+9r63*t=d%P3u{9OFH3HkCltKh)Ly14k45xZ3~Ce6vU zgC>iHn|wV=M&W)qoePpUk^c>+a_4M8L3N*gh*tCe%KMt^d&hz0FRc9F>8}g%%MR z 0j?~1<9q$vf6&fR8fIRfhT825x0mCIo@9B1hhRD{SXfEU!&;Txr zAu)`xz|foy_iGdjKn|w0uO&CV@C(@0@~)*nN%EMogJs40C+1zE9$`#d9mDl8yqiH= z%=40L*T~2`&pXft+eDT*+}idErFcnQ>0*7?%h&YSIrrCM?Gfh^MG@lZLa(3Sv#7q$ zHg(NsH1JPR!Y W^Cg2X>0GXbZi(dZH2AC-xRSSg5iSO{<#FAvtA22p*4 zx&@A}-i9q4GHlOq-trBW$%C{B%!XY#(SV(HVdW@U(aL+|gh&KjfFeT-I&}FF$re?o z=4@o&(`b(u{Y;1uD6S*WHeZvp5MQuFiIi!Tp@LV9+-|rDev5ilV(|~qNQ@}w={LIl zmSCsBGgxExi=TG;J!Oy1+TF9vw3T_7hYlm4W(joO9BDKzL*V`UvU)R@iZp lksYNOyR&%Bf6KaBjK1cK<=Ge=vq?J5tuY65O^7vcP*4d7l9_ zgW%#W=jy?OQ!z2&7f9ZYwWw3Gnw%z^*XFF9vpnC6V-G%6&i%JRz5rH`?0u#8cHqKs zpsMQ7=$IjRu2tfz_YwxrjGG}}&YrGtWWJ}la=p|L4Yjc0&W;zL%2JllL9}p{Czfa- z$Xl}+3Hr3-(|0>b@cOh;zrp)u{EpN1G|Q4l9{h}hi-Jw7WM=FpC*UUgV*9||KLW?f zq!f>T1hNnoe)V)I#VAsyXt=a=Px2 @grtHOm8zu}DQ0PwYNmIai%^o^Y<3&ki;| z27EF0>vQtB`!TF%1M(qkGf;!`o9|{bF;a!1b)izIpuFrm*WTzRqHBKGRo;@P!e_pO zDp)Z`E4B&Ci{`SW;LAsL%Gb0X=X5taxqMwP7kJrD<3D{zXSHslG={Wx!?t^#ck_Kl zlC_ i_=_9p2N5NK&8F`m)$03u7+sXun~oo>k` zXI-~kfSa=Isf%#Wmd~oY8UOHX>uq J<$uyb@( w)b~LG2qZ-8dK5uVt~O;UI6K7L@<$%uTKqsUv&Ce8SsH*DmA=0S+PT}KNw>#8 z1;Ob0TS*pm^&p`x0#}H3_#D%ss_TKThZnc*E0x^t>&Lg$?5O1}jDvozpaTiPz I<{^aq9$jdVWrY{M)I-u9EzzFdK01LL$g(ZT1dLNrl{?tW0rz%N_9ejDu; z+qbM~!gYm?r_Z;XU!Pi~{P#VAJuge<`o61#@TKes1n(JyNA|!|t%7 j}I8@4VJ7{KxwOQ8!h99e>;!JL8;%}n(cN+K9Sso1+O6)HZR-NNjaY^Rn z906G Mz%?iayjYfrGT8 zG#S90|Js}|rs*ikhYJhN!Eae32bc#aX-c6@gYfF}rKngo=l;+!F4$O #^(#2MUHx76tnrx0V<0Yd^&~A5O5mt%PLyNj$-`6!BbGXT44s>D|C4L171 d@eN=8+aPBOukC+~kp9g}>}2|xy$KX+HxuiEWl`zK8|qR_?# zQd^L*^up)0_*H)6X}llKakOOrTH700&mLsamc;X+nxLmt5}}m29SCw!BOTCtn0*70 zMaURppeq(GiSH94_^vv+oX2*=Jf{kOMG8{}bwsxIuIuZSRzXCh1V}J?e>nzIAPTn* z?<2kwq2@H;5J_8%#Vq(^1{f%fk;$znMJAxzuj;{7Yk$2yRc_tQ&2+j>y~>r^UJ#{+ z6pYG6S7s8yrIcv cxn9m{k7j3WsLkNN-z4u^D?iwTHgeD=xSmn0{fLg$|7d- z_Sut&6S4L0=Xs<4=cE1C^D-SD`JzD)>vy9;aiF2mw0w1?@u`Md ^3P|1QxsY+^^>~ Z!cDc mim5G!pq}M={-;q#I3Xs%r2xIsFnFg} z&;4|#|2pos;V`vW+kZ4-I;-~>ixXPxEGGvfyZ{>H94BTb?T1-(GmLn0FlQ){^7#Dr z-}_>X1>7VDp_OMfT_f#fZNQI{1(_%WDDyEeFm#z`HJ?mF?LW)9&=g1?9ue~9uJNm; z$GkM4l5~@HNwGwl%`<#KClX(=b9Aqtzk?r8m9A2atXCz2$|lK&{%I}U@OcVKOa0oW zYYn2NH*ja?|57+;J5b7|zk)v&6nrd4M#i8ue}9?wVr2iDVOD0}*swrz)b9;}!*Bd0 z!kYSLFIh;Bf#bH2^PuuPRYHFnxc9Gn-~}j=R8Q0PWnu2PY8dNC7B`&W6DP-AOVS5@ zWuD$f#gYptjQgyz^y@)>wev1^$W8G6xwvKHaXF=huj%ZpQ9<{9C7PZOF*Y&ebe@85 zuiLxx_*e)Eugr*aB(5PIl9(ODgp~#v*TdZ|- y4?s!dR7PAnMVAFo3FjD9QZ`nD~YWh62lm@eX0JR(s-VY{e zj5$&Ros|AOUrm$vx#X}H4{)ej8fu26s-JZIBEooCbhPAW2NK}~56`IB;-O-zzVA=K zS`AE(_eE1V%jpW?I_4x1>H5+8i3m>FewGXip_d9@0zdaMYVX%#g>GkGNjrlJ%$B00 z0ekl;x-aj4_Mi8|mx0K|goI5((z|Q4=@;oFVyz0uG(cA 72se8lSh?rRZC9C@G-jRfPnqSh;p4X9(5F~6f%39I+U&WA z6j~6oOf^vT?L7rND9!Ja3px9>4?DZ(Z1(5A(g(vTAfUJ+XgaW_l}_rpGrDI%p)l_3 z{KvS0-G#NcOYVtr1Gd7}UKN^_DHEK{AUgJ`bD`%ts_3X_hl6~m;zH(Sye4UO_4?Gx zXM49fUsECBrTvi4jb7IgFs~t)=T+gQX2$@V81f#cznDBdTH3$NSnGx$eKNl&d@j9T z?A@(plc%(;K7WUzzm&h#W(c15XC|lj`?_HJ;USa9jsDNyja`2)jAIcDXTqXwy8qIH z7J$|I!t1Gpv}>zwtB)wl?DtI2u?7YEiJneERID2uF>{7{x32dpHGQ?O1dLlHUge)` zj)Z9(#@}d}HNgJZFS{>7kP$PEvKWLMmWE_dCC=NjT!H@dcF Jy~B z&Lcmh%MeCy{Eh%oicl$cF+2UKrSj3L)2z{7^5nhKQ~R->jjVIFp3#&YdPQ^u) ASfMJ|O*Fvvm5%0T_Dy!`9y=|e-` z<>&%h-sCoDr9>t6sUfZFLP7BT#ojC|_OFq#ou&K3)l86mWZkcRKDfh-0RE9coy2RA zs@9a@Okcl=A$yO1m5-fW(0=KKxA>%y;94+@=6`wM!PFLvM757L2nV6hBH6TsJlSK; z;v`>D9xTCfQqBk`T26Czfyny;(0AtdOywz+OZ3U&7_r7+2i 8^eh!h7=q8%QD5hmQosqbs0^_^a53x{+A$LtRnD!ckSD zj_u!-9R2RIPe~$u@1?Its4u_Y&keLX21yrSk_Z)D;}@SWRj_A>*FM3zYPt&Tx%T zf$niRsA6}tyE6Reh<+2{EBI~ze+wC_0*HGyeMqSoYxz2s6l`_|_+1)TF6S)iJC%mZ za%v6wSdR8#;>8735e-0SO-9KM=cg-1wPwgd5f@%Y>?^%>)@f>W=2oUHnitsaNwd|* z*=}UUQ1Z8WRB<;vn{sQb=xa*|S`7HDi0NQUu*L9(by0St*8FaHG0xRvHMd$nljQB# z=K52d? 0Cv1nMIN2 O#?oE~H>4D>xadU3|NlVXNPgu(Gs;>sO3h zCB8~VUnQf@SzPx=VQ%+mLjxfJ#(F}72%6%GIjq^fR6IApDsB}S2n}44x#-k#3SuXy z^FPK9q&8*Q_#48iwXP%@m4iLXyyp*;<`iD5drupzcI`RrF{wUk4~@NY6dF%+MFm$b ztQTjO&qQjGH({@9iXI&c9AL+Mi05AdaT1e;VNsM8Ary@hS}kc^e=aCAt{ZTh3M3$4 zUQYpsTOGC_L1x0%L*Y9jZB!=grZ`wVgXy9Wo3(S?oXj~UgZ6l*Z0B z3#F@=WY~xZAPFNY2B*tXuqn--({;8>>f94jmmQ7yIo^cq tI(~_3lZ)Qd@|&O2kSX@3X{d+I=(1(qBwFQ(s3{X3(}iH6 zjn%5?McYLeVl*65BXX*(%p(i+fk=oUf3tUqnnP%SK8Ha4o*Q~OiqsBWOrR`GIMDZ@ zi(9h_4Bfk@VTUgZJ>EK?XZc8Ogky={F5dgP{_yzg&iZRx()Hm8`w2TT-icQVe+);} zljI8V#$YGti7N -HC9y01YwROXC!@Nv$sQa~zANr#Zqs*)6SBhAX=fCg4 ztFBCv+w^wY>pgt%8BM4jIrV~jzeqE}d=X5eKXf{oR_sX?EoxS`ILwb3{njcJybXu_ z-rv@{8##zS-Q_Pwmody!XzTJ$EHO4qBkv}jmPUE$C4i}sQE%7W7K&~Ps>&cK3Ra!e zymaL_C05EyGd~X8cIRGq^28h;W3Jw>Yp=Smc4ZWmImZ%PAisy`W}wal1DZk0-AA%) zdoX4{hlydpOy>*2O=zjaIF9BE*ca%W)cZp&EY|J)KL48M^7*|Eqi4SxXlu>>F92{r zkH4B4zHRB2>#zO!uV3m{{T3H q}Sm4;N;dR!*uFQ6fp=XYhIFoDIQq=G<26?5E_ILdF$pO^eB}a$ez=W%(-$ zey#zY@e $J9E z*UdP&MpQ^aJP?VxMO1-d5-{JVOr9aJ72rnJN}sC!eMCVuCc$N*y+6l9vM-C`jVj?B zOEd;zlIqwIjwC;#Hs+T4z~!)nr7C~#vQ#}|c8D7?-iLv5W_#c8lAYZ>bKdl>_s^R@ zd-}> #wW zY;>BTCP38>oH nDQ;A=x866A>st=g0v!eM%IoQ_oQF z->Q@4WH!Jg9JXH~baJ8{9w!3FEb$x=JoIP|#jG)0a|Y$)9d8K185HVpp#(v8u#fX1 zhB6VGyOmN~mcU|-MN0foCJR3qgyeBh@JnPe4PqFIkSbL)xTjKuBg+KE-XZD*QD4cG z`{O`P29xAHRQ$0C+qQZ_hXX(v^pz(gL=LK&vWJ%+QaPZ=p1Gk^y!1;yx#jQp>t810 z0X -QZX^ 2S)z{>s)$NNM9tW&f_bC zWC(t@(SKLzAtik*upK%jmRLzbMOP{nM45pJGl>Ljv#F=xHgyl}n7?LIXL0@3uJb DOKkiG|pG4W(d!#u$0nOm3 zI0T=|nv6XfJ49zD{}#QQ_)+|OjeL&Z!%_R?Ym!xRW&a$hTQSPP`-`CpNoF4v7k!vc zqAv)Yq8lbJecnrMfMRLEj@|w9%v3h%n`ub}mr&+3iE CB*9(xK9*u)e6Lc3 zbrJ4+LnD0c&@XYS!AWl3Go7lNSn~OAeD5P){nmH>^{*?pzJ1Ap*~_OTj}|pZG}e%P z4pkfcH`_SIcO&?-kw@jkB+|9iDh}`E-5J47y|a`md#pptVQP#|;BHaFKl`S4eCYRg z-T&xQP RtdO0L(`GtfID*Nh}Ss_-#Kw^4?T z9UlC|)VOS9iPey*FBl<0=;JEquDlm&`?$B~yk;0lc`1+qd~SLN`)B>@>t6rko>Jwt z?djy;aRw(#dppC0;yfgKHqx^*l}e$sS~QOsx!CAYW`8UD(YU{j-b0+1$MXXAy?B@A zT2NsE@dmFrDD$;vH{}Kw&Y!cQF&Q~HA7?;*`Rebz`H#2Weu QI#v~~M@D7{{?yXgP8 zBV!%2C3cUtCeVjI^W&fU`p0hh^F1% 0m_|}M$c%MkL_jmTA&Sg`#Sh&5ExM;U;OgA$q4V8y?1Ij_g z6L(IlRi>h<(W~mq(t `%vpf0XH?-o4m0cYrj<~m*vT#%$3tV z9o`>vP%Z%e8GOQUUNjF!En9el oPkyWD7N+`mQChf1tTxMXEe>9u1=Q;mV6hWzQ$QF Z~4Lo`9YFp`ht^1vVEoqGfmPQ z(Mn^m>Xk(kCS*=|SQx_tV% Il;|qwPu-QsK7DmHy!#a62)!H*Qx76LLiu#7Y)s WBkX$%6+n*r6=GGty&_Mg>^xHXF=JB>4$2UowR30BSoz4--T!gY z?DowqaUFq)Uf3jmKYsT4+?%o_B1ve<^7r=qA7IQ21E`o#iRm=JwZCRD$yaxD><(jk zdVl~~wnt@xE)z%i9+ju4FqKB!9A8E6-T0lwpGsXCV;|M-R& 5w-^tA zi9G${XZ|U)lGBFE)fsp{Hw6aDeEtT5a!gD(zL$0ba94U{}6A;<+~Fp~O$*4Mq|o!5WmbDwyBPZ0hIS^GyM zprYC*iDc>cA=|Vn!NMC55q;4ZP}XaffYbsE#55*>q#8<&SZgJ)xKDl$>v1)B>2kw{ zx4i2kH{SQ?<4-Ch @1w>d z(KaqsRG15TrMxH(l`zk!c)6sx`RCVu|AmX@P219*vX4xF z!(=c+mg~O7cq|pam^%@DoZRx??qL@N%bYNf8L|%$J<6D z5{{qIe^yw&3CW1*Y(uWQZ*ZQObdG5D^WnNLzKMweBD^KY`hCu;5umR^;SoRi3Z3|E zqux=B0Z{qDQdrnp&O?+(mik#no2=3|6oGyxlMxP*9?=1n!IvIaeQ$hEka%Hy;cM5N zggI7I88MYAt5R^@EX#Z|Pl~0I7{eelf_BRU;rRU}8)`j~&nAjD89rnDMvhZ}C6hJy z9%N~;P20Ps-~Z5~&wBZb|LOX})h &wxL&h%tl6040; zsd#^~_%j3y%lDx;53v&D@OTKZ=$P#jKPt9?N3aiK2^J a*5a+>SLdkh-$hb196e>SHOt2H`do~S=+{e6-6RNQCOJ1Yw}D`;h@ncg zvFv&0KKbeYeE;V@^NG(5l!9BD)8_DzY9p+Gp{^F^%;!tSJ|Z% }$CxQ`Mt>w@_e?a{U;J;s_d->WsZ}U>V&|m?Om21hmE7-d zf8gKN?%ch|NBN=(uHT`LM6?G!)Ka=GC8f&y!jB*Rh#06pSX{6Ez_RBK_%sjtIh2;) zG~b4@fi+p1rc4!C5Cdh|58=VUPkMd?=qOSsbF$)*2SsI|2gCrTRAb5`$OmT3po(WM zSDAYqm!#pAiX;-*q&WHF^TZG>W}8s{iA@2eiBp`oGJA``Gh|gI+@XQb|JR2 XnI_Xc~gTU>h; 0D?o&>!M^s6*mkv9|NZC7b{cQ7! zNa08iUNP`E3D96XVCSZ?)0cH_d)oJ|{nJGU-58JJFVw3C 8<`)!(g zF#{2JltFA`1`YXo7U3ZTDo{2~60(NfPzkL?8#Zlw+H+p?;@>>*$f_rAD+CSuKj$N| z1>1~Tqkd8m7V#VI(9Wqg*i_$V-1E@(bnJgig|Q?FBF6@NcH_xXUHLktzKfoB6KzSA z!iq~`u_iZz7M!T@nP-U#70`(lka&L`m-f%SMK5>v@{MPobIA+-4!hNJdJE#za%eXh zNsOxul;M svYlfAKRY`}s)aDg%A^izLM`hM~U++YpS3 z ve;V## znsg7`jPbrfYnNqck==>XXFkUA^b~AvZdQpAvQ3ZQhmVxg7;`H19W( (_5wkV>cX2iKa8{;lu5_u+Hj_ks6+%C^!CE;9INLabuTO!&)4VwYZ*qx*=s zN3306{O;uYGoCA|pL~BJAco2W@QOkL3xoL~O3C?I N@4n~Wr~1{fkqH#?Z3G-yhLD+}^oo$mEe6UZ5rWV84v*TLN?KFx zPkLM-BOh^gsUk5<#5E9aU`cV#Cw#o@P`=3M9U7XmYj^MLqyMQry3eo&6SKeH|KO8e z@~YSU{wKfw{l66hW2Vb8$LLQz+(VYfXM$Tm&tA>}IVPb`8I7T7QjdGdj1d?2nPV0M zW#-5BKXLM?D)XsIQjcC0L2{t0vQ4NT@5I4mdhSs1tsXSF##K(_xJs=okIL8|ldU;# zbrCa@^cr3u;6r8NA1fP_D=_R~6$G?FsG3qe!{xKy{+ W&&hkZv zQyruHm7UVT#*0 px%x$kt(J=C-0Z-xKzfG_+5YdsQHhvJt4JN|K8- 43nLON!tL-V_mJds(8Y=COA$;|tNk06r8p*&w2DB~1hFoLYx1O(P{lFH^ENx#NJ zjQjPGo$ugfPF9uyDJgV~GTAvH5J5p$P;yj*EaYr6MAN)e1xBXA#g`p81Ubm?56XGb z3b8`ZT5t~oeW+uJ&)|_EOT%L{RKa=pc){^_^qk Q_3f cAXza1+(Hv&wGiBZu?hwYxbIPhAUl6HQ&Tc_%qmoBkbp!B7K^2>xJC;-ZNRR` zZDpHf+l{)y_#F7TYd|6mY$;W(0t*W-3fIWa-eELd@mMi@= 1$L3_v<`7WkPw%IC_anW zjw+*bu!9bD0&y9&_;khwwD$ISjNrkUaP4`~qw!bopph&RZqBPzpUQD2Gm~q9Aq1At z);to$Akax5#|vLA%<^KkHG@yw0|{SdfvJVtqcjcnXE~{+VvsoH1#kYqFOhMx?ctvA zxwEpOdusZCh8Tx F`I@m!b@&s*Q0DOGj|b0w0-?pgG@p%=nMTls@CPEZ-zslL|^GQ*<>B^FhpWyrf8c zmM$lyf^kZamLsR5>f$GGGCK;e8$f#A3tsz%Yget`a&~At(~6#e1Qg>$U?DSj*(VYq z)+{G%{2k+uG&~OJg-z@%k^wXvr3ROva;#9-QxdR|o;w;(#O=QJq(%u9(f3A!%)iwY zAFG=j#6*{ZA$|fB37~q5+A_LVs68#CqxtG{S*A{2JWGc1+SKF&$ {J{+3QQriPJkcD&sR*J;iUS&c0ydL>J|aXu*(dot#r`V9ViJk@mlo6lw `h{S|-u8{Yo@|3k^4H=^Xw(D8yRTAqXO!!*x#nyP3| zB `7&N;`>}7BfSeiu8p35*1f@__dYj{=L{SZ z%8(T^7Uav$5+(e+=dm>>f8p!jdq2$3-v%>u-R~YkyV_CqQ{VgPuV4O!uYLCekjKu# zcrqswT```PHrWBI#Bj(&?^{*(KvqkUF`_6m6b;gpqDM}c>gI~Ilj8FbFJm+4$0~&P zb}6wpVC=i2#)K*fioYggVhn$Y+Z106qn~8{IY4H#OpxNZ7vzSFTXIYU;tjKW#CM~Z zF8TutgGP=M`IFlKnyD*#+}0Pq;XS`uJrus6IVlEEI#mI3xEFcB@u)9;e{xn6y+`Zc zsrxz?65qH>$^k{iq2Zb*pIuq)={Oi4PV`nVbmT!wPDg3RTNsh&oL#Ee4sqUJYyXNc zhrt9$# opjg9p)KmV=?f1TFUFVKPP9|p-3I)6zX;MA@xT>DLtb6Q7Usset zCk5(q@S%RjtIGV6RS)G0BW5qvAdyAt)C+~dXjztHoRyD<&F+hY1YQfw*iB*r;4m8( zpHo<9O7m|7U@%~uclzm4@@ZhwK;v6E4?_o+K>#b?+aroSyJg9yDgyO1l9Wc7va?}L zMx}s}oeKM!s57KNorQffm{Ep&k!q6RVQ4R)Hi4u>%scA>WFJCWhn`28Q>MtOKmo#& zE@6Cy8l=eE?tkm+{_UGDf5wwG9BAWcZpiIwZOm=uy~w~|osYQ(cGqlZ6;7@d0Xz7N zAahF&9-;1#0TgC(;S0T6wxakS%*CVo5g)VG&D8D_RTU}%6J0zrq?z$SrkwYVHMFzH z0?A~Bg_YS!>_nC05Y7t6Zgi4j#X}F{Ht?q7b4s~cvp9Md;t9VjsTBtn#+=)M;8Gtr zkWA(QKWls6kSsaxv5!GFi61iRNV;oZx3%m1-~DaroC7(pV`&>%o fhLx z?eY2EG29<^qX$gU@#X$&naiq#8&5)Jf&;Px>h||JY><~R3Cq~~x#z!QqhCcsjI43C zS#%)WxSAuFrmN{Y_{PFs_kx5}p;Hy4jyv(usG04a`WYk_&3BX!*U2Tj) ze58_$ =THJ@0qiSE?=IatrZ|ADx*PZ^Nuq^`3x2 z&GHR%!R60>-o2Z5_AKn&U2Hy*_xr%dY6o?e@oVFtzH~HgyuLq}`kBvv<(s$M_UC7! zdPg>atW(Cv0uUaSqsR}r?2(D5T8vVR^5s|az>8XgdU7yMXQ^Lii58&JrYefw04$3^ zm9^{Up}02OY3(iRKKF@_f9Sk3PkTs{ANy`0P~{I#n=-YtzWmsD&*L6@sq44oEgfeL z6px41cafao``Mj4duH_y#}Toksr4S(xeP%zyRB=-LS!aSzCvxxbHa8{l^lOE6S`O` z<+^wG%uA(_p?DlE6wn~XmGr8CQ$(D=l}Q7U0(E5EeQ+0CpD<}+ZZADZP0N+VCXT~p z+4i2<{R2a1AaLA5g@z~1M{9590}XB;3^Y_GVa(G2Kb+IMb`Q)wnD6Rs6$0I5&-wLD ze|XW?zwzz&qg?wu2*+~80uy=njBmyhl+pccG-t%V;=jk^mD&idhIYN;Lyb>s>z;~Y zHSbib8pp+BIT=4=oP!BH^7ANJMh^1o$A7i?{@9uSC=cdH1)&P(s+CE7Odw%wt5ia= zZz>~SJRYhVSX9OMzP)YRwlm-ImbctEFfcStx2fY6fss~qxUTR>lx04kNZ7UkcV1Va zdQrtr&u|glrP&={j-GUP+TXIjIR-~@QMOk!SyhJA%C1wEdjRL8Oj21O3f#G>-wQe; zu0KB}I93-ZGiACyrC=!I1O|Q73UY(lev}wG(`SmHwGH*};8Itjshlcn!s8_o+#cS( zMfg2C(aF%p3twQysuU-vj>(RKu5s5x@ Bb=5F zk(V{*u~(ES;J|}R3M9dB=X%k n>dJ{p!g9}b{{imWL~guoYx|5!V2nA&9>MBp z5E7SylBHrsO2&}89=%Q!^IFLgmDwvxqsg`zlM&HSgk)~~%+$5t@i43ZY=8Kv{EYF! zUy1~Y2Um&^k^Ue2?4X{2y Q?ssqt`k@sqSy_0IycADlS_!`sdgI=GcFa zlsdgD{8M!KcU280Y&dR$1avr&sG+bG8qQJ)!4^=g}` z=TZ@&W6BH4QQPQ}1**@lf9} M@xFm2j276&pz|=^L{@id1QQJp1^iF;X|Eq z>M5Jv`sO!&AJ2ZzzIHa=C@uahehJ z)^6B*(l@{Ly*EHP+cMEZ?d^RU&k;%VsW<@Ut!V!S69-F`T-UClnG-$s(e(Y5t2dmv z^zjuJQ&E~mg$ksDBf*^knEj+u@FJqbp!j;^94KmtEG5b0Pm+D8A&_5k^5S(2iyTeY zK3V5-+h6W{>Mwr%+shNCnP&EUf>JxVj7~ q2HYDohlWq_kZZh0%Bv1NU% zte)&pg=j~wd!FamkzD;2dyev?-wrmZtz(itN43A`{CTd?DhEJOY%M-l#z^8AE0d%7 z?q_T(3G##SU*gl)jLJ2r0K^4lvYZ_|cC=k{%{7+~xl%`WOf6dEaX_~#wmBVD_v3)R zdEgs8;p6fB5+J*R(7O5VhhDb2t7i!U*v2q|>8xqU+Hf3jA5iAXJ^+Z#v< &v02 z!5ae0P~NKm8G`X9O{Ms6K7@SuRDeES$2*KHOA>h)QOyw`&`-In46>p3KuI4+B$`CW z$)}2bOjh}C8+{-%K3LD)grci7&?_ptyHT&CgrGe8i?|TJ%HdJ PO-`4CqTTN_DX8Y}Eu=z0z6YOWh;tbht-ld2g~@8NS52tfH|=w9cI;f^35rV&{ok z+Z5e|oOl6auYW*vE?XvSWSNCXe-60~@RI5poJVY^Hg+ (IikDak7x{mT z^h5Ff)lesD|Lh7T<0UilGMorv{BC>~_V#mpg~gr$$Gx4${?M%reiTk)!Ku&M8fDfM z1xF`#{i^M9f>^=3C7W?j9uakalV)ajF~8)R8-MxwcYpj--?(%2=F=v2oJsrkWIr_H zo!Dfw&q=%BV|qt>WPKmgS2OD5AKAM5)X#n6yI=b2y^lSooJcK1SvEM+B0z;QJ$aP( z@$gc%K`PcSvJV^+(21v`@sx0E1|GBP>J`mn#}RRMUTsRLjwtsdC%Yuv -(Si%`Ja? zZYc Z%U*4Kae`Bz Z|iR#Rb_Vp->Gs-+xRznz1 zv9_1%8~a#uj#l5Id5=xoN*2qNDJXn!+$^YGU~JslImad0HwnugI7T1v8Ng^v9zo7W zWhp^Z4CD(lfA)(TUpG)XG9F2jaLIe@;?c*Jo%@e_@0%r!oDuL0F!xrayHyfEyzGhi z-s7G8HdUCi{4U5+bQe9}{pQuLZ%rnK4#zbd$$hTfH86Gk=B<}{Vc6lKBW5Lts;qKx zcoz$ax)o&b28l%Trq1n`?C9>Db9j$<{Oo;a$+fThNeP~%CeJzaQ%1XO)UBO1g=(XNM3#fAi55|xo0JF)3sUi6|L{nv-y z^V3GBzCiq8Z7YZW;X16Rf6VQC54;bDqV0)BWxo@d4Z8~qHun{t)a&`v1Zo7sbV-!J zjLN}UG~7M3;IiT@lZc|D=5G{S$Mc2XYaw<#sw64oiUB(Q080)Tc<1WTqYSqtUPm*b zQ6Lf<86k|SQD($Ixe-|P!P_H?1Sy(uqg)X(aGPf@5Q)Zi;X#? S{W z>!=LhI4Bln<>I-SC{FRQ479y?UveTGWh&QSUNn(G6Fs_LUG+r6-fmAV9JrqwxStYe z(r8x_*6})4Nm8fk8QG?`{REqjOeA1m$1-|&Nnqj$f*w0{U|{Q-$@YiWZoTMzAOGzC z{$=^vGbehiiG6?MEq^!%o^s!eIZy0dkFRf!_p~0}Pw?Txzo+2a_pa$Y=gZ&v{^xJL z{jR4ERI07T0M14j(@3LpOkUHu28?eoMrEKjnvlxAj}rg5g^fAI8lh1ChcVf7<7C59 z>8e&mGLK#3$s|%eI7*0C{LTarnSHO`9kuU`zn}U*_NYw5kpR^gGtEdX9hZI_9mI-r z{#8CsWaFU7Sa}`FfR$soVU%qRkqlD^M8{3H{^bS#_1Q0ccj=n-Pd oWEdTI5$vQ;9k{E3oU(zl{q7(&tUpoj|J`;( 1BTi{O;B}ul&+C zfA9g%NS#!wnn@FJDvBDYa$p>RRc`iNMn4my$9ww?r>X>;y0yOA!Tu6O)wWUGZ6pCT zo(b=1SE1se 7hYRYU2Dg&;V_>L`EBL9tT z;*~Z