From 0e95146f7a61cd3b4e37767eebb95c8fb2d0b1bd Mon Sep 17 00:00:00 2001 From: FiveMovesAhead Date: Thu, 16 Jan 2025 21:06:10 +0000 Subject: [PATCH] Compiled satisfiability/walk_sat_adapt_tabu --- tig-algorithms/src/satisfiability/mod.rs | 3 +- tig-algorithms/src/satisfiability/template.rs | 26 +-- .../benchmarker_outbound.rs | 167 ++++++++++++++++++ .../walk_sat_adapt_tabu/commercial.rs | 167 ++++++++++++++++++ .../walk_sat_adapt_tabu/inbound.rs | 167 ++++++++++++++++++ .../walk_sat_adapt_tabu/innovator_outbound.rs | 167 ++++++++++++++++++ .../satisfiability/walk_sat_adapt_tabu/mod.rs | 4 + .../walk_sat_adapt_tabu/open_data.rs | 167 ++++++++++++++++++ .../satisfiability/walk_sat_adapt_tabu.wasm | Bin 0 -> 159004 bytes 9 files changed, 843 insertions(+), 25 deletions(-) create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/benchmarker_outbound.rs create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/commercial.rs create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/inbound.rs create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/innovator_outbound.rs create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/mod.rs create mode 100644 tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/open_data.rs create mode 100644 tig-algorithms/wasm/satisfiability/walk_sat_adapt_tabu.wasm diff --git a/tig-algorithms/src/satisfiability/mod.rs b/tig-algorithms/src/satisfiability/mod.rs index 22d6805c..ff8de958 100644 --- a/tig-algorithms/src/satisfiability/mod.rs +++ b/tig-algorithms/src/satisfiability/mod.rs @@ -16,7 +16,8 @@ // c001_a009 -// c001_a010 +pub mod walk_sat_adapt_tabu; +pub use walk_sat_adapt_tabu as c001_a010; // c001_a011 diff --git a/tig-algorithms/src/satisfiability/template.rs b/tig-algorithms/src/satisfiability/template.rs index c2d71530..f11c4cd6 100644 --- a/tig-algorithms/src/satisfiability/template.rs +++ b/tig-algorithms/src/satisfiability/template.rs @@ -1,11 +1,7 @@ /*! -Copyright [year copyright work created] [name of copyright owner] +Copyright [yyyy] [name of copyright owner] -Identity of Submitter [name of person or entity that submits the Work to TIG] - -UAI [UAI (if applicable)] - -Licensed under the TIG Inbound Game License v2.0 or (at your option) any later +Licensed under the TIG Inbound Game License v1.0 or (at your option) any later version (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -17,24 +13,6 @@ CONDITIONS OF ANY KIND, either express or implied. See the License for the speci language governing permissions and limitations under the License. */ -// REMOVE BELOW SECTION IF UNUSED -/* -REFERENCES AND ACKNOWLEDGMENTS - -This implementation is based on or inspired by existing work. Citations and -acknowledgments below: - -1. Academic Papers: - - [Author(s), "Paper Title", DOI (if available)] - -2. Code References: - - [Author(s), URL] - -3. Other: - - [Author(s), Details] - -*/ - // TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge use anyhow::{anyhow, Result}; use tig_challenges::satisfiability::{Challenge, Solution}; diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/benchmarker_outbound.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/benchmarker_outbound.rs new file mode 100644 index 00000000..710d7268 --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/benchmarker_outbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 Louis Silva + +Licensed under the TIG Benchmarker Outbound Game License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. + */ + +// TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge +use anyhow::Result; +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; +use rand::seq::IteratorRandom; +use std::collections::{HashSet, VecDeque}; +use tig_challenges::satisfiability::*; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let mut rng = StdRng::seed_from_u64(u64::from_le_bytes(challenge.seed[..8].try_into().unwrap()) as u64); + let num_variables = challenge.difficulty.num_variables; + let max_flips = 1000; + let initial_noise: f64 = 0.3; + let mut noise: f64 = initial_noise; + let mut variables: Vec = (0..num_variables).map(|_| rng.gen()).collect(); + let mut best_solution: Option = None; + let mut best_unsatisfied = usize::MAX; + let mut clause_weights: Vec = vec![1; challenge.clauses.len()]; + let mut unsatisfied_clauses: HashSet = challenge.clauses.iter() + .enumerate() + .filter_map(|(i, clause)| if !clause_satisfied(clause, &variables) { Some(i) } else { None }) + .collect(); + let mut tabu_list: VecDeque = VecDeque::with_capacity(10); + let mut tabu_tenure = 10; + + for flip in 0..max_flips { + let num_unsatisfied = unsatisfied_clauses.len(); + + // Update the best solution found so far + if num_unsatisfied < best_unsatisfied { + best_unsatisfied = num_unsatisfied; + best_solution = Some(Solution { variables: variables.clone() }); + + if num_unsatisfied == 0 { + return Ok(best_solution); + } + } + + // Adaptive noise adjustment based on progress + if num_unsatisfied == best_unsatisfied { + noise = (noise + 0.005).min(1.0); + } else { + noise = (noise - 0.01).max(0.1); + } + + // Dynamic adjustment of tabu tenure + tabu_tenure = (num_unsatisfied as f64 / best_unsatisfied as f64 * 10.0).max(5.0).min(20.0) as usize; + + // Choose an unsatisfied clause + if let Some(&clause_idx) = unsatisfied_clauses.iter().choose(&mut rng) { + let clause = &challenge.clauses[clause_idx]; + + // Flip a variable with a heuristic + if rng.gen::() < noise { + // Random flip + if let Some(&literal) = clause.iter().choose(&mut rng) { + let var_idx = literal.abs() as usize - 1; + if !tabu_list.contains(&var_idx) { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + } else { + // Greedy flip + let mut best_var = None; + let mut best_reduction = usize::MAX; + for &literal in clause { + let var_idx = literal.abs() as usize - 1; + if tabu_list.contains(&var_idx) { + continue; + } + variables[var_idx] = !variables[var_idx]; // Tentative flip + let reduction = challenge.clauses.iter().enumerate() + .filter(|(i, clause)| !clause_satisfied(clause, &variables) && clause_weights[*i] > 0) + .count(); + variables[var_idx] = !variables[var_idx]; // Revert flip + + if reduction < best_reduction { + best_reduction = reduction; + best_var = Some(var_idx); + } + } + + if let Some(var_idx) = best_var { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + + // Adaptive weight update for unsatisfied clauses + for &clause_idx in &unsatisfied_clauses { + clause_weights[clause_idx] += 1 + (best_unsatisfied.saturating_sub(num_unsatisfied)) / best_unsatisfied; + } + } + } + + Ok(best_solution) +} + +fn clause_satisfied(clause: &[i32], variables: &[bool]) -> bool { + clause.iter().any(|&literal| { + let var_idx = literal.abs() as usize - 1; + (literal > 0 && variables[var_idx]) || (literal < 0 && !variables[var_idx]) + }) +} + +fn update_unsatisfied_clauses( + unsatisfied_clauses: &mut HashSet, + clauses: &[Vec], + flipped_var: usize, + variables: &[bool] +) { + for (i, clause) in clauses.iter().enumerate() { + if clause.iter().any(|&literal| literal.abs() as usize - 1 == flipped_var) { + if clause_satisfied(clause, variables) { + unsatisfied_clauses.remove(&i); + } else { + unsatisfied_clauses.insert(i); + } + } + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/commercial.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/commercial.rs new file mode 100644 index 00000000..cd38db81 --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/commercial.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 Louis Silva + +Licensed under the TIG Commercial License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. + */ + +// TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge +use anyhow::Result; +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; +use rand::seq::IteratorRandom; +use std::collections::{HashSet, VecDeque}; +use tig_challenges::satisfiability::*; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let mut rng = StdRng::seed_from_u64(u64::from_le_bytes(challenge.seed[..8].try_into().unwrap()) as u64); + let num_variables = challenge.difficulty.num_variables; + let max_flips = 1000; + let initial_noise: f64 = 0.3; + let mut noise: f64 = initial_noise; + let mut variables: Vec = (0..num_variables).map(|_| rng.gen()).collect(); + let mut best_solution: Option = None; + let mut best_unsatisfied = usize::MAX; + let mut clause_weights: Vec = vec![1; challenge.clauses.len()]; + let mut unsatisfied_clauses: HashSet = challenge.clauses.iter() + .enumerate() + .filter_map(|(i, clause)| if !clause_satisfied(clause, &variables) { Some(i) } else { None }) + .collect(); + let mut tabu_list: VecDeque = VecDeque::with_capacity(10); + let mut tabu_tenure = 10; + + for flip in 0..max_flips { + let num_unsatisfied = unsatisfied_clauses.len(); + + // Update the best solution found so far + if num_unsatisfied < best_unsatisfied { + best_unsatisfied = num_unsatisfied; + best_solution = Some(Solution { variables: variables.clone() }); + + if num_unsatisfied == 0 { + return Ok(best_solution); + } + } + + // Adaptive noise adjustment based on progress + if num_unsatisfied == best_unsatisfied { + noise = (noise + 0.005).min(1.0); + } else { + noise = (noise - 0.01).max(0.1); + } + + // Dynamic adjustment of tabu tenure + tabu_tenure = (num_unsatisfied as f64 / best_unsatisfied as f64 * 10.0).max(5.0).min(20.0) as usize; + + // Choose an unsatisfied clause + if let Some(&clause_idx) = unsatisfied_clauses.iter().choose(&mut rng) { + let clause = &challenge.clauses[clause_idx]; + + // Flip a variable with a heuristic + if rng.gen::() < noise { + // Random flip + if let Some(&literal) = clause.iter().choose(&mut rng) { + let var_idx = literal.abs() as usize - 1; + if !tabu_list.contains(&var_idx) { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + } else { + // Greedy flip + let mut best_var = None; + let mut best_reduction = usize::MAX; + for &literal in clause { + let var_idx = literal.abs() as usize - 1; + if tabu_list.contains(&var_idx) { + continue; + } + variables[var_idx] = !variables[var_idx]; // Tentative flip + let reduction = challenge.clauses.iter().enumerate() + .filter(|(i, clause)| !clause_satisfied(clause, &variables) && clause_weights[*i] > 0) + .count(); + variables[var_idx] = !variables[var_idx]; // Revert flip + + if reduction < best_reduction { + best_reduction = reduction; + best_var = Some(var_idx); + } + } + + if let Some(var_idx) = best_var { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + + // Adaptive weight update for unsatisfied clauses + for &clause_idx in &unsatisfied_clauses { + clause_weights[clause_idx] += 1 + (best_unsatisfied.saturating_sub(num_unsatisfied)) / best_unsatisfied; + } + } + } + + Ok(best_solution) +} + +fn clause_satisfied(clause: &[i32], variables: &[bool]) -> bool { + clause.iter().any(|&literal| { + let var_idx = literal.abs() as usize - 1; + (literal > 0 && variables[var_idx]) || (literal < 0 && !variables[var_idx]) + }) +} + +fn update_unsatisfied_clauses( + unsatisfied_clauses: &mut HashSet, + clauses: &[Vec], + flipped_var: usize, + variables: &[bool] +) { + for (i, clause) in clauses.iter().enumerate() { + if clause.iter().any(|&literal| literal.abs() as usize - 1 == flipped_var) { + if clause_satisfied(clause, variables) { + unsatisfied_clauses.remove(&i); + } else { + unsatisfied_clauses.insert(i); + } + } + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/inbound.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/inbound.rs new file mode 100644 index 00000000..dfe47126 --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/inbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 Louis Silva + +Licensed under the TIG Inbound Game License v1.0 or (at your option) any later +version (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. + */ + +// TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge +use anyhow::Result; +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; +use rand::seq::IteratorRandom; +use std::collections::{HashSet, VecDeque}; +use tig_challenges::satisfiability::*; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let mut rng = StdRng::seed_from_u64(u64::from_le_bytes(challenge.seed[..8].try_into().unwrap()) as u64); + let num_variables = challenge.difficulty.num_variables; + let max_flips = 1000; + let initial_noise: f64 = 0.3; + let mut noise: f64 = initial_noise; + let mut variables: Vec = (0..num_variables).map(|_| rng.gen()).collect(); + let mut best_solution: Option = None; + let mut best_unsatisfied = usize::MAX; + let mut clause_weights: Vec = vec![1; challenge.clauses.len()]; + let mut unsatisfied_clauses: HashSet = challenge.clauses.iter() + .enumerate() + .filter_map(|(i, clause)| if !clause_satisfied(clause, &variables) { Some(i) } else { None }) + .collect(); + let mut tabu_list: VecDeque = VecDeque::with_capacity(10); + let mut tabu_tenure = 10; + + for flip in 0..max_flips { + let num_unsatisfied = unsatisfied_clauses.len(); + + // Update the best solution found so far + if num_unsatisfied < best_unsatisfied { + best_unsatisfied = num_unsatisfied; + best_solution = Some(Solution { variables: variables.clone() }); + + if num_unsatisfied == 0 { + return Ok(best_solution); + } + } + + // Adaptive noise adjustment based on progress + if num_unsatisfied == best_unsatisfied { + noise = (noise + 0.005).min(1.0); + } else { + noise = (noise - 0.01).max(0.1); + } + + // Dynamic adjustment of tabu tenure + tabu_tenure = (num_unsatisfied as f64 / best_unsatisfied as f64 * 10.0).max(5.0).min(20.0) as usize; + + // Choose an unsatisfied clause + if let Some(&clause_idx) = unsatisfied_clauses.iter().choose(&mut rng) { + let clause = &challenge.clauses[clause_idx]; + + // Flip a variable with a heuristic + if rng.gen::() < noise { + // Random flip + if let Some(&literal) = clause.iter().choose(&mut rng) { + let var_idx = literal.abs() as usize - 1; + if !tabu_list.contains(&var_idx) { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + } else { + // Greedy flip + let mut best_var = None; + let mut best_reduction = usize::MAX; + for &literal in clause { + let var_idx = literal.abs() as usize - 1; + if tabu_list.contains(&var_idx) { + continue; + } + variables[var_idx] = !variables[var_idx]; // Tentative flip + let reduction = challenge.clauses.iter().enumerate() + .filter(|(i, clause)| !clause_satisfied(clause, &variables) && clause_weights[*i] > 0) + .count(); + variables[var_idx] = !variables[var_idx]; // Revert flip + + if reduction < best_reduction { + best_reduction = reduction; + best_var = Some(var_idx); + } + } + + if let Some(var_idx) = best_var { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + + // Adaptive weight update for unsatisfied clauses + for &clause_idx in &unsatisfied_clauses { + clause_weights[clause_idx] += 1 + (best_unsatisfied.saturating_sub(num_unsatisfied)) / best_unsatisfied; + } + } + } + + Ok(best_solution) +} + +fn clause_satisfied(clause: &[i32], variables: &[bool]) -> bool { + clause.iter().any(|&literal| { + let var_idx = literal.abs() as usize - 1; + (literal > 0 && variables[var_idx]) || (literal < 0 && !variables[var_idx]) + }) +} + +fn update_unsatisfied_clauses( + unsatisfied_clauses: &mut HashSet, + clauses: &[Vec], + flipped_var: usize, + variables: &[bool] +) { + for (i, clause) in clauses.iter().enumerate() { + if clause.iter().any(|&literal| literal.abs() as usize - 1 == flipped_var) { + if clause_satisfied(clause, variables) { + unsatisfied_clauses.remove(&i); + } else { + unsatisfied_clauses.insert(i); + } + } + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/innovator_outbound.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/innovator_outbound.rs new file mode 100644 index 00000000..29fe0b98 --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/innovator_outbound.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 Louis Silva + +Licensed under the TIG Innovator Outbound Game License v1.0 (the "License"); you +may not use this file except in compliance with the License. You may obtain a copy +of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. + */ + +// TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge +use anyhow::Result; +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; +use rand::seq::IteratorRandom; +use std::collections::{HashSet, VecDeque}; +use tig_challenges::satisfiability::*; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let mut rng = StdRng::seed_from_u64(u64::from_le_bytes(challenge.seed[..8].try_into().unwrap()) as u64); + let num_variables = challenge.difficulty.num_variables; + let max_flips = 1000; + let initial_noise: f64 = 0.3; + let mut noise: f64 = initial_noise; + let mut variables: Vec = (0..num_variables).map(|_| rng.gen()).collect(); + let mut best_solution: Option = None; + let mut best_unsatisfied = usize::MAX; + let mut clause_weights: Vec = vec![1; challenge.clauses.len()]; + let mut unsatisfied_clauses: HashSet = challenge.clauses.iter() + .enumerate() + .filter_map(|(i, clause)| if !clause_satisfied(clause, &variables) { Some(i) } else { None }) + .collect(); + let mut tabu_list: VecDeque = VecDeque::with_capacity(10); + let mut tabu_tenure = 10; + + for flip in 0..max_flips { + let num_unsatisfied = unsatisfied_clauses.len(); + + // Update the best solution found so far + if num_unsatisfied < best_unsatisfied { + best_unsatisfied = num_unsatisfied; + best_solution = Some(Solution { variables: variables.clone() }); + + if num_unsatisfied == 0 { + return Ok(best_solution); + } + } + + // Adaptive noise adjustment based on progress + if num_unsatisfied == best_unsatisfied { + noise = (noise + 0.005).min(1.0); + } else { + noise = (noise - 0.01).max(0.1); + } + + // Dynamic adjustment of tabu tenure + tabu_tenure = (num_unsatisfied as f64 / best_unsatisfied as f64 * 10.0).max(5.0).min(20.0) as usize; + + // Choose an unsatisfied clause + if let Some(&clause_idx) = unsatisfied_clauses.iter().choose(&mut rng) { + let clause = &challenge.clauses[clause_idx]; + + // Flip a variable with a heuristic + if rng.gen::() < noise { + // Random flip + if let Some(&literal) = clause.iter().choose(&mut rng) { + let var_idx = literal.abs() as usize - 1; + if !tabu_list.contains(&var_idx) { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + } else { + // Greedy flip + let mut best_var = None; + let mut best_reduction = usize::MAX; + for &literal in clause { + let var_idx = literal.abs() as usize - 1; + if tabu_list.contains(&var_idx) { + continue; + } + variables[var_idx] = !variables[var_idx]; // Tentative flip + let reduction = challenge.clauses.iter().enumerate() + .filter(|(i, clause)| !clause_satisfied(clause, &variables) && clause_weights[*i] > 0) + .count(); + variables[var_idx] = !variables[var_idx]; // Revert flip + + if reduction < best_reduction { + best_reduction = reduction; + best_var = Some(var_idx); + } + } + + if let Some(var_idx) = best_var { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + + // Adaptive weight update for unsatisfied clauses + for &clause_idx in &unsatisfied_clauses { + clause_weights[clause_idx] += 1 + (best_unsatisfied.saturating_sub(num_unsatisfied)) / best_unsatisfied; + } + } + } + + Ok(best_solution) +} + +fn clause_satisfied(clause: &[i32], variables: &[bool]) -> bool { + clause.iter().any(|&literal| { + let var_idx = literal.abs() as usize - 1; + (literal > 0 && variables[var_idx]) || (literal < 0 && !variables[var_idx]) + }) +} + +fn update_unsatisfied_clauses( + unsatisfied_clauses: &mut HashSet, + clauses: &[Vec], + flipped_var: usize, + variables: &[bool] +) { + for (i, clause) in clauses.iter().enumerate() { + if clause.iter().any(|&literal| literal.abs() as usize - 1 == flipped_var) { + if clause_satisfied(clause, variables) { + unsatisfied_clauses.remove(&i); + } else { + unsatisfied_clauses.insert(i); + } + } + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/mod.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/mod.rs new file mode 100644 index 00000000..fcec9672 --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/mod.rs @@ -0,0 +1,4 @@ +mod benchmarker_outbound; +pub use benchmarker_outbound::solve_challenge; +#[cfg(feature = "cuda")] +pub use benchmarker_outbound::{cuda_solve_challenge, KERNEL}; \ No newline at end of file diff --git a/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/open_data.rs b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/open_data.rs new file mode 100644 index 00000000..9987afef --- /dev/null +++ b/tig-algorithms/src/satisfiability/walk_sat_adapt_tabu/open_data.rs @@ -0,0 +1,167 @@ +/*! +Copyright 2024 Louis Silva + +Licensed under the TIG Open Data License v1.0 or (at your option) any later version +(the "License"); you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +https://github.com/tig-foundation/tig-monorepo/tree/main/docs/licenses + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. + */ + +// TIG's UI uses the pattern `tig_challenges::` to automatically detect your algorithm's challenge +use anyhow::Result; +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; +use rand::seq::IteratorRandom; +use std::collections::{HashSet, VecDeque}; +use tig_challenges::satisfiability::*; + +pub fn solve_challenge(challenge: &Challenge) -> Result> { + let mut rng = StdRng::seed_from_u64(u64::from_le_bytes(challenge.seed[..8].try_into().unwrap()) as u64); + let num_variables = challenge.difficulty.num_variables; + let max_flips = 1000; + let initial_noise: f64 = 0.3; + let mut noise: f64 = initial_noise; + let mut variables: Vec = (0..num_variables).map(|_| rng.gen()).collect(); + let mut best_solution: Option = None; + let mut best_unsatisfied = usize::MAX; + let mut clause_weights: Vec = vec![1; challenge.clauses.len()]; + let mut unsatisfied_clauses: HashSet = challenge.clauses.iter() + .enumerate() + .filter_map(|(i, clause)| if !clause_satisfied(clause, &variables) { Some(i) } else { None }) + .collect(); + let mut tabu_list: VecDeque = VecDeque::with_capacity(10); + let mut tabu_tenure = 10; + + for flip in 0..max_flips { + let num_unsatisfied = unsatisfied_clauses.len(); + + // Update the best solution found so far + if num_unsatisfied < best_unsatisfied { + best_unsatisfied = num_unsatisfied; + best_solution = Some(Solution { variables: variables.clone() }); + + if num_unsatisfied == 0 { + return Ok(best_solution); + } + } + + // Adaptive noise adjustment based on progress + if num_unsatisfied == best_unsatisfied { + noise = (noise + 0.005).min(1.0); + } else { + noise = (noise - 0.01).max(0.1); + } + + // Dynamic adjustment of tabu tenure + tabu_tenure = (num_unsatisfied as f64 / best_unsatisfied as f64 * 10.0).max(5.0).min(20.0) as usize; + + // Choose an unsatisfied clause + if let Some(&clause_idx) = unsatisfied_clauses.iter().choose(&mut rng) { + let clause = &challenge.clauses[clause_idx]; + + // Flip a variable with a heuristic + if rng.gen::() < noise { + // Random flip + if let Some(&literal) = clause.iter().choose(&mut rng) { + let var_idx = literal.abs() as usize - 1; + if !tabu_list.contains(&var_idx) { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + } else { + // Greedy flip + let mut best_var = None; + let mut best_reduction = usize::MAX; + for &literal in clause { + let var_idx = literal.abs() as usize - 1; + if tabu_list.contains(&var_idx) { + continue; + } + variables[var_idx] = !variables[var_idx]; // Tentative flip + let reduction = challenge.clauses.iter().enumerate() + .filter(|(i, clause)| !clause_satisfied(clause, &variables) && clause_weights[*i] > 0) + .count(); + variables[var_idx] = !variables[var_idx]; // Revert flip + + if reduction < best_reduction { + best_reduction = reduction; + best_var = Some(var_idx); + } + } + + if let Some(var_idx) = best_var { + variables[var_idx] = !variables[var_idx]; + update_unsatisfied_clauses(&mut unsatisfied_clauses, &challenge.clauses, var_idx, &variables); + tabu_list.push_back(var_idx); + if tabu_list.len() > tabu_tenure { + tabu_list.pop_front(); + } + } + } + + // Adaptive weight update for unsatisfied clauses + for &clause_idx in &unsatisfied_clauses { + clause_weights[clause_idx] += 1 + (best_unsatisfied.saturating_sub(num_unsatisfied)) / best_unsatisfied; + } + } + } + + Ok(best_solution) +} + +fn clause_satisfied(clause: &[i32], variables: &[bool]) -> bool { + clause.iter().any(|&literal| { + let var_idx = literal.abs() as usize - 1; + (literal > 0 && variables[var_idx]) || (literal < 0 && !variables[var_idx]) + }) +} + +fn update_unsatisfied_clauses( + unsatisfied_clauses: &mut HashSet, + clauses: &[Vec], + flipped_var: usize, + variables: &[bool] +) { + for (i, clause) in clauses.iter().enumerate() { + if clause.iter().any(|&literal| literal.abs() as usize - 1 == flipped_var) { + if clause_satisfied(clause, variables) { + unsatisfied_clauses.remove(&i); + } else { + unsatisfied_clauses.insert(i); + } + } + } +} + +#[cfg(feature = "cuda")] +mod gpu_optimisation { + use super::*; + use cudarc::driver::*; + use std::{collections::HashMap, sync::Arc}; + use tig_challenges::CudaKernel; + + // set KERNEL to None if algorithm only has a CPU implementation + pub const KERNEL: Option = None; + + // Important! your GPU and CPU version of the algorithm should return the same result + pub fn cuda_solve_challenge( + challenge: &Challenge, + dev: &Arc, + mut funcs: HashMap<&'static str, CudaFunction>, + ) -> anyhow::Result> { + solve_challenge(challenge) + } +} +#[cfg(feature = "cuda")] +pub use gpu_optimisation::{cuda_solve_challenge, KERNEL}; diff --git a/tig-algorithms/wasm/satisfiability/walk_sat_adapt_tabu.wasm b/tig-algorithms/wasm/satisfiability/walk_sat_adapt_tabu.wasm new file mode 100644 index 0000000000000000000000000000000000000000..260690cd7e4f96ca81e0cb6109e5dffd12faa076 GIT binary patch literal 159004 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

>Nlj%U5|9vxl~P^+pXymH8YzWY5H)LqNLcG= z1IQ2wYY_>fE3x(3QW%^i2=K|c#>zDesq1FqyWF~?;J@b9_C*3UhD1W`+#-P+8ArwT zaGYefv3&!!w|5bLV0&0>mDpcAhnozZnk%?w3l2puR&WArZ@woqMq@75)@n--4Gq9k zVkK^YeYbg>SrzO^SI+`wU_*2VPKc}&c(9V2?D5|WZZa6@RR#fUfvy1oH&Kn&A4iEf z6CE8a-G^D+CQr)Uu0R{nEz!)b&P`|%t|9`dI^2UkIjD2j(Iq@EX^Y*YC?7H$$nbp9 z$1ul4P%0(^`f>3m`-l>n~z% zzMNFHm?l3b-_$)xi`CRGdI$yHGD0gyOcg*WwEPG(A%5qSulSk~VB7qI#W+D` zY#GPzgbvXu6qK+!ocXiBE=0BA%32YPLX37)Oo|j}A}&TpucT-_^+%_p-gZ_26+6Pm zktCg!@m!VBuY)um6%3<@ZQ_3vkSFTyob0_uQrnc*k+4Z%@|LPF4T%LJ%(X*k4l7QF zipDX_eDx(e1S0a5YG6&1C0II_h`72$PV*Q>mj=zyh9p@15Y}%4{7g+N#;MdLgrJnROJPrs`QO z8mVjC^bm4`v}1I1VA4({PU`miI&8U|DO*A*(YBiYG1iuziM~K6fF7q$l?5 zshY*VbWmyme-z6^@`LbTF)oQgDCzR*f%8WLD~{~Ly>yO(KP13rgO(83)Y!6#5+EH7 z2`mO45i8r1m4S8PV;v`QtHckT&T%^kYrCA7U;!sw>NaFvwDU^rzG0p2M{Pl!5`P4A zHI;K)DIJ= zXnY9_ulV?ro?E!rA-AQH;Q z`xSK*V^#llu+d_}w|I|B7szdK|G91{qPvUIoe*$$Pj=W!zIwPMVEY7LxQ6V=!B933iZ#!aZpV!O*y89u~5c2X9S&y1xqaSuA2 z(SJrU*-X&(d9pEqC@l7vV89@~3(XB(v|#3YEr`04@v zER3X3!ql<4hPg`0xdNhcx-^(-y5P6A&6u|6)r>(Z`$gKqMJr5}>{7FuuYNhr zm!^ox23wu~xFgwiq;?p+;1sew+ZrX)gMStS?~kDkzK0c)^uzx7_uDaJ$Z4Jf$HLtu z{+p!nB-x#LzA{5pe9BHnKeu_97zJL{bd6MG)!0R+?<_8{QWvGSb@Gd;xOLV)^Oe(T zNWqhtyO?Zi+Fi_YXJtdIWENz1EL3KWR&-?fsj4ccYju=kQYV#pn#ecycMU$nHd{ZS z%S?%h3*S8Or(-xor*}DmK{)6t$aWP*S{eKV#VT3Bm~5E@iA$D|5KTlUL^k>tB54=a zt%1Xgn$JM~fB zgSfW9@Gdg6i+zR*8Bqo~!(DU$mes#$aY)G?y)~0*H>$X8wwIa)eApygOp&Pr7#5YN zh)h;wDK9X8jUaI@h38a=qNsH^M1MjQwH+1VewPq-jdNL=XRRMa{XO|A#WAkpM)iQE z^&Yn{w~@UQRfseE`pyOmdhMW8%G`b0{u<6ecM0SL=AwJ;0 zrOh9zqxNH&W?mBj8V9lD!mdVJw{6}OYH+_9Ruj$U*tH`qtlO-6TlirMwbl3X^T3kk zXq6iWt4uuSP1b-wViV?&m1Y|2!u8tt(Y&#PqAg`uTO&cv7EUp}tmM2#jLTjbxrO>7 zyEAuqtaPusFJszE1$LhY3OA1V9h zfR6#kRMK0pHqz)`Y8pb2#x&L5L*o-SnI?hJ5B3t(uR#LfeXLWG{}5tWUO4IDrDo8^ zbyK~cilK&a>GY{P4>8o|4l|$d;Wk}wup)15NK`;76kZ8rA2p2jI7W+wmtV2=z)yHlPY8d9guX zDN0>$FRZf4as3tL6Gv7QHf@B1OJGWlLm#QzFjo*zfZl^YyKTVweqPcf(ar;iv&B|&J;*zcW6hD z1TBtliW?!T(>G1gg0Y9I-%MyamzELPPUj;~Zbv&pZW^)gPtc8m-SJjN`VL2d*U2d$BICa^QDGwK-wSiw!lQuacaos>=LK=R zBE?@;>4pDLmgW|5f4^QNETD$)B4JSnyb&Ep5|rFTI%g+HTW*6E-4-OV*_0878=9qC z)F=4?2XbT-Q7PWSVPhi6Kdv4)`RTvJgWvAw(TnWs7m^^92@E@>yK^|!^pUDGs;-@0 zLDRW1-szwEw^U|{CMw>4R?qkU0nOO4B|@A3CtdhP#~1NmPoij*R&2zLP=ep(JSkoq z3n!}RS|*6sxhwxTTF^Rv`Tk-)rBaTGw^Ob=^b_T;l6G}H8pB3DVVZB@=W-c1GMzHo z>Q?0&#ETLlZiDDUej$EKeM3(;K*+Q^Ah(EKxPywNQC;!OLd-!PR(}EgDz}4-dhY?w zzhakL9Bh9N=i4a+HPVt}Le}6}ux-I5Zu_y~Vr`Z$9+X~cz$z}r0t+2?-Nj+2+L)z2 zlxIwsx=EHdh)=g7+3juNORWfJU@7l#GdNLSJM_Xn`{JXti5188(=^~8eTKP^rR5TL z$@1N?ZLY=G(770|8+DA@Cbh<@^5cITDl;@Y_=*e{GO&r=Fr@ zJ=|nw2QF`A`jwOy{J^mnLi>r)KHJuUxW-WoeZl2uyw!9UB89ae5kLbHgFX+yPz zCTK>)&4t3OS8Ib?4uw=KG;9chtkFrD2)~uwax|#AXS?OZU|5#g6@#U-DmP?qAt znOlx@No7lC&l}SVM*djkrMy@=CMWeyI(zltma}vcDz}^q*kx_D0kb&xFIB8R%JK!Q zX1FS}D9#zIdKWv7mcF||R^OS|3eG&KsOGK1mtlr3RF>RLtl+J?Ky!^XMU;;UC%+sn zhSXgkDMOeigHUQR@YeM&7*GU(dFjsAy4rQ;2QQsnLYBGnOD|neG4WzZNot#uPDgMt z-duosXjghqNKrM89o6t!BG=p!f>rZEH>ycr=1;rWVFh>GH3vnvp-a&l3oXPQ2%brm zMd)InWGG}HaF;e=(i~#Dup&0V0~>`2b0*|ww6E4My>DCDgLFwr=_W%`DMad$4v8&4 zR}Gu=as>d!mb)Y@DA4;-pVNwNj6m;vA!A$L=aj2c_KTIz33@AOnvG2%+Ae)gP)3NF zkWz0xC%zskRf;#}BzR0OkjFF-j9aU%&M0!U@<0Wz)A_;cly-VMkYtH`NRa%1ifw(c zd)eg?-7G+fxUPIYaae}Ow3awFwwv>mc^oy#B(&9D>8fm2?2&3FS(j@=>vB`;GI|+; ztB|Y>>oR9aNnQ=2>@(`+%FKp#>B`LQvjEf_tjt;k#TZiHwG^6^(W$bFDaV3&o6K2L zn7BZy#kM3N6BmgLXwb415Lq_LQd|+Q+9*OQdI?WD>!oj(m!&!V%w9>WnpSK+9yXM- z)hcbLl2fJd!Dn@m`t7DbVHNb-ly%&`1s$wyd_NmL4`w=lf|sV-9&#Sy1qmXWFhd=o zb#)=ioQ)`WoaW-J9GT$FH2_%E)-fDgJC(BzXkAmF+Y4jq0D5R}$|~%nX?De|y1@b| zi7SP)_aVERTP*bWGnFPZEbsG+(Mxe91Xtle4Xf?rN{x%f>)q<0-pA;4k5yQ4ZdwmTK0j$tK&YN!| zxGoJo#I1T0@$l0t?CQ|-P_BO(C71+2RCeI*kl71*mRS^St5(q$n>K|cviS-hKH^PZ zNZPFEP!S#29MGDmhlF9GIg7r|qMhXwQx1uHcE{P~VolkAD^qtfW0a_Ce_)j3B4V=lryTRKVyxV}9<-2wwr}T*{KG5=LxykwEWcVWm zg7wOHa6P`xW!hDNb{v)CT-pP6gWeipvBm$&6&~{a*rky7eIC-&4Lgzc7F=M_)l+Z* zGrw7=7*mm3d0-4 z-@zHw*nbI7%xBYT+)Ycf=}g9 zRTd8Q(7UShR~;^;)-VE?=3wM@(EU>NIn@sM^k~;DsX#XvapQ2wIzKFf8Iq-e4bMzb zDD$a2^BLS`-&VoO#suDm;-g(ND_+L2biLSR?Std!DVme+QRi2u*b&}()G2tKUf;hT zG(FC}>Sh(e04c9bIwvcs%o!4BLG>YK41*J(XM#dJ&j?cMpC9$i52xk_9cN|7{8k3dK~UuM=IkIXNr+B;S-=1L79T8{%1hZZO|N%tWpi9n0e*$Ae~1l5XcN4CE=mG zwXXCSve9Pmpk1CW?!*8#s~b7^UMP~S?YXg|MbGT==$-x)nA!A)0z9%DDOK@Uj9)iI z2;s2>x|J_My)IwUeh#h4FjL*hVKa+_s#+mi?d0-Y2-{L=z;a6jBG=d~`LKwzrVDo(2T_dc2lso_kS2sBhCfFJ*P^Uk1LN8X8JS&uf}ut0 zG}=NSJ@!R1odJ=^k}$7>{>vvY40=V7x4s!AaY;eyx?5vLrd<$}vJ&WZ) zBpX0SeW^eP_lR9t$tiITP_^P=6)Owj)h?UK2F;kgQMPWAdXSLJ`H2XMD=2s zOsbfz67@SGhf-Zid$zmenWK&yZ4S~qKeKw$?H~ajK(H^DX|Xr4%Qgns$tBQ0!;#rn z8o~JBQ)DZ{?X?%h0)}9qygv9v3_+?rQJNf~N!e`?e_W_mcD<}+>k~u7o=#`dmZh)? zXxZz3^Ml)m|It5heT^|I*oSAk`t#DCxBjre20w&a%WxPj#!6%gi)4=CpNvv8Rb9C) z8H~AV;I0(4kdJy0ZopD*()Y8#Dds+b{$LK29TwrhD3P=aWMhZE?ZPezHH2d6P_?2_ z=Raq0`v{r@cO$205~;^JU`o7QyP-YxHc4(B%^;pZXG`+fQQeD@IRyq{D41-LFEzTA@xNfrbK}gkpZ4Yy)}@NKEZAF)f5#; zPxeJA;6lf=9{6EsXvIZM3nf|18{9_gv9+HWYD~-x3Pe#sL(_ zCDA#Xw-^ZvkcK2$-Y6yA5XZ}8$l1nY*LFTkNLU+fzM%o2rgGrc1XwdLgfF=0GBEJQ z4=ahx-^>_tLnn1i)0S3dsM2W&{WGMT-42cowPPMZYlj#cYe!e8u+7%Bgt`S>K*+On zHfm7_h1$r;h{II~e8@!>F`KlEaA{%18SW4){U$UqL--O&as?27q7Ji^va^E3;{Jz) zfA_aB`liur;&h67CJn2UfPKo(3;0<2UjOpmBX}D+| zTQC>nfh6%4%4}?kOE41g%B4ZlVRT=R7>-BiVm{{EmxRmn);;K-(HlAsZ^Thl+1$fs z>(fvT!XB5F={M1@WF=M+2foigZ_WCwTm=;9C3?pS02>lHD>hVu{H!1zmhzFezzt03 z#B1PgfQ$SjXzP-_+Lzh2Im`(2?PG*7&S~afyD~MAGXK376KKRy zRbjw12EL&K?iM3e3YTp|G~K%UUnW7V-$OVVsc>>C3^x%4#6vTil{3qhp_*BkoPk@D z+6s|DP#XQQFI9h13Us|0BY~?UU)`M6xx%KIT&d#dot}QweOS6!cA$QCKT$`DtQbLA z_95%?S|4b|gkQKn$K)KF95Cg-##W6dBLD3v@h3h=yz=!CpKGbUO{uHWxcpEmhW1UM zO}Jsz7oQPJA?_vkNApql-?FXWq?Sot`$G!FzLTFvK75LLZztr73!uJ-AH~N%lQ7%5 ziBK04-9Te{(^VapAvJL@B5D?`pk32*xg}i=s%|6eDcmSE^C8yZJLZgiY%r44!#El;W5&gf&=e1wF6TWf$_wA#Ti}_yGceQ_` zp45&chZD&@*>ZuOXApcszQ~It^vWB~A-fZ1?n-1^{m4(Bvin*kN~#5$uknIOuqK@x zl=xKDOG84fjH1#CZ+35d4vNoh99HOX^L0F;!s{GPRwWZo+|OavJ4X(-kQH+Xemt&q z8-iwHaNZBrd<=~Kv%d<1n#((zX2Ms7hKgk~h}3YSt#oUmLQfWakDQ@z(-q2MeKtTA zIm4r_=1h^Ipo=waTh$qUQtGm(?~`pp%`C?<>%T1;FOJa}d5F%!YL(g_%gp>|zI^Fn z3nO2K+$zWL+X$I`{H~PQNAcO24Plw({*_?4YJ~vz3NjE~wlqLA@!Up_0n4oR%du=r zyyWKzbR#q^@CxfZh2-@~??xrLko1g_vXFEt3Te+Ptr61ZoX|eVbYeZrUDVd}hJO%Nm}dLZUCm!~vo=gn3sw?yd-34}um|;6 z%n9N5_M9<|4Gal{aFWkHGuVyTe_@%BQjFkZ2h0#*nb8~_&IC_=G4DYL1S65xA{qTK znWnASZ!>KSzex&v9STg=JA9}Z(-e$p78NyRk&C;?-Vj%xRB}GaFM9b5$0I9(RmCY z2ky3vF1*Vy)M8BRSCP%5G7}iETIi?o?o+IbqrQD(`3Iyl#ZHZxaHwVj*lt7T$MKLmYkrn^% z6wazEys=Emvsk`kv0xPlc2e#2Azo~3!XCP#baS=D^}Mc769-LXcK2RH$0Y)M|Zz6zCC+H*#bWiK!hhB`?$o zpR?sdQ-M@V5SCP^6!sWKSO$3U|C#l`Zwl|1kU3luG_s$A(29oKXf`74Qv#M0mI-_;W7oh?942}#zxhve` zi1r^Na8OmHs>80q5dZkENjGH67B1}7_7Sy+@UU+rLtkz)s(_5&#z^?N%QfH5XT79` z!Ay6(ReuTPA(_Ab#Iz(V)NjLiVo_m0t*hx(in@iWzYPfhJCZ@vIi%0Ik7=!B8SKbx@M=6AXgcOwW(WdffuorzK{Va+dLBqizsd&Do^# zphPAx-@Xo3XD0wJ7LnEoUZ~5V2be^56TR?7TA?0kDxn|w58VIIlhK{#4w<9skvnls zoGS-^8*Y>L?1PEQ1M65ow4tMe((vcZY0V<85Yi}L1|ACOFnB5kSU{;TjQ*SWgOS(f zAaXOaM<)AV&uW;sfL3S+vc+m9DrT2y`bC-ug&EKdkOX1?jCGYwQ;OFW0KhVG$UcIE z)Gb&j%;x4{0UGFlTSyL}`^e9of(8`^E&~Q>-ag^#z^c3fVw|R2Z|El_q+&Hx&0x&a z*IUr{xIcjs_=G|;bXVVRBpr2b#)BP5#57!XE(xv478jL3q!kb>Y)gTNnST?-bV#Ng z2f#0S%u=r>iqzkW8OCExRTuoW)ie&h1Q!+DWY#+k&)q5J7<0EPs@$}9a{D*8`f`y z;h2d_{ZD=lvuK&6`oy=$++12~kWqT?TW_#)S&lHG9=6c~>vOQjiN}lBrZd>0$J5BJ zrkVNX4}a)WKl%0F`R#vogzx%TklM_D`sCvO@`Ynx`m3)-N?HmB@<7;P5@nz>sAbj_ zZ6%z>LTSl5P?3=cgNXg_pJ05op3X`VKA;y_c0SMv(mEL2lIa)!=ius?gJ08CZ^iy26?A}D4-VmI?oK1!#^8^wM$>RCr?`|yCV*@kcxA4Nh+d-R80L#QrTLN+FO>2 z0!-?}vQ#u*4$OX^PuQ{mNqtsQ|E~=i;G6S*WshLUbT8#Yq$VOgx87>^w4`e|i14+z zP8c<<{S76@pcRE3T^dJMlE@0X+m;u?aNE+?6S**04Yk(g{5vl5SJ*;+nQt9bZ)X$S z<3@0aR+rd2#h=93FZ*5*?djwmv1_Sf|H$ul=lqkOyhO@t>_7ie-nc+V&mVrFGw1)b z6JEaZG%vrfI=uYJmw6cr&%f}qJdcLw!~6V)pGQ$p?c4VGXTDHAfAZ_?IS=D1{rRJp z&-welrDnA{#{Sulp3+&9$4>I|IDmbO-_NAI?_77`Dck&yFYZ2pJ7gDejPBIJGi_E=%%m#~^2o<37v2ET>+A$8@O9iN> z2-peHmYn_sH3a9F@MKKrRtPTN)E7yRdW=vd{Nw6OL3n_~ZBBCB8_MnkRH7IRIH7P~ z=PI^^>Xpv4?4s`6DyBl=@Q-V;XK4M1Dl#Yo`}b}&S={;Yn4LVzO7L3J%#gBjp;c7e zZLf$?si=&_Vb*%_cPG8K(<8?NR!jg?`Cq{^Hf$CmnG z3_>SV2Sik0w#zpadSevmqKllw{ske$CCw?>u`@ zbQ!WLm#BQC=wL%`)@VgHD>9HHoTWO`uPyhYm9N~3n$6+n<&))n*}>A?S`|O5_bP!K zYdXEF)QV=z*#PlMn+gj-NOJ=zap$otZj}>N+ZrX){L^+*GY&R1sp$3W`K45%L~6^- zGZCG(Z`N~Gu-Rp)(=#L~^%u3t$r46?+L-C9m`#0Uss%agW;5jg6XXNMd{^KEOA>1- zIVj@PKyln1Ilq&N7$)R;tm%8y==WS7l4DqsYQbz_SZ4iY_3gmaTziI4=-#f-r9nUk zD-Ikvnj|RkA}O;Mh_npVm&OS}5YIJOCw%4^jKA-T(Vi)>46UGJ-H zLd4+gq0k)Y5F>@QJcdB&E`VWRriNCG#F9b<%r!TfMscJ#m>haz$7Uo;Fq78Y5Z0tE zltc!z4nDLG0%bwiP+#^$^^E!v=2V*<$rHn(YTzsVE}MO6A-(UCyBJnh@RH0W`k>~9 zs)J?CD0vRh_Mq`VH{99e_#w(d=N3HzK{}UFPtrM>#m$m>@GL00&FGGhLIq4E$hYC?(z_Z?{OKqxyil}2iGfAMCA}DvVOEZPq+_djNfd7~HcJyFOHLPZgREvA~AQvtc z6>IzUyF%`gJgik};@RkqmGk8dF@VmIk1fE!z9Y1);ak^C*wEPF8PQdZB&I8@4^oEN z=m#RGb)Mg!ZaT8zaC}HJy^*Cutba)w8M{+~*T43Qvwgz#^Awwi)#m z?uviPLU6^W3OA#mD*o3vS`@Y+Wl!2%a1J}~j4m(We`7~^eGOlnIU}d{6qm-vNAoSD zY5&UqzR4YHc~0}zg)4MsA-@HAk`I-*HS8*LjyIU3`88|~Ew|;QkMBfA`P64ii%&5f zgdirJstw1*wedat37yV2Z`Ef*H~Y`O+duJcVvrq2cgqI(uIB#24kp4ukw2;hbb&vB z9KD5FA%$HjXV<544s()m&GD0Z*@TTrasx}1tW|t1JdqSjMb_HaKg!zSkI@!aKI;*~ z=EGcAt44B2+&?@rE9xDTJ-)1LS%z=mCRV{3a1%0$C;qV!4rxfHC)$jB!a6AX40c=V zQ+-JFe#w6}AN~L=(>l#LwCIK@H+nlJvr~T)NnCE$9LXkGbUgRajroY zWT8OwtO8XJNhpw=RUq_1<4Hd&`i=sNVq@;Ke=@q=KXMXh)fanrc&?B@efTkUgM@n& zxzYLhb^UQ?vPPr z^N2wdXk+&@;B!FzBtFQZpiY)$VR+gXt$1buQwXQ)ST!x8+3&^R@u`3KWXD@Onp~NWk5Z43Nms+hrBtdJ%015#EZsFyF7NB<($5lb<_s3Tn;vPYBpI zp^;db$luQQm64XZ)kAYzd~+7c_-xF_dLs@HMuCo%Fe?X6OEyXxRPaIBu60>^VMzs z$VUx1JOK(AfzmO&J@P?>)HZe!_@p3gWg{^OM}cuL&KX+Zuf^OASbX;%<&qn_fYMF@h)t{x*tq(R(*3UI?RZ&n5g%r%Jo>FwQ5 zjo{K4*&~a`-u))R%>Sa`O}ZkA2Kz!`mJJ28K#e4@&;=lLU5vUmbySRI^NSdgPs!Sb zkYuQXda)@Tp)BpPO54YR<1iyJS*)0kwYr$l z*(HSY0HQ)5WWBWTLcG>eZNj{W2U9F!EAzOs6tDgNQs4m zct+*`mJ#$&4f|qEiMFck1hIV@LR)o1ah|x4t99nItdlZlD|-t%6Hf)x^Rw-8vX=@^SAb-6Xz^7c+@Ff}4& zre@Nn2CjkaEP^bT`Gj{JqJ*JR&68fkO!2di+o(F4Dd}gl@{ci7c>f18wZ@hX5)Q05 zQ+AkXrJ0JuOvPRB&hmqwm)mg-`>TDnKW9!lT(Qr86<^>4I4AOv7Ow#L5<4J&-7@5N zxcSYHuNcuGE z`5bcU-H&|Ho-T z1T2hcL;KIm4Q)RXTrRn$A5vfRrGl@im~s?y-#@6aq}Y-MxbVeR;8&#bKzm^IW$8Q^ z+f50Vl-6B^+bXaWIK1TLDMb-)=qqsk6}}Htj_|}r+7yrSLgi6e5V%a{#r0wFOVEc| zT9;5lKWBig+RFN{l2_J;m*))h;iWm}(udI`M=SJcikHmYGHCMX9O|m(j#h%gB}p^N zl7X<7zN!mRxhoYW!ytgcB1XdT9}>=XF>vEKmls-k1nPOSGMVO-i0eA;zbMFSvxG~> zkiax&NMuDV!Y_nem(2nU?n8ucXFv<4s$gmfuN*(g%Y##FFZ0S2n7G#}zDkf)#+Dp7iKir~%R8!_>n`D%=(+*s=I?0`-$kIs@RQ@Tu;lOSYPEjdT;_wZ+l zPv?S}WQMK66s?sl51c$T>|R~gLL5A1wqRCkLk^zJa_}U52TwAEInx|Go6W()i!L^m zg9k$atW`O9(()iZU!K%qf#Bddp-22P55lPC;E@OQ!Pcx+UJl)tWrKrfP_`_?dV7Je zmT8E06~$%gHx*;oy)vFx@Jm-dm9D$M?Ko7t%7!1@9yoi6t#Gfx_QeIT=4=bNDIF`i zrGWg+a;#tolQXWwUFlfSkwzob}=O_(3i zD~by&Ty3$~d{42(Z9ZPO%hD(74wuE7F&S3FW6b4nF96bOj;eH_(wnXHW_Q7xxuOEk z678Plu&E6kHhnM5W+(~o%=X}_DR$WcP;7G~Tz1H9BUc7Vd3Fv5r_SYv@{0#98>$DF zP1WF#%O>ZFS`X(zxC4((<*(Vw)aB=ci!JINU(kh>7f4BEpIbuPTimw8MU^<*!KI*Q zoBRT5B;VpL)Xz@(>-&6a3?U~T`5yB%72kficny8>qoT#DHNwi-ROE+?i-bqc;sEvHgiIhE4jRMO$BVW$#reW%jMGN)2AIF%?;Ih97# zNZ+Z1GMD;+Qz@;SN+TqeP9-k)Z+kc!V{|bxB`XkNjwKrfd3+Wdp;wiTrc)n6{j)P1 zA2_8mS@(S~ywe7P_CfLLlembuagdu6jZb^mv1Ghxt~ssJzSC+%=ovVz9Cz>?$}hrA zbKy~}&Laf$YY|=bf3x@Q;g*%8DM`3G@5C-&*@}&Mu(5wEv7)XRph*zRUZ)_wW7Qulzn{bpMg^f+OW6 zM+TSNG}teMUsS$;RdJNTPQ#efZ;Q~>s>^nIe6|=BEMOIA@^N5Sali*UPyM+Qd* zd&KFB%9q^4YU}skRQ|wCh5!MQ49GOZ-mY@s0SC6 z7aifj3y%B?aC>GuJBCQjkOQL&2S&uomTgXoU*rLh-X17rt$236DLBmF(R8{9+( z2jyONys<9A#hd$0oe_y59CdTEo`_IS>xsm;pyfXzPP(4xp`ILe&~KG{%6+<%9r`#l z1Ov}+f>Mw4zYmn!&8TR5H=VetzjrO`4`PhoGYKznj04BGo31lP@ygC9wA32anCPi! zx91vq$0t9Mrs1YO-!tYt<%^tcmu^@2?{T||Wda=ggEZA)>a%?tV!%RYs#1Uc-qY`g;3o+c6G+pqi9ZNUaxM z1O8qJMp5g9)SB0&*fwaH{@Pn^hK7VX@O$Aa*dhTtsES%02x)~&2oYLkJZsh_OYS*} zXSgyMEaa4>T#7XO`$5*9hAWlv_?TP%E`CMvgs;Cs_|Mqu+c|!6?3PN7Q`*YzVqXyJ znlC=>x@Ly}3E;W-Kw8)|2|R*5t&FjbNiC#!EVFd^M3F9Wa`57~t+K4ytaolp>z!7? za}HRnYq@$@iC3wPSOkqKm=w$PuBJ*{*?Hfp(NOqHJtxx|XgfS>I1)$ymE=YnyNj=n z#evN3&Bp1o7keTVAm>zAEGZLDf3C{Upd4E-`a?r@A5uTK|2$LPhl|9IX&FV@3| zhr@CqnXyJ$IFDo5F&m%|C#Q@-`>k?b2TXX5(X(KYSwVhQ>Rjg>>`K|)@AFp47kJhon%Zh8a2JX{@9Y;Znb0E$lRJu>GgL@pJf6y%vUfkRmwcYTIP7+t^T3jr&a~ zI_Bt^@a=Rq`F6&8+=qFmreIl3p6J~yXXziH1^ojKoa>=`000uj4jlxo@SX*sVlc1s zGY7~^Oa)0HIg&`5{TU$*#V3f$DO=6Dqo5wX`5wX=yKDl&^WzXcW1tcfmcS}pYPibr zT#ts?NiD$ZAdY?ba^z1({d;Ec$vzUMB1a~`H+=Iw1RrMq1o+MvVgWCRw_Pq=Rve3< z=!N8MOw7rZlp1n?irg2XB)sw%MAEMACjDL#9Yfa6lGVeqU0&5IrooS(fkqux(hQ3; zCr`SI3Qf6QF&!08dh_Pucc@tNDy^8p_xa%d9Dc{|9rFX0M9Q;coj{S1m|;K8m3w%G zg;WYXIosy|uyp(nK{|5MewI8_FfeSu6fF>q1Sf=T(d4dYW{Y+fw&?06(QbHPN8-#r z7NjDn@(^N?G!X;7pwt}i#^sh=zLr~57;;O7m@rHpoy1nXp80H&D~f#^!pqDE-Et_r zfWSz0O|E)Q7hN2ohv;JEAc-bcF9)P?no8yq@%=QHNdRe(4 z1Z19&=SPsovU1Hyz6X$>(BfDDd=N=WDhqkU3Xtb~ZvO?pLbS8u zc3Q|cdf9X0Mifp;8W)?O-`%vV*+Bm^Y={cJ*U*0^yiZm~+B|G5$mz6bV9yNf9I_&2 z0BObyEbF}x&G3jUbIMP%sHvnt<61$9USWDdiEgD;8{&LVJ4)8>_nZd!o)Ag;CBns${GNscXnS zTiSgpk==u1i=6RgSpH*+obZ^dmzJU^0kSM|c4CoJz1y`+6_{nnnw@jLT#i`y<%-ZU z1XNM&*A179R~MUcw;H^Ohqk)irAxPrY*!2tIuCJ;d8WCs?mta)>tWRII)+%MU+uILw9|V1mvkZqxwG7a@`SLbJZF z!xe>K7Fv>Q5e%&7!`{ex?@!k4^VpnT$FMt{%ng5cT~>V4HC5KrSzGn^PK>x%Pe;Tr z#Cp2X3TGH?v$=ft0yeUzpng1Lo;q7xUl!~4aLt((yAPM-1nch3id*wR^ zt=r1hOp)^*>xImw}2P! zhBe}u58C{ob{3=|okxFXU;ZM@Pve3n$kPCAJmCB($4A9OILjO3&F`j>kG+xErw+#l+p9l4(@EMsHc6w-(gYc$ z0spAG<5Pqj`|eE9`)dT;UvCW_PD_mc_J0jz;`G~k=4Glyb+!o!it0|@CR{{QHqF(S z-|@i@ z9KD=lTeG#VpZMsXfAmjp`TBXD^K_OIy;t1NswaNOeq_V*0RHNeASIrU;e2)`#j*cvh;pExST~K@YC4*jNUDbdpB3+bu5hWg;N1jS zeRzK{80IAFnNEUqRK=c>`Y-DvaW|#%P2iN6PN?#KvxqyM-I7jc??K zuJ`-~wl;2TwB1)sR;kc>Bhsp z13H8^m}Y0GJPVjb&8cq~lmLjtRP^4Be`8&w`=K?ZN7n;Owy&6AA|N{tI5{NB;Z8u3 z(`26=jIJB7onHXQhLd#g3ov6hBH*bWr&@eg{JkFkC4eD6>}J5!kII&y5-NxbdTjoX z;mT0CWO`V0RRs>UZ1I{QD&ai>jhJjvCgCSO4GyoR-F`@{Ii_-BV~?jzCEoxkSh0{& zmXQS;WHG&BFEiDMru+d#&n-zqJ71npuXbOpk_CwZ$^qJZJ?2&Lu>bsOgKuWn2fM4* zVItR7(~OAdv*OqKC0WL%CxZ{XBIF~^U|Mx}H;5xzb8LDwa3$80m&)$dOG8&V#bS0q z84~c?{WWi(cC)R}c340alKl8wgexC)jPwN1!ZeEz|~p62#8;wdA;1>?Ss z5SaLIXZZp@+@^&{2&?;!7Rw8&ch@!SX|DL#v!lUrtj(Eq#co^{5%jnSCX_FXGj^FS zF{o9ZOY@86xn$#M`71BA&u;7hDP&CzlK2=*Jn9Trk9@YaPG>pQ_8UYH7`zg1PWeU# z(J2R~d84&CSTVE&9{}v4dTPW}meP$(Wufe?1QPj=UjI6?5R5JMLv*_ADbTn=DCwuN4+QhW8f9@2gwDBap+JE>uN#pH8=G1 zpNeCV_&6%&9cfeR%wVnR*uP=u_PiC4h+82+DP>*@wlRZaJ$fDqmPmD|&L{)mo=ggs zs5VZS2hSJ0hu^r_R-b=5!Lg{h1g=TC%UynPb}2MvC2HS%u#v|X4Ec)kd7$r1?^@Zn zAYkkP1qibr8|N(q@Nm9?4MHUPxuMz>X#K5 zh!rFh<2046P~>fbqF7u*u>;72BFe)Mid7zD73sLjIdqQd{UCF7N%f#OP0%F0K*@2- z1KmSEQJyRE;_p>td_c^Vt#w3q8Zfq6ObMW{#>|pP7iyi8LCm1S zvKHTpv#uJgw1vV#!ZuP2Ai=1FR09VG+qvZHvvAEPG#)9gbLEoXizJa;&2G_wCUhn# zM+<60**BoGHgL66uiE(ijCI{g*X<`T~ZVFM+5ECr~qp*STLwihLEmHVeTU#MNJ z9!9x&dUxo!zBf+-*o~M(j=?5q1WC9)cphJ{?K|in1Lo5X5&1+#2VdOv(m2FKP&EwR+-ne5B^w zu1<2;f-3_j$>c2?)tgURk1A9o^@IS@hzD)DjUkTSrrRNh+H^~>J&CTHR_syrL~~cq zW3V_SxU9TfeJ1EePo(zLrD3B{#i&bSCYXjkIMn*a+j4#UIky#pe1rCYpOC5)#v+ff z9!)Mpj^&iZJ9Dx{kd=XpwT1zLDH~Itn8%q=H9YMhgyKl&5WQ;5Retcn<9z3tj{e4j zka+@~?O6UzGEXiS(j1*~mce2%*8IL*{q56`6*8nGX^Juojpp?T4K~B&Wufp=u=JoS ze#idarBCl0tKe)8&($JNV$ zZylVc3yUj3yv>ViasIWClS`q;U|E5BE)$`0EYKOX6XKri*TI3Vq#Xwj;<6y&5ps3- zel}gggUfSyuT^Wv&hUM>-ZXmW%5!*s4z4kD_|f}Lx?JJ?*}OlSxxlDo73dxv=-u+% z>T6H8-b%gaq>FRPv(v@d<&Jbgm(m4lM!HxmSJK4_dP{uniZ?Z?6|ADvr-wR2c!;v( z4>~ZoGH>+tTzOtF>&QE{L}tYrGz&E-Sf8JO!z@Fe9Qh)HogC|m9?P=>pmwx7hBWqW2e4KY}8ZK~iIrW_QJ6qj!ts5Tl8z{eyFJcD{ zPbBQGJbf;cABU|GtN>d@O`45SW2eTO`lu$1|BEwOck{Twz2ql6CbG-N3G^?|*|*Jj zod%7@Al@rEPg)w02|m~`K~>OjzDW?_1FvZTJdhGFLohh5<3`&8e$xAK3c?CZW#(^N z^#QIE$}CK$&6y-Gr6wGz2m>@(soWhS{6sWBJR7@pZSI;_OG?b0Wx`~AaMA|WM>@IJ znnqk;&yX_&KVVGkp`I{cNXA?nF#E?0m@8@n#_}Gc(LL49TT@iqvZ%rl?T%T7@^k$RaFqE@j^_LK;Dj(NE#xKsOEP2$_f|TuI+0`Xq5)TRQhF(xNrc#FS;JdSlo z7$r-0gf}$*Z!Hm`4`FgJLCDc6xSykv2y^M75tZFyUN)$ieJtOBSJv&NEUFJdYp@D z)z|n3J#26By7f1529#I3lJMT2778vx8HhD855IF&Y6;4w6q*P)J*Nf8oz_QyG-)xU z0%N(4f%+~CmGv-dLikQtBHAiTjjh70%pTGurlwZA+2#h_3eU%&ml|4x*kDfh2-)@u z0FfdXxGq*)UCrE39jG>rf?iJ(y2YCf4jbJ`ir!PK*==yfceVSi{nhFlNbwuW&UJb= z{SU$NHXSh_ntf&i6sM{1a89!T-(<9g+R3SwFUxej^$wF8wxDgwn1(hA;&D)aK`y^6 zb6ejIPJj&G<-AMw7Gjd33ASNXJDTqpC>A{jzwzySb;UYRNj}0o^00tJ%o*fHB%Up8kk-qZXDsFMO#OvHLe%NG0+7K) zm*WU&Iu*hZgZ9By-uiE>)8($f`)UJ*-Ea#p-tD ztlAnweR8qEDpY^r59>|&Uj6pb5AfW#4oR6S`*RuBFe{Ns}9DSm=~%rpMs zP%(1Sy6|i0B$%b2c6&qEv;k|Mi^JOJQ;gX46SAbJZIsJ;5n{yi6rIIeSdWnna#O}Q zm&Qna`V|3~V{FA3ZM7b%Lx$i{g;*z#l)p#I#Y91mZ?yZ+S51mnprHXwmaw3f-XTtB zkYp(X+3mmTy59ffz(6i^2y}HqL0H%eqUmy05f#$$9$qnqSaul*2^jGt#t)Ki6Mu07 z>^yEV78`>%)jiY(Z2IjtO_vDEjMgiBH?hPJ1jfSKIN={4W?x7 zed@%q1~r2f0Gpu?k+cJskTjx&S)&{R=n#7vGAl`;tfUp8#Qa~UB`7g2L}wTkw2LVM z0XjBSNg7EDp2`(_FjjQ~O;;1M3g41ZV*2n3xC!UCpWJ@^Yh zJLnfb+Yt)63hL~*BNB+{rbOemq}s~p!|h_Kw}YB4JI#zaUsjoPH1~Fm#xi#pAi%)p z+!yOSQ;^f@-0g}4_8-#~?sQ&omR-z9BLDHWHgUa#DOAcrd>G&{pb@(Zwa)32vk6aC zfM9nZq94@kt`n>PCr?9C=DvyLBpXivn>OwkMi2(&>TwU-i6IY1S`Tp!P}7MaMh22c zHv?LjDuIORZ^Ma(ZH|yI&^!=qQ53G}hTpL&*?{*n$EOStn>rC3<5(g1=O7bi4CYb7 zt9Bgb=tRFs)HzsCx-W1C32;VsTREW2grD^&3QUKkp}S`&J!k3OsI)%p)7DMV9jRzd z5z5ts`I7({LB}Z_f(jyT#y(a-H;7g2Q<6BGfe(He#p@>2!Wt$@vc z1W{9pnG!_1^c`A|h6+MS8DoNzborA8KZ)lL~aYAyFO=%?(ip(q25 zuE?TPx~oS{A@bAO{e1PfH_1m>q?_;_M!_eWf*@-$JrOJL!>S|@ulv4&Q^FlQD{c@D zEro5&gI&YDOpcA%OErELnmS(X0<#$f;|v<+$&N6@6O?%+bOtkGA>)<@S%lyop2AY% zh%bBR@_zsVGNA<2jsy&t%rLVxKmLgJzN0gPP24y-wVRJMZ(1?bxb+=N8BC29zmN{PVy`g}FzU*vqC3Y-4o?0-AIj{m$k`-QkHeERco+4Az|;*z>A z&OQ*A)N*llM_iIn_~Ptm<8s!^pNUHbb8+_5aXIhh`{Q!K%b$u%Y}|{pe;JpHUjAfU zE_rz(E|sGq{9k1Kz`V(Gbq4@26UeBcKk9$3vu7BHWH44i7me=#?`eR-%r0d`G z+I4rz{D#+y>H1%Jy_Bx+^?Es7|LyjH!Z&JTNCgZD${^H5*- zgOM%eR1v-|PWiyiV}_EYYH*N8FvWPrLP}bKhNC^dTv(5rtop_IgPxh{iu)a-%M+u^ zD=mJ|>;KY(7{yxqKs9 zBvt}w{gV8o0fjH;2VVKRgc!}Ip&^T9TNsEM%yU&Q32@@H(#dH&g1hS`v0pInd7M6Q zES->u=9gvf=%nA<>fd8EpF_%Dg~~NoouV<6QQ??W>tpQF4St50U;x2A+Ocs(egX%J zPPZyfuguHn`$tmWBQu?SucyVn8xqltzRy?N=)1!vJ-?l7MJHX-SE;{hX#pj|&MXW& zQ&Gri^`mI$!>OSUPXUq*B_PdLu01MqfYLlepwj^*xcChEtMdg!(Ly`PG?|BOqY1^# z%t!h^0j{01X=dhQW}5y1ZtF>nvN-O{VBHbKnflur&I+Lg&ps@5+ zymDi+GQD5TB%3fBGl_f-BUg24O%x`r-r#$ zQ;l|L@^7(eNDYia>L{ubn63m3T#WF$6BWU?MFYiGMg2nmA3X_$ZSB> zDa_^#cma^v#;6Xvjb7O>olY>Fx?SPy0GvNyBz27ip!>>2b%+iXj3Xr`u~fDK`orMVe2mCaY7sJ(Y?5VpV94U)rrI9Qxz~aT!|XAH-$oo}Z4(&`7@+m!YSACN4vJ zeK;-`Rc9WIOOWN_>k+2T!e`ZHL-n!=S!YK8=MWh5e*n&jH5xMsou z0ocm8h(96=nohbQa7L{sYbZZIsCb=!cpYkj)Y=SEfIrY+zQ&%VOuvh!5 zQ~ZRtye>13f;;qY#3C2CdJa2ak+qAux<>!e!B55hki^zww*-@Zmd^4X0EUaB5)42c zqM?N9{NW^bHo;W=q?Tay%x!{e2rXdh+>gUFgjP*<4NN7wtuPgo#wR5hvW;E*v*;`b z5fKFINK#4|wbjt7dD*Q1DEkGm$Ff3$C}V?4 z?F6!b(=}cziN7<5vZ!k4D3E>r|K86sqlWA)diMla9;>fUaZz1Zo%HR6S@*fj|8psW z_C*?Z6a%OOr^N=V67#IHr-=J|2#>~4*-r=ogz8}Zl-$Hhdav(!coCy>a90T|(~KM~=Ww~;F#?@f(si|pHCog`jNx&Q@)(lxT{x-q-}4VTUH12l zXu%$K-3rV^fxO}1OLBD&PD6Z0dG0ZKE_%U#sNis)NMf8UJqwFSs4E6~mrDkwMs2kU zg{=|MgUVcXgXybo+K?bdQI@kfOI(OuuAcfle297pFItu9tbpUGHxVWiZ4&yj1lm<6 zK1W&k)j3of%ft;dT)jds3gDh+ho4iWEi0X<4S{^v zUIN(aQAQlttQGf2gW9xFJ>J|1%IXQA80COs_0+@l4e_LTbqol^tJ&)Pf1H59)t9_l zmD4O!*+>4YX~vmYa3-A5mVMjNV8wEI&Y^o4Hj(G8fXguggjW4v2rneT=p`%AqbVzA z`4%owo)thF){sz*$qcm0S-3zbxTdTPNboi2g9Z;Cb%-V^&%GSPM_c3$DS9|8#jBX- zC}YS-h(gp2bCRA*nJW(6b6i}8x&RvbDOQmS!>iT%n<1-gKCT$ht!V6Z+~_)-ub}7Z zV;1CA`G=DMK|n_Iks>Ky4co#W$k%t4DGorj_~QMCZ?u>I#<_PM!U!l1>$E_JOl$q1 zpDSJUI*fK*ZM$HJP*)f(s$MM!bIe!?nXfvgwguQG^*>Hh3kb}Rx_}ejVj*@4W7{G~ z87%0nC(DCDL#|gjWP!j@exVdtePrs4vm|p&mHg~T^Ce?jPF%D;nCHnn_=UUnSTc&|tJ~SI+uV*==QvAE ziwyJCiExT-%!m2REpiY>oNhCe>{D&dSq~*h(LclNcB>EK3y_rgmOJ9)bbTAx2GNH* zNj?iwh7HK#19;E;62uT=_>lXJ#VKpp9?kWd)|(1pN8M;Dce|$n@?d{72ucuxa)_7l zwO*_f1^yX*Td5~3O=Yy_G5~Iy!__xu4%$G%r$&!o+EE}86ZT(dje2%0t(p8 zrjG8>5yv;^C=M2nX6gbDJ>w3&C!LdN)lhBdH)9W3{RYz&KR!gS1+~%h6(1dUs_8>q-_)jwdR5ysVYVkoW*?ReitSBG^$O1bgELVI%85dvd`Do-( z6#0z8iw4&q${CNJZZ{*V!4ohzw)trQ;rQ@r4Tam&gRNj_K)`5BMy4Q69o_(&fR2?pi7nVmTKnR-+X zWMlm1L~|n@!p)K~Sa!o41c+Ugo>LZ5P|JEx7KAFRPQyZj-rRkHZ0g%9IX=`XJ*87} zYeJLYLg6ru8{s$yALf(lRBbk-b~c(j6h-DzSCw135U5}Y4q&IP%1Q(O(EAdTuNIAX zh$tVhh@}QmgkT8FcZ$r`ctZ0vNn08J}RNjwUt5?E^NQ_Pa*jt7>8;vy_VL@d)UdsQwQ;S5))yCAsvj^*p>Xb7Pdh~j7@ zK2*J}HikIHWY2mk6GolmNl;H%&(OyP2AB=RL$SvfRL=Zhcv8bC)hm|Yfb3wSObXhQ zTu(HkPGXHbf>yu2y|x@J>Ie5gq7=m{gs%EvI=IAOS@~R9gZQDMu)N8#N$oTE|-) zrY9yzSAqgcxs++B7+-rm{m#|Di}6dAR<<4Jb7O12u40;;QE;Q367nhL0n4`@iWbS- zz{#DV9atCK(hsAr! zJtw0GVI)oeWh&+$0ga+w?6kP8M}xv2JeuJ+U$vx}2`q>abr_M<4T`w@Hv&*JL+dt_ z2+Gk7;eirTw#e0C@MM-I&T(P`)6XtNGsT*SqF$m|NAj70?j2%e3U)|gA7Stw(rdt`tQPw;pgO#8-FqlT8(^^N* zJC)-8G3>CMfHnCLLfuEy^p_Y17)l@$Pt~`U$r{gKj$v8qGojuI8@yva<8uPnJ{Z)Ju_p}1eBs?851Gf0&wA`qFb?t%!D0@ zFd?s)HlQb7pufnCI;f^Pf>PL>9yzgb&`yL1T;;Kk*T9k*=m`51PLPo>)#IpeXhK)* zY9O0!SN#-(iAJ589-E6mxPwxAXbspAp4dw~jSTl>&0^C8HT>2+B<-u!f!KbI9}uP} zuX)5iX|2gC;szl=2U{^?jUX6w!IkkT94tmil2Uzvp@}IWBibH$LA9m82x}nq9VIKU zOvonsgDn8cM7AO9(#l=Cy7CavjJ?JbK8$ySLA7omhTUno0pGxN*Ksv>2%D7%VJ_Q; z)2HZ~uc6hMYK5Fl_=>A1Q4HIMS>XaVs+Sz1CofS|_W>3EN#+y&QfsORvoBT;3FY#0 zH{lLe!WW|DId?ccS><{Moa4IdbW0zue&QGJ{{~ep*B3PH3tIfmzj^orEnlRIXc_F) z1JtP&?J7G~H%|Rp$1>@{u2kE#K2e8H`)f_vxQMbE%wkjzGKoOA zrjrRa^fNBTyBe@*kHf}UfoeO|E*rwDo*Dv2M-4I8c4}AMsb$6$y>WnEq#=S=u{Z?{ zRVNw(m`xI0qJ^!{Oq%v+RdECR4_l&))n8)j@rxQ9OV z09;}$EnIfb8vf&r$2aAKgXSX1+E@S80~uFlg+n$FfVHSs1ZT?j>TiGZ0eH99!&HPp z=R|d}PihZ>y!**k-Xq+Als5~;xFD3;ZWUjw6zQOn?Yl#d?a_=`uy=n*^f<56q$s9is5 zj~;dEN1f3lg1qCy86JTksGjyIWPB@j`{Kft_k?tqseb*-_kFFno~%p9=GGa>(d$8) zkQq3bFa?QcAUWNjf~fJ|F1D};4J&}FzM)eAYwv)L*DHlu592m+U*5Ih!9 z8W4OC0u|Pb+o;Ww7=f!?M<19{Dn!>D&S&=`P^}bnTZ{9J#ra|Kd#j)|{mH68mz)fO zKQo^&azm5`7i^<1CV_nyl||rO&qR47=y_SjF`-pSn!NP>_55snOgw#EdT>Sh*)MWb zdtmpkYH;dIf1@A3VtGfF7p-<@W_E6Vp}V-WywY3UcGmW@&pCGou0;P!L#AYFXI?&A1<9rF61{D-c?QYz zY>olFm0#Qfj+(2lWRROwySI1?)W*+`_CAPq(puWJNTxH%tL}~5fIOP*-j$r(mlA=} zN1sL^U#00;I&blLen}(u{}yz+qj%%d^T^1Z9zE)#ojlsHcy9gZKl$i99-X^*PW|Xz zzs;lP@#vhzv+GA6_R%7b&R+DK3#}J z^zWKStDZj}rJnSW)%Q%E6_38zlv;7;emr{j$LqS57x65_qdRtz7m2EiQn%j6qwPFe(8(Wc9AC507Tm zn&Q#Ve}YGjamHw$c=W42vR~mlh)4JPXcv!a{s9Od^N}-@I2%xPx`R;XdN*Ro%J87z zPQ%&7z{J_bKti+=1~v&lpDaMOw}5P_^*Hyx{KpT(N{wz_A8!0fbDuC0?4F8}`W;X@ z!Tn;GrbiTZ3$686;W#d;9nevAdHTG1#GAW8=iU!w-JhDv=kzw8M0CiP ztggbs2ydixAO8_(&GUYXT*#l6a}C<8?zKB{TOH#W8fW}==@(ASGKWn*oL#*W6`(qK z{L_)Fq`KvsfOU}f?#@xLHbV9xEvlzyiNoYC?V{FK4`yjaIaiA~XozN|zU*OQF;>4u zwjn279-u9vM~IQ8N#YnnYrxNarNs7{QW< zJD`;sqFf`YLMjafkbOn~QP{OqP_Noxk%#`YhVZJ}+j@`uIq_i@vy?~$ycDhrZ6ow` zlCl_xJisNgtW;xx$j8XJHYuZ5 zgdzu6xRjdXDmehFl~guX5_tYYiELX0@}(F1F)3q?tDm3&Xb2lE#_t;IrhW+!0Uo=s zfJA4q!0Xv<_uQ{f`n6#Y};Y4#nxpMkpkFS={Aun$F1dpkl<6K%ZbC z(9a#TrBZskzxPscYJRPKd2zx=HhQ1!{Wl2TAp!7pJL<2Fzx&g0K=Tsxela(pHe<^9 z4zy`QME$&kQe;99XWC7{o%DWkE)?tDKB$aN_1al?&0OLk;9(yj<=6GkAzI6#_rJs= zV>yEdw{S)96f)&K(1Ja&m8Sb!IeYx!E9}s2!B%n$u|b|{;4YbsKroG}1($%F0C`!U z=|Ww=iamNh={;krZlV$D1a>y^u`{rGYj-{Y&*b0hHE{oYWu<75mkXXI?fMv z1%lspgahL%*;{WERO~AG>sCHvw^LT|BH|S2OiKP&R7?sBfz?LO*g-RnMd$<# zvcgOuw8v$e$FhV%xl^3vE+{pxm#S81#baN%kUvpoSjF(8D6#D@3&mL6R$HYQT&E_% z5PNO}?BLL0ZW+zoz*|!R-z5$dTu|yj4MFPpOVtgBKWhYsclp|XL@>UE8;+h$?3j(G42P1=7 za&1*)J1{_!8hVc1fgStZ2OP%%MsKGgD2~2DN-eV6L#*vLFlnvVDoIgBGWw1N6sBHa zq|jqBR<$0SDQ`oKFZdhsfNIDEZuMnrUu%vWBJtS%?xhcO2BNR-{k;cx05ZxOOCGR2 z|301tXKaP3-MyN5qmziN0bP9qm-Neyqc~;#jDDt$+0Q{MwHO`afgQ`DW6{0t55vi# z!wg6k`|a2Gci37fNqRy$_zdWVd$@G~Il<%^AjxR)DD&UVmD%^{l$b#(D3+2w_kgE3 zB;e@(uSof;;_CH1Yvnt-gPFCb^IO;2Ka4#ttedVgA#Y$-#(^QFC18lCgANU0^ae0$ zly`m*Ch-??W?Cv76p4=!MGcl{cQf0BC-rqbgjJm|tL#LUU(|8>+~dXnnNOZ7;p8rs zAQm*6qQdA;ooscS(YiWmR~x1{se&-cO3i$_Rdx@etX^cowioS9tj!0&cI(x-ZC_NbxVwxcbt`Q)~_ET?u%} z$>$A5uV;3QpK3wP%&q)agQ0qm%Bx7-U3;idtqQen!GYT$#MQ7XU$nIBV$kbVkEKr~ z=<0&zNQ=cj+>!!nhFKhH;UOIphYJKw;c)WQj+*|qS6dIY5WnoC-4bz+Y{F2d|K8&+Qt*rY{ zk$2QobSNRWf>VU#a*r#e0@_7I^6ET+3H+IUER4ce)ao;lS-(g;2oEe437Y^9QQ7|M zX!p;;%w@xOFn;}KVps1f3>Bbw7yx@_rk214S%##gym~yHUP4A6Sj2iST*T+ zx7Sja{$OM_7I5^cdV=oAgC_6xBMz8};O+VYvg)BfOZGnl`^cZxmlUZdsJknX;=qxV zKsT{ZnDc6$b^oqa%no@wSUQsU)`08Lw$yyVTC5LDkUZw@K>WSgzdTfj&w>-ztYHKF zmXCb(k(}K9-+XT}#B=OrR>Y&8Ky*u>S+(_X;BX@ zR6wKrU@u;do*`!BAy0^x50QwX`3;k0+LJG27bX0 zp#-AKK;gH(FV;e28`SJ1{ zya%VxUbz-`c&@lBxhqh2gkhkpD5Xk9zoF9b_H=)7XEA@Y6&t}_8UOa)eY*P!6nQ4Z^ER#k_jlEC29q`m%aB-N6^KAA-&?D=x#oHd8%{7fmnF5S13M6&&8?`E)$7}=L)|06%Bl|RN0@cO6x zpbGs%zWB-)tocW|qA9+rcy5b#Kiss4i!Ze}^qD=P&ul++%mA3wiAT0}f{Z$_G5Yc* zmZngRSO`Ub#mOMz(f&B%sTtAFam1TR^DpA*(F{jqz=toBsF}g8EQ7)HR$CyR`3mBv z#Hu}7VabNT9D(?1?q%ylde1U*g(DdqN#l-0v;zHHD0e*vqC(;1!y#J^r&^9WHm)c7GTj} z$5)kKU#*xv$#hmZ(diYzI`q1Fu*RRG$xKD*?I^J-^Io??Pz7-+OskFeeVP`i!tvGB zB3C5eIk_TR6aXj6&dGcLk1FS#g6eZw?@pL+Q)B(S44t+5z51oykO5IyvU)1OQ0ttt z44bZ4x9ekZCQ0E@1)b_2zy#uSPW^#(cN1@OVaX2B3rq23II^C#kh1kz3lXrA0|W`( z=m(axI%%%(G^CZVj5+93pZvS0{sTFSrk1cr1WBB>3dZYHDa<=jnSMwIrJ2d|f57}v zpwk_&G?|@8Z)O1r?$(%i_TkqvJK$&}Hv8IBzT}ElQ{FA~!&!45^_Kv4XW-$^RuiY| zj2%)709luFuQOd?)O3c8_4Wi5BIL>Lcr-^{fOUO}FGV$kzSJKt&{@!PfgY!i*Sn!| zf~EuKH0Fq9XK5Ssj6N#o624j^Ya@$YW9tZg?t>7nW^@#CjF0UWIs_mr-VCk(z{y3I zZOggvYVlocQo=Z&)9=<{w8m{Nw~JOQLk4!Lhkow?BwFvT{MCWze45JQ=#B?z!E*m= z@Yg6PJHcdV;h<+XA&zv_LChO18GiT(f?@8h7IEPaz^@BT0TSX9t^*~J#BX1#xAu)& zKJdw({=Yu=*-sq(VMxv0pfJCEtsQIs@pta|?JwT;=zsp}?1z#2@?)w1PJCT`<@X;j ziiC36+Fd{OvH#~2AHU^mN0iY#nOnR2y?^)1fBcglec!Jiq-D~%jslHhoF3bQeFDcD;n#TV*9vV4{d*WQkR>~Y9i^%!5%qln2` zS<8z9L7w#lsi@SwGmFUnN{jap(nJ)?@brUOoGrk+oJ4+YF3KM&on zWWiagkD_euXamyEtXJD($0Kt*TOEh%55a#;0{@#p zlsi6eN0Fy4ODS$=s)w2-r_e|?m}4I9t(T!5SEM4%d4wn((_E1GJVUN0agC~~tY%TR z5&1}EMgHF6QW5FmY(IlU+7hLgyfQF%@uZ0i5MM(5okca%UBm}p&ak}-C5GOyh4U@tEKa$hwvv_y)mDbO!+Y{(P!3c*0~z|B1OrBp zl!&oWg(8!hp_E`vzWsr~r>4x)GY z(pX60OETSvluY{E@h^yw&IwcpqD@m9(HIjBy=4rCsO*fprfijv#>g&WI#H0-S{mZw zI>>2I_go_Lt1yQwRk2=HSJI}Cv7H)f$>tYfyP**_YI79Gl7<~v)5bE&y6V8S-W)vc z6gspj?pKi&0g@UP;@quhI%isXGpO(V;aNVqrx{F}q zCKp&(8TuR}H)Pg@utSr-NIKM$8v}*k3%Z|I9^syr zsf8{jBe=GO!!b{H1E;?Zx1BI`9YJj~!`Zl7R0SX`g0+7746w#yoCxapD&iDN{Q!sk zY9ry?&h#Y&DG@+1=v>}1MY7A@K85+@nAArG&J2P9c_-l3=dY~ zFAm|m*uXcfGt>>y2fxm$lM{fZ361OSPYef*vSPHvX$H-9w9SJi>VqZ8i9w^MZ5lK= z0G*7jgPzi%Sg!0l*&_`s&E!x=b0XzbsZ~ADA1?C6qhb|Y$OSa6VjayOJ@f~>UnOhw z1jWy_4uAqas5d#0LOE7)7E8-vCJ1 zxn9oiM2V(lc1r>2;((RGKPxtdl(oCMg`@+vw58&jE>K{Nw943Vk7r4B76d|7QK={RBCBp0dyZk_k z>}iku)!=;rixC0IxfpsWF=4Y42SP!4Aj!xyJA=hvNnYnCQ={;#tPYE zqY+2i_Dn$}8|5wzR%^*G#5~p#9|sYrbwD^K3@Z4{20EfK0*}?NRy7KMziI3E+1|$k zYOYlDiQwgX2YM+BkdNfEq&29O4W}%;WwtUum9S8Jtl*aVbYC^F|K5QlY{2Ug5T2N=eG`5p&0Go0L~n z20Dw11WrmTGtyGg`v8Bwo3zAv+3s6mZsuY_J@Q7dESC65yc(>m6W{`S*G6M{9gP6) zx08jem=q5kpIxrF@(@!USQ7^ z<8eC)Lyi4YGfe!9XXw>aL@z~wG{Z_U=bpQP25Vb3IU?gA(4bFLWqKKbS*C+!J`3lQ z?T%LbUE_`REd(#Uyn@_00zf=$o`K4og(=Q5?+9-g7?8rfMk<0tng9zY8GzbX)Si*( z>@J7wmwGiA(Ds9_E#w_$A&gLE=wvcgJ`T+Gkog$lI=CD2Llj zPMcm0I&cEHyg!`HR_1#7`C0q==l}2vci#TzzwuOd+vTk?9{tC^{K>EX%)?*)_!B(AO>J@M0D|I@Gj`Tbw@4GH&o^q)Wf#asXE?!Wl>*L}p?$WmB*>0QpHDYM_0 z9<{44p(5ozW*~ifg8!_KcKT8%m(TXKt^jiUl;8qCJ@_jdY#bkRPLh|kE8cNzFn1df z8ohUMKYwH}bK78c?d*5)8kigzWNYQSjtpjR8_ZjROw0^!>0M=Z+n|2QD%oxE)x2M^ zGDm^cckx=J;!Uc6CT6W5YNZ0-&onP5nyf#bYhI4N95y`urH$HP^vIs&<=hc!w;HZ# zBVQ|zb9vjH-QO?_aHKwIRP;b_sCwhZ>v6fG$g3_b8ZfkEXUhjb{piJ%&l|QIR)Yj_f&}}Ze%+(L%njm!%JdIL( zu3!k$<}b}GJz`$IO-GwBIBr-drg>Cf1v?(a__=ClYO4jNDnt;#5Rg6bN_ihSY6wL` z$`dmqGQ;7_88GB!mNgTLg$q8%4lsuC4lrOlu!+Umomg#2-BGB?W4nKo6S+__$IOVV zMj^uIms(2_drrd`((sZK1sbGjfi(OZM;Z#05yi!Y5n_`_!$S-!I~PdPW=R)~nA^Y^ zz114PQ9fb^>lyc* zNo31Q07wpD$97wC0A>AeC5pvmNL@P-#ZvV=9}j3eOB~CyH#Rkn(4~|NNp#$1fkJaxUj(2vM%IfbPjd$@ZhY3MH z8wHNtZgm%3AIw%CvQO>mE{au8(Mh0YfA8@AWb`+H8O43^@YA2ksw=n}V^brBRlwJ( zuX-4HbvrdU1*Xz)+&;iJtnjgG<+>`r9@)Zbdr>7o zD60ZOR+RV>>*!H6-1FwL^)?RxNZcM_fes?ujcs1odVCEkQyqWU#~_bK62wvyjLawQ z2;(HVx~FsIE`T}Pp%O+)N%;*BUcc_pkI^Zr%IlsfJ%&Alr_BwriJld2gR1JjAq|qR zfhnOu`~Y=-9G;_9+rsaYW=ugT?}`qV>hNo&n&ogM43H&iip5Dj%u7bQ6H3oRe+dO< z2bv?jK~9ig3kYy!l(kew!&jY$YQa3?E_4jBiI1InwM#DI5-Dac3;~As;|7E1TId`( zmfNr(+JVs!NCj3>ZV)0WCGeN_-^$6zLx>oS0d6?>f`Rj&$3?)d z%v^F_wVO+Q83wg*`9k4*_@52(^~2&i2!F$R^@@Yt!Q2E$jUmHWj$kf+_>gUu8li{R z`MdiyJ8$S`4VY`#>qRkHM+XqDS7I5^Vxn$M(hY3eL$grKk)@ycB zWM(HVAxo&c-WCj8uS-24iAXs&q=It(P=abcfe9|v$1DS7Xkn~lS5c)dmn_XRVU;`S zCS^zj?RE>5;OHM=7NJ&jVp*yoNucY{n4TR>UZi;-kWGx>(IiHIKM5n4zeSyeV-w9# z>M0f@(wrxZKw}wme;i~|VYmo^uel^Jix?DZG=v+KF5}mS=DS{JSw%vv0 z0d}Mm_5m3=fLcUjR-U5D$ch8igQ;1uEvxRYZ(v!Tl~7y_yyxF|C{R70__9(!<5)J! zCyrwH(JXZ)~lB8)8;&=kc8W8LWd=dq*5q?FaU~LnGBTiL4!LOiM-FTT< zV?g9}IFwlikq(FOD>5A=r?f$X)!!$&?~DdPA4X#!6C)h(4J1ZlvPg;virHdb63rR` zG)(z=30#IXQFHVudLM{#&};*YNryESmfmCug-|wE6zVynvz%_VZXb(vgPBvu=zdPT zwyrj6C3jTd?2NwA^qlfD>%2NIk|^|}TDCmGPr#E7AM%qK^#_m$!0iUm;}2k}+DaeE zuLc9Wgu29Ne;B2G1l`jQm1`dII7~&1phz??v>K3^x)R#Xs#9qq${cKuo51W^4;iX_ z*u0|&r~06e02-lNaiT!54yM{rgIc68xmjsncFOjA7_!ij=ApZV$1LhiLUN?psqHoN zVlN-F>k5(90S5U!*Ykk)jR4nZb}TfOayc2)CBt>`SsiGq>X&#%aF0+OLCJ$^eQjU{ zoWNfGBx@c3FOo6G2eec~OQ=~%g#`FcAC5j6tyLNjf@h~~SuH3gGXPC1?2e9>;Xw6l zl{${cW{DnwzMLlo=u?PhaRBHuO4=8_`IWlsa5wBaI;>VQM3mwH4JA~OH^i54ap;tD zaT9k4p)Agifm5e8;6#cI!AV~@XwD7`Aapb zTvd-Uvf8cKiB8AOTs()=%o~wxjLmpD#70W(f!POAM!hLKGUgCYP_kOZAH`&wJO*X*N% zDU2mH55aphT={pD=&ai z;K6jT9MDwkjhm3d4;OaQAVBVPz!;=#qizHF8tfdIv5a!I>Q$V!NgK?BsqW&7WI(xQ z0ggudR2L(Qg>)VRj#|%WB(%Xz!lh`G*Q{i@G;HE@4e55D0Z7z|)Q9spLJE*05xNLo zTb~BBj}y9fJj=QxLPz%uLJyOikwfTIEop;pP9GblyaV+_c|fLD7b!?oYCrfOk#mfEK(FJCL-A$Uxh=LC0;oHb`}DV7Gm6+NX#T zU}I6fXh6jBVbamjw&Igun0}J@X8I)fiHrnvnIq*%B6KuL^F%c~K~AAW3sa?${T2-* zOU#0n<@JqyP@5W|_l@h>g=%Mw?+AAfOd15uN;lQS9Ly(7AI#H;+-?llJL0<3 zR7!|y7=i25jalB14$R#$AhV`j09stve5>gsy{2!R@2K2x;gmytMuwKr@WEV%j1R)# zA%m{Po8dOeEaMq|nE*&l3FtQsC2SUX_;H|wz`LLj8r~xEAU7vA2GMXNMjFgNC_xU? zP(o3?kh{}}yqL0GEZl7oc`jHg>e7zWV3xJ0LrNsl6uoxPE}gL#_DO^+PAlq=D`*Yv zAq9{%jW(nJylsuJBU~xG3Q5?xL;xaFHw}z6C?BxhAq505MCa6-gwFAWMFX9g?XXgV zck6U14(Jcsigd~kpo>Qc1ZI3D( zvLVWee+|k}#SY1#Mmgql9OW3pR+I}73-H1z^2X_hk*K*MOCG8+ z6K+3-pxaM4GLmrn#eiTEA>*a@8u$bz5%Pn2e+Bnm|g3uHwI z4~J89cn=h1k`P#28fJSH7_)R2uKX)Aw|M@$S8nA zzpbl?%>*SvfQcWZf{fPq8)yK&Jn1}yx2Z0zQqBs(6W;;LoXW?Zhv)Rt$`jaEW{Y_^ZKLQ8lSIj6^{^4d-};T6tzT$2a0! z7*b@c5a*(Wap!eFT!I9ofq&tu9N`}y)c6;!%5Mq(8ia%9>d}udEje;Vs78BRQLPr? z32~kys)ZO&UyP$#8qZc#n-Jq$QEf`k$C0FFTw)Ou+ZY+AF-x&@D6+*YP1@?1SxTF- z%siwr5DNwxf_o19`%YM;T4{}4+M-to>sY*jO$U{Ps)X?v!WvnkP@1$$)sLnLYZ1t- z3vjEJOscU=X+vQR)+J$WG-oZWnHd%V!kCHHX=&7;3ME|%VNG?caCtjgMrw4=5Gx5r z-L&F)cTzyZUs@5jwo~EK{n5f5;_!+%RvX4a+N^unWPkIZb*Eyb%#F4;HQ0H6MEoiH z;5kFuY(N@l8N+U`Uz}-TraL<1$sxd_d-ojczlbTYET?>s`hf|*a%DC^9Rw^zlIT5m zB@&=mr+YRsR$?$%3wfFHHJK2Vt2tnUAiJ)N3bp-IpX@)x?UUbNSIH zM7k_ISTI@Ea7g5utPogmXyUb|iR0bbO8yn5srO-!mCkCv%SX*u-6-|60j$WfZN$?= zt+fVk)nIL6w{`}{8@He|*alMJ!5QPEQFX&QQ`L+T2sGW-8@8z-nytH^>ci5pPd3VD z$gSFeBw&cjs+V@t$fGO>IUFxC57(<}9h(%As7}fjHuwt)^@|QuBm@Y#G?0j&*fPuW z+ExwW&MgYW;kf0VCeKhm7!3f;N+6BUX4rzV|cz*VAKl5Vn{v!35blz3~6h1<~f;E z4I-)eChfOjG^k0eM>9W~UFdeG1`D(SVr|xeiT@>7Fxsczn{;4DmBti(9jOMP1DD-o zbk$Qn-yl12ev>M&2sj<5a_UINSA4{=xD6!I>c#TFZQ?Qf^ zR#~HlDBCgEk~cJI5t@OMnk$unc4gZ{C7Td$q`6W^r6IE$wbH;9;d?{nxz2m$;(aI$ zW_%m!qQd<91@ktpv~sT*t_W2P2JZwyQd$u~jBZS64T21epr6VT znF;U@k)hhHZ~(!Anj0;aUQMVLqB^FRkUKLiHq5oHszn+#)rCU@W!GBA%ryW~Yq1K~ z=5?A*CbS-LvfCSW8``Bep`cHyty*(dGz0+C@GYpVLVQwfol-HF7fe+c%lAaYA;Qsf z)z+;Dhd<+VoNk10lXC_#@y%4V_4F7hzD!~ubp!^&z$VP5=Zb-vO%2Kk;M&9DtLkU{52Ru>W$3sJ6!8 zpz$1@mekhJJQy@iR=As*SyIC2LFj1!4(%<}R=C*Evy|gmO0g(K^0C79l8==Mh);)} zrICyoi+gF&C*q3E;7i*DRte_$MV2jS`SpXCX zoz>1E5>KPE+BhwY+FPufr9G;~&`*Ft>50B1l{G%Fr10r>kGBcRg(VP}Tg7P@DxAvP zU7<6hkj5lLmgI`4HRB{$^T#II-)~h1So_rk+^-ZsICGd@mx=7JI zWeToEMPz_2Ce^SZ_Sq2WPmP;2*U$j0iq}bfZKpswPbyM9Hn{^b!p)3DK?O8cCKWa{ z$1Bv_ScsYpUgCOgzFq-?^+PJJEic7%Rx7XGslZ0mptNWQ2A^X)Sw(5(P0y3=- zkp{)^W(|u$#uO?@BF8EffCk@WaW+C%G%@H9TG4NJ`3vdPyBS#PR^)xs`9F z@=VBcD{p=t>gNZRAv!QwBr+okpLjZgcLr1d;Gp}&?j4IJf z0uFmptSnxD40bRu+s^W=``^a)j#4RrI-kWHlx}JrB-e@E%K3yJ z@C9P?JQwsMNSwW53E{ppTOW!-fjHF&W*@pIweoFLCoudRQjE&NJCY*A5RO3C77nG7k&8*5stm4>I4WGciYf*fs~IkY4{Y3~UTF21=y{{%6I`IVXP z8CrqO!${CaBbpX{zyP&QLRjwf3#T-V5OW>Z5LYC=MU|}ms{YWrmJh`>_^1I`PyNPv z*aqo_Ca!j{Ws-Wz@Xz|=DBO(zcMB{l(g8GMRq6WX)*qMwW0pX90D3EB+>aga9lh_1 z`u!zY_Hsagt2Vut_d~k0LN8!$etZfHX>#d-3a9>6R zJWLgE29@>E)zWjdCk5%T}l>Ok1swE@VODhtg&g2ijwx%J}gi&!!#|teASt0aYE2#-hiV zg$O}<%z1}guGBqViXNXu^;Sh(g4O~PQRWVv31G^Dk@$lsFg$}f;5{S0EZ#GKSHs(tCd5ea)X5DwX+sXnsV{aiAqM9I+uK?L%Nn+(LaT!ispA2uMN7jZ&fB zZ^d1Zj6DSHloCv3xW2|7$$rD+Yx-d2Zd;X8B*Le(`~sze!X{j?p>bwm;f6~@VTU(a zc*HL(+%SqL4D;AjI9NvT3Yc=hl1{-uT$n0A{aC&74Nm# zq9nXg#>PH-8v>&6_L%!YC%W1oL~2pz9oksCfwFysI}##AfLhHO8F$dZ#2Ed?B`v>3 zzoWsX3Z)D~ZXg%<#(f+%BIg6B^^}GdDnJ6i5`1B-v|Ph?7MVe(HEfF;5^TYudZ0Bn zQAy(GAyOSPr@8@Lz&R=#SJ(w`55JGp2XVEip%hm=m%ZX@d&(C;xgAzc@jEi0yMOgfzKo-NOBH+tRo%kc8~Bdsu>PDsVG5*LWcPYP!sDi?08dlNS*P0 zkX~E`UBwluUJQ#xUE^iA>y=Ira{Zc^r(wZaaXkvktlPuq^YI)WNI)v2 z1RAMNxVw(@3v<^dPqi-ejt8ekz^Y$|-zTr)Yeudq7eAuOT>Y9P>cfK1vzaL2&S%PR zPd}j?grN+{q*__}9bWAiUhQhCVm8}{svXx2U^*a!^^zs{?QUGX8R;Y4hf0E9+ilkI zqZf)heRcc@H?T)~0(%G|OxTlkKbP10gG=lIpb>xv2{cVYWd&P?FT|u!31!ty>Cr=& z+}4MQT(MKTwCy$(eo#Df=w!r~Yd7`j)bS`AimW6YS`>G1wm{#UdF=k5AsssR&ULZ{`^FD5^Nz=!kK`=*hW zi6z-_(*9Pbv9*Q%hbnrQ{2ymb`FE$qS~Ie9@GW{i!AQO)1Ilv?);9 zJEi3LQ%io|l#)BAmVDuqlFyr3@&!{$o;$VVo+%~Io?7yPDJ9RET5>R@Mr2tv<}1b4ju3_+b~8KQm^r{r+sW{{mP% z_vl9Zxxy{rIm)QmJ^rq6zVdaKW#13$K;E)2uaeW+mz9G-v1vGmxWA>ZM{#Ak#tiEEcz)<#|5#|^4lOxSIG_7SJZ zH6Jy(12qbCu8{pElQUxpjN2))!(Tc3T>?P(cQTxa1cXMM**uHqi_?-K)bXQN>3`5YJiuZ_HW#XhpxqmleCUb zJwwki0W#8Mb=ZM|R-6j=>2t6;@d<2F19Xct3EN4R;`VZS1~QOSkUEy>tJFLXa(G(X z-r`15vvnb^E@zf=`_^)a{-ne_ZKx=acF>df#;@bUHf;@;TJD2UBbLF{g zHv?|ME|#PgukG`q`Y30bXIBCC{u~Ha=c8W@1D3BBuhsk|fgL;r^9fN@u108xm`3v|3+Rq@0cE@Tn^eZshrAKWWaGWgr}3me(_q279+3?one}RkF(6+ zBE|h+NkXVo1U>qPSQhoI4)k`EJa7vMPDY5F5RybU_?rrMx z_w?^+z~Cb4U1Ya-=PCBTBmh;9dh_Mur{cKWND)=PfD|I~j@!pt2hB&uwE6Rhe)eFu zT$C>$;a9nG&)WWX94i;^S?lq$XKn5sz~mlA3O6;?mP2O?mzQSPM!HD51#oa z51siZ54VZ~r~9uQ+zDfbVdwp2S;V|rMQ6mm=jGg-R8hdfI^>~cuXbX^ITtEmL2&S= zmq^HWwGatBR|%1qVIf0l#SM}ghjE6lDRE;M$X%)q_#D*o8W*MAESHiv-EM!Df;E!{ zV`kJRv-GAV+wDs0?fu-3BIT|>Xcve2Sv+FRI~-O^)%;M(avDxJeBH#ZQy#IBC%;cp zey%t;ez$+(ZtuihIdQjR;;uJwH#c!d8ba73PPN)Ci#&}j7EQZkh;A<7w9O^Vw7JZH zq3%n7jDN!cRKbvI=g$};OE2)wbKv5WDP=u#y@BasuG2yF4W4l&q)k&cM(_J8)K3&u zze=Yj`IR|RuNa_O$JPFBzaQTrhUx^f@uoy`IS_S2+c}ONN~@2*j>2`eS=F&6x(h2N&y4Db;Qv1H%HA*MbaKT~e7D~L zk@n8Y=ne*{x%VIKv`3f_tEB12nYVIZxp?0%)kXFk_;7u-{Q!NhuP;6D zkx_NkKPj84v+RFxDRJ*dp^z$beUl+&{a%3HeUikpV~CBH-x)WL!(IMU^-p*9cW`nG z9{Wz&0~a*;HAY!S~QZRSdJ9q`lYB#_^FS@PBURy6^gfgczs240bkwmZ)(1h zBXYjc+<2Ul@l%MlGzqLO-e8tk8Kr;|d0^y8`P5IqxVp!Gr^dpQSAMwM_fLdBM>9p@ zQ$O#oGGWgbGxiV8^5=>H`R2>B_;2UcI~lCct{iMTSZ?D{utMK&+sViMmRC6QVSQX& zJ$hmCgQidq-ol9mo@BF79Pqyudjsez(tP*-jCn)|5c7XM$6ukhV-?MUK6xs~5O5s` z%jW^zg?`4TfM0-PMdf7#Troq*m?Dj_{8QYbu(H2qxfb(X4sV?;R|%@N%pClhb?rIL zzTM?+So@$Pl^l8mAerG`S5EjH7anBPCNf1S@tnm6oFF2tw@MI123gNb_Ut*C4718! zOVVwrV_c+^yUSAjs9T=rzpDoMPUd8;JiFxL>?$vx@5S>IaD>wHRd@<>qQv-#f3y||`JWXK$mC^ssEluC-YxaKKCQOOXc6e^|CK=VK& z&GR7AJV+Xp6ipgc%J5tJT({Koe4h8`^LxJE*XNJ#xsG$zK6~D4t-aRT`Rf|H+;&a6M9UJi>n9uCtnF_o@0|l`WMB;<@fZvmWe-oq`bD+MtlKP50uJIXS zmI&s6Uo5c?-2h+yN$w=rAqYLhJBT~L_=RWyun!Osy}CybyHAxjy9@dIMoAF$3BXeS^>&-a-Q6L~jpCqYWQm)j-Sf zKXD(tv7xVl6E!4A*oxRU033>VaTXTye^Cdt01yXpOA3rUnMetB#mR{H{$qT20UGf@ z5a0h63m}}p0{AZY?^u9(0W}jCI9#B52-V=uRtKyi;=z=(lfVJc_%Rr1!fx?94uEKb zZ~(CH_hfxIfX4I}M@8S}-qD8<&`1_45~f^qkwxDb2LeI@31WOWUv{h-bmBiuvDz@p z(a>y1Fg0!T(f|LSvl^tNYqJo+VZTjcXuA3JtpBVdnfA1S`Uzx0Rffg@SO0A$Buc)XzD)>%vdG>QzK zf*J%Af!k81B?d9U5R78}*2Tb0#L^UW>EB6gz`ubp6IJe$*dSj*VuQEq|01rT$b`Hm zo;oD|LB`BPHXV16@?o00$&Md$Pd)!7o`DzSz5lN<@IT63JBno|d&yAocga ztSo61O6wommO(fdM&dNA2it(j3d$i2PsrQ|Z9##$5C|d?VoiXlw$MDKNE8l_1?rJv z`?44^{uyosjHE9MBSRp%Z)tV= z@ct!$AqZymzt!vZ;Xf6-9pHdb8%ntYO_nHj&`%`3_HdHGLNk$pPCy1-!IR80XgQ6T0tF2K{M_3I7Q}E!CWE}^lEiuo zxa5PzrxO~FxHFJRSyDE#b`cC&s?Wa*6F3U^cY*P6kz*ph`ExAz7#az1Cj-e*LkP<> zAPHfahJqm{U>yXTRgXkVS=xvV^%kP^l3nu6=XNF5e11i%%sQwRtF z3pgK~HS<|ur)2?6!U=a|s1!_2EM&3exWY?~!0Uij!Phh4KRiQ*TJUrtHq`#|2La}S zNFp~HATaoYfbI9lQVSROwv5D5iy+{cumFVcALKPe4K%`1i&_9Sa^U8`d_a^JWC5;$ zEe_dX7*R-fM|aF92|^OnDWDzn4O;5a28`xQ{W6HlAP#Maa?~fZT+~H^Cy3GaL+l3V zUzBqVasAy>0nz8$zq=|xmRy8UH;C)+ZV=9h!+!IFa0J2#tw#pX$_DO{bA$N4Ffm_5 z-VH#8hnnD^6%h^#v{AqrJV!?d`4rGW&^~;wj!urw0OSu~017yQ>*%8E4tStPI58NI zqcaf29|$RQk*ff`935Rq1rNne3;-U8(huZo^9SS*v5+SNZE>8rI*@@b%0L$$X%kKi zwE23Hhq^gX3?$Yg9un#J10)Y2r5;MDN2KFJMYZ{TMbFjI%|Yq3krM;-0M!i22PXz7 zC+UyL06dhTyuWe7Hw@3l#~RhkbFNFrb%~ zdU0?d1PU}6z0XUJg?TV+CJ+T-m_x3G$dC*sL?Bo)Dhfl&37|3??0X`Dgh*#|+8C>Zv~{dWsS_Blsr7qOxZ5;i#U5pzEzRU!vuNbF|r zf?0=6Lz*UXmD46)JqVoVDBENcU0&)s6v0|Nub^XQv-KqAV1NG-lZc&ux~#iWQfud zd%OQgMcB*01^^m5c_woH1M$d_#!ySl6IBIzsecM08roQRA>JT#q2UQ~qqDArv7`g(QOtcVffbAuAYBNwec!wEnFd$-q)d5X65KcI1 zL*c}m7DPD6)g~B862EV=Cd3C7A8lgj%cpPaCWMpu;@;(>y^KgmhdJlYlRhH>jo?QZ zQs(;V*%tu1tpP^JLom`baf=|&{xOM{W{>~}1{F|f__B!g%J5Y||5591#kno zfP)Ja#spS7fGMlM9$Pgr!tiAg-=qP*0fQ_(63{~|(sO~C=^`Tr(*zU-GV(I^8y17Q zA<&IP${=#2ggjhcz`%VJT+Jil8yebNG?lo+B!Tz}2r$qP71&WLVYu_O2f)D6Q6w)y zBSYgX=3EMZ*63@|h~?<$z?@02YZ%_2iPPry?=r&DNa%C03qj0Qs9>d^f%*pxHOMDu z;*p20L4H^;vGXc{6jEJj^60YL$rm7|razEOi*fxANcf!Kg}E1&ccFI3nCI3w{j z031?Z==Z?6uL#0{r#7U6wRDIIQW&5zF31*3R%nX^1DOG}bs&m9+QA5~UjwhEf{X+4 zp(lxjGH|g;gIMCAD@2ekd=lel&>bSkIFj%qi3&n86{!e^D^x(qhI9gl{6QFtM;n7jQ@;Sq2be9nR#+G6_2a z8Vv;$zZ{49pcjjYdl*f)?!%d|hX#q>qvT**Q3QEp(C+WuPg{UPuam_BL4Ul^R)R6c zCTK&ov>^??U_N060M>}+dsIunMBr^Q;8|S>%}mIKgXSg$zQW&8tBw*{WkTz3C_Y~W zktf_Ca;3qy@_>wg2K7-a)O?B#(bs)e5TMg3sB;ZS69GAJa3cs>$3z6X=s@oqkQ~vb z6SS2JM0Da6Zy*vRG$|mjOhE4fuvba(0m1E0OObFngmx5&J$u+t@L}`4VL4 zjIzFHtCvs)Gy%fG>RpGO>@jc*v5dAjEb?OE3&jmcWz%dU>Dm02v?5e;FTu z3;b?-Ks6EjHAMP3I1Lpb-5p&)u}2rA^`k2oO$j3fh6G7spBvVvJN=(-6O1Wz1?<0q zO(A_26a+&H0o#yn?TEA@Vn-2=sZC&@Gtpyc5Png!n1&_P{*&UMXTq`U^NgY7f`E@WQm-Rs7+8bB3P6Y z1TcREKu!>#@-qpaOAvP_baXu?oRzLMYxa4t=bL44e#@8k%C@ zA1K*O+n>5SG#DxGAaWz#2E>JS*8yF@=)xo9UmVaEVfGLbYO**B*bv7g+L?rAF0}PX zN!-%WuxJHv3feR!{t8Yepm?L6{#gTpmj7U|zl#6wGgznrVS9tZ#LQJ( zemUNcxf08?h_RxDTfz`e5`2aUUV$%5EVK0M6=U(jHM~>>b1N|g5Z`q`4$FZ55UyC^ z>o8*7(m)$#3m^h$S`?Bk0jbe;GuTgp%o||qMb1EpSMDJUcpxA34RAfsQUnq%0DJ*t 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 literal 0 HcmV?d00001