From de236a89d23e6ea440f0cd9b766d3e5273f20f19 Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Fri, 23 Apr 2021 22:00:14 +0200 Subject: [PATCH] feat(core): implement threading structure in worker thread and add resources --- espanso/src/cli/worker/engine/mod.rs | 97 +++++++++++++++++++++++-- espanso/src/cli/worker/mod.rs | 91 ++++++----------------- espanso/src/cli/worker/ui/icon.rs | 69 ++++++++++++++++++ espanso/src/cli/worker/ui/mod.rs | 21 ++++++ espanso/src/cli/worker/ui/util.rs | 41 +++++++++++ espanso/src/res/icon.png | Bin 0 -> 11596 bytes espanso/src/res/linux/icon.png | Bin 0 -> 11596 bytes espanso/src/res/macos/icon.png | Bin 0 -> 4207 bytes espanso/src/res/macos/icondisabled.png | Bin 0 -> 4099 bytes espanso/src/res/windows/espanso.ico | Bin 0 -> 28522 bytes espanso/src/res/windows/espansored.ico | Bin 0 -> 30894 bytes 11 files changed, 247 insertions(+), 72 deletions(-) create mode 100644 espanso/src/cli/worker/ui/icon.rs create mode 100644 espanso/src/cli/worker/ui/mod.rs create mode 100644 espanso/src/cli/worker/ui/util.rs create mode 100644 espanso/src/res/icon.png create mode 100644 espanso/src/res/linux/icon.png create mode 100644 espanso/src/res/macos/icon.png create mode 100644 espanso/src/res/macos/icondisabled.png create mode 100644 espanso/src/res/windows/espanso.ico create mode 100644 espanso/src/res/windows/espansored.ico diff --git a/espanso/src/cli/worker/engine/mod.rs b/espanso/src/cli/worker/engine/mod.rs index 9917235..c5c136f 100644 --- a/espanso/src/cli/worker/engine/mod.rs +++ b/espanso/src/cli/worker/engine/mod.rs @@ -17,10 +17,97 @@ * along with espanso. If not, see . */ -pub mod ui; -pub mod source; -pub mod render; -pub mod matcher; +use anyhow::Result; +use espanso_config::{config::ConfigStore, matches::store::MatchStore}; +use espanso_path::Paths; +use ui::selector::MatchSelectorAdapter; + pub mod executor; +pub mod match_cache; +pub mod matcher; pub mod multiplex; -pub mod match_cache; \ No newline at end of file +pub mod render; +pub mod source; +pub mod ui; + +pub fn initialize_and_spawn(paths: Paths, config_store: Box, match_store: Box) -> Result<()> { + std::thread::Builder::new() + .name("engine thread".to_string()) + .spawn(move || { + let app_info_provider = + espanso_info::get_provider().expect("unable to initialize app info provider"); + let config_manager = + super::config::ConfigManager::new(&*config_store, &*match_store, &*app_info_provider); + let match_converter = + super::engine::matcher::convert::MatchConverter::new(&*config_store, &*match_store); + let match_cache = super::engine::match_cache::MatchCache::load(&*config_store, &*match_store); + + let detect_source = + super::engine::source::detect::init_and_spawn().expect("failed to initialize detector module"); + let sources: Vec<&dyn crate::engine::funnel::Source> = vec![&detect_source]; + let funnel = crate::engine::funnel::default(&sources); + + let matcher = super::engine::matcher::rolling::RollingMatcherAdapter::new( + &match_converter.get_rolling_matches(), + ); + let matchers: Vec<&dyn crate::engine::process::Matcher> = vec![&matcher]; + let selector = MatchSelectorAdapter::new(); + let multiplexer = super::engine::multiplex::MultiplexAdapter::new(&match_cache); + + let injector = espanso_inject::get_injector(Default::default()) + .expect("failed to initialize injector module"); // TODO: handle the options + let clipboard = espanso_clipboard::get_clipboard(Default::default()) + .expect("failed to initialize clipboard module"); // TODO: handle options + + let clipboard_adapter = super::engine::render::clipboard::ClipboardAdapter::new(&*clipboard); + let clipboard_extension = + espanso_render::extension::clipboard::ClipboardExtension::new(&clipboard_adapter); + let date_extension = espanso_render::extension::date::DateExtension::new(); + let echo_extension = espanso_render::extension::echo::EchoExtension::new(); + let random_extension = espanso_render::extension::random::RandomExtension::new(); + let home_path = dirs::home_dir().expect("unable to obtain home dir path"); + let script_extension = espanso_render::extension::script::ScriptExtension::new( + &paths.config, + &home_path, + &paths.packages, + ); + let shell_extension = espanso_render::extension::shell::ShellExtension::new(&paths.config); + let renderer = espanso_render::create(vec![ + &clipboard_extension, + &date_extension, + &echo_extension, + &random_extension, + &script_extension, + &shell_extension, + ]); + let renderer_adapter = + super::engine::render::RendererAdapter::new(&match_cache, &config_manager, &renderer); + + let mut processor = crate::engine::process::default( + &matchers, + &config_manager, + &selector, + &multiplexer, + &renderer_adapter, + &match_cache, + ); + + let event_injector = super::engine::executor::event_injector::EventInjectorAdapter::new(&*injector); + let clipboard_injector = super::engine::executor::clipboard_injector::ClipboardInjectorAdapter::new( + &*injector, + &*clipboard, + ); + let key_injector = super::engine::executor::key_injector::KeyInjectorAdapter::new(&*injector); + let dispatcher = crate::engine::dispatch::default( + &event_injector, + &clipboard_injector, + &config_manager, + &key_injector, + ); + + let mut engine = crate::engine::Engine::new(&funnel, &mut processor, &dispatcher); + engine.run(); + })?; + + Ok(()) +} diff --git a/espanso/src/cli/worker/mod.rs b/espanso/src/cli/worker/mod.rs index ca9691b..fca51be 100644 --- a/espanso/src/cli/worker/mod.rs +++ b/espanso/src/cli/worker/mod.rs @@ -17,15 +17,13 @@ * along with espanso. If not, see . */ -use engine::ui::selector::MatchSelectorAdapter; -use funnel::Source; -use process::Matcher; +use self::ui::util::convert_icon_paths_to_tray_vec; use super::{CliModule, CliModuleArgs}; -use crate::engine::{dispatch, funnel, process, Engine}; mod config; mod engine; +mod ui; pub fn new() -> CliModule { #[allow(clippy::needless_update)] @@ -46,73 +44,32 @@ fn worker_main(args: CliModuleArgs) { let match_store = args .match_store .expect("missing match store in worker main"); - + let paths = args.paths.expect("missing paths in worker main"); - let app_info_provider = - espanso_info::get_provider().expect("unable to initialize app info provider"); - let config_manager = - config::ConfigManager::new(&*config_store, &*match_store, &*app_info_provider); - let match_converter = - engine::matcher::convert::MatchConverter::new(&*config_store, &*match_store); - let match_cache = engine::match_cache::MatchCache::load(&*config_store, &*match_store); + let icon_paths = + self::ui::icon::load_icon_paths(&paths.runtime).expect("unable to initialize icons"); - let detect_source = - engine::source::detect::init_and_spawn().expect("failed to initialize detector module"); - let sources: Vec<&dyn Source> = vec![&detect_source]; - let funnel = funnel::default(&sources); + let (remote, mut eventloop) = espanso_ui::create_ui(espanso_ui::UIOptions { + // TODO: handle show icon + icon_paths: convert_icon_paths_to_tray_vec(&icon_paths), + notification_icon_path: icon_paths + .logo + .map(|path| path.to_string_lossy().to_string()), + ..Default::default() + }) + .expect("unable to create tray icon UI module"); - let matcher = - engine::matcher::rolling::RollingMatcherAdapter::new(&match_converter.get_rolling_matches()); - let matchers: Vec<&dyn Matcher> = vec![&matcher]; - let selector = MatchSelectorAdapter::new(); - let multiplexer = engine::multiplex::MultiplexAdapter::new(&match_cache); + eventloop + .initialize() + .expect("unable to initialize UI module"); - let injector = - espanso_inject::get_injector(Default::default()).expect("failed to initialize injector module"); // TODO: handle the options - let clipboard = espanso_clipboard::get_clipboard(Default::default()) - .expect("failed to initialize clipboard module"); // TODO: handle options + // TODO: pass the remote + // Initialize the engine on another thread and start it + engine::initialize_and_spawn(paths.clone(), config_store, match_store) + .expect("unable to initialize engine"); - let clipboard_adapter = engine::render::clipboard::ClipboardAdapter::new(&*clipboard); - let clipboard_extension = espanso_render::extension::clipboard::ClipboardExtension::new(&clipboard_adapter); - let date_extension = espanso_render::extension::date::DateExtension::new(); - let echo_extension = espanso_render::extension::echo::EchoExtension::new(); - let random_extension = espanso_render::extension::random::RandomExtension::new(); - let home_path = dirs::home_dir().expect("unable to obtain home dir path"); - let script_extension = espanso_render::extension::script::ScriptExtension::new(&paths.config, &home_path, &paths.packages); - let shell_extension = espanso_render::extension::shell::ShellExtension::new(&paths.config); - let renderer = espanso_render::create(vec![ - &clipboard_extension, - &date_extension, - &echo_extension, - &random_extension, - &script_extension, - &shell_extension, - ]); - let renderer_adapter = - engine::render::RendererAdapter::new(&match_cache, &config_manager, &renderer); - - let mut processor = process::default( - &matchers, - &config_manager, - &selector, - &multiplexer, - &renderer_adapter, - &match_cache, - ); - - - let event_injector = engine::executor::event_injector::EventInjectorAdapter::new(&*injector); - let clipboard_injector = - engine::executor::clipboard_injector::ClipboardInjectorAdapter::new(&*injector, &*clipboard); - let key_injector = engine::executor::key_injector::KeyInjectorAdapter::new(&*injector); - let dispatcher = dispatch::default( - &event_injector, - &clipboard_injector, - &config_manager, - &key_injector, - ); - - let mut engine = Engine::new(&funnel, &mut processor, &dispatcher); - engine.run(); + eventloop.run(Box::new(move |event| { + // TODO: handle event + })); } diff --git a/espanso/src/cli/worker/ui/icon.rs b/espanso/src/cli/worker/ui/icon.rs new file mode 100644 index 0000000..20fcc8b --- /dev/null +++ b/espanso/src/cli/worker/ui/icon.rs @@ -0,0 +1,69 @@ +/* + * This file is part of espanso. + * + * Copyright (C) 2019-2021 Federico Terzi + * + * espanso is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * espanso is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with espanso. If not, see . + */ + +use anyhow::Result; +use log::{debug, info}; +use std::path::{Path, PathBuf}; + +const ICON_BINARY: &[u8] = include_bytes!("../../../res/icon.png"); + +#[cfg(target_os = "windows")] +const WINDOWS_ICO_BINARY: &[u8] = include_bytes!("../../../res/windows/espanso.ico"); +#[cfg(target_os = "windows")] +const WINDOWS_RED_ICO_BINARY: &[u8] = include_bytes!("../../../res/windows/espansored.ico"); + +// TODO: macos +// TODO: linux + +#[derive(Debug, Default)] +pub struct IconPaths { + pub tray_icon_normal: Option, + pub tray_icon_disabled: Option, + pub tray_icon_system_disabled: Option, // TODO: secure input + + pub logo: Option, +} + +#[cfg(target_os = "windows")] +pub fn load_icon_paths(runtime_dir: &Path) -> Result { + Ok(IconPaths { + tray_icon_normal: Some(extract_icon(WINDOWS_ICO_BINARY, &runtime_dir.join("normal.ico"))?), + tray_icon_disabled: Some(extract_icon(WINDOWS_RED_ICO_BINARY, &runtime_dir.join("disabled.ico"))?), + logo: Some(extract_icon(ICON_BINARY, &runtime_dir.join("icon.png"))?), + ..Default::default() + }) +} + +// TODO: macos +// TODO: linux + +// TODO: test +fn extract_icon(data: &[u8], target_file: &Path) -> Result { + if target_file.exists() { + debug!( + "skipping extraction for '{:?}', as it's already present", + target_file + ); + Ok(target_file.to_owned()) + } else { + std::fs::write(target_file, data)?; + info!("extracted icon to: {:?}", target_file); + Ok(target_file.to_owned()) + } +} diff --git a/espanso/src/cli/worker/ui/mod.rs b/espanso/src/cli/worker/ui/mod.rs new file mode 100644 index 0000000..5de9509 --- /dev/null +++ b/espanso/src/cli/worker/ui/mod.rs @@ -0,0 +1,21 @@ +/* + * This file is part of espanso. + * + * Copyright (C) 2019-2021 Federico Terzi + * + * espanso is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * espanso is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with espanso. If not, see . + */ + +pub mod icon; +pub mod util; \ No newline at end of file diff --git a/espanso/src/cli/worker/ui/util.rs b/espanso/src/cli/worker/ui/util.rs new file mode 100644 index 0000000..a16edaa --- /dev/null +++ b/espanso/src/cli/worker/ui/util.rs @@ -0,0 +1,41 @@ +/* + * This file is part of espanso. + * + * Copyright (C) 2019-2021 Federico Terzi + * + * espanso is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * espanso is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with espanso. If not, see . + */ + +use espanso_ui::icons::TrayIcon; + +use super::icon::IconPaths; + +// TODO: test +pub fn convert_icon_paths_to_tray_vec(icon_paths: &IconPaths) -> Vec<(TrayIcon, String)> { + let mut paths = Vec::new(); + + if let Some(normal) = &icon_paths.tray_icon_normal { + paths.push((TrayIcon::Normal, normal.to_string_lossy().to_string())); + } + + if let Some(disabled) = &icon_paths.tray_icon_disabled { + paths.push((TrayIcon::Disabled, disabled.to_string_lossy().to_string())); + } + + if let Some(system_disabled) = &icon_paths.tray_icon_system_disabled { + paths.push((TrayIcon::SystemDisabled, system_disabled.to_string_lossy().to_string())); + } + + paths +} \ No newline at end of file diff --git a/espanso/src/res/icon.png b/espanso/src/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9bde0d24159582e4cc84a24a3c9cec2010040328 GIT binary patch literal 11596 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 KMNUMnLSTXr4gyC2 literal 0 HcmV?d00001 diff --git a/espanso/src/res/linux/icon.png b/espanso/src/res/linux/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9bde0d24159582e4cc84a24a3c9cec2010040328 GIT binary patch literal 11596 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 KMNUMnLSTXr4gyC2 literal 0 HcmV?d00001 diff --git a/espanso/src/res/macos/icon.png b/espanso/src/res/macos/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cde3e917153f320d197f02c8ae513cc482e96ef9 GIT binary patch literal 4207 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 Z>HRAYjI(FswRwNdRu*>V6?+IV{{jD#`Bwk{ literal 0 HcmV?d00001 diff --git a/espanso/src/res/macos/icondisabled.png b/espanso/src/res/macos/icondisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..a289156c84f899726076871f472156bb5f81b4b0 GIT binary patch literal 4099 zcmV+e5d80nP)(@xu@iStsoNoU$P(}`nQ zR{A$KiJX_FZql?)GI^QWZCu+@Bbkz|P$CWj2@p7dxZCXy_iVX@4u`kHi&O3lMiK>r zcc1(2v){K}8aNrlj;{dt3;+wje*(A(pr!uPI^i?a_!58@0W1K>09XcK1NabtJOMo1 z_#%KW1IPlX0cZel02Bb20Pdau9(;V6)|(?(0l)wd@M}2$w*Yu2fcqN;fWPD`3&5ik z7}|Rz?nIfH(Q` zVN5a5SpchCl~)Nh%bRpGsOn{C8Yr}v&l_)WwRZu03}73;V*-o2j=$F6HexKd1>lze zex&=s#*}GXmM}K}JO^M=gKBBe0^X?pYX2-l(?nDAm;ze%9)OPkd;s7c;fH!)nh-+R zwA>f@Fyr7h0sNe@&}x6fH0aw5fTsa$0eA+$9IaFmNT4qqLq0@Pvwk1IK7ii=co)Du z(=?m8TrOR&*IyDs`~~0J>;N}S$$1OFzeZi-qyc9&ubvI(%=M;D6c)?j!+Q3@a}a?ipIF&)2x6$p#=y(=1z-g;uLI$7>8a zSg!IU-l8l7aUVYJk)zdq8o)(b@i;6tUZ=ug1VLa+DT59VT8I1ZwA`TE(;KJO&J*fY zLbmD7h)L>{X__!iGYEpfl2XR8QUS(K0sLDp*KLdu?im1A_*&-ITN7VlL%1Rc0!S&% zE^r%!`;&h3XB-;0LP@wv4?#>oYa`(T2&9xo4{-ak+;N7=rwR5`gd23ztuewCLI`M4 zU?H_xwz>gV7^t}j=67URw=LvUl3gH?(SndJy z3cnci=Zy-m%^bp~sK4S92)7F0UxtAjr#-_iYNsg;=lE~`69iXT%dImb_HzKREDPCe7E(&Y_{d`eY%&{miHlm2(OEl4 z*&%xt1=lB>IJjwQ?mz36Ynmo(+lFbH16gp=HMx2EyU%M$l%z6X0j+C~8L%pW955PG zSu!KSa?O}~RdDwR_m}#Arcx=atgK*VWo5Qjt4ZJY`&vuvgs1OWhQgVIq(Q-I0w^)# zwS(iiSp#8m{uyfi3;@G4P1&O?q!Cs+egxn@^#61m2Ny0}fMFOL<#PE2A;hl$+@BQS zS%gXQB^)KjlYrYG)LRI94crKiB+Uol19;Xn%^3y}y}+#i_$L5w>kC>gm&27SSKxWx z`R(oPuh;AKVh{v}lXBAx<`1WI=THX$9MD=n0PsICa1|I~+x9^a z1UVsus*%Ya;QqS(4V#;rXfzs24<0;twNj}(2Vj@i)AuTulozptup*I8AfQm!RG}pN zj*D9CkW$VDLGT43gbHkAjGtQu@O^~k_2XKTP9u}aoPPN5;j86xd6SE1b5Pk!!h$UT zc`XH*L~geQ;1R;gZ>dN9e_04|mEYTnur?E6fwBzXhXCGrVj5;L$mjE?@7=q1y<9GD z@FA<@`#^c?BrJFaz_SP|6@CKJ09wrsr>5uu?$-dkfTI$99Nh0m!A+;rIDh{9LbY0b ztz0f&q$K(LEY)ApnuG<hg3r8NCnvCwCv=ue4VM#!x+m=@pF#BRrv(R zaj>?wHs|~Pwa1SiZ?(bI*MmJSxb;CbZ&>#%hvcflf|gS6U@c3U6biGgR_is_buR}&P>EO^O@3{c!OlRzlRe~=E^rzqHl_WFB(K1>Rgb#4wk#s16&ut_jI@_ z{7t1&$mjDp&-1SD?(S|0A)?@_{6&*+KZ=p7kpgxQR*CI|5<8;90(Tm~-)XWCrMU|3 zLwXAzw9A6yI5>Ou?40L$*NVmB6~gVL-vK}C4i`x|3BcKevvJBr^Rx%H2HMcf+L(R@%04>srlPqSY__;Mcz^@W+GX{v# z+?z}aJ)ya4YiqO3X7jr1x?4hs{SMKdO30T9_jWHikWm6I(1U0tWWCD2{Ug&fuSzKw zq?F6rq8A0kVZ`^n7`SuIX7fg=RNCwSSKqj@PkDJ4;g$nADZr|Fkx3vtR)7sggtN@$ z+Jq5wfqRo#wO(HXMP{0;LRVN`2qTO8+ zn%~)JLHiiMcd3)dSKn|!oAo^JMyXWVjDV|GIu0o@N*0Pq%AP%hR;G}A^I(AZ61>fa z`UG6%iZMc4@I3Ez*L5!nAr9KYUsLm1ssJ7k>|N?_qCLvP05%f77|{i;l7;*97Vbs) zxoc}{^YwcDb>C{6FF6uCA^wc%FB| zb=~KgTL?7oz}Etq2mGwxb731<1GqiJ_n8U8HM{&QTa$&4I(Z9?M&nz>Vo}#zl?|&B z>@MN%G7KJhOV==fldxdf1+J2Xj{tm|kdLp5hM`=se{fy*qLk9bQA0`U`~4G7*fg=ezCJI6`23?sj~c%3|Bx`$-#v znn1G$AGTL-!9=W*71`)ea0YsrtSW2Z*&v~9#X*QdKCco7t^eX^1aa15s z?qHVJuFjo2B=le!EEvp29rO{3D$RW#VGYgIg9a_-xZG$ozP7WoQ*E_c?hszZX@b3g zunSY2|D&%BDQdDh8cZ_haX1YY>?5qpt>LIb5C>Nh?i)ONY7NO z)mI}r%iDt$RmGmg(YX_WrlFRW&w%EN^*bEG%_5J(z*Uxe6WabZ z$8liWHlBX^X{6KX(|db+*NVmB1wH`3!%eks`gXJj7-x-xx^@u3s6Y!sCa2p-qrg%}mMcB4~Y(dLp zGT7MIfRu7^XJ_YHsZ_ei14MdoPd?(F2-1HihuqW;a1x{h0V=P*tWfL z`}XZuDwWDb9F=&c;eb+oZ*+;*KNi4$j_~~4xh`;p2KPXZ&TQMp*47q+ASm3qbLW+V zgM(*rR63uQ<8>8a)$vms2jI^kJPdx8(?-O|!aE2%%WKM8$Ye5*Qeu659fo0?+uq*( zX0=*9KZGod60V7(V-t2U{AmGQ0l!GNGl)KEUzdeOf$&$$9D}>QzK&EX1>g4}rQEoG|Nh_a z@9&@M(OVezP#sD|gpJqRNVq|z9q?xf_f&@m@vU)NgiKMR+7wL397~Jr%vA8ucVk zKu!ISv&QAW$KJxKTgd`|zd?93i<&kq%EFr?zBqNb+ze%724N|xKq<))bbDq^%|4ei zV+Th^!KlvmLrieAPs2Hc`+{HKh5d{RT5CermPMF6w_-AA0VA)mO!;8}17Sx0C0_8G zm{4c$EzDuUTjVVDVq zVZ6M5KcA<^usoC|BJ%h19mKbW8N=k{W}X*g*he8GfC9+BlEScXeGHRC&xjSJ{GE;n zh9N!w6hgBw41o$k3Slq8xfwtl(jf1r0BJK2Mf4H^0pSY*aRv~FG{^%U5u_HBxY6_6XTyPLGl!{bpS8O zkahTwWg{Nb5i8#K62~V8h~zLl+D3d(rceCA50C+QC{I1eL;i!ZHN-DdpNLkwo>mJgvEgyQEe&0wfF*cunb{RkhWZ@kgMIhAyqC|NA z*)O*f-}F2nz8@?m(X{e)-}KM$f(-fnv!i$l$dUo?GCZ4x7>UXp{+MRA-@pUBAVZc1 zDvXeXFp2O@&ku3P10LWd$^Os>SW&ti!gGW^gz*_b9MT{Uc)rQb?u_JgM8P)=1d|y+ z{F}eCWd>O=j6jQFcuEX&$Ni1j`LpBXeBcF{apAwm8D7MMh9lDWL*hqc)~^QS7r728 zQ5@c=mG=-glL2sgbxTKGk`dxK_2h`@4wn1^B}5%kcu#h zFyA{Trvnf0g3P=&X7VTyHAQGgAj|(M1sRY99p43bp20RmdlA0V32h$6AfVskKk&@R zfGp_vRt|C;Q8|Pbgm1cG+=0Gy?}aMyS^Z&Rd8-exq}i32U2R5;!!MlOr@zU}=m1@0 zpMlaM#3Rh+L*o()v8pYAIR51$X{;dsOixb{dxxvhII8_)|0T2~1Y%hBck>HbKj;FTWc}x7>xO!X%@-hk{Pdcv8jaaa#GIO4r1_?; zCyivcti_A0Z!QWtK|d2h{&)J(d%RzwiRPn`Z~C7%I1+<1Fk;Xnj2M&0PfRagkLr(g zF1_S5&u4<8Od9y88Y_hkK`6Ld=>bp5Cw z-reNX=WqVQd;oI`1Sr?rzQ@Rp)_iRUY=BPCErrmDK(>sK7mR{Q8 zIiG&e3A*VJ(m>~IKtFx<`Y@{buOwY#U;5EnV;?c2atkWgyKnmIJ7d3-o23JEf^KL- z$7ZFI_@Rx$8lDy5ueoVL+i4esNG}}VNFx<<~+&vTrxAdKqn~xMS%Gz z58-DUC=Kj{p|xfNT7!gVQ=@i?o6B#I1s$aI3we-6&*XBzxL1krlZ{_Y1KDq5Cs{vG zlupKS6wgNZwr)c4f3pX?AOo@_J+pO_C3S%M93?Tl~JUf>@B1XifFl}rc z6UGP_EeUvx5_3nZCNk!dgEVqJP>=!nL5zi@3v?1ah@}0V2;$X2fPEk-zy|PtBcQU8 z>zD?`*%A0>0C7ko<^OM(_(_zk6H#af>k-Z&q#~3eyqW>TAr10?=a<{ePX=cakPdQL zp-(y@lp~BG%-3eg>A(ZLAVccUi2hapegrCn%?MDo-|3TNKR^a#K?msir2u>g3<%B$ zg9v1Oe@a0I=mMSp7$6^k9s$-c69|85^G7+*1v)|ZoB`4ipzoeQfPL1FI!Mnjo&!SB zI3Au&MOx>Ff@O_IYv?ANg~YOtv$)a zrtaHl&bmO%s4^l(KjEBjZXuTibb}3&J#t0NJVPITf@)c8SFt6&V|0&CCA|mruJ<(TGRZ!zW&be4-bS7kLEfX znXMCSfGx6JpwKom5oYs|;_z-CRcyqKIcC==DMf@^3{4ERChOzm4|Fr%D zyx0BxY5cp!1n763eT%SI}C6 z=BIKX{j<}+7T6@$fz=QB-*}^*uoFKFRn9g~TBpY33zGH?r2c^V0<8OUYWAQu$nkGw zC+h~AWc!!qvJbjpKR7hn`knpmfkM(6|Mv6c#28f9u$P2A3;^2dT)O5+1DjwU&Jq&m z$S1YqzwN*I&OYonV6QPY(TnzK^{5}F5TCw2M7;4-4B5y1s(r8twqd{da8CQEEU-p} zv#!|z?86?2yvBz-=o=qDHIVj-VQ5^MOWzM^U=wV^y#3&Zyl?VX9@CTdRI}~FJ|zw9 z6Q9&t5(&K-q;olPKAe+6dxUp4pU#qKpT3F&>q zUKQ$pc6c{XgxVqdPr81v0X9kNKSVu#$onP><2vk#XYVXZ>CmR(++{9% zWV>YA@;(WjGtkdhc1XX1K$?dUCD(x_iuWPRD;J(kOU$jcAoa(&_N9>4h33G2DLdEz zTO_+M3C_e}jdmGfUi*;u_n0V1diO8eLx|1q5)tkaYum#}Y1i_&|EbHv2>AlpV1&XW}pjw7TZG$ITjz&d1hUxqlOK_2h`FUWu_`Aqr` zz4>)9WQ$za%qYGUAq4^UOtXFc)$tHyKo)d>F3|aZ?48W$rbcu%LI%Pp!ms-JZ+xH& zbb@ZM@t+0IH3MEm{SZDP{F^_2nh(0c2H5)FeivjNh{_`5AbdsmQ{R474s3ueu=&Sj zAj={OYtkBoU$y^V@qx|n*2BNrsE{1F&1j%_{r?BPlj{I%gAc#_9>~0iE=8z7AnW>N z3VUPH`3u_Tk?0@jm}M7y0AGHo3^RPN)`4;D*L|Mx70&cx@_C8z1xwI=X&LEG7Cghg zja;VR(L2KnzJO2v7$6@3)@Y{@rV#$sf2ixQEGl%qDNihJK1+miM)(d1=WcM92`HQe zz3t6L-#*U~lZrLaxfJcc?Ztky3%-C)^R6FJ9=XlKoY;ZzqmG}Rp*~?>Sl;UU-8W#g z{F*nw-3d5jg!>2}|0{N8c)%y{ZO(QylMZvoHH3fF3%22&SL^%a@6NmCb^M2n=6Co0 z?LNa?K7emO&2KZlL%GxtJ|N5``&}Be^H&{LfAH$pAK}|NobCU^SFj%M@8>_8hwl}?=|A`ZKF;MoA4;$N75`x@fjfWm1vp2A zdkoJTj*-qzN?Y8C1L(fZ>;Pvvxi#j0;y?HZzJ3c3M=(GbL-?+)e|(0zhjXOacQ$7G z1@YG%(WLWss9Vz63!?CS=;O%$+#iB*DhA!x_>FUMvR~jM_(}>uXW)e>nP*-K{=i*Z z^4**teTOrBIK%yMY=P$oWowCW-=+|?8`Ajm3-;#m34A5{4HWi6Y4h-YR~GQU0G;v9 z7aGxbx64_S-|GFx`h`0mP?jIlf5rAJ9`N7@440C$~#KfrzQ?vDke zaR=^;L0!z&{Tp%c6?`W9uYlsew66mH;rqgT-&|o_gt=+Hd?+>K!=3k7^sVp@%K*ND z&t(7QQM@1FU+V+>Pc2(D@Arat122dVD>jktf5AEj?#9Dcw7CMDufuoHKj_QgEBH+I zAJ*6Je#L*NFSt7o-+AT=ABHN>x`u-og1$e&e;I(c0o^5pe(_^~cLj6YANUWxe%lkE zIGiap{fhs_e z$dSqi{=+wN`0vJC0p{SlMM|VO4B8RgL4|fTSAco^57wdJD`_t?s|;2s{>$fR@NEh1 ze#{rZU-%{m_YYooUYmEl@dy5ckKik*?qLx$6JL(#FZE%>M|$6IR~7yPGhdiSbqizV zeB%$u!F_||l9j*He!xfY^;>{A0-U4%)}9^lqdUabzqk*WyOhwcVSoP{{TF;Bo%xar zfS$?kU?+-y0l$6~a7P5bAH&@Gy8*`3qDH4*wl(7$`1q~u{7?oilvnhtzLWW&3~=Y- z@44#NN&#a(+;9HP`3rmlAAbsvHUo1+#}R&~UeNo;5#f$K+_Q#zB=EnkxdQZuesu4p zu<^w2`VKyUZ$H&NxiB+%%!vMWKR_}weUO5*H%TjBi|*SWBAxkEw)qpw(SHTuKNaZ} z1}LAORNmic^H7)I6Zkf7fV>$fA^Ha4x84DnAN+!O7XWhw8Q;==UoZFqKFwSA$^2Jk2HW7nPiIzSU+1Gp2Fgp1;Dzw7 z=MsqLzw()^2W*0E@ZpaF$j!)~M05awto#2o1zTYAk9{W>80mmAP$3v2)FJ$z_8n}1 zEwK5Y1kf`B2}Gk11`+=2a)3_I4K_&j{uAeCl#q2IN{g@t;XcBD(WXEL=mMRf`#<-6 zc0G{wBMNO(6Tu&$0$~W@SJvOa1H2#uvY><1&Jq2;8o(X`>?1f4Rv_3T1S2FP;1OQT z0OF7adB6j_AVb=N{9kqYAB-V?Nbep|=zEL^Fy8|pPU??{{=YD*2L4_nk}nP+O1?-m zjxH9#g(3pFXap3GE*=4ONB4<sXL^@|K$H8iU&P&*dajrEWgP9k}0`7XpeZd%L4z|VlRFs)ywZ$v6IDmWbtO4;Rj#|FcsqSou{ z8lP_Jzvgs$SDh14`_yQ#QjJ}@ia|!esa$v53WCnF5S@~mAf=sAf${dk1`Rv(VwWtP zus&dy{!nS-Iz5iGA*HX>JBle5+q<7@O`;KyJsoVlJ!ABcjnbr6zILUgIA7yczKUzk zwjU=nt29IKHPO!R^4do72Grl3)xB;g$;sfY_s=9$^lBrep|mG$9yI}LaYt9(R>sla zq1^8wLZGIIj4&gl?AMVT@uTFxbIQ>NVDch3eUC+P#|o8g+UQq%Na9j8YKn2Ybhv8H zH+#rf*mu`4KNMxk7qTCWDIdtfNeri->>N+lFp{iUC%#!Ua3ynqxHo~yK~OE+X<@~b zAcdID4tlT8TPQ4)nqA|f*i?_F4itazAy#Ho(@E%>xp5>n~T6Zse zUisK69p1$Z;j8G~8`pWA5)FJT(11l>n|REwe$&)4@A^A`=D)GXW@byqr#lji!py){yf^AxA{z`k99le zH?F#8c%wL#P>+8SIl!@jj$tjmPM%fk6u*VQ;GX!XHXpxU1MiD1=RaYCiWanvu^tR8 z!}|0($yVsCWbuw;HLWSC&UPxcf_&UlRHxNO(%C%)w@{?AZZ9~ZQ~61lW{=md7p7*u zbc37@v^9#nl%cHB?(FVcgO#VSnn7)vUG9DZ_cw8#rWhA8qSJF{_uLvsWwA1TXwsve zQkYgow`j_5Sag9Vl?%_f7V9>#!Tq6F`H~!2qF`r$8<*pyyc;f&Ix@npET@@IOj|H- zz$`Ly+5!WHw9jeU+`A)q5vQ%!O?L+4;znAF#t*n>QmTrKy}Q?yTdKb{WCArBAjujVZoYeBW7xX;XH!v?CX`{umBlwjRB7ynbk%Szaa__S48n1Gu zDY`3Z{&dE9nAPs-6UEz!Qm<@;3a9jg4SdXLMk%<2*^M(WtIfSn__Fxa%KAi?mU>>p zM+DtwUiRgoWfz0H(zJ+!mcq+=yU`#{>q1Ed-SHH>euAG)7roBwE^}%Zw(LCf#MLTX zMIkyLdBz3Pa-9mjslpaxjnc%`_~rNs8leSXc%}CP zeUIi~18?yz8H%oDSfiCWkHQ-_)w>iaH?{t**R$llgw9G2WUvXTuv;8A*1xJ6WyI z=J7}yq)HmVm7kc*zo6jieWKA*Q#+MSl5sP>3Gve$#tyH_{^~bO*h1jIAI8_jxSyc5 zIGpgN*`usnC`2!qHlK2u!QWIQ;|yIj!<3>!Vk6}i$>C0;&h+N}qdJ>>m8nIX!->M~ znR~4_ufBdom}#QVm7Z>gvap2~t~jIXG5zWM#V_s{cKT2@uKuzFe`GaVYWUF-fleKv z582EPQCf?<_XeL1sv2I4`PS*71nrUIKtgJ#Pc<)d(u!W z(-c*9-)%!<{+wXZr;P54_3;}-b!dmpQWRWQC#2yf0#04g3gRp0!PF;Bac;D^Py5;> zIcY{{I@9-9d%L)2Qv@x4JE3b8yK;nj{dGBR+Tra)k+{g^6y04|8qf3&!tFa^F$~T} zsj|zz@>=XziSOgfq#Vze>@aP()KzTT_R7Uw9jRzPOX+YSQdQ@=T(CiqGnJ-|H$?)E zd!Kh6{kXx_qBuh{O4`9Kgbn!6jshFLHYuysb#dzlQVh+!&%`fJlIy52ScYw{C+;9< zD$1B$PZfD5%IF`i$tl??r8D|0nc|~P#q<&}t1Z2e1Geqef_6=b!i=IiJUy4E@2T|q zE2~6=i*gh@?j6Gx@8og_8yCwlyq~kd|BAeWM_GG(X;0CB!3n(q6z8au?_57!Vz z-yVB>=Y-RplQCZ&tb4D~QNk;)Rbi%3sV`M&p;>z2^tlIC0e51SglvdoTv#0{*|~|; zUZ6_8_Fz0!X!qsd^n8wS%|Slnw^eHAFe>H>U3}N|x}AlOKhT(%(yAAjmkrbBZ zhOkgZlbKei;=Dxe^z>V+%MQFAkXZIsTfD!rGOE~(*cyV905!AF8UNu zZ-}34pj$Z3P_wBfVUQw#sFapW^v1hU^!w!BZY}10Qq^;-b!SC*lT8NoPW9Uvk;-+t zo-(qox9`P|IP9R)>!EtFk1Zxf@a==44owAD&pfm9W*P~aUR#d|HnxA+f*&-DGZxjs zvV^Rs3Rly$Fw>UZ{g8Dh@0x)?#PC&%Wrt#&45WU$}-moI}+SfK;%?|TJpQyL3RPZqE z9ZkKT9F{55(>;7kCVY}I>(TJ}q#I}awA$rA@~b`9TIH+G8>wTeCl^IGc$BaSZzvnb zS*yPyO+QUxdbMaZmC~87xep%rYaiKJIQm7!QzoU6vP>Yqpiuphf!ea_^16k+StH}F zu8uCkXJ4}FUBK4uoS+(HRahjqpyT7olcV`;<7+qMzco~+)Ai51n)&GXh{x!o=-tid z+P0`?DlVsz^;t7s|0ZI5;OVM!Tj{%)in%-8Xk94f${FRpEZyOi(PmRn7 zRaMz{`>qKz?8u}_DX<^C<9BguZG%yB`JrCfw`oNQEso>rqic#%okFU;A6_$8taWX{ z0-Ua<6>6nWzwxNhF3Dx1xKvQ$&9rc;_5)*=XE9rk9|xm|B}TAdl{*M?@_Suw^Q?W;SN$wmp4or z>C)+5eo=LzOl4@Ol1a&V%H~or`>V&AExB)Z9Ty$988BGneRwpe{B2c`f#(YUufG1h zIIDfc-r#p%xfn&M1SkSs&i0>NnRfiiecP`SgBsD%TQkp1pFX$y`j&LxecZZMG6c~# zrxq7}q6jFKy1zzc%uw2$W>?dzl1r+4idO8Xl#B}0Ot|&3zr%l7=Fu%@CzA>`W^_n( z-rccf=^GB!v8;g)AuS;aMTz#gnTM3M)kfGeUa3TB36`a|2opw@Wv0C{-)G8Z=JoLY z4HIUm(a>64E=Sa@gU1RJ>|Nr{F3(IpyS!`)m+re&WtVYVrSk452UEhH^Mchu8QWfo z-6&*pPZHaWi{4(EV{~|2a8q)B)ARb*yW&F5I=!t{TKVchc>m`^CqGkE>NlCa%yr*; z20MYz30j=bIYQ9y_;B%ri))t&f9p!5KK$Y7yIHP{ODGQSTxlZ|A6UoL%fh`C%b;l9 zaCU7eHSOT^MP(PuE|dM+Zn%kCdD3 zKQ|rOnX+Y9OZC%RIyZMeaaW~iEgWCv&*7d#vD;62Jn>2(Yf=*P@a6-Rw%fuSFZz|R zUy4;#I@xsMNuog30<+@^sk}luSa$E`g%j7jG)pHZ!ge+a9aMCd<0>f(Tu8M$N*Ms1Ni*=9A` zn#!r?uznwHy=-$*#u)!PujaDXkGWHA>)e+hHmL<>eYM-G{*t~CM5pVU;!~BZ7NHXM zNs)8yt&pG`&(fP+C56&yC6#-rEw*+i6cdiCjoZD8++~&`6&K-&#;wS+Tp6DzR499S zMrav0+_NiIeyGS}4A-TTq01P4nb6Dl;o;5VSQ&Ho#X|WT`(xJ-*y9Lt7V<(m3u~yi zSkYx^?aDu>*uQ5R?uqd$wcRJR4Nu7XH@Ii=;><22P2I#;Jyn&Lzw^6gZFA|l$#}Gk zhKq7T9kouA#Z!Zg6O1~q>$0#OPf1qkA(Nq(m5Q62x7Tlo_ZA7=Aa^xDJ|v)|GOx$D zF*11PvFd{ZUfY<;r3-jiX*j<;{Nmn!M<$;gXZk3K@QAx@@G_^ylb5WQ0)*dXCt5OZ z-mDNFa8rEHj=3qfE-8^Y?MYr>{i{bc1er_8tC$YQUK6;W7MyXKmbGjwf|1MJ#=^hR z^e_|E{k;7v8}hg>6PHd};q0hdgfi+LIUK5Al5F?k z*}fqP!ACMIn<{jhVgx*~%GFI)=6U&Mcd&z0J1X+_8;B6@SF}cN&3WDzTyC&~&Q<>S z6-|Ft&F+B52NnJF*xnNXBg$Sh~iDdtC9>J!DUg8-w$s; zAZlfLI@E2zIWqpRyS$x)689}_A^Ay#cR}2q*PlOZEJ$TIP<-r!j5*Fuj~jcW{OGXk zk^OsY5;@%LMaO%Fz6$zr*M5!-T%&aDhAg+rq|rOp+S&z0Hyc`)R-{s7E34TKbGaYx z%bS*^vaMG+np~(d-N$graSSiIs_Hpf>J(hK(-@)QYo}52(yX}8(#)HGIEgzt1xu>T zy>RxWlFWg=hsML3u~STf@v17;?=#dq$`#EnwCe|O44rqx7AfQTCZ_ZbQv_8=o$Q`k z!F3@HO#~r62{tTN%xiCox+=fgH-5nkP0HCtOPs|!{<_63NsVf?_|7|DHmP0f%q|g4_q9~kDA{M= zkVj$B%i;b=MwW-_{t3n}do5$G@;*P!W9Hzxn{gxeF!p61+ex1_mx2< z5BI*Kieo)KdB9p*gYm(>z3v@D=i6=fe%-_pp?YHb-KwWIJ6`Zfeu~@LWwc6&*}eUM~->vz7L|Na!gMeQWQv&qB0ePg`k1;58fbVc`q$TU)ei42(9T>EK>_ zfe6kHm&7p@&Kprs^7`@O@T)k9%k*fXFESf5XFcwmee1yGgbnBV7ch-9jMIlrxhd}v zdACt&LbD>UAp>_u$upg@0xDYKZE$&|cE_871od&VcQn(__1+29=sDEmb+^CMS&A>o z3hsL9xYrU_oGj6lNsM(r?6$ns^}s^UmW4w56zp60vp53BGE=&?w%YEzD?_NPmK$3j zq~gqLvZiT2vop@|Gqy`Qjdr_}cmt=M*!xkmQ&G=lj}+OjKP5}Gr{bw^L~=*0N$lp! z-orxlS{3~-Mje#+jY{&jax7YVM9VbdjenpsW_Q(#Ntr22nv?kAvl40u<;KIy`Sq&b z-tYcm9W}0BzvjcP*X&PdUtByohS%+yh>ckjUm=sFzQ`2kV5IZp!3I&nu!GIUJ-$f` zY^B01%&nqtZ1-dxza}Gd*sL_L)fTNgauTRmEJRjT)H|P42tS|LNc?0hdg!FCBNwK6 zk_mTCK|96nLqZrFIF>5Iyn#>XLL z{1G*F*UgAl)2AL@8W`9YcJ~KCXq$r`goKNc|Yc1mv ztT2hglOm;dWBQA#ZXIzRRq3v`KFqI8>bF`Cx%!}bYH@L(_1a%=o~$GWh56d4>=>|A ziX{*^6W)YTIVfp(SJz6M7!Q8^v0Cu-LYb*e5*vlIm)-kdX1coy?LjJ&58bLYUG=DT zH}}YUi@jH)So#Q!CA!vA*&U14s+Kg>9Kq#o;wf96F&$fd;%@Ze462<+?U_9fv(#-; z-FR3y@UZssJ=*zGaD{=B*vUvvI#>>moc3-8uRA8B1e)jrb3G6NtgXu2B2BB@k%{rl&w0l*1 ze8qwLT!u`IY?(%p^3!g;XD>A5?hfE8)T77uuo@1GZhQD(dtk7Bfb2q7pXSLuCPn5H zNKnWBHbX46GjW@k?=6XmK97Y{^#om`8^tRGxkhfp^wo;ljgCt4jlFFWOU$8B-mtrTIEMf^W9G%#V;LqP1e_CdmR>Q4W&E*pEsU=}Y=3Qo7?yZaQMwV(ulz(XH3z zUA0`!5&3$o%}+<4i!t#r-*Kx%-ZtVM_B{Bg_x)Bp%>hF0@!E^1sT)bU`5W6CutmS>fCfW*GEvspB8 ziGeQN^12t*bG)eueg|wy8Jq9XM`4)-_9eq+32S&f4K>!gNtY{LUZts}UVO1cmwD4> zg|H1G-MmlI&M=A``s{ard&+mhDr-&f-MvvsSA4W29$bmps}L5a&24FF7aH;GX0Dua zd0w&F%?oC?IEJM6nXWmq*r<~&`Q5&9ui~s{Dinr2i#{pU_Hecz54rh34z&^|>ocCP zooBjqOiaGQSYc%up~PjIt+@1Gg7){+gD=U)VmCTpo-wo3)bNZv!>8eSE}7CZly#B! zMH#B2S{3>Vm1a_v4q|Zdz%gWhvGCcaHLC>ueIwTup+Wt5?b7Ln13G*z>g=nV_HXJG z$0&7pS7g$q(^YL`I@UJGMwNEZL^4dj)+#Y|$Vzabu4I@<^d|N)UbkJFFSBYK)!L|e zO^-)$Qvcz0bDNekT{RK%mhtzy^;c4`;x1B_RpdQ05@pRkbX!Wk>M!QuLa!B@wn+7I z7Tvq{De!9DvapVIJ1Z`@#CY1rRrTFl#uv$VLYhy}c~Q!K88>9`7EcwMWIr!;npPFx!@-n2r>V1uuz%BbOJirNKM z2a#CwVpHs*)tl$si@YnXYR*ugj$Cu-fz4tD16Gv)D~1~2S>Ms`<;uiDfgr> z>>W^_Oj zEL!HcbvW65Hxq3|R&Ly2COeS*DA{|-C1HWHoPM?9K^c*zUCAxfB2n8~nEr}9`zS%T zLtj&`+;bVucDxrI4jj~)XuBv_as1^23eUQ_&uDMUWm~7Rwd=Ti zq~9?mew!m!(P!I_?um@CP-3fi#bhXO*{@iH`rJEjI@FKq%nprm30$NpxM1(YUMoE` zULjO*FDuQ7FLPmQVa(u_iK0bRJH3{>9BA!TOF3L}Z~Bzc`*T~@qa~?h+d5e^J9l>t zN-o{Tmt~gw7j9b)L*phDrd+Ghx^S96LyZ!Tp7rUp3bJKiac}A}7LN za9XTjIV#t^dR52SL-!gv?I<`3u>9J>+mACHj_zAq+3|6hdc67L@+p^*uG}Zqi-jsY z*gZYzMGq;Yj0-c2VA#pv7m*!lYv@MLy|A+0$>_Ld+d@_8w!a>gMGJaUo_3qufzBOv zzo9l(CiFGg9M&HByespd;x=a04O9$oscM#t+%m-R(!?lF-Zk(lGPu5FiIKYU4teiW z8A+X#{Ra%(UT>z8IlQaXwo=V@%leu%nU|_kG%w}%tYl32P+&+`C3Z;R2m_Zp?;z(% zHQspLBhprla#&|b^KH}Uf>@>H%XUkOQ1$NT&q7rrJwna>_1)cTho?_YG`bw``QjC~@WZSvRkTGIk_(tx+#xVy-iLN7JxZg@&^ zHX(FyvTpXVYHa>1S|lXnr1Nt) zy_<~W8Tt5nn?j<^IX3#IO;>619(@#h^C~y@y<1+z&O+NNHD6|PCMn?{j+~$jGgf~# z_w@wJ^pw0scKlVFm})s5P16*2O=E3)+}O-_Jqq097I!*l;2fTwbV#GJr!*=mLZI7z z7wf@})OZC`D6(vSKvC0lB*v?nm_C)7b^Ee z>#ItZj5Mu=4ZGe8`g>ofJS{u%k+1kP8(L+reEBGNr%7zp;}2(6y%?xg`p~k+RsB`L zag7V;>yHA13-$YD&%gQ>){nO_^-;;lPj2GfxT8MXEh~a0BPHQ=m%OtYQWh)`HwT(M%>;6a2vOqw5QdWbPiZ zm1DC$Wf$7oE`L$~wi;WkjRKdgLYNM=()Th=<|Wj0tfw)7{rqTT_{%r*R;M!Ef!#ut ziMz$9b&g62*#v8?VB~Q>ScRwc=uI4V#qsaEz^g5+R*VilTdYk?niJID51Q1r--n~r z_hY<79Xb~=ofT25MD-SEjK)VeB%k$OSO^qCvT`-V2khP3jG>;oi}#)u!V2q zshh?vsxIdu3Y@rhKUl=P@n&hyjmoa;FZ*wn^xu5bpU~8kac+q6q0`-=#6aEKdubJ4 zxbf)9uk2xU5O(4glQd8YM04CJp*AA-xGpOMWp> zoX%_6C`NUPMR2ca1C4XsUu#xvoyec)(M3!xZju*iEvMazPZPCt03&c(nP*)c?iCe7<_ ziP~a88Fl96+B-CH#Zom|4R@SbuNFP=^3A?~By+LA`OsyT0%Hkw((zI>wvCt2ab(4` zp$m(}N1a1@dhywxi#L5-nD)Yi?j~CNwzycjF}bqvRmr@EjktS4$~SqG*;FeD3HEn1J-L)7p?P@J zuGEjH>JZd?@uS%NkVHkgcqYEr7s_~XK^qb%iMT$+{evdx%O2C`!3SC_BU8q@T}_9) zG3e5^=1w6m^%p$)G`4nB^w2uhy`!}Iw6LJAL(dwCyiAF)5UwdN=&54QhoKuN!>u=Ay3fKGGKiqUBKGFDz96;bt@hlTt!&ulOOB-(mj2D zRF?e&_w@1gs@pbAhUKv1D-+rB&U89`T&NkX-gh&AxM-R&i{H!EO-_O8imnfi-io%i zEO@WQPMW=Jt}9-@2(~-F$(+eRbDP>hg-Irf8|c7m&-7^63n#0jSk4bgL`^~3!xWwJ zwJQcxKUD;v5kn?U_|B?s%D&0O1N`*6-=PDuY1>Z8juJIACBMpfV#g&#wXcL1o%D65 z)1GvA@jz?A;v1!1vBC?-mke%Q(C}GRIAN00O0t@IO2Wal3*`T6O*fWwKqY3?^W707l(ykn75Z)z}@JHSD30DSu`j_uv;1+yg?SjOmU~M zry)-=>q_XJ8ksX4Ir!o2Ap;Y1TINl2iDzx3x&f-hoPvEY6ixa#Hwp-eU%wsJE?Z7D zXt_Xb=#<8W$;5SRgP1vG^0FT12+GK}Jh)6>Cgs3gO{t;v$`8}!tI_$eZHdhydr`Ep zLQ4lYByqA!inW#S!lJ^O@iyu{a1Ky`;0#*Sbx9Fz&G>i z3FXg8$;@eYrPgI?>)e*r!FQn#knKm+9Jt;ue@|!hSS0!Og`TCijMjhID|%+1C|Y_Q zbvP69HTWo6`Tw=3W06hxkWIjzitz~r<`&O~7ee+`-VS4;&ZBbit2wytE~|d`>9AdT zBWk;iSL}YJ*80%-p8eRi^yeM7(U|_UU!35$wc|L4+Um6(53BjsKVQdi?WKOe1>XuLh8OUvr{a2%AjWsmT$7uP*P5q}dlGqxoM{wFYF+7HnQekbF z@YCm6ZYm}WU%q&3rp&1jILimX(VlLbh0a5&8 zRYm+1So)D-Sr1tX%XHs(L(U6wj#XtTxH4XCv-Oz8N%@z;VwYAgK^GqM9;{<8w%xuY zd%4w=g)+{akL|n|%Yv_*j}+o0&5v7cA4tJ%xyPq%X3b@>va?iY+2BIL=H*%@-f!#Z z2t0TqjwZ=&%3?K(g$yOW4P&{g#p*4#SxA3nPWWMN``u`cuwfaj$KOPEF0K~`uMMtB zI>>YAWutJCG$uD$)K9bW0z1z8vlHh;Qt4M|ZWUL_h%Akrn+__b`QW+1@A3jgytzVc zS=HMj7Lzf|rua=UkH-Ob3Amnclzp>EY(<*9t0WJLg-?=1D%-eAG#}KWURD>aFS4lUzg24y`W1L zlM|;Q}U9iCMsTUZhrIINOOgF>Oe;Po*2pJzH9g*Co#-HC3hhefU7ia#IJ;Ky zo~9d@8FZFzihOY}6pQvdXvV4|!{fRj3wv~-_=A2hwMM@0t~ZRh(pGJ1bdV*sjEZTU z=(t=eQx}_Apj;{?UxzjpfGZv3(Sf^P-f==sE#n``>(8Y7+8itL@D1LmCR{R=v_N}p zDAs9ULbpFC2Jajkqbsm~BGvdkp1$)hq9S2wXH%ZSlqR|z#+!DVsh;x4su+!3mr6N! zS93OaX(pUH(mm<7^1iLo2F%ZclY+L|a{*(rp2~82T(k{KO8I(9ui|cjF_G3OT^&=O z{L`Tr=jDT^36!s~2=M~1jm5h>7}y+Ftt}ds6>Xhr6Dd3L0_*DLVOxx?3D!Db=$o|K zVX33G2fNoq5As2Vg=q(rLtDl!E3ZGDvh_|86#7CgPlLsmJ%vf)4SINc@p$LDw=sp zAIalhN^>trj7?ug`HP%6?{O*6eYL%UcJ|7JbCB* z`@40Q@B4rE-nw<`)~#yK8{`f4h7R>4hkDQK;(3R7o;PBIf4qn1H7RcF*!1z9M|<83 zW!O`BRK!!XEhpi5%JcWrh!{lC3H;VtADqwqF_}h8N_EPIO}<%YBZ0{8VzakmHBbJz>IP zbK7n0=K1GWnO9%!GB3Tf+C22o3UkTDDRac(HR6?9HlPpP*s%5-3ICXL_+25=Ho6~v zc!gQDYLkijZQQuUELhNOPWhL`#W-LCTh=_%$N7@|LXQ1|4y-m$JkepcY}p!RIxBAO z+_mPAgKKhh1oUD9Th1=>Tf$pHPC43k(nTq=e*NYwJDWFeHLb0ErlzLHtXsD&t+BD! z95uF9{UTRaKtHyy={Ov!a91Ebi^uHQtFmlU4^KYXVa6X*{*Ukw?~=efQx!sJ8w8yz`crtFCIX z`HT4Oe8Z-*KQo{GapUStb8}yo{SQ7^XHGk9u{rUC1~Ya{tvO)-YO~MYRhCao+i<`p z_P-{~796jPMAxyh-_nw8zrTO0ZS&5~e$&v(PXZE)3)=ntE=B!dTDcO84rJ#&pzkhBaf`ivQJ+h zKfd0!`Jp3gZ2bo_EL^xgPCvw^9g8JzDP;fr^Ou;Oo-G*@)b&j_Ew%k^@4c$bJ@+ij zq!C!Nrr-QrvD5v%s|oTiA5= zcTo6IY!$-ox3@>y3)_F?l`ccSEuafq*bH8Sj?!`7F_?B>oMDWsuHIl6|HD7dORj+@ z{H&qSH4q!va+hCM2h7nP77FpUZE^HbwPwnc7W4RH9p>eiyUd(9UG{n~Mg4*CqCmZ) z8yh+ELB+v?Hu+2_$bq_G4n)5o3ftzr+Y0C?q`y!aI?-+I zgzarhK3S(2A)F(yzF~j6m$y!lR`S*QOMmjQqvQ_-`r1U{ zBH@=l2opyddB~gS+^a zh1Z0uiLIWX5|uJ2G}?p;hj9N-em2S4BUCI2WC)166&E9*wA zosJ$=W7kZ6e0;5yqes`+do0q26~1@Q=nL6~3!H+dXHJ-O;co=yZL!W(caL+z&+5$` zw=XqsywRogmL9wAwqnIbE9)D2%)EJP%zgK@n+gBgpnIXB_d{Vn-~uPOwU7$0{7TPVbk`^5e-Tv)8X2 zw>Yw|Z;RHSm)LvjDBXGD;0DL6Ht>(>TMr6Z9HWl8pTF>eB{^%~VcuGHF4#7=-PY!x z^Tlljc)&61JkT-z3>E5yqWoE}VQn_wkM){&-dU@)yjFAhWhrylo$XrB?a9hco-40t zF17yQ21mGN&SS#D1Ywg#u#Y27c0s^;(}zuh;WD z;PuzL>@$J{*9JJk)$&LBxLdLychdLM7=E#yN%i+{TQ?2*v1CcF88@yrXPl?coqblL znLWGH%$U(;uMyNm9Gek&;OclI|5o6hqNqNuK{wvm8l;>Rh9C9KbqWOQ7rrsq!;0~M zE1aDVf3I*&T>kgoo4qa_bl{a&R-1FrS!_-}o#!a^ndd0!Yp<@)h1cD@t-`oIq$g6xY*mf**`eyqkvp7TWgc;>@14#psSJ?7|I)pciNd-dyC#Z5Q0CAo&d z70!5)nfAiT4#lscOjz8YQhZt{mt4C6}a1?L%;db8rsvA94AUk2-z)@%-~= z&I87&v(Iicvu1T@z7c&66VE=060Zqx4bR^WR$OOXA6y%xQoXJ!bL6(MG$$z&!8L(B z4<+0e!x64w{yQm-waC2vCY(l{U9IPy;XN=Jaxnr`RU7R29h@hH?Sziu2-h%w&V>tv zsI}v~K5;L8%PmV2`M|SY%9hY~;08x~-ew$7z>i~2v{1;)Hz!T=F?_f}eVw^Z+#h}G z*=IXSy?(*X&f9|A2`k=#XAY73wQ{%z{G<-qxAedR%e1d$gZ3&ghsgD&w|9%7&rF}* zRw{Qm!7ZomoiBdccO*+X50u}w7w0s79I5px#+@6dwVM0yUv3_JaJiW|bGiBTuiMPO zYkv&uS>!9B&!ZnsaC3AcCFug|EK7y>{V0$ZUhv~O=dJ-xCg2SRxY)IyNYa5w<%2)Z zNiP;Q2#I{CU^zIzCHAvh<;4fqiEb52J{MG`Qa)oF4moR9fhvy-sti7SOWdR zREo3HgH3G1A(CUUNXiM{6mAr{1*dzUCAP4M?P4?wrc++{x^RxLSQu#T*uWMx3v!E_ zh#nuqB%c=63zhZ*o#@7fwHKFPoP18FLvJL9 zR6I7Z4TtSEKKQnFkUT+HC~Of1%Ew}Qu?+{fz$v=HDin);VJG2Qp;IWvZ+oS~1x|3Q zkhj@t&?|7w=H9AL*j~QHwF4)(!7-bBnMdgJ_5QEq7uny7)dk$(Sg|^gE`0xvulLLB zyQ>>l2XHQ{<$d4T&vK_w$?Lh}I#3d>aJGAKl2n4q((Z!<=3YHQ*<5)J!P-6Vpzgib zq72-g0MaXA$JYU8xZ^`fRX~0pM@Y5`iFxt-6Mxx1Jnk4he>rQhnXG*>*I(akrcOq@Qh6s4n1+57wW!mEh;+{CQPKVkfe)PA5GKExgil-ITW z6$uo3q#D)?3>Q&(Yb}Sjvz3;928USEX!!DDin*m?u6=c77G>1Ae|AN!AHr zT}6-a{iw0LO3CTn|*T~9o*qEr`)=AS#aOTL%wKR)4G zWFPQ-r+zLKN?EJ0?LzyUcV3gev(aDFpHef_H>}sQ`Sg1;;+C`@;1j+@_5nYhb^SMm z(rxTtW!`)gx zC6wepdk-e+`n`5-@wR7w%Zo2|no~}x*ENFg(JV3t9av>1OlUA~zugtNx8$j(R+h4t zrx161!^bTDIrcF{vQYWRG_KRP-`*ChTR;DY4(Z7L_Klq@NC*2V7rd9f|MLC!*V=ve z6`BvhA0M;M0sok_q}f8GkA>oC|2cEAzj+i@8B3S;nI9itr?!l?!5DJVN%aPwKl!BF zJTSA}UQ5|iSjc{fY5176Zl+`E;|D^OP?9a$j{f_>huPoUiSnO*PhAzVK|3>d0@OzZ z+uhm4M|{nk1B8Wxgp$vF{2w){+SJx%f72$)|C?`aHGAy7$ohqE)J2qk=mg?35Wq)# z4f}tx;!5661OH==&i&?8*nh_SXP)WQx0agBq)CnDtTP+UiF)^E?3fxeLgN8r2#BhW z3fBWZ;%nG{?iEYE?#K0?`k)T_H*d*&hloApjg38K{@ZKJ!;dUC7hTk3>w~@lD(tt@ zhmZIg_WwVV*rT5^H>r!!|HFMEe9ZTmnwomd)4yA3&OC$f@+E$+*7=%G;%nIdsY(6k zowh&!d0p6@vW}TcJo{XSIsTvP2BI(EYeoF0&SQDT+01$eZvNGj^6vK z@cB?t|KawW+N#*^jW<^5{nW);_h~hc{P%Lb)3Y|#{X%PNuig=>XdP74|9!N+HDgBc zcgJ|QbFV#F_e-z;F>g5Y%*Fa9UsvRNK*9R_?6dWDO{hZGhbaFqOLG2GhW0=A+(!F; zS&(x$Tvwm{P61;l*F5e6UVN$e{E>GB$)A*Gpd7x2&;N;vOSIlao3OW>YgwTm?}VKG zZ@K-L`eWXk?^~@-XLYsSsnR_{nSB5s@ipxK5sF(YB&uKLa?d^2>8R$Fzy0lUe?54c z9s0qcBdbk~{~mO{!mKTvc3MNxIdl;p@DX3b{{K*M4Moc4tsB~K(xfGN$2I!>Y3CDT zS^6GmTR)~fS??|M&JpEV7o9Stx!iLAAMrKp|Bj0LV^aTV!;xykg<8`n_Ivf!)%r$e z`ndr0_D?@rWNx^jCGWfE+w^TU)Aa5}nPUJx;%nG{?tyMj>ObY+#q$j2xP^YK|1Vgu z)?9NM!f^Q)T~??{mx%d5A%lWuP@twe9XH4ry~5g@sjKDB?)XF&|DDT;{52( zoG)?bL%ctJ!3B-w%!Tj`A2V(50>la57d{da`A<3eGh=+A??A+7`4G&WnoG5AU(^ zZ4dfY8NBeR;2tTZyK`Wq!e#dXxN=PxKfYG)L@&2vd?`;t85da(m@*}0->XJnLf{KN z#n8x&RF`p^<{Fwmx68Y{6{J;*j@Nk$nvF}W9ota!2d@$Uf)pTdlq~%%)?|9<_z64z?7$&ceQzg3vr>i28c>;cMKD&G2^nRH18YpSx zseoO$<3rJYAFdF;%n-@Dg};P-U*Y|U&6$_dODUJ%0izwF0wj-2bna$cEK z-hsUnfBFlm1Gw7#9{5nskMchDm3&Y5vbQ@N;c9u8 zgC&m^*e~-%^aX5U8xC*@QXKFw_I!L#lJ5>N&)O^uR69Gp*uWMxvAtc|JYR+S_Ss|1 zxyL@s4+Y*uaC|Ez(TQ$sV5{VP&G~$&M7;R8{=l5$6ybk_T495bv<@hX4s@Z@&SxYm zL3zM*z)#>^McU~n!VLoB^ZyC;!g7Iq7(oz68hOY|8OoyLOZnbooC*|o*DrQZco$)) zFic=A<^Ugri6f0X2- z=?@p!YnL?_5 ltzy-;RkWKP3KBnNTl=Ix7@=cjR5qJo4AT7v9~;j6`G1Fkt&#u$ literal 0 HcmV?d00001