From d0250ec2e77293375d10e1d511ea1f1c7fb91d7d Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Sun, 14 Nov 2021 12:14:58 +0200 Subject: [PATCH 1/6] Rust edition 2021 --- Cargo.toml | 2 ++ src/functions.rs | 6 +++--- src/inference.rs | 12 ++++++------ src/lib.rs | 6 +++++- src/ops.rs | 2 +- src/rules.rs | 12 ++++++------ src/set.rs | 2 +- 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a32f834..ca04a05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,5 +3,7 @@ name = "fuzzy_logic" version = "0.3.0" authors = ["Lutfullin Bulat "] +edition = "2021" + [dependencies] ordered-float = {version = "0.2.0", git = "https://github.com/AerialX/rust-ordered-float.git", rev="3aa8aa506b3231712958093ee513b37206a474da"} diff --git a/src/functions.rs b/src/functions.rs index 1f275ab..f149629 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -3,15 +3,15 @@ //! Module contains implementation of membership functions and defuzzification functions. //! Also contains factory methods to create most used functions. -use set::Set; +use crate::set::Set; /// Used to calculate the membership of the given item. /// All membership functions must be this type. -pub type MembershipFunction = Fn(f32) -> f32; +pub type MembershipFunction = dyn Fn(f32) -> f32; /// Used to defuzzificate the fuzzy logic inference result. /// All defuzzification functions must be this type. -pub type DefuzzFunc = Fn(&Set) -> f32; +pub type DefuzzFunc = dyn Fn(&Set) -> f32; /// Defines methods to create most used membership functions. /// diff --git a/src/inference.rs b/src/inference.rs index 030ea19..d40cedd 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -5,18 +5,18 @@ //! Fuzzy logic mechanism is implemented in `InferenceMachine`. //! User can modify input variables with `update` method and get inference result with `compute` method. -use set::UniversalSet; -use ops::{LogicOps, SetOps}; -use rules::RuleSet; -use functions::DefuzzFunc; +use crate::set::UniversalSet; +use crate::ops::{LogicOps, SetOps}; +use crate::rules::RuleSet; +use crate::functions::DefuzzFunc; use std::collections::HashMap; /// Structure which contains the implementation of fuzzy logic operations. pub struct InferenceOptions { /// Contains fuzzy logical operations. - pub logic_ops: Box, + pub logic_ops: Box, /// Contains fuzzy set operations. - pub set_ops: Box, + pub set_ops: Box, /// Contains defuzzification function. pub defuzz_func: Box, } diff --git a/src/lib.rs b/src/lib.rs index ad3bb3c..9e3ce53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,6 +13,10 @@ pub mod inference; #[cfg(test)] mod test { + use crate::functions::MembershipFactory; #[test] - fn it_works() {} + fn fuzzy_logic() { + let mem = MembershipFactory::triangular(-15.0, -15.0, 22.0); + mem(-15.0); // -> 1.0 + } } diff --git a/src/ops.rs b/src/ops.rs index fe57f96..29b067b 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -3,7 +3,7 @@ //! Fuzzy set operations and fuzzy logic operations are defined here. //! //! User can implement his own operations by implementing `LogicOps` or `SetOps` traits. -use set::Set; +use crate::set::Set; use std::collections::HashMap; use std::cell::RefCell; diff --git a/src/rules.rs b/src/rules.rs index d784ac0..1c3df7c 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -5,8 +5,8 @@ //! User can implement his own operations by implementing `LogicOps` or `SetOps` traits. extern crate ordered_float; -use inference::InferenceContext; -use set::Set; +use crate::inference::InferenceContext; +use crate::set::Set; use std::fmt; use std::cell::RefCell; @@ -128,12 +128,12 @@ impl Expression for Or { /// 'Not' expression calculates NOT logical operation with given implementation. pub struct Not { /// Expression to calculate. - expression: Box, + expression: Box, } impl Not { /// Constructs `Not` expression. - fn new(expression: Box) -> Not { + fn new(expression: Box) -> Not { Not { expression: expression } } } @@ -154,7 +154,7 @@ impl Expression for Not { /// Describes fuzzy inference rule. pub struct Rule { /// Root of the evaluation tree. - condition: Box, + condition: Box, /// IF ... THEN `result_set`. result_set: String, /// The universe of `result_set`. @@ -163,7 +163,7 @@ pub struct Rule { impl Rule { /// Constructs the new rule with given arguments. - pub fn new(condition: Box, result_universe: String, result_set: String) -> Rule { + pub fn new(condition: Box, result_universe: String, result_set: String) -> Rule { Rule { condition: condition, result_set: result_set, diff --git a/src/set.rs b/src/set.rs index f80a425..a1d7ab4 100644 --- a/src/set.rs +++ b/src/set.rs @@ -8,7 +8,7 @@ use std::fmt; use std::f32; use std::collections::HashMap; use std::cell::RefCell; -use functions::MembershipFunction; +use crate::functions::MembershipFunction; use self::ordered_float::OrderedFloat; From a393b3a945b513c2c0d4e127be0a3acbfc7a7a43 Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Sun, 14 Nov 2021 13:33:41 +0200 Subject: [PATCH 2/6] Universal set test + more improvements --- Cargo.toml | 3 ++ src/functions.rs | 2 +- src/inference.rs | 6 ++-- src/rules.rs | 13 ++++--- src/set.rs | 89 ++++++++++++++++++++++++++++++++++-------------- 5 files changed, 80 insertions(+), 33 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ca04a05..e69a2ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,6 @@ edition = "2021" [dependencies] ordered-float = {version = "0.2.0", git = "https://github.com/AerialX/rust-ordered-float.git", rev="3aa8aa506b3231712958093ee513b37206a474da"} + +[dev-dependencies] +approx = "0.5" \ No newline at end of file diff --git a/src/functions.rs b/src/functions.rs index f149629..db73a29 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -105,7 +105,7 @@ mod test { for i in -100..100 { let midpoint = i as f32; let f = MembershipFactory::sigmoidal(steepness, midpoint); - let mut diff = (0.5 - f(midpoint)).abs(); + let diff = (0.5 - f(midpoint)).abs(); assert!(diff <= f32::EPSILON); } } diff --git a/src/inference.rs b/src/inference.rs index d40cedd..f9a7f22 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -52,10 +52,10 @@ impl InferenceMachine { options: InferenceOptions) -> InferenceMachine { InferenceMachine { - rules: rules, - universes: universes, + rules, + universes, values: HashMap::new(), - options: options, + options, } } diff --git a/src/rules.rs b/src/rules.rs index 1c3df7c..d11d429 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -30,10 +30,10 @@ pub struct Is { impl Is { /// Constructs `Is` expression. - pub fn new(variable: String, set: String) -> Is { + pub fn new(variable: &str, set: &str) -> Is { Is { - variable: variable, - set: set, + variable: variable.into(), + set: set.into(), } } } @@ -75,6 +75,11 @@ impl And { right: right, } } + + /// Creates a `Box` for convenience when creating [`Rule`]s + pub fn boxed(self) -> Box> { + Box::new(self) + } } impl Expression for And { @@ -133,7 +138,7 @@ pub struct Not { impl Not { /// Constructs `Not` expression. - fn new(expression: Box) -> Not { + pub fn new(expression: Box) -> Not { Not { expression: expression } } } diff --git a/src/set.rs b/src/set.rs index a1d7ab4..3a79c21 100644 --- a/src/set.rs +++ b/src/set.rs @@ -2,15 +2,14 @@ //! //! Fuzzy set is the basis of fuzzy logic. //! Given as a part of the universal set with the membership function. -extern crate ordered_float; -use std::fmt; -use std::f32; -use std::collections::HashMap; -use std::cell::RefCell; use crate::functions::MembershipFunction; +use std::{ + cell::RefCell, + collections::HashMap, f32, fmt +}; -use self::ordered_float::OrderedFloat; +use ordered_float::OrderedFloat; /// Fuzzy set itself. pub struct Set { @@ -45,19 +44,18 @@ impl Set { /// Returns the membership of item. /// If already computed -- returns from cache. - /// Elsewise -- calculates from function, and if value>0 then caches it. + /// Elsewise -- calculates from function, and if `value > 0` then caches it. pub fn check(&self, x: f32) -> f32 { let ordered = OrderedFloat(x); let func = self.membership.as_ref(); let mut cache = self.cache.borrow_mut(); - let mut mem = 0.0; - { - let value = cache.entry(ordered).or_insert(match func { - Some(f) => f(x), - None => 0.0, - }); - mem = *value; - } + + let value = cache.entry(ordered).or_insert(match func { + Some(f) => f(x), + None => 0.0, + }); + let mem = *value; + if mem <= 0.0 { cache.remove(&ordered); } @@ -75,7 +73,6 @@ impl fmt::Debug for Set { } } - #[derive(Debug)] /// Universal set for fuzzy sets. pub struct UniversalSet { @@ -89,9 +86,9 @@ pub struct UniversalSet { impl UniversalSet { /// Constructs the new empty universal set. - pub fn new(name: String) -> UniversalSet { - UniversalSet { - name: name, + pub fn new(name: &str) -> Self { + Self { + name: name.into(), domain: Vec::new(), sets: HashMap::new(), } @@ -103,24 +100,30 @@ impl UniversalSet { } /// Constructs the child fuzzy set with given membership. - pub fn create_set(&mut self, name: String, membership: Box) { - if !self.sets.contains_key(&name) { + pub fn create_set(&mut self, name: &str, membership: Box) { + if !self.sets.contains_key(name) { let set = Set { - name: name.clone(), + name: name.to_string(), membership: Some(membership), cache: RefCell::new(HashMap::new()), }; for i in &self.domain { set.check(*i); } - self.sets.insert(name, set); + self.sets.insert(name.into(), set); } } + /// Chain-able method for adding new `Set`s. + pub fn add_set(mut self, name: &str, membership: Box) -> Self { + self.create_set(name, membership); + self + } + /// Computes memberships from all children fuzzy sets. - pub fn memberships(&mut self, x: f32) -> HashMap { + pub fn memberships(&self, x: f32) -> HashMap { self.sets - .iter_mut() + .iter() .map(|(name, set)| (name.clone(), set.check(x))) .collect() } @@ -128,5 +131,41 @@ impl UniversalSet { #[cfg(test)] mod tests { + use approx::assert_relative_eq; + + use crate::functions::MembershipFactory; + use super::*; + + #[test] + fn test_universal_set() { + let x_dest = UniversalSet::new("x_dest") + .add_set("NB", MembershipFactory::triangular(-2.0, -2.0, -1.0)) + .add_set("NS", MembershipFactory::triangular(-2.0, -1.0, 0.0)) + .add_set("Z", MembershipFactory::triangular(-1.0, 0.0, 1.0)) + .add_set("PS", MembershipFactory::triangular(0.0, 1.0, 2.0)) + .add_set("PB", MembershipFactory::triangular(1.0, 2.0, 2.0)); + + let get_membership_for = -1.5_f32; + let actual = x_dest.memberships(get_membership_for); + + let expected = vec![ + ("NB".into(), 0.5), + ("NS".into(), 0.5), + ("Z".into(), 0.), + ("PS".into(), 0.), + ("PB".into(), 0.), + ] + .into_iter() + .collect::>(); + + for (set_name, membership) in actual { + match expected.get(&set_name) { + // assert values only if expected values are set + Some(expected_membership) => assert_relative_eq!(*expected_membership, membership), + // otherwise expect `0` + None => assert_relative_eq!(membership, 0.), + } + } + } } From 37ca427f4b0d7a5c22e8b6960c4954d57a61d93b Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Mon, 15 Nov 2021 10:15:16 +0200 Subject: [PATCH 3/6] MembershipFactory::singleton - rustfmt - improvements on docs and code --- src/functions.rs | 26 +++++++-- src/inference.rs | 24 ++++---- src/lib.rs | 4 +- src/ops.rs | 25 +++++--- src/rules.rs | 148 ++++++++++++++++++++++++++++------------------- src/set.rs | 15 ++--- 6 files changed, 146 insertions(+), 96 deletions(-) diff --git a/src/functions.rs b/src/functions.rs index db73a29..c665d06 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -15,11 +15,12 @@ pub type DefuzzFunc = dyn Fn(&Set) -> f32; /// Defines methods to create most used membership functions. /// -/// #Usage +/// # Examples /// Create triangular function: /// /// ```rust /// use fuzzy_logic::functions::MembershipFactory; +/// /// let mem = MembershipFactory::triangular(-15.0, -15.0, 22.0); /// mem(-15.0); // -> 1.0 /// ``` @@ -65,16 +66,25 @@ impl MembershipFactory { pub fn gaussian(a: f32, b: f32, c: f32) -> Box { Box::new(move |x: f32| a * (-1.0 * ((x - b).powi(2) / (2.0 * c.powi(2)))).exp()) } + + /// Creates a singleton function + // If value == x returns 1.0 (part of the set) + // If value != x returns 0.0 (not part of the set) + pub fn singleton(value: f32) -> Box { + Box::new(move |x: f32| if value == x { 1.0 } else { 0.0 }) + } } /// Defines methods to create most used defuzzification functions. /// -/// #Usage +/// # Examples /// Create function which calculates center of mass: /// /// ```rust -/// use fuzzy_logic::functions::{DefuzzFactory, MembershipFactory}; -/// use fuzzy_logic::set::Set; +/// use fuzzy_logic::{ +/// functions::{DefuzzFactory, MembershipFactory, +/// set::Set +/// }; /// /// let mem = MembershipFactory::triangular(-15.0, -15.0, 22.0); /// let df = DefuzzFactory::center_of_mass(); @@ -88,7 +98,11 @@ impl DefuzzFactory { pub fn center_of_mass() -> Box { Box::new(|s: &Set| { let sum = s.cache.borrow().iter().fold(0.0, |acc, (_, &v)| acc + v); - let prod_sum = s.cache.borrow().iter().fold(0.0, |acc, (&k, &v)| acc + k.into_inner() * v); + let prod_sum = s + .cache + .borrow() + .iter() + .fold(0.0, |acc, (&k, &v)| acc + k.into_inner() * v); prod_sum / sum }) } @@ -96,8 +110,8 @@ impl DefuzzFactory { #[cfg(test)] mod test { - use std::f32; use super::*; + use std::f32; #[test] fn sigmoidal() { diff --git a/src/inference.rs b/src/inference.rs index f9a7f22..9821808 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -5,10 +5,10 @@ //! Fuzzy logic mechanism is implemented in `InferenceMachine`. //! User can modify input variables with `update` method and get inference result with `compute` method. -use crate::set::UniversalSet; +use crate::functions::DefuzzFunc; use crate::ops::{LogicOps, SetOps}; use crate::rules::RuleSet; -use crate::functions::DefuzzFunc; +use crate::set::UniversalSet; use std::collections::HashMap; /// Structure which contains the implementation of fuzzy logic operations. @@ -44,14 +44,15 @@ pub struct InferenceMachine { } impl InferenceMachine { - /// Constructs the new `InferenceMachine`. + /// Constructs a new `InferenceMachine`. /// /// This function moves all arguments to the structure. - pub fn new(rules: RuleSet, - universes: HashMap, - options: InferenceOptions) - -> InferenceMachine { - InferenceMachine { + pub fn new( + rules: RuleSet, + universes: HashMap, + options: InferenceOptions, + ) -> Self { + Self { rules, universes, values: HashMap::new(), @@ -60,10 +61,8 @@ impl InferenceMachine { } /// Updates values in `values`. - /// - /// Basically, this method just clones the argument. - pub fn update(&mut self, values: &HashMap) { - self.values = values.clone(); + pub fn update(&mut self, values: HashMap) { + self.values = values; } /// Computes the result of the fuzzy logic inference. @@ -76,6 +75,7 @@ impl InferenceMachine { options: &self.options, }; let result = self.rules.compute_all(&mut context); + (result.name.clone(), (*self.options.defuzz_func)(&result)) } } diff --git a/src/lib.rs b/src/lib.rs index 9e3ce53..40f8097 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,10 +6,10 @@ //! //! User is available to implement his own functions and operations. pub mod functions; -pub mod set; +pub mod inference; pub mod ops; pub mod rules; -pub mod inference; +pub mod set; #[cfg(test)] mod test { diff --git a/src/ops.rs b/src/ops.rs index 29b067b..7c02ec3 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -4,8 +4,7 @@ //! //! User can implement his own operations by implementing `LogicOps` or `SetOps` traits. use crate::set::Set; -use std::collections::HashMap; -use std::cell::RefCell; +use std::{cell::RefCell, collections::HashMap}; /// Abstraction over set operations. Doesn't contain default implementation. pub trait SetOps { @@ -35,7 +34,10 @@ impl SetOps for MinMaxOps { let left_mem = left.check(k.into_inner()); result.insert(*k, v.max(left_mem)); } - Set::new_with_domain(format!("{} UNION {}", left.name, right.name), RefCell::new(result)) + Set::new_with_domain( + format!("{} UNION {}", left.name, right.name), + RefCell::new(result), + ) } /// Intersection of fuzzy sets. @@ -49,7 +51,10 @@ impl SetOps for MinMaxOps { result.insert(*k, v.min(right_mem)); } } - Set::new_with_domain(format!("{} INTERSECT {}", left.name, right.name), RefCell::new(result)) + Set::new_with_domain( + format!("{} INTERSECT {}", left.name, right.name), + RefCell::new(result), + ) } } @@ -71,12 +76,14 @@ impl LogicOps for ZadehOps { /// /// Returns minimum of arguments. /// - /// # Usage + /// # Examples /// The classical AND operator's truth table: /// /// ```rust /// use fuzzy_logic::ops::{LogicOps, ZadehOps}; + /// /// let ops = ZadehOps{}; + /// /// ops.and(0.0, 0.0); //-> 0.0 /// ops.and(0.0, 1.0); //-> 0.0 /// ops.and(1.0, 0.0); //-> 0.0 @@ -90,12 +97,14 @@ impl LogicOps for ZadehOps { /// /// Returns maximum of arguments. /// - /// # Usage + /// # Examples /// The classical OR operator's truth table: /// /// ```rust /// use fuzzy_logic::ops::{LogicOps, ZadehOps}; + /// /// let ops = ZadehOps{}; + /// /// ops.or(0.0, 0.0); //-> 0.0 /// ops.or(0.0, 1.0); //-> 1.0 /// ops.or(1.0, 0.0); //-> 1.0 @@ -108,12 +117,14 @@ impl LogicOps for ZadehOps { /// Fuzzy logic AND operation. /// /// Returns inversed logical value. - /// # Usage + /// # Examples /// The classical NOT operator's truth table: /// /// ```rust /// use fuzzy_logic::ops::{LogicOps, ZadehOps}; + /// /// let ops = ZadehOps{}; + /// /// ops.not(0.0); //-> 1.0 /// ops.not(1.0); //-> 0.0 /// ``` diff --git a/src/rules.rs b/src/rules.rs index d11d429..fa89e8c 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -3,17 +3,13 @@ //! Fuzzy set operations and fuzzy logic operations are defined here. //! //! User can implement his own operations by implementing `LogicOps` or `SetOps` traits. -extern crate ordered_float; -use crate::inference::InferenceContext; -use crate::set::Set; +use crate::{inference::InferenceContext, set::Set}; -use std::fmt; -use std::cell::RefCell; -use std::collections::HashMap; +use std::{cell::RefCell, collections::HashMap, fmt}; /// Abstraction over rule's expression. -pub trait Expression { +pub trait Expression: fmt::Debug { /// Evaluates the expression with given `InferenceContext`. fn eval(&self, context: &InferenceContext) -> f32; /// Return the string representation of the expression. @@ -21,6 +17,7 @@ pub trait Expression { } /// 'Is' expression calculates membership of the given variable. +#[derive(Debug, Clone)] pub struct Is { /// Variable in which membership we're interested. variable: String, @@ -41,13 +38,17 @@ impl Is { impl Expression for Is { /// Returns membership of given value. fn eval(&self, context: &InferenceContext) -> f32 { + // TODO: replace with `.get()` let value = context.values[&self.variable]; - let universe = context.universes - .get(&self.variable) - .expect(&format!("{} is not exists", &self.variable)); - let set = universe.sets - .get(&self.set) - .expect(&format!("{} is not exists", &self.set)); + + let universe = context + .universes + .get(&self.variable) + .expect(&format!("{} does not exists", &self.variable)); + let set = universe + .sets + .get(&self.set) + .expect(&format!("{} does not exists", &self.set)); set.check(value) } /// String representation of the current `Is` expression. @@ -57,9 +58,11 @@ impl Expression for Is { } /// 'And' expression calculates AND logical operation with given implementation. +#[derive(Debug, Clone)] pub struct And - where L: Expression, - R: Expression +where + L: Expression, + R: Expression, { /// Left operand. left: L, @@ -70,10 +73,7 @@ pub struct And impl And { /// Constructs `And` expression. pub fn new(left: L, right: R) -> And { - And { - left: left, - right: right, - } + And { left, right } } /// Creates a `Box` for convenience when creating [`Rule`]s @@ -96,9 +96,11 @@ impl Expression for And { } /// 'Or' expression calculates OR logical operation with given implementation. +#[derive(Debug, Clone)] pub struct Or - where L: Expression, - R: Expression +where + L: Expression, + R: Expression, { /// Left operand. left: L, @@ -109,10 +111,7 @@ pub struct Or impl Or { /// Constructs `Or` expression. pub fn new(left: L, right: R) -> Or { - Or { - left: left, - right: right, - } + Or { left, right } } } @@ -131,6 +130,7 @@ impl Expression for Or { } /// 'Not' expression calculates NOT logical operation with given implementation. +#[derive(Debug)] pub struct Not { /// Expression to calculate. expression: Box, @@ -139,7 +139,9 @@ pub struct Not { impl Not { /// Constructs `Not` expression. pub fn new(expression: Box) -> Not { - Not { expression: expression } + Not { + expression: expression, + } } } @@ -157,6 +159,7 @@ impl Expression for Not { } /// Describes fuzzy inference rule. +#[derive(Debug)] pub struct Rule { /// Root of the evaluation tree. condition: Box, @@ -168,49 +171,65 @@ pub struct Rule { impl Rule { /// Constructs the new rule with given arguments. - pub fn new(condition: Box, result_universe: String, result_set: String) -> Rule { + pub fn new( + condition: Box, + result_universe: String, + result_set: String, + ) -> Rule { Rule { - condition: condition, - result_set: result_set, - result_universe: result_universe, + condition, + result_set, + result_universe, } } /// Computes the current rule. Returns the fuzzy set as the result. pub fn compute(&self, context: &InferenceContext) -> Set { let expression_result = (*self.condition).eval(context); - let universe = context.universes - .get(&self.result_universe) - .expect(&format!("{} is not exists", &self.result_universe)); - let set = universe.sets - .get(&self.result_set) - .expect(&format!("{} is not exists", &self.result_set)); - let result_values = set.cache.borrow() - .iter() - .filter_map(|(&key, &value)| { - if value <= expression_result { - Some((key, value)) - } else { - None - } - }) - .collect::>(); - Set::new_with_domain(format!("{}: {}", &self.result_universe, &self.result_set), - RefCell::new(result_values)) + let universe = context + .universes + .get(&self.result_universe) + .expect(&format!("{} does not exists", &self.result_universe)); + + let set = universe + .sets + .get(&self.result_set) + .expect(&format!("{} does not exists", &self.result_set)); + + let result_values = set + .cache + .borrow() + .iter() + .filter_map(|(&key, &value)| { + if value <= expression_result { + Some((key, value)) + } else { + None + } + }) + .collect::>(); + + Set::new_with_domain( + format!("{}: {}", &self.result_universe, &self.result_set), + RefCell::new(result_values), + ) } } impl fmt::Display for Rule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, - "(Rule {}:{} if:{})", - &self.result_universe, - &self.result_set, - &(*self.condition).to_string()) + write!( + f, + "(Rule {}:{} if:{})", + &self.result_universe, + &self.result_set, + &(*self.condition).to_string() + ) } } /// Contains all the rules. Evaluates them. +#[derive(Debug)] pub struct RuleSet { /// Vector with rules. rules: Vec, @@ -219,20 +238,29 @@ pub struct RuleSet { impl RuleSet { /// Constructs the `RuleSet` with given `Rule`s pub fn new(rules: Vec) -> Result { - let rule_universe = rules[0].result_universe.clone(); - for rule in &rules { - if rule_universe != rule.result_universe { - return Err(format!("Rules are in different result universes({} and {})", - &rule_universe, - &rule.result_universe)); + let mut rules_iter = rules.iter(); + + let first_rule_universe = rules_iter + .next() + .map(|rule| rule.result_universe.clone()) + .ok_or_else(|| "empty Rules".to_string())?; + + // Check if all the other rules have the same universe + for rule in rules_iter { + if first_rule_universe != rule.result_universe { + return Err(format!( + "Rules are in different result universes({} and {})", + &first_rule_universe, &rule.result_universe + )); } } - return Ok(RuleSet { rules: rules }); + return Ok(RuleSet { rules }); } /// Computes all rules. Resulting fuzzy sets are then united and returned. pub fn compute_all(&self, context: &InferenceContext) -> Set { let mut result_set = self.rules[0].compute(context); + for rule in &self.rules[1..self.rules.len()] { let mut result = rule.compute(context); result_set = (*context.options.set_ops).union(&mut result_set, &mut result); diff --git a/src/set.rs b/src/set.rs index 3a79c21..b2e2a92 100644 --- a/src/set.rs +++ b/src/set.rs @@ -4,10 +4,7 @@ //! Given as a part of the universal set with the membership function. use crate::functions::MembershipFunction; -use std::{ - cell::RefCell, - collections::HashMap, f32, fmt -}; +use std::{cell::RefCell, collections::HashMap, f32, fmt}; use ordered_float::OrderedFloat; @@ -26,7 +23,7 @@ impl Set { /// Don't create sets with this method. Use `UniversalSet`. pub fn new_with_mem(name: String, membership: Box) -> Set { Set { - name: name, + name, membership: Some(membership), cache: RefCell::new(HashMap::new()), } @@ -36,9 +33,9 @@ impl Set { /// This cover the cases, where membership function is not available. E.g. result of an operation. pub fn new_with_domain(name: String, cache: RefCell, f32>>) -> Set { Set { - name: name, + name, membership: None, - cache: cache, + cache, } } @@ -50,11 +47,10 @@ impl Set { let func = self.membership.as_ref(); let mut cache = self.cache.borrow_mut(); - let value = cache.entry(ordered).or_insert(match func { + let mem = *cache.entry(ordered).or_insert(match func { Some(f) => f(x), None => 0.0, }); - let mem = *value; if mem <= 0.0 { cache.remove(&ordered); @@ -69,6 +65,7 @@ impl fmt::Debug for Set { for (k, v) in self.cache.borrow().iter() { s = s + &format!("k:{} v:{}\n", k, v); } + write!(f, "Set {{ name: {}\ncache: {} }}", self.name, s) } } From 74bfec3b7863454a016ae32ab8d4254ca2229c96 Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Mon, 15 Nov 2021 10:21:04 +0200 Subject: [PATCH 4/6] example - use --- examples/use.rs | 98 +++++++++++++++++++++++++++++++++++++++ examples/use_example.png | Bin 0 -> 140999 bytes 2 files changed, 98 insertions(+) create mode 100644 examples/use.rs create mode 100644 examples/use_example.png diff --git a/examples/use.rs b/examples/use.rs new file mode 100644 index 0000000..02304b8 --- /dev/null +++ b/examples/use.rs @@ -0,0 +1,98 @@ +use std::collections::HashMap; + +use fuzzy_logic::{ + functions::{DefuzzFactory, MembershipFactory}, + inference::{InferenceMachine, InferenceOptions}, + ops::{MinMaxOps, ZadehOps}, + rules::{And, Is, Rule, RuleSet}, + set::UniversalSet, +}; + +fn main() { + // first column of x dest + let nb_nb = And::new(Is::new("x_dest", "NB"), Is::new("x", "NB")); + let nb_ns = And::new(Is::new("x_dest", "NB"), Is::new("x", "NS")); + let nb_z = And::new(Is::new("x_dest", "NB"), Is::new("x", "Z")); + let nb_ps = And::new(Is::new("x_dest", "NB"), Is::new("x", "PS")); + let nb_pb = And::new(Is::new("x_dest", "NB"), Is::new("x", "PB")); + // second column of x dest + let ns_nb = And::new(Is::new("x_dest", "NS"), Is::new("x", "NB")); + let ns_ns = And::new(Is::new("x_dest", "NS"), Is::new("x", "NS")); + let ns_z = And::new(Is::new("x_dest", "NS"), Is::new("x", "Z")); + let ns_ps = And::new(Is::new("x_dest", "NS"), Is::new("x", "PS")); + let ns_pb = And::new(Is::new("x_dest", "NS"), Is::new("x", "PB")); + + let rules = vec![ + // first column of x dest + Rule::new(nb_nb.boxed(), "pitch_output".into(), "Z".into()), + Rule::new(nb_ns.boxed(), "pitch_output".into(), "NS".into()), + Rule::new(nb_z.boxed(), "pitch_output".into(), "NB".into()), + Rule::new(nb_ps.boxed(), "pitch_output".into(), "NB".into()), + Rule::new(nb_pb.boxed(), "pitch_output".into(), "NB".into()), + // second column of x dest + Rule::new(ns_nb.boxed(), "pitch_output".into(), "PS".into()), + Rule::new(ns_ns.boxed(), "pitch_output".into(), "Z".into()), + Rule::new(ns_z.boxed(), "pitch_output".into(), "NS".into()), + Rule::new(ns_ps.boxed(), "pitch_output".into(), "NB".into()), + Rule::new(ns_pb.boxed(), "pitch_output".into(), "NB".into()), + ]; + + let (x_dest, x, pitch_output) = { + let x_dest = UniversalSet::new("x_dest") + .add_set("NB", MembershipFactory::triangular(-2.0, -2.0, -1.0)) + .add_set("NS", MembershipFactory::triangular(-2.0, -1.0, 0.0)) + .add_set("Z", MembershipFactory::triangular(-1.0, 0.0, 1.0)) + .add_set("PS", MembershipFactory::triangular(0.0, 1.0, 2.0)) + .add_set("PB", MembershipFactory::triangular(1.0, 2.0, 2.0)); + + let x = UniversalSet::new("x") + .add_set("NB", MembershipFactory::triangular(-2.0, -2.0, -1.0)) + .add_set("NS", MembershipFactory::triangular(-2.0, -1.0, 0.0)) + .add_set("Z", MembershipFactory::triangular(-1.0, 0.0, 1.0)) + .add_set("PS", MembershipFactory::triangular(0.0, 1.0, 2.0)) + .add_set("PB", MembershipFactory::triangular(1.0, 2.0, 2.0)); + + let pitch_output = UniversalSet::new("pitch_output") + .add_set("NB", MembershipFactory::singleton(-0.5)) + .add_set("NS", MembershipFactory::singleton(-0.25)) + .add_set("Z", MembershipFactory::singleton(0.0)) + .add_set("PS", MembershipFactory::singleton(0.25)) + .add_set("PB", MembershipFactory::singleton(0.5)); + (x_dest, x, pitch_output) + }; + + let mut universes = HashMap::default(); + universes.insert("x_dest".into(), x_dest); + universes.insert("x".into(), x); + universes.insert("pitch_output".into(), pitch_output); + + let rule_set = RuleSet::new(rules).expect("Valid RuleSet"); + + let options = InferenceOptions { + logic_ops: Box::new(ZadehOps {}), + set_ops: Box::new(MinMaxOps {}), + defuzz_func: DefuzzFactory::center_of_mass(), + }; + + let mut inference = InferenceMachine::new(rule_set, universes, options); + + let input = vec![ + // NB + ("x_dest".into(), -1.9_f32), + // NS + ("x".into(), -1.0_f32), + ] + .into_iter() + .collect(); + + inference.update(input); + // NB of x_dest + // NS of x + // Expected: NS + let output = inference.compute(); + + // TODO: Check what's going wrong here. + // value: NaN + // Actual: Set: pitch_output: Z UNION pitch_output: NS UNION pitch_output: NB UNION pitch_output: NB UNION pitch_output: NB UNION pitch_output: PS UNION pitch_output: Z UNION pitch_output: NS UNION pitch_output: NB UNION pitch_output: NB value: NaN + println!("Set: {} value: {}", output.0, output.1) +} diff --git a/examples/use_example.png b/examples/use_example.png new file mode 100644 index 0000000000000000000000000000000000000000..ca264476aff7fc1c15d5c69642e8f63291c29737 GIT binary patch literal 140999 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%0AMpfJq$qTTTii`%_f`YDLk+Nfe z>SjBi_~BDTME|P7s?eeo&=3$eX!-bF1e)K6^{TadEzqcChT4#6GO<5Eof?=5`;*)l zM$e5`dnf=peuKd229D7{{>9*1Pvn!^0X`61zfKMO0;Rk(!abOTWW)zJS~Rq@c4K?O zA|=)48PKle+*ZQwHl`Yq>{zO8G zFP|Llp!y9`oz3E=jWOrPIqC|b64>RbD)FbMrw=rOppw3a3h=cNAhgGa543;8e9u*^of&jxe#ah)A1$Ke0x=JzDJu$Z2z6K zg&QkM_<2zp+>$fyZM|{hw%sDbHNK zC{W+~Y;5pR5Net&j>XYYc&zIQAM|0MpX(KefIBq>gIy-=9Df)K@nc0*kItnX#1(Ks zddG>eD8%Co3=BXnymLoI?fG*QrH8o9MaZ<=k<=rj`O))LxdXx>z@(qOem(# zog|tsZ_DpAS%lr|-n{5AOT@rxe{%S?ySLZd->}r!ctMT1LLyRadX~gce1pNETfz0= zk@dGIjmy!J8+5u~IFo-ewB4tY6kU897^1G5^YFS`j5@Y>)zw0e2uJESCSh#+G(SK| z?-(5PhTb?zR3084o&<>-PT0nvjfH_zTk?(B9&I!0 zO|${1=#Ob``hMEK6|}0bo1RuT*r)W1#RKld zQ}9(FQ4z(ie~kpo)4I`dZ^TBuipps_aC$=`k|$)Hu5j}m-z)*g96pCJ%iMP_ar-z$ zgY0~5HMN~+f`icYw}$;KM4Gc#xTYY&h=pSKm5yBR-@i9EJ~=+tJ3T(=9vqYuDPCNG z=v2XmY~=m-P(SJX#=@TPNS>tK^u8+ul+mA;kFOc16!OW(2NM;YfMCPS^z`qxSRStT zkd@lpeJ$MtT}NlgPsVUTHmSqx>~zwHqU^PLo0=1JXf#xfkH5NW7a9`s+ZFA6i4$xE_BTzq zivtDp#msbc??K|f88Gp8MkKom-UFGH*;7;LAC4EjVNVX$4~9Pkk4zd34Q==oTu3=s z$2qcKdfD0C(9lrxmFfL*@}Z`VQuR^WDeQBPAmO%xl3&;kKx64%jQ~h|4YA+u5c}BV z*a=S8;K;3F)2E-9j^+>)zuPo4KQf;6?sLxp zyD05h0rlZ|p}}>VHV`NxcJvoZ5K!g)NJ&XcP5^py6yNBx?vVC>;^k$zZ?`oYX{=Fh z%Zio&+@s)`+TY=fbIu2wGd~FWJV6MzlraC{aoGx*M}egyR2212Voo6HYFeM!2yX%g z{A@f_)BzrPDGxK`Ou>u7K;Ev6#)9ckQ`on(^9}syyA0)CuG>)bApeNX%h!C^7 zb*;hHDsck)WP8}M-F&6;V3usa0waa3jyG^7M&hPy0F&v#jG%Fqn+>KGEBGml<`!HvI?WrzZ_dQ zzQ79GeE+*tXm#J$rJZk&{F$O6ZbugVS6}CO=t|&t{Ske9LP6NH-yP5`Ejrp=3FdW{ zdhmAlP!^l}Crt<)1nXO}yslF6s{D?(X7sxh{MjXqxVwGe{?(h%n!p#r(4@hDB?y{Bg< zq+4wFh9))64vEl;l{}c6`E=XJN1I0?=6x?-ipTyd%R>4y^%zvSTjRYWY?Y0#jW_-Z zqC8#ycM#>h!Vs%?sO*;)Ob5n~AETq)fVAyh)u_*13nlOIU0v`bGuvD9{K#V&-$7Sj zUpG7V=#NUM`;)PO#|7dqt^=pgWG%Js^LHA5sV!A*320DV13R zYM9>L16VZj)f&XJ()vXZ>}6Yie-!Vh31RDXG5DQGlnAgB0w-~Z+?zMa10&d6#?RH% zN-=dSZHl+o#^RCRU?m#G8ItNKbJ&h7+<{P_dSGG!#-pZHP3%`Y&lvKz_&|`mH>#s=Y*4!)ADl0 ziklnmHGKTb`%`Jp9Eqtu8mlGzy@V@3V=w2P7C@B?w=iaA7W%kh$5j-VWSMer^oc%C za{vWQy!=KfW=J|T{_g(%rWF^k5K5Z|yfUs<9dAmFZbcG4PYwP~7tO!Zt?*z6qH$7G z&im8=z?#E^Z^u&4e)Q0|=hXwqV-`czLw=BGIaDLLE}d1Gj3{Ma&%od_jH}=x_6IZJ zr7ISLS2~InD>9zSHaD}0giWc*IDUB{+nmP|c;81(Lf*_s6=J0$GCWjfFF zEBdnxFjA$nru7^0vw!}!lJb(M`QycuxjQr)K5`b*;ZsYRxcL~``q^>@j*bFEApFek zRvpYnmpko2s08^983GTiP$G!l}(L0tcgNPhdGQdnbo|!2h+izRbB#7*$kYt*8n+fLFHkE3^*3~L%B}n zE@=pK8gMFsSOzpPhR=ZzLO+dA)=E~wKnt21aRwO!c?6^j+#VjEmD<``^NAl9$pxI% zmvPOO`&p4{SYl>MHiPclna>L)Sr0;CTf^2y1`H+Xo+U{C4k z>%Rl|0ULS)?1SpAF8l(WUq8USO6*!dsU~ghHYlNF}MePIaF)bTK*8A)YH?; zJ$M@&?|gU}LB)Q28ht5v2%!r+d*)wcL|rr07i8l zf#t=$em$j0We{@6wPhm!OOH753Wvr}F%#o=0x^3Heq{IQzWoYeP{@7Le2wYFcLLaD zps)#p8A`~c;);^b;&@3QRrMG$oZ7LvkVfkNrjPG@xInM|-Rd$Jp)39qU7>hV@lQAw z_1fe3V4Nr52^Rq4i;|8$kp2W>dET|Bz6(%+=!`<=T@=%((OI#q1@ZF1(KQs^xT`!T z$qLP3e}6wAJNqh>FA+^mnycgwT^kx6`%?0eg7pF!uWHb6a&6XL-n@A;AvyU1y-bYj z<0L`Iu9;S);-}MP*1O>)IU6%CstGZ0F?BrEddZ}TVy*k7A`%+8y3TlHN#IPV$AG@0 z#@Aa?m6<7RJyf*5pk`blk(D+*8(Gx!QI)R zYSfI^CMKvwqnZq`e0~5tYXR$(##j z0^S4uLRr+vIw*5Jvs@`OZwtYI8d-FnYRS^ShUeBTQt*FEzliKP{TIZ&;M?~}i z?L7J`FsA^})qfWC$=scqZJ;{WAVNe%g_EUZs6a{WlaLyb{aLM`I4v!0a+5)usEfxF zHiw&kfd_GXIJb2vxAGMTYWq?NPy)rR2aC)HL{JE&pF{She?a*_O`$Ch72`;SG1Y)1 zAt-{9bzm6A_UPH-T{VbmA{%x>`dovZ9skQxr5>p2kxiAeq#3L2Z)X*a)-?pm+odvF zOetg$%XL;tnr%)?pdv13aIP63Q-ABLEF89733KX|?rcu!Jh521OB_Zlv){!(s>p49 zZzPm#$RCt79&j_wmUFmkaVsY4Q~|T>d5vO57ugS?5u5Eh<6*M^`%LA>K%t4N=b;D(mB>*%rekE-Nc$WRyA3FL1mr z+-z~_!i9v-pU*KcFsS6e`8e&&GyxNkfHyxUCe|zl>!;%92W>LE4o^t9QBqcx1oJL1 z2SXSDS?wsjgG}nT%NB35Z^E1VzrSTf;nMPx-J#*B0#wG=Re&%F^=05#qBM479de~# z@2Wj|gn+7Q!x@AFX+*!rw04P-S19;qdpu{D^esOIG2N*M;& zaC`rqaIw*llEU0m8w5UJHZ(I>7exLaDH;=$tp%1?9#~&S{kdoe3}jU|(|P`n3=n5C z%2jdwR%YEWM(YB-N-03C%9*bc@ZqYueB0||W)`Y2D_T+hl$A-yPykXUs?K^?AoB8M zT#s`dP2&R#tL&QqmtjO!6yzS~qZQ5=Ub|}`2cXOjBmqVn=6k*p!Nk?Zh|QR}k7C&9 zrIecuJU1Km+SWnYIuBoRdu50S;MbSd3s(LS%J^Xg$-n3%n+*nKR*q>NJO+ZIsilR6 ze7H)H-`@aHEaUtG3u z-*Q%3ReW@g6D$jAV%D<}Q*otjT%b=Dri zI-LiEv0Nhq7P=!zh)}E-m^Wz)5!*3#-m)Z{!lq57^3rA}|lg z&gknWD_Q|yEgc3tt*pKotX;cTZ`-%=PeLeQpxln_`Sa($D;#Xfj;$*T>UgW;*+N}s zm^Lgw(j_l;0?d%~O-)Wl5b)c*AxFPnGyns-d(&SwY`a{f^cgScHn&PnlSpka_oOZ3 zoi`X##?WxwxCnE&2m-M(eh_{GLqp%gi3F=vvo}*U=&-PH`1NIngTlW!;Um5wGCY76 z9E9E83VB6uJyn!~+wN8RQ|5SoZlK>|a&peg$oP1Ce2jsNz-$LZ0Xa;@Kx;0Q4LN@U z1WgkSxDOy6<00Q6^t%8kK|};4excg^DG&v^!ilLN(<(Y-dSwNoGcbMFIalw8agb~V zbAYBpe?nKF6RsD%{X1P^4N}td(vlQ1KcE}WF+|^U>+v6ckNxkMjED#-RdMbSm_OfO z(6Qh_VPWBLnzY02vIOw#A0fIw;7B|{P@=C)8rzT!Xt*+Wr!vm*I@hgw@&Y>#rj zeocY`jgP>@YZ|SXf5eJ_(;>U4hzKrn1sgjBHGfFyzQBbNxpH%V8^vz~M~@#k<|v{> zsGzY292`$U;6zIRJ!=rOVGd5tU|@^j0?LCG_H+5w7t;)W7StJ*5ebQmlz^?C3gH#0 z{89#R%yho%A2oMllRb!7Dc(8Imf{8#mfnBqt$-XoHFyG{ zi$LZNa@@i{@m1R*MK-qqtK`O{q_Q;qVi5|wmIR|*!*fk*;3{*woR+J`1Kyuq^nex% z2Es5umvQ}~n(t_LdfN0f2~Fz;Gl0?TwCVovCW~JzA>avI!O$zvD*h)6fC15q*FP>4 zIDySFWmN%ePU56BFN0hoUzuM{OD3<+F+J=*NJ?u_VfSPIe`JJDr9vwkBzvYHpxc~5 zY}_!9lE|Abn%m(d4IK_X4bAiKRt#y?;A#AZu^WBR#-~?TWe~m9;nE8cEVjp6@n_S6 z&@oZ-Yp@R@pOB`yz`#pzw#{_^wm^qbA~^&3P)M1bfBZGN&;9sel29yAXTj+lov%`hUN2MJ2l9wgMr{a5&es0^8hI=ylz z2RRO}dB9GndAhr)jecZe@TVrc?GSb-%%an{lDZ%5q_~2`D=Agm4$pG|m$YIK6VSvZ zOA;wI`9flvURqYx1rE19+(FcR$$kQ2>UAQbVxIW!BB32-QB#9%1&d9rz@7cDMFoRC z1(8ih;WnBO*yj-V!!`TbFumjgBHe}IFEcPHClW6VV$;irAzG?*jH<7SgclBL{jK6ns9DnW6nY2y3FwQ!JlD zn3VYAQ<%h!pa53}?sm|iiY8!$VRO)kKK)sLfG3hLj;N!x1@|5`dPS(r59==ecO<5e z$7Yor5AW{?OLI?8VQeM1m!qpP?^M8qD|KZ%)n_Lq<+Eo$0c;~8GCVR#ClzM4;&F?c z<}*kI9e@;Sn7>5C=>jaX0t~6Db>n-X(8-@X&D!628pyYt6+BN650v$Ok@>_{M1(um z9}>x89UUFh@Dk9eVd6;|=0#Yy)D);fcqW?j{1jsuOEE-6x{FOU&OHJNy!_~BZ%wv3 zi-*Wj_SKg{3{fk?Kqfl6l-T&~<$+-S{qgf`cFTDfqTO7YqtDwEg+MSI5n6?57}c3Y zF)U5Z?k311=)p>;KQ%aBf~;x9;o?_CWo6wBNBKeTj$##*9Dyg%&ISW((c<4_GhVs5sY@590fr|0I90F(l0Bfj^_wN~J={>S1`drZ`G zD$<`OWmdWlJUxaxP7Fr}fk{UUJUl$qP&c?9AHck4f!%>bq39m~AjooD7m%X_3}g=L0}bv6OuFag<>{=I%A=6$F_2ye@UQRg zHbA~JY2WU@J^*B8JN=uZ!C-xeEdRj;xD9R)o6lrnelFy1oIKALAm@=jK#hAyCiEN>1N^9fF zLr9ndk44=j2eX7J245?E*cel&=yK;`J~KokbaFDPKOSydPF`SI_x1I1NNG0bsaCbc3g z*wY^%IsrQhL4f`$E^oDCJ=Ue>OSIcfGx%?M+1?ckKW!t zfI&iq!h(l!OvRra>y~K&Uf*b@kGF~#(^s1U)zsn}#y>#}boY+euh%>#C!ph^=m$9c z8_-TJgX-)dtWjr(2{|knd_fQx-tWg(!z%0Q?)CtzIu4Z+EOz&t92QX1fU)>O{&=Wk z@}J8zIp6;l&wb+fe~Wn#1%uY~pLr0)56u7Zh?GD7@_+nQ;}bub9LTHFxIy*>*3XD? z3^D*<$|H|JtQD>jQC3mGaIg7oQua9M9T@sxg^#bTts%`ZA0T-c5*{vPumrtw;=w-Jhi1X$7U&D2fLqQD_K*t7M(VtL?!=!lQeu(hmaH^F|ZXfwjhlQ$c z3Jhq#GzyC0z{Mu>$BcwgWSLl5$Bc~bj{n!km6T$~;nQ4S2SXA;^}9QF?-tn|!%HqB zXh48zI7F`bLhzK{Cq)3pRU~C(Qh|i0-;n~Vd1atLtjAJ(0;ci`GiaqyXkzLRHJ=*W zu!=P&lGCRE_?t(7+i^cP`E+0NOVWN~=l5Jr)Z9xC07|}jRFD%QN%d_rSe7|_jZ3}{-Lbj3<>wxxSh`ir_WK95 z4t`F};i2&dzJP%M?vPxqjWikvTzX9N8M68CtcAiuPS6`g+vs}6Vwy+&H6e``bM+1* zBL%bn3%R$ESzo?f0Z-RAD$NW7ur4aM1#xd*NZEl3CbMDrMn{JR9!3Plj6%67dQwuZ ze%Gx`wc@J?E;+exo>rqKq%-IHa^mMJx$UJHGB91;s3@Z#@O77)Le|Xl9R?{cy;TIxY58eG%xL)ekkr-9K>Oarn6k8wY$nAa=glMv3 zxS2|40O@WX@x}@&V;y}y+%iF#e*7>t1tsaL(;d;s2gam-+%sd~qo~slXm|s9CmB3) zsmA5(NCT$CE(2`!gvUx~&T0G=xw*b1D*?~RaD$d$Jp_|LtbkIG>ZP12|Fn4L?<1^n zad8Gdjq@VQ|24!Twb~k~C5a)q_yZ61m?;>nLlDTE6*%=a=w!uKtnDm2a!6{fO^CtRbTa9sg&25`m}|8-hI8X?Fhfe9d|uI>vu%Ejam zPk59FY^&B2^=V*Zh2PI*rY^T76VahY1^<4;%M}v^B_&VDwFswmW!xTMhPjCnA07UX zTrv2tyXqx3_Osn;UI9j;hChx@bIpn0VQ~%8UZ_X8XltkZ(%Sj^aW4iwJy#i=G1Akd z#1@5&LrB%0Jqvv`c8)xlr+#06O4HK)8ZI8hlu-)`;h3^mBIII@A*$0qGI5&R9HL?iP&NJ zpm^-iK5n#SPmu8K-Q2Iw=j1FagGl2cPla-X`R~r$CTC^YoG^NuWRCa6bgWXQ5TUzi zx;5do#Q5lxBP^(?=bhrnS2t3YsQZ->$FK_%IY({X9Xfg;RBRVeyra1ZV@**oyaDd^ z$nwQl$SOd%x_h<09K_%okhOs4m~{^i8$E41I6P@jlna3 zza#<=Uzjz9o%*l*ke|SDGjg9?Pefan_-lV@WK zUInKjI|~{SP}Zj)Yvnjzym)atyz2P<77@~2W@8HHF(4i0-hqfG)>Q}E|J)rKT@|JIxU{4s9OA&f zv*-RZhbAz^e%+p9$DWWTX5o9wIc^peNDivfXG7fX#r={rThJprw{T^K}%}aQ2H0baW#= zClcolk4HkA{vA5z%ayBEu6%^E^vBg*yPo}Nc<)jvqn7gL&tnC)zx-uSdnq!mp}(d` zBemNr^3G;{)s>PoJ9U=;=N%kg`(xk-=LI+VSWTN#YYs?CypUH~vs>Xsqx`2m@R=z$ z_lT8?Pm2uN%!PA5pR^e$(NFg%^*>^20xu+DZ9-Z;fnqgr*}!sK7V4?Va3oeJAp<8n z0s^t1ps=usO-uCj5#m>$Lb+$8u7Oq@zME`AkiXi>&!@(#%hFcDg3558LUu=QNyPRauAXX8=&Uki6dt+VIa z0)QeaqALmc4Dj2`L=GfpHF|@6eE-EOr6W+}E71-O_J@uj&+(OMfF-BDK^G`Q7z_FCyortY&zxv;H=It8q|TUqPOj)qow zBH+l^{_TTZ=O_ednGEhNRIq-Q?BJKXRbzoqW}=a=J^#5Cn{5sB^NDcPOqSsK!{uS{ zXWcqI?lQm86qn4R%KOx>7Jd=48PK<8T<64KwRzXBbHr-`0V2o2XR^%Y)^(!=1|CxT zF5QpY$Cw|akw!NeaYXOdNEq1qtBc=OtGqwbaNN+gtd$*tJjNpdSbM>LF~&5>LQo>Q z?j|lHQ*{%Vd1xtr?Gn>fl~!48hkL@Qw@KjuYcwOb_D0G$lt%}%80hWKVvA+Ss%Yn_ zALzQdX#w(2%TucJRddik5~UsGC>ZXbbm$p@$|GF`k{9gR+Gh1M-75BL1mE!K-nah3 zOHX~*F*X1nQK-&Zw(7f|I90uHvhmu7*0=YzzfPk@P2Ykjl3+Td+*MD*f0dE^FjXf% z9uFZa2iRHj-~(}+c%2r71E%BYa28q5wWsU%Pqw7u#K|#hVr>#*+!(%ihkozosuTM} zsp$u4p@8|cW@}~lw-Df{F-B=C{ z!$r_Sl84+4Q7jO^o$Cv_K&?W#rD)Y%okw^EP++z(d^yR=3UxRMhxRfxnLCCzZ}qnkgm>5C`z;3w z%?izJy#`d}{=W~my#(zbHS@Nzl0mW1jfeR4sU=WQS`8e5VId>3we`d%A&slRX$IGeU7&69CJtui9=Et82^-D1$)A95 zxThf>Qv~&o4Y8f?=AE3G8fCtNnO6(TUMj^JeSuStDiY7pcVs8vA3S&B=OphNzPJn1 zI>j?x=VKQ%6M0nD@%QM=T6n6>ed%v#25D^l&Gp8>fC1y;ABX6&Jg1n(CX$Bn;0$&g`7u2(_Yk?|C-$B_Kz-uUgF42MwXvqetRM*;`a87f97r_N!^LfW|5k^_nngVHZ~)|Bsm=I%ez@a){(yLXqb zl;W)n3=GC?7kxIBbGP-UY3kEg=^L77(#D-yJ@@H-pxJ_foeJuMy7O5=kX0j_va|Mx z>vyx*_;{R{D;>vM=|yFJ9y|jzVb?eKK8fKS+=*tnXQ`GpcobsHq6F%PD*5E+=igc{ zXOw>{$hg=CHQ~wcSFj2ws%5f%zyH*H082_mf!6^oK!#aa$9cEEuy7=Sd}0@=KH?P< zgBpc}v9fJ^1BcFLhs&e&%uZ)A#t;ew(CC?^CG0qg7kuF?ptUxO zj-m*C32PTMg;>!ii&|gMi_qwr`f5K0QAYk&NJxlTZvijNP*yW>L3YyzF2VptIq29A zJk!?!JEyV}j0*4$ z{nX_iy1d!+dorV=8NWWq_Pq!RrKS+S5*By(nbeOjS)E?}Woww%D%`Br1NX=}O=4KX5ax?uf zoZ?ebTKWhkGqlMcz)}PwQ7%j~4vPOnIPL5FuxWNfl!Kf0HLlN)s5SZ;o7R9&MBW^+ zra|KuvYkL8wts$mz!PW);>4$iy~J2dP*8JAmvxkJSDNI{>I-T+j+#*-r)y}S?m?0? zG3aY{qpxMvG6C*ki%guhGM3E@40~O5Q-42PsLlJ}aAyr5n6F>IzJN!MLLowOBNyOX zn?*l!p&}s}DU?rr#rZ=nAlpcgfq+f#yYAtGOqnNNxD+|Cqd3_n<}OIEBCs4*eMNz} z`gOB3q5ss8i*$nr^)h41A7%YB6~0fGl|Yv)Md2K@#b z-T+Fa6X2sauRekw{I0$}=nSy`C?jV4w<}Y*9e5Trlx^ak$Hf*t?UkC=eBD-7yM1cQ zj7L20{fsWvEgyY@q+=d2+uzm?2z?OPnwneJWAOFEOHJ7CfdMM1tFMCCli-4opb+Se z{YI3VBNe+@+Q;p4}KPA6XGEaHt3%{`jk6S&t*>O$F)54k;> z?ok$W^B5i*qm5}wFuNZoU@`VWsZV6Zb8AVQv~k0{#ogf793$7t_uFs?l&*>rp zJh4y3iR&jIFiR(UnS3bs@*6s;j;`n+qEf*RyaCq$IlgkNd(oUZ$e(E5GAdLKPk_L5pj{j%~oZ#AlX*8jEyHfEV{3Iz$Iewx0~yII=K9w`pxsl# zO+vRpBcQi4gh-u8B#1l1O@Qmo{2$z3KdU8M3pQVOz*&Vq#78yy{e8LGuR zp?J2ub|qy&OOKVR<2qG4oodt;WB#z$ER?)4?X!P{Wj3mZ+&-90zGY1bi(S?^Ne!+m3iczE(Bj;n;niK}#- zVJ_v@Ej1ti^r~Jh@4#v|2N6V*xf&>^K2A8j|gS+BdC_C>Yjx1Qs= zS+EF)p}#{^k0H2e62*1!;6WtM-U8c9V1E)F2nAsTYXfA3B(t3;J`t^ss>0uWQbs{{ zxF)>oeB!(UUHw;I<>`Z|sLQ@Uv}F3!WfhTC;lLp$^<-}$1EsT13K2-lZ|lqZ`-S$S z23R4xS&8cnoRPnA^2d|Q=lH`LM;6qkgmXgEhy3VUikVYqW5DE`oPJlK$HJZT+13z? zi@Y6x?g|rBOwUZiOL07>XIgzUvx*F&YYiW4do{KxL@Wq)GH*mO$%~y6fwnyUJ3z|4 z*kte=@)qY#Lrj~m-H!wo@*eYOXP18T$E2jJ$L^F$KVP~zU*<~wW=gis!?uTdYq@LE z=tw{uiclig0e&`NVH^H_7i2=WfYc*?Bt`5s7;3%{RSA(7_YFC z63C+*_{!|)03HM7MSc3A0$=XXvcsBd4kXzPS8u6WgcRi^Dw?&dugHT!TNUP5T@}Or zs_n!_Q8okYp4SZx8_*r>azlBYkXT2XV2pll z(#hm`xvHO=r?uT2v{QgV1YqtveEsxql{Z) z*wg3roDzxDh@51UJ7vM>>9d>7{NI31 zB2;OlbA7*>AIDK%V%+V?>(|suw9=`-6PoB(#$TM4} zzfC&nK}6e=dYg2{1GBzz?zz21eHA0GU%hGsx3!Vpq&}RMRT5`PEhFJ8-qg#|-UeVe>%op5Gu5+)9U;JAs1Jv zaZM177kn(xm1mb6yYxO5S7vqz6!y`x(8C2$NCfn99H?xyDljK%2{fY7ICH|55C95d6pC*PONM&#zGjjjztOX`mjHfo0I)%X`t&qVEWj z+E$3(G;H)sPyV@_eg$acvZX{Iut`Mk0>D7PN*1LOUyVJEEsNF!dMe`5!7b$97mt=S zYr)>$UaCQe=P^*pc>*yN=P^?4-9!Pg@hh=@vV`)&r!JC7HhXi zp?w2ncSN+m$k8{huf*jsLfdMF()Ef3vD?$p&*4igbBA!6rj3{qX3&oPd-l=^8XH@AZwGxi+aThbDUBp zE?6aI;Ol6-aBRz<1;`rD^TxHwH%|&JUzfshp1pfdDtRb-q_jRMG<2KFM_Kg~#$>YEj+HsIFE`e2(QXrc z*Uogc(G)!U%-IDTl?RjQR04ilC;oP-Sn!eky+huH>#UItPyB>En{bBAkF+;&1d{u+ zI4WKjU}|xI1YCq1*@>jYrG`I?8%R1gv3WmlX}U?v&?$rxYjbK$K>}5-H{@$i zQu9SEc!GG~dOkf9unw(w^8;*T*f8yyHAH-vr^Pcj0qc9p@l)fM$VV2kyNOox^+Gld zqob&t1Ps0g)=9tRw3Z8G%MY=O*QRj(p#L zdAyZl2l)1|^|$nK(7?nWh=WaPCb5u~jX%D1&BKT&d7YxeJMQNoW-t3MXUgX7+fTza z_8eo2w9dHyLGa4HrHD?Fx}P<@(L9@0O11F9PE?qnPeR*t($9-7psRQX5IrLOmVO>v z4AU>?S$4#dp|T-I17p!j2_kK&*m5;j2wKsTc_v?a4gb=yPuJBS@tbP1WAKqJBPW0i zwMC(0O{NQZi+8m1Z6MucWtBWy3g0b_>U$2Qwn|#FOj@a-f(A$Y{73fgA>qO~KC@FC zI;VT>a4-|6Xx%iPLK7^W=gNOCa8mIbG9&?&KXnQ`e>|WpQM1S!5eTUAX<6HcEvL3Q@&aa#N#bkD~TTXv}FM)7PVy6O9nOzb{z;N5t~ zHtb6L1rpU18A(AufgBsV?os!ZDcFMrH@JfW1Bn_O&6X5WSGw~reGz!Z*S-n=q~-a! zy(k)xI3@wX1^4;)2O{IhqfVaErvtz90xt8*xXTdILcEzsVsy^c3^ho8kZh@6L|y2q z^p`$&zKx8vn2^wRSj&*>k*MRj{p>oXZ-t+)A6b5m_hzl{?*+YqLXddjuDH5F-SL*Y zJR^P;{~ntXOz|ONIaG{{J3~Dwr?_((1B+ABDLs~4xrVmRt=E*3D%dxBzveYX5he&- zJ!oz;BQ#C+5KyMWOndXV>1B#L-L+iYRnCQG!L_b(^jehMY(0%=} z^)M_zkNo|w1G3HL*&l2NVupkfzj&rU@B#mp&O7E1lJZ_=8P^;J-l^gHiu}Y|U-^UV zKR8R;3bsAOLjBkzvr7tMZ%EOJEilKbYZEX}QpFM36gqQ228@tMetdBE?;lA8yjKdo zDiAdi%f_;|c69CxKCctwi5-PJHxrY1vjsHmUm<=&9!YJLzb*Nz%irnj?2Yuy z9PdlyBLpL|#HuInF96xn@GYYEXe_WbggJ2|)DaH3SN`>H@Xb^4&8q$`Bd&NblBM0QxEp#f;1qIun7k`5zN^P%L*qB9W(K=j6hF5?6{J9%)k~DV^8U#`O zC5|w16m%B88r)3=C0n;_`H0hy;`Q#G>?eoM9uX(+(uGSY%vv*b4A|JqJ8tv!`*3Ed zeP5qiz7Wj^!@GmO1^4>xX4Nfq-GcG~fqD{VW(i5d9Y+hwC>v!2uyNTbG+to;b-Dcv z@PjM6?V-{1o@P0I<>4^S$|M15A4Mgl6Hq0j*nD*U`r*X$sz^o%{_u(gvJKOklSKf+ znY8D_#zF?cXuJnF+06B&%;VS5puC01iYxsvM2L7|`vkHDJ?QLYRgPbgns~Y_HGa3T zOxmfmGijkZNrRdJH@KIQ%;ot{JAW4T)_fgk8yd{qw$JUuf!Et@PXPt5dnW!2HIS*g z44%>$fLtZjIn)KvEa)sjNuj6Sl@{8NoLrXkVu^?MvYkV3fDPce_xjW=v+d3yrbS81&6Mpb>8uH`QiYcl} z-lDsKiT{Jso6K8B2JVoYEF3eZkare(?2;eGORYsLgP{A*!?=XKaWGdOa>GFa4Qy5$ zaaJ%N>IgJ^E<7&J`8%{>?y~B0aIe8gDxvJga3J&9&oFdSHqz5y!<;wFa}rFo;hzV? zj=516Yc@>PnMRJO1x6ydMPZ`<74OA=QquK z8|L#@myn9wv;qaBeS#IvML5?e6rvQuVr!Zi%BfN_d|rfa@soYC%$86AYacww=N)c9 zuqhH~Kl>~$B;HE?KA!e{ylox1Ac)!sm$K&63=jn>pwebNdED3l!>2eb#d;6rK9Bz; z;Ai>KP*bPC^N;Y?vXKH#?YHz;_&>}4{1T_UfHSr8_F4+!h%N${Bj+Ab3zIN264!Zh z7Jxa$DwzDow5AIwB5(Ba(vZO@!JH!&7KR^hAhC8PiNs_v{ zC07s?{L5x$VBRw~>F(Q+(&cGAdhGB{9PcIo!5CKI?f`Z$U@?7VNB& zs_H(@at?6KB#q4NTdXp=6bc1QjdI*^OXyOFHjD1dQ#jRjjg5^JIDdI6?XL#dHZFlh zrsw%>YoTgzn%*e$idm`{SSoh%TLknC*D&8Wbrawq@$n+?3g4e@c=b@vlkNne_o-2D zu3FyLWlrc~H(kgZ_fzhFzS5$>G3~_`v9g19Z=>7GD!M#4kKMi;#FM|8e?*qwwrz2+ z+T}g-NN$p*PB|sbHx(!pMnRDWvhmT$S#xV0zglNJW+1#L@f|52uoUuSf6UF9RDvFt z@&0wTQ`Nk$C|CZNYO4>=?}H0=YjXAZNL)6&CnPk6Z^!-b2&E+h?cBbpBN~pRx~gKF z)2UM=WCYLCFAgTHCIG}7`}fP_ECL6@Heum6Z+pZj^ISymW=)5k6o{8sSF9%Ck z_f#~D)b*K2MQVcVRvrzh|AJkPC{Tp`u!)fLo4!)FCrFvDnnqh00jcucJD+f89>shc z*n9Xnk0B-Wy~hu|qN{((ZgIu)9H~W3OeSfe?C#=)XN1UHFc_u7PNRk>4yI;$N1lRy6EY|0J*@M@6Auxgpf`ga$5rI=oHUQ{;jv(pN^FZxnAm_)~B zT~Vs;p{PDT%bdNn^6pq$01o74Ajt`sX2&>348D+zX1|Nc@vyU!r^VAEDJ#pdtc`fQ zY%^Hm524D#8S{V?rLz@7cJ4kB_=0FgswKC=OHO70Ha!uqZu^5&Ls@(s@{p9Y-h2MC zCLbQqSCi)-#6zEkECd>rz$Z_V#ophwDpys%o5ozxj`MnCCdcA&P+2N^KmmPijzy>o zctjfTC2{zwppX3o7R%pS4_3&>**Q6_dqjoCe+`Y-v4|-1byPj7VF|IiXlG| zWihNXG?yCe$vk$<&2SCB!~P0v%dYT?*6xG^1}rf<+10{Y*CeEDL8mnEgC-}7-tt?z zzo7D39h}57J02}fY-JsNs~(T7(t-ryR}SmE5cwoY406a>%J3A}wmx*CX0yzwh>q>e z9cNICQxx$L_cZ{2xZd`&XNP2pxYML&Tr}V0>`S|L^}GbXh2|Y?$D(LPpLa};Mx03#KYK4R|(;JzC+-0Pbw{gRWwbR5l=Yt~7NI-DBBmEo>lh4!WvjgeF$r1w@;RNS4kpF-YcP&qCSa3Ph=$V4B5oYcgnqKu9; zKqKEqk9`6(uOxzfBC!}UX0TKbChf8W5d6U1!$a#2x>u5e4bc(w)Oi!@I04+SQ3%YV zB#M1>lbrwRXMyE$Ajo(LVREuS&9V;s0OGotnc2EM9UX5h&Mv1(Fv@%W7CM7+%N8Od zyYPcc&+{Z|T!Z{g1@lg7$HB1kCKC`juaictS*$QG?q*V$qE4RGMW+L~*9ag)EkXMA zPw2k<&+4U}+rvr}8`%2vl$s;Xxg1JNQGYNObBURZ;C%_GguWz3;Hg;Lih9lPq99)^pQKb$tJ)wG19`)oKEac|* zGu_=2FkZg{r#sgdXu0;eJk4lKcfEG1o{58>CE%whtF`qT?M2RGemS?fMeHhF?!POW zUH53lkn`G&)f+nd+D#c696X5_ z1rk@(gyZ?n9XKE#zIUHd2y#XZl+p_YEe6-IQOGzdu;zU7I`B={r-72{k6?W~#=e>2 ziea3cTOc^Eo48kkpdv^QCA?{ z3HFySFh|xf*>wk4<(88eiVB>WB$81@D#b{L4Ce~at}90}%t656E~H|}dtvK9&$|1} z+P%{E4vVC{We@leyR3w=!Qr&5gknj0f8X%vj;`BA=(w%BvTns~VPtI9xl~#))LrHw zBG15{fdf4_aDT2MgvA%G>7xd$6C<`s^!8fk3m1-AS7N?JZS@&>`6D|mvEGl#AKP(% zGYboBk0j>YE`k63-Pp>AO?sSC7FHZ>*V?U{U*#i|MFm#yE~2@Dvh5SJ$z1PTKi=Bf z8K@)Va%LD!Z)w6kU?v7deTdQMbA2@NE8vg;bLL)|5n(nvt;bc!Io6clm0qFQ>dI6- zrDM7EVanKvv+JYYJm`{qXpG8GVAh^U)pS2IC04Kpv=2PdZ#$mCliKLOkOYpAaSWHX=@_Vxyn>2+ z0CqybE7vh*45F|ynm@C;kOPqrdm`<;d%w@wr5f?|-9%X2^NI+aQ>T_AqXUZ@$YnZz zoJgR{v3bl`rr-nCB8&6tvI^_aRvnj{B8*gb#OC&NTA_xK8s+5}S`Y(_DJ0xc*ux$W zBzE36GhtRRpeNt%Sk%y)jdF{@-2W~)i(Tg&4$n^AWI?ZxvaiB{RO>hDixXzy#yoRY zl7%h*S`tmq?4cd^>j6d_?-gAdv>&G>1#)g`Bp(PW@!s+E{oyS2S@_O0c0|U zMs_m$W;_p-{MoasDDWv;)38e)J`M30t0PfwzTD2wy{pOXZ;#rUn{|H6DQD#|3Mi<&XzU}aY4&y9+FtH4O! zZ*5gYj!`7emuQ!mm>4QDn9!e3F#0O)c|zS%NH%o#jPqnC6(v~ALzsf`;47dqxj2Ta zl1g#j@g-!XI<3#=uB7{D|JIRbYCGX*_E;2s8=2}MgA#tnF`Ih;mU`S1<3wG^ykoE@ z6fz`+tNJIBsVK4yhRO-UzjC6B>K&;+e;8!m?px2~UH?fZj`wDFnLG5jAc+yJNRP_y zQjof`@^#X#c@68vw=*TKN}Fr*d#hzJkTw$<(C;i|wbH9=4r0>A*wYNY?od8onMlp& z^0Q3kaen#*?~kII_9%5vth@)!ne{C^+WXnr2k?DJ>NGD(b<%=D-)-!47?Azkt4nca ziC;n!c;c>@YyE`(#KM+KP%wCj+iFr(>WXjqSjR9585)Wi>L4=uy-FBM;0~&mkMQb+ z*6hQ`_(sgTXmSVmaOdvbmk(0n_Sb_1fZ=$aTS4j;TtCB=-6J-Lk zutNsthpjD-ck?JFdV{wv7MoAR1p1vjIYURLrtaf)T|`TZo<5^4EByXpvt-sYey48Y zrUbY{O~Hw|fkHG+Y&A%^NjJM}&U5M})&>;?VV&GAPeC-J{_}%?Gqmd|hhH9M5i8$7 zyyb^SGAu8#!O097GQT#i>zCSbHp2{5my7~>=iro!ofuxla>3%>V?y%l%x0qtj@gL><87xRMzlWvSR zvg<%ZOeAK4!cwB2{-p)*ToeR$Mm|dW`8XGV47?CFl7UYMDftOMZ^%_ydHL7a{1^$d z$MvG@T7HjbjH;uBXJ0V8m+Uoc(i&{k@<={Q$?VJyljtj?B5MW&DAo>@7N= zk6*rA5?H-ryzY_32MhhFPsh{QKMSXyPSw|?*V%qwTHxGqoY?-xKB+S~txu9iiosJr zz#|`j%&K!E^o~|~Ruh~ylCEt#kEih3^a`%uc9?>gGm~RJ!POa<1%a#pT2vF{*8;?x zJfy!qbylzCd)%r}8_BzRw#O$FJTen?wA00vao$qR3s&ivhU-z400+6=rwmylj^|OZ($X zzp2PL3jZ9}w1+kpZt?#d698W}B7un*@o-9UQN-*=))Q0%2viKTG3qsnhU>w3(*kC# zz_D`;^hA~?Z$-DDt?D0-h41){D-THWJ^54}*^ zkT^N?Hijn_QTtO-(Ar|Ab7J3g(%7$@Na2S6I7N1N*N>A^gt6@Sze(4+IyZeb!K9nV zDH>z{93k~H%STA-g4BzUOf?{9J&j2k=}(P9UPY9~n!@DdoHBTjWQ`fvaR@|BvFRz;8fJ zmtUasm$ztAGO;r^(qsDNbub}nVBP-S&nuj59*dS)Ba)azz)?}a;Yvdor`Ev0%zPh2 zzyJt9O(eIHkzCkM0%wsVVVZqbrS-dqT*H==$%SVpq+Hc>rsgs-;>+UBM^wKES`v`%s9{k@Mv-YXeT(I3bZNyi>;pNUXLME_UJ?*;ZP zKg|@=^iJS?PJv)Q?hDLzr&@L6gss+pzBy&AxQ)G~Zd=hEk?*X>?YAA2ONJ|FYKF>r z^t4WpgPOOeY=?y6E?(jQq_$*y9y!+eE!!gjqk}?v1BEei)RRsxQR7U`mKV366KtWC ztv-DmKuzuf4X`Cx+Ec^^^_7&UaPM}VF!`54E2b_v?G<-!UYf9wk4UFF_6-!bUT~<- z$v*w+=>rXIcWt`S`udO~-YZX|ypxucq{e)6Lz6)$q6<$Nch~$k;Z*U;#bx2ts7Wh6 zD={dd6sD$}zw&XV!cgXF=ed46TeYy(uh!VvZ_&;&U1^&K?s8wKpzlo4zT3RZLBZdTw#TDZFLXZ+!uh{Rg=$2 z6jbji={P}fxu5g%QGm+@p8du6x~66wlozO^s4X~9{UOtK4Q0}utsu-AfXI4g;ms6W zzrq+^ND>1+^%fq1>BIa;xj!!%`35B@k2gD7(9@PWN-&2KPdu3 zaroT3okF_%Q_|988YYrR*Y(8uyY31&a@q6`_g0PE(}|aQvQ0Of_n1}NNRQO*dys*4 zrKp@`xrSBt3i2_C*>Ip6^VqNmJ0!GKhP_c7_!Z8(|6Rz0F2Bazk2YfOS;G10BDPct z?!Eo+q`UiZXbg!?8={inzPbZW9e2C!WBqNF8Af-dUd~O!9gDQ^jM*;i?0pUL3JSUZ zyyjoOer5ltzq@p^xbvy|^l50{Dga$wGt;_$9?ODx`aT)zhqc7@p5GL{B--Wix&A!# z&NTmAuWcp_as@umLPLG9*7UxILy@){4h8g3FL3~cbFg5T&>`1FsQRRlCFvj>(G{^q zJNG#lI1CWi>Aw8XD5<0<%!vGz})Jr@jKSk76TgoK@?m9SZzUXQ~<+ zDuFMmC7-*1x|rgHzc2ukPxL4;!($~NFvR%FZU%NOxANP&-ESE}?+~qjnELmk&!e$< zxyv#=d`ogqHtgcQd`=?mi;D36PD>fTdPlh-<(|CUxo_I{q)h!z<_>JLbbYwxDcHf>Twz`kiD0J*z-m4oQxbtMn-(9h2e*zmH^kE17%}& zPD#n}9ehS>s3L*-D_y)8b<(w)aE1F3M#l`h;%*U7GOA%3iyVT&)|3>~&CqRcq>98G zXq6l>oi`N~^pqXE1~=gMq=eARFi zO8d+~5TUI&8>uD!M?qE)BgXtKM+^TWYTHA9cOvl40ff{+@2B;Ph{)LcQLcs9Ai_`z z076pExio8!f7iV=3CAH!#4wBNd`Tx4kxSYR05u~P9&2H|lA3bp2Ay>8o&$=)MztGI zC-^9?etc-Ht3LO)uq|vwh-8%3yxMFQW*TKXsFV-iVe-58BWW~jE_;(6x+=aNUQrt! zWkdNyx`3Q2mex6Ih<$61@n3o$jypr))G3JaVQ@70#>vC;Bv1yiw@wH`TZ1ex^4)=8 z(~Z5(VYYLB<}Y;Zou>%02~}91@P}CK;lDk+aK)|BfXhOZZg?&=z|;C4kV)tj9wkPc z6MPmTo(DsPcB8V1LZ_+(o4Tc~D$4CfU36r-9u?PH&ZX$ zo&&K3hQu5MZYz$-Y}b|Zx&Hw;F~SSXP64hhgF4i(5`~{xbpQvAYTAPbyTolCb#xbf z0KQ0Y@5KvkPU+gYK7h1oDI^$)u7-OVcwlT()7MtA7J$43GAL;E3K4)IB15{t0fR{3ZYVb5rc4K3wv1TcU<|i#IZsAvO=aCN{(Sf3q zK$plHvQGgtAcG$CvgSEpE;KGE1WuA4PfTUl0Bb0s-`+4d{Q2$Cv|x3y?qz-0u?KDX zU=2t-BKe<|m6#}{&7-M&n?HO6@J*;6Y6(<|t?ByWL^>6wOI4##RlYQJ$%G*s=sGY@ zoxhBL4!mS^MC(T!^$^)^cAV^dG<^4Op;=q^{*F9$h0r(CM#jc>+c|FKLf2&Ax06!w z_N{iTJcMsmKRAf&nDYo1*S)uX%<_L`#Q&Vcp}h~Y#Grj6>2OZ<(8g<>=fB>9Zuy9t zklS2}mMbJ1JM}4_P~k8d3)(}xlQuXwC}o_nH8C?zb+uf#(FTiOc?2frItKuW_?s(Y z|B*7?0b_jvXQ0VwUC5EjiypzO9Y3lf8178w?-jC-&@D`dBY^!?^*jKKeGP#kGTLD$1McZ_Tfb2YQ&e^u0vaJYu@z?` z26D#2vYzFDbWD(G7sbv6KThtB56Y9;ceQM9vnN9mux`}Que#qu=tppD&{jvf#O8+> zno9E8S3*a|-SQ0L#aSSY=Us-k?dV?bA9UALOEDW5wD!h&dRq9D{Obq$pE zW2$1h@pb0w*GQb6&A9)=*&k=n0)v*u7?z{3NE``4yy7Pk{(!KDCcfdEN|ya+PdPwH zP7XYx>a=62qIdGcH`yYNYW( zM`n(@6Getllb2Mg!ga_?bv~8jqWX?dMXlbI5C74&iTpr!q`pFnmE1{9FfauV(tE-l zKs1s{Ju2N|LV0n+>>w?@HC@}1TTit^4mLEuIl5ZJ;pU6iN6%q0+8Df4dsz)Ma!{|; zOeby$M^a@d1zOFUX0F(svCF7 zj$BI(Etl9}*cL>-;O@zCFz{jO-|u{OcUHgOP_3iga2ESx?vy%iJNFV%Ga<&@9o}}o z+Cx33#*WDttXWoTDufF@@~ZYt&tp7dHzI3kf5-oud~C%10t*JYYQJ8`^V!Zz1J#|? z7Y;Wf=8q6+c<3Zw0ONoD))VVEmRK6=P}_}&uuc)x8$>N+1VN}&4@q9oM!>F-m|OeG zf2r4MPvXq@{&Mv$MO)iUt`O__3xx}L-s1^8sb6>7P3K=#i-xWYI@Fs;Fu`(Xahv4L zHhrsCK@5aI-b`bjwBX0OV?9j9XfJ~im53(Ne0Dh9kG1j#M^jiZb0U97 zRiHd)PkVKxr4VBqi?{Y$-nmaNv1$7n4g6HcfAl&o?S3+T^yy>;vte?2`R^U@0ZS+< zJ{)?oEw}v%r-6r?%hwN7@Gb!OT|um3?CjFH&h3abAzsOoh>6)b^J-ml;04P`V1s!0 zxruquZ~c(rx-tlPmW&H@q?wi-hpM(7vg_T+DhXvKZsa@Y01S}Dk;Zsh?WeAW{YQ_Q zkFD;o&fLPiV$c|Q0ukaHiM5*e>o8f06S(4#5v@>os7&s>FbmO`{dOffI9Q-wMbx27*B-hkrE-dB1-2;8$N* z1<}ma|Jg4nxD7w=afxu1?Kva|kd(0(FeU;IrFfy2Makb#@wdipW_T9osCX#B`%0EGM*<+?^??fqJqHuCCM(ChgLMIgpdk$wd3 z@UE_o*n$Znjpq^#U?q+5!Rth&uL=kL5%T@>AATcWw?4N24|(76pB`P7_x+nx?|=HE z%G7c{4g5+3+fXFn(qwi`Of-Lw$n=*r@}4SCuXAk|ntKG}7dFu=ObWn0%MFHG-E zoq|k}7&j=p`S>;oGxy7D_@e5Mf@&e^xW&S$LbKtRKB_{onk};PKI4KWFbLoJcdgzn z>{Tt}LV2#3&G4HzH`7*zhfewi4y-L!<9j}1%dP-W31S<#D7?Y@6ORN)jLW&2OlN1W z_XY#sqo+_yKt^);z!x0gTJM1Y6rG{7OyGzKf|R2X7S1Gv!gftWs!~PbS9wntCZ)sD zD&boCemot$VQBRS8>b?d858yfbV91!JzE6E&gNX|e>&FwULQ(#730kldsE$WM0R(W zcHQWnJ2cFh!<22I^0$JI(FtwdiQ?&G>t~;buIA=Q$z0waak)0Js!Wq3EklRRUU-*j zkZ!qW1f(i5XedmC-N15~L4Hou2^zldKC15Q{bRSUGHxF`JFBqp4m{yB#^Ls(7?I#d zEcZ*e9^2Xs+Se2)6p5ESXuUC^9FEg*0CB-9DX4IE5%(WpJ`zgUU0dT=jrGa@7`S;9 z{s*AAnB2qy<0Uc89G`x-x4<5W;oy#s18$#8)2H(`jM(9J$rzTD!{8Dq5|=M$_{Pyc z7k>8>1U@oZBfA5Vx1@dI{NJQ&knkK0j1lfk+@X3btkoa=aMrB??(z22}Jo>3Cs*SfH>AmaBdVZflO8@J#UY`Yiwf%9{J`34FAiEJdY%_%ZCBnjy54r>o z626sxbZoH&Dd1@_vy&N!nSCOY@{mcH8}Bi@7}#YHzsi^sfxAI zW^xY@!MuJ7Q^zB9kKy{>0^1wbYu-tvJy16|CO4!$o}H87oa#|*E~?#Cuy-&QXo19V zw1Q=;&z_vd2u>@dDW?S9^aS1~VbKo9y9V`J=T=yJ_hr)25N=4i+wJrr&9VAK^3OUz zBrKjwvlv~Yu7QlELj+7{)ixLa@S6|ym0#_TDq`Zc2cC`D zeN~l}-V{ZMj!x-cj|hV6UHX33ffh^-2cviC8=r<-4IAr0Oz*>|P(n*yTkVJHp9tKf zq;8ps@aPsuKzYlD*p#r@DIg}s<(g_q=_FAX-wlZbutq6kum&*Gdu?QP^gr@6@A18? zJ23E$DiWcB!r>h|{JMjJtRd)mu5sSwR@VxOMRP2z2f)aH$B$o+^KVC@hkXktKwS z7i=pWBY4EF2vYh4LoFFv-`Sx{Og3jHr#!tPm4WP>EN2;y;)gP| z8k#$^u{dG|XQ5ps0wLJHm)%lYIv|71au4YUw;c>>l60=mkt&?Zh-YARnehp-FWj9S zGgw9chgIW8`$I#0IgiYkLG>v|?;xiSK7z_s;b|3uEqrGi?T*8w{1}r@B#6&#Ujt?( zUYK>qXd$}5hL4L|lpGl>VA!Sc!XCAFWO8&zBC2mIFBXi%8wiIZhk*hk+cx@;b0&DU z`zb^=21mheSYCogzI-`{>gEWiJla)_G~Fl+!V6-gr$6yu6;-^P@^_iqANqg8%|IGt z^#^!dkT|N4ESPynp<-|a7f;yb)RKfrw1zM-WxROV(eVVrIZk_ErQn36DDQfD!te(~ zhH24}R#*LfZY~~oMb`1T0Qpk^5fRpNY7bB}x-NdJtg|xvTd`&kbO{Us=|!E+qM*Vp znfd3|Y5COjLE5|~0Qas-vmISR094~pKF(bQ2ZeQ79VLuz;QuB~@~_I|PVFXl&RSa9 zi=&Xq`b5XXgjfT($;^QcH>jcey1HLqr{QBVtqnJLNZ?Ke2E&nKPdyjR;io(DSmv%@ z&es)rikmXJXI37)NUyV;gGCUfK}S?|CMOKh6pfKI!fqKkj~v~rhVnLkHesZNw z>iJ#TZ?`yc1uG`}TQ~Y^B2q&GPl2h7JU>KkDcjj)wJlhUsrqV4uj>=)VI0nT-K|kP zRL`khKWta|xb(MF+UL|g9c2NXMd7x|ZAB;7iCmUqN;Ep#VGwS#lJXKi$kkQEdjA7U$Hh( zpJH<8$|}%?nSG8`+$xuc5KwhkF|^th|KF~|j9sU*Qv+x{iTvIdCW z`gs9%^sc~9WPf)(GvAmGOxL@6PbFQBnOj@gziW-GbNAnQWOSkT={6iBdAFgt z`hDO}Cz)eWIT^NWgMoKC2gtZprw)$DTOPukXDJxOiQ(o`pZTCGAfavATrT7DP8FF@P$Rn;ZIMC@S7O29(RJT>*-5$id z#sB}`qKUk!na!aEy3GO79^pe44=?+sj~S`Yx?jU(Of7*k;IPP{k>gh}HOa{ervRhz zzXd8WYv78AWpc-ufi)C`XJUFs`+*B_U}mqmCW!;Cpgwp^GM3#RFpcl3 zl=f;i)^2E4T71W7462b&8eF>O@hpf6If>z^DMVG~y|YL5FXQ^8QreYX=!g%59>c^p zuj*v&Io5ltKmNebFq65-fPZNLngOa4?K1n>a5E?4!@RsrpY4V_uQ6KdqbZ?^1i8!@ z8ESBNo91P+OB?rg*wDmU*&(Nz>#LB{WUyJGq#LCXr@UIzBSy~`jMwQPCg8vX;qi2f z!zt32Ik?`$QVY5<&igHxu{jy0_bMOwrls9gys7{5C-wkFfi$C%P3Gmaanf8TW6M74 z8v9z*pOzchk~(6?Hdw{-C%ScmEVkfKcTulx@^H~f1(Dr$o=m4>t(G?-^L{ga7Asyr zSn5QO87mjUbXGy8ZR=w<5Z^c>C|+oo!{VkeiHC9+!H5*JU#rowylTc0rH1x1c`MFI zYo$5R5__~w!GBR%9l8u+pTu{7_yn(4J9jtoKTRxH@KuApTL%h+Qps3qSd280L zHJCpC-xH9Y1Pc9c5m9`YJ6hIfM=fDz#|NR&4#Yft5+d^uA^N=qLo+l&6be{Pq~V}_ zgI?a|(S9^3xYM&vW(k78y#C4dr2yJPLuW0>at*HjACxrG}Qa{JRII9RI~W|L!b)l z>34SQs|QAxT)$ZW^qZ-zojHDFM)XL7I}pMzs@sdSFVzp@Tq)i+22mGCgc$9Jk!!12 z6tVR8okpmfdUA_{)6S6Gbm3Q{Gl|G6?YnAH`tTw=Z&{jLdcQqQe|@^p7M2!JEaDNQ zHQQHPwp3G_F!<6U-GsJX=u}3&Uc$J+;f}qUm4O#nYHqYW?H<>!9bbJtQ(su6qqy6q zuH^F?6VXoxvV*qQ8WwFIy%f>bG8HAdLG=4W0{oqBKIb|8Si*y*QOqsFR1kPsDSZAU z0q!`<19YVreVPN!3D|?Nr*5B{;M|JC@MaI#B0~>fydHa%c|9nTrg3)!BJ_^;tEi~3 zMRx82BqIy`xt`lpZqZ1n z~`r$r3r!He_Pg5WXu48degw>wbK>izCMz zU;lNCjGX}b{7LH>(u61Azw1DWoPw-yyhj<>OWz2MT1xjJjr6l;xp+o;8V0cnj0$-! z{yZBPl{_0Sdix^mn+pE1Fjosaw-=7sftW8c>w%_yszz8xytZ3|nHOFg zVmzIY%QdBban5@{r(QZHS6JL)8lu$CX8&uBXPp!C1`{`a`HcEK*Gs1))wbTqWqEl# zjb=uZC1tKv{f~jV_{Mun%}qrt^z==sPL}PCGKVKl$b{t9USMvi6TUi;^3-NS>NnTY zg}MClRA`Z9{XduevRQ)D_Ve_jS9)lqx1xrgV;~w$RUMsVcqc3e-rUvBG`NK~tg5M* z0JoDu@Zl4XRkh$iO@hHR0X8B~8U7UpO}HbqBQBjeQ!DhuBTat;lpO~X-L{^4d7!ee z*RF;;RMahx%&2lHJ&#NK4B(#@92!Y5g7l%1EJEE6m)x#q7rEzGMLnRL`wk6Xa%}7= zmItFL=EB9Ip+8!X4uoqk+WzcSjH!6RBc%N6*Rj2OV^oaC?t$S`|6`N;d*b%%dMjV> z+=vU!pP$E0g1!s%YV?b1KXhx8R!3<4z*<{*Hm^sg9HV&fk~n8abd!>kS2zlbik9}7 zhlz{BxS9OSInOf~+l^I7NDC&|4GZofth~ILI{ja)b}^^8wshG!=Qr@hls&7uhrM=P zukuFM`MOOh_IEDW6f3q@Tu7BU{DAYNSde_*rE}J^JSMX%UUu>@r%v=)=bPv`2P)`e?3!&ly&)@s??Y(r`w% zf!|L7VrlVhpu&H1!D};g*EkcO1|8B%f-~Ln<@J?(>rVokQHNz)C*soK9ZoaW1*T3T z5p62WwGEzgNBS_0%@x@l1kWWd`006f5N~&gL!E4ELIfOz(e+_%%aqfErT#B%-?L&| zTxYiGIXptfK^l-75(dCrBr;kPdQKXvH44|pQ~L$D4645TSpB=W)B};Z?PJppst4%A zfcwJYb-sOhUedD!7&*m-DJ0_+Y9hjQ}UF{E<2BpU=N$c#tqnEhLWHMQC{9RRc z-}}tRv3zHkw9agR;I=!9RraR15m+4cSPtr0UcM|w_XgWCCYd#4SVJ8qn- zJ=_0hso$FJBXy+pi49S)E%|Tp=Nh{(8{Km@S%0O?-4d{9Y)cc7Lob%aJx*v0oDO&AhB}6o2h@PY(5^_#{p{F@%S(s zWn5Sf8fHwze`$S)9mgwZ)pPEP+jH`EPJz@?CS zYe`1HH|=^Rf0Qx8Noss}qw6=-pclT5vxYFj(Ui<_A~Px9oW6AZ`f^mqz89x;s!{Rp zUw3ZYY3*=@-Ia|UHcC&`*H5lmhZp+7}8o&uEV9O zBej-hj@}R6OE$H9-ufdGD!X9C!!pIm9PyKd0cx37wgtb6$DAk+zWnobZr01~p%Fg! zjC;f$8CPhz-BszrkS}E)mnpvf*6320^Tr`QByi^$^UvSi;HcnF{D=tyPM^Mlc(V7L zHihPzk^!eqMU1<8Tituj7Y^jfHL~c@EqvP9*2eT^1k6QRNMjh+XS^J>K8THx+lWGe zfXg5%S4g;PcBp7BUVJRKY)YI;^!G-$AQk5u$-fJ$I(Dxy+x~g`wglr#*|E-NL!944 z7gzOAIXW91vVN%(gK3iZY0t8!cMDUZ8>ek*wj@ZfG=v6;sx^zXI!xLjjFQwcnvn)L zxO8n-_T!~g^q^HiovM?2(pzu&^RjyuBy@Air%b$Ct^RI{@*wAmv;7^TqJnIT&(8L6 zAG&zf3Jx%evAx<)VsWpljT~<@b{mIX+)_7T?(>u)8Hdk53hmUsMIEtr-{gByzkVZ= z(2AHzXfxqLlKX|IL?he83xK5lb*i#ET^9weOq-Wu8XUNMw$a*0x1<)Bbp7da%Fej# z$e9hxtbUk<&S-XsFFX@dFequc)9b)jrJbz?JuS3}2hN0IV&&1vqcG~~WhasNSTS96 zPhQ-m={JLtia*qfMD+wU4`|}-pftpy?atCGD+9`yJn) zy>#i}Nwg%G=SP!)%}kbc+OXOrq?97?t{RWfgCFKm2XM!gx;{{3SRP*l=pV*@^{r*n zgp^xM^p@u@-1uDUO`8srJK%H9oUw5OzD-EJg9M)ux(|-6Lk8C0CjR%8D(=t%dU#PgtJTZi&;qIDy;X8IZqB#r1T z_tB{Mm;Szj3*+ii4>{Uy-aLitVzF2WruGm$9SayUt<=PuqZJ%L71)IGrx?3-#j3H< zAv5fTSJz*C5p1<3KOF{=hIRLjts}<%ab@Rqnuv^0R(^eK9S13=y3uX!tA!?8Vq@;s z9JGU|8i+E+-sf9xFRbEpx&CyK-4dR>UN*dbqn4JI`K&?67^-nqfk^Q$rn)?O^ypSY zC89T@!UD4wFVxDlhZKgm6U7+rx8ig~jo^l*trR`e2xaE1F`?(1w(Pk#CP{2FKzF?3^WGC;O z+EQQdoFuUKx2&(V?PFg*!1A}tbpMgF=rBy?t>0By&9Spe*UhoDGL&3tZ2b0o@7I(; z`aI3d%{*4w4Nl2{|BO;<}p=N-roNHXy9QZn}mmCI+W!48yMRyh#H+!Dt*v@ zUrJNSL{CS@1mj054NNTEJ`OCF{HJMTe`1Y=CMG8PN?!%In7>FQH~$7wzK5Gl{F`p! zx&6n?t9^JbujYPSw3Ok4FD^-w4*jh71ajJp1aW|0*L@Gx08s{zhMoeq*5_36xpS#A z=pf|dynX#Z$G9g&ER|;!EyXV8TiyzrHTnt{ly>+^=!q&BGYacT!$U+Ul%+2X>axA z{q{I(DIK~x#2`!ggj2Yx<4un;?b**xTzwH!nO9eN)9AsMgo-0EE|QkACbsLn*EBn; zUwgBsprTt=%!L-wXFs+6j=grrA6A$4>hN$>&UnjRK-CrPuEw9%bdXY?m378#w*`aP`(3D^hY~)u!)*FYoJnpIwA0zKNa9fAKeQ83sM(uR zAM4C=uDQ7V>&sA7+(XwW=#jOhVA7@Zs_c7A~}=Yu+G3WH^Cj&ez4hqO03}?UcEdZrdQCMH&N-q-$sx z1jH};X7DO_dHn7&a)Bhkc>yRfm-Oplj?SJvc$dA5FH7Zx5$j9?x;3TD71lXEkj(T zPeIIEn|LVL7}1oRV@Vd{)U?enQ@1oo?AmT;+$L+$tad%Sdg(~0ThMe+%#v|rmGx(z zrFogqGLIZJ>gU#U35kBgkBr;ZxM96SqEF8*a~@BbHq9D_kWNz}SFJ^o9sd3;x0iaG|NCtc z|93%J4}s#K|MO1BPn~`e5-z*f$gcnM#NxWwIXMZzX{LYt{$r}uuNT^! zB#wP(;k!l_dcu11W(>FZ3V#S?`TEmR|ALAD{`-lQKi|y1rhVj#QdyZ+v2kB|gCFmj z#=uT?eQ@lFm6V&6tT$i6K(@8qf}LBt_QLqSJ_KrRYG;Y#j1>%?+RTuU*i|b#OlH@1 z7^E@7z82aJfoscUPZ;2J{ULNe1oa2aY@>Cr%;UV$t^q1AD;Qmx9(X{1ee?I zm`n>^s&;mne$+}P3G)4Xr)P~(bhxcVU85U)DJp%pNS>=@NJI>643<#kc#9TiqB$qr zK-8s6A}#(LVPzx(f}B+b)9+Rj(*Gu$Xhf&MJLZ6YV@0xqXA>L<-I|CXz+lltVmAhRobHpSssjQ`c`(`D7TtVLi>k;_CQ;XGAt5 zHGp)_=?Qa%%;n4w?SK;}tchQO)OIEk@b$TjNM2%V(J-&J&#n@Ql<(=G_Keor0I*9Q zE%hD-Ha37Bvlz1XBLgl=2(yduF5DRXg8|2e0eB|{V1jo!s%E^#*g3i zlh$fFWDf)fuo8asY}2RF>~YX+k7Pl0vJmCWUQ6PL(dHD`eub>|2D-MRbzN+(Mmv&c z5Xv!l9;E2YP)M$%JsKR2Xd+a>>`q-)v0WR-SaioG&Lshc$!-a#U8f?(Ni|uD+%gY# zTl)6oicYf|JjFcur9o3PP&i(Wj?O2U;0iRTd)pDOaa*FNdYcUfwR>MK8nW{u^MeG5 zi&{P7>C=;iHU+jGzl~Izsvo#iCX_P5cf8NT^GweWDs%20lIr6)`f+>_g#`4t=q_;L z&9@h>RY~FEVBr^kz3<@>0ZiOdba!=uiBkv_JpYWLh0-N};63XAyEolN>~jg- zKor6~kk4~!JB{A17T!{QjD!h5==hm4S1EBcBs1`gM_MA(=z>SX&a|>-J&fP39)F^5 zKNlK5h>{AT9gge72a2?{aDQ=o{CewVS8`Ag|C;EH;+0?c%b9FTAISy291~MO=o<$v zMQ=_jLtD^E-)_CxeRqMxsfUVP*`Ubt=hacK@vHJ7Rb4kXLR|?qmLo%WdxvdmYmUAs1T+=yLACU+g7c+04EhwY)>oh4NF05eW5ShQ$U z&8Kvcf?-TcG->pmRj$P=NGWAEn#8|}rmhfsJ7)Uy_!XI32JgG9`lMY)+7al&{pLW> zM6;nLj`=Gyva?@IEilfFv}`LG0!h8)b(2YEh%9j{YgkSuYD6BEx_Dq~aXFrEy%N*Uc#Hrx{nsy-ZxDe5ItIqZbWXnU z+PD%`xZa8txfTf=&>OEddzK9F4#l3*(rBMcZo4@WxCa|LI^+>q zzs5h!`r$ELJ+@r%pNK2VMKTXd`>Jy7l)_2QHS0L}N$?=88%gUAv5|=|%u@+HSDffP z^fsQsfwq(1-X^Tj4qt&pfo!a<&&F)Weh*GoJ^Fe`7y`BgW3mEm6YpVkcfv$^mCpWC zwoKTc9%>D9Xd;qBCid!`%ETo^WWgw$?%Xt%xc71Uoj8JwXyXK3)(Pc|F6+uczlmhH zo2=p-=;oE24Tlf^b{0m@g$$e{@nG5P=8v=K%sO`8gJIl7gu0^5wH}dzAoE0u2*WGx z3x)(c-AnfVP&^*BKLjher0eTSXSb}Tx6E^*xZ#Yxqz5L>bpw6-VHhRHJ7J6y`E~q2 zAIVUJ5_Lb{*p5?GHKEAvIkUZP(u;%^I*+Yl%VIqKL^0M=lw`1uC7Qq zk0-<_XPm1DdW6^DDvld9>QcT`42~Ps$$ZWYeRT5blk1aGAFivdc=5*NUv1s+2bVuz zH=@z*&2{P06O3=SjzkgOi1d~rHYUVqb;76*UH+>DkWf`1W>hSCga1N&F|q9Zz9IUe zgf{52&x6lqEl<0iCSm|-P;ae#^KMYkfSLasN%b&_)_?VFJBOE~RK?|}tE`m)oE>oF z=GwIGlp~cL9CsDP`vs9>BQ|#uNg##9FT+jf?Qrjntc3Ct#jfaxmkK)j)7BY3P*oa} zg7CXYr!QS}y7^AYwSyYn)IqcBl zBCJcFfdiw!D&ka-P8G%pA^lLU%w-aLm@87B5n^=FP7>7sFrojqx&6K)kfSxvaca`q zo0O-PeEwX{^p!5-rxU0WzX~`Z=xE495lo4+hnCi%0RsodvCJaa5eE}A62ZldVj0rn zrxUK7HtHea7Pe}9UpB8|-|VJPBK`B?Xd6=TMbhJG&@Bd`518$K7lrv%RC%{<2j6?Y z72McSVfa%$GqZ^?1+Lj?)ye!`E#8s-VP|bp{%rqK;PL0AxS}*_(?_~q`MOKHFLqoo zGJ*L^rx#u%XstLrz33QN%uS6V6*dcH#4<-mN6(b$*cE1}h3%#J$g`s;|JQ22*S`Dy4WLkPB%_MNQ^JCRCrgYifIK zdWT)wm#0#3^zEq10_B)YI;)o`qXb?437(^tXx<%g3G>}1Kqhg- z01@KmQMoLdbQf-av*p*jJv~H%nP=x?;a*o^w)L2{$P(s1dv*@bWKCWJfADNmOwuJf z{-s;Tfu*hS1_(WMI7j@Z=OWAFAo2z~wfb*!2Z zGt1z{g@tWsXwdgattj8-Ja6=_+Fl}DfQyN|eS4KCcO)@~_3txikZ`W$XIq-WK?^X9 zVKgt%2v5^?X6@S^jhyoILPW%3PAHjLV22LP2z?f9lp8yHHc65v&qaop0oBZuBl*3E zZzB>A)B~&2F88;a8tSr6yDy>mQb(t3zzl+HLcw?O5 zRP)qbsRL_7Ebzsi4=UMy$B_d*j@QMPhQ2){;qdE78g_bh^ozb96G9@Ljl+1KTemZx zU#Ve;&~o9TH8c*0yDVg21YC5coaFdQqNg=n$m^1=GmZxbM|B$Frh{h#ARW&v(WMJ4 zT77b}+g`jmD@@H0%EyG`Qi@|}r;qD9Q@fy}_Zo+U!?+r; z!B(+jxu%p35Of&7n{@YQ<>2XEFBGQLNxXAg)T84$6MBuds#EqJz8d8==_#-pQ0I%%Q9|CNwHj6>KkteE*n4;|72#Uu`ref8~UY6|d=P3SqNjYM@HX|83|)kIBph*oCHefsri_~S0T zDjj)Vh`0pxx*4G#KFNU7!^X$akSXC|b{%0WiIAiHnU z$Fz_E03yK(W@!5{i%3C)vJ9jR;E1f$)jdz4)g}}-zg`z4_m#X7B+RA2c)L4DF_1i* zI!pPHBNyP{FGoh^aOCTRtbG0~6?Ho0WC z;%KAtK$GIiUC;lo`v4{SGQ(dt9?55J2S+3LAzaC|iPf(Qjp zSr=J!yNRljQc|0G$%`99AcM>^ALYZk>#GPOuOJTuxt*SxYzgKT!3_Rjb+kVFF=pB{ z{qFnbv9Pf7m#VS?XEz{Q1Jp166VSsM|Eob z+pewiui=?Tyi|G6~6t8MFF{*V8*)A7j-AEZQ^!e3ma@$qjaoP8RO8odlC zoJ&+Yp!`EC9jttBaCuvaIY!&;?Xi|WfUV-taAALuUp9NSc^b!HMBc+zhS^~^q3MXc zy%M`_(FQ_W5HjTz6#;agBSfGEq;_^dKtP}J^M60sGwr*?=>nmI5dMlx#0r}H4|Z=@ z)3$Y4Z%aT(&#-O$0hKgQ zkm3kaS4AJOWmwD)8f(S(&qxv9Kk?hE*hMYBQ(B^!d{sfrQ1GC~>?@Q32nGv+WMkbd zAdFx%M11pii)TEo-mW518V1oa7T+iIHKg)BIVewM8jR4S@m_v%4-|#>B)cr2626X$ z9|LklZ9_=8(!?Yh*No#EtEOhk&4#cO*ab9?z)z4TQ2|k%7&zN5Y&MX!J;Gyrz?+$ElJl3^UTC+z+D7}BU7=fi0ybW7xYIrDUTB~ zC=hy_LL>2O)+KW$48gTSuo7?Yh7utvrlxNEo_zVBW{)sAo0lq+vOo^SS z!Dx?ND7)|w(Ku^vu@+Cr|K!1|O`#*1u%=k0VW#6+pSh3=XS|hzv{GMRd?H|Su^;g+ z%O4OD63u>ty1_a$y;QPCh6vV)uyI_G(UgQ&b)t4$;KCDN}^epBxV(SVW+Lpm|?y78inOn&aa@ zCvjojVbr$G_=lKU@P8|@@i-S}l{2X$c7Q5R02vjT@v+Al~15SXBN1$+9c@HpXJF zwyqiBrTz@Of$z7*bGk5k7&s8tQs2^i7JDai>QZRvTxwoVRLih$s}Hh&9=D7ephDXg=tLsO=|g8Qo#5 z5lAG$SP0-QLK9T$x;!*~6);Yud0C_s07gmjUYbjn=I2GOn2O|DLu5IMc6{t6R#61x zfIjI3bUV0x{2o8o?%pSY@Z;R^;3t<76O~~BE}uI$2ZRcD`FwUu<1&(|fYZy#$)?zE z!PmmR&Py5)^5W&o2&`~x;u^XT?hPWA06qpgMq{1KiaNOB#pKFiVOMHu9^~L44qO-i zCIA&6booA)mEv@__xuLXa#PCNJEzJ#_LU4=28AVT$_CUhuM-`kFsLwn3K|EG9u<Ov|ZpnXUA-5@~w}{AEz?5B}(HEyp7%-G>D>3g- ze{n#yErp3IapJ;+a9Uvm&T&D?5-YAs)mb|Pksm=UN7ddrkb|`XrL*d;ET@$b5)JuR}63sd|H{P+kRD z@gU;3oNfLwx^QQGp`h4_H5{NH$MI@?JaK@Ml)igfV>gWd^j;--R|2` zm!~ptT!aG66)DY2gmjISfbaC`n+q#O8~-l@iyOQ}8jgS@5}zZIdbD_XQ89R_zxM1~ z$ht0zF{CgOE+{%U+{LCtl-y>zJz-pTX32AIYaY*zGFPA-PGJrg9b-9LTnbv74jb=S ze{qGEsa#*QvN58-^rM&)0I6pZ3Z;}uz!iuZn<;4PAc9!M08fcu^y&iGX4Vx;8{ z&ScJoQA)$ZiN_)E`=%>VBZNu^s)V>& z1YYabT@;QF4pwMHTlmbYB8^~a8A%#Su)Fk)Xk`Mn-}$pUp=aIiKgwI*?c&3Q9U-I_ z;ED05&%jdLSwYf5+aeT2U{8WO5-W?Z%A?uvO{h7#wk@XCoKbhT-#xf(g|QZ1O3W;1 zt*rQXWELQ+-S1m)gk;5Tym2i!90XbT`i7;Cus`VbH#XLkFis;Eu1H{ECcw%=!3#!* z7ZJuwP~&D)*bt+VBuy1pN2plXXTi;KSuXIZ)N<%i8yzOpu`s_d^rG(>`<;u~2S3Ll z2;BmmLjWnV9x2jJ8RF6;nN%faJaA4U7X=9;ObY|eBF&m>PKr%Vu8Xz}nHo)wKeI&e z<~)#`xU%9E1+pf^YkcjV7x^=!f_U)LE_!J96t*|&LG<8$l$(^mra7_**#Y)^xU#l3-PJ`lVz-2a2p6{c6Yth@>FieOmAY zMQE*^SccKu6jqL#z5!tKD}9;!c`=!3!K%)z)4TijYfN)K-nEil=(DI2mq`B0hSD$) zV#V~7#>1@It4bBzk%+Z{jJRX@2@|3pJ}hs{Ry-6tIDw`jv>!QLUS2Nd9c%=Kcs>a?Q0WtOkgEN+h5m`3%Tw7x3n^K0%`0~yF@8?!IF6cHK{P<;4N!HtiOr+X zz@gBwpbWc+dG6tsR#m@=aigt}3X)iU)To6bmjx5=$hYAZ)VwyysECXQ(~CwQO&f7C zGv6ZBnHUlpn*p)}ihHje|GaUN%1tZmQyxD^%?7!&P?ng~2x~fWYr)&SpEE-p7J(bt zOY!?e4J1qHbT9cF>mZT3u`gmvoqlbT_7ztdz>EQg+8+I|v$0nquuH>_n;|DC7$D^H zvO9Y@8k~YAcaL{DcV84;b4<2Qj!OHsJ+rEQoQg`*m9+hsaacBt0;KOsP!}QeIAvw! zt?x~Abm$v91I+fb+^354mFObp^3Jo9%Qu%Z2qTC}3j|yc3)kTunLATNSbeFz2a?GKU$)&T#0T0_K|oOATjkv#C(x_)JHgo^z@w}k$` z{xr{-k@F@#hYnsM)4(Y(zP8pqWJzt|9JR9(dtNn+ei3^=A45$RLqJT-l^;FHcEvu@ zPSkN&mlWJ?J=HuKo-Ves-spz%t-Iy<6czR5m+dOL>SX%;{oS;O>oT`gmwdAu*0Fox z_mc0iE(7s!!B4hl|8e=e_GHrgURg)3#OGUY=`}@Iwl7I8rLhym(?VOsKwGr_?f*-_ zH*_7p^l9l@9c%Gz4PAzMwN)pkx=bmM;Q8mxn-}4e`w?7)n-CFk`T5q5(|Yu+(;P{W z$%Z5pT!KiBVXV@v|CFzLfM3Mi0uZ}9E>{;ZhWIFq4MX|TOxB1GaG7v*drw_>3 zu)G(u2YB8+!rJ=z)dX}g=goJ;49{-prOVU&0{?}IHnkqjwP&FN`j!u`+fTwkfD$2V zBF$O<9@F?9bwlt&a)x!2E{ zuTyuK7!>)UB}588~kJx5g&(P17)Tz^@UDcy?*5u zfi_TBBKIw92(Y^lnTx1Xq6mB{s(77#F^lqEys*Yi{CY5?`5d%G5>Y-(?QhNY%UNsz zWrcVGj(Z&T65}Nls^}rc#1srHA0EVc){aU3b(wNK`BroB&_pOaQw?_gH=5P4Q0 z7~332`>a7sm_-iTVO zLfXe1$RR4({%DF}!rXbm010zTyBY29$$1N=1fb+0GqOlj{)qq$7HvGAMQa-9WDRmD zdhAAo&&D8BVT;&|A%HYTMix|vWe+h{swD; z6CkzbD2(vfv5^JcpM68mfC^n~uVB8HdHh--DjP-ekvJ_5TqIb!(WAo+lBaHkQ5W^6 zIMoZYs_w2p_^;>U;u3SEl!uov9PV}BnRyL!A!G#GC)6t(N1To}c!{&5vy+fopgaxl zGcMF#ZLooGTXYqmUR;uw@U-x8U8xOdGiC3$B$3 zi-d-n;6dmcxB}%w`YRC<#7K?ef`eP@2r5K)oXEgZvEJjTLq(53!Vn~r%dV1Zy@;Xv z8Kju4*!92Zcu+0!5Q8#iU?V{}gNGGzVvJ>{p6c)K5+ZXQ&r{7odshusM?f>A0)5NR zcUX$yIJ5KTY9RzDFt$GoaXJ{wKBni*m*2Jv${xa$!6pSPt-waGcRzyCa`8hV{jd7_ zYpf8RiAqN9jKHHbJB*2=(S?Xval?q$lPY@&7VeM7&&tX2mn$}eb&#|LTf%c3rz3oHb=`&-Sf<4(?y9-g%_A zdT45PcJ~nNG>}AsM~fOwNpIi2E#tJIYW(QY`{+4CVAY-J4v!!s)Jdf`uPpH^7%^_b zgu~dEtxOFSjnku}w*-FaK_#ykQ1J-3EIQybt#PDgm>&#{5(Qj8e*9pBZYh}=MiadI z{8``1PliX|T$mU@GtO>n*RG{~(IVOy9Lp?eJg}I$EM7-E5Q&!sVYS zK64GR8Yg|7@4m9mAp_xoY#{V;|3_AVQRC*p+s{Urf>WHVS$*W zX{@lGav|!wKP0r*8%)nqCMm&C44X3LIGhVtbGepp%B*PpCG=_%V~SW9H#+q&^Kj6T zB};sFN&nq4ulhq`&kkyhdO*9MbLWOKo_q%VsOkHqkbi(NuaZFX$1t#s)auf4cM!E+ z6ID%z`@VbkE>(<`h>e|0WyN}MrV6@G$qNdr*dSz2;?3R`7BVze{ri2nL&gf>EV7tP5vcWu`@1^H z#c|Sn6GcpQAR{0}o1bkZ8KPDFqD5&+%U_ND?=A)R%KYvny+}U5V#}7poMjBv>DeA< z&_;cD|9*LS(3EijniOHrW#}YFdBm78`}wEl(r!CUE$-jD*CxR@8-i)(&RX?!)qxD;#FuNU*YW-y3j+O%m5 zn_FvbZTL3)yS`1)-E`(4OLp!Y%0rJgyeY{;w_ItPQPCqTXG2ZzW6&f2-n$nnIl{wf z*%_5J#EDEC>_f)~qH_P@%_e$tJOAep{$AwPXTtHt-rnA#&u_}UEZWG4>Au!+iMQvu zj)3nPIevUs>J-uWF2(JdMYWwj+;^ydx-2Douw5m*T^1v7sYB{JH?ITjkq>gWq!~Ge zq3qnH%de+u%XA};6BA7$Jo{(Rpw-NYM6awKsn>T+UWXCm#`zHZi@^e7bJ6rv*VMRJ zwp}>fSLdqn%tS^NLORXl0CAP&#*K^GKitE~IxYw>UyaEa&T~w%Xiqv}9-YDD&iy@u z?cb}8ln?ci))?+` zKTE>?9qSvt=5!0n%!X77Xkzun4xZZ$8Un| z>Pvxv{qd6@`R)9oXEa-o_UK0EOjtNB<{rE|!jLo?>dbGe`5*gOWPe^-b4(6RR97<` zOhG|`s>OZ4xN71Y>B0!(@Z9g!@8=Q8EV8ziC#Mq1hOJt)>TdoH3Rl;EdhCmwMwHfb z>gHNmS+!YYQk`c#72@L^XK;qH@^cDe(FHfgtUaT)^I%+DUCJ5T4I3V#$Dj>F2Qg}l zp-7aF1$-$`JE|Wwa`^DwoV=cc1`(fb5mjA9)-yL^kY%Ua{KKZ9Jd35=?WWMP1A-%az6R-c*CXN=HxRje`V{_!fg%QM(Jn{&=7}G%p1_k{p6%5|q zG@QUC(h8b#0H~zHl?Dv#jg76HHPzy0P0a^%$4u1qB@o=aWlQ9$>lO#T^?)CxgNh6g zM2@yY2(5ee?78c}fpq({u>qRmVnO47DTpafxr#k6(HSE{PcXakys?bjjijgHfvO&L zw4B5dq+vyXQjHY5?)w79;drf372HyM5fkTHrfivCKoWF`a;&DksBskZOVn-4kD^5I?lWR(9ZwDpCAa`?H+hw#( z#X-7<%U$Gz{`~n$uY@&VGQyfByL=f+aoR{H-=3-ni?i?Y{c@|zLomwfos)Ty423z{v!jI zPAfYegdP6K#I59H_XCUPmyGOka{TK1FqRuR`-JQh9cTUepDo-mpNlw^AHN@>kq673e%6`D0KntyrTuSXo`vuCk(2rSYe2GuJ*k6e>*Az=0{%Gh_U{+A2<)hUfGqVMFTa9wL|saL|Dz zTa6PP#55XYRrAO>2`6i}eY?W3>vcbVT)TDa(c{Pa!JizkeKdQaPvgk*&&SYQ3v&=_ znc4TUUgUk&QB-Ky?HliZ930$=|5o0j*m0w&bS(xE+E7{96<0k zQ?}Z1F0(>r^#k>{jnVO4EH`83%uxNP&Qekz!6;z1cO@k&zve6QY8;^CrkW+_tAzn) zEW^uJuabVuj0yH?E1vW9>mZ1b?6b3%(a;#TGj39Vd5nMt#EZB<^rbPHfdn}W4 zF+S>{=XAp~Rd!VG;@t)_)EGy6{l*RX7h#cP4cgQEojC4CU0wefTZht@apdrs|HWYH z>BGdk4G+-#&RkdQ0j_{^y&LdqV`KC1))WCEpFPtdiGhvi3^}BpW7lroh@Xay z7_o<6$xpEQqi)^0wRc)+)P^`iKt+E{-ump*qJ8Y40aLqRuv*+qisU+v^j&=I`t^G+ zUYtM)E8V~U0X=z<(|%l1W3lvpq@FyC^CLJv*1(EBR5vN(P4&MZeV{$Qo4EqQ5t8Um zefF&9kRfL+HtAi>x2DgTDB~>wR4}7mk!8Uj_^9;#FNoHhCa&Hf&??^dz~RFsRD|=4 z@{p?IHDtMO__3YAf#Mv1LLhQw7A244EW#h22{X(?|73ZdPz z5-I~RLn$i&+Me|A_3J;fzSvAX^V3RlfEKMGhq19 zc{^Mo-QUu$Gv#{KQKaimn>?;6IOHO= zQWL+mt6OFpB3_g`!%`FrCsmX&49W|<>hldAQ>s?V% zn?j5KEuFAb6+B3@WpQk0%$ju}Jlr6nwmBD1BAT$bPFJ$A5tyCc-1{wegk|wBV&)MK zeE;8n+nbr0v88{pPL~DguMIVO7R}+`s_X01Qd7lLryGQ|$2Bc|pPW5*ER_nJ8C%~; z@ctwJqSL;wns_^){%-gtF;JF>XC`@e-zPoJ>B%!q$%0HFZ6%bb$Hi579XOy7nq2`t z$MMsTYXnIaF+b_wv@|9icX2H8U{V7E9=TeV6S7d{Sy$;<+8gp4UKr2pNmPv=!Jkpc%wv>}2) zZfM`~(=>(8VulEp8>Qre7}KP!j*b)ZW_I|`TaEc6b}FCi!l?_xst~-`(}+}TK4RC< zC)}W=@H~&vKOr!gL^}ULcJ|e0pIrm)uFE2Evo9`g>b-mS=rgwG^y$;;!IQDHgpfCA z>O_>@Ko*-MRP#WCIUA=80GVCCc5O%049Ek~nqF9GHVVAukB#kHenacG(H#a>gUwk z3=2%Fp!+0^=h2>-vc(S|b0YA*4aSDiCqzU8DSPbnX)U6FvVxc)Fl4rFgMhf?I8Oxy zC9fQhAAp1q(I#&AHjoWUsFY*2_my|n^ZNK zr^m&UwvY?KzV%rpJu0R&4+Py=Qt})s4O^3YD`dHg7y+%bYJ<3K`+eLwy%hoYawrNli~b0JR+pf^GX|!bHFcs=OoraXhq+Fukan+Wx&GbYHJN zeI9a&1+IskDnT7ER6(J;t!>qZ?#o)O>HDNnK%YQPZ8gJb0B^Sw6Spyy6MAOVP>l#Y zzB?n&sdp9o3C8|6C+GTnxgpIO@&US`>K#NQ^FxOZuLd}vw_r4CzsC(?FejlnXZ1M= zK}?y+mCR@22ZZTu+pgUtMa6ee%B9o~cDOZuqOx)jMR?-Cb7y239rWwhuaV_WbCxX= zQz^wLlEJgxvxu}_rO@*C=4 zyIT?OpE`A_8fg*~Lc;&Puf9^{;0~d?s7My=r!Q*w@A&z(KW!i0b8f2M4lEOE1lPef zsx?)&0&xq!i7j$Cu=I5dt3J#f2h0X4u4#)deP`)9tsOgNpwaw@K}Y0z1UC4@{;>Tm z7j?$S&e}enV&GxZrk!~A&YXX*&;AHJJIO>zZlM=5ctND{%U5n~0S1W)*Wh19Phs? z>cmwaqA#uht!OW%RNU-oI$iCI56f)3D?I{@1U@E;KXHmQTbw8DiM?} z%r&LfOGs;U8C$-4IdlRVKe1bsW|%|Y*~ZB&$GQv{kOA(cx`Nzg8(|cC4p-R0UA1JL zWd{rpSP_6*yYRp&T6#0K6WjHfsA|TH8KTRtOqacj=X4%v2qPodXKXuh@HPkrdXY3g zuNQN?@Z_MA)al#)L-U*&Ep966m4}3n*JESXa>D6FzLloZ^nnQhNK+rzP+9* zLO4pjggf5-SW26d)46L`FwR~a@pYuw$2Chf&BjJE|Jp=Zm|(t6;gX?u1$V%Qc?^olEz^n0 z2Y`GIkstLJOn4QHs2t^`w8YHpEKuV+#08#P%!gUJV@Ja{e?{lwgF{qZj>Fn~Hjr7# z>+4mvpGFHehTA?RN?)DguF9G4_%mIzjtp_oGjr zJQ>Mo<1pQHxEn@CE{N9WqCW#yuV3%)>+7i*ma*)$^^^gmbQxX2#NO~3%T}}=kI+0n z#!=Z>*mW8vxpx7^nGl4U-s>ByHNo4I ztzcpgPZs7mXQydk^>ddM9X$;GC9(u$4npKYJVa#KyIs3I{RYSAMvB;*q{7QLZziMp zWrTy_y8v@M8ovOJXfbe0YGnFaTic_dp~JxS9|_hX^yHZ+1~)lT#WY$!mYOaRj8hQ@ zAhN(HjkFn^S}@W-U2*#KwCwC71U0a3M_4B);)%wFct?R!R>#{6Dk>@xy}a0~c-i6o z4r;E}R8Pv_)diWuY&K!eK$KK_E}^~2hL_idiSQj&*{4sRKqUg+5TGm!)e+elUTy2P zZ6EONB>Ncpa_58E$iH4mH|)pG=!ufHKq1dbYai)E>W&14YJuzc>E;4E{QU=%T5?mS z$PjahKs)Qnlgxj+tp-t)72cUn91jCYP@8>HVW|p7hNyngg&akE21LBx7>!eR-Nyr$ z_ijHNraP9qT7r{Vh{b^K#^_x=`EwsbQ`Yd@40Jvzzy)!KZfyJSmi(TL%&y|nEezBB zPB##yRjfo#dv;bOi475c;IsLrvRARA0bUa?MRW)?M<3Rc`~dYGfs9V!Sg)nDm0X+- zhzBk8DN<~-2uJMhg(v;^^=lR%&mKSAHI)OI?dLd3|g2MW5Ma5Df|~6jd1LWX;KjEm0H0F zji~%>RYj^a>DMC81zMoC?YL=Eg~g$!!a%SYT>=r@w;D%|UOxrnh5|e6_a~qkjotk) z^dG9KjzV2dnr~c9Ew{+@z(hg_c(ZKVFq2Kq=5RnTU!=@MWD5P%RaWs`Sf91KbzTEC z_S0$n-Ip)>`3!g4F@IUjN9aj(BJ~89O{lXKq^T$0hw})_wTEBncl`Lj#K5mOQGzzN zJL}ha?bIVj`03ntoj1x~q>q%HDz%t$&24E^b%j%C{hLV(cA;z_EdZqGsWdT@yc+mj`)NLh)Oor^I8H zw5X6>Mrw7PoCR)-q`(l~K_Ou0In(*0{MXppKBcY3F|%G65`E5;mv;C^!0P6ryMg3t zNB}K_1c4EFIOx_;8Kzt8(T{r4Vliy;WPid9vdiAE6v`ppXU&?$M&E;Srmw~bP$LN^ zA1Y~B_)|)jU4*}7#s5K(cIxTkzZU;TFV#@5`h%FP?CjQIMeGEGF^xL_cGn1z#eGHO z9H`=~!~D1nZ>>kNntx+G*88X@%F;{O$ghtBP(zCNaGj=HqQ?oa@ zcE$41p%4V{f+QjADGyR$m=SR&)dO0m6g_FfqDZ>}F8Mxx{}rK+bd7=1z*Rbx`;r*! zg~p5RBYK%FK@v;=D^iSo>@TV>cQ*6W>9V)2y}dm|a(Y(QzmFeF!WvO!zTd}ZiMyZj ztXTsCH21=y@&VzT%*Voe6O#c7;AL2bZS|$ zQ`KORt{}*Il$N%SWZAPDmP-J~KC!X(cKcRu;6>RcvHO@;K{`OyA5{;1huyuzY2k5M z=-oPFj7?0&nk7TF^$pbe8MDrab%-#C8O*tl)C+2{=bc5)t9V|_Ij1gtS{cn9X8Ys% z-gjkD4iPft-r8cs-I~v>2bK>XI`mv#mDkV2jFS_^JWw>_eYn)`#pGua+qf3s+kaF0C&gup#bslSjYybH_x_A9=jG2-(x9 z$&-7>86MV?Ul5*~WH8HB;PBzY?tS|f1-|N4ZCP_dZrX-ty9kt+ zj_Pyxa5w0@s(huJgbIGXzHR2{>PiFN#sp;4mk(&wid0a){0aLga2Pl0{l|}cj1@|u z3h>+~h51BqLfS`o3ZiISPy5lMN0ZlM5bvX+qQT%wQas-o?8dUf2XJ5Kq7UVyv}rDi zn+fC2SvFt0b`Ouj<)ZrBFC^rNkOH7?0Tc;M3`Ev*rh+m+rFQyTf$;$DK*HrPgo5(U zGSI;~>8W?FiiA55;~vdC{_N$rk!2Es3BKjC?P{|ZWLX6e2R_%Pyq}Ghh5d&y+ zbuRwg$FanB;f43KFM)dR*l=gfPM{v&@E#btV89YPLAi?649{I2rr8HDEEqS!pb3@F z#Ni2@|Gc0e?f(7UL>d3ZEM#c0fkK>w#q$pdIZPf0pZAVi3uN_U`7vui25Kf{$!H1s z7-9y=&^dGo#NT)+38A4N3FYPO4fV0N>2ObhkE5c-aid30n9vRV3)JIF?s>QtE;JZ<1}1 z3IgwqU^PIU73#{Yps7-v1`_$Jt)e{P6UkgP!JrB(L^_jBBKC-9GFakQ%8_fkXmj}(+&bZwW)_q$Jj)m^HOamOiL$a2s8;i1L}+kl;SzspW!$(I-!zTPxpP{yVj8!Ibs23~ReJ4o*tDkG<= zs*2;QdD9nI(2oDZr3{3GW%A!8BL0^zUz(en@49|{(u)@_h{Y^6ZVW88*EKU660PsU zeh{P2IJWb!T}$*)xiO-v16c?_n9+; z$>Cw@{R0CJ`1oYH=Gv(D^zvIKyh=8%Uw~o;7=0!NT}Nx5FJ)!ECr&&fRun9lV|iYv zTVu_`LDr!OuJsButACFQLoeDe0A|J9!a^NaN4TMNMkVm9M{|FY`|5`|$G&Xi#Q+`R zB~F+0KmQ!!cw%n<1q85oMBtBTG;l30F3hGd(elQ`6Nb@N)Kwrf&EYNzgA6@^{)Fll zq!gY|mV*6;>v%Zms*cx`0p04Wiq|u$V&b=xA^;>3!`<4d9@PvRuBtjHO!t6pD+uT=^p*4c!Dt2RruwMUH|+nJtAU%!1bb9LShX`vY=9im;YeI32X`S9?4 zzP>p|JKLN?b@cn;UGDY*CUZkmGs~mx@3!jUxg}|J=+YHf`zz7W{V6UJxw(TtAEGVF z!ln#(lHyk;viw0o?1kyCGZ5n5dh#R5#S&7VkBM0Z!E$!VV3C~H(xOzb$KoYRei!_< zT>bWyUQe$Zi^S$+0DQ$fXECmtaxqX}smC)a)JF@B3AwZoh%oWBkNwTP^CIM*(Y0O$Vj+1yzj(pP9LpN zYX!TFFa*yB*Ruzn9Q&s5dA}5aU|+%5|jj>wk7Z}k_Fq9Tl^QXaHE&hocKh@k7-9Yx1++Ycxv|DkEAJK?L58( z&pf=aR=e{UiFWPUVWI#N0h)FC2b_Tv0Iy>C1GFm|Ay8>#Z?w!*t8WwM?s(HsBDAo;0b~`t_y# z^w(*I>C#O_QBiS6<<4^Wl*Mv>P0k|gPLGS1T623MmTTP;kyLc}(vt;g-?1Z8Qv91* zX8!*5OAvh+|1{#mRkt?x7pq`jEDt6blhRKYLn6W%rNFL{dYWu}BRED7uCtkZ3A`oK zax-hnX1d^fjxToqNLMH1hanKJpFO^0Mm0B*%q2t6jrYY0%ar+@zJF0S^0r%}63G_M zdkA#%yVBBqo}O*0>z8hYcO_l1mI(=)U*GHuF(~-ZEMKVw3r6`b2Nl5*|9M`I5mH6L zQ?xPRGCI_^Z~xh=evjb3=46QAgwZbbU1hn>RQI!^Z7KzzsRVAq^ioXI3k5-pn|6^+ zaEt5YhD(BVMBuUzz|jcv1un=Kcyw5RX0ft2-bYw%uu>ytnIC^|bhuW*4y`!}sLEq! z&X}6pOR28`V_3nXkQr?UVCC4&W4sJnK4-%140(nYA7*Z(5q8lQ!)( z#wRMGE~+jPI2x!na@a6W#s)pZ(KHQ~sji={gI%-YFn1lSataTSdu8=xdD0bDn0D5U zlPqF+W;cw^$AyV=@DisOE;IV%Vkoy^M^5Agq4&pQ;pql>k;D^15sglP%ck zv%5S~o~H1I1c){B=-8#=Q zOds@~yTcO*l>FzX5%jdcSt5mkUwyh$=h$L7{0p4UKx#Zh=uEt+;?__da^lQ!82}Y* z10wl(9FqPFTf-YY9Rv@E-dLomgwmC`SsXLy5Y4*yjRa~!@&`FjTI?Zt)B5{o%*YFn z#H^tY%`y0UlIjiEHqE+(3J2v6A3ruCFh&7}Jk*mXU%PQ*V@!_>NHOqGE^W-vT1|4O$H_%SHOKE3Ke!uwd$;?iLYd_35fhKZJ4^1ac2AF5 znBi*XcGCJ^kIP75fCg{xI31;NxyR0q=|+#5QqC@`{m@wIdS!>Lbo)>_kvi4Nd{eod zP#a$+9v-mSY#+HNDM_{1t+pE0e^{5xV-@3$uG0^(~8nHldsHI3l)du{FS zrxQ|ZZ$+4*3dGcoUwy-iNSZ13nwG<1RYgV*OCi$VM0e1qh;%H-qRm3{xgP=nKA;rp zAtvt0b`5?tv`AO(yx2RSM-6G-l$y7yDk@)c!+Qur0TVGEas?%(%<{Yrqj8N0y0Ik! zI#FvclA$j5Rd5Tn_5KEqun z+sI0b&>o8D*r`*JO@)i-adMC-{v+}e^nJHo>g368K7F!+>POu9LT%tkdrVD?- z@Qx=f4go3@_NW>~*0!{?-mse^g;OLklqm$5Kx}WxFT_tWg4VzER>p*GFcqtAtP?su z@(Ml-r3CGmRV0X`{GSQ}@eT~$C5({TELC@ZJEOYAMdlZX911hdK|skb>@oOSM1PzS zD@>$F91ol4Ewdvf=sw#cRD_&JA;1&tBJSj8+}Wz~a*=iy5_2IR#=fq@-awf6)VQp)F>!Co3tP2Um(1l3UbLYK)H+SP69(F9cgh9fV5# z%v-2TL;!_q@z1zyG`i$+i>te`on6ezZu`r4O~06LEwb%kZ8F__xt(W%XMGZbwA{Rm{6i%Ep!Vs31lE)?jE+1 z%ptlm;8KG9z`NfBKiFX2!!uxs@C^xX?HLFygFS8YV(AOk5t9yo5p#`2~3{N;&&a;C<2t0U?Nh96DcE2`?i~%%!m%>IA z+<`*%D)={#OecAE^qh;bJ*f0~L|Zs}JO^EhkG$xEfeh$a*V(OQ%a+0v2SNkl76Dt zE!+UXjRzo{?wLxRFz$qZY#69>yG@1KVJ(mRpg|S=f6+O+sD<^`Q`v;Yx3usyMoG7C z?*-K>C@FD?kFQ&JxcL41R2mnlx`cEAawe1O?`unzo105BN~hASdGicVRbcUa``#yY zwE&@sNK0uma0~1R%)&YNa!330InkEz@n;YPB>uq)X<(n5h!g@LK3#|C21Y?~g}`L? zW??|WaBd$shLGKOvxU-WQIXoznm)_Pc@#8X4M<}F$ACv_j_>3#wIy{^wgt8J_oknL z3&!Ok1P8)3r07o5GiQ`9)M4N)2tsftTJzJnhlJicPoH+(r{R`=JNxnDPBUiA-~^aW z+|T$9%7HF3TjnqDAsV{qtR(|r_%8V@^K z;*p*GH<>_R<+E1+``O>5d?+tByKK~U>jUR6ws+yY_*)K%Xu!5tct!8&aIXstOzHDS zE^h(k^OX(mi~#uKd8=Q5V|VD>ISJTj!S#)UV3{By^3|+7zz>lLKFLuCvhZc3c4FdS zGwA||A;C*|`0yh#`al~7_p5G`*R5=~sBN>RnWfMnU8MzKRD=2P5U$hqi<`VsEzo}W zfHKOiTER_tdOyf|v)+_A)l{w(o)+(96<{0iokP%@>j*~%PC0jgp6Hhd z26q(_n;&2_IAXkUJEQ|_l>EK-1n5*PKRZ>##>IVcQtZ_$jR6~j?m_+fH6qE|R^&aP z2@5a@8$kBNtpUh-4pdR0c(#30&Hk(~Xu!0%BS()0jyr1*D7*z$WJ{UKj8tJ&Csnog zw#daeFB{gcpQ`NP=Hao2mYPDIaOwe3l25y}`s)y&Pck$~+!@M0kp0%6>tD=V7)r@$ zgDOY8rsAnX&%D9TuBBkD;1}mIR?)`)J;3eF{5dybVv6hQ8ZP9=I;n;3Q$+wmT-{Kp zMQ=2NF}!^0kz>YeFYdL1hJzFhAWzM64!La+Rt=%7TR7GXYO%$W1w{{%b!B^4{s+o9fnc4B@Ar2gsKH-CZ}MO-1M zEA2XyA;{4@#+D!(`l_A`yh;CUN~@W0K4zsoBN(^(e0q)42M_$o@3iZYH-iR^?J4OS z@YqA1AnXk~UtvKoE|Z~%5R#cJQ#np2HLu^aY2etgo(zAOzvute+MlFI)&r-O_)TzM zPQ61!$BUvd2k9b@15|7um;W4mFJLLKKyYaOur^r-c1ra1>z+BPrX+DPt&b4$?g$YW zoDmE(DJf|WHYuI-^wOL3%76CkBotNjCBk3igCynU)t$a%-R55%e{(6?7DabJiAG!x zLdir^#Nk2lN zx}#V%TAldd$Am=2Hlj9Sitwtu{D`Zoo^!OXfvP9D&xJP75AX(slkDH!^+y67*BG0; zQ+&!VH5Cb?>36v(Oq7>7UvAa8&3^QGa6*~;bne;nAPqWE3=u$2XHEC|yI;;FEJuNc z_9fb}W*iB~MqxU%0CCKrI0V>{4Zi%e&&5BBW9fdl1x)AkIQ(JPuAPU;1dtvT-9*jO z+WO}r4gBT)rOri)@Hd~1XEikR`e()}@&uSbJz6yeyu#et`aUU3q8HyGna2wU60Cj} z4|BtoEzmP4=5BGj@*UQZ=7A}tIHZB2^rJe1a@(6{t2B7<7YN;N)p8A0x-g^|oM5WT zgp~?PfXIoq*3S0nT^fLE`+wdx(l~jP5JSwAE6LZmdGltJ)$O0E#6dz_zXa_nfJ1G@ z+`H1hj3X%tYQ)SRWX6r}_=$cmc8l8iZX?H!Z;(2^&pbfAFFg*-A~Sf05}?A@7ih@b z4eW!LzWt(Va6O6yIk_q-t+;no;4BJlLnazzo)XJX566&Kz#SxnT>p|@-}1M568%}* zEnZiMRy;Ys8yOp->e}^S;4yVZlEPfq@l^f9^yn&>!+c`}4&7mpWYUflaa5~GkiqCo zC)+K`b6@1F`PnCRK40o9UJxSD9=Xv}OZ+^s z_X!aX$gdcG~6dzas39 z2Zvl-mQ#_5tc$X;BXT%qkh{_ufo<5h(VQ|zI4vMFuj$gEmgyM&eOCV?kDnFuui*@= zKAFn8-`2*ZyKik~R$Z+G$GX+Sa_lCp5 zZL2GZrVUxPe0dVtPv)g)T+TvR6NC*wEn)Ld2I7F({G<@iW~o7MPW_VXt^~NUS-iFS z_K4pe{f`S!`fN16ll*1#v;GS1HWU*Q>6ig+F3mykXpin?nuUcDr`I2_kmOV7zZ}7( z4B`N@dl`+>($oYv*&Py6v8m!Z;s4hte5ST`0qr6&nJ4t|@fz>br)Pt8QwoSEtFHO4 z(Y#?tA%(NGa~!QO%GpEk0K|>>jasHkJK&t{EJLG33WY~NVSE6wvrr1I{kdcinS(Ci zD%~rQ>^t@>pFVz6IcDPl;7eB~shO82@(RZF>1Y@ZE*h@(S@RI_o!kbj&=mZh@#e0m zC_CS>7gU~_#N8hsfFIwV@cL5z<7CX+_yNi-RBL{3+B7^}-Rb-C9Sh2v>{*|%M6JHV@5S*C zhpl|OsQ5-mOrpcK)>-qY>Fu#S5Vqg~N!V_3Cmfo! zB?`^5hx)c_u_yR(`J9m4&t^7Ses1(Y%Ogx}dQKCE zFhDrifHwWnaR3lV_rTvuM!)}uhklhtNH+hi2M!#Q5HTg8W2Od=8e}4|S*45T)957w z+&Xmc{trV(N*9ttFZ$Jm?JodRbc6%S00JV!lpKx(H=jn==&pHl;6}=MqVc+3H9pP* zq3?4b59uloVY|-*>~HT-4cORUmUKQXV6mp2N`Y@A%siN`BfKAoR)@aMFtv{% z4KvBK$DbROIL}gAQePQvwdv=QoJcA)f!GaCO#R0j4<7#OE2?c28Qk@vmY0zeUB_qe z5ymryD_nOyvsR{k;mJx$0*QJD&x4odIXRLC&U}->uM0TCrh>%gqT!)zw^nFmQ~>xU z^iQeYz?L3SB&g2Xdm}n}1n#W#*FQLMCQt(blY-pC_FY;YX0pzH_QVMj9#JQs*-^ck zl=&yr)jn0r#`Gj1O;h#k)S<)r^m)N`efH=o`yt4XH+^Q(wyQM!y(04|+vi_dbjx~N zZgu~C2Mz$m&+G5_dRW)CRC3#~Wg!HOAZgLkShqF_Hcq2b2KCwcDr_CyQcfowWL%6x z(~N6R9z80|2*RO+a;gi_(Ykqhe)CEBu%mgykf}2tPGrDNlkNKS?roj<0fySDmp8^j zco3BccC1zzGkysmYC3pw#Y(`>;Tr6xoE37btafd)Hqmjgv_oaNUgRB#x0H0;dBH4< zx=!D?ag>A$uDU?fFxyqN6K{TV>Bj^~z%IZJ^bF=8+uL!n<768)=T52V$@x?Hf@?m@9xMp2ppn6OW?x zhiLd6z9O1*MG#ws_%U%y`$|+HrlSFF%{ZHWkVnOk`!Q`#yB1B!NX@V4tw40Ql-~#= zt*e@ugjM4p%xt<~MkAV4)_mTc6l}s^Ar)v+8Y>ckRBIHrBqj_zBu*YXemw8vc=~c6 z$m0}4ow|3wOXvkyxqvqyb^gy?eZ4>th3bt-za9vY2`k^qVwaEez77+TS84&4(O&)O zgBL?G9ND?_;>8QRS7!L?>%%8mc#gGwKX=`U_xZaO=LA%M+6l_#T>s+L4c*YCzL0Sh zb@&JTt-^n$Gfm;H54AX$9CvBn#owvcK>+quB-Ee5n&uEXN<-~oSnkNQgxEvCNP?uj znkl}&YmHu!Q45>+AIf630)%7%!;3Nfb%UWBS*((CebZpL+DV{}5HAXA4EI4TQnVDHC zWr4_U2x(QvR&}^En9`dAv&SqXB`fRO{vAjF=BQ)oMz70Uci*DngQ4hv!N`jT(XsaY zv&EjqfrbYU97vf|r7K?;@yZ0?98@}=_E&jA=aWYaM8;e&x27K6`L)^F4<3q?aGW}p zP4-*28r?Nq%#r0+?jV4%nJ_2%Og~CUlD?t6>opu{=lD#1KyyFhq^<}gxX;hsXBUwr z{*wugvCcWlHYpjK>}=fh-DCeW$HT$DMhL(iEkrQ!wfvpnSu8 zS?&fEs1McqeADID(P#GNz?@-r06%jiWNPrKm0n7Rcp7xBmRPB&*M7~EW}Gkmm{wY6 zLBZXnBi2(?$-Dvxl_=m(yX9GJpMOwuz%*a|5j%d`W9*npr=5tq&~BJKw1pwZP8`x2 zNZ@>n*O-53=uw{j2_kLoAMXp_y}L`B%}uamuna{26lzCWi@S+QAT@bcKTTMqr|CJk zAN)BQC55^(nDayhU&hP$`;Q+lKZaB6@Q=8W=!Te*?Hm3tP+;lC%p?kb9^j+%+MOj4 zb6Y^?>$N9O`SxTU;y!$qME?mXUt|q-c2zZV5RiBcRRIKDOiUpe4z)PvAZ<~1a6qb=;{xw(p34OC{&(5oJY9k zPGv9*Mw7HOD(gU5@~ScBqfV{|E5oE?ocEgB=FJ(yS}?s7zMYek6COf%ogsZWLGr_I z%Td%3pmx#g3z|T3O3BFRNLQxiCrT+fVE*-&`x%aryZsl`sTCX{V7pJx*Mz|Sy{T%` zqE-*u2+u)^7_rNu3DRY_Aa$ea+WSONQToH)*8qV>?s@5@dk4rUoHZdlho?_YL%3tl zK5VM+zNCdM`)+@e@(*vT3bhpMPi7Pu%}m zX~tIf=nE(Scpn9C-fYe-t2;S?E-=|D0{V;MyX)``iP(9S;l}i#SWvB)m)N&OQE@39 z^rx40`OC(6OTM6YzveiOcIYaGa!g8Q(k=@>84Gc_t9)Y7W^zg%m3%|YgBC`QCo+e7WA0vxSR>H02E9(zfG0$P(nCn z9QZ6O1DA=sWEPZlkFT>8pEn|lC0!AqUrx>XW(B*11fkDaEaVhO==0Twer;>9W5;BXPl4f| z18a@N8Ju?bdF?ky4ga9SXPk4MmrPR#{JJ1|{j!LyJDT}MelPxU_JYw7^+Wt>512Eg zd9-bwaALgMPyT+>)?)xdf9kMj4z^>N6Jq;@&xQ#z1k&|56Oa+3o4EZc0`VJH|KAmZSYx3eVEl-Zjzp%kJL9WnP_Iz^G$GqOr#w!&$` ztZ@c*>!)1y6zqZ=xa&vY38REqZb#z6`o@?tPR=?{V^>Y+!E z9$9^99`W;g3Pk}RfdoS)$5mN(O&Fmo!y@4oB6VUyO@{tV4*ZhbZOMAZskviDQy1te zhZ|k4-Spwv6sPQKtLI5|#NWw~F7!*r%e*PBG5o+cMMYwKz`SS8#PZLD!=@PXc;M^` zgHPF`H4{#foqT8p9ARHN8mZH`5MG&WkUH4Wm=2(HpK9}ceuC5C_rc#QvN!+Oq}aLh zo`i%cq()@`4bW_E`hG3H##i*F9pOBq9IR}YV1QR6Wt~Cb*ZsvY+Z*=`e|9L<0$;?V zz!Z4X?ZT?7&%myG56TcWVr7IWO8~5MBM$=z`DT~M1%1b9iYWPmhV3?XlGB+=iAGO` z?bw+sxbLNO7Slc&D;9VrGBxVK!r$hai^J|+98mq^M;I+5U)$x@Qv0)x|LQ8ss0t0A zjCzEpPo1pLd42P3Z%?j#m!B}D#hzW11d#a;q*^#M{C+8nW~s&Pg@Mi5LIJ9>uH2jH ztN)SKaWqYoTsC@EJmo?jXd2DVlL+A@KZsv#e5)%|f#z zoIoyI`1jl?(co}27MpYLorKJkXgw}JboN$v`C#G%Ci5!j3lMps8$`a}I@T@Ast9GM z6gG5yB9x&~FYROO4@u>OuJWnVrzPwHJcH+cA(;}ee#fSn;mQ>^Z56+anXFOda*Ga{ zaP`o5P^;{2=j6moA44%L+%W3iGfs6|Q7EiRx!c^=+%ROQ{j})TL0LLlS}o`Rl!@w~ z3y;95!Ue4Ln3GYRa;xjd7VNHS4?jpOy0|GnJQGB9qSR~FNN4B7YY1?T=~RMmU5NuTGDkwe%(hd;L5)6#{T$VKn z7O3EV(&x&Y`Nx;yFRVMxap-S2o?A(a^3@?OZhDvtb9**5f#_kLOz~y3!sr4dA>kYw z52Z<^`HnIA&QeuCF?Ph@mVQyEkU0;>ia&Pu!Gqw>RrcE2t%-Vg(wLbkatMw7iZ=+{ z{_5bf1F4MWNAx@_$RpW;?bLcNHu6Dp5u)Cq`=k_n1I>2@?K_?MV>%0~t#jf$sdtx- zIw@fQ5%8zk-PR+%c*EeUnBN;QX)^Y+4R|Bf${pRgdrEvhQD)0EA!L%eW&nm-rw3-N zY8DVV{&e{PE;!vSXkq~@6dE5I*T$-zZGenMr>jrruLcDA4Se|R_2M(jnW@FHqG7C6 zPg5~gn7sY_A2tE^iZ*f|fxu+^0I@&OTD_u6ya0#Hv-_50tQzpla+fj!99fK>WHGx# zRXMtxVB3m(;OqwC5n$uC1Lob(OPreGq=>aFg9pO!rK`m=8~j6DZ!N_y;|M^_v*3H5 z08#0Ugc$+F&eQDUDO}|^ebUhaEP2kaMkK|8n!6xR;CIVB)f(r)fug^?v{`rC#`Wu$ zg054@kTivNO?eRa{=p#HBT!o$B!7p&b8FR@&)}k+fFMCP%WnMjF%DaKQ2)Mu84db! z_)7mAJ{(ujLO2e{MV1rtU<`CZV+Lta@Jcf0SWDA0S=jMphhx7iv<;9g6m_T9ew#&Z z=deN!Qn+!`CC;!_xM4gV=fx+ImS9L-57X0AtjBqrI5E@G^1@5^WAu)MKuDJ=cw;}#UQJccECT!sC+VP{ug?Vp zwEAW1KwWg@v(=b=8XNRlS0BhoP@BAX(IRf>1j3o{0J5wq>^(qA{q$8tma=LLCE_K= zPM2asR$l+yq6~ivDC`ubngpO-B`HxPJc-GiqxJCm7}b#lkGi={!!|qacfZ6Q?OJe6 zunLcz2GdK%V2HaS1C5zwNU|V!_w?L*<1{rdzF#uyMrch1G8%hI5HiRM5q9?NFGok8 zAc6w?KzgF%Wem7tVt&tdEeQE{)6%8`xR<~9^VF$Rp(exL6c@`=!DoOo9XQu$nMRpm z+?8g{3hI|5pQ9xMk&-5o9oN8JUmiJXV^BTtKQ@=-O-AD^i?z>Aar^h*2D1kEokaKY^X3!wgfZQnDX9@618~mDLS27LIw)*CDCkEYu1yYO>huuK= z#M&y83TR?o8FrNqD5h?6ZQnhQ7)sW?QrWFneb+8sEWD3bL8Sc17~vBn*us*Mg~44F zw!OPMokRw2?7z6~6$e8hP#pYCo!2on^ z5k}Zfyb!|<5Dl2HznFX-8HP{_&_c@JMU-MuQ@7koASg;X(TWq{_tJuJW*Xs@fIHsm zkm-TzIk1qtWU$4_B9})m^Snvnfh^$CmKtXnprxjz4MZGAOU}s#H@^AuW$pf6E>H{P z5WRoz40V@V!l)=Sdc$%sl+`H%1G-bd^BMTLO{P*qsg`L4e zQ!NGn?gFQZT?>P?(yiTh>-R@PA7D$y=a>qjPngX(_jlX89W`rdlY?H4ITJGy4pd!r ziJJ7D0_kHPMavNt_lR{+K-$7t67y`nQ4i?9V1`!`?+(@CFX+y+hQ}#>hUh3ecj>Y@ zw{9lCupNX_eo@M9z_tUGb1)oM5^5Z0L|n3d=GWIaiQa>=6H}B=1`i{)QaxzV3id#g z3&vp7ZF6&I_JZp(1|c`!rX$xt_{iBD!z;^rTe}EnftcViTaX|VpQh5GQGbQbipb>% zIlH=t#R$Vii)S_ieF|Nk` zYZp{AvN-~G{2SRu)()VkOV_T{T6e*lsS4!OC@8Eb_PY@d67dW9Wconuw)VzJ=5X{} z14fK^WLxK{<4=5d);u}5f%h-UIatcM6OZYv9OumvxMZR^Y#9;j z@l*I69j6ykxc+}!fVKB18D-wUWnmq_JZc_zWLBC@M&VKfKaBGb?Om4#$CWUd zmvvZYntcu#PQQ%LFQ5x{bw}uC>3YvmQDj}(_}UC2qe#JoI}X$=g8}r>6n%M>1Ga-> zLF4GeKv4*|#3IG#Kk^Aq<{VuZ1~T+VVw6tvYI7qPnlOG8*7@K&f#TjF0gE+4ISztWes)bu$LIsb3qv zQ1LckNvzeSSS#3P?U?+!?YuMy3#T$4S6A1yTP95FV0Gqs)#|~9Ylv%?O(PBxPcr;x zbrVoj!`J?uhkhgC&8P5luXT#?A%Dm z_-|MtDE@ZbzR?nzF15@F1~d{uEoC$oo^+Qd2xi&;X!-rJ5!l`D#U!BjONUu4FZNF~ z$a4r8_U!zi$_}+NQMdzlhrB8{2X_h9Q*XHON#4m^uVaV+S$9E=hq4Hi^@u*=CFSGao($}Fjpo(OWq^VN32 z)wruD3m=gcS##%#P821Kre6k~-gmHG20m>;S9MQKa6_7+er;0dx@4|16R^DPUuN?_ z{sg50mQYqxa}}-+j?3T|%%POWjf>QpR8>ST|B!|by>tQFZM+GJC6ox@9DKur5j#M;@k{SPZ|E2cMoH1Cn%8&{+VLh1BnYu95H_7 z?@@`@VfI9OMce911wiRt99NZB z=%F`RXw&oxnWPS@gs+vg1cf&zSDx`jicdi#I1HD0c|~Zmi9m4}Ysx6=%87vNl9Aop z(RD+0u?+ul#L3S%h=0z_F#b`jw_(Fb>TUe6W4=z!ST&}5yB3D3o-Zfc(V{=Hir}O0 zKNp+xLU|OQowGjeojA(-0SQ$U)I(|#;MS~pdRZu10t}OosUS`LYLW?D8NePg$snI< zQksJZFd}?J(IMpvBZtFl4XnaUkTd#YjUY%PW3PjVli|ba*xOIw5;BE)Hu1g=lOJqH zCsPoZ6Zs|l5Fd%Uf+o`gkTst3yRsO)2vj4GE}9@J8sU-T)D>;~lfyms!bOuUn-NCr zz?l^k6dXCSnE{*vN^`r2fZfUFzSpjG0e$uM&ix~buDgKFUnU7WM);GBfFh(4;(jze ziu#-~CU9ZYaDpTsm=&rbH6#zklzpP0VI~K;=5EpW9g|dnDR?%-;XO3e7?6pLRY1T$ z09E472&(gg{&NC?T|Oh97uFL`oeDFPa{}FEdv4h2Q>W@Y8qEvJlD>~4vI)*SbL{_>$N$WKDTG6bR}`386(dPO^jI7Lbk4c~yU@%`5+Go^#3 zG;h%&U6S9bM`w4%O}}Koem9!?GkhFxd@3^FKlRMq{mP6Wk3pzhUST$5W@hH~H*%&5 z6<-{6b#+->8C-k+VOm-t;$|8ek;K9(DeL3j&rp^4SPnuE3aggbU^=8G`~7Bq&pcz} zJCym~^Xu#84~^f+$cyRG7ipPKA= z-vt9RzT5)x&E5O=&tJQCj56RPAcxVruhW^@%kUE}&igjG zD_4v@sVmimQ~eGA23N>Jz=g@Vxw(~RW+GbwZxW|`*nb%qJpjkw5mgmL4X_O$J-S?; z6E240nW?j2ai)3LD+ZnP*1v#$Vux6f0xsZ3_Hx6DSwUG=B`$+Kb!-;2E<(?S#}Ob3 zCw~+iYecl^7a=G#b#kh2lOF{w zj040W=!jJw!luI}tt-~~U%V*FNaj=r80&~mgdt_+??LwnDd;3{|uK2%2+gC<7sCmG{V`Vb(Aw?u^Y0Bfyml z2aV(jQ54J000JmRa*(3ATS9=Gb$l3nrN-24T$mGM*K`%KDUhW?T~QvXm@tz2ceruT z3LZI`!t&uMZJxMl=?@t6(J?W827#>j5{?jHDVVc=c*0?E)#?f<8~^5>$1VJkbDS+Q4EPXw3tF3qTD*d4}G~ zzU5;g`P0N{zC>;geRwQO!DPO~r{G@fqCgIY_2!7O{ONSG{KD)e*v>OG)u9RGv4cBpJ1}nr!=PV)0N7VqpCd2nuOM{cW_986 z<@`+zf%1U-b(ER#ubn<-JS0dp=q z!q!`4%V0UeqF@ei`Rl>SCv`0++VO>{5}C!m0W*X$EHY$g_coU^>Prk;5*vE#mFc<}Cb`CtUe$;lKdFRF5)T%^qjG_+b+^wpAo z0K^6v4mr@=l7|}_>f#qOp(9NM)PxS)CdRMUCgP7zU!^PIO^w3-i%&yU6;a;SVeOo$ zo>r>)&lpML~Fi&K5wHLI+Hu#*ZARbn+#KE&;Oc8LUECJCOOCwR>t@cx^F1Q#|? zC%09Loys*_+uHpeOL8BO+1*kt)ER^krsJzW4CO-I0hGE=i7L)+yr{(N?5M;PY@mz8 zvy92J2svTtbB-DdXPHOskt*<($PcJ9-v(YhbLnW{A;U&x?rA}7EH&_Z7AYN%So$C1kbeSra|%|BJK zB5r)Lk)pemt>LrQlc#l1G$R-jK2H)fWs?RYe^9dcqDnpiGg_PiXOa-%RQ6-|!vw(4 z)TakSA!;H_+Xl>?J6Bkuo@NeeO8NxA?g%6sVw|^`CBu)p{H?0)-64zBiCDAa08i*ccbN+HF>4sU` z;v0J@5$JCQjvDoO|D|wB86fc?!-rp>*rC`EJ9|K@)PXQXrly#!1J9vKEGRF3$fQCf z-5mNzB|{022zeXE9YQ*$L!%iSC>Wygx9tt~j|Ez<@6DIG_EH!;vhEBcC_F&wCE;$K zh@}p2DglN%;a_6QRoIR@>TB)9hsMWe$v))+oLYPk#OaBe8OUPC^d|Qh8Am?*UfZU1 z>t#$R$DfWr>E(5R=Z+QVMHrf*HsM%?Q>ZVT65O%~OG@DYPJGFr^9G!m4!wKpf*A^_ z!Y1}p3qceZ7R6Lp^+RQV709;SF!&N8yjD`$%efQ@otfh|Bl$N>pC$c0XR>bU7P!Lk z^k6CyB0j;BtRfb(971y#eLvw;F=BdhTluJntAhw2F95WCqk?A{Uu8wPH)( z_M;-nDntf+U}~PH@43A!!W3H(m^$Vox?`{%VszLGF?_RW(QW}kVGQ+i8h+Sp;jxe= zh6V;SSX`~YgmCFFu;f5$f?8!S%IUN#BcwTdDwX}Qe-p6frIGTq`aX8M2Pn3W?_%RTF74T+1qn#r)lt=2M@}o zgq)-oo(Jg;=P!Jo0Ej8-t+QrUrCE%c%lBQqdWf=z^SN^a$js}yFA2$Jn}>Bm`n`J^ z${xN*-)GJ|OWjGM(YaHnjp@t1JU#hS2cKDA2n~HS&i2PvzwOo}sSO*#)>_Az=}{U{ z+fjuS9yi)-2l_|*0OrqG6_a8_Q68pK0vPY_M>lLF;GN|!Af4&*RHDV=01t=~2_Uq6RL74oA z&I-qOHj#3L249J~61^DpzE#cXREyW#&UP$a)-bkcs-mLOZ^)2T<7eSgeQbWm-ji3q z<&u^^iMs(-vOHSG9}_*#z0KaFSx$yz`O1;xcHF9s-1 zHh13k>l76%Q;JV+V>?%0e<#vxuwDt&a5-D@5d@<#Ha;Gg6ttNW1v?X;B&)B<=QCCb ztymfnQn&P#Bv2XJ<6^NlE-5_bx%wYrFDL~CpILlkbKp_`!iJD60ARdTc~*#iFmeky z^Pq>Y?0C%LEs88c%P&K^a!Ol+z}s*^wDe}p!lH&GP3Y)^8d-Ay$)*=7e6nw8pEFBW z{u*ID=8xmnZB?~v$=!LdrIY+O$CB#RHWT1(fbgLPONhOrPv}jDQ)&^Nz zzj1>Vt_(EXPy2N)1($N>z7yTGxyM#NyDTbr3$jLOOR38rC^PL7@c#g|lCbU80x=B%C(l^ah#zB8G-k;Qeh#V1(A`vl~%GOruHtIU(iD$?Dld^+^C_vk%e{6g*O!Et)buXLRco zZ4qn9#;0Ld(M{}NM2nV=z!Ore!JIMN`U8@l-xQ4C%t1M`BX&y@_xj>0RZN38l*g(2Pe@liE8 z{WyRu%-Z+N`YrDTsN&s)8j5sWnp)nNi>(-M`Zn#vPLgWw4`0%_r;bs7ZKU@{5XJ_C z%9rCjTFRu-5cV{+-PEZ&%U05zM7kUTgYs~97oSL~*~=TcwWF<|k9~gpH@i)nf{g6! zlM)jd*;B;;zRQX_fE&tnusrjMkEMxL5$0ohiVKjqae}=O<{trF#mwFls6*IgsX~j> zbL^7R_w3#+2-)d#R}+ZKVz!QRhT{^aC1+k-_fhRhDu<&2S`Hw`T8cpLaz-JD5RRr* z)CYk~lXz}LLcp0$5+Zp+3CcQt%0ZuR<8QE4uXQk)d>O z6T=1|F$w?Bf4j6vZd&#wpXQ0mpmM=i8!ilz0-l%AJWY;db`60|5c>wgYoXdGO#ci#}T32z5Gf zOz&3bb>|IL<)EWZim%Iqo?#q>PPFQ06iJ$r@>TVp_n2~D&{pwC)#LzKMO4R|?=8uU zzh)Y|_OC0c7Kuwoa2D5QULA_;;@tW3Z{pp1!hXJ9vKHU^Hv3-hy6^~NY(5sD6hH1g zfDne?kEw$O>ng_-9X`W$Z-gf_C523O6h_sZz7xBkooR68u9ODzWM7A%KJzE-e#!ku zS6M%=U;}+Dy0cjnXFxHnX#%6(T6#7#^y98|${ZAMyXmNjgc|~orjXYw!#wP4=KFOg zr@mkc!xcCOEm!o;8h3a(QGLGT)7Gx>zA?NZ!aW!yDG<5cCxjq%#aAw3YaM)jL={vD zrXWSoDaZteX$W&Bp4aJ!^md-!q|S8#0|r+0!*xUqvqG zFAGA(>YigS+HTw^E1)Ukh$1Lf!xk>LW;o25hjPSR4lrw7Ok9>#oNril?NyUuGC`AK z7-GZzc0CLVf|7m_rJ0pnNMI4BSRC=sP~YhHpHx#m=52yw-H&2`#YrEd8=wk98@leC zeM}A(S2+hb-y3=x_>?Z~njNcOF|`EA%x&(iIUua0jR}81!T0APDJ^l>QSkY#p(byOilSdDBMl{=hCtSEDaY45iEZ2PxBpjO zL>$Dab!Ny7<6;1xf1;7oS zMWKyul7cheqpjf0+&Xi>FwmKX8!1{F($w`u>vBVQ%NH}n4T}M9*@mt93?QH=(i?(1 zBKlUK)ZrY`(J{t{`F6xCWH4s!0QYP>Cj^h^4sq)|xvy&Mx*wai2WE-X0T zNs-jZGQ0;KV4Ryhtb^RA{`;>d(O%=%L%Q{lD+(?`+4&iEGUlHTxd*f1d#%+z1`P}9 z$}EsSU%5XX~uoc$f!G>i5NwLZieZIrT z%WFmhzvdvsZjvI+8fGP8HJNG=dHV#W!T>Anf7&-@vcMAh?KCCp?d)U=`k0ANBG3CZ92Hn8y+B*}VGP_0=%aX9 zEVzBKO)-kn93popgiTU_7_BjWkUtM_CU=hqCyvV085dziad(>PFIsd6;TR+b{=)pK z644i%wd7IDdqMpQyvgQnbd`-@fK%dE1o0BlD-9uNa_q;%w%|w|`}8>sPA|F-oD9T#k13dv_G>C$ z$fs8gE%9AbmSGNH)-&kX4Bl6OsgM;L+pV-Y&3u5qmZdLq02C=oWdF2G?f4-i2HA3i zN6JN_BbG^5Zx=QJsRqsboxb6DeI%_c+|h>BBFH-e_bbvsJh`&in?_rtkN`zA%;KR4 zF5&LwmBO(3E}C-ohQ5x-HcQHH;H*k%j&?GvdJEn%fBp3@<&v-~Wo*ux00dZ4%~34! zhh@c$crXat8=@>|C)#Ec2+c%I(LG{rqp+qO8Ic1Y#=Z(<%lG+X|4;!jn*cRoo6AZ@ zqk?$W*H$>WDLDg+K%s=4IB?LQ=G->1W}woVbh}}gUhrd}hKfWLmBALHdI0S6y=7~c zfUIKXfS=hu%s7=j`g^67HTD2)A@G7w17PdITBoZKEeF-aaeH;rDni%}bO+Q+IXAWp zMUsPkJrpq^&C!zdlvPa3@P~N@abr>kKKD*^St2gTP-@RT`^-r(Jm%( zfd3PlSB4#n+?F&6aVKmribT*havXL7m5r`|Q6S4S09)$xKxbQMyccy5QHdxnyos+4 zj=sKr%-ep=UZ9Q~e3@VzM zo&6_D0O}B=toyin$W>e>{n{<8I_}dvF+=TlY#WA58l>9dZb#2 z_Y6k|N3XkJz^Q}?Si5H#W%?Vp4P2^=>R|w|FQ@MlfFR^X%Y@pzr6BeFwL6I>04o@_ ziF9Mo&Ld*qx_01Un7V~*s8P}e=KBQs`y8qu5W+yy2-PChC=;SFQp2Y)b%uresguu@FurpBk0KCgkX}#(NVI5+;QXb#A$G zgt!)9_e8fLo{eK#F#{JzNO0@z+hgPAoM^D~OCLP4bHj4bdp#gTyQszAm5YJEQb;cp zMmMb@@}d^=buoS#Cd*ck+=y&Zd^rHwGJ#OX^qd`dcnCxmy7Em3Cn38y|K}9Gxs)fg z0z#u$H^?86stINZ;+|P+)z^>zII4R)(W8+!L?q4*-lb~yYtJ(+5i=kvdZ-yfZ$RVP z2wa3w{SgkK2z&spMHSCCeuSKayfp9Jj>B35`TcAp+aqH{T*c5(3D1;h)2MR5TgabG z6E;#@vTsd;jVC&VSMrOw)U-#PSgq;f<5OF~tWvo3`!uGJX!!Ao(Dgu`1;aNTALcYgf zpZ4-L7aSS#S(*>0T=o_00NDxSw+qn|;7yhmi^>r|WoX1FP;znLnMml@T2p(?!0?ImL#{ zq+YDqs$und(J_NSrE%kq)0#jCOlDdt6kdj!Ey{<-F)sI|$Pg_h?pPuV7mAUPqj($C zZo{%h{;j1Y8e3p)o(f9syl#hXy*zrJltTKH(Dt z_GM8!!FZwN5!6MKHfvxM8x1H3%Dux3*?P-X7%kY}V$+qDRuVsw^gTDmb}dPg#)7VV zG%Nt9boY_Gl+AzG&^{BqcN}S`1UJ69_3xjQ8L^em*TjClHxy36dLY-DwOnI(x3ztt z6H%Z6K0_IiVgReW!3N#5F%V~yF9hwGlt@Aqz^)+P#v6$qRH9k%$+<%!zY>E3ND>=h zx7XOxB%w0eHm&j;;{`!cQQUy#e1GGi$6}0#{CwI!!f!H<;ou8Pic@!`g3{8Tcbj|| z=UwJjCRi<`Bjyn3_Jwo{@(Dx(KXJ(BzNhCLNH)Kfni}}1$co?Hx8{#SOjk1HbZ|N_3;tBW&*@CEI*zE%@`*X!2Joz zs(#c@g{g;(-caw*BO`|tlSh(kUexVjG@E2wSrSE=tF5PpgUb;iy$~xkY92m#fWrRu zyLaECrlRN&vXF=tgi8{+wwI(J6_vYn_KOpCV4&f1v@;bK6vk~SfQ(DpZOqg2Uio3+iDsA~Cjj4)lSI^VXT=J4I# zssFEJ*^~+aDLD24d!AXdjQUl)$Ch76HP43SUu}1iN6p4hA3&RzpU0K8OD5lm44<7T~R~97h1M+Rf*b@&n!j>IpkZiN2;wQK}}1x`yY>vNctiBby_R(vNkYKGglYg4i?C`YYVL6 zPUU0%?UNp?Ptb{?{QA1_++xV@9SBV|mWQ@t#s(|}w0%HH8(I{$o4`wz#Vfe^fz5u= zbPX51_TDK4hhe{}{j;iC^y+!|!pv{m6}^mu9N!!o05HcfadZkoSH?g`+g*&UnH{hl zWKkEtcss4^@T-?~ef8nQRNlR@xaZ-weUtv%Mc?sP+pa&L{r*|arwM)8a(DNJRNc(? z&Fyplf%m_Dp}@Jb9A||@?wlA>h=~D~G|>xxekYfhV~qXoTlFYK--gOaI^2&c=6{~y z56B=SFE3B@g&Ze|R+H<0ZW4*V{+9Q=jKnKzWALk-@ahOTyPT)uUz&la`Femq!@T`lf zET0w6bpne^L;_P%tRdsi<^1jG=5`CA0N`YAHpxOm>00f8jj7nL2Hf#r>j#kfjzMvx z(Z+UrLTOXG#Jp@72q>?vt{9}xbMeB?-^$9$t!ikwQAHc1&m`SO0Flg#J4I9l>`)x{ zboa;6D5RMRTzp)-=f35pz;8q4(`)<~B!^Y?5TzW8#B4mwslM*Ox}nQ@xjo!F;!Qe zS{-sZ@tZ0tt06v6WyZ5bVzbKbYRXOLcqEh5@LjW^W{g@*i9$)QYy_a zwe5=lkqRA&WY?`el0?UOvk(V6@4%TgIo6S#(qDx=v#v~;$d$f5YgAt?_wxrHUK@I% zmI;|AZmEHl3!c<~{w%brZ6ha9e}{7ioeq23^yjlvOKjxE7H{06w9K zmpHwMU)o{;yONwgETCiO3#E{5SuU{Mt$N2IcO^F;A3cn{eWRQRW@2X~POh*3y>xt} zZg8Bu3Z#ePA>6RKs{}XSpABiG$c%0Uy7Mv`U=j3+Fqgn8#s=h-fydvp-u>|ju?|cD zBG#aFv-}Mj%f3sP%Q`Re3RO*-n830%XzQz(4PElTf-}9bL;(GA^wA!`L$X>FOBueJ zEZG5I7mw`!VuTz6!$t!@&MCB~;iD=k?C-{B=ee?!1Ni>2vMnzy0t35;x8M z1%&+HU+6secwqxt_)!-Gl!HyozUf%6_Uq56JMwqz-5BudaXtqWvsWeUyB1e3+CJMn zt;4z(D=_428T9w|?rp*A&r$mA8U1M;4RIVRsS$N+-8`5%;S@5)eGWiT;74Sp~ z(?YQsN1?>LPRe|`Vpxxq|DCnn?;`PJV*m|L=ia>+ov(vTCMNJq1;NQOsoo&QyBch* zDsh1kKzSe$D4*Bf~3; zdXRL;#=iP8?x7V)`!HMqKS`F0i6F3M(8ZSRx=*#RI6rBo&g|JmkiZw+*zEkPh};ja zg(I|_c=6k#Qp#1aaM5H8~*bR6!DrpN= z-w3pU_ehMm^YUdMiZmr{rX`{HIiVEArgTCh4x~Azd#pk|DhLa9aOdk@zI?gC*7hx! z6u;bIC+K)1vH*Y;d$Yy*o9=^ACAW5B%Li_n$nia?9J2T`fx8%On&#(e%@ zRutlKXk}DI5Y6?VE<>n*Z74)y2F3?DFkqpinlALlCMG9p!x#A*h-`-P-RN~nLxSCV zP;alkMj${NAP?wGB1if=!w}H1SmvLVYpJUleL<=M0H9c(3jWHYMA{-I8jurdR-{*k zj+?U5$5Bf-v@eGBqdGv}M{h+-dH{X0JX*?{Mna|l+vXr?`Q4(r;oFSB_uUM;BBVLH zl(gxs8hks^TCG&xdjqxzGHnnIh#2NmA~`~``c}kyw5rstrgsMZ(T7VQy(E@0opGn-*3MqfqKa84;O< zT!aqe|I`(p6d;l~*(dK0!Jb#8%J0RR)~6@8;J6MZLTxzux#C<%@numHjp`429* zkeq2eIc;>Iyn3D*mRGWaRl}E$^ab2qFa!~VpYOodvx15WJ#aXof&d~3S^+Ca1d#OU zU^d(+nl+At=5Q~uBs7g$H=7qKVr6;twynPEF> z9Z;gQ|)nyoaTl06VlwpYcrK1`7U8BoN3Ca>rv{Yo{q)8^W}qH6d5$ zFjY@d(jK0NC>AM>PC{6NB26mj(+I0RY&A=FdD2>QmMW)ST57qA-i0g8O@l1h6Zi=` zbrsH&X|OUBK_+SX5YYtB0(D}B=!ZWz@c`q{sf0^%6npXjUr0!)`CpcK;im?PK@w zZMVH2MSIIolsI>qzq2lQ3eSm&3on?R6XJHqR^vega+faKC;iUe+((5p<{<_X=U~gv zv*!!bnnG3R3x5E(M>K>KVWaVBl6U$aB*SB6q;*zv^bjLe1>PLLye#}#sUt>p;pm)c zDMf-z0!+e$kDpqz^7=DtS%S{gDU@UMzf6DS$lznbysjT~jl%k8di~G#fB}EIE7g?k zJAGC?hkgf{cUgSVb_F*eXa*6W=~s!3;_89EcJ8~#=1VG54);m{P|7Iz#z_~Q5Q*F8 z^If0bw5SwCGYFCa80b?QS#oCpW)X?XFRK3Bkl>}`pU5SJc}i^n8(1T*zsZIrplEx2o^U#U^VI)CHOn%LCXff(RHmKD=i!ifBNNdV#w+ zoh8E|EuaTLWUG^VKLhKFCWde9hIyHgj;*Xd46Kr7^gA&|_R|0j6;Y;Eo*YeU%3n|3 zq1mj@N#G!ekun5WS@tdVqaYQvYbT!6y~FDfl$uLy4tb0&r4jQvef>xIk*GGnPo-km zv?;u0;ooy}Hf&@l0}5+Mr8YBV2n;Q{qM)FXt2=E)3HH}n}yld$knBOG~QZq5^; z3UAQPt_2;3#zlJ63d-slWWzkQi=vi}J2i3jzzT2JNJ~fjnn})cOKGUbG?JN%6gZQu zc*LTWC!XOE-3(vUi?uFR%VcjaFYy`f&u~{Q!Q!RLr;M8a-C+WCBF-(xz)2c_SGE&c zTE2D6r5R$}Cr1>}7`pl6i+X*5WkA$h0t>DfQ~kIYk%*yTmqre84ePtaYML1glCz&C zgEbUV_k@onGIHRF|JLJrVOApy67iko>+;Mw5dNk~S}NCfcP=66F$XGNc+lv%lD0XY zPj6VM!y-NzNAhuklamON34@%%_Am3O?zp7T4><$i)*FEi1?9}LN?tmG#@nU0Isxi2 ztI{M%LZINb3{+FAu*uD0<&&s2>VFnbpj_5eM;iwaGI-dq`*l?q;pR+9BlItnzFB0o$d?tLA4im*{;z{U$e@Pu;a*F&JlUI* zZy5uw5}H1P97<~%GC>;^TKsKzk^ zW3G%}ODFM%>9x@8#S3n19s*CskCPc&Qy!D9J6i>s73soa)CO=l(VNQBD;OByet{oT zZZNhqXJpJH9%XsIJ0f$Lf4D2jG9HM$)2Qggk&Cuz#iSPlWHc!PR(R3UTQWCdLdVI0 z79@gIkyX+n3k8z*E;7XkQ+y`Emt4QR)Y)jO#fa`=AAjAptS3K@X_+|UVORV`v)Vg6 zx4Q6uTmS}C@|SR#F9;6vy4g$I+({4&SmEs^TaU|x1*;MD+wZ?$F!0x*BI(qp&ujv! z2zW?u;_Y0yVyo+yf7M!@@6G!ILc{A(BT z`cR=6$YU{MumV5V$>(_Mu3JtiM%nDSbrasBG?(lhT8f`PhQgp}b`*IhP6u zI4>d`14*59P5Br&lV!NV>fmfM6TeRyC701$+zNveG)mbR4%x| zkI%C&49woW)qrbEttO|(@RFf30kZVuggf={)58Fasm+CakD1j4;sjR^tB_Rs+rNS7 zWU`2nn{1qb&UQiL$zJA@eqg}#O3hF!QS+pxr>}%80YUp89@}otyx5i_j7$#-iPynR zf=D8MV&aW1!*^;)HYxjEji0!W+PtR>+<9d15<;P8H%EFeqWg~L!68N6sX3q_bkm;U__tDk6Aw#Y6- zTM;A)fnt00`-@`MC5}@3@SLb;xJodRJWqYZ@g9lA1_i#r;|%Q8B7&~uZ965_GVeCf zE$0hSOAzgE$t zxla)_uM7=nKJpw&{-AUe`6MHX^q(~iI-XYTr9am@rmKv7u>oTfnW#x&%Jb*TIQZsv zI~6L$>!L+CoD|YlD=8~KZ+qF;qIvU8h>X^X%L7i%Eco`c}{B32oLb>;Em$FM( zJkX91Iy7Rk%cu+6R)%#Q*0&rVevW7%ut0sze!6?azZ3{mbbYUDURJ5a1t=4}QT+GU zZRwxNYYyd*QSlwT2{XkbwKOdjBQ#vDm$}u{UL3h%<;q;wOoIHGdmB`vr%(b$m{OgG zR&Aver86w;*5*Alb+It!Wl|h_>eRO{smc2U{6kI0Y>^UCmLKDcap2+p1{A5_M?VHY z{yOeTzrb+s2m7oe;+m_T@`gXoTg;V`Ugnxj{{bUZaMkECOGX{HwN>Uv2RhD*1{85N#z{Hg! z&(PSCld-cG(2#bSrf*Yi^%g=K?myUBN8YVv@qrLH*8@V+YSNqZS6A;H9W!SA-J|`5 z+C*~8Poc@;d5Y$iP9u?Q&G-hFu*sAu7Y!A=AqHcyLutx;OmVlHr=(hjqv3%7Lfvsl zYq@XuQ8A^1(at+&+w1eHwr$#|R=Q{G7JPVp)Q)+#N+Wm2x1F5U)-1FAj^j&U%F;io zkDhf;=yuao;t$#xs~uZ|-=TEs4DAT+nqVzst)7JD=V6IKhomJC#d#5}oxgZ-6FnOI z!=1)KgXl$jjbHci-q4VbB#rrZ8?`C#x@r>c6zBrs&HjeF3K?W)%)U+e_JzM8S*xnC z+)rTrh%p>{Q#(`D$$oIkeLwONj9k#BAqwPrM*XrLOlljEL~@h1)|5qod;q$D3^e9m zR^8vL@2({KCxGc7lCD%&7`A$d;5C$R)A9VG*y6zQ5a=j&ta@D2p=TfpmTs*m%b}LMPF5!i4`urW>37UI3u1z=)S1N02hH>W??nsz*vKmRX;|K4N z^8ZcZ-Xd8-Nc-Bgw9a9cXhOO(S7rILYv<195hE@JesV~q_U836&-W_+%sDs=`oV9? ze|=_f6CDWCp~#Dmp~w}TJHF+Hpe@g5muH53Aia@<6j0E~<_07cd%V1`MX4uBSqDy; z4A7*eo*!S$`+Re4gC`6WQ~7s|HmM7BtaJLsfKUE$vsP_#a$+`m-nDvfJ&jo zT(#dXy!_`+dQ)8xFY*@LKtt4;w$jsOu||CE-0eMo4}&1hF7Pqw-Me?1;;I+9Zr_G+HnewD@yUZW@at7Z6Kfv=c2Y_gE@hnTs= zsls{5^6}b*%*9|22WA(69}J$Gh@lqLlMW6QAX5jzi+Xxa1lv5#AH|dg3HHvvxsrL;JzVLZxrEeEca7LXq~MT}1WMlKUv)hjc{fBc6}kLV!d; z(_l_Ab0X`%WXR|kqC@xTs)8**gK~A@xnnhMbogIaL94$s2{c%*aTmJ&D!pQW*l`|N z`LjJrfi6T8*pW80*b!W)tzW3l{rTUV*X~tqaB*d+83uiK=XCY|Ut1zqCt3S->p)q= z0Go(q@gB79G>Zm(?WH}U!Mv77VZ-R}(L`f5^2Y-0h6*x-40f1}kdqHF#nkl0x^;7} zFmB5vf~*E)*N^hnT9H1_#qOA5@J@|TR!@-!0ckRDC~%k>%&+WR;3#S@_+B=q3SUqFAPr49pt36K#yt{Ila&Hu z*-Re!EV;9d4lU<~Fv%b%KHkr!Z8;|G>4^4k+XQi`TIqe=zi;1ef5ktlhx!A!03lTO zJRZyj@8WFq>wb_|Ac&WACnhqoo`AlanB|J5gE|5R^vapt6-oK)$3VZ{q9KWu!6&Bp zY{)}M9LJaF98#GEr(T2-K#W_^xy!Ci>P#9U{?z$wW>0lGZ0Lpe7#HW;>&yG#XE|Jf zRcb1y@WQ}~ONiYwf12w0<=ps(^G->ElS?eFPoSzMZ_oCeFyP+0Iec%ENWM4Ogom-L zm$B~O=(47o5kzp4MoYTKOIYu5n$Ld(I?-R2^{934v`NZNFz~^G;rzW+g%aWU3 z^o7_NoX!PeEOqiAzhO8IBDIk1EyH@~V(JNve+QbK)q#1kd>P$v*S{-3S(-JKOq9k$ zy$?(J0()=*{ond3GH=Pxcel}ak<&f3n?AITk!^Y^)Aq$hGd8wD(S~srZ>GK>H{8^k+gjAy+LJT9i#O#o*Ovu$E7B23XK}=zEki) zheOAYqJuCu#DB>?#7a$F0_d&cx(@Wi>TDb3jjz6|hX4KU4XfL5mx!`kugB`uLLSF| z`r2>W?kI1oww{1eukH2T<39V-tm+L%)Bnw>+TI_{3w=ld~Q! zi4_MXYPq7HKZT2;9;d0!%7dzA5jpxSiUKd8Ql>wi+xNUmT+gDk2M_+dUP-!Tn^q6z zR_RWoRd&vC87JDTzZO)k=yD2j zd8Yh9Jep^~)qcAfLZj3lTjAZ{2HEM%>IY7A>9F#S;LliMFtmy|DG*!jKznlE(Odq& z2tc;NM3_WX-XEAoo0UH8Fn(dxyZ8stw9*zsXCSj))FDIdGixU)==vaX*s>&X)X@hr zYt5d(K4|G=y%^LlgFip+cgxGcs+d}QHsxkm)<$}uP_7(6dW$&fKAzL~<}h&A!-w1^ z0MZm*M37^U8W2>zfLK45u+J^x0kD4hQQVIjnzSsWpdOfG?^^6ESyVrp#b0SA~n!5=@BkxFqH zMyfK7o(>NQKAIQ>Cm>6zrS_L#0}F1}^13loT*6_}^4UvvB`c_c+*-wU-`OP6>Z;i^ zzYn8Fje>}!gr7g(K^DhzXT%E{FOyzl(BzSHrykGJro-UsxL(il8!b#dRU&c zJfOCnUy@RU!cm7;C@#MAR2bo+xA%ZeB3l7dGI1bAWngYw?T5@X(>s(nbqY1q%RD-7?aR!f;a--#gJ!s)oD&k_YFh|Mivoq z05th${IlxTt-J47U86Pg=`Rx%WRE&1$bswJLtD_LJ-QDS|*gjfUd$s>mJ z@~UN_F;Hm+=GsM6mJLG!l%FW6K#DFHWXBu{IKD9yH`MfK*daIbBTHjnig*>0?*lZk zShjAiDAM&)ZVyu@|Ab*E6qxM8q3?P2-(HIe&6H%;wB8x`(|~p+j8qqo#;uDjdcmZ@ z(r+&h!VKdpo7Ci@din~@b-Yn*LH6JzhRrYBXz5+s$@^zt*JQcC7z? zS!=&ON~r@W3WWU>nFam53iP$q_buomP3QfQT^#7F z8%i%8Xoe6ph+3wJgK`iKPH-w>5-hO=9!N!9{mj&=_V*PS*zYv{cTqhmUh2K;i3>*G zvyM533=J5vmqtBey26Y z^ZWQA?7%^K2ShV;a2;K41a4?Gp% z$ahy6UgGa(#EO63&)!MAuqN@gX@shoI5VZmjM@PhHt}2}=Q6Y581vfMoD78^(-xAB z-29m49`ecgAOEoRvm=AZB5FdUA^S0glA`>XT0mn#4gukHO&_Z|g+=`Uy;tyn8fViF6H*p$d;IK9C` zB7r0uz&s;puIb`r<(Q&3BvrF&~wORem?*BK|C4(kq5)VunpZTKeY7P~l134V&?* z?!$k{?FG4uxf|UZR$R@|?>%_o0Tl;)vpB4iQ2Pi>;5h92)5{XExG?MJfp`eXkfJn0 zS^>XyPPP~W?JP~l|IG)`I8WZvf>-?z-iO{xfFB*;re`z$aT z#?DszOcM&`AlVU!{6YMU(U~wBslvgd*}{;MOdes_vY4<$WeI@NL1c-uR?6~=zRO!X z*RmtMhYf4PfPN6u{}Qf%a=;i zZ6|Bn%KzedL_q{OO8%lNr;Pn_M_sOOCS}-Ipj>N(lPp`*<_}*!CK|701R<@!%{NlHF4Cd7nX}5xnRsCz;5ZGfzg*rrH-Z}Qbkt5ifG?CFdnU%vgE>~k`eNj7s zxblEAeNf?}vE^TSDqZZvx)sz_qnLi#-Ll6LaiU?4kcZ|Q`C&DK&IE6on@QF&tazAs zbIYGpC)0MjxaAbnp|BZJxquc~)0l#ERQwNkd0t&c?xh*inAuiTTaBAHr=48F52tG1 zZq#j`MRXqAufTE28)1ql4QUP3Eg1K_obA_C?957susE4ok=|A!J&DhhF7W$_RMniH z$tQwo7%&nSarfqrF5Z)+)yUr??!B_6k&5wRqsJ&xC^v@MJ?x6?l!l25T!k#B;Eo%C ze$conzWMX)?edFQQfW(dr~E+mVr}09qLnYfFwyt;KJO{XIocpNHzYVrrak@e+Zqi|%0gGxFDQQ9*)vbOB)RACLft3a_PI{QC8ZOH-N zz}a&njNhXq_{1tWD{3(2ZuZDT`p99S>cjvsQ$*xN6Y&JSIcfFUZZR@xt?j6F;=~E+ zuun8cnfGR~o$M(fp(mrm1R>LQM_@ManYiOVVoCznJ8|a5BoY6Yr&Iy(4`>Zff-Din zAjhN5t}p7V-;@TT_P}m~;_2$95>-0bHh4_Z6XyQRIXP5hEqG|rS4QSWF0O~xP&$67 zeI75rC>1h1EdL<1C9IQF-E0|!7QaJt4AH4*Um-xi%iECS@sZIyVTgkSz?#mx_-C^# znjgQ|)ez~h6#h~L6P{#A5CE3~Th!7tu7U4R3HZ0vg}$UT^K_XGFXqn<140c&AFv&g zOm-vy@rEwX=qE!{(b218svKwO>^Xew*mSI-w0~>*Pv?BdNHFSE^nWBe=r<~vsRwo< zjHYo7oG|KQxNIGeqCD-j5JB(Fl;xNS&n5B=ST|vC^=tOURqgfo@}~Q^>VSsz>P;QI zz1hMB_7jG0A82~Qx~{iJpUge(L(7++DGrP2(|N?Dj;obUgv3~7ylDE-6HpTmP6FO|8b@qbF& zaNQ+OVz24*>)B_dsc>187`+AzXoAF)=HWZ{Gskm|42S1i4CB(VOBbBi#}jnR-(2{S z(|Oe3G>>zaE}bF}qFR*7pXdgBVif@-MZ<;-k(-`h{caqTp191ja)VO%v;9Hs?xWQDe@%Y)umyg>L?qnq zT)&TQ+eo9}-OY3gvZ2F<*^uN-&CK%eY<9Z$`e}j|KMTgFm1iq_W`W=3_sA3@2m@t3y{v{QDJjJ17H~B5()JO&spMop_1cRwy1~+PKw9*9 z^;m}7Ib*pZ3E~pjcHX+(_51^&zfl62;%6&W*{xeLvCBXkWF2x!2iX?IoOn#kP^4^H zjzuCr7wdv+>zDaIoYu3IVtoaj+&=Y#>-*?KpUCzg(hf@^nm9Wc)mJVS8I4PW4)&+L;B47>t=1TTQ7Wa>erdQB_~jz3#o);EPW0Q2Gj8jK&JIEQsm zID)iq-+u60*WxFa=*tP?hn1+T|H|^8evWi0wJz(9W>DD@7Fn=+V)~sS!-k!p&Y<8b zB0mjt{<-4Yw{H-EXCIw82ZoYKDVU6ybLWn83MAnqekvKqd=4O%j%EdaMj`|hW(pG% z02(iEZ&^c!T+y2QBpezakg=LMgG#vaizsHP0C!6-2HpFbHAPJe57H&0(?`_d^6#d8 z63PDM%jI1j1Xom56Ke@3GkSd7H2eD@OzSBwTDj}JxxR59OqP|6%|yP8rTq%bk~?AH9k#=PHx2V4z9a}eBGTUs{9b+`JiI?a`e{uSUrnS3m7iLMntdtP z;+V({;AgVoNc2W-(^Y#jeNFP)9~ihdG_;TFpRx|tF)UcAoE2q0;*Z8-hF<)B9jmXf zZ9>mh#ukMI$}ZcE*H?1iDewX@AemG)kTD-|`q8C`eciQXc!7eXGjE?Ooi?IgQextE zFbnWm7gkY9NT|>Lmy0bXIs7>Y0ABMob0AfX%zYYoI&|ouzQw1_uozQucBx>ckO*es z`DI-uD#j+Ou|6qu1`Ir6=}*Mx&3FO*AO}wZbPoIb_hQioGBC*{@Wk9rS<^cN8WnV& zwsIUp1lGvIkQn)JqggByx;o0@04(8wLx)7yCWl;_x5S{(FY#ieA;c!L6r2`i40het zITmHtr3EAOC7)$2#WpuS>+{%GJS4F)LpLg$BO&1-zBYe~?W^Q2onPKD5hxZg%mk0u zbXBztKTqMrlaQcexnm6tY2dC{XRfsjtX{ta6Wk7@Yp(A$q&y&6wv~T`96ovK6h$0k z^HTTaYW9^ks#xD=U#p!;#$$YaeVcV1^)IEr16vzJNd|eZws;WOhsPtC5JrSc6%69a z9d{OeJAeOwv*X3=;o#<-B37Lk5-2fFtTDb9oBj~|ZAA#ztX{o( zvN8-9Sn9S$EtM%`xl(mdW`qf9&a^O7-k<&L+kIK9!%vbCFvu^h%@yYsq&SN?6jx3f zf%0hi7`nTCGD+0fC2q!YtU%!n89E- z`WHJdUK|0D_nyhW^tYFIb0RtCUja7c=n=CP6ZI?4I;>7aK1uP8E#xg44S2acU3YoI zKmVK}q=^wbQb_u9GRDE%b~@qNAu}^mdRbhQ7}{1MW>~eVVA#7_7aJOUj3RkLVGsGc zJupw>SJadI^_U=Tsro)r+JO{qwAx(lyVZD1nlj}egE?I37!n}xvSX)CvelR=@&{;F z>SSHDeOh}#6$kjr+te564g{3DPJE5s^2Z6)Kvt!eXq$=2SCEeOa4Bs~S0E)L7;V4v&|Knb+i%HMAK$4eA-rfY=Rom8sYDsqmZAOJF$GU0 zE5fRYuaW>hvJ@(V@~DUJT}sby{X)JJ1sc^H##G!`>}#h8Y7lD> zeys16D1ZM>s;a7#&sfyxvAqF%p%1)a?nzv6*CcC6W$Z?;Pi@GFPv-OKHyc1_mr>Sp zmoN9FDMtUlcY9Ad*CkyV6|7vb;`7_U=At`X>D*WC@n?M zD}rnC1;b~*=ldV6y{g+&bxt?#bNa%Ok*jB-ClpMD==2r?DV(vmi?$PJfe60C|7iL1 zv(gVr3+;ZV1SN>f%!y|WjdKaWOs;ZzKSe#jym2c6E#Vfpd|3B1*oLb`BUbc zgph*KjYm2tXW)>2?)(rjRc(dp<~Mo$kn_I18|E$7uRR6eD4m2RL#*tu9 z<6f{+#9sIBH>1f<7loyCQUbw&kXiPRv^a3uBvPD($r>N%CTBFN=XrA-d2#5FA^k2F zTJb^l@0aw%i^T+f4@nkkpYcZK?C?ERnJ8z*J9~rSo^6zLQHMA6A?qD(3uoWp(v$7n{EIZ7_E1SO`Rsm{UfH zB9 zxnuqr$_x%a8!_XphY$DC1pz0OrS!eDI+1^bZ2uQk3J=x+G@hAx>3-7?KUu>gyd?2c zMsn#Zl?J5NUp-m9y$zU#XdXT1Kh1 zL`}uu0?Gm+l&Pty)ru9h-dJ>l0DyHKb?7;s=)e(?p$U*=zUOw4CGrI!*x}yZGrbW# zeD~jh1mWcA8j&Kb?d*1M+g2A*54m9%*vqBP7DMCd zx;+JG9|Pb+?8?4RfTi#*jH#ymu_`CT30*_lr-np2vBs^f^&ku1Csfj$AR1JCL3U%r zmWc_B+|JFIQR*&T5s)m8+naV&oKN<=p%W)glmH?FL9*x~#<~F=G;!C+%^ElqdXbQ? z0gwg}$d)xIge_l3nAIVJ+~K22Vap*E>Jlt8@5`u)QxbZ(qPz(nwr`lJ7pRK)ONCH0WQVTz6IZrB+>y*E&E{tPhVbQWi$BJ5&@t~ZZW3gd)(b+X*_6<_Ut6y+rLv)q=&?u z2e&+^;`jK?75@@N`3F856t~P#K(8`(xjE{Nr8;kkj4Ed20Q6K6oGeHyGW2~8q0J;j zzsuKl4xX>-#JcG-XU;$tW#062ad8o^ID%5H#{Y-YmMia9qzIAOGBN-yGv?a%^V)po zPsj$Z&JUH7S0gOt4IwycJ3_O zji{GXwd;LZ#y~NtaVTFB67nJ3q}V#b9S^u{y9i@$Inm6{itb=*-Fm>T%%IQlD_OG4 zg*=Qktt?#t?k~O-6&u5i^`Q!2cq&^Q*w^Tb z#pJN3#h)Md#)&q*D*Ne&=e&M2gw2{Y3sfw^;uJn8v33ev|&s)WHoXaK7K6K-*?^A#H2kd z0f=KtgHIv;arpJamaQB!_|T$xBRW)CJ^fH69?wv2d}`LuMAZbWcyjVy(>w%320A)* z*IvD$yZx6$d`)&tDYy4*?U~$e?frhOZm8{yZKxA!$H9fRxZ+$sh*v8uAJ|(B{Eanw zL^?J$VXjOZL5MaGMDr?Iy7Pp%l+c0kh_R2!6d7_-X+nKUyG=a+ne}Yr$EJXJ{?}lw zO#=pVs_^#X@`4~1@v#{?l{*Dnol1j+0}R*ePUmqB!`<=KmG+d-S>_E*r-7F`(#>w! zUCW9xRSatoQb-@_)CUALNLZ$#+D6H=nGF^=@^$Rp`-DcfDYLHL$S)5fP19|QFC+PT>A^@xK=_p9OkqGxaI^btF>JdJ zVD>xF>TFDm!_~Icj7&VWd+JlFy=v)F*p`+knq`F~M4+!}{hPoEw3)sA(hv{heSso! zm$&zWraQcf(v5T(HrTdJ$8B*tzmfb;J>}LjwHj=9?GI&GQ(ZourIZdG2q>CmUR z-xV%BYGyi`EirT`iUXM*W^lYBxV>(b9zucJsmRY&-0n)?Kn8<@a?HB~vxqG*tSxgRY zHt5yvkE4L6B;vZsnSF;3ZjhC?Ye?*-#CQ5au>m?DN(A>;ZoMH!Robt|~r8HjFKye9Bf_D~M5z3p- z0l#$GdM1m!8#KGf+B%V1kiDkaZMsG2e}Ewo`z9K4Pe|4bNqH)b)tjqAKI2V8T=XIh z$+{;%mr-Fk$3?7)AgSPcrHTWx6zVlROj&rto(gFys$i5Y6r^n_y3_{_1c}>FO+glZ z@UPNxD%}HVLKZ}s-^Qh~G?-V2v?e#;SAfeL!ab*|3!^E+P^8e5H$|aL7vFG27*7~M z6ScF*I>o6)v^d-fIwTDNe`T*pq-+2B-KK+(I#DlhsaIc|xN;fguk2mLh=9W*Wd&4+ ztcHd;9>6IOCsu;f=Pr$1%AU=WZXz5eKJ!5@G{KkrZz5kRXUB}sLjDjQm`~RC(jTtU zQY`PQ%L+52UfVyv?c9Y3z*GE0`2nM1@UA!$LD6{ZSo2lHT?+-YGEf9fsM)GM8E%7*s%E-8iWkmNn z!lUq(ZFus+l!8zBnWhnch!HXWd^e~1GNd*HF=vgPuk}1BX(ttk1Z+rpk?jqhCt=;utOXs@UT8!#BKpJ~8KTC6e>PWwgZEA|`5XRa~)!yY*!=dXqQf^*db==q`mdnMg z-0PLxK^@KlFNn>m6$&!z5?@p84Dfj%g(DI|Si>`0U;0J;<=6#xQ|#WkdsmU0Dhw?J zIMCtnmiZWyqpYDn^JrtmpLEyi+Z0+dK?+SuvOA8`P#36-Oz^ zGv5;s&`rs`J{2>E2mphHvw6_a^*_IvaZJTF5TYddLQ-@Hsi?b_<5pAkEg|+7y}g@5 zT5+j9`&Ut{iD4`KJa;dz+GW&?4uPI--cOsZSijvQMcu|(YRPU9^%N9jObQ6q7et2j zrnoek>m1H$79ke{tvl~HNi>J}uhh)6+uF9Kl`CRZF)`wM%dR#`l6P13I62rC!SBd0 zfum!ELDL8EO-Q!pQRs60UMB2tcW=yP{y>qz8EC-41@XQcwQeBtjsGgeIapXyo4N%A zEcCyBQEQK$GV$v(4dIci-emJ?#YqITmw(Z(AKzL|7^)K~$tfY^JWsbAoG`xoxXrZ! zM1*AXd(0O9TEwTnT7Ed9}=RlvWKxWnr^b3bLcrskGV9)`O+F>PXx zf6sg)>~ThQ*c_lj8h!-o^DEuERPh6AQw8}uT+qHLh5 zkN(gRBa$;RO5IO2gWXt6OIdxvm4BH9mj*DI_}$AvamxEY`sa)D8z>oJt{3fF= z5sDBk7;fMQe%!phXI$Nw+)goT*T#~k16mzA!080N$;K`EM?;v>MzQR%<6O%?=l^K| zcHCC$ahI7BC}Awxv;@49|HS|yG}-K3JLYRi=o%|t43YW`b8UF+XqUv3v|Z3A!3atZ zPXK_={GfSvz~9W>)820gt`_ znpeiA7#*j(`#t-GOC2lqzHA_UQ7G}J5kdIAp41{>=DeIAi@hiB;5T!Z$jUzX73p0{ zmL*T}jEagvmo_N2_}#9YLHm*mN6@RAd_qUP{Z~T|szqummQ|&j4r09PHVR~Nd5H{% zlJ*5)a9!2rZq0R|+X+d!Si`?M&eqzRR&pNrd~jS1hf_xH-o0aI&l{eDbUkSuA%s|r z+Y4>Yb4(U$MAkFUqAubCS9UhrXLlC_2!UiIWXRUu=o^Qovw~VW>#N>+pa;T_hngh*nB786hC1~ZEa=K- z#ctHda$ojbKilOO%_aL#WnF>#q+0qwSIQ-?#hO4?dCBO%3}iqLCDAU%%Q$yO%W-uq zvKpxKHlg8>6Kvz*@LpX$HMw~F8zkc+l$LTdGw@9YZCqgEi(Bk@6r7X2I?B#yW+_7GC=HIYbeR1fkm5VQUruGq+KuB7Ur&Oz+7Iu{dO*t~SLt@%=9m_jmARZ6a*@9Uiw)7I0u$NcmnuiHygYjN zhG0Zv)rUhWuJ-TO?@>+Ed9@Z-=<5IZP_J}bc!zGgX=d?Rt{|ph!oc-Yp)@6j4{yt5 z6%K*7<$d#JO`Ei;tOoRx$w`ZrExSiTr-cj3FHD(Eaz)ajSt99hwG6?WE$3*1qiqa&Dr8o}blmn#*wHqj_%>r7kp z6%q{n{N{x=o}hIWOHr90mZ2uVgUp1(I9ue$;4$J4DepkN!TX;IQd4{I%oGG6|3nj6 zB%1tA+?oQQ#fp4d6!5&nGYN3tQ<^yRq+u*?xcU2a16q)((<$Yp_LOi-fOE`W3*+zr zsO67Eh4TJA_T(EV`@j^$tdP|Dajc!k5Q&YL`J^9Wcu=De&| zuAITkU&fN-`Q3VCL$wnGcYyfTn(Z|WggBYZbbHX|AB~IBOO~x(oi4HO+_`LO4zXOJ z#^Cak&Xe)PA~dbmu{@@Y2l5aNjVG5+k3=uQyYLBlJ)dh$=UrxIDqqXi2<9GHFvgM> zNP4uF(mRKjskP;|>D zFer`Mv^l8Jf77hTV0+ly=Z$PUcZh?ePPp;7a+ig(X5Hdz%OYW>SSpWL_K}(Fo;@c7 z?XNfsLk0&o6zg{kCxk)|p7k#}3&vHB-@LMs`F$)gz2ML3UtpZol_BG1&6~^oQn)c9 zt>VOz4%?1vw5GjMe#CfyEpH6XjT<6rg3uoNMi7tbaYlHKi-wv<4Nwr55@@K>hwVeQ zbmEHAdP;)HKoi*#>!`j|WP&}5wv-pXlV~BZh6V(o$~<2qf#O$Yvk1OYFbkW;TcXCP zOsry)Ud-}m1H?6sT_{uyt8Yw?2*D(ozR5!Zv-ps+A@)6=K7HW+LZl1VCIY={ z8|-;obC;b}Z(3g=;Wd|LCn+12!SKx>AN@`MafpdKP*-r8K-dZ5ShQ~4)93mTj7wrZ zhaV7jLleL-Lxv3LiBOe=9L0dtsB;}d4GQjncpFJ8a?x?>H6NM-JM*dWrTZt$Z<-=J^9&0;@|o!{Z}GK5p& z)yCoE6+^)$!1&RD!2~a8)A+fQ$vCo%g@e16(n5M6GsAk*o8gJNtmzMLSj#Z=0uI1c zAU4-WA`71DO*E(A04fXP^zox?bmPRfZ*RSHsWb&>pP$X1@_RFjDy*3LlABH?AZBV5 zT%`#qw4Gy60g^;yl{z$b9uXfbl0!J5oVM)f)kbl^(bVD@16$qbMLy-|VD3Q@UV}}^ zpSfZ@Y&SE})58NLqzxsdz;`fRG3&PGUdyd(7|BDY{(eto3qos(My9&zT@At8EaxYk zP{}8teXwW#^XQ;0o#xpJ;VS!=$@rsS&c|bbN2TOgU~g_}dKdU06Ik$HG8h6HoSUjX zs>069f?}&9y<8b%yZQS^Q)q)wazGyovv?R}TEMS=JTF6tsX#Tg8M7uS@3*qGoon5z z60!vq@oi+IvNU$|=uVU%?6xeOp@&NbOWEDxW9=<0xM!{EI*zX>ji|PUgJ`tXH zUX78wVQ#~JBvyqQnS}=q?$V_T88w0S6|QY{s864SOlnHmGQe?{aN}Dcdx?rdBhncH z?BT~Kt-8uO_xXmU(HqH^%!?p?#;qz4~pvsBAktH;K882~B}HXH2se};`lnbA zQ5VEJ9WuT-2S5rzSa=5FoM*Q=&G`Oz(iHDxEsYPtoOlbTr0n7*IWVzK&BC7*^Fe+A zWe`)rXSVd91_0I1p>{&W&RN6|r#lCQ{DQoEO{nuj{+RR?XreLdv7fjgh>s7d_V#>6 z9!)j|_q=H<$<7u&5$4{j5kc;%zVd^7gT@0Hm-N3OP(JbtLg7?|U3!67rOEF(eZQel z07$o?nI9LYO-IY={ga0q?|J(AjH@1r>&?tY&+2b~BAs_vZ|<%G@-%dX6F{c)tqkjT zWO_jwc!C0`jAZyQ7=EvC5}hnF4OuBJDz}>Iv2ZLz4q-n3Y&!~L!OW?c`arpgNgprg z*Bh_!)I^&51T`sES)c==74u$!74F|i9q_LCVe17F? z%`MQoh(#pX!DX=9802P#mXkV&E*pDGO!_b1kDegm`k9kWI~fix9=s~8dfXrv-?Us& zFG3@2?dxHr=A(}a#2u9<>OVwuOvhPVxd~AtvTQi_>McIx{wH?#+qG@WKw6-paeT{@ zM*Ycp&Df5HngPlz@ZLA3v;U1Z$WF5`faa0eMK1f=tG`1VJZ!)R2w%I!zG?l{6O{Lh z(2Y!^$Lt9#7`#hoCW~mRK;C{5(+7%qgiY8e26+Uo^#^T<)tz_4&WCW z0xnjzAn_iBnD+Vf{_7t%O0{O8DEm9601(kFI@B<*iKceAPp&%_OjG`8#MP~0?NZKG!oTT4z0|i(5 znt1!+Sv8tRl0!dPHhzh8kh*8}-UNQy7wl24Po72GB{bL{pD%<$JSydwNZHBHp=J?BY1*f<=Q4N} zP#2Z}-(H?!RQb07^7hMSY1OMl8i3 z;1)D22M+m@Nom`(0LreFuP(gjMUZY~O&LqJ?ur15;Tpo4%j)?F?K|Xix<|<@A&O>g zNcWHMov5~U!NJ!@&f^idvK?|3pY8dVt&H)AmP%u_{JzjKs z*Zc3^oBxhwbJ}AhKYOHge!2({ECMWOtfbV`CJa0f0Li|gymA?^X0U5s;1u#a13&_b zW$fbjZ&a;5Tk`j!;Gwj^xTGaHe%$Y(iD-NXczqyZ-)&`XjPV&L>Lx&h1hr>QYG4YU z>%qQ;Yf<`x3e)cNa6Qw5eer8hipi2G@)=zdY|7ZD`hfESQf9WY?gYyfubw~e(6Z&e z=PsikEgg=O^j~xm>(Jih+Wwrxn+)(LZ(S6cgbAoH}$x zGf8<=7jin&zb`0`XG|i5+$e7rt5-%8c3=}A$c^MuI3vJKdc){KM1P39t`DIBEC^P3 zNE7BXYRb@M#S1zkq(W5J1sKDGD?EGOAw!Dd!t0ut5!w)}GnSrBOR)##7ax&%6Jhd% zY2%vL!J+F2%%|+(q1L7(pm#ZWZ`XTFH`flffLDH-vC4kLk=@BtO(q~23uH8oA zC!sf(-LYD^(mN_jW&=4qFmXsT_?&!Tr^M~mD;f5SL9=&W1*h1{5rZ{_cR(2JS_-W8S6m*OAxiZ ziQ^!nPA%%O%d}CMTT~_KoI!;>}+$liSh5N>oGoN{4y_(m%&As zhDa$Z2RlHW#_{tChV-~k>8H!>?I{Ti{(H8aWpKX*}#Q9YrTM+?0bxf?f3-qQE)F&8c* z-Mza9sJVztz$ao&rn{almmg+Q)VZkEKF40O7=DS)3pg^D&naFu&@Hn$7*cn!x-=`R zJAWNd9a&>yQWDXw@1L$7cTB>KspQUMUBuw)Om3&eS9xB13`tP5bM7*xC}k7k`I+hnPM7(3r5)PzqoH%0oW__(UAq6tdeI_r8Wuf@Sj36e1n}xlf-1~M7|R}8Kpd|VNt`- znAws|zp~P|h}OxVxtXh_>MkEoQkDT!_%tZ*o6pny8`NTqLxE`7f2)z}z4`xM^i5$i zU=pQ=39T8+%(gsmDKkE$2N?n-VKH(T*!W0TL!7e>)OK0Pi+oK~u(7r_DzMQWgqDdp zy|uLXD5s=h4gJQRn{6<^`~CdNP4Y@Kmt8dHZZjs|kc=fm5m3DNLfw^dZ>k-&fpe8^ zEM)c;MZq@YIIzkXd7-1FqeTlV&P~kUAF9Q| z3OX-a?QL7XW(@4zBEqDwX%r7d=y9H4GAmyn2`!8)D^h|(!pzRno=*ni-NP)MJt@}6 zRmE2weqJm}`7bJiFZ2C9O(I<)`wrwuh?@dN<{Z9XDCU1*bjz0)gGNjk*AR>}9;j^c z<9Z=FNTlbm^wov%_%2!KVZ(9%Az;Z~GDdAY0we0YAc^saMS>wx9PAF7gc^m{T*nwL zIk^F4p`LOuM~pvo;MlPRpSCR~c8J+Ge}*RSVst?1Z!@v#$3+p1&V3{ntfls@URQq2 z;75166)UE*{7WpBXsBADY972fnq~_bdoLLh%t(6Wcuh4haQ+_S?d8QM?N2L8@FG3! zn`>75odQI=i@u1#xrqxF9E(3SZy60h(x9wuAa95_2hx)-{&}DTUtF~h;a=E|X$G|5 z`Di?7SGuS!ExQI+CSK{(F}(eRokG&4;W*=8Za&HI^8H)_Dpy9lYJe)8My~3LK@#@3TZzD} z`7}^5paV9N_GqWQur6CcXdBg&P(b6Hsn>C{)535zfP2kGoy#|^Ak09FSn=CvavaYv zxY>Q)f|0`ZBfvjro$QgfWG{P8_-GUf@bp+0Ugd_K@^z@c=PU?vEh~X=+IBr5>5+pQL zLTr0jB@v#`3xD*e$p1`2j?*fm@V2mQKwc)*#I}O(kk@dk#oXDmAGa~vM#5um9PV9@ zW<6Ig#h_d=uD3UPVI-%YiHb595tegpG9v}jxezBExId*Hk*4aCmG?tk451_dVGxvY z_rw9&=|qgTw>PrG#(ce8YDigblAf{H$!P^{&EOQYUn;7qzGjzJI>bfrs%5|pkxSs` z2^~9hko{Ww^+Tm!$h0{}7GXsLmXlR$1$VMExc8`09V_}iLLAqhvS_z{ zs5Jpzekj^h8Htke4c!SQH|NIvi@;fr;(%9=IQYq(pB3x=Q~y)8R2GK&xtM^8c$4Bl zPCY^;6Hzmt^G9pb#^!_F@;*MprDA|7l$D{(Uj7L+XogaNicK1T&_Ewp_?h$q^)UkF zd0!ZwFa;KH$c8X(P1FsnxR2(+hsVn%JCKmBdV8rdh7VWi*H4kdO3~GCz<@-KaA>y@ zP$lHG47vT++8do)tBKLm9dO zvr2u)-jTW}W$Z3N=6+z6LJsdZPj*HyWDd?}zH~u^^4Y@eqE=n-zKPw2_BgR zO~|Du?O#93Uyn6e45o(k+GNO?!8YWBp-JDn3|~3{z$yL)DVrDQ+Z9q1;6c*uuad&FFzJ2p zUv-T}yGOYYO6QkAMQ5F=CHh7U+$DhrIo{x7_E@yw<@cU1bLIMV-pPrUIaCH>nZ$5* zS-PQvP7$lXlzZ3oaNgLxz3tVSmcO-!4Y@t!TUCqmr>`iV`sBN$^Ppb-r_4@;EHg8C z_0Ko^uu}W5Il%#`)7MQKmaO5uw(zj?pyR*w8tk7nd-3dqy4H5SRpq-ol=#%Q^g(e-VPSkLOsfPHqK(%;({`|S~1`b_Q&L;mEp)?fq zC$t|^zX~+Q`Ru(_RO;XQ9=-{!Vgd}(B0IZAbwCTZMH38={eZm-ORuFUl@7J^w(uH3 z6S~Cv8dk_;eCn{mtEY^XE$c5WcA$7|F~UOwz&9@jm9^!`Z=HN%s8%FyVLZU1%=xRu zwVfhQDit^+qzPam=@}Z&otu!E`7?gb7v>hl438FDBU}$}q2jQo{q!)$K|rw9!3&{=5=(g}AYD9K}ctIy=+sl#_WT1C(nhJ~x*> zo??ob62z4GO68D0@Jk zhH_-{x#N4c4$HNpjl$`I)eD%}2!3i&G|$9k zpewmS!c{e!H;WZ)`=@kI=)F(NC~ri%cDYQAy*DePrt93k*-eg8?K-}vhPPk6x;8s~ z7_Ui2s##5Ic4B-Zu>QrBQ6=6-PIuqg3Zjd|m<-OPAtH<6M70$-cn0a70UEjESRu-W z8oWok(M60}>)kKTVjo{Kn~}09%wtf;>?7b*#y56@{1c}R5Qc2%lhHQS=)q6l5bY=~ z_foO;Qd4V6b#@0yR$pJm1c+}Mp(Zk9jftP)O}F3IH*@;zHX{~n(73A9<}UbeCYx2I5$Z^B(16a8~al>~d+2cv*peNk{iKm1F0NCf--6Zp83Y z?k$CZR|gA6QQ4Laz+YpkR?Y8{H5)c0Gj+2I6915okN+s^5458xfD=eH;-`VFPa~W_ zm&B!2{rV+O6;N=8o~h_SWo=88Mr$^-^PhqB4$dl_z+5;=_k<}uTy{cD@yk8wmw-ph z;&)TCQ1E*74RlmM8&pC2aR(^o?Z&#Vd{17v($R8raf9lL4=sfbG1M;0&<<0s4nXH5 z(rk+Hj-m~qLnd>!Z6>eKVhBO(>hYr$Iz;wWASEmt#LClc+}Uh+W|XGl4itkB%cSH_ z9!*fn&=(kc(xCI;@n|}Zu?3_I!A=zMu6RMbpc9H1u+8k+FO<JmP?ZZ=KmIX4a=pACdEo;pMQ;k(37?~;s7}|G~~P7I6IgB z!opvV(I;y7ZoH<*4P$@!o^Lmvj zHVBu)l3N*c1XgcOU%0z~&3UaLg2q(;N_Vw}41jXKJuF?T9+hM7DXSKsaF$Dm=4vPw z6V$&M=XT7Q$Va9u?aUpJc>>ulhdxg1C}vokHjjROA|m2T{8)_4Jxt65)OaoeM~5v*@zWBS%{)NPw2>KraD+FW3=D z-^x<$Zr!@c?Zu5rPF4a|2if=~(Mi7H3s&^?%eJWEc&R$R z5hdv?Gc$KOTGCEo(azE*f0oaQTjRX4aShGPLw*}AW_??U+7YU3#@=B9mQ%b0)HpCEA=Md|#p2-P z`i*HVkMz>!=dM9)EAvBzu|lzg38XjZ$BI(jyZfTamtVek!NRUqaA&Z{ z$W@kRxRA}zjlKC8j!yU`y`8gV$1I|!Oq%4jsMN^Dc;6OI{?1kkU^iVw*=&pJ&C*gA z`^c~xH@c1qIIEKjirbEwG^5Ii+zz)eJpb3+xpUplpVxq!XMtqYwB8TC7-`4dxU|!Z ziUxHq&S{?D_Y-}dM^1@DYf@!#)Xz^gDRU%)FI>pzS0*cf(~?x$Y7e2zkafJ+D>SE& zc4Rq|>|ZfbY3BY%A-n{*fepi-rq^0CX-%i#Xk1oC;&!1sB zd(VpB9Gw@JR(7F$RG_S8F=%(@pH4rXJb*5O6hcA-5KUs%=NnPYABTz=xK_{9o~;d@ zd4bL?031}Xku=v`!&tvyVzT7PTeZl8vv_pg@w;0o5G8i095RV?n;Eu)EH~SA3U2_~ zNY(P@^vGwLn>w@lWYV%_;nQx8?Nxtx=NVCBH*4A+`u4}T?~4Lytw3hUFbBoQ^!6=5 z3I0L9-W}WHb^OAGwus4-_ztM7$EhQ2{n?}rStbVe-uT3}) zRMf9js9e1+hmmiBSz4guI`Iskz8e7{?ZIs7v^z9}_Ho*>`K=?(yLoSbrQXb5B}wG` zrF-E$J8yV9$X!nX){YZd4~QZ9QPCd?BMDGkV(I(|(nQu~Va>gbCO7S}1W2o;<$hCD zc6IBG@MjONZc(yFJ2ZVVA~m>%8!SgAx}wArpbYtaE3`=jy>>r%XD3I z3`R!V!Rw1aHnO6eCp?tFzk`O}YuBvV3JMpY0E{$lKF5K1OU$~25zra*N*Z7D%Md&( zK9G}a$MU-qBR1pPDT-JGMzkOzPs0xx})^a;SFGi_6;)zlwN3Hn8Zbe}3Qku6erpHvlY! z>@5cgj5;$7b*i#*$e5vxCq=!IB9IK+wnK*xC@zyxq8{zjS_O>4qeNvx#_Ty_1OqM# zr1@2xU5Xv>&hM|5HM)H8KuRc*_nm%Y6|(kGT;Q+IP_qC-ypj1a3X}|Gt9G1H2_{WY zHV?r90~KQqJ{d{t(zTzfKg|KaG8D%b5sg9)f0;B;(W|gA}BW_|c;h4&PVfEPy8Q|PYkKXy#aaLDfTk`7-e z_|jlMOM7N?9k;pTKJA|!5mCB5dh}??!k%w4GuzW+mD&d!gWOlZ*xJil^3s$e+8vyg zF`yl9iw%jl0LmWx)gNHc^ePLtS+!!gdaTo3ACfB z19!s!#;SX?coXPb&R=28s2N_$;&mPa9*a%Vt*zk(cHy;sk<}ue8 zp)tLU!OWSvW`p@fV1d`=EGNt{8q2hX%!?ob^)GACwc_U698^FEHFh&z%$QqOtP4Pnlf4V6h-K7J zz96v5nrc8%QE|wtKV1;Ku8`dxH; zpmN>1btC~66>Vjzh)aP!wN<-z4M2A%l21QgDy!4wfg@xRHy!S>*V@8U2d1jP=wN7Y z8<~`p#5CM`s;HcN__nh1ft>>e4xEG#ySgN(h8C8hjHgg1uSngOVFjCuN?1(e*n%eO z+bI7vH=PV@rGOGco*eu@OPVosRU330vwrF9Y286hbuLf&lKb)Ft(268;I}1)2Wqe1 z?6g}W>n$(d*{YSU$lQf~AY9XC+kvO$g)4sZISOKLBHcp{W&E#CT{td^y^d^N%{^SY zNRW^tlN*$AHdLS;N3A)& zUs>}kc^``%B_Qf}4BEsNmNcgNHWoqx>-sK;QyiIUMVGteQvbsnSkx=9T5N`C3^U}f z0F0WPUsHP|Gb$Za+Fo?jRYYEG4Y@8gy?u1tF4|rR&z?Pd6a04403Th#59ooEk;p{R zW4i4;cG~sB^RwV%<#6!whQP(KR;MW_ezM1#D~uGlBhG9i)gX-$gfH*&@;1(Ua&BDj zU;-PAxwK^Idf{5B1TLXLv;6G7r#<=boa_mdE{q{6VwFOlw&C~cjeP@V+Eo;!BVI## zxQIR@E^h;uw9O7!v0??s*REsh!&KCqirc`~H^H?pYQH}@d*Bi3DpCqgo#yLFiv<7T|MIL_Eb3S=|6sa$C{9+ntJvzTz%!+lS!xGa2Vo-m_|3P_(G z;ph&Q()>J*$B!TorC|~%wG|!dJ_f$GFda_*=~@Tey@Pf+4@}mA8yg!-+nMh3(#HJ_Ze%U)b{kQrd5gu7ok`UpQrON;>Cy2`Ajb%k` z6FoedFuB|nvXSYQ+d}mbD+ww7{hU6?&qnWvHToXbQc|wbO$$#^JXO^v7)nWaT?T{_ zVXLX@64CmYPg1_kKf!WK9u%Jym z6?q=)kF}D6s z28@IwijiFWFIR#OiK4ZxQ(V>>Z;R;Y|7-8u!+O5||NknPjHrwhB8P-A?4w-6iRLCI_wKg%5zPCsAxvtNjzyE&M_qx7a zF567K-|yG!`FcJckNfGlX8KGRJJdaa_~}HB4W#L{=0P^Q5Aw2s9Gisv%#BTcIEZIv z{>c+3-1vynM@SV!`!;m_yt5S*uU>`o?+bCYNnb4^CFq)k9ua;ZZ+706#;V~qGN?+7 zp(sk&j6y(Va<5#8|8>gPBnS3QNNzd%l)ogKHHlYmKYZCVv59Z$PMS||3^WpHhm=m0 zJ`}Y|AQ}lm=mpy6KH)@Z&4Ll;OFj)r!>T-+5*aJQ!hV+N3|>xvA$bV)7hc5qL7Y|) zgQC%UYl8f%(?&}iltfC%xGB@S^pq6Wq3%U_(lvN_=|GoB!^vb4g!h43A_-m2@BH~~w>LJf7p3>uPT@v`9 z=hL061v8~{kZeFM>ETfuI^g+R_atKcf^WZFKeMY@zka!}`BMF{S-CMWOYxa=ZvQbVQ zRaZsq-W`bP_k{WJR9f&=QJc2n;vZX z#0lkxf{u0Q#Y2iaPug{fuzY)egYY@YmKrl|(92VL(U5-)BaHa)mXJ2b$I8eyXi)90 zfDg@Nlx2<*%pLec71cbg3PY_9pu7MQV)()pS9f630$;Y@nyDjc1hHuGUj_;kP)G8r&5DvBI*4pSR0pOZ{*_*qj5%k|Fd3jxMa zy@;KMg2v3T74QnmgkX|I)qghK)P%@^tX(_$HX@;eVETm;7MC0njz!f!?#QEJ@I=y@ zGv!~#svtujv)H&jNUxftXVQtXNxIXC%CiHSaHDgk_no_Ue`ZZHOXZTMB!S-mlhtggH-S`pk9q(00s#~PhGV#ZO8ngExPwQ;C_GKvh z%`sfMAzCw*^^W+43`T9vnvzk4b_TbH9cu(9+_L|CLPPn4HgLr-`!+)^l+#=0Y^Lt%8i%emjzZ`d%7gOJ#-WqCncVUoHy`irLRrc(}`nl|Tns4qd;QrZ!1 zaYLwNE$DnDMw?ATD9wQ+b8sg|t&HvRPj=l|_7W0BF_7md^O@<9Kz&1DdYQtCfr$K?m zJO>F_Ss34z31xRggxj9?F7iYph$#o=vgQ7BfI!%zM+@bE4?bfh(p4Oga~doi*Zf{p z2Z)wOBe9be#j(_%ps)3Y|?m-xA$pupqp1@^~`jQVEL*PCD<&+wi$+HTd|5*GJEj)N!i zN80nfrP+W`;Kq7#k2ZP`^h*@ zfH3){5O*Zrv@YMadoV^3Zr1F}FN0iDTCCiVeljz&p;_u@cQQE=jItaDD#t1YTd<4S z^9;EsTcRFfbGwXB;M)+Ly^gErgZW8git}m5rkWRJkHqjnH|q8j!}r;SA-7Big(0^ST)f ziWG7|mX4S5T=NyRbAs6^1A6t2$!^Qp{`qAQdD>xzlC~EK1rX?206LW5?pS`kJg@mR zq3O|+E|n&x>nyUk+w6jFfIoteu_*O)HJxBCdKL(frSUL>~4wcnBtY>g&3rb4-HV^83UeX{z6< z{`NKzcc-Up)hgX&__S3Y)z`isKQo^0muZYpL7-kwS;JWR^u46(t!*f&&*NlAYN+9ci;r95dFcg`(t z#WU>9$qABBMxHVEw4zPHlT+ifcqmknKSZNE0Apci6aWYA1jfuz9ZE)6*;XD7y6Q&XV#}T;U<^ zj1hLc4dTh0iyUkVxXi3s9U(%NoN-Ky#CF9mK1s)uaWoj>&u-sd6*eU9USCEbS_`4X zX~MP=IMZxQ`v_UZp`Hu%x7kljQL8(aty;Q=Lu9)U=*YRXJ?K=7f9wB(*WFI{A^fm1 zkfaTv@>s4*c3vOJ5~O+M_^-AmT7cekSE!QkGqg_Jw`EXQTXs3&_2nVtyl6a3lG%ba zU^B!=^j*U}^6Cl6?z}vC9LK1pK+s#t50PEPtrS?5<}Q~`j&&gvI9*4#h;QiRmJYJ> znhOZQyfLun9du^V#tqV8a<}JZZ8QWn{+?-^cf%xd3!hXA3%&JU62tcX^CLPE z0L$`uUVnGfx3NC{dpC1)aShTe3-7~98Ah|^vvuieb_P)%K=4*u8h}O9_zbdbn%-P2IAqh@Y-4vE#N5`B}6DgdW$p`JR3K7vVpw-`~qRgThZ`ZB%Jv#F_){VcLGFZ=J;qE-K0MdT;``}Kd{@W1IQ%|2wM z@Ti64a|R?E#g=^L3li`(l)nA?MMOupQe@=?H*b8Vt9+W;oaW9I_o4i??hzeTJNN9- zr%nw!#nD#avP;8jYHrr3P7Ei67Xx=NkQrLAe2*nqVeXB@l8)PSR5Xk&6MUcC@c^6$!~i{?M`4 z`IEP+>g1fetorH<5&w_5*>ie73A#BvCcv0Qf5Z71PzO4-mI}I*z%5(0T&)^BJ|Oc! zs(O~!gQ@baFF#+$;`efaJD035#L?2Q0*+fFZ-0n2mBVeNK_C~$V#n>H=?xIpAqIZb zAarJ5z<=6Nd9HUhELO`YP+)S*KslvxhvrVIO7Tj36&8BWVrLL{$+-$KYFgF&+A7kD zJpU=+x~zM;f2NY-(PN{_aaxR#4X+F7iESB&goFUOH@ca^^ptYxug^vKk087~JMoHD zG2DY(@Aw5(uj@IDOQrz< zJ*{YSeDL?dsu1b`;!kCqQc+oXr*Hf>h_y8prb83cqY1wb8Xxd9^eRVFp|v_0-zu44?OjT`q1&? z-y-~)H`7ND1;G!Ilzg^-klh^33kGXjtmr*HaRn{YKLC~xd5$#}3~)LFeBuG?9>LPt zb@_H$?1OKoJzkLzQnd8?$5ViqH0Dd9&zBq;tu^?gAq-(&u56X65sYhQ9| zlh8n*?K?_?TvOAQ>d3hZZ3HlJbv+VS8uQf{2GxO`vwhrZtOz1#340&XXK69KaR}lJ z))l8ON{ShJ#VxpqNvD|g_{16N8zN>KOoG5cGEYifXVMm#;%h(uE%)5e(#m9RjycjY z6;>->?^Bb$vo(VC^%~2GRu)eKq zOMU4VnD;hx$KBST!|xw}AFznag5g>-giLmtmw{l-bdx%6#0~KLgMO z9j6WD_r>9^Hj`1u!^!`QR{F)Q#;q&Ir)A6E# z><;eKN9d!33xvpE&rzGrDM@|1$?GfI+1fRWVcRP*U;j#c zhmJZvK7KohNb$Pb!E5#N8O{}5^w#^(ezrpx5iT~uU|kys3v-WK-88HjIKyyk7CXAe z7lv_jI=P+(N)5MDP4Hp{6#0Xeg2T4^Yro9js~dd79c(mop}-7iq4jJ^SL|ZDCw#_K z38lXLVYV#){OQS4Cm$MEe#R&K6*z0JW1zly^CwIQGyCc*1NMfHgMUKMPvt~f)BQ<1 z|+1pmT|SHy0$Yzn*`~)Bs-(ayzRIao1^cqa~hVvyE5jZ)8lpi zo8le9GR!9=oGj{nIkUbh^FzbiVPL7E^c$XysC%6L>zb?i=^r($L(@yL%>5Jk6ll{E z_BV}V<1J3yG@JMWXwI^~Q_dUQxaS(g>eNygJzIa(&zFFcUkVEg7fmoz79w6(nfh_i zuR-n*UsH$bpO)XX(6EM!GIC9iei3ZoIr+PtCE456>(dQ^{G2`+iG2(uH~|XnvWRq?#wx`fkdSnx~i&}-KFQfqRWqP zH8ZO&O^$B|PNo@%JV)O~Tf&0J{nFdq{Olj~&W)}bp=5jH)>_r)wVN{1Y1v(lJ?v=r z*N3u(J&teR#|-UNo!2uiYHF-*-UOSvng`i-f2H0-Hlek0!@gpM51lKW_6B*{clFF4 z^nGZk{q|)|3-LtZb4M2!zk=-d1FSQsc}fmC6XebT>h*vIfVkHZY8%UlTV-^rwlwb4 zsg)wsJc`0){jG4|Fl*qK=FuNA;s6-A_zIOkVW`=D9J1p3Tq2WRWn809=^9wlYU*~Y z4hM#fpJOz~+uIylRxo#*eoRC-oHDawRT?g?Tt;k#{U9VGKL91Y@}fFkCBf@T>57`T zaa-@NaqYYR5vswT0me4-ikgZDMimgPqIt^_W^8z+Qq#C-Dq`UE%rv#MO#kC?v44*- zW3pXi%WGb||B$yWBP%K+>)s{Wrri^3HpPgQ28bVOqDpnMD0A@1wq=QNpO#K5pBC1T zU9(2{z0Lt14JcTK_^EnBS9B#nE1C+&q|Se~X4lBSzRA^GPUy#vF1uofduxIT|HWTd z&%O`(jDl+U?E!1SUPQpksI4e;gjYoBQduAALIdSF%C#Z0s?HBpoZJE}v;G+J71@5>hBf!AO$fe4gzIfa`upEoXmmj-6 zX`^bG9B%0AKiJn_g)6lqC$S_y1N|2t=gYDT0|E^kPQ}OhSJoK4ml9M60w7Hkx_x$VHOY9c0GN6O+iUX{SmcuEa$o;)mWhY%d&i4J6}6M3%s|$0R^!~Nq5}s`#>gp}@eoq*x}+aCX+TPM&t&)8|=DO4i~Rp2Mc~ znzF1u#%NIWdyne(p6*b91%K09S~omSnl!Hd)&td(o|XWaz)3WA>#_OZs334@EF?#a z8of)A--nwA52w4n#@d!*cjXzZB3Pvxq&DD!+wq!d2Z4Jel#T2%bQ`}g`RKK8zxcJE zi{`Woi|0k%8!zk-Ifb#xid~LLHSZUN_c6el$POir9LkdL4!cnGTcf#0*iv`uLKIzK zk!Rf~^?bZYpRiqEF5)kPT~o4av?YYIS;7V_Hy_XHi*szO$cQWTv2>p{e&CE{9$lFt z4untf1l9T*bO-54ONA^;#~5`N+`WH1_T8zC6(zYYivDz%W!8%!9;oP76;w$)A?oIG zke9kFU*rmsm&^<0LO*hxoZo_Wj)C8n{N);Tdp!D%AQ;54+M6K_-6>9Wr&7;8J+i*S z5X_MzpvS~ih6JCu65h$T;Q35dqVWXh%rjHGFjWJm1=IH0;H$wmr3Ava7tgj!QH#)0 zS#a_GVSuivA=MRUQick0KY22a0GyMjXCv=RF)c2P$=Y-e_|?Gb<46%3cP?kMZH7 zU)cq?1hGm8w+AoIWZH3$ciXdAZ#bMG;p3@mxiIH!yo^h1)fQT7ZMhJtK40AW%A&WsxjeLp#$y zRM*@vI=o0z|5Tbj*tfJ|dAuh=aEa@vH1L3SeX ziNZK&hv$nR5v5G6Z2I{^YVKStS7?D9lLwszs8Kp1pe&YA{jbR!JbY)+vj-#`4i1_ZP z5~sZjfZq&Hwnr7!k$W}_QQxoN0YjoyBE(AY3Pcf^UQeHhuy1lq(@(?NyGZbnNt}S__*a;bQ{ERO)N^0blm~JuRBN@z z;3%VKoUb+SxECYAEl*Y5$C#l*tF7v*9>n&4d;8A&po;+k$=71MURGBRP(m3bw$ojU zPv&zHVU$p`OS8~W{$VypojQ{~)ipHaZQRMxJ$Uq2%cFnH`O5SOW+p+<@{hVU{Dw^9wHA1} zqrQ7_0CN|B&Gf?~d`{l?f*cC|tk+TFAA0W7&GWkE`F2C%cOG45bBNfMtk@Tern+Bi zCMQhl^QCTDse``#V7mp9)w1O9_le00)lE= zX5a9vuh((&@Ikdwx#&PFgOe1^@(F!W(An#5XaCC`Kh~uLlxM!ZpG$RJRnWY?6XThP zw1ib7qLCj_RXXq0O$!t*)RABW7?!Im6{f#^>t3vSoTr1j6PX8*A6ZUsJ*qE8CuK>- zK0;0{MQA%HhKsA7evZ6@6Q_3ogkdJOd(gPa>%pPX%;)`EG~v$*6XhsD=V*>Y>Q;Un z0HP!=bhJt+p2C*w+@0`F+eADkBB;lWvF_u$XE(a&t8`VpxFDe~wzt{~>|Ormrai*9 zb1QCT3%XoK2UV6}=i7>YuTbvsnF31krJC8k&6 z*Eo6UcTODm*H_1cCo&jnnG^0m)b$II6I8T0_**4i%nrsosejZLMdCAaQBquw5U^nj zLqL)^J4wy%$t zM+q+P3*UDc%uhUtFcQQsi{Nm|$XYE?yL2&*xGKC1Bd`v9?e84&F!Jx~gXaDjSUog mH2BAldmZJ^{{Q{20lObsZ8NDIUM_EA!q<~+&)6*Z{(k^Z+6T1& literal 0 HcmV?d00001 From 252b7b2de9de9b32ead7d48765029319c2ad5d4b Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Tue, 16 Nov 2021 14:42:49 +0200 Subject: [PATCH 5/6] WIP revert with --soft --- examples/use.rs | 6 +++++- src/inference.rs | 1 + src/set.rs | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/use.rs b/examples/use.rs index 02304b8..6e48fcd 100644 --- a/examples/use.rs +++ b/examples/use.rs @@ -39,6 +39,7 @@ fn main() { let (x_dest, x, pitch_output) = { let x_dest = UniversalSet::new("x_dest") + .with_domain(vec![-2.0, -1.0, 0.0, 1.0, 2.0]) .add_set("NB", MembershipFactory::triangular(-2.0, -2.0, -1.0)) .add_set("NS", MembershipFactory::triangular(-2.0, -1.0, 0.0)) .add_set("Z", MembershipFactory::triangular(-1.0, 0.0, 1.0)) @@ -46,6 +47,7 @@ fn main() { .add_set("PB", MembershipFactory::triangular(1.0, 2.0, 2.0)); let x = UniversalSet::new("x") + .with_domain(vec![-2.0, -1.0, 0.0, 1.0, 2.0]) .add_set("NB", MembershipFactory::triangular(-2.0, -2.0, -1.0)) .add_set("NS", MembershipFactory::triangular(-2.0, -1.0, 0.0)) .add_set("Z", MembershipFactory::triangular(-1.0, 0.0, 1.0)) @@ -53,12 +55,14 @@ fn main() { .add_set("PB", MembershipFactory::triangular(1.0, 2.0, 2.0)); let pitch_output = UniversalSet::new("pitch_output") + .with_domain(vec![-0.5, -0.25, 0.0, 0.25, 0.5]) .add_set("NB", MembershipFactory::singleton(-0.5)) .add_set("NS", MembershipFactory::singleton(-0.25)) .add_set("Z", MembershipFactory::singleton(0.0)) .add_set("PS", MembershipFactory::singleton(0.25)) .add_set("PB", MembershipFactory::singleton(0.5)); - (x_dest, x, pitch_output) + + (x_dest, x, pitch_output) }; let mut universes = HashMap::default(); diff --git a/src/inference.rs b/src/inference.rs index 9821808..5d6a182 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -75,6 +75,7 @@ impl InferenceMachine { options: &self.options, }; let result = self.rules.compute_all(&mut context); + dbg!(&result); (result.name.clone(), (*self.options.defuzz_func)(&result)) } diff --git a/src/set.rs b/src/set.rs index b2e2a92..9465586 100644 --- a/src/set.rs +++ b/src/set.rs @@ -92,10 +92,17 @@ impl UniversalSet { } /// Sets the domain of the universal set. + #[deprecated = "Use chainable method with_domain()"] pub fn set_domain(&mut self, domain: Vec) { self.domain = domain; } + /// Chain-able method for overriding the `domain` of the universal set + pub fn with_domain(mut self, domain: Vec) -> Self { + self.domain = domain; + self + } + /// Constructs the child fuzzy set with given membership. pub fn create_set(&mut self, name: &str, membership: Box) { if !self.sets.contains_key(name) { From e82be850c839c7a413760cf5b25a3eeea5bc8713 Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Thu, 16 Dec 2021 17:42:31 +0200 Subject: [PATCH 6/6] derive Debug & fix doc test --- examples/use.rs | 4 ++++ src/functions.rs | 2 +- src/inference.rs | 20 ++++++++++++++++++++ src/ops.rs | 8 +++++--- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/examples/use.rs b/examples/use.rs index 6e48fcd..2a35195 100644 --- a/examples/use.rs +++ b/examples/use.rs @@ -89,7 +89,11 @@ fn main() { .into_iter() .collect(); + inference.update(input); + + dbg!(&inference); + // NB of x_dest // NS of x // Expected: NS diff --git a/src/functions.rs b/src/functions.rs index c665d06..12f2368 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -82,7 +82,7 @@ impl MembershipFactory { /// /// ```rust /// use fuzzy_logic::{ -/// functions::{DefuzzFactory, MembershipFactory, +/// functions::{DefuzzFactory, MembershipFactory}, /// set::Set /// }; /// diff --git a/src/inference.rs b/src/inference.rs index 5d6a182..5a7e42e 100644 --- a/src/inference.rs +++ b/src/inference.rs @@ -9,7 +9,9 @@ use crate::functions::DefuzzFunc; use crate::ops::{LogicOps, SetOps}; use crate::rules::RuleSet; use crate::set::UniversalSet; +use std::any::{type_name, TypeId}; use std::collections::HashMap; +use std::fmt; /// Structure which contains the implementation of fuzzy logic operations. pub struct InferenceOptions { @@ -21,6 +23,23 @@ pub struct InferenceOptions { pub defuzz_func: Box, } +impl fmt::Debug for InferenceOptions { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InferenceOptions") + .field("logic_ops", &self.logic_ops) + .field("set_ops", &self.set_ops) + .field( + "defuzz_func", + &format!( + "{} & {:?}", + type_name::(), + TypeId::of::() + ), + ) + .finish() + } +} + /// Structure which contains the evaluation context. Passed to `RuleSet`. pub struct InferenceContext<'a> { /// Reference to the Key-Value container, which contains input variables' values. @@ -32,6 +51,7 @@ pub struct InferenceContext<'a> { } /// Structure which contains the implementation of the fuzzy logic inference mechanism. +#[derive(Debug)] pub struct InferenceMachine { /// List of rules to be evaluated. pub rules: RuleSet, diff --git a/src/ops.rs b/src/ops.rs index 7c02ec3..653b190 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -4,10 +4,10 @@ //! //! User can implement his own operations by implementing `LogicOps` or `SetOps` traits. use crate::set::Set; -use std::{cell::RefCell, collections::HashMap}; +use std::{cell::RefCell, collections::HashMap, fmt::Debug}; /// Abstraction over set operations. Doesn't contain default implementation. -pub trait SetOps { +pub trait SetOps: Debug { /// Union of fuzzy sets. fn union(&self, left: &mut Set, right: &mut Set) -> Set; /// Intersection of fuzzy sets. @@ -15,6 +15,7 @@ pub trait SetOps { } /// Implementation of commonly used minimax set operations. +#[derive(Debug)] pub struct MinMaxOps; impl SetOps for MinMaxOps { @@ -59,7 +60,7 @@ impl SetOps for MinMaxOps { } /// Abstraction over fuzzy logic operations. Doesn't contain default implementation. -pub trait LogicOps { +pub trait LogicOps: Debug { /// Fuzzy logic AND operation. fn and(&self, left: f32, right: f32) -> f32; /// Fuzzy logic OR operation. @@ -69,6 +70,7 @@ pub trait LogicOps { } /// Implementation of commonly used Zadeh fuzzy logic operations. +#[derive(Debug)] pub struct ZadehOps; impl LogicOps for ZadehOps {