diff --git a/Cargo.lock b/Cargo.lock index 6ea048eea..e231de0ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -320,6 +320,7 @@ dependencies = [ "hex", "hkdf", "lru", + "parking_lot", "pyo3", "rand", "rstest", @@ -1542,9 +1543,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", diff --git a/Cargo.toml b/Cargo.toml index 5fda0cf44..7e43de167 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -135,3 +135,4 @@ zstd = "0.13.2" blocking-threadpool = "1.0.1" libfuzzer-sys = "0.4" wasm-bindgen = "0.2.92" +parking_lot = "0.12.3" diff --git a/crates/chia-bls/Cargo.toml b/crates/chia-bls/Cargo.toml index 8bb42ce23..af79536b5 100644 --- a/crates/chia-bls/Cargo.toml +++ b/crates/chia-bls/Cargo.toml @@ -27,6 +27,7 @@ thiserror = { workspace = true } pyo3 = { workspace = true, features = ["multiple-pymethods"], optional = true } arbitrary = { workspace = true, optional = true } lru = { workspace = true } +parking_lot = { workspace = true } [dev-dependencies] rand = { workspace = true } diff --git a/crates/chia-bls/benches/cache.rs b/crates/chia-bls/benches/cache.rs index e8db3116f..4498c66e5 100644 --- a/crates/chia-bls/benches/cache.rs +++ b/crates/chia-bls/benches/cache.rs @@ -16,55 +16,50 @@ fn cache_benchmark(c: &mut Criterion) { let mut agg_sig = Signature::default(); for i in 0..1000 { - let derived = sk.derive_hardened(i as u32); + let derived = sk.derive_hardened(i); let pk = derived.public_key(); let sig = sign(&derived, msg); agg_sig.aggregate(&sig); pks.push(pk); } - let mut bls_cache = BlsCache::default(); + let bls_cache = BlsCache::default(); c.bench_function("bls_cache.aggregate_verify, 0% cache hits", |b| { - let mut cache = bls_cache.clone(); b.iter(|| { - assert!(cache.aggregate_verify(&pks, [&msg].iter().cycle(), &agg_sig)); + assert!(bls_cache.aggregate_verify(pks.iter().zip([&msg].iter().cycle()), &agg_sig)); }); }); // populate 10% of keys - bls_cache.aggregate_verify(&pks[0..100], [&msg].iter().cycle(), &agg_sig); + bls_cache.aggregate_verify(pks[0..100].iter().zip([&msg].iter().cycle()), &agg_sig); c.bench_function("bls_cache.aggregate_verify, 10% cache hits", |b| { - let mut cache = bls_cache.clone(); b.iter(|| { - assert!(cache.aggregate_verify(&pks, [&msg].iter().cycle(), &agg_sig)); + assert!(bls_cache.aggregate_verify(pks.iter().zip([&msg].iter().cycle()), &agg_sig)); }); }); // populate another 10% of keys - bls_cache.aggregate_verify(&pks[100..200], [&msg].iter().cycle(), &agg_sig); + bls_cache.aggregate_verify(pks[100..200].iter().zip([&msg].iter().cycle()), &agg_sig); c.bench_function("bls_cache.aggregate_verify, 20% cache hits", |b| { - let mut cache = bls_cache.clone(); b.iter(|| { - assert!(cache.aggregate_verify(&pks, [&msg].iter().cycle(), &agg_sig)); + assert!(bls_cache.aggregate_verify(pks.iter().zip([&msg].iter().cycle()), &agg_sig)); }); }); // populate another 30% of keys - bls_cache.aggregate_verify(&pks[200..500], [&msg].iter().cycle(), &agg_sig); + bls_cache.aggregate_verify(pks[200..500].iter().zip([&msg].iter().cycle()), &agg_sig); c.bench_function("bls_cache.aggregate_verify, 50% cache hits", |b| { - let mut cache = bls_cache.clone(); b.iter(|| { - assert!(cache.aggregate_verify(&pks, [&msg].iter().cycle(), &agg_sig)); + assert!(bls_cache.aggregate_verify(pks.iter().zip([&msg].iter().cycle()), &agg_sig)); }); }); // populate all other keys - bls_cache.aggregate_verify(&pks[500..1000], [&msg].iter().cycle(), &agg_sig); + bls_cache.aggregate_verify(pks[500..1000].iter().zip([&msg].iter().cycle()), &agg_sig); c.bench_function("bls_cache.aggregate_verify, 100% cache hits", |b| { - let mut cache = bls_cache.clone(); b.iter(|| { - assert!(cache.aggregate_verify(&pks, [&msg].iter().cycle(), &agg_sig)); + assert!(bls_cache.aggregate_verify(pks.iter().zip([&msg].iter().cycle()), &agg_sig)); }); }); diff --git a/crates/chia-bls/src/bls_cache.rs b/crates/chia-bls/src/bls_cache.rs index 38e255c63..355c2e017 100644 --- a/crates/chia-bls/src/bls_cache.rs +++ b/crates/chia-bls/src/bls_cache.rs @@ -1,11 +1,10 @@ -use std::borrow::Borrow; -use std::num::NonZeroUsize; - -use lru::LruCache; -use sha2::{Digest, Sha256}; - use crate::{aggregate_verify_gt, hash_to_g2}; use crate::{GTElement, PublicKey, Signature}; +use lru::LruCache; +use parking_lot::Mutex; +use sha2::{Digest, Sha256}; +use std::borrow::Borrow; +use std::num::NonZeroUsize; /// This is a cache of pairings of public keys and their corresponding message. /// It accelerates aggregate verification when some public keys have already @@ -17,10 +16,10 @@ use crate::{GTElement, PublicKey, Signature}; /// aggregate_verify() primitive is faster. When long-syncing, that's /// preferable. #[cfg_attr(feature = "py-bindings", pyo3::pyclass(name = "BLSCache"))] -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct BlsCache { // sha256(pubkey + message) -> GTElement - cache: LruCache<[u8; 32], GTElement>, + cache: Mutex>, } impl Default for BlsCache { @@ -32,25 +31,24 @@ impl Default for BlsCache { impl BlsCache { pub fn new(cache_size: NonZeroUsize) -> Self { Self { - cache: LruCache::new(cache_size), + cache: Mutex::new(LruCache::new(cache_size)), } } pub fn len(&self) -> usize { - self.cache.len() + self.cache.lock().len() } pub fn is_empty(&self) -> bool { - self.cache.is_empty() + self.cache.lock().is_empty() } - pub fn aggregate_verify( - &mut self, - pks: impl IntoIterator>, - msgs: impl IntoIterator>, + pub fn aggregate_verify, Msg: AsRef<[u8]>>( + &self, + pks_msgs: impl IntoIterator, sig: &Signature, ) -> bool { - let iter = pks.into_iter().zip(msgs).map(|(pk, msg)| -> GTElement { + let iter = pks_msgs.into_iter().map(|(pk, msg)| -> GTElement { // Hash pubkey + message let mut hasher = Sha256::new(); hasher.update(pk.borrow().to_bytes()); @@ -58,13 +56,13 @@ impl BlsCache { let hash: [u8; 32] = hasher.finalize().into(); // If the pairing is in the cache, we don't need to recalculate it. - if let Some(pairing) = self.cache.get(&hash).cloned() { + if let Some(pairing) = self.cache.lock().get(&hash).cloned() { return pairing; } // Otherwise, we need to calculate the pairing and add it to the cache. let mut aug_msg = pk.borrow().to_bytes().to_vec(); - aug_msg.extend_from_slice(msg.as_ref()); + aug_msg.extend(msg.as_ref()); let aug_hash = hash_to_g2(&aug_msg); let mut hasher = Sha256::new(); @@ -72,7 +70,7 @@ impl BlsCache { let hash: [u8; 32] = hasher.finalize().into(); let pairing = aug_hash.pair(pk.borrow()); - self.cache.put(hash, pairing.clone()); + self.cache.lock().put(hash, pairing.clone()); pairing }); @@ -83,7 +81,6 @@ impl BlsCache { #[cfg(feature = "py-bindings")] use pyo3::{ exceptions::PyValueError, - pybacked::PyBackedBytes, types::{PyAnyMethods, PyList}, Bound, PyObject, PyResult, }; @@ -122,9 +119,9 @@ impl BlsCache { let msgs = msgs .iter()? .map(|item| item?.extract()) - .collect::>>()?; + .collect::>>>()?; - Ok(self.aggregate_verify(pks, msgs, sig)) + Ok(self.aggregate_verify(pks.into_iter().zip(msgs), sig)) } #[pyo3(name = "len")] @@ -137,27 +134,22 @@ impl BlsCache { use pyo3::prelude::*; use pyo3::types::PyBytes; let ret = PyList::empty_bound(py); - for (key, value) in &self.cache { - ret.append(( - PyBytes::new_bound(py, key), - PyBytes::new_bound(py, &value.to_bytes()), - ))?; + let cache = self.cache.lock(); + for (key, value) in cache.iter() { + ret.append((PyBytes::new_bound(py, key), value.clone().into_py(py)))?; } Ok(ret.into()) } #[pyo3(name = "update")] pub fn py_update(&mut self, other: &Bound<'_, PyList>) -> PyResult<()> { + let mut cache = self.cache.lock(); for item in other.borrow().iter()? { - let (key, value): (Vec, Vec) = item?.extract()?; - self.cache.put( + let (key, value): (Vec, GTElement) = item?.extract()?; + cache.put( key.try_into() .map_err(|_| PyValueError::new_err("invalid key"))?, - GTElement::from_bytes( - (&value[..]) - .try_into() - .map_err(|_| PyValueError::new_err("invalid GTElement"))?, - ), + value, ); } Ok(()) @@ -173,7 +165,7 @@ pub mod tests { #[test] fn test_aggregate_verify() { - let mut bls_cache = BlsCache::default(); + let bls_cache = BlsCache::default(); let sk = SecretKey::from_seed(&[0; 32]); let pk = sk.public_key(); @@ -187,17 +179,17 @@ pub mod tests { assert!(bls_cache.is_empty()); // Verify the signature and add to the cache. - assert!(bls_cache.aggregate_verify(pk_list, msg_list, &sig)); + assert!(bls_cache.aggregate_verify(pk_list.into_iter().zip(msg_list), &sig)); assert_eq!(bls_cache.len(), 1); // Now that it's cached, it shouldn't cache it again. - assert!(bls_cache.aggregate_verify(pk_list, msg_list, &sig)); + assert!(bls_cache.aggregate_verify(pk_list.into_iter().zip(msg_list), &sig)); assert_eq!(bls_cache.len(), 1); } #[test] fn test_cache() { - let mut bls_cache = BlsCache::default(); + let bls_cache = BlsCache::default(); let sk1 = SecretKey::from_seed(&[0; 32]); let pk1 = sk1.public_key(); @@ -211,7 +203,7 @@ pub mod tests { assert!(bls_cache.is_empty()); // Add the first signature to cache. - assert!(bls_cache.aggregate_verify(&pk_list, &msg_list, &agg_sig)); + assert!(bls_cache.aggregate_verify(pk_list.iter().zip(msg_list.iter()), &agg_sig)); assert_eq!(bls_cache.len(), 1); // Try with the first key message pair in the cache but not the second. @@ -223,7 +215,7 @@ pub mod tests { pk_list.push(pk2); msg_list.push(msg2); - assert!(bls_cache.aggregate_verify(&pk_list, &msg_list, &agg_sig)); + assert!(bls_cache.aggregate_verify(pk_list.iter().zip(msg_list.iter()), &agg_sig)); assert_eq!(bls_cache.len(), 2); // Try reusing a public key. @@ -234,14 +226,14 @@ pub mod tests { msg_list.push(msg3); // Verify this signature and add to the cache as well (since it's still a different aggregate). - assert!(bls_cache.aggregate_verify(pk_list, msg_list, &agg_sig)); + assert!(bls_cache.aggregate_verify(pk_list.iter().zip(msg_list), &agg_sig)); assert_eq!(bls_cache.len(), 3); } #[test] fn test_cache_limit() { // The cache is limited to only 3 items. - let mut bls_cache = BlsCache::new(NonZeroUsize::new(3).unwrap()); + let bls_cache = BlsCache::new(NonZeroUsize::new(3).unwrap()); // Before we cache anything, it should be empty. assert!(bls_cache.is_empty()); @@ -257,11 +249,11 @@ pub mod tests { let msg_list = [msg]; // Add to cache by validating them one at a time. - assert!(bls_cache.aggregate_verify(pk_list.iter(), msg_list.iter(), &sig)); + assert!(bls_cache.aggregate_verify(pk_list.into_iter().zip(msg_list), &sig)); } // The cache should be full now. - assert_eq!(bls_cache.cache.len(), 3); + assert_eq!(bls_cache.len(), 3); // Recreate first key. let sk = SecretKey::from_seed(&[1; 32]); @@ -275,16 +267,16 @@ pub mod tests { let hash: [u8; 32] = hasher.finalize().into(); // The first key should have been removed, since it's the oldest that's been accessed. - assert!(!bls_cache.cache.contains(&hash)); + assert!(!bls_cache.cache.lock().contains(&hash)); } #[test] fn test_empty_sig() { - let mut bls_cache = BlsCache::default(); + let bls_cache = BlsCache::default(); let pks: [&PublicKey; 0] = []; let msgs: [&[u8]; 0] = []; - assert!(bls_cache.aggregate_verify(pks, msgs, &Signature::default())); + assert!(bls_cache.aggregate_verify(pks.into_iter().zip(msgs), &Signature::default())); } } diff --git a/crates/chia-consensus/src/gen/condition_tools.rs b/crates/chia-consensus/src/gen/condition_tools.rs new file mode 100644 index 000000000..a7789174d --- /dev/null +++ b/crates/chia-consensus/src/gen/condition_tools.rs @@ -0,0 +1,194 @@ +use crate::consensus_constants::ConsensusConstants; +use crate::gen::opcodes::{ + ConditionOpcode, AGG_SIG_AMOUNT, AGG_SIG_ME, AGG_SIG_PARENT, AGG_SIG_PARENT_AMOUNT, + AGG_SIG_PARENT_PUZZLE, AGG_SIG_PUZZLE, AGG_SIG_PUZZLE_AMOUNT, +}; +use crate::gen::owned_conditions::OwnedSpend; +use chia_protocol::Bytes; +use chia_protocol::Coin; + +pub fn make_aggsig_final_message( + opcode: ConditionOpcode, + msg: &[u8], + spend: &OwnedSpend, + constants: &ConsensusConstants, +) -> Vec { + let mut result = Vec::::with_capacity(msg.len() + 96); + result.extend(msg); + match opcode { + AGG_SIG_PARENT => { + result.extend(spend.parent_id.as_slice()); + result.extend(constants.agg_sig_parent_additional_data.as_slice()); + } + AGG_SIG_PUZZLE => { + result.extend(spend.puzzle_hash.as_slice()); + result.extend(constants.agg_sig_puzzle_additional_data.as_slice()); + } + AGG_SIG_AMOUNT => { + result.extend(u64_to_bytes(spend.coin_amount).as_slice()); + result.extend(constants.agg_sig_amount_additional_data.as_slice()); + } + AGG_SIG_PUZZLE_AMOUNT => { + result.extend(spend.puzzle_hash.as_slice()); + result.extend(u64_to_bytes(spend.coin_amount).as_slice()); + result.extend(constants.agg_sig_puzzle_amount_additional_data.as_slice()); + } + AGG_SIG_PARENT_AMOUNT => { + result.extend(spend.parent_id.as_slice()); + result.extend(u64_to_bytes(spend.coin_amount).as_slice()); + result.extend(constants.agg_sig_parent_amount_additional_data.as_slice()); + } + AGG_SIG_PARENT_PUZZLE => { + result.extend(spend.parent_id.as_slice()); + result.extend(spend.puzzle_hash.as_slice()); + result.extend(constants.agg_sig_parent_puzzle_additional_data.as_slice()); + } + AGG_SIG_ME => { + let coin: Coin = Coin::new(spend.parent_id, spend.puzzle_hash, spend.coin_amount); + + result.extend(coin.coin_id().as_slice()); + result.extend(constants.agg_sig_me_additional_data.as_slice()); + } + _ => return result, + }; + + result +} + +pub fn u64_to_bytes(val: u64) -> Bytes { + let amount_bytes: [u8; 8] = val.to_be_bytes(); + if val >= 0x8000_0000_0000_0000_u64 { + let mut ret = Vec::::new(); + ret.push(0_u8); + ret.extend(amount_bytes); + Bytes::new(ret) + } else { + let start = match val { + n if n >= 0x0080_0000_0000_0000_u64 => 0, + n if n >= 0x8000_0000_0000_u64 => 1, + n if n >= 0x0080_0000_0000_u64 => 2, + n if n >= 0x8000_0000_u64 => 3, + n if n >= 0x0080_0000_u64 => 4, + n if n >= 0x8000_u64 => 5, + n if n >= 0x80_u64 => 6, + n if n > 0 => 7, + _ => 8, + }; + Bytes::new(amount_bytes[start..].to_vec()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::allocator::make_allocator; + use crate::consensus_constants::TEST_CONSTANTS; + use clvmr::chia_dialect::LIMIT_HEAP; + use clvmr::Allocator; + use hex_literal::hex; + use rstest::rstest; + + #[test] + fn test_validate_u64() { + let mut a: Allocator = make_allocator(LIMIT_HEAP); + for v in 0..10000 { + let ptr = a.new_small_number(v).expect("valid u64"); + assert_eq!(a.atom(ptr).as_ref(), u64_to_bytes(v as u64).as_slice()); + } + for v in 18_446_744_073_709_551_615_u64 - 1000..18_446_744_073_709_551_615 { + let ptr = a.new_number(v.into()).expect("valid u64"); + assert_eq!(a.atom(ptr).as_ref(), u64_to_bytes(v).as_slice()); + } + } + + #[rstest] + #[case(AGG_SIG_PARENT, b"parent_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 10000)] + #[case(AGG_SIG_PUZZLE, b"puzzle_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 261)] + #[case(AGG_SIG_AMOUNT, b"amount_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 100_000_000_005)] + #[case(AGG_SIG_PUZZLE_AMOUNT, b"puzzle_amount_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 410)] + #[case(AGG_SIG_PARENT_AMOUNT, b"parent_amount_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 909)] + #[case(AGG_SIG_PARENT_PUZZLE, b"parent_puzzle_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 10_061_997)] + #[case(AGG_SIG_ME, b"me_message", hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), 1303)] + fn test_make_aggsig_final_message( + #[case] opcode: ConditionOpcode, + #[case] msg: &[u8], + #[case] parent_id: Vec, + #[case] puzzle_hash: Vec, + #[case] coin_amount: u64, + ) { + use std::sync::Arc; + + use chia_protocol::Bytes32; + + use crate::r#gen::conditions::Spend; + + let mut expected_result = Vec::::new(); + expected_result.extend(msg); + + let coin = Coin::new( + Bytes32::try_from(parent_id.clone()).expect("test should pass"), + Bytes32::try_from(puzzle_hash.clone()).expect("test should pass"), + coin_amount, + ); + + match opcode { + AGG_SIG_PARENT => { + expected_result.extend(parent_id.as_slice()); + expected_result.extend(TEST_CONSTANTS.agg_sig_parent_additional_data.as_slice()); + } + AGG_SIG_PUZZLE => { + expected_result.extend(puzzle_hash.as_slice()); + expected_result.extend(TEST_CONSTANTS.agg_sig_puzzle_additional_data.as_slice()); + } + AGG_SIG_AMOUNT => { + expected_result.extend(u64_to_bytes(coin_amount).as_slice()); + expected_result.extend(TEST_CONSTANTS.agg_sig_amount_additional_data.as_slice()); + } + AGG_SIG_PUZZLE_AMOUNT => { + expected_result.extend(puzzle_hash.as_slice()); + expected_result.extend(u64_to_bytes(coin_amount).as_slice()); + expected_result.extend( + TEST_CONSTANTS + .agg_sig_puzzle_amount_additional_data + .as_slice(), + ); + } + AGG_SIG_PARENT_AMOUNT => { + expected_result.extend(parent_id.as_slice()); + expected_result.extend(u64_to_bytes(coin_amount).as_slice()); + expected_result.extend( + TEST_CONSTANTS + .agg_sig_parent_amount_additional_data + .as_slice(), + ); + } + AGG_SIG_PARENT_PUZZLE => { + expected_result.extend(parent_id.as_slice()); + expected_result.extend(puzzle_hash.as_slice()); + expected_result.extend( + TEST_CONSTANTS + .agg_sig_parent_puzzle_additional_data + .as_slice(), + ); + } + AGG_SIG_ME => { + expected_result.extend(coin.coin_id().as_slice()); + expected_result.extend(TEST_CONSTANTS.agg_sig_me_additional_data.as_slice()); + } + _ => {} + }; + let mut a: Allocator = make_allocator(LIMIT_HEAP); + let spend = Spend::new( + a.new_atom(parent_id.as_slice()).expect("should pass"), + coin_amount, + a.new_atom(puzzle_hash.as_slice()) + .expect("test should pass"), + Arc::new(Bytes32::try_from(coin.coin_id()).expect("test should pass")), + ); + + let spend = OwnedSpend::from(&a, spend); + + let result = make_aggsig_final_message(opcode, msg, &spend, &TEST_CONSTANTS); + assert_eq!(result, expected_result); + } +} diff --git a/crates/chia-consensus/src/gen/conditions.rs b/crates/chia-consensus/src/gen/conditions.rs index 26c9de5a2..d6552b590 100644 --- a/crates/chia-consensus/src/gen/conditions.rs +++ b/crates/chia-consensus/src/gen/conditions.rs @@ -610,13 +610,13 @@ impl PartialEq for NewCoin { } // These are all the conditions related directly to a specific spend. -#[derive(Debug, Clone)] +#[derive(Clone, Debug)] pub struct Spend { // the parent coin ID of the coin being spent pub parent_id: NodePtr, // the amount of the coin that's being spent pub coin_amount: u64, - // the puzzle hash of the p + // the puzzle hash of the coin that's being spent pub puzzle_hash: NodePtr, // the coin ID of the coin being spent. This is computed from parent_id, // coin_amount and puzzle_hash diff --git a/crates/chia-consensus/src/gen/mod.rs b/crates/chia-consensus/src/gen/mod.rs index a48e1022d..26ddb47eb 100644 --- a/crates/chia-consensus/src/gen/mod.rs +++ b/crates/chia-consensus/src/gen/mod.rs @@ -1,5 +1,6 @@ mod coin_id; mod condition_sanitizers; +pub mod condition_tools; pub mod conditions; pub mod flags; pub mod get_puzzle_and_solution; diff --git a/crates/chia-consensus/src/gen/run_block_generator.rs b/crates/chia-consensus/src/gen/run_block_generator.rs index 128ac4321..db9ee6402 100644 --- a/crates/chia-consensus/src/gen/run_block_generator.rs +++ b/crates/chia-consensus/src/gen/run_block_generator.rs @@ -15,7 +15,11 @@ use clvmr::run_program::run_program; use clvmr::serde::{node_from_bytes, node_from_bytes_backrefs, node_from_bytes_backrefs_record}; use std::collections::{HashMap, HashSet}; -fn subtract_cost(a: &Allocator, cost_left: &mut Cost, subtract: Cost) -> Result<(), ValidationErr> { +pub fn subtract_cost( + a: &Allocator, + cost_left: &mut Cost, + subtract: Cost, +) -> Result<(), ValidationErr> { if subtract > *cost_left { Err(ValidationErr(a.nil(), ErrorCode::CostExceeded)) } else { diff --git a/crates/chia-consensus/src/large_spendbundle_validation_test.clsp.hex b/crates/chia-consensus/src/large_spendbundle_validation_test.clsp.hex new file mode 100644 index 000000000..9df1ce763 --- /dev/null +++ b/crates/chia-consensus/src/large_spendbundle_validation_test.clsp.hex @@ -0,0 +1 @@ +ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff0f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff1f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff2f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff3f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff4f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff5f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff6f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff7f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82008f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82009f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8200ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82010f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82011f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82012f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82013f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82014f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82015f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82016f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82017f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82018f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82019f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8201ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82020f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82021f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82022f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82023f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82024f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82025f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82026f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82027f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82028f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82029f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8202ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82030f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82031f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82032f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82033f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82034f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82035f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82036f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82037f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82038f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82039f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8203ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82040f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82041f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82042f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82043f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82044f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82045f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82046f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82047f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82048f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82049f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8204ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82050f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82051f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82052f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82053f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82054f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82055f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82056f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82057f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82058f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82059f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8205ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82060f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82061f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82062f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82063f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82064f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82065f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82066f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82067f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82068f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82069f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8206ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82070f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82071f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82072f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82073f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82074f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82075f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82076f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82077f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82078f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82079f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8207ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82080f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82081f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82082f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82083f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82084f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82085f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82086f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82087f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82088f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82089f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208a980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208aa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ab80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ac80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ad80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ae80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208af80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208b980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ba80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208bb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208bc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208bd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208be80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208bf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208c980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ca80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208cb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208cc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208cd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ce80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208cf80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208d980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208da80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208db80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208dc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208dd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208de80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208df80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208e980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ea80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208eb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ec80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ed80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ee80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ef80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208f980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208fa80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208fb80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208fc80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208fd80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208fe80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff8208ff80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82090f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82091f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82092f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82093f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82094f80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095080ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095180ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095280ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095380ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095480ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095580ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095680ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095780ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095880ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095980ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095a80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095b80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095c80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095d80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095e80ffff33ffa09dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2ff82095f8080 \ No newline at end of file diff --git a/crates/chia-consensus/src/lib.rs b/crates/chia-consensus/src/lib.rs index b7e99a193..018eac02b 100644 --- a/crates/chia-consensus/src/lib.rs +++ b/crates/chia-consensus/src/lib.rs @@ -8,3 +8,5 @@ pub mod gen; pub mod generator_rom; pub mod merkle_set; pub mod merkle_tree; +pub mod spendbundle_conditions; +pub mod spendbundle_validation; diff --git a/crates/chia-consensus/src/spendbundle_conditions.rs b/crates/chia-consensus/src/spendbundle_conditions.rs new file mode 100644 index 000000000..86a32eb02 --- /dev/null +++ b/crates/chia-consensus/src/spendbundle_conditions.rs @@ -0,0 +1,69 @@ +use crate::allocator::make_allocator; +use crate::consensus_constants::ConsensusConstants; +use crate::gen::conditions::{ + process_single_spend, validate_conditions, MempoolVisitor, ParseState, SpendBundleConditions, +}; +use crate::gen::flags::MEMPOOL_MODE; +use crate::gen::owned_conditions::OwnedSpendBundleConditions; +use crate::gen::run_block_generator::subtract_cost; +use crate::gen::validation_error::ValidationErr; +use crate::spendbundle_validation::get_flags_for_height_and_constants; +use chia_protocol::SpendBundle; +use clvm_utils::{tree_hash_cached, TreeHash}; +use clvmr::allocator::{Allocator, NodePtr}; +use clvmr::chia_dialect::ChiaDialect; +use clvmr::chia_dialect::LIMIT_HEAP; +use clvmr::reduction::Reduction; +use clvmr::run_program::run_program; +use clvmr::serde::node_from_bytes; +use std::collections::{HashMap, HashSet}; + +pub fn get_conditions_from_spendbundle( + spend_bundle: &SpendBundle, + max_cost: u64, + height: u32, + constants: &ConsensusConstants, +) -> Result { + let flags = get_flags_for_height_and_constants(height, constants) | MEMPOOL_MODE; + + // below is an adapted version of the code from run_block_generators::run_block_generator2() + // it assumes no block references are passed in + let mut cost_left = max_cost; + let dialect = ChiaDialect::new(flags); + let mut a: Allocator = make_allocator(LIMIT_HEAP); + let mut ret = SpendBundleConditions::default(); + let mut state = ParseState::default(); + let mut cache = HashMap::::new(); + + for coin_spend in &spend_bundle.coin_spends { + // process the spend + let puz = node_from_bytes(&mut a, coin_spend.puzzle_reveal.as_slice())?; + let sol = node_from_bytes(&mut a, coin_spend.solution.as_slice())?; + let parent = a.new_atom(coin_spend.coin.parent_coin_info.as_slice())?; + let amount = a.new_number(coin_spend.coin.amount.into())?; + let Reduction(clvm_cost, conditions) = run_program(&mut a, &dialect, puz, sol, cost_left)?; + + subtract_cost(&a, &mut cost_left, clvm_cost)?; + + let buf = tree_hash_cached(&a, puz, &HashSet::::new(), &mut cache); + let puzzle_hash = a.new_atom(&buf)?; + process_single_spend::( + &a, + &mut ret, + &mut state, + parent, + puzzle_hash, + amount, + conditions, + flags, + &mut cost_left, + constants, + )?; + } + + validate_conditions(&a, &ret, state, a.nil(), flags)?; + assert!(max_cost >= cost_left); + ret.cost = max_cost - cost_left; + let osbc = OwnedSpendBundleConditions::from(&a, ret); + Ok(osbc) +} diff --git a/crates/chia-consensus/src/spendbundle_validation.rs b/crates/chia-consensus/src/spendbundle_validation.rs new file mode 100644 index 000000000..32af67aae --- /dev/null +++ b/crates/chia-consensus/src/spendbundle_validation.rs @@ -0,0 +1,395 @@ +use crate::consensus_constants::ConsensusConstants; +use crate::gen::condition_tools::make_aggsig_final_message; +use crate::gen::flags::{ALLOW_BACKREFS, DISALLOW_INFINITY_G1, ENABLE_MESSAGE_CONDITIONS}; +use crate::gen::opcodes::{ + AGG_SIG_AMOUNT, AGG_SIG_ME, AGG_SIG_PARENT, AGG_SIG_PARENT_AMOUNT, AGG_SIG_PARENT_PUZZLE, + AGG_SIG_PUZZLE, AGG_SIG_PUZZLE_AMOUNT, +}; +use crate::gen::owned_conditions::OwnedSpendBundleConditions; +use crate::gen::validation_error::ErrorCode; +use crate::spendbundle_conditions::get_conditions_from_spendbundle; +use chia_bls::BlsCache; +use chia_protocol::SpendBundle; +use clvmr::{ENABLE_BLS_OPS_OUTSIDE_GUARD, ENABLE_FIXED_DIV}; +use std::time::{Duration, Instant}; + +// currently in mempool_manager.py +// called in threads from pre_validate_spend_bundle() +// returns (error, cached_results, new_cache_entries, duration) +pub fn validate_clvm_and_signature( + spend_bundle: &SpendBundle, + max_cost: u64, + constants: &ConsensusConstants, + height: u32, + cache: &BlsCache, +) -> Result<(OwnedSpendBundleConditions, Duration), ErrorCode> { + let start_time = Instant::now(); + let npcresult = get_conditions_from_spendbundle(spend_bundle, max_cost, height, constants) + .map_err(|e| e.1)?; + let iter = npcresult.spends.iter().flat_map(|spend| { + let condition_items_pairs = [ + (AGG_SIG_PARENT, &spend.agg_sig_parent), + (AGG_SIG_PUZZLE, &spend.agg_sig_puzzle), + (AGG_SIG_AMOUNT, &spend.agg_sig_amount), + (AGG_SIG_PUZZLE_AMOUNT, &spend.agg_sig_puzzle_amount), + (AGG_SIG_PARENT_AMOUNT, &spend.agg_sig_parent_amount), + (AGG_SIG_PARENT_PUZZLE, &spend.agg_sig_parent_puzzle), + (AGG_SIG_ME, &spend.agg_sig_me), + ]; + condition_items_pairs + .into_iter() + .flat_map(move |(condition, items)| { + let spend_clone = spend.clone(); + items.iter().map(move |(pk, msg)| { + ( + pk, + make_aggsig_final_message( + condition, + msg.as_slice(), + &spend_clone, + constants, + ), + ) + }) + }) + }); + let unsafe_items = npcresult + .agg_sig_unsafe + .iter() + .map(|(pk, msg)| (pk, msg.as_slice().to_vec())); + let iter = iter.chain(unsafe_items); + // Verify aggregated signature + let result = cache.aggregate_verify(iter, &spend_bundle.aggregated_signature); + if !result { + return Err(ErrorCode::BadAggregateSignature); + } + Ok((npcresult, start_time.elapsed())) +} + +pub fn get_flags_for_height_and_constants(height: u32, constants: &ConsensusConstants) -> u32 { + let mut flags: u32 = 0; + + if height >= constants.soft_fork4_height { + flags |= ENABLE_MESSAGE_CONDITIONS; + } + + if height >= constants.soft_fork5_height { + flags |= DISALLOW_INFINITY_G1; + } + + if height >= constants.hard_fork_height { + // the hard-fork initiated with 2.0. To activate June 2024 + // * costs are ascribed to some unknown condition codes, to allow for + // soft-forking in new conditions with cost + // * a new condition, SOFTFORK, is added which takes a first parameter to + // specify its cost. This allows soft-forks similar to the softfork + // operator + // * BLS operators introduced in the soft-fork (behind the softfork + // guard) are made available outside of the guard. + // * division with negative numbers are allowed, and round toward + // negative infinity + // * AGG_SIG_* conditions are allowed to have unknown additional + // arguments + // * Allow the block generator to be serialized with the improved clvm + // serialization format (with back-references) + flags = flags | ENABLE_BLS_OPS_OUTSIDE_GUARD | ENABLE_FIXED_DIV | ALLOW_BACKREFS; + } + flags +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::consensus_constants::TEST_CONSTANTS; + use crate::gen::condition_tools::u64_to_bytes; + use chia_bls::{sign, G2Element, SecretKey, Signature}; + use chia_protocol::{Bytes, Bytes32}; + use chia_protocol::{Coin, CoinSpend, Program}; + use clvm_utils::tree_hash_atom; + use hex::FromHex; + use hex_literal::hex; + use std::sync::Arc; + + #[test] + fn test_validate_no_pks() { + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), + 1, + ); + + let solution = Bytes::new( + hex!( + "ff\ +ff33\ +ffa02222222222222222222222222222222222222222222222222222222222222222\ +ff01\ +80\ +80" + ) + .to_vec(), + ); + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: Signature::default(), + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + 236, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } + + #[test] + fn test_validate_unsafe() { + let sk_hex = "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb"; + let sk = SecretKey::from_bytes(&<[u8; 32]>::from_hex(sk_hex).unwrap()).unwrap(); + + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + hex!("3333333333333333333333333333333333333333333333333333333333333333").into(), + 1, + ); + + let solution = hex!("ffff31ffb0997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2ff8568656c6c6f8080").to_vec(); + // ((49 0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 "hello")) + + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + let msg = b"hello"; + let sig = sign(&sk, msg); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: sig, + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + 236, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } + + #[test] + fn test_go_over_cost() { + let test_coin = Coin::new( + hex!("9dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2").into(), + hex!("9dcf97a184f32623d11a73124ceb99a5709b083721e878a16d78f596718ba7b2").into(), + 1_000_000_000, + ); + let my_str = include_str!("large_spendbundle_validation_test.clsp.hex"); + let solution = hex::decode(my_str).expect("loading known file"); + // this solution makes 2400 CREATE_COIN conditions + + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + + let coin_spends: Vec = vec![spend.clone()]; + + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: G2Element::default(), + }; + let result = validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm / 2, // same as mempool_manager default + &TEST_CONSTANTS, + 236, + &Arc::new(BlsCache::default()), + ); + assert!(matches!(result, Ok(..))); + let result = validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm / 3, // lower than mempool_manager default + &TEST_CONSTANTS, + 236, + &Arc::new(BlsCache::default()), + ); + assert!(matches!(result, Err(ErrorCode::CostExceeded))); + } + + #[test] + fn test_validate_aggsig_me() { + let sk_hex = "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb"; + let sk = SecretKey::from_bytes(&<[u8; 32]>::from_hex(sk_hex).unwrap()).unwrap(); + + let full_puz = Bytes32::new(tree_hash_atom(&[1_u8]).to_bytes()); + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + full_puz, + 1, + ); + + let solution = hex!("ffff32ffb0997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2ff8568656c6c6f8080").to_vec(); + // ((50 0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 "hello")) + + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + let msg = b"hello"; + let mut result = msg.to_vec(); + result.extend( + [ + test_coin.coin_id().as_slice(), + TEST_CONSTANTS.agg_sig_me_additional_data.as_slice(), + ] + .concat(), + ); + let sig = sign(&sk, result.as_slice()); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: sig, + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + 1, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } + + #[test] + fn test_validate_aggsig_parent_puzzle() { + let sk_hex = "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb"; + let sk = SecretKey::from_bytes(&<[u8; 32]>::from_hex(sk_hex).unwrap()).unwrap(); + //let pk: PublicKey = sk.public_key(); //0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 + // panic!("{:?}", pk); + + let full_puz = Bytes32::new(tree_hash_atom(&[1_u8]).to_bytes()); + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + full_puz, + 1, + ); + + let solution = hex!("ffff30ffb0997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2ff8568656c6c6f8080").to_vec(); + // ((48 0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 "hello")) + + let spend = CoinSpend::new( + test_coin, + Program::new(vec![1_u8].into()), + Program::new(solution.into()), + ); + let msg = b"hello"; + let mut result = msg.to_vec(); + result.extend( + [ + test_coin.parent_coin_info.as_slice(), + test_coin.puzzle_hash.as_slice(), + TEST_CONSTANTS + .agg_sig_parent_puzzle_additional_data + .as_slice(), + ] + .concat(), + ); + let sig = sign(&sk, result.as_slice()); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: sig, + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + TEST_CONSTANTS.hard_fork_height + 1, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } + + #[test] + fn test_validate_aggsig_parent_amount() { + let sk_hex = "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb"; + let sk = SecretKey::from_bytes(&<[u8; 32]>::from_hex(sk_hex).unwrap()).unwrap(); + + let full_puz = Bytes32::new(tree_hash_atom(&[1_u8]).to_bytes()); + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + full_puz, + 1, + ); + + let solution = hex!("ffff2fffb0997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2ff8568656c6c6f8080").to_vec(); + // ((47 0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 "hello")) + + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + let msg = b"hello"; + let mut result = msg.to_vec(); + result.extend( + [ + test_coin.parent_coin_info.as_slice(), + u64_to_bytes(test_coin.amount).as_slice(), + TEST_CONSTANTS + .agg_sig_parent_amount_additional_data + .as_slice(), + ] + .concat(), + ); + let sig = sign(&sk, result.as_slice()); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: sig, + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + TEST_CONSTANTS.hard_fork_height + 1, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } + + #[test] + fn test_validate_aggsig_puzzle_amount() { + let sk_hex = "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb"; + let sk = SecretKey::from_bytes(&<[u8; 32]>::from_hex(sk_hex).unwrap()).unwrap(); + + let full_puz = Bytes32::new(tree_hash_atom(&[1_u8]).to_bytes()); + let test_coin = Coin::new( + hex!("4444444444444444444444444444444444444444444444444444444444444444").into(), + full_puz, + 1, + ); + + let solution = hex!("ffff2effb0997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2ff8568656c6c6f8080").to_vec(); + // ((46 0x997cc43ed8788f841fcf3071f6f212b89ba494b6ebaf1bda88c3f9de9d968a61f3b7284a5ee13889399ca71a026549a2 "hello")) + + let spend = CoinSpend::new(test_coin, Program::new(vec![1_u8].into()), solution.into()); + let msg = b"hello"; + let mut result = msg.to_vec(); + result.extend( + [ + test_coin.puzzle_hash.as_slice(), + u64_to_bytes(test_coin.amount).as_slice(), + TEST_CONSTANTS + .agg_sig_puzzle_amount_additional_data + .as_slice(), + ] + .concat(), + ); + let sig = sign(&sk, result.as_slice()); + let coin_spends: Vec = vec![spend]; + let spend_bundle = SpendBundle { + coin_spends, + aggregated_signature: sig, + }; + validate_clvm_and_signature( + &spend_bundle, + TEST_CONSTANTS.max_block_cost_clvm, + &TEST_CONSTANTS, + TEST_CONSTANTS.hard_fork_height + 1, + &Arc::new(BlsCache::default()), + ) + .expect("SpendBundle should be valid for this test"); + } +} diff --git a/tests/test_blscache.py b/tests/test_blscache.py index 9cf9bce0b..656f54d8e 100644 --- a/tests/test_blscache.py +++ b/tests/test_blscache.py @@ -1,11 +1,100 @@ -from chia_rs import G1Element, PrivateKey, AugSchemeMPL, G2Element, BLSCache +from chia_rs import ( + SpendBundle, + CoinSpend, + Program, + G1Element, + GTElement, + PrivateKey, + AugSchemeMPL, + G2Element, + BLSCache, + Coin, + ConsensusConstants, + validate_clvm_and_signature, +) +from chia_rs.sized_bytes import bytes32 +from chia_rs.sized_ints import uint8, uint16, uint32, uint64, uint128 from typing import List from chia.util.hash import std_hash from chia.util.lru_cache import LRUCache +from chia.types.blockchain_format.program import Program as ChiaProgram from chia.util import cached_bls as cached_bls_old import pytest +DEFAULT_CONSTANTS = ConsensusConstants( + SLOT_BLOCKS_TARGET=uint32(32), + MIN_BLOCKS_PER_CHALLENGE_BLOCK=uint8(16), + MAX_SUB_SLOT_BLOCKS=uint32(128), + NUM_SPS_SUB_SLOT=uint32(64), + SUB_SLOT_ITERS_STARTING=uint64(2**27), + DIFFICULTY_CONSTANT_FACTOR=uint128(2**67), + DIFFICULTY_STARTING=uint64(7), + DIFFICULTY_CHANGE_MAX_FACTOR=uint32(3), + SUB_EPOCH_BLOCKS=uint32(384), + EPOCH_BLOCKS=uint32(4608), + SIGNIFICANT_BITS=uint8(8), + DISCRIMINANT_SIZE_BITS=uint16(1024), + NUMBER_ZERO_BITS_PLOT_FILTER=uint8(9), + MIN_PLOT_SIZE=uint8(32), + MAX_PLOT_SIZE=uint8(50), + SUB_SLOT_TIME_TARGET=uint16(600), + NUM_SP_INTERVALS_EXTRA=uint8(3), + MAX_FUTURE_TIME2=uint32(2 * 60), + NUMBER_OF_TIMESTAMPS=uint8(11), + GENESIS_CHALLENGE=bytes32.fromhex( + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + ), + AGG_SIG_ME_ADDITIONAL_DATA=bytes32.fromhex( + "ccd5bb71183532bff220ba46c268991a3ff07eb358e8255a65c30a2dce0e5fbb" + ), + AGG_SIG_PARENT_ADDITIONAL_DATA=bytes32.fromhex( + "baf5d69c647c91966170302d18521b0a85663433d161e72c826ed08677b53a74" + ), + AGG_SIG_PUZZLE_ADDITIONAL_DATA=bytes32.fromhex( + "284fa2ef486c7a41cc29fc99c9d08376161e93dd37817edb8219f42dca7592c4" + ), + AGG_SIG_AMOUNT_ADDITIONAL_DATA=bytes32.fromhex( + "cda186a9cd030f7a130fae45005e81cae7a90e0fa205b75f6aebc0d598e0348e" + ), + AGG_SIG_PUZZLE_AMOUNT_ADDITIONAL_DATA=bytes32.fromhex( + "0f7d90dff0613e6901e24dae59f1e690f18b8f5fbdcf1bb192ac9deaf7de22ad" + ), + AGG_SIG_PARENT_AMOUNT_ADDITIONAL_DATA=bytes32.fromhex( + "585796bd90bb553c0430b87027ffee08d88aba0162c6e1abbbcc6b583f2ae7f9" + ), + AGG_SIG_PARENT_PUZZLE_ADDITIONAL_DATA=bytes32.fromhex( + "2ebfdae17b29d83bae476a25ea06f0c4bd57298faddbbc3ec5ad29b9b86ce5df" + ), + GENESIS_PRE_FARM_POOL_PUZZLE_HASH=bytes32.fromhex( + "d23da14695a188ae5708dd152263c4db883eb27edeb936178d4d988b8f3ce5fc" + ), + GENESIS_PRE_FARM_FARMER_PUZZLE_HASH=bytes32.fromhex( + "3d8765d3a597ec1d99663f6c9816d915b9f68613ac94009884c4addaefcce6af" + ), + MAX_VDF_WITNESS_SIZE=uint8(64), + MEMPOOL_BLOCK_BUFFER=uint8(10), + MAX_COIN_AMOUNT=uint64((1 << 64) - 1), + MAX_BLOCK_COST_CLVM=uint64(11000000000), + COST_PER_BYTE=uint64(12000), + WEIGHT_PROOF_THRESHOLD=uint8(2), + BLOCKS_CACHE_SIZE=uint32(4608 + (128 * 4)), + WEIGHT_PROOF_RECENT_BLOCKS=uint32(1000), + MAX_BLOCK_COUNT_PER_REQUESTS=uint32(32), + MAX_GENERATOR_SIZE=uint32(1000000), + MAX_GENERATOR_REF_LIST_SIZE=uint32(512), + POOL_SUB_SLOT_ITERS=uint64(37600000000), + SOFT_FORK2_HEIGHT=uint32(0), + SOFT_FORK4_HEIGHT=uint32(5716000), + SOFT_FORK5_HEIGHT=uint32(0), + HARD_FORK_HEIGHT=uint32(5496000), + HARD_FORK_FIX_HEIGHT=uint32(5496000), + PLOT_FILTER_128_HEIGHT=uint32(10542000), + PLOT_FILTER_64_HEIGHT=uint32(15592000), + PLOT_FILTER_32_HEIGHT=uint32(20643000), +) + + def test_instantiation() -> None: bls_cache = BLSCache() assert bls_cache.len() == 0 @@ -126,13 +215,10 @@ def test_cached_bls_flattening(): assert cached_bls.aggregate_verify(pks, [b"foobar"] * n_keys, aggsig) assert len(cached_bls.items()) == n_keys - gts = [ - bytes(pk.pair(AugSchemeMPL.g2_from_message(bytes(pk) + b"foobar"))) - for pk in pks - ] + gts = [pk.pair(AugSchemeMPL.g2_from_message(bytes(pk) + b"foobar")) for pk in pks] for key, value in cached_bls.items(): assert isinstance(key, bytes) - assert isinstance(value, bytes) + assert isinstance(value, GTElement) assert value in gts gts.remove(value) @@ -140,13 +226,10 @@ def test_cached_bls_flattening(): cache_copy.update(cached_bls.items()) assert len(cache_copy.items()) == n_keys - gts = [ - bytes(pk.pair(AugSchemeMPL.g2_from_message(bytes(pk) + b"foobar"))) - for pk in pks - ] + gts = [pk.pair(AugSchemeMPL.g2_from_message(bytes(pk) + b"foobar")) for pk in pks] for key, value in cache_copy.items(): assert isinstance(key, bytes) - assert isinstance(value, bytes) + assert isinstance(value, GTElement) assert value in gts gts.remove(value) @@ -214,3 +297,48 @@ def test_bad_cache_size(): expected_exception=OverflowError, match="out of range integral type conversion attempted", ) + + +def test_validate_clvm_and_sig(): + cache = BLSCache() + puz_reveal = Program.to(1) + coin = Coin( + bytes.fromhex( + "4444444444444444444444444444444444444444444444444444444444444444" + ), + puz_reveal.get_tree_hash(), + 200, + ) + + sol_bytes = bytes.fromhex( + "ffff32ffb08578d10c07f5f086b08145a40f2b4b55f5cafeb8e6ed8c3c60e3ef92a66b608131225eb15d71fb32285bd7e1c461655fff8568656c6c6f8080" + ) + # ((50 0x8578d10c07f5f086b08145a40f2b4b55f5cafeb8e6ed8c3c60e3ef92a66b608131225eb15d71fb32285bd7e1c461655f "hello")) + solution = Program.from_bytes(sol_bytes) + coin_spends = [CoinSpend(coin, puz_reveal, solution)] + sk = AugSchemeMPL.key_gen( + bytes.fromhex( + "52d75c4707e39595b27314547f9723e5530c01198af3fc5849d9a7af65631efb" + ) + ) + sig = AugSchemeMPL.sign( + sk, + ( + ChiaProgram.to("hello").as_atom() + + coin.name() + + DEFAULT_CONSTANTS.AGG_SIG_ME_ADDITIONAL_DATA + ), # noqa + ) + + new_spend = SpendBundle(coin_spends, sig) + + (sbc, duration) = validate_clvm_and_signature( + new_spend, + DEFAULT_CONSTANTS.MAX_BLOCK_COST_CLVM, + DEFAULT_CONSTANTS, + DEFAULT_CONSTANTS.HARD_FORK_HEIGHT + 1, + cache, + ) + + assert sbc is not None + assert duration is not None diff --git a/wheel/generate_type_stubs.py b/wheel/generate_type_stubs.py index 008b8ecdb..f26fb273e 100644 --- a/wheel/generate_type_stubs.py +++ b/wheel/generate_type_stubs.py @@ -305,6 +305,26 @@ def confirm_not_included_already_hashed( proof: bytes, ) -> bool: ... +def validate_clvm_and_signature( + new_spend: SpendBundle, + max_cost: int, + constants: ConsensusConstants, + peak_height: int, + cache: Optional[BLSCache], +) -> Tuple[SpendBundleConditions, float]: ... + +def get_name_puzzle_conditions( + spend_bundle: SpendBundle, + max_cost: int, + constants: ConsensusConstants, + height: int, +) -> SpendBundleConditions: ... + +def get_flags_for_height_and_constants( + height: int, + constants: ConsensusConstants +) -> int: ... + NO_UNKNOWN_CONDS: int = ... STRICT_ARGS_COUNT: int = ... LIMIT_HEAP: int = ... @@ -338,7 +358,7 @@ class BLSCache: def __init__(self, cache_size: Optional[int] = 50000) -> None: ... def len(self) -> int: ... def aggregate_verify(self, pks: List[G1Element], msgs: List[bytes], sig: G2Element) -> bool: ... - def items(self) -> List[Tuple[bytes, bytes]]: ... + def items(self) -> List[Tuple[bytes, GTElement]]: ... def update(self, other: List[Tuple[bytes, bytes]]) -> None: ... class AugSchemeMPL: diff --git a/wheel/python/chia_rs/chia_rs.pyi b/wheel/python/chia_rs/chia_rs.pyi index 3a543d342..b0b213087 100644 --- a/wheel/python/chia_rs/chia_rs.pyi +++ b/wheel/python/chia_rs/chia_rs.pyi @@ -49,6 +49,26 @@ def confirm_not_included_already_hashed( proof: bytes, ) -> bool: ... +def validate_clvm_and_signature( + new_spend: SpendBundle, + max_cost: int, + constants: ConsensusConstants, + peak_height: int, + cache: Optional[BLSCache], +) -> Tuple[SpendBundleConditions, float]: ... + +def get_name_puzzle_conditions( + spend_bundle: SpendBundle, + max_cost: int, + constants: ConsensusConstants, + height: int, +) -> SpendBundleConditions: ... + +def get_flags_for_height_and_constants( + height: int, + constants: ConsensusConstants +) -> int: ... + NO_UNKNOWN_CONDS: int = ... STRICT_ARGS_COUNT: int = ... LIMIT_HEAP: int = ... @@ -82,7 +102,7 @@ class BLSCache: def __init__(self, cache_size: Optional[int] = 50000) -> None: ... def len(self) -> int: ... def aggregate_verify(self, pks: List[G1Element], msgs: List[bytes], sig: G2Element) -> bool: ... - def items(self) -> List[Tuple[bytes, bytes]]: ... + def items(self) -> List[Tuple[bytes, GTElement]]: ... def update(self, other: List[Tuple[bytes, bytes]]) -> None: ... class AugSchemeMPL: diff --git a/wheel/src/api.rs b/wheel/src/api.rs index 81e6f65a8..ee80858c4 100644 --- a/wheel/src/api.rs +++ b/wheel/src/api.rs @@ -12,6 +12,11 @@ use chia_consensus::gen::solution_generator::solution_generator as native_soluti use chia_consensus::gen::solution_generator::solution_generator_backrefs as native_solution_generator_backrefs; use chia_consensus::merkle_set::compute_merkle_set_root as compute_merkle_root_impl; use chia_consensus::merkle_tree::{validate_merkle_proof, MerkleSet}; +use chia_consensus::spendbundle_validation::{ + get_flags_for_height_and_constants, validate_clvm_and_signature, +}; + +use chia_consensus::spendbundle_conditions::get_conditions_from_spendbundle; use chia_protocol::{ BlockRecord, Bytes32, ChallengeBlockInfo, ChallengeChainSubSlot, ClassgroupElement, Coin, CoinSpend, CoinState, CoinStateFilters, CoinStateUpdate, EndOfSubSlotBundle, Foliage, @@ -41,7 +46,7 @@ use chia_protocol::{ use clvm_utils::tree_hash_from_bytes; use clvmr::{ENABLE_BLS_OPS_OUTSIDE_GUARD, ENABLE_FIXED_DIV, LIMIT_HEAP, NO_UNKNOWN_OPS}; use pyo3::buffer::PyBuffer; -use pyo3::exceptions::{PyRuntimeError, PyValueError}; +use pyo3::exceptions::{PyRuntimeError, PyTypeError, PyValueError}; use pyo3::prelude::*; use pyo3::pybacked::PyBackedBytes; use pyo3::types::PyBytes; @@ -49,6 +54,7 @@ use pyo3::types::PyList; use pyo3::types::PyTuple; use pyo3::wrap_pyfunction; use std::iter::zip; +use std::sync::Arc; use crate::run_program::{run_chia_program, serialized_length}; @@ -364,6 +370,62 @@ fn fast_forward_singleton<'p>( )) } +#[pyfunction] +#[pyo3(name = "validate_clvm_and_signature")] +pub fn py_validate_clvm_and_signature( + new_spend: &SpendBundle, + max_cost: u64, + constants: &ConsensusConstants, + peak_height: u32, + cache: Option<&BlsCache>, +) -> PyResult<(OwnedSpendBundleConditions, f32)> { + let empty_cache = BlsCache::default(); + let real_cache = if let Some(unwrapped_cache) = cache { + unwrapped_cache + } else { + &empty_cache + }; + let (owned_conditions, duration) = validate_clvm_and_signature( + new_spend, + max_cost, + constants, + peak_height, + &Arc::new(real_cache), + ) + .map_err(|e| { + let error_code: u32 = e.into(); + PyErr::new::(error_code) + })?; // cast validation error to int + Ok((owned_conditions, duration.as_secs_f32())) +} + +#[pyfunction] +#[pyo3(name = "get_conditions_from_spendbundle")] +pub fn py_get_conditions_from_spendbundle( + spend_bundle: &SpendBundle, + max_cost: u64, + constants: &ConsensusConstants, + height: u32, +) -> PyResult { + let osbc = get_conditions_from_spendbundle(spend_bundle, max_cost, height, constants).map_err( + |e| { + let error_code: u32 = e.1.into(); + PyErr::new::(error_code) + }, + )?; + Ok(osbc) +} + +#[pyfunction] +#[pyo3(name = "get_flags_for_height_and_constants")] +pub fn py_get_flags_for_height_and_constants( + height: u32, + constants: &ConsensusConstants, +) -> PyResult { + let flags = get_flags_for_height_and_constants(height, constants); + Ok(flags) +} + #[pymodule] pub fn chia_rs(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { // generator functions @@ -393,6 +455,11 @@ pub fn chia_rs(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(confirm_included_already_hashed, m)?)?; m.add_function(wrap_pyfunction!(confirm_not_included_already_hashed, m)?)?; + // multithread validattion + m.add_function(wrap_pyfunction!(py_validate_clvm_and_signature, m)?)?; + m.add_function(wrap_pyfunction!(py_get_conditions_from_spendbundle, m)?)?; + m.add_function(wrap_pyfunction!(py_get_flags_for_height_and_constants, m)?)?; + // clvm functions m.add("NO_UNKNOWN_CONDS", NO_UNKNOWN_CONDS)?; m.add("STRICT_ARGS_COUNT", STRICT_ARGS_COUNT)?;