From f9ee535d4dbd60dd7961632a59540fc713a900fd Mon Sep 17 00:00:00 2001 From: specCon18 Date: Thu, 21 Sep 2023 01:09:50 -0400 Subject: [PATCH] fixing tests had to make serial to cleanup --- Cargo.lock | 188 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/lib/lib.rs | 175 ++++++++++++++++++++++------------- src/test_data/checksum_01 | 1 + src/test_data/checksum_02 | 1 + src/test_data/checksum_03 | 1 + src/test_data/testfile_01 | Bin 0 -> 1024 bytes src/test_data/testfile_02 | Bin 0 -> 1024 bytes src/test_data/testfile_03 | Bin 0 -> 1024 bytes test_dir/test | Bin 0 -> 1024 bytes test_dir/test_csum | 1 + 11 files changed, 307 insertions(+), 61 deletions(-) create mode 100644 src/test_data/checksum_01 create mode 100644 src/test_data/checksum_02 create mode 100644 src/test_data/checksum_03 create mode 100644 src/test_data/testfile_01 create mode 100644 src/test_data/testfile_02 create mode 100644 src/test_data/testfile_03 create mode 100644 test_dir/test create mode 100644 test_dir/test_csum diff --git a/Cargo.lock b/Cargo.lock index 4324948..aa5bcd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,6 +239,19 @@ dependencies = [ "typenum", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.4.0" @@ -304,6 +317,83 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -314,6 +404,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "hermit-abi" version = "0.3.2" @@ -356,12 +452,28 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.20" @@ -442,6 +554,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + [[package]] name = "password-hash" version = "0.4.2" @@ -465,6 +600,18 @@ dependencies = [ "sha2 0.10.7", ] +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.27" @@ -606,6 +753,31 @@ dependencies = [ "syn", ] +[[package]] +name = "serial_test" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" +dependencies = [ + "dashmap", + "futures", + "lazy_static", + "log", + "parking_lot", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sevenz-rust" version = "0.5.2" @@ -668,12 +840,28 @@ dependencies = [ "rayon", "ring", "rust-lzma", + "serial_test", "sevenz-rust", "tar", "unrar", "zip", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" + [[package]] name = "spin" version = "0.5.2" diff --git a/Cargo.toml b/Cargo.toml index d96ce80..2f25142 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ flate2 = "1.0.27" rayon = "1.7.0" ring = "0.16.20" rust-lzma = "0.6.0" +serial_test = "2.0.0" sevenz-rust = "0.5.2" tar = "0.4.40" unrar = "0.5.1" diff --git a/src/lib/lib.rs b/src/lib/lib.rs index f8d44af..938355c 100644 --- a/src/lib/lib.rs +++ b/src/lib/lib.rs @@ -1,9 +1,7 @@ use data_encoding::HEXUPPER; use ring::digest::{Context, Digest, SHA256}; use std::{fs::{self, File},io::{BufReader, Read},os::unix::fs::PermissionsExt,path::Path}; - - - +use serial_test::serial; pub mod extractors; @@ -40,31 +38,33 @@ use extractors::{ // extract_exe }; -#[test] -fn test_extract_zip() { - let input_path = Path::new("src/test_data/test.zip"); - let output_directory = create_permanent_dir(); - - // Extract the zip file - let result = extract_zip(input_path, &output_directory); - assert!(result.is_ok()); - - // Check checksums and assert equality - let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); - let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); - let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); - - assert_eq!(checksum_01, true); - assert_eq!(checksum_02, true); - assert_eq!(checksum_03, true); + #[test] + #[serial] + fn test_extract_zip() { + let input_path = Path::new("src/test_data/test.zip"); + let output_directory = create_temp_dir(); - // Delete the test directory at the end of the test - if let Err(err) = fs::remove_dir_all(&output_directory) { - eprintln!("Failed to delete test directory: {:?}", err); - } -} + // Extract the zip file + let result = extract_zip(input_path, &output_directory); + assert!(result.is_ok()); + + // Check checksums and assert equality + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); + + assert_eq!(checksum_01, true); + assert_eq!(checksum_02, true); + assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } + } #[test] + #[serial] fn test_extract_rar() { let input_path = Path::new("src/test_data/test.rar"); let output_directory = create_temp_dir(); @@ -72,16 +72,25 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); + println!["{}", checksum_01]; assert_eq!(checksum_01, true); + println!["{}", checksum_02]; assert_eq!(checksum_02, true); + println!["{}", checksum_03]; assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_tar() { let input_path = Path::new("src/test_data/test.tar"); let output_directory = create_temp_dir(); @@ -89,16 +98,25 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); + println!["{}", checksum_01]; assert_eq!(checksum_01, true); + println!["{}", checksum_02]; assert_eq!(checksum_02, true); + println!["{}", checksum_03]; assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_lzma() { let input_path = Path::new("src/test_data/test.lzma"); let csum_path = Path::new("src/test_data/test_csum.lzma"); @@ -109,11 +127,17 @@ fn test_extract_zip() { assert!(checksum.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); assert_eq!(checksum_01, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_gz() { let input_path = Path::new("src/test_data/test.gz"); let csum_path = Path::new("src/test_data/test_csum.gz"); @@ -124,11 +148,17 @@ fn test_extract_zip() { assert!(checksum.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); assert_eq!(checksum_01, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_bz2() { let input_path = Path::new("src/test_data/test.bz2"); let csum_path = Path::new("src/test_data/test_csum.bz2"); @@ -139,11 +169,17 @@ fn test_extract_zip() { assert!(checksum.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); assert_eq!(checksum_01, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_7z() { let input_path = Path::new("src/test_data/test.7z"); let output_directory = create_temp_dir(); @@ -151,16 +187,22 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); assert_eq!(checksum_01, true); assert_eq!(checksum_02, true); assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_tbz2() { let input_path = Path::new("src/test_data/test.tbz2"); let output_directory = create_temp_dir(); @@ -170,16 +212,22 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); assert_eq!(checksum_01, true); assert_eq!(checksum_02, true); assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_tgz() { let input_path = Path::new("src/test_data/test.tgz"); let output_directory = create_temp_dir(); @@ -189,16 +237,22 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); assert_eq!(checksum_01, true); assert_eq!(checksum_02, true); assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } #[test] + #[serial] fn test_extract_txz() { let input_path = Path::new("src/test_data/test.txz"); let output_directory = create_temp_dir(); @@ -208,13 +262,18 @@ fn test_extract_zip() { assert!(result.is_ok()); // Check checksums and assert equality - let checksum_01 = verify_checksum("src/test_data/checksum_01", "src/test_data/testfile_01").unwrap(); - let checksum_02 = verify_checksum("src/test_data/checksum_02", "src/test_data/testfile_02").unwrap(); - let checksum_03 = verify_checksum("src/test_data/checksum_03", "src/test_data/testfile_03").unwrap(); + let checksum_01 = verify_checksum("test_dir/checksum_01", "test_dir/testfile_01").unwrap(); + let checksum_02 = verify_checksum("test_dir/checksum_02", "test_dir/testfile_02").unwrap(); + let checksum_03 = verify_checksum("test_dir/checksum_03", "test_dir/testfile_03").unwrap(); assert_eq!(checksum_01, true); assert_eq!(checksum_02, true); assert_eq!(checksum_03, true); + + // Delete the test directory at the end of the test + if let Err(err) = fs::remove_dir_all(&output_directory) { + eprintln!("Failed to delete test directory: {:?}", err); + } } fn verify_checksum(checksum_path: &str, testfile_path: &str) -> Result { @@ -248,22 +307,16 @@ fn test_extract_zip() { } fn create_temp_dir() -> PathBuf { - let mut temp_dir = std::env::temp_dir(); - temp_dir.push("test_dir"); - fs::create_dir_all(&temp_dir).expect("Failed to create temp directory"); - temp_dir - } -fn create_permanent_dir() -> PathBuf { - // Specify the absolute path for the permanent directory - let permanent_dir = Path::new("test_dir"); + // Specify the absolute path for the permanent directory + let temp_dir = Path::new("test_dir"); + + // Create the directory if it doesn't exist + if !temp_dir.exists() { + fs::create_dir_all(&temp_dir).expect("Failed to create temp directory"); + } + temp_dir.to_path_buf() + } - // Create the directory if it doesn't exist - if !permanent_dir.exists() { - fs::create_dir_all(&permanent_dir).expect("Failed to create permanent directory"); - } - - permanent_dir.to_path_buf() -} fn sha256_digest(mut reader: R) -> Result { let mut context = Context::new(&SHA256); let mut buffer = [0; 1024]; diff --git a/src/test_data/checksum_01 b/src/test_data/checksum_01 new file mode 100644 index 0000000..205be5f --- /dev/null +++ b/src/test_data/checksum_01 @@ -0,0 +1 @@ +c63a52591e30851e2dc94705902a592dea89c3134166df1c0a8979f90d9ea0a2 testfile_01 diff --git a/src/test_data/checksum_02 b/src/test_data/checksum_02 new file mode 100644 index 0000000..35d7fe9 --- /dev/null +++ b/src/test_data/checksum_02 @@ -0,0 +1 @@ +dd5c253429a3a1a34e382ff0158555d4a573ace73c1a4fb60e5b215053d8b6ab testfile_02 diff --git a/src/test_data/checksum_03 b/src/test_data/checksum_03 new file mode 100644 index 0000000..de13d75 --- /dev/null +++ b/src/test_data/checksum_03 @@ -0,0 +1 @@ +1e103ac2fc72820330a578900880744481726c7752ead976e3a30963ee4b39bc testfile_03 diff --git a/src/test_data/testfile_01 b/src/test_data/testfile_01 new file mode 100644 index 0000000000000000000000000000000000000000..a30dcc5c4a14aed9b49ab2c049b5ed744ad0e9e5 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/test_dir/test b/test_dir/test new file mode 100644 index 0000000000000000000000000000000000000000..a30dcc5c4a14aed9b49ab2c049b5ed744ad0e9e5 GIT binary patch literal 1024 zcmV+b1poUje3J*R7iDxF#@a!eyQQ*H_PaxkSh~tW=+lE9%{Q01OUT@RhR_o!I6E;3^ zEl`uK=i(S|pX(8!5)_zhTykF;27yuLN^67g_zEtEc9{Z1-dxp0h1(`b#lpJ0MV%$* zRFkovBro0x6MtE~=v?xxH+H4g68;hqEnw{zVoSP*+;uJsrs>9HJy7&F3|p&yl7|^C zkc18p`k=kM$sz@rbT&P~q9vqb#6|T@JimML?84SD(MMwM z9{+++LsY${jCbaZ$~!6J_| zLDb61DVE#sq1zJv&Q`Rp^TQg;d3G;tbzzyE@%Vm-J%x_hG5gSxZ4+Tfi*ieD09)3m zBlkwuPLj%h#4$f4OcnQS(+^bsru~Z>?y+24N!FSzRv@n8Nq4c(ZJ0J`%Rvdkx^Os4 zOghG27E|llA_WDUG)D{3>rj7uYD9Nt>IuK5v_418>)Z+)0`yrsJEN_jM*@;Ou8ikG_|{g1-6QfPc{Qgo9!`PK(7+#^pngc!^7*%KO`2RIH~O+ z|7zxIu(V;QQ0{%`YOSUNw`{jQWG+EuPyjKqwnP4y|R%q?Sd+x3f-yBPZJWQTh#LJeB%84AtOFJa50S z=j`SQHGsN%0l_-s%hqX^&H#*#CDGR-aaE03>4s?7Vf4m(|G*s+I}k9YLD$1!v57~w z6Vk|44cDVa$!Ux^MA#4jlEz2_?bcmSO(_$Xe*}z22cR#%>&nX0e zhIRub8)Bd=$mEebJd>IYkjycc35$w(>6wP{#AVyX%qT}ga8f^e;5aB%Wz^iCDW|(i zJVyM};xDGVp&K=?o2=f{=nXtHV?l*Rk@