From d10449df4f68f9af0f5ee3620963fe5e3bfaf5ac Mon Sep 17 00:00:00 2001 From: Oliver He Date: Tue, 1 Oct 2024 07:59:00 -0400 Subject: [PATCH] Add keyless to rust sdk and txn-emitter (#12976) * Add smoke test using keyless rust sdk * add keyless account generator * reorder import * fix * fix build * fmt * lint * update txn emitter * update * update * fix panic * update proofs * xclippy * group the account type args * reorder arg * sort deps * fix test --- .dockerignore | 1 + Cargo.lock | 3 + crates/transaction-emitter-lib/Cargo.toml | 3 + crates/transaction-emitter-lib/src/args.rs | 30 +- .../src/emitter/account_minter.rs | 29 +- .../src/emitter/local_account_generator.rs | 136 ++++- .../src/emitter/mod.rs | 69 ++- .../test_proofs_for_localnet_txn_emitter.txt | 500 ++++++++++++++++++ .../transaction-emitter-lib/src/wrappers.rs | 51 +- sdk/src/types.rs | 76 ++- testsuite/smoke-test/src/keyless.rs | 140 ++++- testsuite/smoke-test/src/txn_emitter.rs | 230 +++++--- types/src/keyless/circuit_testcases.rs | 43 +- types/src/keyless/groth16_sig.rs | 9 + types/src/keyless/test_utils.rs | 38 +- 15 files changed, 1181 insertions(+), 177 deletions(-) create mode 100644 crates/transaction-emitter-lib/src/emitter/test_proofs_for_localnet_txn_emitter.txt diff --git a/.dockerignore b/.dockerignore index 3a4bd7c40a38b..f229611505534 100644 --- a/.dockerignore +++ b/.dockerignore @@ -27,6 +27,7 @@ !crates/aptos/src/move_tool/*.bpl !crates/aptos/src/node/local_testnet/hasura_metadata.json !crates/aptos-faucet/doc/ +!crates/transaction-emitter-lib/src/emitter/test_proofs_for_localnet_txn_emitter.txt !api/doc/ !crates/indexer/migrations/**/*.sql !ecosystem/indexer-grpc/indexer-grpc-parser/migrations/**/*.sql diff --git a/Cargo.lock b/Cargo.lock index 150dc35ce586d..bcbe030bad0b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4187,14 +4187,17 @@ dependencies = [ "aptos-transaction-generator-lib", "aptos-types", "async-trait", + "base64 0.13.1", "clap 4.4.14", "futures", + "hex", "itertools 0.13.0", "once_cell", "rand 0.7.3", "rand_core 0.5.1", "reqwest 0.11.23", "serde", + "serde_json", "tokio", "url", ] diff --git a/crates/transaction-emitter-lib/Cargo.toml b/crates/transaction-emitter-lib/Cargo.toml index 5b3e884b32510..21866eababfef 100644 --- a/crates/transaction-emitter-lib/Cargo.toml +++ b/crates/transaction-emitter-lib/Cargo.toml @@ -25,13 +25,16 @@ aptos-sdk = { workspace = true } aptos-transaction-generator-lib = { workspace = true } aptos-types = { workspace = true } async-trait = { workspace = true } +base64 = { workspace = true } clap = { workspace = true } futures = { workspace = true } +hex = { workspace = true } itertools = { workspace = true } once_cell = { workspace = true } rand = { workspace = true } rand_core = { workspace = true } reqwest = { workspace = true } serde = { workspace = true } +serde_json = { workspace = true } tokio = { workspace = true } url = { workspace = true } diff --git a/crates/transaction-emitter-lib/src/args.rs b/crates/transaction-emitter-lib/src/args.rs index 99ff392327ac5..17f1e1cb7572e 100644 --- a/crates/transaction-emitter-lib/src/args.rs +++ b/crates/transaction-emitter-lib/src/args.rs @@ -138,9 +138,6 @@ pub struct EmitArgs { )] pub transaction_type: Vec, - #[clap(long, value_enum, default_value = "local", ignore_case = true)] - pub account_type: AccountType, - /// Number of copies of the modules that will be published, /// under separate accounts, creating independent contracts, /// removing contention. @@ -218,6 +215,27 @@ pub struct EmitArgs { #[clap(long)] pub coins_per_account_override: Option, + + #[clap(flatten)] + pub account_type_args: AccountTypeArgs, +} + +#[derive(Clone, Debug, Default, Deserialize, Parser, Serialize)] +pub struct AccountTypeArgs { + #[clap(long, value_enum, default_value = "local", ignore_case = true)] + pub account_type: AccountType, + + #[clap(long, value_parser = ConfigKey::::from_encoded_string, requires = "proof_file_path", requires = "epk_expiry_date_secs", requires = "keyless_jwt")] + pub keyless_ephem_secret_key: Option>, + + #[clap(long)] + pub proof_file_path: Option, + + #[clap(long)] + pub epk_expiry_date_secs: Option, + + #[clap(long)] + pub keyless_jwt: Option, } #[derive(Clone, Debug, Default, Deserialize, Parser, Serialize)] @@ -234,6 +252,12 @@ pub struct CreateAccountsArgs { /// used and printed. #[clap(long)] pub account_minter_seed: Option, + + #[clap(long)] + pub keyless_jwt: Option, + + #[clap(long)] + pub proof_file_path: Option, } fn parse_target(target: &str) -> Result { diff --git a/crates/transaction-emitter-lib/src/emitter/account_minter.rs b/crates/transaction-emitter-lib/src/emitter/account_minter.rs index a0c2cd2d67407..51eed9afa8de1 100644 --- a/crates/transaction-emitter-lib/src/emitter/account_minter.rs +++ b/crates/transaction-emitter-lib/src/emitter/account_minter.rs @@ -5,20 +5,14 @@ use super::{ local_account_generator::LocalAccountGenerator, parse_seed, transaction_executor::RestApiReliableTransactionSubmitter, }; -use crate::EmitJobRequest; +use crate::{emitter::create_private_key_account_generator, EmitJobRequest}; use anyhow::{anyhow, bail, format_err, Context, Result}; use aptos_config::config::DEFAULT_MAX_SUBMIT_TRANSACTION_BATCH_SIZE; -use aptos_crypto::{ - ed25519::{Ed25519PrivateKey, Ed25519PublicKey}, - encoding_type::EncodingType, -}; +use aptos_crypto::{ed25519::Ed25519PrivateKey, encoding_type::EncodingType}; use aptos_logger::{error, info}; use aptos_sdk::{ transaction_builder::{aptos_stdlib, TransactionFactory}, - types::{ - transaction::{authenticator::AuthenticationKey, SignedTransaction}, - AccountKey, LocalAccount, - }, + types::{transaction::SignedTransaction, AccountKey, LocalAccount}, }; use aptos_transaction_generator_lib::{ CounterState, ReliableTransactionSubmitter, RootAccountHandle, @@ -394,7 +388,7 @@ impl<'t> AccountMinter<'t> { create_and_fund_account_request( source_account.clone(), coins_per_seed_account, - account.public_key(), + account.address(), txn_factory, ) }) @@ -449,7 +443,7 @@ impl<'t> AccountMinter<'t> { let txn = create_and_fund_account_request( root_account.clone(), coins_for_source, - new_source_account.public_key(), + new_source_account.address(), &self.txn_factory, ); if let Err(e) = txn_executor.execute_transactions(&[txn]).await { @@ -506,7 +500,7 @@ async fn create_and_fund_new_accounts( create_and_fund_account_request( source_account.clone(), coins_per_new_account, - account.public_key(), + account.address(), txn_factory, ) }) @@ -523,13 +517,12 @@ async fn create_and_fund_new_accounts( pub fn create_and_fund_account_request( creation_account: Arc, amount: u64, - pubkey: &Ed25519PublicKey, + address: AccountAddress, txn_factory: &TransactionFactory, ) -> SignedTransaction { - let auth_key = AuthenticationKey::ed25519(pubkey); - creation_account.sign_with_transaction_builder(txn_factory.payload( - aptos_stdlib::aptos_account_transfer(auth_key.account_address(), amount), - )) + creation_account.sign_with_transaction_builder( + txn_factory.payload(aptos_stdlib::aptos_account_transfer(address, amount)), + ) } const CREATION_PARALLELISM: usize = 500; @@ -635,7 +628,7 @@ pub async fn bulk_create_accounts( let mut rng = StdRng::from_seed(seed); let num_seed_accounts = (num_accounts / 50).clamp(1, (num_accounts as f32).sqrt() as usize + 1); - let seed_accounts = account_generator + let seed_accounts = create_private_key_account_generator() .gen_local_accounts(txn_executor, num_seed_accounts, &mut rng) .await?; diff --git a/crates/transaction-emitter-lib/src/emitter/local_account_generator.rs b/crates/transaction-emitter-lib/src/emitter/local_account_generator.rs index 6691a29cc58e1..21504db166fd7 100644 --- a/crates/transaction-emitter-lib/src/emitter/local_account_generator.rs +++ b/crates/transaction-emitter-lib/src/emitter/local_account_generator.rs @@ -1,10 +1,17 @@ +use anyhow::bail; // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 -use aptos_sdk::types::{AccountKey, LocalAccount}; -use aptos_transaction_generator_lib::{AccountType, ReliableTransactionSubmitter}; +use aptos_crypto::ed25519::Ed25519PrivateKey; +use aptos_sdk::types::{AccountKey, EphemeralKeyPair, KeylessAccount, LocalAccount}; +use aptos_transaction_generator_lib::ReliableTransactionSubmitter; +use aptos_types::keyless::{Claims, OpenIdSig, Pepper, ZeroKnowledgeSig}; use async_trait::async_trait; use futures::future::try_join_all; use rand::rngs::StdRng; +use std::{ + fs::File, + io::{self, BufRead}, +}; #[async_trait] pub trait LocalAccountGenerator: Send + Sync { @@ -16,13 +23,31 @@ pub trait LocalAccountGenerator: Send + Sync { ) -> anyhow::Result>; } -pub fn create_account_generator(account_type: AccountType) -> Box { - match account_type { - AccountType::Local => Box::new(PrivateKeyAccountGenerator), - _ => { - unimplemented!("Account type {:?} is not supported", account_type) - }, - } +pub fn create_private_key_account_generator() -> Box { + Box::new(PrivateKeyAccountGenerator) +} + +pub fn create_keyless_account_generator( + ephemeral_secret_key: Ed25519PrivateKey, + epk_expiry_date_secs: u64, + jwt: &str, + proof_file_path: Option<&str>, +) -> anyhow::Result> { + let parts: Vec<&str> = jwt.split('.').collect(); + let header_bytes = base64::decode(parts[0]).unwrap(); + let jwt_header_json = String::from_utf8(header_bytes).unwrap(); + let jwt_payload_json = base64::decode_config(parts[1], base64::URL_SAFE).unwrap(); + let claims: Claims = serde_json::from_slice(&jwt_payload_json)?; + Ok(Box::new(KeylessAccountGenerator { + proof_file_path: proof_file_path.map(|s| s.to_string()), + ephemeral_secret_key, + epk_expiry_date_secs, + iss: claims.oidc_claims.iss, + aud: claims.oidc_claims.aud, + uid_key: "sub".to_owned(), + uid_val: claims.oidc_claims.sub, + jwt_header_json, + })) } pub struct PrivateKeyAccountGenerator; @@ -64,3 +89,96 @@ impl LocalAccountGenerator for PrivateKeyAccountGenerator { Ok(accounts) } } + +pub struct KeylessAccountGenerator { + proof_file_path: Option, + ephemeral_secret_key: Ed25519PrivateKey, + epk_expiry_date_secs: u64, + iss: String, + aud: String, + uid_key: String, + uid_val: String, + jwt_header_json: String, +} + +#[async_trait] +impl LocalAccountGenerator for KeylessAccountGenerator { + async fn gen_local_accounts( + &self, + txn_executor: &dyn ReliableTransactionSubmitter, + num_accounts: usize, + _rng: &mut StdRng, + ) -> anyhow::Result> { + let mut keyless_accounts = vec![]; + let mut addresses = vec![]; + let mut i = 0; + let lines: Box>> = match &self.proof_file_path + { + None => { + let proofs = include_str!("test_proofs_for_localnet_txn_emitter.txt"); + let lines = proofs.lines().map(|line| Ok(line.to_string())); + Box::new(lines) + }, + Some(path) => { + let file = File::open(path).unwrap(); + let reader = io::BufReader::new(file); + Box::new(reader.lines()) + }, + }; + + for line in lines { + let serialized_proof = line?; + let zk_sig_bytes = hex::decode(serialized_proof)?; + let zk_sig = ZeroKnowledgeSig::try_from(zk_sig_bytes.as_slice())?; + + // Cloning is disabled outside #[cfg(test)] + let serialized: &[u8] = &(self.ephemeral_secret_key.to_bytes()); + let esk = Ed25519PrivateKey::try_from(serialized)?; + + let keyless_account = KeylessAccount::new( + &self.iss, + &self.aud, + &self.uid_key, + &self.uid_val, + &self.jwt_header_json, + EphemeralKeyPair::new( + esk, + self.epk_expiry_date_secs, + vec![0; OpenIdSig::EPK_BLINDER_NUM_BYTES], + )?, + Pepper::from_number(i.try_into().unwrap()), + zk_sig, + )?; + addresses.push(keyless_account.authentication_key().account_address()); + keyless_accounts.push(keyless_account); + i += 1; + + if i == num_accounts { + break; + } + } + + if i != num_accounts { + bail!("not enough proofs - {num_accounts} num_accounts, {i} found") + } + + let result_futures = addresses + .iter() + .map(|address| txn_executor.query_sequence_number(*address)) + .collect::>(); + let seq_nums: Vec<_> = try_join_all(result_futures).await?.into_iter().collect(); + + let accounts = keyless_accounts + .into_iter() + .zip(seq_nums) + .map(|(keyless_account, sequence_number)| { + LocalAccount::new_keyless( + keyless_account.authentication_key().account_address(), + keyless_account, + sequence_number, + ) + }) + .collect(); + Ok(accounts) + } +} diff --git a/crates/transaction-emitter-lib/src/emitter/mod.rs b/crates/transaction-emitter-lib/src/emitter/mod.rs index b1f827751620b..39ff2c284d4d6 100644 --- a/crates/transaction-emitter-lib/src/emitter/mod.rs +++ b/crates/transaction-emitter-lib/src/emitter/mod.rs @@ -9,7 +9,9 @@ pub mod transaction_executor; use crate::emitter::{ account_minter::{bulk_create_accounts, SourceAccountManager}, - local_account_generator::create_account_generator, + local_account_generator::{ + create_keyless_account_generator, create_private_key_account_generator, + }, stats::{DynamicStatsTracking, TxnStats}, submission_worker::SubmissionWorker, transaction_executor::RestApiReliableTransactionSubmitter, @@ -17,6 +19,7 @@ use crate::emitter::{ use again::RetryPolicy; use anyhow::{ensure, format_err, Result}; use aptos_config::config::DEFAULT_MAX_SUBMIT_TRANSACTION_BATCH_SIZE; +use aptos_crypto::ed25519::Ed25519PrivateKey; use aptos_logger::{error, info, sample, sample::SampleRate, warn}; use aptos_rest_client::{aptos_api_types::AptosErrorCode, error::RestError, Client as RestClient}; use aptos_sdk::{ @@ -155,7 +158,6 @@ pub struct EmitJobRequest { mode: EmitJobMode, transaction_mix_per_phase: Vec>, - account_type: AccountType, max_gas_per_txn: u64, init_max_gas_per_txn: Option, @@ -188,6 +190,17 @@ pub struct EmitJobRequest { tps_wait_after_expiration_secs: Option, account_minter_seed: Option<[u8; 32]>, + + account_type: AccountType, + + // Arguments for Keyless Load Testing + keyless_ephem_secret_key: Option<[u8; 32]>, + + proof_file_path: Option, + + epk_expiry_date_secs: Option, + + keyless_jwt: Option, } impl Default for EmitJobRequest { @@ -198,7 +211,6 @@ impl Default for EmitJobRequest { mempool_backlog: 3000, }, transaction_mix_per_phase: vec![vec![(TransactionType::default(), 1)]], - account_type: AccountType::Local, max_gas_per_txn: aptos_global_constants::MAX_GAS_AMOUNT, gas_price: aptos_global_constants::GAS_UNIT_PRICE, init_max_gas_per_txn: None, @@ -219,6 +231,11 @@ impl Default for EmitJobRequest { tps_wait_after_expiration_secs: None, account_minter_seed: None, coins_per_account_override: None, + account_type: AccountType::Local, + keyless_ephem_secret_key: None, + proof_file_path: None, + epk_expiry_date_secs: None, + keyless_jwt: None, } } } @@ -306,6 +323,31 @@ impl EmitJobRequest { self } + pub fn keyless_ephem_secret_key_from_seed(mut self, seed_string: &str) -> Self { + self.keyless_ephem_secret_key = Some(parse_seed(seed_string)); + self + } + + pub fn keyless_ephem_secret_key(mut self, keyless_ephem_secret_key: Ed25519PrivateKey) -> Self { + self.keyless_ephem_secret_key = Some(keyless_ephem_secret_key.to_bytes()); + self + } + + pub fn proof_file_path(mut self, proof_file_path: &str) -> Self { + self.proof_file_path = Some(proof_file_path.to_owned()); + self + } + + pub fn epk_expiry_date_secs(mut self, epk_expiry_date_secs: u64) -> Self { + self.epk_expiry_date_secs = Some(epk_expiry_date_secs); + self + } + + pub fn keyless_jwt(mut self, keyless_jwt: &str) -> Self { + self.keyless_jwt = Some(keyless_jwt.to_owned()); + self + } + pub fn get_num_phases(&self) -> usize { self.transaction_mix_per_phase.len() } @@ -725,8 +767,25 @@ impl TxnEmitter { .with_transaction_expiration_time(init_expiration_time); let init_retries: usize = usize::try_from(init_expiration_time / req.init_retry_interval.as_secs()).unwrap(); - - let account_generator = create_account_generator(req.account_type); + let account_generator = match req.account_type { + AccountType::Local => create_private_key_account_generator(), + AccountType::Keyless => { + let ephem_sk = Ed25519PrivateKey::try_from( + req.keyless_ephem_secret_key + .expect("keyless_ephem_secret_key to not be None") + .as_ref(), + )?; + create_keyless_account_generator( + ephem_sk, + req.epk_expiry_date_secs + .expect("epk_expiry_date_secs to not be None"), + req.keyless_jwt + .as_deref() + .expect("keyless_jwt to not be None"), + req.proof_file_path.as_deref(), + )? + }, + }; let mut all_accounts = bulk_create_accounts( root_account.clone(), diff --git a/crates/transaction-emitter-lib/src/emitter/test_proofs_for_localnet_txn_emitter.txt b/crates/transaction-emitter-lib/src/emitter/test_proofs_for_localnet_txn_emitter.txt new file mode 100644 index 0000000000000..94c1e18b88a0e --- /dev/null +++ b/crates/transaction-emitter-lib/src/emitter/test_proofs_for_localnet_txn_emitter.txt @@ -0,0 +1,500 @@ +0000896a19ad85d297dd8db27d5b386386f575552772f5583f61241c98ddf740152a262d5a8997d53dd03af8115a03f6bd785fff9f3058562d142de26fdf63bd15309ed334b3fdf0b401075630876432aa8cb1e155302007f72407eb22692f1c04514f4dbb8abc7aaa0b1f88f8d29be8fabda18e31db7446fdd4551bb97e34051eff0fa5d4e800000000000100406aa88ffbf2a23d2d01d152848659bae555856474f6eee198ac45c6e463712d688a624ded270042f139efae271d2934ef23fb917ae3dccb660088aa6ac1a0c90b +009d624c5d599fc60d30a0e8e9af476dfd27d719a155aa0435ddbdafef0df01e9310e5ad88a2d0e61d0a0c1c929da786951b6a475e3d2009da10fcb6573da49d0b0bc20f3ea82821e267fbf46bd5cc6e137f6c9d3ca4410441f67ec262ca78c0af4b1a829a5d19585122627c1dc47a2c4ca50fa9f303b504141bc16ee1be8e362cff0fa5d4e80000000000010040974d77113166e243098198bc06b13bea5714f9ba50fe2f96c5b38af8069ed4df41b25ef94eac4b0859efb3f6bfc257238fd97c06eb8803978633cbadcc70f706 +0088b86f4368d21ef8521bdc1bc60781cb4d4a11c9c30b198b77a92569e4ab9f259dc966fee81c3532995710d0a192365fabde79febff36339638f978f250a2f2dd87534e9bb23562eb4c6066204bacc3a581e7dc64d1a25e3c1447264175aa72f5c54e67f18d832895e7e64474c692a86f5ba0442444ef25ffd292540f0bc0e06ff0fa5d4e8000000000001004006a40bdf539896d461029dbd5c31e93210d857a6358012ef0e23801d5d92b058fd098917144850d5f9cd93c0546e1d6fee510b0af381111424de05d986f0b90b +00ecddd890bc302c462c020fc7e34c2b376079532ca5c8d33b48bca630b26c1429297106eeb330fba5b43b8cca0083586405d0c86254f886096687169900e42811a784b182150e00d4e84b6ac498da534171e01dfaffea7d310a8ee6697cc9ff2c13ca4857fb192a67b30aa75f8595bbb00e24947060fc29262d9cc2932050b49cff0fa5d4e80000000000010040294feeeb51e542d3afdaf046f0e1f1bcfdb75692d4ee6979689517a86eea84982dbf5af7546b7a2e63005e2800acc3fc04c9f1c076c8a4cdd47f1a2a5d0a6209 +00d8938d4449ae8d6c3f5c0ed5b7191f60f749ab6c64c51849de9d7b8d60afd7099f067589d1d70920fcdd2b35983c680a8cc57d5e8d19ea69fbe234a218bdef1a2ad408572e77e4ee7d386bbd8dab36c011cf18ee5494c22270d5761ed738552c86ac2b4647d10d8c5dd89484d29a7c8fe0453c8f3c6e8033345ae81e9a7e95a3ff0fa5d4e80000000000010040ab743bc52d5dd538f8c9b60385b4feeee829a32a8c3da55d578a4a2192f88a1607edd0b7f9e458ecbac055669a19993b02d4d361a70daf46667d93f15c970a0f +004a1e4c64e75bd2a67c39faeeaadab58a435657c714e7c81b57816051d58cfd9536be8663e0d16df51646a61047875f9a75dc580a556518d531ee47a3401aca15ff31338c4b691aa5b689d484a4b98a1d96acef404f4763112d90edea94308c9dc3937bfed4e8fcf7798a304faa99b3c0ef77e8e1a0c1a7809403e28d6cd1f61fff0fa5d4e80000000000010040c11666029f74c8455314659d972ced78da83792952b066a66224a8738797fd49290b76dd9ba7692d77f6fb05004fe7af8920907c2300257de1c2fdc00d992f09 +00dd8331c7df3e3584cd760365985039e10c2caac731e1161715647e36dacc8b8c5926bce03f41ed41286fbfa9656766eaa7ce8d0ebdcddc6cdd79f782887c09210709276f63710bfa306103aef4e321ad244e89bae84f3daa339e30fd6c2bb38205f2f2dad8fb9d65c3f21d1f06906b85f384313165e9f6656b98cb74fba4380fff0fa5d4e800000000000100401bae2da19b9534f012177a5b3ce38255f29f79f5c6a70c5ca8edf347b5359993f5e666c2d867dc7d54890fe13ac8548eb290e1af892f1481dadbf118a2142107 +004ff99c87d9ce41112cd00026d6deb9989e5ef3499bf0f3116b16658553a5f90a9b38e898883535fd747c8a3b189d9e4f897b515c13be3c3974f373c54fc92c089506bfad46e55a65c1a3b27b8944134b15f471afb199b6f17bf47cc0390f4a16ffeb44752875bce25771399bb62b44d749204529c3de5ce1d2cebcbabf2ecc01ff0fa5d4e80000000000010040c12927d276a3c7666019995ef4f219e978d51222340b3f738a98a2ebaef832236299c5f337dd6384df37ade37a1bb15bf91d79184a48a714f027ed240a0f5205 +00a1986a9b4125d240f13ad6afe4ee9e72e05052e5f00b7e36c4834af97059421238b94043d4b75f70b3f51dac3e8171d4725dda90a02a3356f349c03ac39841063baa80708dc5961933bc6a36315675dde60817f2512dfc5cdf361e65444e168e93f4c1198cfa4c105114166f341d5ec1814845e8a3de694c1d05ff47e50aad80ff0fa5d4e800000000000100403ada50d16e0f932f248e87a5e35adeb995d0f1148eac9f56292f4aae4256396fab3c8c7de87dc9c771ab8d62fe2f393e6be87a4942546def05bdd30a454c6505 +00338926fbbc7378fe40d36d00415654d54214634a4585892e3019a48c066665ac94162ab422e648884015e541e63d4f9b40b376079e260db543c782a5ce250000a14abc1bd9f78d47e2c250bc6cafc288611c3a257b71a3c21336da288a3799895c666a64d07c043c18cfb2895a7e9e17609460ce8b2f58edae257aa1611c3a28ff0fa5d4e80000000000010040de77a0ef19ecd038d1f8c36ae6a50d0b6c9a2bba96d922a9ca7e641136ff084942dbe32d03ce0bcf98b5bc6f0d8d1dfdd59fb1af6bef527840f2a254ee31cc02 +0095864c8d788af6b60af3e311b0bb5322b6468d9c7139703b8f2721a1e344551bcd4d025cd4d6df1269365266042b934434f8930a09b042ee5ab228c3f650210fd5755c8c1749ed7165f1b730149b7ede8fe496eaf682745244cf7bef53b40e8477be8f108bfcd0a7cc7f17210640be151963e2a26f7f0100c7e4afee9534e48bff0fa5d4e80000000000010040b3eb355f52973937cd60c4a857aba5df8ee870f7df9232b8c5cdc27e200624b64889095f5b34521ce1874b2013ba2d53089735ca794fc7c86c4d9011f6842b0c +004e1be2f3fb56a78aa666730e71b46b841930af269aa065257c149c9eff619786d27185326dfb04eca4804b9a16920b86051aa583537d8ac63010f7fbeae0be11d42a59c7383e933e74eea4d8de37639b777b006b4b40d8a41990ac14c8a43ba747e132620826bf97d231a94e5dcba6e545ca4558f73e87a0a54a74f8b7ab8c0dff0fa5d4e800000000000100408952070c32243908c93c7515a84655141e14ea1ac7a15cfef2730ed10b60442ac4bf98e03aef01ffb2d3a2e9c52a2c50d4ea361763cd36069be4bb4bb24d6904 +003ce869917f303b82a72da6af636daffd598d9875ef31cfa34df165b4e1a29a2d37f0f5b9ca8444ff6fa893cb6e334e0deb4117c9929b55c68223ee6894f5902512a113d7c83ce2de5268b8cee3e740d79db59646e958b412270fbb014b477c871131b33107dd673222710674a09c41886ed9ce46ba04e6f1008f7f442d507326ff0fa5d4e80000000000010040fbcb7db4233762b471dace0e8e994327f0f0075b1ed7a4b93fba1710dba1bd3e9bfe31765f46dbfd096a0a7f81edeca321612c5c6750c6b844a8a082844f2900 +0000c1bc7d2ea91a27004b92220f6c1efc90434245431e27dc6b16cb5ce7053c8d3361931e1baeacbb32db10612f19e920d3e704faf7c6fd7f919f2f67b7eaaa2fbea4d1f8c0ab8aa0a884b52a9b930784b9fb375c926f7853c4506969c661418617615d44c3672cdf75394f3b74ddea55914ce4f6a505abe43f2a5a63b348250dff0fa5d4e800000000000100401a4d3cacb1ff1a601ff30db66223566652ca1dfb2b7664ccffa848354f59db27edd45a222ffb8acbbd4c39ba44da125229a7ec7798c015bfd005b65e7238b307 +0008ab23103b03f6e4131367897489394a7cdfbf62252d76164205998fbd1d4312ce1fe3af5e79054f987dd6af10a3a4764d2777cdcfccc51bc6b71d201d15c7258f67951fc3cf671521a21a7bc3b3aad11b699b908838efb8f3e9f36cdf592519a468a842f6a8f40bbc6df3d2f8ab2ec92fa658a1a390b3289e65106215cdc29fff0fa5d4e800000000000100409bde7b1b2d122bb74ab40e039709dbb418f14c6396a054290d49edac0616da75c026a19278ecacab6e81a36ff3b9ecd5d5bdbc036ebdb13551a0ed37e6f5eb01 +000504b71b8beb94d2f1586e621596568ebec14067013da1d000d3351c29e9c2a55a88fe4984064bc557450f55928e4deed08e4db3085204cf79147e0a62cdf51e5ac3f449bf047c121c256f7cfaac0376c6376574f73916eeaebcfd47c8245186d0ad5508c27bcb5a1fd5ae3e1ed10d3dac4ed96077549680e4d008d92d8af128ff0fa5d4e80000000000010040cdff209d995aec6eae7135c608ee16d5c389a317343081c43b2c034323240fcae84ba9b98326b136ef1391f230af729e44bf7d2e62f8392b4d9cbd3a73b41602 +0050e40296827b443ef3eb964694d7d53c07716ff9f18509f0628725ec698c9b2fd26a93b3ccaa7c78efb41417be0501fb04d76c0c8eaf31cd2b9a9cb4a3b9df123160420e6c96179eaddec59cdf2dad1e17d34e2772a2a73c11e0344a14611e29ff4307e5704cacf0bfe0b176f29436f7b15b4592b74797a0420ca73b34b2102cff0fa5d4e80000000000010040202e34af7412375c3cf3114a919986b1133b3307fa7dcc7db08d2866b67ceb1e9aefb89d165b37193eae9435ea8a917989fc7081609b45157d7a3296b8966f0e +00408c22e26c76cd45dd7978675fab42e0959493ef5046fd6aac65dab969345f1b41c9a12599991546e42a847426e11a0c00bcf6e51ab93c3901efa9a7cce4bd0b8c407a3617b3980c6d3f1e2e4dc58393b89172ee6fee916b71c18e56a52c8e19a1f79a81cece4c235b0d17de28f063ccd845a5409df10e41261006415b36f390ff0fa5d4e800000000000100403db72940cc709c6d04c2e979bf8acf64924e277348c975eb5ca327bd87f159f0499cc955bde6b4bcc10632af2c79e853d8b9f883843d8e114b4e6fc2e0574609 +009adaaca5b3fa90ded99b1700c81485bc34902d230e226e764e888af83433f608de9be480f36399fbcc4eb28e7ebe7f9e6fbea53106d78b3c79ce093e18368d2f99eabc1ae8b31fed565e011e0280e079f6b358420f9f1fbfc2212a95a0cb72a085f3d98de11ba9d4b023577eaadf6890eb40e4e9702cc34da7564aca67fced96ff0fa5d4e80000000000010040129aeed4c0c2d7c7a5c58ec91e8db061643f4f66eaf0cc961405161ff9f9a08f22dcb8a623a4c7b9d0d34fd6e18bcf3e1c9dd95142499a5113dc78dee55c0c0a +008f2043ad61ac0affda2b925960d212bdf9d30b7ad3820eb5d15f8f1d73cc3aa18ecf6d9073a28230c8ce4d9af684116eecb5afcb985cd72178cdeada86cb991f8ba13f7d4f1284c0b70ee055c437b3481f2b7677af9849a5ca93c03bc9b6cc91f6313973868264685d36a608bfb4469907212c8d5392e9d53a2ace89e96ab494ff0fa5d4e80000000000010040946d626459b60058db8e07896da0884120a7c04b0ddc4e8d5d44f3fe59d9f18d635b112fa6fe5cc519b72e8eeb92477c5efc14a80a9e3b5f1a9e66edc4350f0f +006d6a134c9f7956196b199a006cded7d75beb7f56a174e8cfccebf301c833a399cb1492d46c3de023bca81edb27f01d1331f174f273ff75cdb75f59025a48ae025678a6410132e2368fa77b044acd75bb5e3c18070893d78a26df455f7af76f148c6c1758519998fda70767fabba2a6c54d8047362f19ab583deedb2aa70e3501ff0fa5d4e8000000000001004019fa3e747e8364c8b84ad0a8dbbc21053a2ce996e4a6d56bab233dfc42079605ebf09137a0b114ec6633f5b347b2753452ad4b3d122e854aedbe4525b4af2607 +00165abb46838078e0f61d38c9e71e2e4e0b5ceb708231b395498909ef5b88089f8f8fb5d51f5f8c71b6b50b9017f5785558b63b2d79519d4a4b77de25a034a12f31ba68e189f838cfa3c23b31f7b648e31392ab18209e9012b4dc64d5b04472298328d6f756c1c720b7cb5bdf4a7bb0962433013a197360fafa6771eb21bda39fff0fa5d4e80000000000010040824fd3f27dd23d9e1d40c98bdff48cdc2d76dfe927d73e9a21660730e71ff918d2d3c9624aaf19b1c67a6298d161b785eb29b33b574fd232eda50e4c8c05b50d +003b111445f5a7ce65dda634d75d1f6fb2f0a735d89a480602863ae36d05faa49bea55e6ed77af129b8e35a1d81358283a0790231ca68785b252bf95509a66392edb6ab4f58ab02124d017189431910c963ae8659692eef5d89c526c377e5333851d78178e9dfaba6971b992f03321d0cf994e063da79938d217be26ff0aaec38cff0fa5d4e800000000000100409c5192570b11666f82592ad101971c9cc52b4326050b4804eca4a260e85df83f3542a90c0f245c2b4273d925b3f860079e55307dead57127d4c33d2b82b09b0a +008e8a85b18a181a52acd4ec574e8a510e31c8cfa4482c4e392561d056875bf029662d574d88e89f0dd82223beac0c049dfbe027b7c70a6913b6c375089df0c70418259ff2aee151c9da10fa3be4a81464a2018ca03924715c01b4dd9901bef30c8bb09efd2965d6622a5a1014f94fcda68e569e356ca10516d7445d1dee773f14ff0fa5d4e80000000000010040dca3994e855c7351230aa54410ca8ae92f0d5c5ab625756073cf070c05b06a3bbc2f0aab9f174a64701ac4dec429c096f7cb0a96e5c19808aadb4be040b65404 +004c402673c42ed64fcc46fce08d51f891793da393f6985d226197345bf731520f021a2f08e832a0043c6d77d88bb1c5a162949f22e6406adb2ebe76a0420e7a21244131ef7c35781f22045e295698868c36629326b63992e583768ca50e3da0aa514d4d0c628f29cd6dfde5fbc1890030bef887584aafbdf3a1296cc0b0582a29ff0fa5d4e800000000000100405fc42ac6feb337007f26733745ce6922f2c55fd7df87f32564c087140c04ea05203aee4a22c58d01f65afc3cdb578eb18a9dc04c40cf2e9e9eb1af8702c0e00a +0070e734d20ea0c31f48a378917c826301886da59f2a49c1cfb964827043abf8079c4fc2d3dc2a7ff95f9f6ca8e87f82043a6edf0b77013cb96a4f7f37faa9642018e8135d78e78c1f1329da72ff168efaf505227e792db0f17abcdd80b9ffb910676cb89a387cb8c0f593a045f28102bd11600ad1cf7c46c10d1b8a0cf07bc39eff0fa5d4e8000000000001004056fe4d8e62cd10f120ea721a51661d38a62e4272fc018fe9af57cfe83833e004dc723bf9a7af1c40ebd89e4b91a0c860600306caf4473280ecd69f1b79554305 +00828aa08f8f2ab4619e2437cfb1d2c5244aeed55b253845191014a4b694460a1e84ad89cb6cc37e8199a57dd96c2dc4f383da066e18350493947b9aecb5bb9223344695d0bf14c71fda5b713684f0d87c2360af32d85fffd6be273f569369aa94838f87c83c1d0b5ed90a9225ebfcfbabe63eb98d3fa142dc9e06d699e8cd5285ff0fa5d4e80000000000010040ca8d54bb7ff07a0fe1548fd4a511a02e57090a0c97ed0be20e5f7beeec28fa25d8181b1c867cd214e360c53c80669cbf81b38c389da41ae53f14c30f09ebe904 +00c5b9f481497388dc66e66fa382f584973f7d0e84b9eacdd229aab27b741981292cf3151db24a4c4092b4de637aca4645708a62b5313dc70acba3d82b2366510782bc3eaa858f3993e6e393751924ea86f30d5ec43f572bcb7b7e0a0ac92cf7a4e0749e3667aa6026525aa038c004d7c81d540448e6a9b21f7a1b1465747c0c20ff0fa5d4e800000000000100408633e4955f22e0f9a19e06898c81daa9ecd36ce21848f39bf8b225eeca74d15cf812866447e7653ce4331f8840bfef724feb1015a57ea82d9018ab728e1f6709 +00ecb244f0c938ccc398939abbd9c05f873dd060d7d28319a74e8c13012a5c6025aea83bde88841ef31736d937393d93c6f86a0fdde060eec4e887839f8427651c8b502f1af7862ff3a911f1abeb356cf15a9968bf340cc7285e2d47bb14cd46a7bed0fc194551149df11ce22df2650100c797b72170dba6769ea2f1856441e90bff0fa5d4e800000000000100400f5888b72463d0c340f556f8f829b2d4df1c26711dfb2d83998697ba99546668be93f79b65c1303685a415cbad6d2c91b6ed7972940bd76a2604f09e1d68580f +00a09f19abe20c950421fa80a66b1ad969c27df71fd31d246960208576c72ff8a4be2db96ae2b927ce88934b116d82c6b89d5d8a2075decffea8c4477bdde04c1c2db519d0de89acd60d0d88a85d2ce66e0ccebc91d2bf2b92dd9bb1a5e6da8e952e51264752c19d9147f9d163e6beb885fabe4122e73bfe5117f2ff313be2938cff0fa5d4e80000000000010040da79710c6f9c1b3ec539bd80a6c966a91d379525b7de6e4220e95376c6e16001db8d23ee129e91ba073c890820e95fefa43bb18c6aff87bb1f46c48d1241bf05 +00682b82504f0500445746d849c176eec5879c96333408250b2f20f67d6ddca50a0b4f2124daa0e01ae485375ddb224c5de71bc0c7a10102cb798ebde886bda2241a3b03dad801e3fc600c5e0dc4fb4989df96587298796f0d1099c294f2bfcc0fb6b98fffd7485b952a0e81d108bddecfe8c05a216175ec712598cf24dfc4ffadff0fa5d4e80000000000010040dbd598c6a438757a7eaafe9cdaf6b88c782fda9a26d75982c2dc91ea864d1d809182ee964578a3688b35733552406ed2ffc0bf5cef1692d8aedc802fbaa18707 +009e3f3d30ab456b9b91523485728e371918f59540ae060f34f12680276ce6870d448c7ef4928b26a7abed0a2f002fe33261a642ec2ba03e0958136aff3743052f71070f2ef8342e382b34a656fcff3ba52fb2cd9813168fb554793de887c6c587820bfdb22c62b6645ea4c49ef30cd96d4677a9faf317347530be4620d2e04f80ff0fa5d4e80000000000010040f1c1de6dcd76574c34dfe8d7911648d5e17dbae80dab268a88ad78dcc6b57d68aa4f778e4504ddf96c3bbc529b532c9b296a132998006672c28e66f9c680f60e +00bf9a9c2bf643bab610fb1bd13c4bb206a9f5ef4a3cd84c2875edfe5efc3bf28dd5448847185bd23f976d5743486a082d2ba817f367b049b86843cab255ae080799059d5897f38b3f09a325aba910f747f7a0c5cd7550c08666254e9942a1ec9b2935ac9c132cb33e028d4d4c328d2bec680569671cf16e8a19be7abff9f21b04ff0fa5d4e80000000000010040e9c47f840847eab31542c117570cdba664cd95d258cd6d911d5b304119ecc623760198cc04529a7f1ffd1eb847f20402512e5aaca77d6389cfe041e1dd556305 +0015b6b30f4f4c3520f54a8458f8400e508ebc3bac60cfde05f2b6f840f6d1479a944e82ce2d2a10cd969e81722b7b65d1c8e4da3249121bafa763fb432784cb04506855d23625a01b1834531006e07cbc50754bfa56cacfe52177e1e9ae494e151ff242bea3c94c431c96eb4fbb1e88cf7e0fc381e27482dc4ac96900c68abda3ff0fa5d4e800000000000100402f56dfc0c2132499e6315fde5a70eb0cc0d8007863fff1995399d05d07fba339e46d3c39381aecf9dd3aa8b4b16498691d0696d202bf96871dcc0516034e920a +00695db9a961a71dc83f9610663754a7bb8363b8d38008b301e1e685f457678d12106f547858e8a9207adddbbdfcb6ed56ed23e83403d59bf7e4cc499b35818210b6549c8bae765a84ea9bdc895f678f216bbb5f6051fa3535395413b3152db3a1f3628e0e5be379eaa8add866a277f050ad327513aaa1dc28130df574b1b41883ff0fa5d4e80000000000010040cf33793f3a54a325ea4dae963bedaece0e31738c69a8d6c811b89beac7cf046ea4c6037b056cee0422efbfa856b39fdec53eb7252d0cf43f4d0ba2a2f3d2570a +004d7ed4f76e643fb44094bbd0dc8c6e7db1421cef4824144818da69f5f7d7d12cd3d8b8442173308bad7303d13a9c7c40534052dcb8bee7ee069deb86b0a1d52031e6ba0d5974b012602a424fa1e11268e3c2e9266e8663be1152ae2f957f682207f942a688dd463b513d6b03596b222f6501e8776f22e4dc9b6eb664b0420606ff0fa5d4e8000000000001004019567d4c2a37e43d311dacb7a431e122c5c82b7ea27de21e559bcf406525002476a90a7f914c8a20308cd4e6397e52c88074cc2a096598fc02dedd43441c7904 +00ce15357be99473f516665faf704fe583942050aef0619d77fe7259698f51f693ce3e4d011347ef3a2fd4b1c9307277fe45ff0b30b19bc5b6e5ff0f73279f162c0ac39a9b292efb3c61a24d80cfd41df5952c2ed3827a560635ff7c5f8d47f724acd37bfafff63ee7f6812e95a7190629c9f18c18ddc10df6ddb8089080da3711ff0fa5d4e8000000000001004098461092eecb6b6fec7a1077b3b956b1e163e099a05cc3a41ea197319cae723c29c3698d6f61734a61a61e949da2820601a29065e89355694abdfd8e3a8e6604 +00381a694fd6b6e526bcab25fcbd88c188cc4f522b10902783912961a0c4118da0140f5e99fe2ba6c37b737d69422c8c007105e406e65c8fe541d4b1a302c0680b8adf2108ea994fe976163d2339ea66df7f1d3b49447e2d6b9b04b804d194dd2eb68d6e9e0170d1406b27fc7475455cb27f55bc258fa1644e2f2bf07a5961900eff0fa5d4e80000000000010040173fafa75ad37c202addea617bef0337d405f46348f57b1531530e3a6bf2800ba342a0ff233fc1539f52324533c863a6bc786665ec42bd4d7039af403f4c0e04 +0071bfdbbc4c5aec0a44f6a7dab8abf43ae8e663cc1a2ddac30e022eccda23db16b44f877c1d2abb63f2179c433503d6cef78e5f7f57f216b4b35c264fd866690db7faf704d16fc947489af62594f676ba0029e0b9057f707cca98c317064a8a28599b8eea8d66aa50afdd10839026a36235862fb716d5d60942427582212ee00cff0fa5d4e80000000000010040443866308c69278c4ca442f44e5ca4b944fed29c918d910eddd55aeec3e00bd1b70a962cd47bd65941ff3c1f1036f52c15163ac25e5729bcea169888c7ba5908 +00ffe52b32456d47c1b27465e5d48a2ce917c5cbd9d3583ea1560390339654f08ef33752c9f9c5b817a62179b3d122bb535144ae65e5dd6c5746c20b53c981d82698cb6b0b606d5d9dfa3458f6c4e2b76873a4a222d603ae481b7167227ebf56aa629ea954ee7f22826a68b106eb397468be01777f708fa2e5aa713c49897b319cff0fa5d4e80000000000010040bab609af5989e991ac4fd53f5c3a295e22e27cffd803e15bf5ef307e2dcaaede991634bdc9f19388238036351001e64f48537f3268badb6737561221600f5602 +0015e55ff7d9971305221803cbd77e313db13aca290445743b3daf5873570c33a6eae6682e173ba7c5dd3a44148c969b31214a9a7ca4f6a2f5e8ac51310a6b1729e2c2116c260d4a948d110f453bee22cf46f6c3c03277e7f7e03a00d64c5cc103a0948019571f46d0c1d2588fa79967432844190cb7148e7487dd94c9aba81fa7ff0fa5d4e8000000000001004080479d39b30b4c65855ade19c0f4ebd89987cc74227f4bad6a17a49fad1625890e24c534809e4939458bedfcc0dfa6292c210065c613576d2ca0935808212d01 +0091bb9454188907911ebb91c90a6465adc1eb648ad04cadfa3cb06ab3f9dd48aeb70892ef22f68c67fcd3b09f67037653fe7fa44921d5cc0ad17e93e280986100ad481505e6cea6019865a34d6141d1ac37ba3239b1aa4e531b903806f7eb748ba495146ff1a08e64411348a702c546581d53d7cbd284b1a87c640704d8161091ff0fa5d4e800000000000100400d494e8d704332ba820b09bfa764d32e90c00f8d413ccb94146a3df36757b402bbd0c988205e160e8febd552360afd605ad7a80c390f112b6fee1761b2736a05 +0084048f0925744e34defba8d20351902b0a6dedc376b48cce30142e37e1dca424e83a6f2593b51829deaa3b3805eb3e52de6296d117192a6bda7aed17ac058b272c34d298394ad533c08d63f46e8154d06a69d82c82b64bd381454dd9a229e7abacd0cbff6b60e1eca28210d21b2235a03f5990750b88754c1c0af389b17a1780ff0fa5d4e80000000000010040c10d89f6481d03f1c9b25c8816d838e88134644802332f5009d42aa555d173c50eb8bad595061f0c70ed8f5f922ad9a48875a008566375b47d8c5a903bec5909 +00890d26a32ead583e9e8e35c0d0e09b756e518d52b9e03d836256dd121f8cc78142c1b697da5f6cb0f42da218ca67c17d2ea10e59c4eb4154f9359bb3e874990522ef1264dcdfc253b054d5e2089fc2a35d975692370c02b9018a58236af33294415a5143d380152daa02f76039f958d7c9e15f177ae1d7f00f995cbb350fa22bff0fa5d4e8000000000001004079f2a7760852b6007f042f2af698b64eac5eb3461575a171a4e792578b722ac9835de1c7bdd87094efc90dc1dcc9fa8eaa5543f7111182f752fd6ecb66d7e00b +006b376fc51a53c5808154661477b18a8f6b85bd50bd62d423962ac30b16574e001342e5fcd9a221e9893767f0767e528be50986081a09be9f540aed6b577d4b11b139095ef0973301e02c6010b987f38dbc96cc50faba5bd59620be690b7ef82bd72eacda5b8f13c16d60d55786ecc353f59489a69bdd63846d13f6e4777fbb0fff0fa5d4e80000000000010040850e0f67227f0c1642b1c0b4fe5da5d5466c5daf1ddebe7ff21f777b61067967b9f6d045e4d6e83efd2d5695d73133a4271843406406fc32c7addb21c193f907 +00ac25d4f71d9b0d6f094aacef46614bde360a178e3deae740e4cde27df0bf268f59a877c236a23228f9042d8a57c608b59abd559fed56830d7a178d9dcd513d0ad90e70d3e25fce3a466a14d8e8cbf2598c386583966cff71e237ba18c5b23813667c57132e93d71c56446f9f9460b21914659cf014a611043dddd6bb3ef03420ff0fa5d4e800000000000100407899b911859077295adf12170fd23f3536f7e765c18fd7b63aabe1f12d8d5176d7416ad1a43ec6e57597c414d6a03a4edf332508e656678b152021a28ce27704 +008ec0810f3e6ea7725989b0e61c90a360b8ab57b68a7b9311130aaf32f53a5487e662aca2b79e9bcbf0d46ebba7ded13a2261f2e8d4569aacb4982d2035a6471410e876136065101da001669893c4ec14f5f78cdee5a3babdd09c124c406aa6a2e935dc38161d1b39ca19afcc335970c2cfa5db79131431d435dae8cb9e4fac9aff0fa5d4e80000000000010040d548e899c0629b7886cb2336c65c84925cd02660ca939f7f91736ead46f4c489f81a83f79d8d2c69284d0ce0efb9ff38fda1e5d3a78a382612bb999ae9f8bc0e +001fef08f3bad6880ecbbedd55196522ab623f1547a74a1c696d5530393eeb790f30417dc73722bc51d0a2167f30bb28b229366405158f56f6baf2dda655c5bf163e72388f5f502f857d28cb6ef3e25abcc960c7c6c93ce483f800aec8b38ad71fdcb382ff73449214441af9b0ec98abfcbccaf7f21ef9d6d212204dab2c0e9b9fff0fa5d4e80000000000010040806f0513b3ad2353355e17ddc8c4d9734e861a0324c9cd82c015fbf696cb156f5691425d76953e2236ec04a1e3e3718c66b0bd94f8a35ef1de9717e52ef51500 +007f91b44b38a49a9a571c2333adf6e8e9460342ef6ed549583d93ee9e73077a06778f9656c0d41f79fd5d6774e38cef31de6f276489cc4154d69462912cefa2230dd16f1c09b533faed2af56508823aefdaccf3365ed689bad05734a69ee8e4a17e1efdc7b74dce2edd1fed0fc54a50ff7643ad9092285f907b05bb1a5cf7a821ff0fa5d4e80000000000010040266c2f21379fcd405a7642bf4fbd295f6856846103b6b8cc9a2b0a062d7bbfde77bf16919d8f1f19d48fa3cdc4353176b4b289908090834c5ed528a77f2ae705 +00dd8daae1a51101a0224cb011caea5f9256529f1bfa7ead6c782aa3df93f47aa319ad057ecefac6db20ffbf9d685c191a4ac90050db0e19747c9ee8a1e33b6a1eefc309fa35d45681ffdedda817743c527e86d19e9a2d443bc787dd2aaa48fb1e4dfcba136c6aa32bc3b4e03ba5342ac2d5c9c94db6915360705b7b7a99f08893ff0fa5d4e8000000000001004093d4ae71e2116fc3c191ecfffe91ce5b9e1afd1210b949591fea3c8038a726aace68f9aa02f5e31e7c6697abe7f543b3805a9d95cf0671cff15922711272f602 +00b0a01d5b65214178bd41eff9453d98364475ad657c04ade73d372b089d227b16174ca69dffef240a33c1aa9457683d06910f1b1877005a49d8e62f3e99bd1d30d142c18f95c53eb208d680696d074706b9a19145452f7bd2b645b7299c8b2602f0f5bd0eb5ff6f7638110cd40cb4b339afe0d79cf2d669ba8d87b3af84e47c21ff0fa5d4e800000000000100404a1d3db8e0d4e8c3c13999714ead33edc320235615ff21dd64213d0b9a8210e2d76a26eca2c156e6e1266038329437776d948b5ee3275016df19420158303b02 +00384ca36a92b4a3fb5c22c655f3d9058103bf72972bccbcb9d3abbc7bb0402da8ce19077e5241ffe6d4c0eee42673b4831919f2910f8d3b32ccbeabc3d376981b0c6eed75009f89fe134e918fecaabbe57869504a4e824780fb9eb9356044c70fbdbdcb8048e18b3fedef13ae9bda01a301869127a824834808fb64613b30270cff0fa5d4e800000000000100404ad72057430e1578c92e3cfbecb56edebdf451a63395c576f594c0e2d30e3916146f6bdf497a56cea36f16bddbe91ac82b6c8ab3c4da97dc00f4c91819eccd02 +00c387be3520a8437ffce41c47333d577a53de1c4a69681dce20c611f80933e512aa7040956283d54a3911c80f142bcb25a0d23799909711c3d8e6623e442bc7228f4ffa1eb2c4079929bd6d8547359d0ed17ebf1e4c995296719d1112676a9283acb98eb0c035573fdf1730739377fba0ead9c0c793840d2b245375de9d090f96ff0fa5d4e8000000000001004021d8e2d996976e1f284d67e4240e348ad440def99ee5be74a9fb74452177285a3061c97e74b3e5e300ba062a56b643e73c129cbe026c17e2681ff85b4d5e4f0f +00c726af7ee6c7b4127ea703ecf87439cb855fb34f5b4d63d3c939fc3c98f5fb04ebea1dcb3a6ac63ef4c3c520d72ff613456a21307a94940d1486534d7aa5fa0fec44b8bc7fb039efa4a0743890099b53187276601571f5833b4da1597fcca381b864641e22d468e725cea11f509f010052c478f699ea8147171f89c131e2c30bff0fa5d4e80000000000010040723dcb2cdd92176cd4101ffb6823129d928c72ba8b49467ebdc565dcb219ac5d5998142207d87c26b9426a47936c2e4bf33ea569e729926c5fd68d7b6166e800 +00ebccb7c800a8619b936a8c80ad2406418b3257f1bc9338ebb83288c3a08b5a063f022fc14680fa7be5e8a2aa97e6c451b1894baf78ad66b6d0a5594fd8fb802e9527dc7bf1b68ef9c6a00802f0e413cb37c4e8946dceffad263293b30a19610be3bc2d70e4987241ded1f0ddecb5e59b9210b7854dbdbc8c06d1265b86371da6ff0fa5d4e800000000000100400d1fa164a25abe555bcbd14f593775eb0b6510f2f4ef5a096aa606fb4b3ae39705539620a0e8a61d3416ed7c9bc4256439ca634e16cdd6bc9526d68156c26d01 +004442b2979a7e89284e223e25138744d55bc3b72b404f33b2bba25566c9b2348bc9bc023fbb5ace90288a3e1ced1317a2f91288b831aef3db4ee6e99acf072d2ae61720d35834c0aa57a045158e3d2d62c6c402b9083693c5728862716fe9aa932339e25562a8082d48a7be363815e7331d648954d7d3d2274ac8902d49aa70a4ff0fa5d4e80000000000010040b4814bc5f83091d9c44d8217f38c1f3f53cb1b414a7b87a2962e30ea75e059d64389b552e88e4c5e5d91a6d42fcc71201f2d649418249bffbd84405950ff6802 +00faf986ff63630b1acfef56cbe663a8b3f2f0bbedb4a0a5f09e736907d5b9c28ff26daa99f195e507c434ee0c6761c2a202044a312e70e358f9e2eb9fb439572e967275176233ef51d351b8325c163883a4bf2d7533cfd905b01cb6c9c8037f191bf569d8ef43aa8b6b86708289406ebc0ede541b890cbfcaf08ff16062789dabff0fa5d4e80000000000010040a2442039a8f6769bab3d80f003d7a17e60e5b9bf9a6c801ddb82c0299c7042cdc9b5c45e7d1192848304d9e92c17e1be155ef6dfcb422067e031d2e6d51eff0e +008cc7d7900d56451700e18b4de08e67a798bf57de755ce9f44fe6cfc54a40da13b99db8a9a6477ec9909237f737e4e09eba5b93e70071295d2f69ba9dadb32d19b168aea2589ed559e904b6dbc694e0c2ec4e977983c3224bb8bfe457e6a06d021f79fcec66588f078220584c8afc6dc26d1e9e71fe6c09737594473b1fdb3d98ff0fa5d4e80000000000010040a8a9f9970979c465af5cda773047d7e90151852c469d126d849c7a061c9be38c43388a76e3b3e15b80311684d98d1f7114b34dae8d324d94a87d9e22fcc38301 +00682f58864a98e5485f64e81541d243b693a9499961510b39a1e1175915093723a6d3ce9d8cac522da87edc95f052df402c16067ed7a9678c615ac3fadb7ff7040c40ac330bda4c91af81e4948618ff7c1f1754a602d663bdb5b96838f9c56c2a4d917a80c1106896a85aa73d0a11bf433466a93ea204b8f6ea812425044d3520ff0fa5d4e8000000000001004021f89fce88e9575f8d0c97eee6509db9220e66ff90a1d50f97fcd94a9275a808d7b5ff9a49c53b5768219acb6bfae1d78d6446a1eb8d2620ddc676747810d103 +00a8959b520865b98f807de3e4f22da1d4407929d706d64db36422df53433ae29496dd466c97d503db96ad1c3cc33f3a6f94db588f43cb4dfaf28968d898a27f1371bd3b8c808c4a44cd63238972ff9fc8ab3c956513b438da0a0ec8d1ad7b888ef2e683e134143fc379b822994668e7804a729d3579bb93e5e7fd656589d2c806ff0fa5d4e80000000000010040161da4c54b995298000096e1053ef3e6411d8c168d5cd80275be4b26786f62866d5af5fcc0d2d94666f185f337ca3f8041c7948be1715743629e56798471d00d +00f6c7d8ab79a1511b589d83477d82b3fb36a0eabf47dfeda24dbc333b0b7e7314fc718b5139393d9308d75beb1e62e7d5e19d474cd3bb47460b309cf2404aee1fd03f78c3d39f013f1843416327eb9776d1683f8428610a04274ba530f5bde0a31d0070402a55a436ca0dd7308bbfbf2067e64be0d9fd9e366d7613ccfb132925ff0fa5d4e80000000000010040bff5ea1b3b3b995b25981416b6938eabbbac9754eac24c36683d9cb90e2e1f1ec5a226b342784b76a8eca059d773dc2cc8b4682932e1b7801eb12a364aa0e104 +00328048abc35c820dbf8b98315e599ceb515ca91b309be75dcfbaf1174f9b670d86d9862d9acd2fb0cfa75c913620cdd342c12a37bda8c60cbe7a898cc862ba1d8103224eb43ef5c2bd954d82d115eb9e171c9a6c336a9e03beaca9e2f6cb2e9b54cb36f57c92c3eb45d3af9ef807aaab744f2646d52ae69a64a9fb39823db31fff0fa5d4e8000000000001004016bcec0e53df18123ea6991a6f052c99dad85ec6ddd5736e4d7bc23b5aab7ebef62ff75c05b82888ba2f8777c552131930c7fe68cd920c74e73ac5267497c400 +00c05d27158c91606bb39a9bacdffdbd355c56cc8f1e3c20df2b10e66ada8593211685b4b6706d8f5fc9686f189298d1e76824a7281aad7e40aeb7bba8f8654d272dde817cc0333407b21b8e9348a3ab3aae92ef76bd634f3ca36addf216f77f0cede3d91a6d526dc9196ad1880f1845efc672d3089d815288b155b4361d37101cff0fa5d4e80000000000010040e9460b09e3e6670dbf63b210fca4e5b9cb5eb8f635b409058f05a8ef3a787d4fe9c0f7b30d5c71dc9f990f8757e4bebe2605bb221a05d4b09beab9ed9f27c90e +00a0d1ceff0131b3043d1a374acd81a39e9fc1b4b344b7dd65873fac9f4bfcdb9dbbfdf6dbcc150388acc15e861e5a252a65370346ea42e5d92298b5bd85b1b406d2acf095e3c403e3a5ac79eb73d560ccd21a4f433ad054e4b5a31e5fce71309e5833a837972bb714c9b0fcccc4cf06ebc6cfbcd6ce8ad0ed8cf4fe4d76ef6516ff0fa5d4e8000000000001004098b5a464c6f89b2659ef88c272fc372b3d407a411a66371349dea8651390639aba524d26fc59f2c0d9bd15d71648b46f0edca174732aaac5917b3f1711a8e507 +005ac2fe30e8d4354e9fb25a3839445c24f5c57ea85472d6b6352595fa26c79719ad79732076d61a9bc2ea535071e1f86e9a81536e7c70767b0a8eeb22ad0f9c2b1db55ca899411a4c04d571d34446995f5c875b16fdd04bb0ada685dbe17e9a82d2dd30e1ddfa464179786eda606f82b24aff8442a5a2458d2cda6e4002da9305ff0fa5d4e800000000000100404c2f7b37100ef02d3a856e478bea4db794b49438d9f2264f52b88b517fb03ab9f3f234bcbb05f08e549d0ee48e0a529ef9e41144390763b93063d35196840b04 +00515de0582d8e64c811e9c6a4c6e1280d232708a3fa336512fdf4ccc59940e2072010d12e210b4461e35c01b8ba163601558d42e26d4cca0b6284d77070a8ea0bccfcb80f6c0391acbc9521389af43a02b45d0da0492c8c1bb79f84737723e6079a8e57ba997bfaf3d57c385520a5f4a08d90764c022b6543ddb0083606f3a5a6ff0fa5d4e80000000000010040b66e3c507963415764de6a7db7570ff8025d895737b65a290cf7005492361c8f48a8b57894a0055f1fdf534c515bb50ffcabc4a9d0503de163bdd42985ad760e +00f62aa6cbfc8fb82473d50b12ff189b15f4480ff367d6baa9762d84b4a5bbec809b8c3a37c8483768576270b62534866ede3b62bdf7fd08736bae8035a7c99426bd2cb0c10d832cedca263ecffb7bcbe3f2c993b795d089ab3b7f5d88a82456a8ebef1a41b6a633e316109bad4ae4e33cb98067473112dfa3fcc8da60cb61a18bff0fa5d4e80000000000010040d1e87da64ed37b2393ca8df5bc2f06a63b950b9f60d79c6e57dcbd1743d215d7c2e2a1ab5afebc6908c0bb585d59d3f8b65db2341598a8d9160d214ca9541209 +003adfa8e40be811a21df6765dd4da42bbf01a6181e1f5282373ba536d45d503899a8cd42c39da547c8569363818a81c4371a3db14c55e238f9eb4f16152b5d52d9f903f8f88c658bfc8b2f588c47e12c4fd34ec59098503395d0162665fd18a2b42ab73b501a9fd6d5ed6d68ab206e3966f35670a8553d3169127da9f598a3512ff0fa5d4e80000000000010040ca069da8e7977df77706262153d62656ef0dee9b65ee553d756c255c70a3d40b6dc9b9472c4341aab5de92b3678e7f86de74fdbe6ff3a71624f9a1d23abe6306 +004c81f028919caaa294899034d4a781f4b83c66402cee40c62b40cdb2953dfb81348ba49804b95cbcb1a5e829afd9f4f76be05b77bf4032efd6b8944ca197ac23c90a68fd8fe836ba35600292b20b7dad31772b35d8ddc3414c80dca7fe0b312f8710610e9d1caa873467b5699aef4ec3968c530d9dd8e627d0a2dcfc1a7adaa6ff0fa5d4e8000000000001004080687dd00f19047eac8f8d0490c61a8a00185182271736957cd32ee01528ef7b61f6e69205ae28957fa37e150714af6eeafc8247efe3091600a185269e0e0e0e +00302de24ee83c0cb6d374cceb55168ca3c71d874b54fcf506d44d59faecce9d16c5f14f9a0d448eb3578c72ba23974f40c98edec9bd6025d69859432fa609850d5800a361ac99809d4371751ac3e39071cbebed3f13e18cd06d0e8964437ae88a021fcab161553f7596d7c844e2bc934436538d8e7c1168eb6e1fd7eacbac36acff0fa5d4e80000000000010040a727f590382f1d3a98fbd7821ba90055f949867ae5d968ff4dd9daa5321024574a39e0b7fc53b72eb46ff44ac42378b56aa9b0cce1938240cc902ac538aaf40e +002d5e561e1724d6492457c5af61910439f94573afe70026981a650801a41ea80fd9de46c39c6efee798129e55e33e0276037252e2e5c2b62999b7a4e5a751e92d616ce2179e600d29d47e05a27d010448237ec9dd0d5d6ecbef0c64140941769fab5aa6214bafbc79a4bc49990abad76471ad0c8529a92b313f833f0cdcb2be84ff0fa5d4e80000000000010040bcb11af7c0573e1aa6f027ea1b38728b669ac6d1ae9880e9846298a31f72e8a13163155f0ba24956183b240cdcd889649066712b8a0a066c9aa50084be65a107 +00dbd84335330556f1d24d1fcb53b2604c9e6c1365e64de60203475ab9bbc881ab003cdc6c178b8632b2ecf056a96333044cad77f30d5cb5274a42ef8120cb1c0dbe079d242296a70e1a95c6c687ddeb43d92a7c62fe77794fca87f1619baac38976cf528f27299eeae6e053eda79dc730443d6bb2f6250179ccfeb89279186e23ff0fa5d4e80000000000010040cc1445f1c8dc3e07ae717347bab4dd18f0f1e1517b7ea2bb572de84ad4ca6eb1a5d225b658d195f0217d55b0e763265912328596b052e289012d0d780b93b702 +00ccbc5798df33c1da54bfed08ce2e8c3937d1357deba2b655b258a6a91987d82e6a52832c6f36fa8f15d8c565cc139ea299b9650f0192b718315afd1b6920ae0d3590e815539e66ab80af4339ce04d9be5429359b881eecc36b935c91a04f5d1c95aa87008c26732d7ccfd9fe92b0f4a0ef7d8533cc401a3dc8c9754d1241e718ff0fa5d4e800000000000100402f7348bc4cde1642d79800aba5d1f45f0733543250a46c8d981449355b1443dbc9843a55ebefa3f01437b84c485cc8e39b13b8e52d9f7552c60de1f2a689ef07 +00a8b653b202eb3ab51bc31e669ce7f5fda1f1f3b3d927f9ca4ae8bd9bbccfa7a292a68a565244c4d13a2473b2d4d70f1613f1c78b70017eacf5f822e5c897431fd947d032c730db7bd6c593182c3474c717b505e5e59827bc4e2d07465621bc13e08d34f037cf0c9c79bada798b6c369b15439652af3d602510f8622c361f062fff0fa5d4e800000000000100403ebfcd3b389254df9748fff3f8c8d4cd47be5325ff335c84996006e75b5d52632b2112aadbd7f59b44e6d334ecbd128e67e3848f95eeabe46d37c469605bac08 +00ee154e42c47a07e7567bc6100fb68fcdffd06aa15bf9080176bb384271dde9ae7ac614ba6a5f67aacb2d21cf3ce430feb01a64a37b8305d5f6ebf5bf16112422ddda3dc30670fff53a8105ae10cf171afed14e53e3bc3a09f33a3c4e72d4e39e8c7e738b8ef9154999db11f3ddbbac4a3071da48718675f451fd625558538f8fff0fa5d4e80000000000010040b401ec96ef38f0854f764687ad8192bec5a5a096b8fcab43478e97734b5e444a53598be6011ec3616c00cc0ca2591428dbc012e6b76065e34815d25c098d8803 +00f9b3243b3ac0f6d2f58621c875f61756b7b626d2e5d8fe886de169ef50aa8897e0348581962fbc954cf7c9f07425129751ea12a946cd7ebdd0a715a5766acc1fdf268f597053b78207fa8919c3e662f6cf07736be2a7495522b9d6ca9287578fce8eebd38abb298480933b36aab6f9bf4d66f798c8a3f9aa432b21ff0f5bce84ff0fa5d4e80000000000010040ed629d32c5ba491a99e198fcc6d12192788fd7ca62030a63a60f3133a769833799de44a8ec889ca0f9e583aea232f373412717db095f44032d72dd15b56a5501 +001f198ab4a1fc0f8377f159c4cfcf87acaa1951f07b01ae1ac22aa066f0c5bd04577f3708dfdc235adfdadc88a6cf20ac96fa993fcf157be3f096b9b9db24e41dcd28534a5ece3aacedbdb0ba62dca5c4e852f5c567ea045d89d9d5b154864f85eb31c0468f28aa1c05dd171b34ddd248bce3556dcdc507f5436ebb8c17a68c83ff0fa5d4e800000000000100407d021b71f75ec723c48c981e52f0666ceebbb833c2e56d7f847477a508361b1441545a0dc6b4ad923375d911a2200202102e88e30f01890d78a3cf80bb491e04 +00ae442defdc7bcccbbb24d914d76ca8841d9662f5f3b3211e1cad423875063c0469c20427c0def31b44f5574e691f266994f4812faa8969195da0e3ad71f1fc2ba7a142282a2d4cf6d268587ea03694737e23294493948080f5f67c25ad447226c2c104faebcfce98939fd8729a4728d026e59ad4d6f1e53765d400a466490ea2ff0fa5d4e8000000000001004028fd2995f9862a48d48805c1f1f9f81284dd5696016a0ffc9230a5090e7cac16bac3adc9f8eafbb716f2bd724beca508d5423c09602ecbd58b3124acfed8980d +007d43c742c68cb8bc54c5de33bd96d329712d6221d04d85e6a7fcd118ae7de2af37b581f4584a18ade23b1949947d13124f18f2149d2420c76ad8d5a5c3c1000d6702ceac208e6b464f633c4f855a9e6a01e07cb7110982e40f562946521c10104b8392fe903668c0e05f8aa92b01e21dcc2c9767776eb5cca22060c78d4c919fff0fa5d4e80000000000010040d4a3b5b23b3857e9a3c759fb18e8dac3df6096db730d3b99bac6dab261184437d1a70cfb936a15518c8c1604692eb92d85c52d9fcd40eb4dc181d7f492b9f208 +002b894cc41250eb5a33ea6dec973647bf5eb86d4f69da4efd1058288b2b45322de5118f1d64404ddad923ee0476fdeff9be97cf711ef51957be122422185f6d0e9dca7517500c827d7d8950eb8b1df73fddaef835ca303e6863acbe961455870252f62498b470e2b3c988f319b8c8fac73c7a6c6376fc86903c0443fe55c9e122ff0fa5d4e80000000000010040b671b1333c318fe564bb57e24728f11a0d6a85aa444792651671294776f90ce95ebfea0ddecddfe206cee64be5e9f3f7926c6a983c9f18be9b4650ef50e22909 +00dacc741de7d5030b62a42fb81f8d948f82f5e4d109516f4c16fcbb7b425804a1b75305309c5717fc3c7773ab8694a517738b0e8b33f3a31af173c600ef565f2fa0783fbb9ad513bb5c836d4f39c381bac42f8ac2ee6207994feefc5d6fcb9d0e60fb1ed5cb59770937f5f6c5d6baffa8973571ba8277c53c34bc8d42f215c08fff0fa5d4e80000000000010040e2b84b196d698b800720c33896aeb7a01003a217732b85cf4c56adf5e87a7f5d575923d64a53200c3c2225a66004a313f78c5cfecf03578f3ab4f31aa1a55805 +00f3a0fd926fcfb4b429acfb7183f3b4d1f39e0b3567ff9da75add6069fefbbe107cb12da46e450c10730bfae9f6f41b4bb1199d71317fbfb72fd25e72aaaf9b1c6976d05e89c15a4ce1ca35cbd6954fc13996914e6cbe2f5ce256e956e46fb90412abc90c1452280e6e685ea5a9284dce22c215cad4661e08f48c19f48ccd7223ff0fa5d4e80000000000010040a2428016b5b2a68bb9e7b513fea2e1831e7df9fb1a89207a23dd040ca9acd348d5b0af08aee88f50c2db6d0899cbf137e6f54e7c93328278e0152ca9740b0904 +0043238b7eed2aef735c16e5f3902891f01654d8119db91eeed26dbc4c7bb88b97b2fcc400700c788f517238cefdc01c8302ada2869d6785cc7093f7f9ddf02924e2af1ab23db699f551953e7b1ce23651e69f142f0f7fd736919db21a8240ea12f456cc57fd8615a25aa60601d519bb4c71b2605d1da5aaed9ddefeb8085650a3ff0fa5d4e800000000000100408e976a2d239bb2f560c6a00e8f18d0203af602ffa4958cefe96d1281303f020f17a16072c4b3055b55d1c29dbf601b3765f27223983ef16982249a184f7c5609 +0061fd3d783f0be52cd4bf49018732481f4f7eb4fb8e639c6e1ee700008f6bdf270bf278a12094dd9999c84b24864767e4148575ecd55ae1d6e828ef09036d870958176e9e0f8694d34c5680a12a09fb9f20820f1d9fd1e204184202aa8f832e86ab59b36ae95b0afcfec59207f800f151c03113b9969aaed64b7d2b9b457321a5ff0fa5d4e8000000000001004017dc7b545178bf2d9b4ec09ef65888597c713afd8a997ab7ba1b48274e87c66b32d725e5d52be047827fd9736788e2dec899f051b85d48910055801057a2370a +009011531d3e2b3712a9f500672d49ac7ff43f167c9623d6412d5425f099f6f518167ee6a81f67e4364a522d22b3a0cfeaf5bb83421345bba98fbe29b176cd3b288c293fa2075bde80b2467f4389dc8ac645739aa553791e7311bcac1d2c7501129ebc630fa64c3602bde32b24b40f1ca9b062a20fca748bbd4995e6c7254aa50aff0fa5d4e800000000000100403751d61a96c76cc3d6e5df8610e21af20f173fdeb8971bf9fc886034c308b2f01fc071e8458cdcdd315afadefc44c597a80b5e11cb0197d32b0dc59b3a360d03 +00c854588bd406c57bd95566e4e8e5047545ff49793f8c2b470554dde8e30c9901d5b22f4b713e81cb1024535964aeb152657acf44db4fbc1baa7a6e718a6d061eb89a3cb4d7ecd5cf2d635156174be354c5d8cf2607657a25abb267c9598211a78f794701b3058b8795987d85412c23cec794cb9dc7cd44ca88e1a149e6fe300cff0fa5d4e8000000000001004002275a17eff5f3b2efbb246bf8890008efe8fe64af432f8cadd6b432898cad5a1385df80b8cfa3601f1bcca0f769a945396990583514d66dc3e3216e4922aa0f +00b878b3c08064b4a356ab8122d4af3c35e098798476865c4df234d5249a7e411064f4b6d8fc1a644c88dcee4a30da4fa70f602dfa2be16328f15b886e9041111f3df02dbedfdf3034394972c4b8c6f681f6e856fc724f19c64d033f10fce66f085d81c694c035689a7af7481bab951e1c3b7963678c3cb67bc1a79927bd1745a8ff0fa5d4e80000000000010040a238ceee1d261ea2874587b7caf33b4a22f7609992d14e64c5d02093a55a1d59989f84b37f1107ac16cafa13e999ea194ee5e51a38460df91e39cf59a5bf1703 +001c3459633a4f63e1d0e2d76304b436b0e089af2ef314436a4e5c22e8b86c761347042f0a19ad47134b18ef08f62c2ce4501edea1e4dec5ac0c87df9097c8871fdc4e27772101be6ffd154e0801cb9b105256e036af37d9a11616440c623d731577fc562ed2bc40b202b6a1c28fa1f5ed71a5cade01a8e46c99bd892a860099a8ff0fa5d4e8000000000001004027590cc2f70a2e8ff958a55a0f618ec93438a215d5d2af22667fe6be9511c9e940f7c9c820bcaf21821b5cab3c323d102011542c8e937e8b53ee057873052f0f +00afb08362f4579554b6bbd6769fe1ff9d34f9c30de763bb898508845cb5dc1420083da7f43ed2ecfeae49c36f7da598241c553fe129b94fd829680123040d68051297135e8eb3c50b6e5caf71b4e28096bde1f81c0415449b19d4bc972c41430a9b56c17181ba9962fabf17fb7b690f9d837ef79b3d5629319162f81d1d15fa29ff0fa5d4e8000000000001004037e7c37a8d289078c0c79e51525ba33270c00e03621dc85d174484f706b7b83d04dad502095dad8677175f5baa81cc1238c3d7a290c95267545fe1a7cd963a02 +004abe9ae6e08cacc7f10554ec1e11b7524a09c4776036029d87dcb963a8f73e093f19b5d28cdcecd9e1b32922581e40b3f3d3d68eb8a367b0f69473ccc349d61c9ef7a3f3dd31396af8256ab421f83d55a9ea9ba48c7125392bb668060b9cd42157e741e680987206b6f7ad894a5e828a1de80e3cf63a2852d4630ca8a17a470fff0fa5d4e80000000000010040ce29d7923e6f2bb866ac14bb0fd50091d2af48c974bb8bc837877c5aeec6e0adf5cea1557c3fdf51b3bcda91be313b0810c54c90091ac2205d25778a9e121600 +004e2127dd580cf40034656e79c3f2d41403d3bf41ccdf7b88e8b10ce2de684014f6cb8a6c7ff42f48e257e84f9c3158a115896e304ae1605bb088c6da94a86c1ba75a0a9d113f75fa26c9cf6ac848ba818ca97d9ae00daa4aaaa627b39dcb3a97754a3cc5368bab5631da94d043cf50ec9e89808a7b9eab48d16b989e0f350aa1ff0fa5d4e800000000000100406d4d6ffb05f5d26e9b9030e3473c3b8e01d9e46949a0e98c28173bad9e95b279d3de3fdb3c9ec4c81c15cc69d51363baae019eff36aa1c9429d3712dc639cb02 +00fde59a42486905f346d96d4e9f15e58ed0dd5392f38a949b4962db121ab7a711bc7607f8caa8b6f77e2a233e9a2e6359bd7512014382586a1b3c7e86b8d99d26adc562c131882f655a7aad811a98333b0bfc613d72579d9117bf52d8d3fe270b83a257968c736351a147bdbddef9854daf097a8f657f94268e68fa97e8ea5781ff0fa5d4e800000000000100401c238cb967eda0a928ee9731b4cf9b34c336a1b328bbfd880a1d186e7f201eb855634d6261646bf1aae97b98b69107dd4ed4633611a2afa371e77c1912d6bb0a +00b39cccdf1a96304d6772e50300def4c6d6917a0144026c383e219ca8825d0f00e6fb978dd9785f7cff1af0dc74a5ac828a0bbd0157a4a2d2b7cf9f5e8a90650e05cc79e3a3ef5b88705fbbcba881d9d4f83246d7a12394d6eaa82650c39ad6ac38c6afb9bfd2dfd5a0d40ad0aaff42c562740305541381b1425c0e4ffde0d113ff0fa5d4e80000000000010040eaa0dcebf3eaefcae9ee55b1bd61ff6690e753722f85802b60b70fb05dd2b45c739b7261f02966b56032943f2fad4487b57ec025bf6cbb0fbe55e8355a161705 +00abb7e4b906ea19e585eb4c045662a23d25d99111a5f22a1471355915ca373712b2d933c41185063b09f07e77ce1d3fd6dad4ebc2a932424c6a37734b6584621abc365c6ee62e6a7502ffd22670ed3adf25d4abce62c3cd54b38e1398a70692841d367a6849da037c477cc3957dc291153f146451f97ba0dccaee416a9c53f1a3ff0fa5d4e8000000000001004071513a406997164f55722d0bbde56f47f3b343b96e1de9fbadbb9f8624eb67a8345cc0c8c734bf2ade62aa0738d017a18ee2b2ebd61c6c8795e0ab8dc5445302 +0054a4b73c1be29056327009546b39122982ec3285372da7cc072ca166a96f2e04ca3558a562840555bbbd8fc004cfc5ed472c776c443c51fb71d30d5a6f194303c0fe547d8f2b68b3b8e6f750893dd1cccfb7d78d147bd25eb2bc72380f88ab11979a79a3ade75561b0fcc325ef651c645b617221387024b40003f76a3edac6afff0fa5d4e800000000000100405707050554f1c4f4938e459268a4e3e56f28d0804277b53c7687b5206647cd22d70ed699321b572e9d2ed526769ddf4a3a8212a591431820dd0649554bfbfc01 +003e90847d3119b7b90e56dbd81ffbdecce70d9b8c04249d62f32d21edaa476a0d551ee9a32dd0e55925ebfffe1f0fcbdab86f67da6ab51ac8a4d1ef5cd0eff42182eb83e3c499d2f3920430a432f74834667d5df8a478c1979f3971ea2fda1614b9ff79a7f385f1e241cea3eb99f76d9d3eaa7034b94afd29282af6dafeda9a10ff0fa5d4e800000000000100406cdf5b06506b472cd767f5a6db776c372b8cd09928c1ff43c5af84b1906d7ab453522eeb807cc18e57cf66a8378accb3392db489dc8cf9bed003dfb329c09408 +008dc58e1d660caf5f15f2d035b9f5f37ae74885ac332146e01d2ad2397112d002879728cc8c31fbe1c329084d1ea431c84fd19104ff08cc6e635bfe6ec7ae9e2e9e99a9a0c334281de843a3aa641706f5cac88244ebfedb58d65730c410cc0a28ba3d8d9b8128aab2a7b0b3d14b42ccbc4e71122844270a89ee9db541388fa99bff0fa5d4e800000000000100403d05e7e9a8ac5fdda48d5b1efcb4ea633ce60ad7b68e0fbd5e1e5aee030842e00552512fe445805157ead0a173ada508bd6ffa61320caf13751c8d25f4b24208 +001cd9a8a2e8a962a6218787431be1d64ea623ccb0c75ecf1fedb7ea920c07518656534a8a4d6ee0dbdb61d2f6c2d63811b05265b1aedaa04b66aa775806bd972f44d5dd4c096e1dc912d4e2d2d42962b433f78e71006d7f4ca794be504e79eb03b6e32c76b9642ff920fce492cd7f35adfbd99578f5b1356bc22e1abf7e5c4813ff0fa5d4e800000000000100404f281a9927e0bb6dcdfed9c8c74774998168f08c43d82653c8a163dc9a4ca2923484aced32bbe94faaec6d24d973b73325b1cf36d9416f768b9791db37726c04 +003ead94baa9cc00ffa6c8877f418423caba29caf3b6c0f9030e7419be04566224696f8e70fea9455828ff210efc862510cd538fbd0fa327cb9b0c90c1aad05b0566fe4e8716a2bde380cfabddf843187cf8815fb7650bb1520afc08021b0be88d1969a74e94366b0a4eda36afa1701185cbbf520dc228f32201d7bf031f88ccabff0fa5d4e80000000000010040fc31b4401568a3f24c2559f053d069aeeb54e90ac0a281941613446a3c7dcfb40001220a48c2a3d4189af4240d57df0059775584feed2964db9fef2093dd8a0a +008ad258fff2998ab126c79ca71de3fb98031919d21ad6ee7691852169e23685805e5d90eee7518f35b09fe43ea156bb6d36038cfbf7ef573b342f2cea099e1f261bd8562465623b31dc13241b7bbecb0e00816e0e38913a9bb331fff44b774286bdf39d95484193bf738a6ae992620de2aacb077c56bc379d2c1030e7eb4a9193ff0fa5d4e80000000000010040a638407d7bb4257241a790de7cb8f94bf1f41f37994c767010c6cd1e340e400f2aadf8363a5c0bd095024ad33fbc30243510492b436f30196e70a7d0be5b3e03 +00175ad1e005462bf0dad6f38254d165009f07c3d0d14ddd44d0bd18e2dda2eca3c6433e0782155cf29a95b82db2ea4bf1a3606d2dc5be4fc329c3a4d4a331ae2bfcb4a691d60d18c988caa339268701a99aa85e22f3a29775e356fbc87aef282fbd660a91634ec84fbd82afe0e872ab695777b0d1e8f289369afc95951c28e085ff0fa5d4e800000000000100402630a8b8bd2bb31c01d8fa70db963c286b3b9649c750d8a6d80c28c95bbf85f3a9c6da86de8c60fa56205cb01b7aed8f4e11954eeca5eb1edae3ce71118ded0e +005f4d131d5ff14bb0b25366c97e82fa27ef953bed49043607864b996fc18da208fd61a871944a97822fd33353d8a5f6c741829635d05963a1960ee6bedb6fdb113d635b69da4464b477db07d717f711f2580e567424742c66da49c1656048aa1aba7677625cf6df27ce09976f86901dd5a4067697d340f89dfce20abb3136280bff0fa5d4e8000000000001004057dc653e96b189617bafb672f85ce35ea2c2008892a844b5f7993d73631f7db6ffd5c300f2cf78ed1da786f183f5d41d4388fb89846660d0dd856f4529811a02 +0031dfef44cdff1f5a543e3c98078d65c073fa0811f05634d764c848d8e585d0ae472d1839a85d65a27e2c5ddffd0946f344d3d2304f0a35df35134e046e3e8409e5dd25bdcda61be3b34edd41de28e6ef944001c7ee2a6ead717fe0dbdcff7daced4c14697b8c6d1955e3c0adb4d23c7bf78a7be1dc4bd2608a1596e3408f2d23ff0fa5d4e800000000000100409d37b11eae29e8718a8379ad9f25904726f130e21edfa67a9eed27c71415a851df034cb99b8f5fff644bc38253a0e3d13b9549b04948105db2418e8b354d4e0d +00ba3d3c4cad784f464a8518e466a6bc1f664345d203bef8382e56a85e7ebbfe922bec03bfd546e83f5282c2e0da2d1e98f15de47eed34934d6024aeebf7756411ec984a6754fcb59e3e96cb0cbd4975c2320e4de36d1c5ec2cfc4142183bd6513f54a2773c48e7d722d95329060509571101bef1110c8c21501db9f5c906d6093ff0fa5d4e8000000000001004023c9682f29139090cf915c54449076cfe281d52a1db60b5f32fbce6c35badc463325191618c226a2eb945840e07fc136237039252c9592d623b34cf456580100 +00a5f3ee9cf283c44e526df1886f26a4f7866ee1819952d735d4343e03e06d0023dbb5e7262e4216d5c0ed92c4eb57f68c3b839e8167e7093cd65ca96fd000e117aae9252fa1fc83caf3e6444fa581f826d9e084438f5a067e4e35fe0515b93f117d18566612eec13720a9500dc1d79a61d6b7d1066cb6d64eedecd455bd37b0aaff0fa5d4e80000000000010040183539f633dc293d3aa67a823941f34d6120c623866ef4f9543eaaa1516a34b61372d7c8a73b5bb5edade2c1b7104678f526cb243f8193e4826fcd41b417ea0a +00531be438545067ade2ab560563420bdcbf7087f652f2e4643f16916f147b67a47135081d44584047c5a9522807f4c01cdeb2c4587bd89a4e60d4fba983929207755a673c86f8e8cc87ea6fa6c9e2999fc78e8c0f6265d36fb9708ee384d0df05bcf8e9ad3d43eab332b7d8a0f61fa5c9defa73bb7bef1aa6d85cd7a3d4e78623ff0fa5d4e800000000000100409f808a2379cd452524bc42675a703c28aa10d5898d11d0a388ea2772a558addcfa79b1862d520de793867abf6cdbb6799a24480cbb9b07a4dde82664b7be5203 +0017d738eadd75b490ab029285bf3ec1bfac9ec62c6d3b68f540f386830daae7819f0cbac2d1184ddd4734f3cbfae4157ebe3f8710762127abe949f96d2ed6c51788f7196e161d258dd3e0e7c3c19d9fc07c3bfe4b61cb470c046b392fa2697ea3df4728bce4d7b8763be86a1cf3e6f1c26e905711c729e278342a0a4edc1985a7ff0fa5d4e8000000000001004060932a68d1ee2043e06ea949562a014fd6be2c05aa661279af8a7630de93f680dea0997a8b73c93adc5a7a153f3706a95ec2b49092243ad324707912790d9a09 +0022682e449dcf29255c6486b076cc0477bcc92401964fe8c655fe2420176e9681eee4228d36097a92b0c3e8daea4110fb0d5bfba52a96aaaad6c3e879dd66dc24f4264a36da1b2e0dccf1a64f3dac569254a02a3036a072705e2ff9e022c4a189d6b506c4022da8bb459b0afcca5cf439689244f00c64aabd88efe64e6015079dff0fa5d4e8000000000001004095df8840d6959a965fa4aca2cb4370076322f1acacaf51394cc444ce2ec5917f78c4a31797aee769047c3e9009410b6093cf5fc0c21e3a8080d7af3299d87408 +00e2f923c44a59837b8fd39c8ab294996ed6345975f8111879e52443de5c93e51ea477dc81614b06398d18179cba5a5f5953781700486ee3a85d6f634583e4041658a61ef2e3b4b718b8588668f5e5b361f177a9ec401d4ab8b7ae25ef1f1df59a31ac19f81b9e3ed3a3d94814a029f21307c6cff24fe5361710694c5b778bc696ff0fa5d4e800000000000100401660b3c7732ba2fa4f57ea737c3595f959740fdc0db6e404a7dd4e97feb18c5de85211e0084461e5b9ef312caeedb15b70ae04e4dd86b0e051f51dad8fd99a00 +00407f98c8dfcb528561742ae75147a97cc4499e03fa65452ff0459017dc6924a19004add809d9090e284f420851b37f9044757862f9da9df603865f5e07fddd039f3e775166f0a17400784f3f2c1e5522712905d6e5c3c1af405aed6602dcd127fd01720e9e4c3938acace6978322dcb10a0ad33e1dc58498a95c5a07f8ca5d9bff0fa5d4e80000000000010040a7a8e85cfe97e8c70e8cbf27f1bdcce9879c847ba0121e1cb7c4d454c9a12f475c4c95374a87c1263af3753ec12fd3f0abbc45b6fcd6f144e9f8943b4b2c2a02 +0028a1f49ff06d8c970894eb301d3b7c7172e006f28fbbbad7e00b78c4a664360867d8e51dd78c93a3363b0db18355584f8e13ff7d0e4364c20eb80a1383d18e1b877004b942e53d99946864f3e3fe3c3f940a0256d46fc6f229f30f3e2f720191591b83be0fd00b61b0fb05766c712028fac6c3371429b8a674226ac6e7325193ff0fa5d4e80000000000010040af00c5356518394f3bff4006d512d65600166ce83931a0aeaea2e43e58e1062506e8b38f4c9523b4707e65be111b65eb99ca776898ff7e422fcbd5edb76c2f0a +00e5318d3a6e090a37be3e0932060309c58f314cb3757ed6f4aaf97a61bb1de02778988e3851ffcf3fe48ac7d13500e99ba95fe18071eec4985096bdfa4987920826b4325789a9d16117cf3381dafa7504c63cdf86235ea8e0836ae8621f925a0306bf84fb853868a9f9bb6d2cd34e2136972e608f8eaae3efe6409cc2dd783e95ff0fa5d4e80000000000010040e7c8051c89f0090a193dc50df73c33034b5933793eebd746d1057ab8102c838e46c5e26f9b3a00433617f9cbc59032570c0dd2f37ea399107e59159150c65408 +00ac03541632b349869056b5b4c4f587c96432bdb89357f2facc3f93df344a8a1bd1354f7e20b80655b8f12fc2366e9ec63b232ab78b784695e5b5ed11ed749a264d8fedfece2172492860d9bada6a53263f4224923020cb4914a26f6799fa49849237be9a9b6af35718d2c9591909c17853200a9e5647956c0c0a46dcd430ee89ff0fa5d4e80000000000010040d3796c05d2da716084f6ad899e2c6d336382e1252eb6027f721bd8e3b6df52d51abcf688c70fd94f6abd8a14e62b85d538497b83ffd795f4bd39cfad72a35f0f +00342a24c7673920ab38b512ca600b9c94f0ab88f43e7fa73ca79af490f667029b72835c4e3ebc30ea60070f141058479cf01db90f675846baf815dfec3ba3f115ee829f292bfc5b9eeed4f63a1179fc127d27cb379099030cb08a5dda63874225131560f0de7572fef796df4179f8696037e1142cc855f08362758c942eae648bff0fa5d4e80000000000010040302b3bed3b696f145b3c4d81a3467d37bef8c34df09e46057a5fc19540758d9afe9843c718bb113bb066f50d8b42d16c104ed2a7e281a1d1fcf84db754ff9005 +0039c4b558ce73a4eb2e428ac2a6ea108e8652e8714bbd61a7d8bfc99b2055cc1207efaeb2bf369a2ccf597953ee54351cccabd80c8c8cf839c689260731287214813f12839da81ebe6557b523478a2daca1705b366e394ddc26b503a7328eb0ab226c86b24d998581ded12b2a64dbc27a263183ab62cbf48219f62f472cf1f698ff0fa5d4e800000000000100400e2debd474bad89ee9189c713980d0d0ebf7237a7f0ed14dd2a906db238ff2b5de437d02cb5e587855f15ab1dfb9d766887229830ff3ba775cbb219d0443850a +00e42265503870171003d4a01b27996acd39bb3ddb4ec35ee033a6ee0d4ed4f4172aa73a8938149148934f950c15017ba959eddd3f9eea2fd2ab98b74c799ff21f1a198cf07a9ed669d694f2b30584226f54d19b53e3d986e5984cff49a2426902a33c6dbdf81fc71f7bfdb82dbd154a79f3759920dec5ab5ff396ab9943d3d188ff0fa5d4e80000000000010040ba1e4d5578a96057c7f69b0f4b4445107bbb0daf1bf5c254e7ab939b34f0d2262dd6b1187183ae6fc1778556e3733b3c9afd25b105672b7476d585941a344706 +00bf41a7765518636b1078b917222b941820b0b5b1e4359f5a7d908e76a45c11850c5f930b8e7456aaabc035b48b93b0dce0d0cb357ccbd543e5faf1726034330f6b7833db78e3cff3202d16e93af2f4e6f5775c0ae4f9dbbe3b2fb1112a6b2608e151c70e539734f197a76d6e82867e612691eea5852c22af05f9086007fa2ca4ff0fa5d4e8000000000001004000d4f629780b9d46530c868bd7a0ae9ddf8e29b152c5c665b2a9bb9d9aac8f3df9e5adc537773d61d7f4d085da3037cf3b2b6ad58518e2ec9e25130388628d04 +0034c854feeb6853163bf7346f3673d058198b3446790aee6f349cb56d05aa8f02b1c3c416f4f0225e805c34eb7de396dec7ba330995c0f487eb8f5144de9c7e198dc59eaa59fea4ba2c89d2fad3afb60273e89cede45a89e4dfd1fc8af82c040145db89fe68e8156914e6c062a9b2886b674e26e648c74959512a41f2fcc1368dff0fa5d4e8000000000001004094b94f779ea1134b22700c29e3648b721ec84f99fb257fa34773e018313e21f7b061b84acad214cc8e75212a061edd097526d9cb677ba8be82dcea8fa9803609 +00d8356667f5ac8bcc3fb8270360cc3ceab850a8a0ed7dbe2d7bc2dc927898689555c9d7188e0452264c60a89d9749b4a6b9e6ce622a938cbfff7d0201a331c810ccf7bdbc797de875b71daf485413fbcceaf657d49397d2cc07d1d977ceceb1953401fa13b716119c7002d4140c9687c2b6130f27ce85a1003a92562365ab3e25ff0fa5d4e80000000000010040d52888a7768d501a98884fdaa931077520570a729c5fe830851138945bbb2acde0168b33cbf9ccd9820cdd9a351b42814f86f07c26698d9c86b6de6923388b0c +005ea1b5649ad0f80673324cce4fa96242a52f71858a4b409d9c2bda485f1abb9cd201fac3eded43d757a11ed69acc9ac13279072044896f378c1d167691293a290bd2ab28a832a40ad9e2a2bfc392bd40e32a15bd3ec80f474385aa9628ecc60fdf880bb76fda1f8eb4f45d846a01c63aad486041039c00e74f18d4196e2cf10dff0fa5d4e8000000000001004091d4cbe430fe4a43ecc5532a33462ab1971563f3427ea833081c82fcc3098b6c944bbcd170c509f4336ec2713031b2f54c1edd9d088387959c8d8a0362740c0a +00dd55b99a0127b88a2b73647deccd525c863b544e308ef51172baffa622aae69adaa6759ad997e4f9620eecb63e25752e23a5e13563aac87e6a0b4a4a9309bb0bc10f60dac8551359a6518b0219cda7d48bcb2080cb55602e764c77e41c11c22e3586521996b6d86264e9c80c7fc504546973cc4661dcd8264564628af4194211ff0fa5d4e8000000000001004060648108c26de7a9d71cadeabea49e414cd02c46bc1f83f68dd98fc81a1ffbbf5921ea9462b83e8213ccf467d5f78cc2179bcc0d794e41b5180e7415de77b60f +00b0a84083c0fb28ca955693fdb39d001c90ddd96c85419f4aace0a1bee843be8708c2c888c61ed6a9fff9cde4f36d1b12c09da52e847f4763e54a224767df2813b86e8aa3f0281fed6f3d43339919ab78d82ccdb25c168987f86ddfb9b2789b858adaa9f160a82f52dca0587a1238d0c1c84453bc023aca756167f8c16ab1c327ff0fa5d4e80000000000010040efed78f74f186a9b329f4f8c08d660593daec1fd97982364053000f6cfa42c28dd1fbf8f3f9b7734c78247009567d462c0a189d300b75dcf17d5482c1f617a06 +0038dadab9349a49169ec5bfd6d44d4509748bafb6dce248006fb39260effdcd13b2f7696c43fc9fb00458c8548ef0e5889c34bd116efd7a56a30de32edcc1a811db215c54f93755ab37028e2b272feea81cd221fd2091e28eba8cbc313173bfa6cc73291d92a1aea97a74725412cce160dedc6ebcaf3f49257a317554a96164acff0fa5d4e80000000000010040135dba5b08c36261f58e143eaefde9fe2d4266735597a2d6cb105759acedc9b39e0ab1d8af9eb94ebde93314376a7e1c71dc5fe822612c99a654c6abd144e408 +003ad0c415cdcc4a0105e48a9025c443f310cf04f85b8be1cc9c401a5f92bc9217d9b0b9b8adf68234e440a45ce121f1e678a45f3db25ae745a0658f1887027a13ca9048cd77c309cdc082e1e1414ed99ca5ed6b8cc2ecd0d2353e91c1b121c2954b9a72757ab3c0f0c2c25f8e95c2a44199f14419b88573e3e76b6ae68d2e7eabff0fa5d4e80000000000010040ca1b82ef9d1a25f498b6ec1e4795a3a98bfa41f7a3dc514009f07d3646ecad8753cd4c344d34bc3544b1bf3bb1909c6174ae10311dd53db16be545b46246890e +00ad26f65038ff9a4cc15ccff48d18c108f55fc022f649254f7132824f25c5748713d507796ff8ddb714204f67c9523d47e28b3ffdeedbca496bec574c6f95a11b45f03307c6f201dc70dfedd8ebfd9ca8c59b9458c12ee476cc00ab752eff4a2e351e77e20d9097920c5093bb5969414890f465a523db3e51b84c93d94561ec28ff0fa5d4e800000000000100405d81680102c604041984a265ae8fcf7244678573aeab190b04331c7eda02ce6498d98f8d49960af192b87a9672809739e52242ffe25c90fafe0cbb200f3e6e0b +000d272b92c7eaec53a8d5e505f7be821483c4b062038a1d300b451309bcbf5524789bfc081ae8bcd9353f452c71dc9ac01f5ee90a152d655900ba145cb55f4b12aaf2abd6aa9c6e65b1261e34bbd3db11462ab54980a300e8cf31ae1676dab42d54ca850daf829c36f45fcd60f5bb8d416fe2243cb45d049e6cb752b9d10de127ff0fa5d4e80000000000010040013f52f50403351749222ee6197cdfdfb486a80ed7a489c4978b250a83016dc01cec9ee4e51ca4b5f1bddfa40017b451401a0b28c92bdca150c0bb7447d7f900 +008c79445e6b0aa9ec0eeb16fbce1a27cd94834220166f5a6994759acc0625f68c0d40e48dad0e12c87025cf9e72d7e2f058ee2d0b4088057d038568868d249812f05769d335d8e7ce18e5cc4369723a95d1c4560108d7e3693c306b80fdceff968ae4dd9dde4ae9ff1e6c6d3103e7377847c0c2399fa98a538faa998cf8207ea2ff0fa5d4e80000000000010040d3311e74c649f5dbdae2605f88bcf8fb3317fac34b3e568e74ac752fee776390ecb529663d4b5823b63aa6846b37f9533f8ed431ee878a0b391f88ca2b597b09 +00e828c116f788971bd1d686113c5bf8b440cb591677f35de6f01bd4d1ebf44d92ba631816925a41beb2fa5018bc60cc8cecbd66cbbff08284f247dbbf14c43a01f8008c70b8e2f1ba26b17f0b4d7d1f9196f367c38ac073f2885b2be7fd5d8f85a47ddb0bac1bddac2cb70561ace744c7a1602c87f2abd1231576d71aac0c4e8dff0fa5d4e80000000000010040bca0e549467a62de01c8dea2e2d0d48e2aff12188cb17763c9ebe298f2be73fe160d65e9da59149da7ca548029bdc67661501323e6c16e7b990baef8b4301d05 +000b4c2b86b84bcb36ea5a2b65b969235a2979a51fe015ccf2cffef9b7e5c2481573b47a3a9ddef7dfc1a528ef3d9fb851937397c3bdaea631973fe58dc5fd9421ed015c8582b03ab1483a5eabe01f9350a1b80ca675f68787c33d84217fa7bf9426909a166d2e9d20a461116fcbd130783d94d5bfd317a2b52164ad4332d4320dff0fa5d4e80000000000010040817adad2de504799a3090aa2e7f953428046ad52c7f2d6794367092725a321a1367eb849a3d1be5a4fe6df972792d47f12a77c6b28bb375b1b2c642929a70c04 +002e8dc2dd6415432b2ba041d61cba5eeaa7658a69a4c48b36e687c702413cf7a5ebb921356f5c424bbce5ea64d552b355a72b9bffbbcc92eba94f35c34fb21a1f4b78daae60db1b139aca0d10c958b231cfb6751f933bb3c1da348efa4d3eca2aabfcc985b13b910d86f2556686b52453b842f4aed4e9cc75f001ee987e9aa4a0ff0fa5d4e800000000000100405e9553e28651ef173a19508bda1e1c14771e06ee7e4f76a8636ed0fe44b5668ba71cd5d7f247abdc55c72bd55011788808d65d01627d255266b7b4c0f9434d0d +00cfa9b208efe4509dfbab93270db5f17fab0c00135cba1544dfe317475075dd25f1b571dbb3ccfd63e99697bc3c4bee9aeaa2ee4b7987da9deb83d8f207b18c14a58565c92c5fb6a4557076dde343eaaf2ff7d6d97f86aba65688450e1aa59d0a7a6ebb534551618c0d393f1c663704692537579b12c4d875f6aa9a47c529d41aff0fa5d4e80000000000010040c096b14678ff625038aeff60f6bb2ba29e2b862e7f1bb138ca3ac15b43015ad104c6c1b7aea6480fb0a3f6e227be786967dc9505cf5b59494bf8adb76fa4300b +008cfaf0d2cfca32d71ce9ac0ad16c5e068e345502164bc554eab77bbcad640726c2b47c3da2e051ff4cfd0f1da55e7cbecf003e9f829e0cea1fa9ba276b00b511d7ffb960a260e1767adfcd723df308a385331a559a69288c86ee131241c97796c3ba38cfe1479a55a678dc7dbc7341fb7cb0e7127a4959fd5e2068a915533ba0ff0fa5d4e800000000000100404aec68657fe601a0958a34c49106483a3a26276151dc1e51a986e6f2fd729caa6989ba937f044815a4583ed09fb5c107408b7196fb4b34e0bd7b0a3fbed0ab0e +00bcb37ae054d2852096500dfeb449c3c8b7902c2cd63059559f8d0101ea86758afe06ecb1126e0b92019b07feb42d0fdcaa7ef7c28483f34f5e6aaf580dd15114578e8cab068c3d2cbf98bfc1a7284a413ef30b235508938424d54e2e549f980e8d8b30aa9066ea7605f0a02c96dc119a06c9a77698662a6bb2e891549547fc8dff0fa5d4e80000000000010040a25c76d5c2a741cf91c079fc479cda13124627edfcf99711c16df898cb36a5e544915c4077123eab725f4ee6c92c5fc7a840f1443cb24004ce11dae8f7c7be0a +00c1b27f595ad9e140ac822435e524a8ebf92fddeb71ea31296333b95a32b17c23e0d0e811d45c012c6d8f58eba358f5e9caeaa0a2ed66a2a014ccc1c4f1a5a509f16fb84554d79f0de16f80a39b1542a1daa2aff5072f26b6b2848568249fe58bb953fe22afbb1715787ee0f26b064258b1e8b5ce9765784666f040bc78d26b2dff0fa5d4e80000000000010040b1813b86d87aab548193ea1288cb531ad515ac3d0ae895aa246226609a121859829eb3249a276579e697bb5db2c7adda9bd4309484eac9e7e10576f77983ea02 +00e75962400f67310052360794b63db4bd5b936f400fccba57d78929d2a3978906139c9012c2500a47472d1bc0fb076b9ed8648cd38d0457fe78b08849e73bcc0da440dd242d9bbf6e7f13593484d6c7ff7db80195e5906022dd42425569cc578ce7e98adc5906d3aa2934bff953088e4f32a2b2e8dc91cc3f950d9b80e47aeb91ff0fa5d4e8000000000001004094f16c52ad51391d2937dc517499f2c5a83d5a391adac8aa1382fc2ac5b1ee9ee44584f529aa5af5490da4a8d6222bd696afb61f298bf4be7ecf057a98365d00 +00744bfc3e1eb5f8a1ae6a6a8caca2870edda25598b1a4c1e1054d76a72f049d236fc738cc4815588bc8c28674fb4075960fdda20f010b33c0831ccf061f8fa22c1b0f1fa4313eca06791ae8e9f51fbe672f774db4b10393efcc02241da954500e8dc002e1f8e172b41842011f51536190db026d6066ca6856c13a4d6d0a62a992ff0fa5d4e80000000000010040113a0c3c21396c0189455def07538856281450a80ae62937f1ea6c3e5ed7ca1b2f2dcade1a04670440531eebf7aa5d1e6c83b28a4e45da23d687efebc124a802 +00643fd233d7fa2a6fb440154279ff6f723d04a69c9f58eefe94e1d2bd58f2fba33e6449e0edc6150dc2e5add48886234b741e5f00f133a1bc1256d84dc383741085f70b842d8eacfc3ac8eeea735508d56fe00d78f2c5efa5869fac4ba811a12bbc3ed25ffaac8b5cf403e88145443c5b120c8d4bb8fcd9033a79f6122b833cacff0fa5d4e800000000000100408496eac8972645e696fbeabc3701960fcc16468e956f903e950e2909478f0c181e50ab6661ad3cbbbf6113b51715955984a03b9888f32d781fbedd6236300300 +005f03c3bfc7d4b7b0c6f7dc9e5663b6fe93eeae2791cf0bc0b1bc7e504bab678d15e8fcfbe75c7db4daf6794f87b77792926e601f62098d50cb3108875808950e712920418ad0b4c7dd101dc418ccc5f480f4a1f1bf63639805f64e32a9ef8a926a70a10a561c2e88a36dc18563b9477ab97d8f0bf453230e57ef8b9161cbb8a3ff0fa5d4e80000000000010040c5134e3aad621410bb0c8c8b9e4803dd6abd804aa04452051a6716f44d36b908508ad312f4ee94c9267e4b8c2e8252deadcc2eedc5ecee21bde9511989c8e30e +00f7f46032d7fda7f1f23ecf045dc00266367ff767e2d017ee5a7b4b6db2b026167180ed5fd5a350c307890efd29dd40f431588e5d96e1f3e3a7c6d82872a3982c7b95935e79ba45f6c4a99a04e23397f7fff56f99947bb4ef164442f9db1ad0aef62d93700a634a72c32773c763f282810ad15074dedf2cbe4684a0d3cf4b62a9ff0fa5d4e80000000000010040e44d3a3ae22012dbd415d8e3e5aca255895a87f04b9ee46fcef9dd2fde57ffe70db2a1c84efec99dcb379b25aafdc90e7ee6de3e80d77f21ac4e4508d03e6e04 +00fc912b880a41cd7c55bd627b652d28cd934e86e82fa1efcf63f9dcd8b3474cad2752e71bd28d5e19d86be69bae9ba756511ef7e4d64ea102ea2e60e347646014a2fdd30ca3112f97cb71fd40c5ff6433adce1ae78859e6ca845f530c8f08b498209bc5384539b77a8ea094d31270b393e69be28767712be176c96baff9e6be85ff0fa5d4e800000000000100403ab54964c59ee1945dd9cf0aa85257c99f53197db72054ac451a2da47f8d0845a8ec99fd16f60a228afdeddc34774ed6761359759bb63802d171ea957c1d5c06 +0017401983d25283c19e0444823bcef4867859ee61da5b6dccf312500b04f2c9a6200f934e6d0c115a63135fccdad961a93c33bacb4159e41ab4637acbc8799508fcda5b7b896661ee021ec85e1cba75d9b0028cbb20fa187391ad8e2ae9ed6d8bcdf568b43d588aad2aa35d7a479097f1b21cd0c50010c4ae13770d55a30eea8cff0fa5d4e80000000000010040be56d5d7a40d01f636c8271c4fe9a12362165a20320c424f8e20547813f02eaac279ab3bb503282ed82ee8477249471f9002a0518b05192435c653d75dd2e103 +007ffb8ec9ed92f888750838302b9e0fe416c80201d1b30d468e9276f84c06271354822d728538bb5b0a6f6e9c2de578c8d5f8a9d49ccb0fdbcc92fac40e5dff23861ad9b0b6a03bc67ac1428550588715811da8071ca1e94c382c41f2f7005327dada3258d53ca6378e05e990b6979ade36e331c805e510d3a016e52c488b461fff0fa5d4e80000000000010040e3d65b5bce1e7976b549857be9242d1f023b48b71fb9d5fad9e04159f7339ddfd5891f439da4690ab338a6805862d1ec8671b2ae7ce7014194c665a7159ad90b +0057429bd525331d44afde3ff7cf667b968351814a41f0f3b285f2daa01aebe705df6db882320a1b27c7807e286d85bfcdde55564951cd80b27298efe10c68d01829d0e50a49888b6848eb17203e5649489902fca675a8df3755dd03674cb93e9cdd76dd456028cf521ba4fd9036439fc0ed2be8639877e65a243e0df2da6e4c05ff0fa5d4e80000000000010040d4620ee69159c0da0b8c081e6c679b207362034185f1a27f5ed940c06993cf88455caf3311cf6f2d401be7f80a4d6682b85f07bb03271467a46470f9e1576304 +008a5fb6cfda7bdf6e8dfd940cb614fafb85b0b3b1ce57cde101d9e098ffbec489144c34e790d6a8e754d0f62bcc02722a116c48e94bb784948e9def17caa8d20383637515b794154d67ff7b7edc7907b0780f1aa4c5eb09219d8d821e9e5ae112efe8b78c20f773cd4bd3a22c83d7c17f415e46428e6deca1ab22fee151f5d229ff0fa5d4e80000000000010040e656c6be3aed1d7ee1e7fc09ef14ed2cd72aa7845a325f1ba375c7fd3b1163bcdba510e96fa72a4e70d60f4cf5b8b7aa2392b92142371f2ab1190ab1ce0d8808 +000b024c402e5a3cb95761f946f3c082d49210b61039609a17680ca84e245777af1cc39d0561426ff55deee69f0fc1b7f619a5fb4387bba028816a7f9c19729715bc4910ab6311bcf9e81e11818c6dd240e463c8faaa7c78b2c86625d5453f150a732b9cb20b4bb9744a9de412ccd90eacc0917b146b164763ceb11d57b0339b87ff0fa5d4e80000000000010040f1dbbe9b1f4c6fef8ef656629a1ee9311e353cbbd1ac6a0439c0edf3499d2883c142ecbf3b861d26f29090412262edc07f00373980cab7f9e816c19c957e370f +00fb756ca4ebd293c7ef6b1cf2ccd3e360b73021212bdcf4aced1b5d964a1e212e85865cafe226fc24ad60c5245085af0c197434dfb6d7d65a4de887f16d7bc523fa1369b61c0629faac208a62a2307da3d3d27873fd5fd81deb730f0c9196ce9be006e2258e31d6f7981c8fa3e3ad3ff32d16d3ccbab78c1363c10564450af89fff0fa5d4e800000000000100401b5d7b6780c86020a6083abcf662c1ed9e2f4dd9ccb75f8a80365e3c75c4a19b7569dc618d5fc3ec36a26e1585cd0624aad01aee4b883a263b8c80d9897ff70a +004f8aa7a2bf186aea9f67a7f8900df16d9866fafeb4b3182a2a95aec20ebc1fae3fbe6f0a03d18387512d631f2872004befe2caa6543af45ab64a159416925c0dd2a385b017eedcf4332d50290cc867aed9d91a817292766a1dd2616ac21788291d3d2e61d6d5553e6685340f7e958fe075356a864c708f3d46ef33964ca7f9a1ff0fa5d4e800000000000100400f48b7a3cd4ae895e98c11d416ee20a493b910a9fd5471d71b79cb586d10500ab266fbc64dfcb8069afb545717fab864a31fb98ecfa7d0a67ef6ef887ef17d09 +00fc9743e08e1f91cf4a14233a712b03d4890e49699ad9e4ab0ba073e87812a49a533e9e20e77f75c290183ff65b0126509eee7fe7d1188119690c0d8730939a24769588fea9623ad10ce1f117d032ce08d4ed38356c25a595be9a4dc565f46127120ec4ce71334cbc14f6333875de1e3174cdb4eb871d5ee6ddd43c1bff7a9e00ff0fa5d4e8000000000001004097b8edf31109c222132b6448610a81bdab0681925f8a4cc3d071a8e1db1b589aa799673ae80778d85cb5a8ae504c1c35e806f2ae365b41ccae57a1c8a114500c +00353645eee261e339750806514a7fb6460699442228d69697980186036f1e639188b7b36f983e21463669b32a9beb656812ce9ee20c1d6d4da28262d70b3cda2f90ce431545af6411ab5839041df4c2173e6065da4f9253d713c5ef9158cd978fc2aff41df410ccdf28b2dd3e202b4a3ed20fb22395aa1bed051fe96ded572b25ff0fa5d4e80000000000010040d0a7cd390ccd8a30edc40b40d42367d3caeaa993bc21ef7d59574adf8b1ce860b179426c664655318f0fc5867adbc02bbd22afdd63e9244c489ee67ae312720a +0078afb99f5e36f937b6122fadd840123b443cf7ed44beb6d433b36c97b63c1f28245e911f53cffccdcb71cb765e112749016822037400b2ab7354ea64a34adf0e56f1bb93caebdf010b7adff6f547f52c6231f67160932702e4f9b82ccd2f1e2a28187d25c23ffbf72af740139be675b1c55fc4c15dcde236e3dd5e5dd41e8c81ff0fa5d4e8000000000001004042d01a9f8df393d9efd57405d488e8458113434b4aea848abf5888ca0e96f23bde921f7d03ef2e1b8345dae0726de0ef700ffb4754ce60eb28a22b64e425600b +006e0e6c96cc137134c20d38abe26b8dd473edf4cfce34bae4095d87c07ce3fb8a7ff099e4cf934e4ccf952f0ae3cca4895bbc7e5068be396b195dc6a94a5f250aff422a4ae4057e5e801a95dfc6d12bd33a462f7cfe23076e712226846272f98e6fddc4ffec7e6caaef63ad3598be71e4652faf9058513750ad79e05a7029ee2cff0fa5d4e800000000000100407898b4fd3455ac53827d03bc9c8c9a76ec154bdee2a15898dea646a614f705bf8579c2af73e54b027e7611385b4d39121b6873dbcd714b65089a1f41d2588603 +009118cfbd8de406248f48abfe3aa010e9c1981d1a7c4a8f395dd84197b2e8282c98feaa3e09860f1bf0a0a00adb0193dfb942142c4f83781ec5337be0c4f7e92e35f59830249be64cbe5097c314b10bed7d4b89338a64990015e5ec0ca02a250ef31dd5c510053dfe21a655bf451f6e63684ee154c3368fbc3cced72bb0fe2c00ff0fa5d4e8000000000001004016a2b027ace2e08557d41ec9bc4385905cb7b52e67dea87c6c9c54252f4301f9f831d4bbff45e7ccc1b561a5e1287b6d59262db1782248ce86c7818b3108ec02 +00dafae4c9bc61753824139de80df99c6d913a9adb070c14b9257e74795fbf1b161b4d9d1e58d4d0dff15704dfbca23c654da9f45418e5252dd19b02805d5df00a1a6a29a0f3a9582554bd44c0e2f59555a56953dc5592b8283bcd95d87c832a0c345a891b5be81cdbc3d8b8a26256f73b369d30361de0dec0b45c8435aecb011cff0fa5d4e8000000000001004099381f1d67a9a2a1d3db2472cd85b2872e79b571db59fd796d7295b63e3f4ae162f25ad328625a7d8bc190c65eb18aa9521a27c8509ce653feffc4e8527f920e +00f04221164439424ca0f14bb7d22d7bc4dc973643f13930f18ebc38e9722b80aad05c19ce2d8dd1cf2e0599413259f97f421c3fb88fce56152ffbe18aeaa4c92fd8a4a5d10397f88c3f62831676cd3d432def6ab6c54d1e70463eb70127de84aaa68910ff4bd3850060c5d8ef96bf5760f4da7d7e7bfec8d9c3b5f825e3c0be9aff0fa5d4e800000000000100409604034312c5496747443ef1946e93dd404762168b3e01c8a2a4008179c10922e9df6d08d232ba02df1a2a520a59da1f4e6b7a6c6cc146620b4bc46059a3e60d +0075f3158cf18fe1cd2e069651811fa05a05b0c5d4db6d92922ee75d8711392a96e7ca191c68162e06f40011d9a8a844d5ea39ffadfff0b206fdef77cfa8c138227468e6e360997f784e988b4c818f45c0627b3fa091ebccb0f7fa605ad6d631154ceb8153de7fe086f1234da9f89823ee4cd14d80f6c597d45823e665cd58f68fff0fa5d4e8000000000001004034df03d6063c841ea512606eac6f951611a6c01fe0536384ca9777dd40fdc53e80e02e9d6dd3a99a794511f3c4d7f5c22d7080afe3676e669a2f614054424c07 +00010e210e1525d7dd09de2fb41fdaef8a2f651a450acd53eb1452c538329a8c28500d4a5bea38d20a4c9188a39cc72c9a8520a819a727f37e154901ba648fa800ba147bb7f317ec50eea44e4d0527934798571e5f7b0c2afa114d5c6dfd292d0183a2f8edfcdcee5d017cb1874c46d718adfd4fa28c2d8227d07b07da419db428ff0fa5d4e80000000000010040455873914123aab78b2a9861c7b9108e0e20c356b6d875987ae5c06ba9759856f1e75be6d2973397ddd15118adb561da185c74f27362a309cc3717d0e91f3d0b +005f301c51023801dec2b24bf5ae2564fcf2eb6c5c93c3e8025eb028e1900b58850ce473cde347c1243a6f2bf28da339c3a25831bc17c464a40ccdee776e8ec10537eb6d23c211922b3a0a0b8c9f66e21c3f782ed5d436044d5464d0538ef77b0eabfecaeae0166ae059aca353127b215538e686bfe9483c5bb1c4657d6360912cff0fa5d4e80000000000010040c65733f6061a5b66effeaab2369aa9efc573b1580ac78ae4d8f79f916866a4b6726d85e3744732fc4ce1097b702a4d4b067fba2158980fab90a3e20f77e9a40f +0070a59845a3679a809786cc29a0369b9c39e9001560eff6fad830b773a41586ae1a326512770e02572353a427ef4761d847548c7cc635eae0708f88238d762130b3f9341eb371f31958c6db627bcb5cb8004ff4aab9a306026849115a4e586d10065d184d77727aa96f2f90a7b21b5dab6be56cd7867132cae66eeeb2e0b2bf10ff0fa5d4e80000000000010040e6037a385bd5ac073fc655575f4a9d6045edc384da595edb962622af9c90a3e5f134140ef043e409a5f5a185d45a831ac1936ec7fed96a212ffb3ed396bd1b0f +00daecf800888b9bc123bd9afb7736c4fc6a6320ef5583acfbd32ca35ada97de9bf675a118d557f3ce4b32ff1b51a44a17c3bff14a8f96fa09cfd29d8211bfc71f649627513e13f50c93d38ac0b8fef74dedd29d237b7df1bd8d576d74c77810246ac8c8d7bca6af95a416bde6f38786e365d8762e1f54edd52a35a663363225adff0fa5d4e80000000000010040e817ad32344d72040761308372701d84d4db083436581f371e761aedeabf487ef6e791a1efca5cd1dbde325e4855c6cfa54b0a7ece8f303f6cbe61bb29a81605 +008ff765a725a2b3dcab25433e01bba0f042c5d7d6a9aff0f1e09b66179d3b4c8e7fad0b6f1dab920998f5f734a55aa0d1cd35766446fe4e11ae3e832564b55f2335f08262139060a0dfc1e620336f393a69285266a90d2b15c526f7e990244e24eacdad936ca25271a66646f706dbe3a0c18b202613d4a23566cb2aedf480e9afff0fa5d4e800000000000100402585e469d22b27546a8d86c58bbc0580e61e39bfb013e3f608d5e95a9acbd018a7d8251e8900b50294267eab941101b5eec28f8996c1ea1347b9354c0590d405 +00cb8ded650f2aa7147983730de9474cd7e6e2df99e64c3ad9b73488bb144f301e1acfc8a2ac03f7b44c049f205e4a2b64e6d93342cf0af9a026fae0befdb4922531c30fb732e25bff9da6713ee393ec4189b45dcc25dc3368c6788a7ea37d9603d6c0dd6a24e60da0cdbdb9e47f2e3daafc46b665f095e560a4ace2d362844889ff0fa5d4e80000000000010040be7ca6fe51ba3126173feb314ac5ad32aef29e4ce832a6fd4bf33bca010b9c544056e28bf6f09181c34e763ca21a5c59afe46eb28af97f9f2f85ad63044f8a0e +00f69349952c219b01d93778deda0eb7507f5b08fbe93f56356d848c2e0cfc7093ade7f69d433fcef3a856e8dde6a6327decd005ac602432cdcefaad716c30c9071778218b3e6eaab32bcaa1b6bcf7d63ae0d7e1745591ed6ad9c35034656be4ac38b7f5071d78c756c16b05a6d4b45cb307050dd3839a559c6839f781e20f389fff0fa5d4e800000000000100406e007594c27c4a0fb66005287abc2a3ead20e48e11fafe2695fe56b75bf86d714d42ab7d663d63c03f6bd3535483bf76d06bd1aa665ed15a2e8c50e5c31a7704 +0012b37fc6012bc3830286977a38083f3b60d7620f66678c44c3b76f1f3836760ae86794230ccaa4810fc35bdeeb0307dc88586f403e01952816e7c3abb217360286bc049e319744b7ca5e75284baaa9654d643d5f58f4942809dbb7df4d6ecc128edbfe88859486cb7511cefcb91bf86fee32f974fffcb9935f4f9852cb45f0a3ff0fa5d4e800000000000100404b9e7661d71590393a2361349ef4241f26d405008fba1e38745d2512fe70a3b1f7a5b386339807dae9e0c8c085e9d65a2f3f9a1180fc91b920c9b7d9255fd20a +00bda15ab30ea19ff41ebcf1ce558cf2aa079f3dace15de188175d7c6e21e9e99f186c477175282cdffe331c6eb5fef9d0e20c67b821b9d61e07042e9655c6f229ec1f17f6672678da77cdf4b41324f0c1afaf278af313cc15ea0f78f6bd507b236c159a625c0fc86faa0f8dcb194c345bc68b27425a7ac7b2881403bf88d8ab0cff0fa5d4e800000000000100408b094bc68cb3e2672eedce3870acf6ca27f57fb02ac69fe857572caf51c87369b5dcad469fcfcacf816ae0871c94a3149b6a2a1ab9b60cd0ae4ba0a79ea66f0c +00af9fcaa3dcbda9b0ee19ab65e5fbc7da9d90e5ee7846ccc1441280bfc8ebd295058e71653256ec9693bc35c03d67599886dfea0f3d7417aa5f91ddee0fc63c1bcdabd501fa98ce3fe1e7af803831074f02e690ef13c2dc4ea1606f97d28af59691647b1224a8b6d71a7665d01e8f0380272f2ae791f8d932c42eb7ec71871b99ff0fa5d4e80000000000010040be095d2f34329ab09a3c3d703ac4ccb453b4507705ae59167f2d3356af9badcad4c85931363449e98c1759dadf6b0fb3960918e6d33d168ffb279ad17402f30c +001d3b12d0d2d38258d7d2b6c052589d9c83e1f939043acd256b2d43c30c24ff004b57a0ea8dc2d9451656898bce87b289677c3dcb51900acc831f50796d2d161d27996feb507073f31572e784f71a9939d49c5a76f307d5a8a7804859715683171ded4741dfdef20b10ca903b3db97bb11db0b9de38e695b4c167a231688f6f09ff0fa5d4e8000000000001004074fb8c7ad97b3edf6e0eb366659f20778b81b2aa891f0c47ec0555604ac20e0b775ca06743d9d7e998fb8ae070e054f08d34d70951e8983278ace22f6258eb08 +00abd145a104ec1a1317830c7df1405d3f8069baa35971242de45154a726330803b33038ae4758e5c2c0ccdafe6e34a331b36e46b30d1165cb6bcb22c5d612591edc054c9924804444c01022b5a3a385657edbcbb5f132d9bfcf502b12b9161d2deb83c2c4b3f2e9a7a1355cb4c0d81c3fc492239e26fa4ba8b01e3281e16351acff0fa5d4e800000000000100408fd228b26d4dc07e4c42a80874fdcc48db862846fd3a9eb3f63cc5ebb997aa0dea2b916d44eb74940ddf0506553ed2be2f3fb56d8977a3aa1e0cb71f42f19f00 +00eff14349715a5519fdbf8051e504275062cf29cea46b27922073ac125e16a38cc4ff039fa01a28d501ddab66acb1a3aedbf23cc6aad59a8a560034e8cef4d508aeb352383536bd2c6796f618cd94bd34be5c3c763632ae9ad6302a3ac0a7b1a170ca4c6e104c334529cc2770490a62c443de39edbe1bbb6144413c3ded4815b0ff0fa5d4e80000000000010040f57f5bc1e69294737ed5f30e7e78b1fc01bfedef0277f7519fb14a244c485c30055c6ac1c942f0f252c03a5ed20a1f98db4066995e7f8b1844eaf752ea674607 +00432f8ec1cae052fd146904f9b598a80da5d7f50eb489a528c84c1c0d2d398d802dedbf03b8d15258eb5a7ca43e1db20805ac6f5790a81dcf14c7af78091a771db805910079141aa6ef1d74a6d9b3788c4576c8e865ac8c34a7f5d4fa212d4c0c7bc88928df0a669df2ed698c73cf4877a8a773a5210a844d565eab683582d5a9ff0fa5d4e80000000000010040da0af85da89f47ba6489b3390d13a7fab59ebf65c04618a0e60f0fda4575ef1c53d164237bd1eb81632fec04109309d2ab20ab59d713ae3601c82ab1e7ab7f03 +00f2dfa222f2caddf601480254851b6f68182affe44ffffdc9dc754c35a94c5d816925ba850f1a93d9fc84ad35b5924d81ab20dcfd74fe6dc7c0c689e53a24961a43a5e709a84f7c68b1b822fd8ab156601afbee773be618ef78c04ccacb1cf41df00c9f351b0c5726b631495ce36503ff57f042ceae8c80e273a0e93af97332a8ff0fa5d4e800000000000100406eb9b0d79a17f3070d10f316ec02b8e22cf10fd2f65009735c9e733856dd28a2f4660f85f317e35d32f15e4033bb8853aa2b5ae155e6ab901225f1b4bc5f7a03 +001b1095097f3a7eded5b4ca1394e796a70b4a45016eda8f47a18b2faa25e0112f6105fbb8c36a6cf99722ccdd537e989d496a7b1d5a1b062aac1ee8bfb7ffc51592173abe80a25883586b6368389865988b652cccf3262a13912e12b87ed73b93c4d5987fdc82b02f49d14f637c0befe718801b99237b9bbae6585532405e9680ff0fa5d4e8000000000001004068bdedf228a2351dd7ec69c463acf2f5be7689eb44caddcf97aad8ce7e7a6d3cc04223dd4c0544500772a7a3ee0a84657ba69fd224359d05192fc40fd7556f05 +0008f4cd3f5de7354af3f6ce18987d6603f46e75ea4d9de68f6ba40f0c3b4d320007fe0858fc29cd07d060c7836174d23fc5c8493a1bbaafcc37ca070d142bf92abd02c4af087fb30afa891fab2e32711bcf8e7fa3cd465a65d1ace87e7c67be136a77de1fcd9541e970f4ddc4609fefde3e803cae0848aed1d099890180058c1fff0fa5d4e8000000000001004090492b2c95ae487664c65f8d0baedb2b2f02d18e66e32109f6164d3124da3128702bbe7d204441f45221cd6ab6fb61967a5466e0b590a56a41f38f145376180e +00f8e7a01187794dfa7dd8a95f3e370b2031279a0c24753e82eceaeca904e51213f3e21515a4da9f281e109a2b9443691cf6f7b96657a5333411ae2d0f1fed4b19ad70ea780e2bb400012d57ab46bb34af63b7b8c5255f320428e82f104744b310aad11b3814f63d7cda662f8c2cc55368a239749c737ad8544f2b851ff1129995ff0fa5d4e80000000000010040071745e88f73007853a0c702f5db433e63fe007706e53d9da9d5341bfca72860f7e4d3e4d736567844cc5cef3be33cc8603e6f3bc22c9c32ef82f7eb36d7920e +00d916b6dd8233d57e46275b921bf483667e1a96c93f608a7834ca024aef8b32010305528884d0bd3e15179e149cc5779ec99257bd0f029b4fa57a2784729c341987b6c6ebfbcabfbcdc5a6fef039a320a375eeffe2faaf8776636bd5799110303f30a9adb9f5983f3178e3857d1d1a7a95f82e5cc05ddc2767f3931e0138a85a4ff0fa5d4e80000000000010040699042d11e4da23667d517f46ddf3d3d88d8578480d367a81e4b113c514880ef8b4c61976d421db69873dfc221d107c99cc2694d4c722f78c145a68d03d34b0f +00b8b38411a807d652717b53361c69521be9694fd435af6aae65243bb4150cd0a3efe776e54dacf167ed05cdfdd91fe19ea85e25c2cac28856163a92e3e5b77e2624adb41d8204f2e51352ea64aa1e6530af7e28695889075f354141812e6f362f25c0985cbe443b4f1f75329c994951ee0326a64a320729c0b19808d99f2ccc96ff0fa5d4e80000000000010040725769fbc363d7b552eb5eb88e937f6d8b80755083b4dd59080337397389a0ef42adeafa260b10ffb78849cc07d1165fac20b275cf4fcc9860db30f523700704 +00a3e4aaad8167cc870d1c83ba04fe9eed08f6094b66fbe333d7a1c767428dbfa4a5eec734c4807718f04f0b6b2038d019c7f87caff557d8bee221006fda478803f9088f17bd8b45e4a71beef4e2fa6691528a19544db969cd3ed0224b326af20622c3b0e8cee5aa844ebbf269cb661e6b9f735643c73b60bf70e9420e8f93408eff0fa5d4e800000000000100400384dd1010875bfac783d975e77f985efe02870870004208552cb926d184036beb9dfbdcaeea0566a1beaf31e4d3dd4266a32662c0b5f5f9416d756a114ba702 +0085b60a27c4a0b8283683fbf322624d3d431c109bcb0ddd5eb8f2272861b181a70397d7ed68783b2623af77c6b61916a5711713d163ee1b5f5842bb3d04b0841c6f6addde5e3052aa30df0cbd891497d095202346915bf8495df983d468824816e09028f0d69020b0a2181196be4731107057ee827088458906110dd4675a9003ff0fa5d4e8000000000001004045f6c08f2d07df15de1af040a32a6bcdbcb8605f856ce6de3ae3610e5aac9c8054e0c61cb671c4fa4d9462b30d2af03c96ef583a2679a90379a711169baefc0f +003a9404fd4478fb31afdf9f900a3aed8f87bb2ddda5457c1ad08eb76b0c65c60aa5c64909963c9a6c236ab5de7ef8a2f9eae29e472302e842c12eff2bc59470207e0b5fb565625782158ec92a767fa34443ba416969f5000b3ee99e84dd7ec79e3fa8a7ccc0c977af7eb0501d2bc2aa455ac995f537f4c892559c1f24d5fd8f23ff0fa5d4e800000000000100406894f48235555bef23ee7a6bbe4bcd7a8d54e36b34e317534c4f8a6d587f3c61515d359ffdc149cd898e446fee04f024da5de6516047c8af9c46ea57e39bc800 +00da59b174e7d35c9536a6eebf03a7f6eb2545df37f77b822620287100e6a8e0a12da524ae8eb7c6a28e766461ca899c692645293daf5bbe2111b455901be4470ad6f0b86c8339314c53080a811e91a1bb7c670ac3e2d722a868e696776d2ee2afadb89e82e4eea6eba63c2bd3ace5fa35ffa944cd7567d29c39a9fa0925da7699ff0fa5d4e8000000000001004098ab77f08781f3334c833fa77c15028c8ae43dc5428ecbce09b1a3bf0cecfae89497f52a0e7d57f0e495a3c2c8f955e67d08620e04685d6834c25224254d4300 +005997b545be41a51ac74df07b038e782f02e6107aca90fc07ff441d8e87bcf21ba589d1c9bf80b72620a5feb14bc700067c7db93e5c68cf762bca8a7918323710ced1109ff14e60d7eb360a0f601d9d158ae7d23316e45ddb935f3032fd23e0a587df89f5d3edc32e2990afffd0ac28b2c061d20137f368071af13c4aaa87832aff0fa5d4e80000000000010040026ed83904100e838298795c502abc5a2339939c353c8977dd6cd2ed3cbcf79d0bed275e51326196058f246410cbbae006674e6b35655e2343ed7c78128f570d +009849be34d8719279502d7799349ffc376d3a0637e655204a1113b1a35ab18b2a7631b9a2f8ad92dff32297a7be9184237dad979c56978e4e5de54c4eea6ec025b5d4b08ae066d48e5cd119e62dc527244e009f5d700dc25c5cce3125dbfa82030194c363dceff8a97573d6a0ba9e4fb1bb7ab149cc8356e0cd85db61d397d483ff0fa5d4e800000000000100403d299da2c0c7ff7bcea1b0a030778c78dee3c3cf11393bf1ad3f7cefa46702f4459e19d209331311a1a38a7710a5d1f4d8b6955b5da1c633ef66bd1a8d425f01 +00e31bddfe36677d660ed7bce02571fe4c74cfc7cd3742be9b717475d0cdea560f1d74cc0417b212f6e09b20771d946c57b870b9b80565e3c4f92e97aefa9fa72c333798ffe92a197d8f05134351749a66789809842f3bf92d6b99874a60cf9d8ef1df68ee42e274ab1e2f756f4ba8ca57924eea0593eecd2820969365f9f75e18ff0fa5d4e80000000000010040a12288c85e3fef772cf196507926a9bf5622db2beaeefc688ac38e3b329084dda2f1b9309f4e5127fd7d4bab5aad0681ad830e2fbb4f90228e3c76dd657ba007 +00d402afb842c9d826f8b48e532a36a96e08f81bfac6c11af3781a4035964f9e9705fcdb6968ba97299d644a8362ebc982b7685daeba6a78cbdfcaf2906a59261be62addbcf0623eb441e291cd88540bb3006e01439fc41924287edcc61e718c0ec095eb0dade696e75bda9b917134b994bd3028259295ecd4c157962c4e43069bff0fa5d4e80000000000010040fc0b272f13d6664231e5ef5a29d55e5827069468c2b6fa519315bb61b9163f857073da0c45a4c994ab54588343fb2a65626e726d08c3ab33e37935c94bc53f01 +004b4711d073faff0afa7da26439987b59742c61d41891a0194c7971a0c054f72280bd15954efcc77e1ff65b12468300d169f941ed254a554f43f88f9c65691d08d7d49e7cf05176666d63b731625df51ff6c61e61e63e44ae9f04029df9fcb98b2fd35794c8d5fb63c832c161d9426da8fa78ad6d672651997372ad840eb31c01ff0fa5d4e80000000000010040742bb930219ced43e24f58360e653035a15b9bb264ad10c3c2c6f36e3c87e2c2366b7c10835f7d21a7c0e705a5b3a8f8bef14cc82d132111f4e3f22d8e4ac003 +00006aeaa01fa3ff1eb9fd52d7d0319742aa029285742b6f5cd2ad30d15e49cf11e0f5651b13acc12c413224a0600723fbf44c37e1d0275be860e40713e0a17609ae60ca82f70f47859077ad5ef364188d22c183cd468bc96c6dff143e65b6818263f832bd9ee5a68f2b8ac8e085a101251bb20df0728bbbb8d1586dc0dc3588a5ff0fa5d4e800000000000100401113854c208c7e1a50896be8d9cb6657494095963845a0ab62f14bccd76ef23c88524462429ebc462acf022c02927a36d54e5cbc8928ec01325c5b69ac80240f +00438267d1a2c0473b7f03d21011537e119119c257b78ddde84647f2f4955ee70bdc69fd17765134b6f162528d323c7ad8f2872057d65c6dd43b55a31abbf2a40481ecdd75e889d1c6bc3f8caddf4e6d3c4ee5f43a4b61b6b4bba41b6cea2388012566de838c1ff96e6fc41527a665d0b84457e9eb32f8ecf76c7e9e7449d1460bff0fa5d4e800000000000100403f57b1076d0e16911f1572fd6068a596e24fafe121ee857cab1349b0bcc90517b9c202c28b1915da2922157c4fc7c076e129846c2f85c5ebdcc9875f31c1bd05 +0050d9d3afc7f6a6bf330be6a277d6f3c3fd0a0773ec04fe8d614e7f1cbdfdff0f3426134a408638f96035aa33b15fecd77c9d0b80ef485efcc63a6b2d5e30c2180327bcc5a35ae1d768d9bca79a201f104371f4401c013aa511a7e46ae487fb135eb6520a99a643d9719b6258269e116c50e081c06245300795f43660c0e60124ff0fa5d4e800000000000100405c8a5c2f7fd4870f264870895b9ca0a91f9c7b32c1cf77f50855be2dc6d7ec1b10d74fc0b19e4f2926a86e388ded79b0a9c52801947e56040d796c2383e8400e +00a49b0ebdb4f0ca58664921a3db9270f18c65bfaab43348e5ed9f33e8c0fbeaa6caaca87a21b04f89f32bd70ed42ee1ad08c88d29a2b82e31d731023dc3b0621b0e6c3055bebb00c478b658c2f886e5f4bd3746d86f41f5dc49c7a3c8016b9a084adbbf7f96d1e77f497588bfcdd0b419bd00d48aee8eda282af1c2b3031f1e02ff0fa5d4e80000000000010040ee0c17f0a7b147badae771a91354a377238f40462f2dbcf2bb4f55d92f16b73dad93e3c0ddea37d8e1b962cd164c1bd321200796a5f37705abbaa2865a62df08 +00ab97e141aac57abd5d8b1f16cc8680d2d86a142b140082220219e801af436d96c76b02d90883512909391c72fc36a115ed53e407647a8ed0916c6bd623be2b19e08eaa81279dd1078d41c5e5c05a7da409c5f9f418ea2671889b811d0c71be2be48ea1a50cd02286f8bba821a3a0387d34aaa23d346587d629f73099a5d871a0ff0fa5d4e800000000000100401c2c20e42cc46a889cb2bd35f2f626886bfa37d404460126532fd070f0f8dd6c1ba02c1f07bb20fbd26e44a6a0e960be887011f9e58161c65d81dd4b870a8f02 +00671b944c4dd4179610079d84369bc2139c58508a44dcf75aece5bfd794a3b38eebf20bd352c0ef4c0928cf1f65b8d296e212e4d11c7ed88e279c33e10cdfc82c23c55ac8a6908e8171938c7fe39fb6aab1c6c30f2720165023ce1b912daaee064805556fc635afc064dbb931b811352f3631da3c69d08b69540a2facebb2b700ff0fa5d4e800000000000100403eec7e2d0e8767b0a3f724c18946b18d4f6284f97a882bfa4a72ee2fe9d2365935f29054bd2dae6304732296de1ad3cb21ddb13207374d6fec6956b110965d08 +0004cc86d0f3cabe2a2a94e0f454394a8a905d64f28038c0ec75c80e20ce677588c460985f762697cfcae25c58ce0ce838cd352fc98669376cd9acbe5d482ed92e5821b6fcd6067c59d359659fd0f9b499054d1c46c947e385a250caaf3116881329bc26dc2cb6a4ad548ce72b9f5a431b48f3941e0332e4faecd7027a14cf1ba9ff0fa5d4e80000000000010040980cc9add4fc2e25bde12b4978e8203f5d62f7b42c46de8b50085d5d65727e1c658e830397adfd978e4f89badc1dc667a06d0edf83a3774f18bac04c80f37703 +00d07f0923638482a4bde32776b2ce50077d62e57e8e14e1dff031bd6c45c8c4a328e29520a95c08dc05a709f65db641002f8dc564eca0c968c2d0900de0c4cb16b2540585f8ceb5cfe950046618ef2c8b90f6e837be75cd04b51ed32d62e2f6192f110b79ef0796ee716bd0e4a615fdbc3b6ecfe4da78304a338db66460de8190ff0fa5d4e8000000000001004069e65dc094df767c37953d399a2e97f031d6a0c4505b06bbf3318d90687bb20b584a1af091098d4152dc593b4d3b12ba9edaec8eb26909e244e5cef5ca7c7308 +0031185b6d5c8d6682f1bfde75b8b9fc962a268a1895927c15f7da9c01f480ec07158281094c40d7ac83a24fbedebabc6acbc497b42fe4adf6f3c4573e30d60925d40214efdaf4af69daa2874692ffdc50fe9c9d8495b274f532c70bb78f5c97001c691fd3ced1b1fceab1a328920ccd7f63f2852be5038825670aee8f49d82526ff0fa5d4e80000000000010040cfe2bc5240185d2032f2bfcae147d6c8f2ec725c94801ea22b7d31f6f1a3b6633cdac063c46bbbb4f6af317f055e11f9e6aebe03616c0c605ebcb89c74a03705 +00d2043aa59fa25e00447a9d59167d5dbce0da94f7c423bc0cbcdf6b470113caa4ea42851b274692dbdde380dcfc66e47ba11a87200df165ecb3b68a7116312314b40dc42de51c8033319caa834ea30a529d2fe3142b568efa05a714933292b21f19ec84e208893a7c2c63a6ea02dc7298bff7e1e9856b8280fb6855d731c8e7a7ff0fa5d4e8000000000001004052c2f2a640c978dd203d3d46208d518c2ef70f6d0a29acfd7571d3a4acc9a00b096254212dfc5134bf98140f631823e9ce57ffde417a441b6d11d4536fcb9406 +002283a93937ab2b5b9cae2eaa2a7ae332e3c04efdc80cfac8b8ee06cc7ca3bda716db98f17fd0ee5bd0334cf6715dc9f8faf3cf4932d051eb1ad6c88e6600582712f452aee361c67fbf60e04e71d5af06629a5623ec19cbdf7496f4196f4130003047ac9b4ca8d54f9b95125aabae4f9b479163ecc557470e93b3071ac027222eff0fa5d4e80000000000010040e5ff44246d314bbf5c34d7938b62b9ddedc0dc727ebb310e5e55f2395c2c0764c92f0f02593388c98f90eb271794f9017496f2a35b09052d277753b234cf8102 +007cf551683f5aede03c65cc6283ef44f3e46afe91837164d96564511bcf1547925bbb20c45bfd90d8a950d466d9505069544656557659da71a8af647555631e0606482cdaf3f0b2eafb1c5d5bad43ba55867bb56e45825372c8721065826b3c254605c1ebb176bfdd00d3932f2f0b0452da7a0679f45198ace1c00ec5029f8a8aff0fa5d4e80000000000010040e64010210e596626c105f85a449475ab550645063905e922ff98ee5a9037070bee1ac3c81056942385c546949987f8a48e0ec1547fd8cb632cc6524617a33701 +0053f7796b542462b48493731c7d6a76ff2c631ea2c18116f7ca8b93b16d5958012ddc1afe182afc6fb42c1b7826de835f6b664028bc572db12be025d9bc38e302a385e616d0c3bd0d9a8e24d224047335fc57922def2daf2bba3378e0f1c65e98504eff6c5fe66d227a1a5a2a7fbbb8dc55c174557d10de6f4d3136cf2246ac1fff0fa5d4e80000000000010040f3fedee83722ee3fbdf750a8c6ee402d0c4648ac626655f55026e3cc504af2f3be183ab618f12eea6f0e5f1653dd5d640d9bbd026a80157ba94e378f53bcf20c +00250dbe6c342909a3c669cc89531ccb95e3c4197e1ceee243a1dc763662d97d20f220f3c851a7161724a8ff4c6db96cc11b5554ad76291b8f37c81eb07955ac156ea9ad5322d9218ea98649a5743bc903b83aa4fe3a0aab8060682da44b08a98241e0626b2f2989fd0ac36b033addfa5ba9d35c8d3dfaa64b24837e25acd0981aff0fa5d4e800000000000100406ea2be871910c5604ff594807c570a40e049ccdeae08349b7fe57e4a13608a37250020f31c213cf0f8924525d6a107fa3b71e9ac2bb31e000807e9ad035c420f +00a193357e39d691604b6697c58a84f5b138ed96c2da9731a56eeaa12fa527db8d96c09e08ac0b5175f37b682f6e9450e907b5da33ba0d40da9d40b1cb630d4e30299bdb62168ca05de21cc46a77cd253d00db2154e700312ad99c3717ab9378ac676d491c479eee777b74a4d0362f1a69f43e71b5ed4b338bace1ab2198007e28ff0fa5d4e80000000000010040867070b4acbf216fd6a8430751d0d831b3098a17266bd14dbbc0d256143c85d1cd6b517255fd4aafd91bba8e6610764a85b4070c17757f9f93438f91a821970c +008124b818331a07c2a55839f48e5c67e61bee03d128d7aaaaf372afdd61097a22cf6698c907cfeb4cced53edd395ff5c0409c210170c57dda58e67106cf71460186530eab47e02f6dfe38b92097c77543b8867e0521534dd3f35fe7b4dd50061c3cb0fe42b40c35ac03934b07da159679c5dac1ae42c60265727a61f192293829ff0fa5d4e80000000000010040f939d64f95d6bc497a6ee833aa25549d4236676c089311a12684dc1f7276e7eff53d5dff754a5bd6fd4aa063b2ba9212e9e636d449a21601a4955ca926023305 +003ad76e152b7d6809b2220339c9628c0ac12f4f8384a232a0dde009798fb1268dde4283324f5087eb1cbbe5fde4b49917cf80ae37183f8a48788b72aeda752d1c072be57db87205aef02079ae7de7a0a60b54316c344f3c3e9c86696dcf1c1e81dd6a64aee5d47dc994dc9d5795a1494184dbee44ade64460f17b92c535b7052eff0fa5d4e80000000000010040808fc1b5e92cdd275cd97e33d7926726e8b655212ea883e8d348ef8c487fdc27190abda6db9cbd4c7a3d6da2d8bb6a4f16ffde4ac3b08895b0a96cbb39acec04 +00851130f7606ef26cee589e80483ed6d74c9470816d68a6e9d8ff0e3529ef710a5c7db6ee3aa6ba245f1dae8c295cfd5a8c2d4c37e240a384f9e5a194cf425c0b70365ab3dd88b2096a68424e8eed1fb6b052f38d636a7eeb95f2c0575e6e10a5ab348078746c7c5fdf67dc93709fca1cadb922992b92d97f1e8be6bfea0f291cff0fa5d4e8000000000001004077df040d6a331ee0c0ba6c81466b2a0aecab38fad572503ca180c3bf724c47b4d5e23159f8d1dfecbed9dc9b472d578dcf590b8620a70994aa7d6b030e80ad03 +00bf104dbf0fdb1085e6f2024b4e36aa620b685af15956caefea912c8759fe3d85159b0de045fc9ac420ae2de2282a1165f42b5a90185f52dc9c05430084143e29f5460dbd770e287549cf506a56e611aa1aee4288e651cfb51dc0e76d396cb0039264fa92b375bd7605c82d707bcd88c2853478a25c3a8c70a0390e507f43ac14ff0fa5d4e80000000000010040e030ace04d508cfc8f120cefc7dec21df2251e22615e5b15c5ab332056d831cf1e85943ecbc358f294941feb2cf635ebdc884fbb4d7a432aa96dba71e0c82c03 +0021194eea96b595579777cbe074b1d225ac3657365f61f1a2def409813c7daaa1331a4785aab529bad04f9278e8d8c5614c04cad6cafe27c8f3bf8b2083629b2e4d4e1f022d85833f645b52b639b54cc9b4174aae4af8bb209e0542692865810184d406d7cc3e816217856cfc0dff08d8a412170904d6f640506c986b99bb240cff0fa5d4e800000000000100408710196ccb3eb54c43f2a34db28c504ff335f1d9daab9aff3325593820cc4d8394f0e296c600f8e3f748e61b1875264582df886706be9badf6e5e079bba6a109 +00110754666a16b27dd8cd6d6a377b4b29a2622c0beee6da975f0713ec9647730d1047a102c17d58127547d1410a109538c0ba9f654d4368da98ff52edb66512153181f914ab57df7df6fcc213e94af1f93028290e2a2135123ff19a2b8ca0ac81dacadb182d76d9c67e0ee3654d0ea9faae331ff5dc8f6651fc85ff783d8792adff0fa5d4e80000000000010040e66625265124e92c0dafe8a7431b92e0db7827e4341ebf534535e4e11ee00035dee219520604d2539e73b3e14220eab55bd7bab5b2f0274bf3a4686e87057a06 +000e684357c98f972b44adba6acf748049084630ccb9821f581be71fbac35f672f32ba46838bd0719ba39cd757a36b901753224876464c484d4792e5d9838b2c30106d230e0192004a2f1b6243fcae9fbfd1738991cbcaf628fc40cef66934fe91a62b7b68d50541a44a8a6096e754532253abce954e45f62b64d772076aa17a99ff0fa5d4e800000000000100401e0f10211af43f18c1e385b2eacefe11628c721c5dcffe7c78b732611f301547b49e6b43fbf0a6bc709108c9258d6aa9d136909699006428db2f12492a12af07 +0044ac9232f6af1980ee9094e51612249cb780032aa2f17e8f996820013c2d6c2b3131d19ba92e30feff590378bea9c13b54b956a31aadd7af997e87952e53732bb515e37ffe4113fae5f5ff6410cbc638f623443cf78a953a876572153071ea2cb6217db4f98cad523f0aae90dbbabdc46dc3c559f64b40904995eaddb60bfe26ff0fa5d4e8000000000001004066d289ded47a15426a4b2f90b9b92049eeaa6984345460877d9d94e07f74284994f653bb1f269e467ee0b76a3da5e9a64c4b2b0f30527db2615f264bea9f6203 +00bc37c9b7b80425bf1eeb00012f78ae2bbfb7cd0b36bdfc7086c71174a7c0390e4e4f79e4d7811524b3e07946139e398992d2a9cc400479ce633d364f648a2805d62e1c268204da0124c819d0d3cd014cb6f254f0395e1081fb6e9630ecee77a07db42520f4604f280b5d9291d19f1809f3ec61ed3e676f5d093abce868a7bba7ff0fa5d4e80000000000010040a4170361c9a6481ef054f5a7960f48f63b9c0739740d10c6049c9dc64ace7c309cda32412b73e4f0809d47cc72f9fbc32e9bd1cd9cb70667a98ad38aa426d701 +00ed6b3d2468a883269905ea5af2a4d41821b8f886586e85af9f45c93d42d8452c5ae4658e8ad916f92ba2d30418ac415223512b260ccc7dfae7f6ba33ef6ad42796f270340ff0116b7d91fba9f269fc5d6fc350be5366622793acac7e9de0cb0975b34c07c525231ed89e3ab5bc2cd573fe6d46a3daa8cda39e0a60fcc3c53d1fff0fa5d4e800000000000100405abaca6909ed9803e6746c8ea0dc0dc3f61fc1210c34e22283a468366b94155b83b9f3e5b270288ca0d9824acfe50d53bd112e079e7719f7f6782ae4c5dcff04 +00428406bfcf3d5d62f1bd34d5c9549761ecaaadc964893b86a215b0be3148ec26905a13ca7b601364d6781e27bf6ca720949dcac867a91f4a9f628abf45388f0d16e6d362bc9f16d5b5defd878a56ee96bb6570c3eb1cfff5962c0ef3b1699a8e5f9e9bd600466eb6d513e45a5008736520808f5d55de3373a355215cebf6fca8ff0fa5d4e80000000000010040dc3339c1fb102f72f8835cf308969b512d283299be638eff9020ab44127dc010267c1b09ef130659f33d8e07d348d0a45fa5cbd47edf940bd0a1d77b49657709 +00cd17027abcac9d2c3508398e20e06a3a65b9c36cae37aadc2d3bbc0c6d834e14888ff81f7df936292f35a8fb472ef595bba3b4e7d87445e7aa67c0f705855925efb7e7e62b9a7730c4e7d81fea6dd1b9634abe3cde138935d16c5dbd54a4fb2257f488283a3eccc1efee6fc2fd734ad37537b8b75112c540ed614a74347172aaff0fa5d4e800000000000100408fcfad556881030eefd206416ed48ab3f1209abed7ae5a050977b3076fe73afb786c9f3c9eb21925983b26965bef2878b37e1e9b6fc812550d28a39b22acf50d +006651531b7c1303e0342cecb59c1e009c00385f2d4fcb027aec7c9fb00b2d69940e910853f197d1224a89402da5caf46156ee9ec5983602ccc484ef076c4c5b0e6d4dd3cfcf33063e5649de52c24ff66026abfba1c1a14127b9bea23a2c7f7829991b2f0046b11393160999f9f0201345ff231f64c4ab681a601b90fb57479d28ff0fa5d4e800000000000100400673f1599926225e88c0cd811e2bbe795f3a4d31550aa07a26b991bdb7fec8c23a29b9f94dbf2b1edcf2f2f084c0fb5ec6eecb8bd53f143e430757b986115202 +00911bb80522f57babb48fd90d111d6a2627eed6b08e2f4a4c6b1b57c84f7b008fd22fbaa4fa23a2bad3fe4489992803bb0fcf537268fd3aee82e2048fe0ce08119704095bf1ec651416f5fe4ecd86e2858c7132f39e207999fa55ae8eef6eaf1b7c0054c5e319c8600c97db07c2fd0f419c1d22a7c4e42637ffbacebeb002a9a9ff0fa5d4e8000000000001004075a5d6a1e27b587885a3334e7114b188c3c873fb5bbf35a1fd1c3c2dcba52f353a945986f3974886f77637dabedb0c5285d1cb7a07ce9226a9675e63bd24240c +0087cf3ac2958bbb5f55dfb650fb01a02085faa0d081d11a1b0aa57e8e1358068c593b0cf28edd90ce89bc5d9fd1d6e690f14d2040da9b71d1c6c3b7fbb9605301b2d044951147fe519a45e564a2aa6a03cd97671de471f4b5e08cae1033253a9acd8040d98993bffc61ab2be1d3d4d19e1a7f0ba7bfca27a8e31c775086978e26ff0fa5d4e80000000000010040808b562de80fddc56297c0ef53321181835d1afe9fc51c7177526b403a96113d03bbd1257966481fc8696d28b491be5075f632624bfaba1bafcfe5c450830500 +00fdd662ede6699a1ec8d5b01fb4ae19cde3ae803c5b179c64b9a339f9e587fd2d22f46e63ba6de0da10ea13376489efef66fcd19b39e903fc1b7fb864a5a2bb03cca45dafd67e0c80fe861437c83dd73fbe70b1d1178e7f255f7ebb786a6e5e2bf3442599a076daff3e61b8479c6df87ae7b2877ad17d5989319e9420ccf1ca9bff0fa5d4e800000000000100400d20cf42db3e5a5a6fa0985c8f933a83de1587a085033564911bb41b3e7e3e6322c435cb1928e4112cc90e220ab442518306252cfbb76ae0552896d7390b5b0b +003f32686b959451b991e9e3ed39129e097cfa0c55218714a8f2ade7234b28ad2405fe9b662eea8bd0ff2f77bd2213cb4133cca98e59cf1d67a4264c5d00bb8b18309ce98b3c3ff8a6124319d77491f1e1dc8e9112c32db637ec17145b3ca30830d53c7a80e924e8782fbc2f8209d9d98b9d65649f9f25d53cc639f60d861b9a85ff0fa5d4e8000000000001004027c7e8208d07cbd08f4a857e75fbfdc1d75c80f54183b35a18e96da6a19e6690e5c88c3cc7edff5d6c7c7e5e07f115b562890bfbd160fa6c3a65ae0233ee4406 +00e4393cfe971caf67e99f292a186a7aaeae97a6fb01b9b04aa8c2436d59873f0b40a4360d748a056bd25dc93fa67451c029a8a52760f0c15ccfdc14734554e917db2a7727a186fb049b4fb58c4108cc0fdb6f53ca73ee0afd25eb07cec7604d951c2ab457b01eadb3864c99ff9f480ee267773551e6700f61838245e2bb619121ff0fa5d4e80000000000010040e9f92bfd53faadb24a7f26280a2ab840fde526d59586271eb98139d37e20cda83a96e22fc645b453c7b05e4630a6803ef92ae6a4e14fdfb52ad521f5fef4af0e +00741c3f690407bcd52202c9303497734159f54dbfbaf347ffe3e638f27fbfae85aa4abd4d89bf69d3038c787db6a0dc816913cc92b4092648e21d63a8c1b4622cc18aa28fddffc6c01b54a14fe4b87ddcba5e9716c5c91988f92215f3e657d32dde1afd1d3f612d4a230bfc650984ea7d67e3dbab09779811ac9742c8e8326899ff0fa5d4e8000000000001004051d35ad66ebbd69fa598d8fba51b0c18cd6aa7ac66fc3e63fd1387d51a99739c6d28f3f716ab7513b802dd7ea9461b6dbe35f97e43cd3bec6716abfdb54fe607 +008c89420849869cb841c6b427ddea9bdd618be95b9e6487e377c22d8d96cab985f70dacd7a11eaec7d6ba7e8313bcd967675e4882542e45f3340223f28f403429dae6ef2eb02fbc6173c3c26c414e8d2fe4f7f8848dbfade71320b0aa1168e6237d826b4e730a9f6a3ab9d3e2f20250b5d878234d0cfe9732809bc4f8635c478eff0fa5d4e800000000000100403f25469378126f4b84d08d7e6ea1f9ca625f5dfc23a9c48d7a69e9f56a202387b80678c28b8c6728a8feb0725a84b94822d522b9ac695040e892905d7ed14c0b +00168b2976adffeba68453318420abbd01daf1f086b7a4e39dd1cd0835e99e6387c72dea84aaf97b2cffe26f349a9014c88d109434f8a1ba8a6f6a83bf67ad5d1e4fc1d1edef09ae1123826548511ba22ba37df196ab3142b711534d50b821208d200438ea2cff80fa78f278d788f7e89893f3584673356f2aba2da4c85e8aba2fff0fa5d4e800000000000100403b98311a96119a04eb66dffae79389f05407ee83556951b7c2ba1bc694d587697cc042418707d61104195e3be5fa73506409376362d375e435825ea1fed1c30f +00c6e325c58c2affd7d6f8d6521af25a207c0b3acad52e20ab4630cd7875e5a712958587ad47c44581eb0a10f221a33aefb4094becfdfe08fe998452ece2710800455b37e26b1a331ca3a473e91682e43db9d14ede5ef6bd859154eadc663d93a0b27d80e9295322710784a305279212c1d352a06cf528b8ca38c12c43c7f25223ff0fa5d4e8000000000001004065aa0dd5cd9b77d98d5fe4127bff8da1c3f955327d6018f45f56abdcd0bc7046bd5bc61aa02e9c0664717d832b7cf3012714d3c0be7aa9b2d45998f4dbca4d02 +007ab1ff95185c1d3a900834c355bcbee2c8a2db27f7b2f6e931ead48be6cf6794d8220171e4d528b83636d48dbc80a26d70de7533d7c33411fabd51d04a4e4a1ec7b82b2713808366d40ece5246283f51337433b56e72aab9e343377bb4e59980cb3941993d3a87d7808ea599098129649d706678ab6e8e6ca1e248004993c92aff0fa5d4e800000000000100401037119a5837b0367bb288da12a22b99d2bf96ed1127554887a83d400707cb053df9ec294b34e32d97475c85cc4f6f0c2c9b957f49326e00b8499e680302590f +0015eb87f9e24516e215a0d23345ee288380285fc6ab9cc41e224bdbf62cf631148f176be6b34c8ad9e51f5abf7ff748ac321f71291733b1552abaa9d227b6392b0deb61b8bf741000d06db6bcec4d2c0ee5e6442e563dad0fc164ec22da0ccb0c1aaceef80428f0f3d69aa59f09d9e4ddd9bbda1ff7f96995fd7a9f462eddf50aff0fa5d4e800000000000100402898fad22264d737ba2acf982e24a15cd3fcd20df5ada7eeee38ec735c274b9774b34b5c96619ff708a0d52fee37c6c80802508f2222146087174e2f81ba990e +00887f361385939ad1452dd92bcf477ff6c79ad0c0be3559c2f9fe61a83e214d2dbe554973202081d7c8145bf041c90fb9c0bcdc9bcffa8457809395a2a1f7a507959604e8d9fdf9839b355ab7ed6830d586eb0b0ef1c93b81b9afc359074c209054b1ca75430d6b40d88969e33760a9f14049f007b90b117aaef226020ef1330cff0fa5d4e80000000000010040a5aa5deb69ad47bb6f25627c9adbb870c0b08f8f7e71a3c88bd351e0bd67f83035683323854b817607c8f29cd3eeae8ec3f11991193eb432a5d42dad9b568604 +0081a5c0ceb358b7add600961afcbd5af8223778e15a5fb1d294c69c768cf0caa77b7e23f5ddebe32c9be6cb1e88398e2b7de89fe46eabb45d0a727aed4b652124017c9d346ee1fbcee8ec38c75a8d3c727a5e4f544c8d93ad3812e1e152909ea471ca8928cddae2c54bb419b433b43164fa839332d7e13e2d876e2a6ad3645b2aff0fa5d4e800000000000100400e157c151eb25c63cc1f95c7908fed2e1e88718914ab3a4d616570841b406cc4ff6def01ce71739d1d3d6b98906ead650640ffa0d5b3d2728bfca23d90582505 +00f79034744ecc8ec3bc0c574ae67845a646c63ba05a6e970025414cd7a1f711a1ed63c9c071124165c8329922a86deb3364f5e357b0a31cf288a59cae04dd67107944eea05141f4f1bb5ff2999374bc797b7ea57f454075763cdd8d6c7fea42060173c86a4f499a4519aa343f7bd3b45fc16eef0549f8d07536f0e831492c9696ff0fa5d4e80000000000010040a8de3efd146c8b4ebc3ec1cd555a81aef523836bf1783319042d4b427b196d363d787a445bbdaddc670cfbc998389326b7280f2de7cdbe7a7d54ae68e7976d01 +00efae00d305a7126c3213aefef5c26e794f71a73491825278a4ef852edf271b0c91c1737b2d7671cedb4a190125c1415c5ee1b9846a5dabaf776362e0ced77c1ecea4002df7de9a86cd737bb4f3f3f2dfc4240a5c7c94b38ec290d8c52542329dc80ef3c66b3ecdfe46e2c867b67eb27bcf1a117b1b725e0e00dc4a70a8ef778dff0fa5d4e80000000000010040fd5c4b96fc977c4a5c40717a3fb8b5fc6c3552fbdadb30ba56af22fba6b4654d08ad62869ba544298236271b43d8decff40727f3ffb3dc3b6ea0a6ba3b50b50e +006e159cb902c615ce4ebf224c45e1bc12bee5ca2b413fd5ed472cc5f727a271023668ff198439a107eac13c13179532b9573e1a25dc38cb2fdeb2c949f539a013d727d9f160e63a62eaac6b599d175a9d7b6e33b3d51eef3a6740d21c99818623889c623ee55898b2f079401d9da768f6e57a13af4830d53c1d532344e041ea08ff0fa5d4e800000000000100404960fe51a7c3ec8fd80f6ff8475300fe3acbb51b20d8d770d282815d3ed7d428ec235cf0e76610efa840a2d4b62075dcbe9a4ffe4bb70656ec855ac378cf900c +007a0db7579cbb5897e1baf962e30ae746842ae9200a55e1eddadfe4c8fa96f819ce480e97ff88599d0193a97a7624569064c928c26e7c0257d3d2def0d452921a50cfdf766e03de65979dfc0361e607f36aa99f57df4950fd1829837da97db22d6e22c7f7a6c34f1a8aa33d3b457442c17499246bdc0d546bb0982dea6d11bb90ff0fa5d4e8000000000001004098168743355bb81b1d8ccb39e5c84b95745198cba0a341955cea7375af70afe427ed085adf255e7271fde8ffcf70de427f6ed021d9b82568c84630068c07cc0e +000b7b250c3fada67303dc2a5f6f06d82eb78f2f398cb76d6fdaf8fe559b1fd92b50943367e459764320f371b04ccba99bca5678bd406c999f8a20ecc0858d270cc6f737f5d259689665f22cad8314f7d7d8fddc21edced8b2676d2e354452371dd24b1b2ff4f6bab9d469d38690a1f65d47c98a07d8cd1964a604e4965254489eff0fa5d4e80000000000010040ed517c5b522eb124ddf2e649a8b4b8954c0ea602a68645ea31f6fa161b8ed0551bfd1bda0989c4b6f21d94cfeb2bf3ec28fc45aaca5b31fd099db5d9a17ad701 +005992b4f87e6347549664e88378bb3b1ae7910b94c5944a42807b5c4e43294c8b38364ba930c81554d0338a03513962830adc246f7e7dddfba348c6195424200f3b5b6b2b0dc28fbe43a31f759fde1888c6e8e05da2e322d3ca64a94f496d0803d3e49218ef98e5ef9b21f1dd6eb9a9586b040a79ed193a4fd35667987a0f1126ff0fa5d4e800000000000100407c7e916e6700d67194da6c192f9d2b5ed020781d6225628a48300eaec5502756310c62acc52d2cb9e1f151affff832f4008040f9c4ed57477c15c9e64cc0420a +00d86bb46b2ad89a224636250fa285388f2093aedd4197a6473e4cb70b64ba320e296ab62cc6758404f363ed9ca5dca1e6134fcb3e50ed1e989dae81700ad6f0137d68022a432c90dc18d0179ff8d43031741065bd948ec5aedd212868b7ba4130146e7eb7833bf1e3bd96ae0ea4ffe19a88fd69e0d8ed6d19d05f6ca49acd81a9ff0fa5d4e8000000000001004005e5ed7185d6391eded87fbe4ec8bc19f8f3716408a3a7895c471afea07b6c1f30ce7748d14457a87818b75662aecd3b306e120f11b0a7d9cc2e55c27b06b005 +00547c16f5083292db5d28950c53e4ce96fff5a6c1763eaf13e06f0f79fec532a463a2cf00d73af8ed6596e2d5a3bfb72afdf3396a4d102dcf64609ac1b49b132554b987bf6d3543a728d75042bdf0f693c1c67ca3a62b042e772b7ed29871889710383c9a23d9a9ed5f203314cd5a36c73101ce90f8a62e136d3acadd045dce06ff0fa5d4e80000000000010040862161201662a2a5a14950c90f5745bba328fe728eb6df8045a66960c68d44021166b77fe9df53594cd7ed0c3c133bf3a9494e36acf0ea7d7176f1e0715b170a +004a91a600d6ede38bad08c167bbca015e6d37342dc5f97ece0598cf3a9670088c4a1113d080bc021a067bedef56eba41fdec52dc0e7a9c4aa60a7ff0192fd0e1128e2b0c52024f1c30afca746d050f1036a57d5d89cee1319b420c51714446d13321fc69cc97f9f91600bc133194e3b68da5f6e6abc54993e809275a0b97ff793ff0fa5d4e800000000000100404868562792e62452ed6bd15e3c6f03998e4a8a93ffa3bcabc6eb838e13c5143f8efed685d3996be6e6580e3620f03f6102b3f30db13d02aed1facc7fe1fb4d00 +0056fa3acc16ab42d85c1f1cf6737c5b7848313aa9b602f585303d9dacb7210aa4ab714f2318bb2703e204b080828e4e2571fb51b2b5c1314be03f480179f00120c0aa60550b2669c7f008ece7e8003829f74d12e0b70c39b358eab82f95f6270a8862e849e598c690b8213b08715d0a0318a9bfc89cb2e1adec9d00481a4bdf13ff0fa5d4e80000000000010040eac6cf9e2c0256a35eaa82ce9e488eb6ad886cd8f84a108a13e1b939a5c70965fcd27e04414886e7aba99e8a14ee2001fb7b0e5f2b0f29d1e7ace952d8ee4703 +00601bac9a6e29607cd22183ed538ef48b24a75d8bab72186f7841c1b359a99e14af72ee23ec3b17bfb7e0515146b760211b715c19391d76871bb3670f7f7a1310dd75c63e7718aa3e42e0a0f06449f91110998701904a29bd289e798761d8f18a7590b2697983a5c6dd80efe7420282f324c3bb540ae5c2a52b78d2bef34e8412ff0fa5d4e80000000000010040ee47ad7faed34404116d53c788529b0ccbde47d8e37799c940688c1031c0a8eb485b7d50fe1a1cc3eb7fe74b12821f25bcb0ae667c09d299753526ead2d9d60f +005bea766b374853e5d56e2c48a9d02a7593a4f4c98e70b4b6155c5f872b3f5587efc24d05fca2bf6ee664887de546579e763b35a091fba2cb3ad4a6fc4773951a579d77f3c34ce0a55223ed0c5ff54220ad56e5826126ec308315c31e6fe2d2148138dcede05ddb789e03fa2f76f798a471c7ed85e1fec06c6b59c0c6ee684786ff0fa5d4e800000000000100400e8ecffcccda2c7580062c70f16890a07ba604347b5d2b5ab3347c72dfb7932711e417ae572b382e13d80e6373d3fb0faa47d9541a137f578600eb2a448a6202 +004adcf1c27312ba3acf2716c1d3def585060c0c471f9fa4f680425dc48a630529532c58ea5febeade0b1a51cf4b4395bcc15b7fe9d389a466063a280ae877140bef856dee36e1a3dfc74161fcd3373009dec8d0232a4b012690be00a631cb1727b3fac02e533c337c1c6bfda014ce917aefc768b4ddf8856c4a0b68b486537d93ff0fa5d4e800000000000100406ae24fcdd211e9bb148ea94e35d55a8daa0d863859d7622bbe3b15dc14154c95019e97a4657034d0deb02e2aab0188de5c93edc944968fde1fcc6eeac5600e0c +00c1418c7ef9544e41edf79cadc6c00a0c3d13779da9ff52a8e708b7badb75b68fae091424f4d2387e1ff8564458902ecac201be4e12171943b5708c38dbff1c009d2f50851392815dbbef515e7ba947cf8f66ec76389625a9e70d3c5316b370acb7327707d17690f6f0cf160e19ac0f6057fe0504d84712da96bb514033f50b9aff0fa5d4e800000000000100404559f9920f2a17f34864ac13b2657aeddef2d6586972fc1e3a76d0f37279d7164ef04354e6b61e0dfa816362f63975061a279cb26f00cf9e7c0e0be47db83208 +0084d8299d43a7420e4a8ae80b142c75855876ab8d8ca2a22592f2307637049aa6dbefb3c7a08d07f8dd217e5f5dd249b8688848202a6b9954d233967b2a162a2ffde365d7c757ed2bb2ff224d2262bd76c5fbb0c145544778478eecc26f96929da0124378857d46b0a5802267e87927f1a21e532fd94ce2320824c8ba20060a94ff0fa5d4e800000000000100406f60378b5e3f64534e75d67da49eb601ed6e4e84d6676703cca3e90b39048822ed790dfd88099fa1e57ac8e1bfc572fa4d57e26926c77479c5c8682004e81301 +005e60fd975810efb40cd37b0973a35de69799c80dffa96e85ad973c3d90ae909fd25ff9e66e05dae6c2d819fe0e82d3a3e29a16d8d1e89635130ba7532fb9d82f84a420aad69d41a6c650eb8ccf63d00b389b1b0a4a02048578656df0f4f46724388cb3f139001d6598f8cbc11b3bbe61a23d8b0a742b4318a71b69a1f967091fff0fa5d4e8000000000001004064a1f9002bfaca46b0dfede5497e77fa016d139947c5791da27b0cd40ab05d2a66849ee750615adc33ea48b915a289c67d4059c000353fcf374b57a2c1384301 +0038232f9fe4d667f69627750d21fc6a4358747f023198b5064fbebd4003826c1fda76fb2c0b68446f23863b1b7f1544bea4f7b7b257ae6c7e1de5279bb6b37b26818649a22274b95ba91e6ee6aef761cc3a4b5906c815d77c61511303a946d189d48261fe2aa5a571366b24f4b37726bc6ffcabcf23ab0b2d30d9f83ab38f3587ff0fa5d4e80000000000010040deffbf9cde3d19cedd3bc12aa0140571ba09065847a4183d5df518e0509c609c9e18268c6a3f1ec6431d27231ff394b01b2ef88385ce2613ec754c87e6f30103 +00e297e5c5c06102ece229a94fdb83ede5fa5373ff2e73af4a24217a550b6dda22ad159158f4045b905559b9eb82a39aaa1a43c175cff14a02e509a75866d7762491453ac28e15a8e88761bfdccd59d92229fd68c02b8d3d4c6db2865242750a897d79032eb0e574f236fc93e374a80f6cc5d8ea9c305bfe4fea0962153287c090ff0fa5d4e80000000000010040c474add4147c024fa731e10fde6b4e1c8ed1e9f90b0b02a08ee4ed12d6d14a2a2efaa80d68f2cc796287741df4164f83d6d6a60dba6743be779653cad396fc0d +00278b845954b116ff94e9c03d815d341c3d924f9687df9e9d87fe4928bde20ba5a40ad63159bddf4c73e2e44483931dd74df0dbdd33e225f73ed0ca3ca6004005ca680d78f9de3ad5be9cac7ce68827ccb24305029e200a792cd666ca6f182113027d7e99feab328104ae7fc7e897d076ee0ebacfab834a42c40399ea50829d2dff0fa5d4e800000000000100401cac2ab00efb45447b6a9d95acd62039e131217e1d5d83c9293416c1128335da8afcfec2039a69851034f265cbea529e029e019369bcef973b9873b9a281de07 +00b6c3562ba5902ca759970129ea1995dbfe14ad1d3bb67e6c3d0c8a667822d318e8f9e282f7c6973f4b2f8d22ee5f22203311a912d56d4b6bf31d062818903b074a8f490a4c30137e59390ef2e7ae9a00d0ccc031308d1b5197f6fa64c0eeac0e8f4cce5208afc9ca0b2755acfdaefd63a10389b345c65da3958a305ea727d80fff0fa5d4e80000000000010040cf03d6b094b9da8151e65946cbe20003afad42b104257f81dd0b6db392f5cf69120c5ef5d8fd7286d175bf51e351d62755428e2f2550ec1d93181ad9b238f401 +00165552033be439249b8c78099d7e7d98f75bba5630fa5ea48b25cfc6f4ff7f8b723c2fb8ec4203e6b829dd8bbcc042c1952b35c2fd1b7eac5e9e3437b6a2f802affd3428a233ca2393a4ce76f7a4150d72edd428c0c13a3cc4d558d054f9191ad6cdcecb3330f5c3bb3df83f73f043482fe9e0e169900f5f950d8617a9f711abff0fa5d4e80000000000010040d0d5f73c333501b746c60f2a36426ffa54d929ef99b9ec1fcf927c9da3ba99bde14ecc72c119e460b4bb2af6346c61bb26819e4dd890a10f286fedd0037c9300 +00a14bec7c141d983fc54d1ed4177277662812a18e56cc673cce8437ad0ad37a005751ceaa66aff8ec39c90e5cae61a8f3afe1931311727b14a84769208f0f921860e821d0db01f2952deacb194b4cc259ae21905eca143be918fc12715a7f2088f65c264e1733cbdec49b1787571f000ee0deff326cd75eaa333d5c6f32c81412ff0fa5d4e80000000000010040757d326c9d48f9729723da8795aa2f38f529388da628bfd1e0a83a05effc772e157b6550d1b09ed3160604e31d996787a9b8f25fa26b3df9564efaf1716cc405 +008eb816d46a4c62781ae96613f3c7dba219ca6928ca95392bedc8bb79227e06a3c764c3320839d848d535f1c3179f0a35715ee61e5f9afcdbfa5efe66f7b020033e296ae0c735c04e4a76df01cb46799d8f742fb7a5c755d9f250843c59147a095d0c99c721ee6004f4afd03d4d648730dcd2e016b6c5c4427a7cfaca947b4912ff0fa5d4e8000000000001004041c08ce61d6359e6528938cd40297b387837085c691b1220dc5464bda3aba4e2203c39d296eb1248e8823b27503cdf464831a598ac82a9642a90f32ed9958800 +00d7cdeca7f07ddc7c38748d6d4df04275d7ff843d21e03ae7582df760db3ad90b823ecff29daec28f2ab77e6876e22e710abb206c6142de0da5d2bd7ff20fa703bcad8e64c8d2811481fe8378077d9fd54e4997af0094ff69247903351b0ebf8ab1e428a1f73df1de00acf72bf64ad06d61c9a133cd20d51464435082d844f6a6ff0fa5d4e800000000000100402be98539b94db46dd84c66577edebd14a04ddda3b3013336d6de038d01106044e563e067c8845d54d22577ece57900d98219f3d0b5f8a185f255d4c31e443509 +00c9f15947f0b708a59c9d5bf9a7ce66965fe931913d5c961513689dd85fb5592832e01654b21420897a1f9eb454cbabc17cfe7af0a3f3198bc2118f46e5ccf11f531359a8af164908cc03a81d4ede0498683af9b7f8606d0c21ea7278a80cc7a374df6311619a9a98f4371efe1b765c9a71d272262dae1171526111d8e79e97a0ff0fa5d4e8000000000001004097e39104fd082da31b07429250afff473b27673c965d1fcfb0bf47639c6243059d9429f789b596f162aa7e84e66296bfa735d193db4f12932345cddb75282c06 +00a4fbe75ba3bb4acb297b141586383518f2ef4ce87160d1dd473323eb1ebe43adf67a133f61c0bba80a89a60ee73974103966fb20999bced9e15d86e07325c929b6bb1e150cae7126eb0d1033ed4cd51033c0f29a4f972e4984b8997245d93891ceb8314256c4b2d8740f47bf57d5a193c67132eef04a8b37c2390d148f281d89ff0fa5d4e80000000000010040cb7bf5df44b8d4bb9f95b1bdd979f76a3ad3177263d22f3540596404c61dcf3260c01aa464870e36ee85151999d4e166b179f071e97c167cfc0d14f1729b0e09 +00139edc132fd03fd7651de5dfe54016b2dae8a7083cb7f9baf5fd19c35f55481668ace518f6b9a2e86cd7242d9667d1774c06d823b5e65521676238013e010e017cf203ddba0f95472d4dffb0ef7499b9e9b14fc0f7050e46cd6178aa9447a315ac3da2610a448ff6f69b125149d9a7e3840cdb1a4ced5c97ea9782371b020c1cff0fa5d4e800000000000100404dfebc2353e5280934876dc78d38aceffabd9c061ba971d625552f258f40549c797353824be60e9e4c0463137337d213e9372d67a53fcc265d3b7c5c50283900 +0082405b49b60186d5e81a138a074b35f29c448747c46703cf2a2092c179510028fd0b5b978030cbe543efa32780d42eec1ded68b34546ce41e9635d854c3f381aee3128a2502babc88f8af086fef1ef8e7808c0fd7c09e08b7cedf42512873b8eeee90e4b91f7e6f0c38022c80e573f89549838f2ebe2e8944539daa858dd791aff0fa5d4e800000000000100406c064384cdddb6477309252f94291c860fe02ed38cd329c9355ad3d2d9c79a8c9ce21ec24fa0e597202af46da330a7079df2dae941fb85629899014b3346a706 +00419924a07f52deb181b50de2afa83ba327a5866af75e53ecd8df9100b041d7acf74dd23df05881f8f082053543c5c2945ceaf957df16651ebf1028989ce9f70d5894fcd138742c952ccf69ce83501a71809b8a063cc80cd37ed471b0730f8b9f937a8df198f98ee86316f41adb4a93820741744069cbb49888e2b8b4c9501c22ff0fa5d4e80000000000010040ce1f73817158ff75abdffcb1c7e6d477101eed11983b099396496546479ebaebbba56685553e3c4820ae0830da84b6f4432c558f44a5dd4632b413d360e83f04 +006b9c15ab1b1ef50e8b086d941588a721c14b386a8b98d23d2594658aacfc258b4229362d6fbea6686edca1996036b3e89925b6b4efa3253eb40d3942da69e1232ba72a8cba1b26e497202aefe6a733ff4fb48b361e78fa7c5ab99e288d4548974f1abe3a9b1af2cb10d95a7d0b1d80e27d73d2e3c312bb08b255b60dbadca226ff0fa5d4e800000000000100409bba98993ebaa533457a12ef5acad402ae2e3ce0b5b7be4010b2753570fe5e1099015f6b4dbb58512c04c5e8fdcd4d65d80a41ca81fdbb353e079dbe6bc26303 +0031f0c5188d91ddf8cb63eee445a4a6990f336f8c8f29188238b475023108aeaa41cb7c94a24e7c8741a946cd4ddf2f74922e5bea77779c1c450b767143eb200d62a74f8de95c798b2a2c40cd95b5762aefeb5172533fcf86357a17ff78dbee246f29a319d6fc8a00aad9620839ee7c927059d1f0a635f48439589369445b61a0ff0fa5d4e800000000000100400b99abbdce9a9b64d45dc9047558c22d0b03e682c7468dbc43606a5cdd4703e33e7a3c64b25f5bb9fe8edffb2da0e9e296c98ec51297ba535e3f43c64cfa8603 +00bb86dda08a077bf08721afb08877ad765395268eb277cff75157ddf9a85449b097f1ec47f776e780ca9581cd2a980b3a83a7865fd6c174061b4049255b361418b3765a671300e8b88cf7de7a661dcd84fba58d40d8e03c62cb7b4fc896746da0a62cbb9531590e478b446cae768bc65d9c9675d8c4d3dcb0ddecceedeaf229abff0fa5d4e80000000000010040ea32224b7d840f80b60196e5abd1993949ff3c7ff8c8fe2c700382432093f0e9a8e0a60b2a123abb815deee3b75e490a35db5868fa2605042691eeb9ab53a001 +00aa561dabc9e9c3fab0ec418df6b4073e8fc77df9a15112464c8f892b13396203183fab6e9edbc81e588ce8b277fd5f8b9c74166c81ec0e00be37ec3497bfc91d500a58d6f24959e1364222ef9c54a14c67ac841ddb4cb7b7cb65db091954528b93c72fcaa7c651f8238442653d3a4bdf1b0492f2e872dc0eb31d034ba982aaa5ff0fa5d4e800000000000100409ce7a54d52dc9b35abdba6abb9acf24e027e6cf906fef77ee5c5cde525dd08aec9f0ba13e518c56ae93fc9a84008c51c66f9d792fb9e1182f2225328180dc80a +0059d4fcb24e567c52beed06e0f449e14c36ab8a27bb0a203c396437cfa9ec730b860275d85ceb2736626d0df19c75f880fb740c1464e76164d58124493eddb325b514e33329245445292d53b7a5745c80243bac243dbbe1e0aab365377a2f9f278b60d35f3413f3c09d3164191c43874945b949659972d17fb2bdf17fc93e2795ff0fa5d4e80000000000010040a8e5b04dad59a927d600ea56eb89a7d2abd3b126c4bb04ecccb088c46a822135762866db46b83a573a50e4c44d59cbcafe4b809abf811eb32e366e39db2c6f0f +000232bde038fd3f8a110c3e9b16444fe199a9b3725d2360cb191e1e532c7d52b0506940a9c1c83071619f1ca0328043e331b978ea9b1e2b1b3e81a6d45f25c1182d41f4c62367ddfb0c76fe8794cdf75d8f2ad974016eb75e53d8c0b93a270c23d958445118919193db7f92a53e3e83b846dbf441e9b27dd91f420d5d96c7202cff0fa5d4e8000000000001004058f2c3d0138b1e53cf7cb587e0a5a36a49f26497c7b6c4c77828eec8b0ceda847121e1ecebc49bfeb40c6a3051935a123edd3e5eba85c1414b5193ed64fe8405 +004b871c06ee85bfb903d418879de0a62fccaaa302ddd9799b40893d2cd4acccad84e18369912a9c08abdd0f5f68f41534fc1b484aec6f612fce66200802019028141343ed90914ad990a66b0c50f0c702fe35b2d4f5b978c89c1f43fed6806b93cece7fb004266af9a8eb1de659907234cdfeb4897e814d934a211dfb91d19605ff0fa5d4e8000000000001004075d3f847515fae933d9376e87164fbcd864cace086e71d38d3708e8351d54698a0c6c2b3c51d1c001879741772753b5c0462b54828cfb197a75d252fb34edb07 +00436e6d738c211687f1f67c1e9c95355f309515303a6a785962eb741b6c3d052e7cc994449fe2d1dc3029701c276dbfe632f90e214c7ac1d7baab58e05716560552ad39681e88f17bbf3394a1db53be82becf1ff8feb00a9bb650865de0e33c27ee6248318e08543cdd7205adb4784c8d5fb1921c344f7b09dd577efcbace6605ff0fa5d4e80000000000010040921a864d2f658b5128342d8dbf9091a06a28e7a960cd777b1e717f09da148d3937c57520a305ba511698a9bfa238287b7221ad9c3cfcd9e786c4c5561b2ead08 +005f943b228f9aaa2a73644ebc6e76c1834d525525c7df05ffde07a60df21ae59e7b8f7ae9ebb53cf82408d79dc358479ff153eb3ab8a2feccfa4c6e404326b812760ca350d003e08dc1d48419b3fb4877f5738173876052e01e888b93f1e1f105e94f70fb21eb4227479213c3e721ff1ce838992c3272e342fb7350fed420e11bff0fa5d4e80000000000010040c1639827ceadd5b50eff3e96717b1561c90171169709399e38d385ae594d3cdf3908fce4ed78eb10c3a8de38c8cd19667762c8057cf3f7d48601e63a76c12702 +007b2782b29a5186aa6743a8b65f74b168375bd5a8cfc7908b1376c0328f11421f07cb5f8495f4a43a076c762679c234f1dc27ce43d6a429ad783c01874d227a1676d7d8eda13983640675118180c53c7a70484c91eefe10a4ba13cdfb4362f10e284263936542baa66f3894d8756a26642265111ce3d1cf72e55e48bfc695781aff0fa5d4e800000000000100408fecf96011aeadc96eeb133dc90aebe5e5171fafa4854c42360352898a601517e949a8bbb051ba70dc0d418ce8ff59e7bf45b1c657b7670693fff43230e0910e +0018de7731db1291ed9682d39385ab85bc4650e1c3983034fd0012ba48aaa6fdaabd70f6c537d64b211e24725b0a1ed344a5f2e1b67b0459900cacf74fd290dd0c751d5f484ad56fe08fe5f31c2efee97e5bac10a037a14c46b32f7c88840d8503ee3022a5762a5fee6e89c170ebd6da83b388dd09d75a470da59eab1fc212b386ff0fa5d4e80000000000010040b1781d8db006a05c92044519d1b9d648ea55c036da979e974b967a055a8360ddf74595f99a50d19a3b54c0f7bdada6840a061ead8e8c702dc56fa5f343c0ed02 +00b63095103115bcae330bff4b535ea4b85b1452c35df3f4bb0b0bc4bcb5d9201ecd2b268329b80a24065e216349bd29323ae94696cefb4b5e4f36881cfec8f2022c4c7360ffaf6ae2c39653ab74f4ff7460185d0e265b039f3388aedd15bba696aa9df04e7919fa38c3ca3feab4f309867eb3579f96507e3c786b4a3848732180ff0fa5d4e800000000000100409b329e8b62066ea31c581277f9f7a00470846714a7693768d5738c190cd1a3084682efd91d26141ff830d7c92ad565b9d6126c1475af47794dfb16a36d018504 +00bc70adc426f6db9784f80d95fd1e40ce931b08b058e7ec606ca18fa0bed97b9274b5aea8ac928261c9b4f8e6f8871cacfdeaa750e515d4d1ad11ef4b10b5a81fe215513c4ff678b1c633fe9d46fe6f41341d4e6bede2050a57a85cb1ff0df5047f7c7f11cc57589ba82da74607cb44f51b1f5ce035abffe00a65f18fff8a27abff0fa5d4e80000000000010040512a700e9f174f6f740c4e6115cb2798fff8f9a2d30e9cb8271491a7a6d0ff999ef17659bcea4b67f050db076c37d2df8da858e9a9c7ce64a9468e9d2188010c +00bd739df601454ab4744dcc9e0290861c06d88fcbf9264ebd87795824e8db679c0d3e058dd7549baae83f583a9916ff55626662703d66b9193536a9dafe25c50bd753594abb447c3e9f9f208df56b30b153700f9f2bb7d2812b9be416685cc520e292eb1ac344e86c7c7dc62caa8c3cf7c7f0a610d7f77b625f992a7a5bb3521eff0fa5d4e80000000000010040ff0166ca6910ae09b58fe5010ddc31022c8d2430a289c6a6778a19230cb93fb1f090cec30a8932fc8ca596b28d25d695cb4ce817154a12eac0e5c16a5ed6310d +00bf6ae383e2e35f5c85ad331a99e44cfa9745aa15aa4e26976bca9e30d9c9b8adb34615897c0f703b8d4553f69119c224074e74308ba85018ed53d16ab5094610ee14887e0bdae3767905b66c96e2d63ba171910dbb8ba77bf188fb3d20df8012fce3158b1684c6d862060dcbde4f5edc23b869a20d4b2a3e3c50e6fd93ff372dff0fa5d4e80000000000010040ba8a8237d4d96d7f8dd9bb422371975809a637af907f63806415d6739a2eb2f03a58aec7b1a2e6ba2b5b4cc814f25dfdba0cafb034edb94f7213519ecadc910d +00ceffe1569202286aac651bee1882bdd755d096cc5c3b5cfa5da126a478558993b97421e1586aeef33eab01062b92b7ce771df618483ac3f05df62b722cb3ad03e1766d5accb96a75a9d2b79ff138cd84645bcce34a312b7f1fefca326d63d2a12535c3f33a807a52b2d25b5344ab6ec1f3054cd2753a6e8a5457835a1ee7d402ff0fa5d4e80000000000010040ccc5b2d0483b2662ab346e2c98c1f61e9178a6a4b613ab2785d7e977ae629ac3c1b5f22d820dfc8cec8dd1d6cdc22b3c2a934b2c569ff329898300ed5770ed00 +00635bd073fcfb3383ad312e4e7f82283d16a5ca72993d680bb247cb9ee26492909ea2089a232e32215f154b814c16023f6d0b26db067e71addb8691215c13e01838fe7e5c30b8f29b8a767cfa93f8f2089f1ebf7c8e8cc42a5d7c8670b598c19041e8dff033fe7ce22e74adf2f39bef40ebc27e5e3d1eab8aba785d436b76d508ff0fa5d4e80000000000010040c45130d79ecf4c122413edc0947a5bb6dc45306dd647867660a7973a11f6278adb1c50a780cb1b21ccf1e62368874b64bff27d37e07da52968cfe2535f9c7c01 +00da591f904af23b79e9c7c3c6ddd59e9467c58a409266f488660025320caef1a1119ca9966dbf35a740bc0dbd592bd1be99fe3ccb3ac5bde15420c19b07aefd2f4237cd1a4093a16e155bca8a84d9163ab0e1375b371ea14050a435dec080aa8ec7cdf69e360cdcf0a845c5054aab202ee4af190c9dff0709f96b47624323891aff0fa5d4e80000000000010040db7e820553a2a7bba5f00d6397d253e30c1f2b084198c353bd4975e39e040e59ea8f2207ad6d731ce55621b9de1e765149b1700246820ce5d9cec4a5a5db8503 +001904be5290ac3b0fde158c07679404189590d1a04716ce0770f803db7af7bdaa02d5b479511cd59ab62c82ec8a24b8ef48f728d2263c6252f78eb056dfe93b11bd7349feee849493f9f7a205076f99d016d2c96b5345658ba2531aa92718de0448b5ca01bb24a315eb5f460cbd97646ada4b3acd6effafbd043ce4f08555b29fff0fa5d4e80000000000010040a2dc23651bb798d984be304366828635a128c35dbf9b0a3a214de601944c902f58ffbe49663d07b0d4f542189b0ca40fb9e245f9c2c228e51f046949ce4ef702 +005cedf2abd3ee48fd42dc1624a22e1e58f0419b0642e53d601d57c90d1e541f0803f54c356399af8c799cf94e57b8ca9c590a12fde6f443296ab306f2e80eb6280b7b8b453089c2fe5e1c87d472b6588aaeb01b118962bd1087f97a92a195510b13c35e726966c38897de70ce98b899d35fbb1da0affd43f86477f1754dd83b27ff0fa5d4e80000000000010040274790aeba25d53f005cd57ab2c5df24b0673038c8f95595d07682b237ec7ae08313eadca8b448ca23a314b00374ea2fd937926c64bce50d504a6cb62416f50c +00dca26b7eeb00dcb7786d05ab70454719913fa730cb58ee1467581f04a7f0de821e64e702500cf5c96fe1e2cd18647d4d1f669721c5d3c09bcd30c39e9ef4681f99d1c017dba5d9970460e101529bd79060c5a8602d1eff36e7f020f05842442585b0e9a205cbbd5bb3ed0653605092af64ca8651c388b24ea7ee357890d2e72aff0fa5d4e80000000000010040fe4019b893e0638852af66afa203711acd340bbcf7e9dbbc338d3a558b8a14ba15cfce806fd3e508b9317687076e2f0ba060f5e674ef8e4cd86c68ba048fe90a +00464fa2d89330f61175587389fa9b2acad7591007f9c1c1e58d14628c213e288440d9f11ec83993a34e1d824a7fd2fce30df81ca8476595ecb4ada8693f46461fe9ded16434eb14ca98c0c45a197e74223b8bbfb521c6c626e00f6081718919afa8ff12b13c819bbf90d8b494a3c96bf6291b2ac5dd8eaaaf36e7fc7560290d30ff0fa5d4e800000000000100405ca2ac8b375749ee7d4a368ff2594e70844253ca89c449e45c2969e3054ab43ed146e9340e89fee6b6bc3fb1fca2eb2f2bf3a6a84990d1c0f8b09a35df952208 +0023dfb551c868a3d1b13c67fa4f1e4ee0c79b386dc9c5cdda0b1632d324e29caa7294a3e6c35196a81c4baff209d5e801fac198bb6f972dbf4748bbe53e83510f941f50db04ead9506407d61f03b82e337d3bd89c130a0d46b45425d9fa555e8b7a97f0b0c43c1ac20aa5a61b142cf14d1f33dd91acaf15b2c875fab485b4ad2dff0fa5d4e80000000000010040573a057f6ecfda6b62684e8d761289c76d82c5b9ee8a2e7f4838bd1e7eaacf02c47bc57e6cd9f00a59d9539485b2071b30431e34f57574ee955c21e1bba5bb03 +00238fb592929f25a4da90b8085f92eaa222d7044b64ce1298052a487f9ca05ea552da5274c7e45ede6c3b74faf5e3667007d0b6c0b7cc044280dae942beb9832857b84ef7f7823cff9aef30b95de40a2623a30be856ea398d7de558a9218fed25ec3a915531f54e759b42c8adcd09baa9af5c8f6f2d7db232ef3b4e16f2e6b116ff0fa5d4e8000000000001004033c7b1ca06edd7eaeeba9912d6c7749235774ec1becf5c57c50092538ddac282d3551862ad0ed025e686cb78fd4db0798d3ed33bf9795e2e5aaf738b2ea2210f +001c228709b234028a54548df93686076a29e292ea5ef3e119d937f2e3a0215ba1543c176ceb30de80fe84f11c45d1e7a73191c20a966ba55339f0ed2e32270b18b210b2c716305eef06d8997c8a560319b8fd227779aa7bf182dbbdcce454d217cf7b95c73de80252afd8b717ab2a355060ea40c44da629afd3d19f05ad9d7585ff0fa5d4e800000000000100407263b4326e1d2dcd8fdbc993cddb3b22f0d4a8f45ca52bea8b1300fd52c09d33f1b455ea158f85662fa0e934ac47be0ce3fc7e8ef0a3a58831e9029f6c55240e +0019e960e4b5c457ead2409a41416b37ac73bea8a4a3d6b00f57ba8a597d31f11594c8a7a909d5e0276bc661152796b8244a3cd6955aebeaa2f85983efedcc2e06cbfb1806fb3bfba8cefc3e72af7c2592f8ce733dbef64612c94f135768a096264c09bc4703e7492780cb49869bf71bb558c35339b99e5a6e7cf00ac8517dcc84ff0fa5d4e80000000000010040b39775d7449c56cbb3c6b696d61ec3b8d45786400f38f21bdeb0df136306f78706cbe6ae038561b7bdee17100eb072153de8f0100da897bae1d13031491a2506 +00ed40993b89e1551cafbe7e8822cff56a56352510b3efe17da766ceb459e07a9ae1be756daa39903807a5149823486e5f5060dbd4cd51e3a3f78abe9e65cc321f50d23da6ec0d9a5699d8d8cab6b2c52270adef6bc11fe3e8e9e234c1c786618e261790b843668da08e68c6c38ac379623106e746a897476f82cab994232e1dacff0fa5d4e80000000000010040b1204d3fd918622ec63e0c1348c14b500d06a836bed35ce59dcbe234572e4eb9a4870edb2ed447c2408d03f9712740f7944f1594af39a999a72a88a9d33a9502 +003cb3fba8200ce2ccbc603136dd92bc3d796c4556c8013b28aee639dd69f38b814dddfa58175b4b0c8cdb24fcf5444e093325da0aafb347f4fa9751f0e414ea25133da8b934c62d7266cd79871274497399a1fc0c4309a44686d12d4571867d928f740895ac3e9c8eab69e3cc21698dc351f10d6035cca0c00937e90112ad0b27ff0fa5d4e800000000000100405f1e490a9bb79d623fa632e781db82f81579d3ab7197baa0ee002b1131b6ea91f1df18e96e29b3f749df8eed91863c1899ccbffc3446d0216abed24b1907ee05 +00985a906575dbecd861d3351a32d2d6217c26e310d583881957659248c985901630cb39f354478c09b8d065d4a44d54fff119b2c4ace601eca96c3fb74c90b306efaf9fa6e369e8207175d458b64e09dcbfc55b1226b36fc27b43f0fa8c2309a13164e393ab509275ebcc49926ca9cfffce6c9130c146177a6d6b1c94a45b320bff0fa5d4e800000000000100403379a74ce13595b85a636f9772a2c9aaf7bbd41833a787ca1b8c47ec693b74aa47adcea726691d9309588301d9ec73cea2949effd25926300bf1d2d6c1482404 +00b57218f11bba944e9886a413ff04070cd62352628211f711e00f49ae228a84993981cd56c568edb3d8952225885359a92bef36b15663e9d255f9367fe0a0c613deb4576b255f6184227d3ff884756c354f0cf10e3c7f6225d19761cbd7bc4e150207599184f4db7928dc15c2fa94ddc003d8e6dd76e6d580e98b10ded14c139fff0fa5d4e8000000000001004034d724ce0c3cb21ac29e3ea376761368bc64d107971d4de7fdb39cb5e519f53d6f49f573f8b6d9a23285fdc1763ef4822a30b5b264456f07d232749718bb2407 +0080a73ba85c086d3feee2850b35c34becdfe293fb73b9341dcb1de4fa094e99202bfe602e35e60ea82233e83bf9c91394684a7e94fe4821e2df7b2e79ac6e7c20febbf99abfe6875ea0529fbe490c33aa74cb281bf1b43b39fa40326e037e3c2307285a41d6ae16908e7b2353fff18e5c18576d07dd2bf739fe6e55abfe5876a4ff0fa5d4e80000000000010040ec4a3518c532e954c354e8be0cae0be03ea9461b6e0f8210cd4dfe196fc8e93f254bcd427a1ad9e638b2e2aa953d7adc55cc29e9a6205895e98ba830021d3e09 +0069bb2fac4c17c8fce172a43152fc3ffb570f310326aabb0ecdc02175b87aba8078fac31b772a49a12e3e158103dd15a6497651468274eb5bf1be623747984b19e25410adaf60fe60a11b14a9c30ef465dd62d39922d5c926526b6b92f987212a8161b04095149b7eb1bacb68ba3becd3debf68aa5b0decb71a9bf691f2096da1ff0fa5d4e8000000000001004017023609703815d78483586157963f04ccf58bcbc9d4d05a81529d9251466735724fe7aee4e90902db235b9b9c6491f92e1a31e91697705821b6f2cdc9232f0c +00cf67b86bbe0b838ef9956918b694321fe2cbf95a4f3bf4fe19c5e01f1404bb25c83d4fc8db2f5241b69adec6e71dcedbb65f89fa2f0bec899e0c057fb9d78e1cb6d43b24f3627808a3bd1acad4e063874ffde74e826e72622f4d622b2086e81264cc22caa219d7651482728f1b3b839f9784027752c46e6e1030952c65d97a18ff0fa5d4e80000000000010040c7bd39a7ebacc53e7f12f2f7100abfd6670605842c41d7cd8a20f78c69912ebd6694ba0f69e0a583be499ec69a02410bfd7024c6776aa61008769aac69b93f01 +0091905663f131209a223591be0f84894ffe17b0c54e8f31d2c907638f5c757d832c15b2db125886b3eccec81410d1dc4d651e2354c2bbde3eb9532dceecc8101f4bbfba44a3ce604951bbbe88dc97923a325e805f464aa4816616d94a4bd2880dd986f2d15cf22c7e98470bbe90ed5aa6c8ab847f60d9cef656fd0fb0b4cceca5ff0fa5d4e8000000000001004062ffa82706abccf241405da628ffb49c5357677112c5ba2fa231f0e34d9fb55e33da1e629109342f352b70a1adfa63686a2109013f7cdb557f837a73e026a503 +0077a73dbc61e857ed36e762f7c204534a0ed96edd89a4c58d1b5ee02374800d0bcfbaedbfb132a13184216d1210611208c479f8605e1a41f2df0a9f60f7e4211f5d461606f03d76241762f1d6521cfbc501601eeb60a52b411490a75f0528718aa03807df6bda8ed8f338f65d82abafc76b97698f2e5ccdecbcae24deb235940bff0fa5d4e800000000000100405de4ab0828a5d2b7b98ef0b9a2867fdaff6630c429d36984935842585d71153535af4b73cb14ed64f84bfdfb578251c7eaf87bcce58560043d4f7bf4547eb206 +00ddb76af91ee4b3e89447d574de885efcb3c51261785e037f5af8e03b4ffe7fa43d71e89a9aa2db2510f45c9d2d0b9c724643ffa6d312572bcd8a1b9bac86cf2946d8b2800671f2d6d61ebd07fa2672617e8bb4f3318330e2372a4db331765891a0b1ac833b0c98e784cdd2004b6287e08d7e4e3cd6af43f9ce86553c2467b922ff0fa5d4e8000000000001004040ace0098f2e57935ab3fdd781eb6fc2c13ded733d8cb8ec72e5a29ae23f35b3809d246f7ef8540fc16cd0870ad6eb49aced1a59ae9872c031a40f673f612a04 +0065872214d544385328e323965cfd6664af71316b452affc7d5fa621bd7f0b005a0854c12b8ceae470574067ea843709c99457c2d69edc7ceff3e006298f69f1edf78fe6699742d22d811b7102d9b6a903bf1b012ae569809ce921e35e333ea9cf0dc4166ea7ec6d83a2888428b90b186fd9618557f449e352ac58aaee665d920ff0fa5d4e800000000000100403238f669339438fa53ae93985b9896c139b6e498a5f82564c776362b777bc4c2ef11b5ebceb52345729e41c0c99324039e90592c2cd63a91c0db7adfff0e7705 +00b8b81659c5ea760c2877ffa4fbdadeb7274b2a8fff66560be6db2767072b271c80bfc9ef19ebf78c3cbffe070b8b9791ec6450861bf8741af6b87a61dc58d407754fb8c8e15c22a00714f4a97c1e12e7097a0537d314769d2980a20cc0df61a66a05ff17e7687064a4fdefebcc0ffddd76dacf86cf6670979020eb0486347f9fff0fa5d4e80000000000010040d576b628cd77810bf5ec0048d8a93aaf813df9fff325d24db408167861431fd5f1021e38a336112533ebe2ac311988af5c19b1e7b4be598397efd168b51d9606 +009e4135fe431befee85d34527572c0de405f6b1c17a2bd3b4eeee2df2cd7c3e1df31e965398d744806926397437950c19c93f8d3043a6088171734054f559da0b6e4d183b1826b453eff88c21a032a2f19ef21d41449828ca998d9090d9e5c3878c1d558487532dd486696bfc294c16508cbf5618aaf5a3820876ba4a9f0f999eff0fa5d4e800000000000100407875d21c54c955e55bdc0c0f40fbee8ea0366b4d20f5e6360a37348727f59bfc84e54a45f957b6e853c004ede155003b1a8c51fd0c1b00be67ed5be683be8b0a +009ae4cc6fe2242e7958f4986ee2cfefd336938612c70b8fdbcfdc0a790a3f7d17d344916fa6fa104f473aee069d2ce0883358bac7fa10614aa541391f7cda7d2e4eeee07bb0221bf9b8a83e172a95fa35849a982ccaaf89b1205cde4b3054ee9aec90bbc673b9805c147a33cbf30a170d961beb8a6a62e1a6c2ee200ae980309dff0fa5d4e800000000000100408fe0361d7b0853c1d19d96308ffd88e63b70ad5bbf6f05ce0bf95b25315949cab05b35046cff6baf835711de54940139b739b48cdda7196487c2a3e07dd31108 +0002d4f1eece5547cecafc7d3187a76354a1baa9b477a0017b41e0e1b1bfe0ad0931a64f301d21a07d1a7edc4add55fc145097de28329f8b1bde324ae2134daf2d1124868d410914946a52b39d73c8774d82a0f4ca61ac7405d547ec0d49296a1324df39e529e547a4a1343ca19774b228e3d753c232a2ef190d6ecf5ce7b50c14ff0fa5d4e80000000000010040005b9c0cf299168e82948dedde6018fc9f328e361530f0e4d50f4c15693532024a2e1edc1315b318f4584f2f3b7359c626492540d95830f93122a84573fd6702 +0071a6f7fa3839b6c7ce453e188322772f5f991b616340a6e7ce61ad17e53a3f1b18a7400b868902d8486f99101e0cf75eaed9f310c036f835d29e81e1cad196107a6cf7229f5bf1f90ab3cd55280100f8a8a71bf5201afcff0563dd893e54200e686573db4e382b03aceb27cceb45071c641bbc6a7cf01853cf18f262be807bacff0fa5d4e80000000000010040ffed11ed4507225f945f4eb55206a305506879fcb1a67b1eb55bd3eb6f4843ebb12bfdbc31f380e525be8ac157c393d9c8cc169750ed8bb09aff46363622940d +00bd61958212c59d2de4905b1982f72fedf10e19851954387f0a0bfe3b0cc7c68d8dcbef8f6586e05b2b415798fbeee05b957653653a89852812315c4a4ca16f294b80bf371795147f12d76a3aa686d9c22b8279b4709e66d892c1e3182251d22d936dcdc6b04ea3f72c4b211baca2f0ea6f676cd7ad322ae5e8ab2379c369148bff0fa5d4e80000000000010040dfc579ba2788a454bac4233e111b0272c4429638e7d521b9706815345cc198a90e170d233b2f131c25dd7508ba910b0dc4f5827d4f9a3ab3172b94f6d90a5f0d +0078685d18444bd6373f3041e59335e62091274b010183774a29dbd3f11c634024eb312573714175b27162693f07ad718e2d880eefb9823ad4c759d240177fff027bb691a91195c9c2e88309a7f23dfec1febaeb58178f85f0e959c17bd331f785baf7f464e2487d2527494fe22e3d26097f7be5d903ca56ffd7cdcfd1048b7a05ff0fa5d4e80000000000010040aa57a5154fa119b78067749dd51e488c2adad9ff48588cfd08b170eb5964634082303eb745fa20d503553fab4ed9abfafb76dc1f470e95c608f722f4aae3dc07 +00843ae46118bf6da9853660ed1d26d4813f4658e387e67ee32984b7e2f563148dd22a68ad58401bbc059e5298083320e4a740b8be7037df80b5fb2225beb4f306152c5b02759e8a2cfde120d23269132f335eda0b71b17498ea217644ddc0688d3ef14949ebd1470a164741706931078a8366145bece977600f4249b49dc3bb12ff0fa5d4e8000000000001004075e97862bff0994c2a0e05dc095fd018758d6c2da4ccad97320da8d3f32c2d6608435867fbca9f8f1de96104b93bb6a534affe7713e222a41d3341b674df2c06 +005bd59d9e8043f231c8dfbceac4fa3a255a5321ec436b9cda19c376b2186bf980fcd89f8313c5aa5ccde469244da343fb4f269fdc16eb8bb15002fbf582df212036d98cdf80397a5923adb0bdf3a7ea37f3d79288526850b33d781b14e1dfa4ae0b7cc77055524dc0afa120b74130b49a0abd1d1722e2c39ef8d1b474c9f1c703ff0fa5d4e800000000000100404de087a84046a2c8c1128b7c352d3c5b56f1b114cd6fdbdfe1e51104c4275d95c2669a67d52e8815fbf499632b6a12f022d3baffe6f1ba3eeb3d1bc8462ab800 +00d18e081aff51b27c4f3c3a1c5d37205cba6ca68238132f1cba5c70847861390b3094837d5ab9aaca931e29b6cec581ef803bb1466fe8843a72cd57322b9d850c1f3fa88340b874dc413f009e57ba691eac38d5d5cde7a7f3cd3dbc3e774d1092777393ec6551ded2c5525913b071b237f6ab3f71c313dea729c3d2a6d002f086ff0fa5d4e80000000000010040e7ff11d455a960ade5d3a03aefe579ed4c8432865700d577bd17865c027a7b42af88e28f0ecc5ca83c80c74d22ade443bf52cff52e6285877474501df4c73a0e +00ca24e8905fa89a44beb6533263159799bc58d6ad536710ca152882166c420a0d6f8f99296eef516dc86e9c98d1dc23818faf1a09c0ae4e66a7e26664a8bdb61165006bcff01a38e367e6f71686debcaa2eaf5bac0ad292934234434a385969832d996cb65280957e5a64d3b68207e39aede1f669a5463031da03b3b7d164bf23ff0fa5d4e80000000000010040591b50ce9ecd712a8b49aac625df993f5d29f6e9ba17433342b971a4a0164c03e1cf9dc49caba5653c236a9614586e9542d13ae0e0d9bb7841f84024b9214e04 +00d364c48b63af8bd2ffbfa5a5d50b8d4b8ceeac5aae4f2c3d0d374db64bc93d0856b2d45cf6430116ff1607367e1fec741ddd7fe1fcff614d9d9213aeb02d1a2e55fa24de502f906f16058069ee4589c6383e53a665af4304d56eee926ae7b623afefe5d2f0b298564b2acd10d13b05a2d31bf3641046a286ad65cc923526d084ff0fa5d4e80000000000010040acbcc0eaa5654857076eb37bfaacb0f2197574abdd5c2b03a396ac33169b466416daefb30e56580814e35e1683795742701a90f3a4aa71cb3d49ec992d5cea0c +00f581e57b98656121358e960fc8b4099258b549a98b899dd51c99c44b0068e51ae068ace72b03f9c21f6db64499802e07b8c9ac23f9681ee9c816f7e085c56e21728f0712d38e5964d904ac0f3a61292e5dff5192ddfaefca584da5829bab8321cda05413b1fbfd6bf3ef24e939ad482fff8505f3afb08517273e2ac7596d4904ff0fa5d4e8000000000001004046c730f81ef4eeb52faad1440da147113c6493fbe08406b81d93a3c20f606905fe545cea0591204aa160415c7183ab9fd01f125f16134fa7a58f582a0c375405 +0000a945a92b44e484ae6a3b567626f679ecabe34d5890d2e7bf5b0fe6e654ee8ec2d0a723c15754536e890a9541040c2f61ac8e3e4b625951cd9a5bb41ca02b1ae1c6866eca63b0545a4834ecbaa71fa8e3577c17759e31e4286653e4f4327e1ab110df9800f4accf45b292a8838ca2a64f64536000d37b7af46033d12f3c1405ff0fa5d4e80000000000010040814ed5f8ad9646545220a37b89ee128b5e2401fe10a2c6258c6ee3b39d55e4f4496079a4de6e039231f2c45f67057046fb2f14ec156a44900e4f5a340047ce08 +008fba7e3f8cd62814e2d0f202ff0c7136b04d403ce79d8f41101fae05e485858e751e22173f4bc05808fb8e7de1ca612058f803fcb824cfbde4b54be15638e90767581667fffd466fd939e4830eccbab366f08a78ff9b1406f9e0d9e59d8e4a1b097ca7f4f39b2fa107420cc47f6fbd46b04568e5e7ce61a5c59956c70be57daeff0fa5d4e800000000000100405c67d92224cc2e8fe4743d57ac7922e72245c18b32aa5f5b83c5107391ac29f13543effe6b8288f3cf663e6b5c6406d30e8f975d8ef9d147187dc62a9119b209 +007885bed83fe26610d10e6883252285c645dab4e50671c5e1639f04d80004e6a4a59f606e21c668ba074365e8a0bd98952ea7fca3a14fa29020f8462f6a6ef81f140e50d3be8bfd491d974e18ddd27c1b4f1f710e6d5c0f5850fa90f62dacee2fc9000251f9f43633ad58f9915ad1896e5122302c68842467ba7749e85ccccc04ff0fa5d4e800000000000100400383db0345fb8835a2592069eef5797431f312c598c9965a601a2142348a0b55f4c276fe67f0363dc95b696a754fcdba4e777468411a599c3ee70f20699a060d +0081553de72d86337983713038e86d594147a5221854dafe51709bfe40fd88738f482a999ff960ea98c8bf2dd28d68f69ae3b6883ff7d60196d5c5b0f65dd746205523df5727d601c35625c3552a2b30e7b5528aaee8e5f1adee0631647902ad2f1608dd6b06571b9e40fc009c285edb364252bc509a0862677aa7f59e7f25d196ff0fa5d4e80000000000010040f8bcbee5fb7756a85db774752c1257d75a6d4a79f10f58f9bc43f2b3a21e7d018111009fea10e94d64697af9865528154dec89baad017805972ed21b17893a0e +006533112adfe5fd03aae08a27f8fcded068f7efef848d51e513de93dfb267278929bf0af5e182f08ce992a5d41254056139d14d225997ce87b0d6ce60fc9b4726e35a86087fc2661d1669905c291939c0f883b3d4a8fc2681fb1d9046f918ad81920a9374740fa445d995a303c25f7c73737d821d24bb2fa09f81f76d473f0b84ff0fa5d4e80000000000010040a740db1f63b20671a7c3e75b170df420950ce15649a442d5f96af738175abead8bd0ca26dcf439575cb5851288074e7bec4acdac63d44398fd3e34cd14ad6908 +009e59da87e94afcce3c738c66797364fa563e820538576a87185cde4765ac1e23a4f510ce0462b5e92aa0293be9af9636a3bae99ac844e7593bd446b4b70ec21af8eb6be54159e2d5b3167d765120c8df37905948188b52d92945baf02ab4eba6ae2e62c2589b9f8a1e963fdbc87a69f55829cb32af92981a6c6998b6d2a0040dff0fa5d4e80000000000010040d5cf0da54f861d0fdaa7cfe064314609f6e34ff628886ae6b0a4be77d6b7438a37e3806c23e552bb0d96e84a67273c603ad60030c4a432c6c0e5a19ade9b8505 +00f44a6faae795ad5f8595bbe0bcf6377adc4501845d1c9d19d9cf2188c7b4dd104cadec8d356444d05f5e205049ce60bd565de30a0a0f53c21b8fb2449fdebb21ba41e34a3e482e990d59dc6a33c747bca167ae2e42e450d3fd3d02697df44b8b24b3f7224af84328269b55947f671b1c530c6a8f4b25e9f7f7f165d026c39387ff0fa5d4e800000000000100402f8eecc0d05de1c36e489fd773e70a6c328aa8220c2972f8ebe6fd7cecec32e20d39bfcad9597794b85f54983c6877b3f5693a94ec302c3e90959eab87df8300 +00fabd2e53068caf9ceef8372bba90ae8521db57a10babeb7d3ea549647fc80bad13442ac8366a2fdc4a11d94caa24aa125b3755558275bf5da755930561a18808c96fd1cefdf1c164fa751ebcb0e7dd2ef28c848dedd39e972e916c963cda5104b410545f43de2aac68be7873ec1ee29f554755fd8e6001cca2eaf169dfbbb317ff0fa5d4e80000000000010040c6a44ebc7adddfc588b2f51500a990d039e5b3a2ef5144c0013f5afecee6c9ebf9a225ded36dc0e7e97ada0c8289786a926dcc1d7481658d1d3a66db6ecbf70c +0002e9f54e7ec3078f91949d2afaa1efb642d32cddd2931278b43c8926bb2e772d6d113702fdbe58176b276850413ddfa46219a26cb27dd0ba369fc794063f0518c7d7aa04ae98d047876e6ca77922353637a6b28792b1c09558befb263b0c0c1044e52da15a8fcb40617e2d0948bf8a8f55057d99e15d5cc07dc7676c68163294ff0fa5d4e80000000000010040188635757264719f46093581a59198d38b264cd3e2b14a6781fc99cc0f684675c0d32e3416fd35c36c6a02eabbeac012a1d4aca0d684852a1d4b48d908c37a08 +00543b883381e2f8a7a3eb1b969081e00596964fe99f78b660256a4926d47b5d0ecfc860b7920ef899ddb4afa666f699cbdf9afd5d43154696549dbc49ce4d1b252f0ecd349dfb1ca7d37042c647e9e77611c39a2f52487365e4564cda61eca5810ce74037710b495b78e9476a1dfb459874ce09756c02a7b341b1348456132e04ff0fa5d4e80000000000010040c6eedad8fe8c117531b9315d36db66b6135b93d1977cd8bdf460b5ed7a18cc7ab945e7dd723b04de2ccdee11973b05511df8cdd8d7dea30ba5f99ff70f6ce80e +006915a3643e34f0a2f123965617aa7f208592caff3cd4c44e4d8bd88b2730faaf224619d951759f4fbae3a73c8e9783fe2c89ba6478834e807dfaebe93e394f0e9e900d2e3603fafd26e26d4c0615403c7764f9542744c8f280961cee5014e99cc5f3360757118ec354389c9aa0b92c083fecfc8ad5d9aafbf7bd95b5204f7921ff0fa5d4e80000000000010040f55d755ccfe4c9794d50f655fcfac1e022cb63ed8ac54611168504526a8977a234ab8e86e2069a0a61db7504532b6a4a7d38ab31d2104fa48df50f32f7e3f601 +00f8df7fcd3313683f9495fc5a55c27d8dd8c87d7f0678d82fc37912f036712b97832e204e0740f9cbfc5dd87c6183a6a9dbce35229c0e0fd4d33f3ab5f33e2a173d7adc6fdfa14c6041bcf82f00909020d0e66605c43dd9c561d75107090d78a49e30a444221cead46c3754a7bf65506e409b9b6a438a112ff6110ac81ac98e0cff0fa5d4e800000000000100408c29a4d8771d8079626895f9484004ac8184a0e9c720744c618b964ad84094922cd0c9e4349ef6b09d7ecf5c821fe4882fe446cbb9e2642dd72a92dae7aee707 +001b68d54476fb3b253bb560755876e9eb96b6830ba487e2b2b5bea96d70a1ba9fefde25e8b5c83674fc43aa6b455edcabe75da6d65191ca5ad01c9c07849c2f2f36ee2ac7f962bb0e4e85b6a2177c70da1c6bdec1bf71253aa35bc137d7ee7a9fcd196bc3606a241867347f5c46dd9a20f39a83d00ab2ea594786aad331026686ff0fa5d4e80000000000010040894ef6612618705df37a7f86a2068f7ed36b2baf0e8a11c9fca2d0b41f2e32c56fa86e9d1f84374f69d67b2b85b5848a02fff4ba5732a2d9bfb51572e8a10200 +0005152bdfac2053b14c04238d9c1b91a28553aaca0fbf8311950807270726db8ed601a76cc3874b2bf6edaeef8e4264faa4c1333c93e3b242c5f8f8857329070a514183516f7a5a81507d1e2f40fbf7c45512a753bc8a6890db86028fcdc8ac87aaa551ec9131dcc12cac541e3385245b48f2bae545c026f545d3297c9b8ad523ff0fa5d4e80000000000010040a332936be8347417261b82003035f611c7b76b1ce821ca0c89845008b7c779533b74e5011912015596b00d5a5dfa1706a85f4a7bea89db32672ec77be1caac0d +004802ff61f5e9c5c8fe5216a6a27af06d1f82ea10f2b0a10333a5856f95851613813c361b691a628ec3f9878826a9950477036c46db5ded2f64b28a87d29b63204d1ae1484930f10723082264cd8ad8aad731d723753ffa2a8ab3c7df7b419d2c32e392eb3f592b519fb6f5bb1df783612b39b6fa864a3093271797f370dc3183ff0fa5d4e800000000000100403d0fadb83fa90a27d8514ab7494afae989c5611a8bca5359840e0e7fda87ef0fe0ab9bd5887ee5753e6e8d9d3f44299ace9216311f6711f747602e4e5280fb07 +00be5de564ff7e722011702b36e1854f92856b419eedef8e9d1348455cee00169b7b3e4ebd169624fbb2b5a6451ec6b1c0a6ce7df0838dd60cdb685a09f24bc21ffe5b53cec5502a1fcb240fcf8e6903b3fcb4c1594734e0bac8ee561a5e7b55277e836da3a826ea68bd30b55d0fccd9828d797bc53ce0403be56083557935cd9bff0fa5d4e80000000000010040313f5c4551333d71ef59ffa396be0125ae7115748b197fd2cc3609081ce41920b3a758bf27084597d976f12ba51750d102f73714aa5eb78cc42b0edfc1fe3c03 +007de3bc99b5ea53845aa30d2a0dbec933677bc7b35e7e4e45a253302988c555955cf3d68dcf1d155fbee59035a42dd6a41b044c62e09959a7f6a9004dc7ab74189708466b35ecdd74ecd5400be30031fadc2850d8df5e5c712a0032f1dec78c8a85549c86bfb41f80b543bc99e7f5c0f9747939ea7cf905c5c9ce9455075601a1ff0fa5d4e800000000000100403a42987e8fe41a1773c6f6635d45f23336baa3257c9da1d77d44c731b659c2b98a87ade0f7124ffd368c5fbbd7f59a7dd1956ce95af9b84f7e98b5ec35567c08 +0038011324b3ceee239e63895a13dc739da1156f23c6275108a552c3de61a43c2cba69b7475dbeda07dd29e519d4d92405b1127373dd140d427240cf5cfb405120670e3dd0c1947e0b94518db50f3cb5a5e9ff34daff75d6ebef65c32ca38d9c27bbb2e7e6a84e326fcd805df0bf5f1601efc01a3a49c1921bd9f790b9751017a8ff0fa5d4e800000000000100409496b78fed1f5c0f0a5e692a2f75ade93b25b95cf9a1f26490ad157375c1febf0885cad30b44b308a1492780d2e1f45ce34a084452e956c4720a8e0f2149e608 +00e7cdd3f0879e05b6e2a8ba21bc94350c0c554fad50566c684097429e7340f4ac5a62a0a940acba0e638d147ee953fccd954ce9a2b22f75fe095ecf9512fed40222d785d0e346f44de5a6e385e5379adbfc087caa43a8b53f4466c7ee38a8cea4e71f6d8648351d064bdaf6fd72625239c9c709c75fea2d9793dba8ca4d56888dff0fa5d4e80000000000010040fb7cc31c7bf3fff117a72318ee4c3a112c0130344749fbdaba5a85d012afe9a6a666f5a04b353258f09c62bf18aa45fd0f77f3651007caff9f8b1419fb2c450e +00076f9470bbcbbbf293ab281b65b668d16047a7045b169e2bb79d7193b95ce7a0fa1a0dd941254d4b9a4f40d3660c7f5c3602ef18994091e044be732e9bf36305464e007c06143f5237b27c16c0c8a38daf253f3c02a66ecbc3949178deaad613fe03cc2239b2fd5b8099786e2cc4453dcea17822ec33c8510b03a673d9169d82ff0fa5d4e800000000000100405028dea1770c05a3c7bec7cc9ccd89d28db94db0205e005dd978417f81f64c9c8b628994a2f890fdfcba8eb3b096de1e9c72a6f28e9dbfa1bbabbedbbbbbf805 +00a6bfb83412bafc6f720c78245219b2c28c8618b30de0ff52c6baa356a6364da72f2bab00c25a776c13159c8a97d9b0e49f77f1f1dac0a96f0781f9ddd805ff1d9ae68ab607cfc4b87f81ef128006bc3cb3e9bf7940ec9a575dd8996b05ac2a0c56e2ed078f9458f117dd814d486a9ac18b1f28bb2bb581ef340c9716a76c4f86ff0fa5d4e80000000000010040095b39b3c2cb338b9933a5d6235ecb4da14f2a53e2dfa87d124b6a11c95d9b98ea627e8869f2c39fe749e6c0783c925d1a942ef5b0bf2868b76e1e6315281f08 +009b74832ebbd7a043f0b7faa772ceab48da67b3ca54309e4d0694fc2c1f03b5148d5bc292bfc91cf7148cb5e2e458c726080dab2c254644b7fd189108a883330f0187703fcd1255fad2d35b765ecaaffc8e8aee8794144300e1df88e6d3896a0ce3400dc4ccef66cdbd8344c8b35f9db174d63add2389cfe3d435a89659d94015ff0fa5d4e80000000000010040410296320a774ac9d053334cba2dfbe8b5cc853556cefbb4d2c396479fd8ed8b5fdc6ec033b404fee1c82796d5f4864decf1514e13165301e70422e52b8c800d +0015acadd58ccdef1e7561239bc8db0a5305b00fd3851f54983d520370f941a9122375651d044044f6aa90db4491cbdaaaa130fcbc78c4ed25faaf30f05b02d12b728a7befb2a6f243635f43059977e6022a54e8f0b72e9c0fca5edb067f0b8d93776d450ddc4570b7e5d701d5f70b95a4ec5061c06b1d96ae86bca7571b1d2e25ff0fa5d4e800000000000100400fc8e1c404cfe4d000b0e09ad9e4b4a4c143905496d5070586321b42578fb954dabed0443a2f42cd29ab7c867bb18318246e75e199d20b061b0610e09676580d +00b0c856adfdc859a1af63f7c51629c7b8b5fba8a06ca2e20e110e7b0a5973ac02f905c8837bc23f751b4e2b0269aea4fa0fca2c9fb37a159b9894f6a40cb9ad127ccdcdb87e4f54ad5cafee8a9b938edacdb922f9ab150fe6216c5580e80b328aff34a1f3e0427429b6ec9c105ed15f230ad0c2b040f521259976044ff91a559aff0fa5d4e800000000000100403c589a3bd35aff0aceae448a093c88ce89d15545261211d10476ffad8cf949b96dad2cb7517c3b77218be4595a95bc5a3e6d8128d700fd0eb7bd7ee25d139d08 +00e46cd66ac87785d4bebcc8ae7ff01888721e9161b9763ea36042337a1fcb37979dc171c89351e2b917bfb9d67641ed256da2dad47813ea88bc30330340790130f24b6bc6580b4144a7403bfea7644edc354fcb07570c924a241623347bb33d13bbc3271fe632be67f1265713bc0465e7fecd6e62e83e64f80531cd3297b39b98ff0fa5d4e800000000000100404f20cfbd84dd993bb1985ab2c9772f3609df7853cff098f25bbfae6bbf5670a290ce6909e4d6ab6f263d3db60482650390e12454b379c628fa2c4799ea6a5602 +0013e14ecfeec5ddd28222bbd249f30002c9466e0dceba349fc702d8e48cf71082f7cc3c5d536d749a350416bf61db2804cf8230d38c40fc4ed2f811e52b4435209aa9d36cddea0b70309d0b0dfdb97139463062a9424b23d6508491de44e14d046f42a3ad2c798ac108eda035b2f7580f2ce3a885c0271b0c3268cf19e184b500ff0fa5d4e80000000000010040d0de4afb1c63bb5c5b030fba53cd14f3a71a9f5f9f4cbc275d11806aac5fae0601661d5eaff83b85844f818d635823c64f74aed7e9d187bc4530af092ffe8f00 +00b0ae35810e3025d81528d85b0b05cde05d5ff0e9ff86f087c876b1b6ce3d3089fdd36961009fd9a94f869bfd707b4749f32ca144209b01957cbf2a67ce3b9804a2daf5c09f136c345cae8b44dbea1c26c294c6d1f301a997aa19be3aabbe3a205f1993951f698722f9fcb9ccdd84e6c9dcd969246be8b4e3edb3319bf6dfae81ff0fa5d4e800000000000100407734c5ef4140021b5e576c9f1fcd6972aaa85b3c69a5267177d8a40c737d7acafd7fd932fbe09e1e0c05fed6cd0803668511cd30556ec4e482ba22908d5aa002 +00a2bc44e7e16311ce6d2ca74e4039bd898c9f4876742db0b5431139e8a7728d9e11c5eda437bb594883622b5b63f28362019e59de2ae4ebba674c9ff143ff9e1c1f0dd2ab1501f1e62f161894e707be4015510bb897a883aa3c5d25701a8105246c161aaf0f541fb8b2f70ee8f85aaeca33ea7d7238e063d6438579a320f74415ff0fa5d4e80000000000010040d540e39bec3b65f624ac1a8face9cd7a7cf12064721277c34eaebbf86c35ba8beaa1d426b535e37790161e9a0a4d92fad1cf10998948104c058b6281c112a203 +00d180083cbadbac4b32900e9d49dd0bb73c94087835d54a2fcc53636fb768d41145b9247f844961ba4b3a282dedea13e3c64f433cb497b552d4df1c2e64853401717393b79c22bb071fc93beca55c22c182303edad78d3ef9d9f7bf7ac7a66b8b7381a38de93b6374379afb2d4a68ba58e8fb9f79af569a9ca2936f06c787e92aff0fa5d4e80000000000010040bc7785b84534f5331f00555708e662f02c6132888abb0bb248917d399395d1f880eb1e3cc4823eded69824d99c68ba80850336ebd15f08f09a5e8098f4276f06 +0049ffb52ec7fecb957165e692ff0ba3e1f1e0a6f08c163d158dcc6ce017c4e11950b6a6c66f6a75057cd17ae13d7c06058977dd7cc6f70f42f0fccf7a160b0f0fcdb3f8eb91517b4971c941a1533891bd047d6b358fa4a9110edaa39fc0151d0fcab3f219f55262c235cdaa573c39284fc1e37049505bd86794f531aa313b711cff0fa5d4e8000000000001004048dc3a4bc206d3a9e3d7e0bb94e153f36e1807cc5ac52dbe833f0791925ff9b32e9a7fe8d2f4ce3e919032c764998865579b911fa4311345838e04f453673905 +0029fe47a106d7e10067fa2bf212b6baf32f99ef5ea604529b63e383d1d48e1696752fe2813024c73f38694983bf5b6442057102745dc0d5c88b60fbe65e34d207dd45ab695077fc67a9f7a6e4269e415f3fa23f8b40c58e7db0be1d86ed3b97ae923c1970a20726124d7aa963c315f74c154890ee1866abc9b02f8c8917c1c812ff0fa5d4e800000000000100400fcc57205a3a3bdfa444e2f3c83e3b3015716f8576bd5be2edc828515c0c18074d3327e0a14c91b7332c2960076414728a7e11888179c4d05f115554b8bf9801 +00124d3a77ec2410ab919d8913b05f014100ec30763d887958a2b12fa4e5f3c1026e2a00f5e977753f7a619a9b876114c46b2537172675d54c661211c675314a1e97af9089ed0256b3bec51184a70e0b1bdd929d97c2e6dbf0d6b195e9476b4aa23881054ddd7eeff217b8d3f45f715d9cab9e5401e0279b4b38ff83c0be0e6400ff0fa5d4e80000000000010040c8821e1a24fb81e567f2340fefeff52354c3e840906f05b85a085bcceeb4dbae63cc826d56378fd0d582f7d0bcfc7236972bf74b29d11c3182a8857cf37c840e +00dd27096bfcaf34af94b86aa93329f69f75253ae55a77fb03b8ff8433592bc10400bf12fca9c6a62d6ac21c33a70a9f99adcbbeac22ea29ebe2d90039183bfd183a0c81c0a568881bc9ca36f58eedc603b9a0dddf0b24fc634db38ef7ea7e8019b7ac87bd2e24306f51d6a7dc596fa83ed5128c68b941ee45c867d64227102310ff0fa5d4e80000000000010040d01cd168041bb0ac72eb35d98de902e13466c23e1e5264c90149240fb588845f5543f056351e4ab602054eaa1b33aa6ea3b0aaa995d7a325a624fb4dc02f320a +007d77e83c4dc7a1e46e86e365b322a62f6d9ed73f4deaf187bcfb05e6dec1cc90ef981b7186ffe595651d0acd0f2c4e705fb1ef88ba7c208bd053b66ffd5fbc0839f04d0049f13db6859e5db0f79464e9e05534d5ab9c0f8c351527bd7f020316f55ad5988c2b21c7682ae2bbecd3a22a2138409e3f0ae05ca47b6031a880c42eff0fa5d4e80000000000010040ee53e4c2137943959d78c1719896128f3efcfed73157b576e0df60ef4a0577777261610d0b1fa7bb78aefd01381d8dfd97ec9e6e1400d1bf6140ed6cb2f5c60b +0088096cd8752465bba5bb1cac9329e9d34ba30fba9ee200721c50be196c564aa0a4aa078d3580ed09cd8566eb4b3201ce702f61c437d662432be9b7359162972a0c63f5393413ca5f21ab1c73fbb9ab0427cc3834f5608db4be2d394f2d2d4a886f7df0089ff55107a6b17380723d5c819bc9c8d904c56e0d997728bccfe8e809ff0fa5d4e800000000000100404be29331ed65b95902e469f43fe617f45676308f96196838554e2e4334b699261b96ff8d008dfdaf48638899f9509d83d1731bf3c6b5d395b3f7b078723fa208 +00373af7d576bc646ead3947dc982c789668d24676b286b7cb14ffa31d9c083f8fa639fda1e9be4c7c10732eff566cc4bcafa51b02ac79483e6156e7bbdf10702880c73c83a2cb191799ea716953f45dfa75f3c8393b5b6033c80fe0fdc97bc92f9f6cebc041924d10c3a1d73ad667f280d7be1e60f839a7a70bf9a383bcf0129fff0fa5d4e80000000000010040bda1ec344fa56c076f7f7368b5cfcd67b5a855f403963f36c28bee74ce9129d875af17a1a0a88535c552c68c5b7461293979a9c8836659a7af94478576590908 +0050dca92d2d546f74e3bc8fe7d87dd121953d34487058240dac84977264a3e418a0163162fda729f5fffb34a5f277cb81f4acbc7a8fc3654821450b37f1f4650d178dac121bbc57b45659ef9f0c4de5cfa362b2e72017c402d87cf370bad23f0581046caf1a76102766456e84044ac5aba36375a116ed5eb9446d77ebd88e18a0ff0fa5d4e800000000000100406abd0eba8663f1e8799d8a5427f76860b983468d969e246de7565d8023b86d3136ba472d52d35d0f2ca7e26c0144d979114da57ab4b21648e9387d2e03a7a40c +0020f2e043e73ee5793be4deeb74634b2eaa2bdd4df71f61be5714ff99f6b5e59f6fd93bec1a05be63c01f780227563f73554a29af2fd55d2a28451522f2415f297ac9949cb8b54afb4860ed2b48f708521b4f3d9eab695c232b56129b18c510a7bb17e8036eadb240a67421a8397bd984aaaa8e8f42b9cdf7f74d5ba2d2017809ff0fa5d4e800000000000100405e9e4bc14480dd06a193d3aeff101bff7f323043ad78d1353e68d8765c83ea49357fa410bac9b89bce039e33757fc400c32d72779a9567e44b7522502dd78508 +00a83020c7ab71afbaf9ac6eec2ca63d543f3ba4ccfdfb64c8435d655df04de12bd43b19382b49503800ff8589e07f49476b888855a69f7f0dcc547ced23ef3a0d3b023a92185edfdac17f29bfe8c0ff8d3424c808c2276454485aec31661c0697cd5d932e423dc0ba3584e52679d70b3ee4e241857a7e876b1e03ca77f7dac3aaff0fa5d4e800000000000100401d657e4a7ab2c186a465d9ebcd4642981823b0d2e0bab8a4db6a47f12e881b84cdfac01bf022ce6cd54a1e319ca70acee2ad6c034c41383cfc22dc41c80c1d0b +0013f3decbcd19c5f47c00a5285d2f6a45dfe2701da29703802a17748d16fe7a0ae2bd3346c09ceb07bcaaf84f6e33a8e1fad223a9c791b611ec3ebd02c326d2010d1e4336cb8ec4f935f31eabc08b580832a0ec96fdea6152362aa23ac49c032663a44b39346ad0beedadfb76fb5546e2e6c040b3784131b424b11bdcd8d53595ff0fa5d4e80000000000010040b6bfa8ca33c3d6219bddba627be5dcd41ef2aa75de25f0d5d86f3a362ecef39c69cf90da4b2605b593eed2d6fc0b85a3379c2974a009c543728a2760e18d2900 +00fb1bb9ca5f76851d064cc900e80ff1c5e4cdd23ca5357e9357d5303ea7854a158849428027698998f4728f7e07d7f378c2d69a32287a78a2da54bec5108a341ebad9a4ee2e270c4161d1374f49e5b760911b3e4884bc68a35ca137d9cd4f5c19a7cb947b42f50d9d6505dd41e559e32f629d99ad971f9b0f1051ce2491755384ff0fa5d4e80000000000010040ef08240c87b12c100566f495d58fa1cd41c918106ea93819496a914eeed2b2d0eaee6048604096b1d2bf84274cbf9d8d3f1d40fc306b0f6c89bad3cd83d07b0e +00bd4b69788f90b797d3b051b482ba522068ce6385f642add5fdcafdfe6eb99b93812648c212fd82e5aafcf8ad9f19b6dce29de0b8388651ed6b8ce6405f21bd2d7d30c6811cc4a158758f895ec450a00ed643b3315da9a468b5f579f2b01850a6574d525e867afcc74dea880b954dd0c4f9de72be91c9b8792590077f5b0b869fff0fa5d4e80000000000010040ace2aa05d74a79508f115b84eeaa36340b93c5f39bfb1d33fff469efeded0ed6554d5f58f1a69530fb990ec2dcf0190ecf0f8307dfbdc528ccacd2a02139e30b +00bb36b3e257a1b2263f350f78e81b38ede421c8532bc81607fdd1e72ee54cb40c70d2dbd1c63e4a5897086760094a45c31c7ac6ab1cf109c9079d63b0799e3b1cf8bce11e977bb4edef066b918c567e2a74d61af10154857d8c8d58c4c31a99161134086d1c2e9b639f701ceb308e0fdd6a0f450a2393d3b77f9d72fbc0698900ff0fa5d4e80000000000010040df4eb3e1da21f46d62846fc616c7e6410f7c047d3c2ade8583b3b8b2513d1c60e12b48654f5be115c4344280a1f303aa6b3efaaa09c207d20fd84dc34e0d2906 +00b4462df0143482053dadb14191e9e0f3e189caa833082c1dcab788c7f3674b10a829d011fa9ef417e2f0ade4fe727a91a774a8ff57f828a6537a03f3292b080c122d9c272a46e05cea008a6d18262e705a818e4048a84070e510618ec38d23ae831b3227927017626e850677d96bfc48102b37cdf584bd9edbd7e4d6efd1ab96ff0fa5d4e8000000000001004060917c83a2e06ad177784a13e51968597339d37231abe85597cc9cfe2ab76c07aa7914b2d6a3599cd7b5bd17b3a1c55d80af1dc36a90a4b39c0916d2368e6b02 +0084660825f2e0f91ceff441fea7ccf560c70fadef90da2cb6b956ff0ecc6d3c9d43528b5c9201fbc53265213ecbf1f472ba92200123fc3a03b7e4e346fd5b3b2ddc28eccc3260357b8f077c650a5a4bd5ac92356cc8d9f291c9f9349b7f664a093f15c4d99cc26092e90ba8300abbb681d703b3fc0f028b75a19fac198fc5aa92ff0fa5d4e800000000000100405cf7464c3696fd773992d6e087f49e24ce9cb9e15dd6c47b31b0e9b6e7c6ef66e44c24aa23f2dff0f1ddae61e0e79b81692fab19c863018bcc3cda2b26361e07 +0088dc413a646ecd1160bc70478ce29ddbab5ef5edfcbe2d237db959adb54535868952322bb574171c981a1451f666486d9ed7120a11276a16b386fc645655301892d7451705e39b056fab1665560cf60166d64240b81155771c84e2a598e749a2ca1050865e0a1bb201e5f617ff1b8cdca67fe3e830eee666c0c360575349ce9cff0fa5d4e800000000000100405075a6cb7d501376b4864cdeb082f6b51f5907ed2dbb7381b55e96e386c0847071419f54cb1d3a6adb3bb002a8e946047ff12864824427a785aab9834ec5ad0f +00ca6711bc476cd119dd2dec224af6ee2812759c2e2e3cbb833e21bd87ad3d8d28f05e48f652eae1cd4ee34b6dbcad23e944ceb349adba07955b265900ecc94a2da609d3974de571284e5c74078b7f18bed9885beb09c564c6db49c139ff1fd1147afdf7af82b0a225bde7431077ecc4cd2f1ed2ddf15d0b5856b7d921cf37d506ff0fa5d4e80000000000010040f308ea7097b97d9d1132126629bec8e87c5e0d23acd38b53fdfcae2a13d1f1d9c85b4e03e3028b16e7289cb518f4da7dbcb3687742833b4526f85628737de50a +000668f8ae54e49965b2b1ccda2d2f0c22070d487234b2af5c83305db73c2f5a96ade1924257692b98cc30b36bcb273b20f1c7169632b2d935473ed57676c3af27890fea48c6b5eb139ef387c0592a0ad3cddf47b9c80e7e7edb0b38bff1b0740767551235660993e0432cd0ba39957b9eedd774baddc01abd75e147498bbdf82bff0fa5d4e8000000000001004026f936fededf02338c35979034c2bb3e6c92a3b23259c9db5c38829471fe36a00b1912db5c9a69ee872e6815b9ab5ad5d9458cede0de710f60b4c33d2a88e90b +00fcd2df8ca198be232a2fa89fa8c946ffb70e62d2079520e2eed64e1758bf8304001f8b2624b360f621b6d1a2655306de5b35def9b3b0c31e94c67d137711551f5c280c34c99fae2293eae11ab63d1c8fecb7c20a13a4a6dc6fa51d89582d58a85d4a3e67fee022ba27457e6c1aeda1fbc7d98e5f7b5a4104e94e76dbbf2a7486ff0fa5d4e80000000000010040d693595c13780a5c9a101d4f58bba0097ed99d0e4c0aa62147fddc4e2a66b5fbf581a5616c4bb7d1300aa48bbde58c88ebe0b3efe5b4af206506791802607f03 +009f2ac15f6bae3095f1415c5e4a78b539c0ea44d0ae14eaeb3f0c2f29963fe397d13c75a85712bebb7454ba0dee71a656fd087dfd2669f14f78f9ebb705dbfb20f6aff6302190871c4e364317c8d308b51d21521436e3995411bdb6d083eb8a24f4ff25b7b21f6ce45acbe23e8f8dc99e95d82a0a15834fa2d077ce5d5cc9f227ff0fa5d4e80000000000010040805c38f7acb32a117f49ec0eedb2bc7f0d88f529cd681ec5caef14d013e552a28f662f20e492af85ec99109c6e74ee4f04f0c1f150b64731e99734df3d057300 +00bdaa2d6bdda0e41672fe463431dfcdb0f866189b954d073e22322cc0284e698ec94ef60789537071fa56cce9694e068955e887c00da643c9fabc498640140e153bc3f42e60f97f13a4ab933ce987903f89f0f568492ad5cc51137a7587e0da190d5f4264e38ecd11c227a358636613ee698f5845d369c0e3021efdb44cc6d399ff0fa5d4e80000000000010040c240cd3a9cfa133b6f7b1fefd439a3e77764a190218c37388429f98fe4919758872f9b1af23c22d934c1b0e9499eced6e222b33d01d7af197c8ca9fdfe2f3502 +00125fd628722070218ea751f36eeb3cb592c30d0f55069ac1e5e8fd521528bfa4556f172bb695d91a17bfb3ee56b5a9e01aca5e7b4424806a4678d0eabcd4c90188b6ef11b944708dd82ee97db7ffd766bab61eab61aded4cc352d762c043ea124e5dda9448d52e532b1ee6c1a7cd7341c4a88861e69a564733b47cedd4dc0d9cff0fa5d4e800000000000100402339301afca8b51b7e721517c43af977d9c30df772e23dc8ca5eabfc89d68ccf4f4163341b469448a08a564387f8bda4ff67b317c79fd82f0738d6a02add9808 +006d29fa25cb88d1ddd9ad9582ede256e71b8c872d40f24e2e5513685b0913d3a87423affc40c10d1d01a92e281c8f93f73293440a4f61c121bd659bba0ff41906c11f2d58a9bbf42aa7e78dde3dd08bd9e9d937cda3e8613ea5a3a3879c9a991bb5dac53ca1bbe8535ca6067a7f60d0e461cf24063d128ca619a487c7e3bc1f0aff0fa5d4e80000000000010040dcf5863ca5a95bea2750e6d7a226e0400b122132ce6c2f226765c37443b1f83634660ee818570d6cf0c19ab5ae07d0161681e3cb25bf24462e4bb4d2db179e06 +008a96fa980700eb08356ed0336dd9e211290c60a041af714e62c85dacc1060903477a26739991e094d7338a1f014decb67c89c7c73d416bc081ed46b50b6bfe074db55d21b31c4ad9f164d1b1ff4540ab1f9bdb6cc18d2ffd1c5daf9187e5f791f324ca08beef457749155be1192458ee7b7b1fd4bfea533ab68f48e1cbdd692bff0fa5d4e80000000000010040ddf506f299884206beabb6a6803e33814d74b5704bd6044f8ed4ea28ec9bbac105be0ea404a0337aeb5193c866a5f9644acfde996edb025d2058bf254f7d270e +003f19b072cab7093e4125b030f59f23a232c61cc58127e053e05a10ce5a79581b7e3e0530bc7fc56a9172b28fef125152c611315da89dff6f3767e51df0d28b28532a7989fccc235ad988422447ad75d79775c3dfad829cfde9f5da3d107cdb043cf7cdcfebf9e5ce7e2aec60c4b88f8ad2713bd03e06dd688fd827455f8c3390ff0fa5d4e80000000000010040b429755bd802efc3295f22535f861f1984938870078d4f92f838711b1bd120e4d24fc7c9cfa74f720611fdbfe1e0d4095fa36695099103ca6b1ae74ac3a09903 +0074820b0a546f69e34d28507044e3c1a933fb40bfb260b03c5b21a769bb95d1a993a785941338becca92513e00046cfd1dd465159c19836f05bf7c380be5fd121d2ac0fbdd76ef1cb8f961f91e666b5661c0cf6d5157c6bf024731a22bfa8cb16c64030d13ba048e88fa576e5113988cd605cdd69c8eef1e7b759b11f9510c1a2ff0fa5d4e80000000000010040eb29e1f778f4071fe5edf1e962e26fc61e726f1cfd5a055c3387be0ddbd1f256dceaf8546e953abb1b2e49477ea1d428723fc0c8de41e3059d869a588ae48701 +0047c78309142d2599b2733d4c213f2e0d2d7217d2df613cd3f6e4ab2d90337ca9733e75f3a020eb2fd355d063e3a83b7facd984398bd49e1bed0ac94d3c28430b7fb3cdb346edf0b723e564fb33113fcd4c4954223b6b4aa6dbe0300e87f8050f89b23cf9f691e2a8ff619ed77d7d6bc11e17c1f9917049161eb0a301d660341aff0fa5d4e8000000000001004071f276939b650dda1c9e2e104cb62151b8ccf536b1903e7481139cc347b4ba145edeb867016a919c299462726738242fcec91d447f47321c2596500c00f18304 +00cb77cc4a8d32f6392e768054ffd497183ffabb854d0fd39c23d425da034bef8ee46b9f2a9fefb691360bfe3b8f48e1d4997c9718e9e17f65b3898edb8a580911d600ca452ea853f9069658178b784bf14a555b4d9c6065923221a48e0d7cb09b91a3e9064dd4b6d8d5ad2d7304a73bbc613e01abee1978d3fe067d8781648419ff0fa5d4e80000000000010040b066f456129fe42d771bbe4e5f33045bc8b865446e6128c29314fe570c688bf8e42b8ea764540a0adcd802752986dee247643cd00851444a45c70ac41fb32e03 +00fe7f7ebac9b9222ed54afd5435ca735a8ee62291814937d2b950385d7b8d37834978c6f089639c4c39d64b2c7a6031737e8ec68057df661ac47b308210c87327d01f2679c3e770d8afb7c2f7cedd20b14070e29dab5794cb565aa719f43f42151278c838a6210647ac511931cbeefebbc2cc446383b295553f591686a26bc524ff0fa5d4e80000000000010040f26ad6cc8dbd3f72630c9aeb45e7c3ff76eddc7d9307f7eb37cd8aee80e28d8f147042749eb3514c09c24334f0e52027f76f924059ba3b4669600c886b6fcb0c +004de781570d838d349013310b8115340f744b9baf202f5eded4c70325c6785a08eddce54131f22f1fd50c530d90a9acd6fbb893e3c89a260e4935c10c0c334a1c8c674b17c5588f76433e2ea70a0b44c17ddecc4077f4fc2ce772cf44b0ac7a1bd3cef5a5aa1bba86595fdaea41985b8613490787b9d278cca0ea5249102d9da9ff0fa5d4e80000000000010040f42c70fe68eaf037a351f0913aae8d78157dbc288069a562484cf465435f9a35d6abc075361cb8b868beaa11321333a4e3726d04d2ce059c15b55c778783db0a +009a9cd8277c5f6bbc01d2b2fd65205e48cd791a2244c4d79097cdbdd4ab76059063be8cb78cdf7198dd9126cd93befae319dbaa647595da5535926246883db021f17262677733519116d83254c5bc8f99d17e85e6245393010dfc96fbdf795990fe5f173d70faba6ee0a648d064f2c60ccc18943c4d8c3a847bd5ed2bf2e8319aff0fa5d4e80000000000010040ae0591717a141c3ea4fe79b9385e0f25e633738a52a8d691cfbdd5628db0bc5438991e208d1066719c47d33d7649bf0c86c45b36800d697aafe61bf7c4ae630e +00b1ef9358688932acaae2dbe303e6461bec1e2d5d464e89cc7834dc201ee69aaa578d93f0beee198531b06ef11bcae2c08e72c021f3908d2c50868bbbe4310d20a6d29fa6f9922e8ba742cec42951de648b54d29865905714c3c514c2db3409a212bbd32339691dbca56fe2dc8aaad31732bad909757a378cd2db0d07c57b9191ff0fa5d4e800000000000100405425620607150f3e98b271ed6399e3fa037bc73bed1e62cd653cc2d6571e066f40520c6db805adc9c056761282595b75ee19b23ce8eb26424b0c36b081414f0a +0091b969d98ad207a6b6eb2b8c8954ca54e9d2948ccb411423637d38d54cb26b29ded454eb1e56e4b6d2eaf4bee264bb649f534e2c3baf73a2084638a026ea4b29d2e2bb2c9698c7a040e0aaa4a98ce2f1ce5f60240fa9bce3f92a37a3d34e6311959eebc68b5b758ed83300588253d78f00dc9d462072cb9b4d94f78e221aa588ff0fa5d4e80000000000010040b7467fcd650c0b1599a88b6230a855375f26e4dc800301e123ecb84b16eabd0a81a3d47be1147b3071df2df683bf06317cf9b5cacb016c9dec84b8e4cfc6020d +00ef88c2f6633b4f99ba6255f4695e86c1e740fa781538cd22140106514b080a24d638e80fe8404afc493cff5d913f06d02046d32894fa5df3cdc5365cc7735c2373de00658708cbb2399263e2bf8bba7b16dbbb8cb985554f1b3e4516e611d69d04346b8198f2b6ce9871d00b9db43d8775a09cdced383adcd8d8b467021d8a80ff0fa5d4e80000000000010040436e5a6a0dbef8d1ae2edb1c85773444caa28e2be2f513fa12768309ef8cba5710ac7b755013771c13893e79ece5bf01d290b43b5c67a07b7474692d1b46b002 +00e254f90d5c38b0eee9e5d495c9cecb559ff31377630507be34175d31eac0f58b899ef3b2471edb14e6eff7a5a40d3e944e5e39a678499ef7850b0dce7d79d012c6e9150ab4203cd4940715bd25aa3fd7af24333c5220e66fe2e0beb770cbbb2fe14f94aa57a87a408256b9601f15c335081bbaec0dc281c8e1e6c24abc5fdb98ff0fa5d4e80000000000010040c90077dba5b991070adfacaa581ddcd8a9822e9aa707af37f0f2a6088eb5df436c6007fa359fe023fee04683d0c087c7af34bef80ec4d6d7e4768e400e2b200f +00f29491aeb7e04e059fa572705f6ea853d64b612e0992cbac8be3d14a85e5cb19cc64183b0277afe1cbdfe2dce31a09f0deaaadff17a125527d97338fe9d9610125049b3b14c3b30788f64a82f645c74141b778cfb01b4832d9d23e3d6e0c420f0268ff6d9377cc75c52426abd5dab98aeca1894f6f792d60b9030d4f051da9abff0fa5d4e800000000000100406520b81cbd41eca138ea66b309ad8b7463b1fc957f4db30b0fb4e7f7baa2df362967e3f9e58b8a7853e303fb7fc1670eb691134ebb5299cb4a53ae1598caf80e +0039422335dcec0fb3f02521cc9da00bd9c472fb0c23a989b36bd01e2fee131c807a0eff794ffe2ccc9ffdfc66dd546aa07e9525c21aa1747d8d2d10607eeced275e350d7c06ac82219d2b011bdae228c57af13122261c49d62530a58a985cea8c3818a8fff77e48b5406ce95ddd2b368f59b37fd4ecd688faeb116c708a3727a0ff0fa5d4e80000000000010040e75527be7e62fdaa08275eeacb668a676f9a0a66b169bdba1929faf5991fa17614e2de661ed8445e195a10a70724d2bbce2c21b9196416b9dcc5ce01dda93d00 +0021390f81e7c8d465f422bb4c0128b6fb955375bed324628877a48c1fd6c94faa0df489c6628590f52afc69676fe42876dc441b538bf6850afa72cdc120071305913f38c8898c8ab13a40ea3fdb973ec6c38f59b3123fd9a6c7906ba3a3a4af1fe19560788719cc2cc3b9a6c3932f0399008da4a4bce272ce28a158066125202bff0fa5d4e80000000000010040d5b5ca74bf83507137b5c7c9b6449605597c172b0bab92bb95abb46cade90feb791efd1683b71171eb806cbc330fbe4881bdf1e33a4c483127483386a9fe4d0d +004652e65d4c44cbce6421d5353c9078f8b2b0f3c3e146b9cc4bb7f23deb8b722c601b57a655fdcef0ef1020f1d44f2b513cadd5e60287a29aea26e7f6635b010a2684186320ff05bb622d90e801c64367b7b955c06d88879ae8d771e78dc2c020283e26862f0d1e85aa41a4ca695539d20074fb2c9489e1dc29589ba50c661193ff0fa5d4e800000000000100408f859e3f8f06d91e9c0fb75aa7cce1441aba0eaecd6bd74d2717e28ee6f9f52ddfc0a222c62bffe84cd8378ee2820a07735ac18e14b9140ec415fc1047dbf30b +007c34c628b3c6906e505cb39504ffb780e02d931fead6513f2143d602202cb11d12e76457f8d117fba69d93917af8374c63a9147375352c60cb949c65d50870055c285d94901971ea5f3134c103a2d4635f6e281f0f9367431aade6ead534ac892a80d38475668ba2468d66f3560b4c7863b524d45933d3f4dadc78c496cac69bff0fa5d4e800000000000100405a89a73261a1027393459653a548a1bb6b739cba99a26d200e052cc05dda5cba324dae2a5cfa8319e43cf4b78430e61cf2dcee52197efa405e365d20bbf8a904 +00f4cef6e3f7772eeb8c90511b585ab9020a620475c3758f29a028db30dfb43e95d82a19d72055f72e0775fcae0ffe49f7692e8b20a5afed64de9a947757d84317df81d997c744cb081a696b4fa489eb18ca1ac7f59f1dae647cf5d058054ea291fb4b89a6a3457514a14d214f90b93156f632d4cfe559936edb53fc097e7f6a86ff0fa5d4e800000000000100406db30ad693c254bf0c33b6ee54dd23be45f7fccd4334baee59120168890ac295f5e9b8c626cccbe2532ceb44a220e25144c15f38ab83396ef0be12e382a3180a +0025cce45becc6387b17a08bf36cd8f5c39b3f12dce9f0b9a0e8f1ce1373acbd19aa4f4df4b4aa49d9169411105977a9b2360cd215ae6b45770aa5b5f93bdd360da673fef9beca5473c662cc39d908c882f86457b1626281d372b29bafa19ad7943294ae16e7cdb43215ef8fcdb36dc223ecfd5d75e696a07b5790ff806b125493ff0fa5d4e800000000000100405675ed52a3dfac389d712979f85e41c538353f4f0823580d4ed0a1333f4cab4739800708642349b9a77aeb0db146768d42eb29d43a5bba3cd640c570ff796e0e +005a8f1e701862c1ac3d4c34179ebdfcac360dba126e00fbab2d8e78652e0c421d10454c49e8d4cd091540d913be80fdbddeaee338eeee10e8ffcb754e84397d2bc7792d8e77adecb4d27894cc6701cefbae594903f0430b527e8a4d62ceec6ba5df0d8e92fae3c72e13fa32bf1a1f3fa3352594748e15a17749e4c5cb35a420a7ff0fa5d4e80000000000010040e116be641ce622271d374a1e56fee528a852059a2ca838566c7d61b124e647f624ed2054ac0ef8a8238a1007bbea6a59f51055d99dff73a8526e83b2fc4b3305 +006f096af1ac2b2c9300979a3fb836ed140f66ae14cad2118953487b0e7dd6bc29e009a56712adaa4a6f96d1e831619e2997f7c334321aca08e1a805e52f45cf207793b8bf504d3c003dc99151a488a75a2e1d6b9745fea0e45b1c519bf57ef72f69bd3e5dea5c30702fd1092b1c71f935bbe71c4f1da27452b52ddb063412ab91ff0fa5d4e800000000000100402378a06869b246a09289d0133e509541520a33023ec970e48e462a07e117bcf967b1050d87373a82b620812a28e7b3de282336b1fcf16e10eef9367ed139970e +00f7ed0d5addb62001bd01e1d101348bb94aa96f345b9aa39379d6cc8b866cb71652a6334164746a620016749ccae01b48f102950b7fdc9e5bda055cc8c4672e0f2f2e2f97550a5718378aba26443bb48e3fe7749b4d9774a15c1d25822cbdff049de9798c337e88b69330c793a277ab40f464b6cf25ac5a3a46332628b762fdafff0fa5d4e80000000000010040eae9c851b7377a4a57dc47b903587e6afcfed961d0c0d6374e2f781a27ba902f17d3b3695c307da204df11766667c94569d4bb18860fff038a2488729323650a +008aa76c0b286f9a5d7231560aec64db4b305855a599341e6f58afc76f96e52f126761188d2ea804cee2f6c63e12b0b19217229280657c09519441d53d8803402636e91d3f4fbe81b287a95f61be7d5959d4dbd677f6dbfaaa01fe7d1f1445da2f2a15fb939b6878edd2967b8ebb08c48b511815083a882127d8a7cb95869dbc9eff0fa5d4e800000000000100405c6f38196ee12ee357fdcc1867f1e1c5c0ab88d22e8f1b130282468c8077efac8599ea157436afe721548a1db92eb280d775dbc6bd0f80127db07e4a69ea5b07 +000f4b2cd5d56ea8d103f8ec9cf97b1e81345962bc974d7a05b33808e845fea31ff2c3520491f498807e697fde502ecc10420eda79c35ebd920ba59c4166355b0619d47ee1c33b13307c52f16e9fde535efad1f96bd7aa2cc902c12962c4de7c8a732c78fa802b9f71581840d202dc3532249e3f7eec231173e215b36ca69de097ff0fa5d4e8000000000001004009c61845ba5598c8ffefbeda7eb2b8d38fb297c62a760a8b302ae080494550677767691e94b10322f5e48a966f3c55995ac928cf4bcb6292526d1dd8de252506 +0093c5dda532b1d3aeab9cc9fea1e727cf3b750f646df6161c5b626e1f1769d7860b30e42f435e33984821c91d25011d0ed6b3597a728da62c5bade12a5e477418b8c7456187933411ed1961345f2e0211fb4c4dc777a58f311310c547220cb691b34d160c2f5ddec237c3ace3d92b72c6da531524a58a5233522cf544ce90cca5ff0fa5d4e8000000000001004070746cccdc7b0e0f2644eaa8131f2543d49a851659d0bddabb35abdead67ca70c9148dd2e145ec280abc795ab6514c4b62d9877922cd578edfe810384ac68204 +00c5cb7f48ab4ee66efa0503b77beea793ba7abf18d43af0dbaa5906cec2b6cd89ddb618665e9fef0bbd4bff3e0422d7660cec28963bab95d56b83b0f745364413a578442f0ec99cb610db438d2acad8c52b4a5bbe6d7972016e3c381e09276223f5e4732a9e2e2cc1111a2769395068c4a32a82def5c115c4bdca8bdb8acdbe0fff0fa5d4e8000000000001004006e2800b23f3e1b325fbb408e3a4977ca5b3910b1269a8fd8392db2692355a4e946bdef445ba2ba327399a9717d840433f8d7b5f9f0b75bc0db9b2f23ddc3a05 +0014817e755a9b27a051c3e329ae43b740dc4a139ce3b0354ae3a16749dc28b9a2237708b9c899d30aaed2c7b0b1ad453b70c90bbd331b1be9ca45ebb588d0731d4f438365388dbd45c5663e6534192f88d7889694fd02acf3210d6c57471b6d8610c5a9d23828dd750dc287ca88cf4972d211f960f24674ba099eeda6216e911cff0fa5d4e800000000000100405c80161bc6bb9617257b74c67875195788f7357f8fd0315f9a926588da5d29af09e2da9008c7c22566870f203d22a52b1c54c9023c71dfb3617c65e970dfe607 +00f506e540a0ef38da652cda18004faaae5f994fda0d20e3bc13a07b2f349ff2118156b01801611474b6d1db7e0f2a969e1cbc93e72a91a4881e4cdb30b846661b7b298f2e6d1f7520528ed066821e787352d99e52214b3e436943f950f376bca123ef2219dd0b50c95f65f8b40278f2423188f189788a3f41aa746da2bb38a711ff0fa5d4e80000000000010040881399f3131f2a9a5fcef708da48dba514744d483e5dd5dc087fe0c575e475d82976111cc09fba9d4807b197c4cff74c23248c9a354aa9e62e50848b4d97930d +00e870e9d946be84090896dd43b7c73e68c40029562469b860696f011620aecb217e669deb46b1ed4e6d7931c49b1653a6e87f594cd9b1fca2bc23498f9db5d9173c5806cf60f9fa24aa053b7c18966b13bc64a764bb6cbccab9391c4c4fd7612d1e681e1f475687f103366b648885a309e1f47fb353bae7ca849babaa91f93c9fff0fa5d4e80000000000010040d9dc53aea0d31940466bd2b9371779a05e74bee8120d756b48463fc0d4bf1abbf952c94fa6a9711f005d27bb48fc2ff893669c88e30fa740aeebde8cdc07f80d +008e0dc1075c7934300107289719f49b868885bc06e8160d7ba83b9a221531b82893c6fe7db588eae8a79177604313d6b005f8e8d3d9490b6fd82d104bb51fb4035a51dfcfbe5c40eacb573fc05d37946e70e84c181fb4a115f601863cbad51419e5d1c9bbbfbaffe22ae982b6b3d2de2c9acb4cb47cc15a206d7f97b5114f56acff0fa5d4e80000000000010040022c2fb258453db2ffb34aefe7d4b32386e1a9650338894f3dee369297fdf35567e23e2ed9ece903aee5d22d76fc875c2f14ad983e24320026e42aeb9bdead05 +0098649533cbfd864451b88261c49fe147c517de329058f3e6684b71555395c289efd088367bf75325f2d879e95b346b98197c23a9a76dace02ce8399612686a2109739ac471fc0d640f5fdde296d18a4f4a542296c3c5074134f04c55f16268192f75a9351441f9182868ad6ba955f5ac4d392229f6642b16a7ce0a8f12f1e202ff0fa5d4e80000000000010040ab4ff5c16395f4a25458c6160ffbbb082a6fae8395765e2231401fd42c4523401b644ad1a6d4bc32db5059850ae4003d0b0b8b3ec6e9d0e8ddfa6c6789da9d0c +0096d49c6a31449b0c3240f30dca9ba14b60a0caa719b6bd6156a56fcaddea118318d2f9a49074d14cee405fed329999f8c78bc5263984c27ef376dce748948b1b0398eeb03e28b0620bd5589a450459a56438fb41dc5a151c8441ae007ffb4a2a64705218347ff651fc694fffef17d751a2d058f9ebd32f479e96ad3e97fbf11eff0fa5d4e80000000000010040d140712b06977191e99dd6d03984ac0bbda6d131cc6078caad4dc5c8d402051e5a73a439b2bc1019efe6b6388899f93a0290a957800309120ae6a82beb17d90c +00dc100b82d36008ec7c5501d19cf6d7c0e2480a5f72a96e25e57888293377aa05f1654e21d310e4882268d94a84311e2aabd4445a08df0e52be134bdcfebb4330cf3c82fde396fc1e248b471b782536bc94c33a8e3d558b2fd13bb4d38d00aea22476d5778b034d7cf7837b251da1f7f903a191aaa64e75d7fa515527b675dda8ff0fa5d4e800000000000100409231494261a2872bca53172d504f492bae1b39c3a6e38372980f6991d8bc318ffe6c93052979f4434644dc7c407d682c2ab3b544080dab73bc0ce0b45fce600e +007748427f166d2f4591e8efaede11381cbe4de0ee0547f4eac9e4fb28541f3f18ae835fece1a5bd7553d25708af8c63f4c1471dc9e6e58b278386257e235c1b263db62204c27e3664efa75cf20b784fd9023f4186eb63e54a9baef0e924be5528caa183d1e006248e268f2e7468cf4c8b846e9a13ce6fd4407d1577e314559d97ff0fa5d4e80000000000010040eff9924552c06f86845b516fdf7e7df5a881301b56d02f41e5579d54bff21e186db6350bebbec6b8aac1284c28710ed17be89e9f8fff34033acb83dd5bbc0508 +00bb7edf0117e536fc2324778786ff7d967261fbd056116b8f20e7ea9dca709ca28886af82e328046629571819716060ca5a4dc25f7cac2ba581d18d6a0417f01e8b35b11e1ed5db741d512d92636a3bfde279eab8c3fab8b14796a720e8c643849e6202470e8a9094b867edd92ecdd046e254d44c40c719f6534d5159c0cf3b2fff0fa5d4e8000000000001004077de526b303c7ffc67fd4a3c22b3436cab448fb33bdbc531ad42ee69a16aa0d624a04ad325f86eadcd78b46c7096ee060b5be6f7e5161fb457e09f74bf89b605 +00f8dfd258e60de70ea9050bb7e38521cffae8e7de77304c585ca9cc658252ac8c1e69ece93265bee580fc872008bdf9ed93404e7728a621ef5afe8cb0e5ac7a280c7a212e9986d9975a4194400dc0d56b3bc6ed8e9937f68919d50f0c5747219b559feaab9afeeaedf44d9e93b9f87e4c2cfe01d3b92224fa3522bcd3419e6992ff0fa5d4e8000000000001004054c411e1e03739e4ecb0808673eda9b0d084e00ac749dbd9d1d01c23c3f3db03881ebb8c0fd4d0d932c208d819c8aa223320fbfbb89b22d329019ae634c8ca03 +007cb08113211f5f43bc0677f5a8522893255b6b63efe525d1a8cdba66e1e7090aa572581b6c7158f8c16edfd45b1fadd663425dc3a8026a3a241603ced005de1b8ae41f1c9bad1b768e1cff8ce7323986c12930c979157d406dd205faf2bc82a37eedf29d92e94584ff9f2c61f35ef3d520218b153af09ed7b8b304ec61b81f08ff0fa5d4e800000000000100400383a0b3455b66dc5750200e72a43a574190f988a9f96edd626ec47cd75ff638f3bc79b7824fd86627911a946f80e7ad5038b662e15d1a05958a9fc4d94c4600 +0096e8ddb8d5d5bb5ca129d804c380872732911a8b69e4efcc0a9f63f00af37716e5444176f56f06d97a65b4b7f8f25d7478f9e27b97304dad05f26b534b03c81d4e38fe31906c1630b56a61cc6dc9d1f5e31e382de4077d9bbf75bada0abf53252ede02d3922a19ee9c27071cf367c255df0c60b81ddfd6684d5ae79f33bf3529ff0fa5d4e8000000000001004080d750604b75f2b69ada4d5d7aa439ee476d92c419515f4753b6e4eb7437b3cd38efb2baf6c71c08e9703d74959ba2ea619b784c236ae1ee1db9fadb2f97020a +00a8da044d3d21b9a2706acf59f25ec1a81e82162560a906e749ed8302b807a12661f603adaec7227d31c4d7ea324463f62dbaa475cb5d726dbc23f1c0f0a47d01aad8fa24cb0f7e60e994985dbaa8cc4318140d9d45b7372ab70485cf91c2b28de3c28ecd15928f05fd4e219704ce0f8e33576be4cf9090d2c58ea7efa7b7de0eff0fa5d4e80000000000010040ba8cf65b6cdf9e10f56cf1a637ab183540f6e9bb728fde26036a0ca52cfde92405f07c68ba0dca1dba1f6060e0f387bf81530c327fe93ebc3b91c45b890ca90c +00a74e09b007d6810ac3f454c68c9fb531bd3172ccd32412a2b09a6aa36ed3b9ac2832316cf5d39694a7fd3289e259c969a3e3a2e2f439c7fd459f0f00e5a9641c1d196717bf6fc0f522fbae02ba8e890793352af3e56a56910bbe67efb8c7e513bcd45ddf82ffe59570665a4964b622412b471bf8dea692371fc884c2fc8f9a8eff0fa5d4e800000000000100408d3883b4d32bfe317db637fb6031cf43bc5e0b6dc1f777c9c5784ba0db8250dfa95e079bfba79d673889e4971351e36c30c9fd9f9fd45ce53aab239e3a88280e +00f37e3f073a611403123aa1c84f2895d3aef68ca7e709f399671320a65f42129c56f92cfd5bcd2ba4fb9b1badb35c4e8d018a280261ab232b7cc0f249b885b500d9d2725319a014a1c7031d5e0c15c099f8649bef00e38f253869fc9c6aa2538c9ba6029ac192485bef5ab8a37143839a9327a7150cae785657704e4867fbda15ff0fa5d4e80000000000010040be6a7fa7134b1b81df68e4cfa4eab5c5550a1680a663af9b0b9e4ed785e0f9194cccbe6ed5e4e0397970b96ec142464c4b238f02b2169dfbcf4026338d599907 +009368fa60e1b0c38f57cebfcf0c1c2bb419062e07045b9164bbe2fc650a54a2a57877b08f36b0285b4a0df4a7e8b0fc8874f994810d11a418a45e8a3eefbd5c29491df45245cee4fab0b8d0b3cd9b53b76c37f9e9503188ddc1ec2d516056eaaa50d8e7eee4fd5d2c50d27a76e92b16aa01da6745b7ed84214c701e6df236ce2aff0fa5d4e8000000000001004018b95faf50601102071bf05da07f4cc23616b43e0ce79b228a14046a5ce313dbe5ca243aa4297f795c12d147bb0ea6f13d5d86d61ce9b7ec3c61eae80c620503 +0066f9fdf1137067d40093a1191eee8bec0dff9865e3b27b4958ff90b039a99a2e2b8473e0d301abd3e09f865c34264a8094bfcc3e70816548374cd794b27c4224914e73d621b56b03dbf5cd69c276a84715dd9b27743112f43a53b2ac4c7532052868e513e7d99f916899dfcfe56447f6c3fc461140891145bad07038fd3de388ff0fa5d4e800000000000100400ac445316426ad9474e3e0591c2f330881de8890dcaeee1fdd12b42288834ad64cf87c511f2554a7275650b8f49ff7ce02c6df0644705345bd60ff48bdd3010a +00be5cf2feab58e5b2c88512d28aee566323d04b2bc0aa96920e406f2464a220acf6bd8dca35389a4d20db896a8670dcf542991f65b9b99bdb649ca35b6dfdd0134a54de589f2aa4144605599d8d102110562d9735563795352db46fb1a34babae5e87e891ec19a2e24a8110a54799025afa758d9155e12cd2cfc839e8886421afff0fa5d4e8000000000001004059887068a5cd8a793f22e6be0de2a19405fe7989b2f0486e355edb0ab94640c445e6e5f5c15ea2397ef0fb0945310b3d2fef4fbc3fdf3afb2e94918929cb800f +006777b0ec30fc509c7562f1b4736cf5c525b4c14bcbebc7a1fa2fadb52efbdf0d5482498e443e99668a8b97c32b41aa3f5b0480a7a7946fe2138dac0563baf71d2024b4fc460f77a61f62fe7707dd0b00a87b4eac80fe51c01226db0ee5dc0fa433801c7f7c6597a4cb12e92cc96c7da1cefd4759ef53dfcc41d2dcf5016fbc8eff0fa5d4e800000000000100403590d59e07b57a04c6f3e70532b5167eda296d3300bcd1e2893ca73e348c7d4446b87c1c91de45c30df4901813221212ca989f00b013d2abd5b12fe4a7e0160d +00f16164433d16ad27df906cea97de256c97b09cbd460c25aaf6ce47d4565108a67e3e54182b8f3d46eeceaa90782fe33d5c3a8439d28741e8e0a5b67a61611e017469e29800b6ccf2bdb91da8d40ac140e37050cd71389f1893466013933140aafa5434fdcbf67a6bd8bfdbc0200a53129720f8062fa7cee90210d40c70a3b320ff0fa5d4e80000000000010040ed94af908d0a7cb04515468fa69110b1e70b29ae229f0dd09aee9a65f0e19c7864b54702453a17b3ebee2872197e8e742dd69c5abc0134500eba627208ec7c0f +00da35474561dd677c0d8848af7eb7d20874dd6bc2d637905e065c90fb5f7139a163e58e638d9348a0dd06a1a35b22fe58baed0028dbc586b9dad7f301dac35302fe914613d5777267369a555983aa01c8094450a2f36952d56288732ee743d09f6ac0a55f85f1e6fb041bed962454c56d850fdbc5adb4f99679c485568a67b28aff0fa5d4e80000000000010040e00950364f6a4e5e39ca9099deeab4072110e7f03ef925cf9557646d90cf4bd00bff59bd2c9d097220cb3c6ee103f0a7be8fc40e50f1cd2953825eeb068b2d0d +007949e886efd1b4665bd651525560d9af85f6410fa585b1137228373dc1771e0d4800599ff429890df706bbf8ffb72eac4fb6630f64fe072230208c9f4d807216b732f80e28b095d63897bcd127b29b3a04bd960a3597681fdb17b09e044272065ecf88e33f73d049b41b2af1de900dd98d00d3adf86b09961f905ade8c2bc48aff0fa5d4e800000000000100404ebf87d1651cb0d805d3ae679971049dc52f4b39f29a57ea28085bb8a4b0c823995adaa19075df0f1ad7c2292e5d0f190e4cede0e84b1b91d6705fb7ed917302 +00428873845dd776c304ab598b6f7f27ce3dde4c6b9d88fd704612314bebe84b27a1cf2498169b2c1f53ea3f8807e91de5e56523f0584241e413de2e189f59b91009f6d27534083c89eedcf7e87d8a0de9c397a755cd876366b98c020b9c6d80acc86b02298a2c88fad7900436a10206f7c088abbc7c27cea4164e98e7a4110cacff0fa5d4e80000000000010040a078d51e6155b14e98bfb6c19e320e39fe72dc6a76dffda34a2ee8177e2ca9bff646831953765fc2c41e66e3ad099424ce05e0c76780c38980ffe52240ca6f05 +00eeeed34128d58b0dee94d47a694ad0206a8d280efc31037dfee5778820b24723c02c7218cfffd73af2f2ed515c8bae6a8f2febee033f440edf138ab55de1f11999fd0771e06205405c4a1e193d3817f6afc2f43db434b33f74173e0bedea86242e81834245b862da2e7227ccb09da1e0c29a3fba1093cbf9c1cd21fd6062e629ff0fa5d4e8000000000001004004041c66d6665a0515e00d4a7be08af61f6aae88d57963b5bec5b0a579f43a014a78d6cc7df322e3bc70fca1a025b81ed313e73fe0de24247111c4a4439cf208 +00af979bcfa4bf042281572992bca10628cd24ba003fc6a6b0ec2aeaa88d67ed2e8c43eec2bebd5004dd2baf690efc3fbda53d269ce75e6ec30879485baf906704e86ef64df7427b465b478588f69f708f7f3600533d31a119c53e98bc217ef09e79795b34d0a57abdfa305569c9aa0ead0a9194d6ea7b97ab79ff4421afb8ff21ff0fa5d4e800000000000100407f60f89517fd82ea84447f63eb9f3dc981d1abc7668b6d61d03b1f5187c45dce81b3a196ff7c716d6842640cda6a3192e4e24462ab31133a24121fb8697b5301 +00536ba0b8cbfd39d1d2b1ef7f5c8248003ac05b8a20ee01b3f38a7234a266699685fe2e67fb7a4ebb89d32e59efcfeb681ca7aa4773c09ba7a8d1b3ebcc600225e43283a4915d6672c4a6fd175c52a8af556e3637d1d59929d337ac0a3b527124d4258f9075530def94cc0dac737e2a79ca999c09d1700a2d113666f9700ee59aff0fa5d4e800000000000100407b02ee49e9e784a975ab9fcf7582d02f3a94c7786a91dbf3c7658f9fc8bd86da7394eeaa519e9d9d9b560818375908bdf88becc0939492e30224fa455fdb2807 +0004ed3d6bd0531ce62a6f3082a03ffee37f65c6e76bdad0b88e5d8a1f4addfea48d29a4187e5a46940b5959430af78b8df7449352aad6b9d785b0ffe6e866101612a26177121e60fabd448e33b7faba545d4af878a5136433089d0750cdd9280d2880e056fdde9a1c790aa95e1df1669e2f2dcadd477134e8a55b2a004dfef59dff0fa5d4e80000000000010040966d9c572764e234ecd9dbb9af7f2a187b50f0166249cfe1e5ed11363205950a914a9be8d75dacbb547610fb39670a4f173d68d0f669ea13b8e647ac52fd0b01 +002f3a450e1d667e50c44f4b697fcb16f35135761a9ee21caffa4cfc047bd91510edf0c75ed28f14bd537017f3c0c852f0afeb0f01fc3df7ebe9c9ff65d984030597bdd8a41e48e733cbf6e8e7936db53b4e258df079d5c9d7e372953d70c4bc83ccc385085c22a517dc8cab5d458424b01110fdea94675a3f585f015cc664b029ff0fa5d4e80000000000010040cb77db46f1caf0edb558ca033a2de5f0c739ff773ffb9571ddfff8fedb6f8ffafd3fe33459420244cd219947277736e5d226c852d45d15196b285205a482ad01 +001f4ea52af703138328051cefd54c0eb525c6a0ac6344371a99504411471ffd27d6418e60eb7eb4d6d9a7f2a4e4fd336c8d8a9049c6f5579dcd4922d04307202fbff9b07608f310035fb80e9d783e5c05aeab80146262e7e5ab078c05092bcc95222854fcc3fd44b60ab1a825ab08f29a66d0b12863d5b3a42d21623cf00b7dabff0fa5d4e800000000000100406303a8c8a335341eef0ad7efbb5b20b775bc9f17582cf653d7d92942774572a1c43624526b2f84578a6a6739ac4d4c8353d7751fbfc2310c9aafd0f10753350d +009c4001d1509c39a3a61ad4b969d0fc5204194e9616fb2f5392a919bf4bc1529e2db640e9e57330f40d26e1fe0b01151eeac61255e2717a3c8d8f90368825e507ede19539bdb2959d9745df0899d1bc82f78657c3be499bd777e9c4753c2e2780b852b623c66dc4e792fb55a2bb92a0b6da21e34fb8b6f8d772cc9208fc5540a9ff0fa5d4e80000000000010040ee3df1d9ebf48e27fa016bdce6c847843b1d79ffc6d8309a6bd26741a3f7674c4163af12e5c28d9567fcc5baf76f4340cd203f0ef31b7d2f5061d342c403c801 +0069195d171e01492619f2c91d5643470bfa8e2b4505ccd16e8355abd6733ab02b729e1a76a3efca1c279782497a60723ea74597285a639cc67a4e766a6b25f719f43a41f610f9db61f09b70055125de93fb6f757d7cc035a1601f3803afd6d10332c12f59f1a3ce39e6e14779c2b6c0c33ad03780a1969feace69856a8c4a0f84ff0fa5d4e80000000000010040171546e0b018699236dab0ac8e78e23ca07646d781b34a97fb3e5d7ac483a95b2617b372187fd7c06201754f0395654d36bc0f530707e05f30427d1d49b46903 +00ee8f56d3062e378e1c8dfe654f9267fc9327ad21f0de32e00b45cb62486211305e683f40663884daefcae678c95e43e095a8aa12fcd7fd4db8816c9cb4219a2ed4ce78a4860315b63ebced4e8357e83403695dc0d2ca4f159a40e7fd25b969a48bed72beb677eea1fdee0842c7471962cf486199cb45a8e3282175169dbd7c25ff0fa5d4e800000000000100409407929675e13aaacf807be30a94a7d737986c6f6388568251f9c3625034840777e063e0f31c897e398055b0ad455611290ae566d38db5756d3c9fb85e99620c +00b76bf1623582a5448dab54a0efae39d77d13fd33d32096c004189a0d0d51d50748cb19f1382339ee864d343e29e3ec6a890b0ae0857e56ba40029d56d160b61c4e05c87d604a679a51d073ff9f06ee6a3b1f1975999d179397ecdd00e658fc8cea891eb174d96a819f68b4720daee5483ccd5aecbe17385aa3da1f98fc3e96a8ff0fa5d4e80000000000010040204e9150d42a210c2a18dcc4358c967e84e108288c2aad7fc13e0074c34988101a9a0a2d4ebabbe503d79d38b4e846a9265f43d1609d3afb840540718710f306 +005aade1f71297dec62c82a6f38a2d471457ec9dd61d26bbc0401f5b2940362805ebc8975d2b17112296058b92b5172364d5415f89146ee26da5d1f98e87c3e313428da524c66e4da29f179a31622e7b558c380b7d9b377ce5dfaecea269e5eb0c6a5e125153d42142e0ca85dde219a35b54864805b39905f3807c075b33ea0e84ff0fa5d4e80000000000010040ebaf778906a0c27b30811e13e2d3f1d6e7d4c2b6ef67ada6964bb04be316c0a3b07f83653cbe489d47a2bdbebd8ab6910b4aa163be385eff485fc59e91416708 +00a23f070bc6a854768c962c3094316b6bc0697fd1894f6399fbaf015b7f61af079877484b0c5fcfe4db95ccf98569292ce248eb6e1dabbaaf6bdc9ff51685871eb32347da10cb9bb7dc43487349efd1265699ecb2d0061ee7a0c7bd5c45706f80d9d5913bf6e1292542f94452e9f1823e86bed3e784bd30fe692ef7b55b38cc14ff0fa5d4e8000000000001004037841234cc50526dc0f4740931237e09a426821b05f6cbe0a9ca67c3db83698d977f76e227217ff1a97abd741689920334202e3151beeb129f832396dbd9a00d +00f83b54a40491bcb1b823c12d54190a2464dba8f78a2bcafbac86b99d3a8a94ade3643887126ccaf2c3614e0731ff216cfcea6d9cca5d55371344573782bc312847f25a9a97cd9177873e70ca616c6ab192d039bc32d2c4c2ad8afad57db853a0a8421215ca82746df377e85177c466e504e33c1951814f835e9d4b039549eb83ff0fa5d4e8000000000001004016fa5343bd87a4f1fba10d37b2f91d47d2558e229169bb2881262b9e14c3dbaa6faaa621881f54c4e0917608a37eca0917fb95fb4847e9c7cd620b1ed946c60d +00c2cafbabb251db5322f5ea40592b14541ef2b66d32549bc770731081355e490d94de757241971051caa7c95e5e44be5ea4d03a616219ddb4af5835c103fa6117e89a96942948a82efd92ef5895bf4e38ad2e3af23e95dde44def0b37c2d72aacffebcee388761776097de97b8d2f92f8f47dce33ff6a6925a55601885c44030dff0fa5d4e80000000000010040ce1d00d796283daee7681922aa5423cdfbc71c7a347db43339609a7f069b8eb9c4c0d95cd13ea8e6737aac3340e1ac0abc4770c51c2a4d61c555838b4b524c05 +0009d40df737a18f0771cceb2871e205e2e1be4ee4d79ae278f376299e3808fc8f416561c1a35d13beac6f76e82e29c272f6fb8d00341234c6334d869e2572f62b3381d121b3bf94010a7987ddede285772fefcc683f20112254e6e1fa711b8c9501c95e492bab462b845c9e3b966368c369d9d273cdcdef79bc02d2b906876ca4ff0fa5d4e80000000000010040d3f3bf375bf1728b499b4510771d54fa0a5e3f23a8f3bfb0777e8f779b442c97c4f730d4f38ee5fde64217ac57f164d94031733cbb6755c270dd2459c4d0ff05 +000dddc6adec7a17533f12e32f4a729882c331094eb27426f4e69e20cff17e3187007b95b58a4538a758d9ccd411e40e382737bf91d7e4f0ee1975fda2ad0aa4017dbce9744eb871c022263271f5c190d7369220e22b79c257551ba5570d318028cfefba55b9f9fc8c3dacec267c3cc98483fd86e883ff33fda59a0a7a75b5ef2dff0fa5d4e800000000000100400c2cb9cff0f103c7f5580b416b6a055f6eda541ad4b9ce7be375e47b10982c09eddad169f2a565a49062c7f2f489654315d04e23ec192896bdfd836399a7090e +00cafe2b3bc2717d4a182e60bfe94cb962800da7c4577a0ca6a06d09239566dc8c1e4a7d3e03f9d4389770b61d939168fd8ef542a861f6798876e3e3d207a5d9217cbba583561de3cd45c67bbf11729c74e9bea45dabf6d5b140401edd571e669ff7973b1a0ccd0ffeae6fed4b395e83b75ce98d926539a9bbcf01b8d1059ed11aff0fa5d4e80000000000010040437592b607d73cb9c6384fcba932a4a96a24ca0dd717cc55ff6ce53aa05599dc5f6cbf3922fe698fd17763fa89f6b505a07147b4352fa7ed39037b5fe6ca680c +0096c86d9071ab373de6537e99c1b2c82ad3f17a970b070315182add3837a9c38840d541779bae85e5c884533d7cc68e8403e90eaf3f7ff5e5e27c3cbc07ac9807b5ea2900909d8ef17201c42e00ad97a497809592d5fe8c5634637302b7fcc30404f5676c1247c6c8cc9e839c45fc575897e7709ad346e95446d4b999987dc80fff0fa5d4e800000000000100409aa98b4d6334243ef382c855452c2ee2aa44ebf0587b6c85c048d2dbc6d326405596aa0f07fed72d5b3ae308d58fb049219235bdf6aa860aa8fab49d72f2a309 +008605551cdf8e54055b1316491798b0c3996c13e11e34ae2194af705400b85f81cb29c08a3565ae8b68325f8fada32634dddc91bdd09e75743a6bc10496d2a903e0441c77564b4bdab39b36f6bbc20e5d8730a1b54b5c817d52f1e7b0eb3d261f18c56d91597a4ca0549280413dfbabdd311a16632fc1d3d5269e51707bfdf314ff0fa5d4e800000000000100404cd2c44255b4c2fa71fd3328a506255e35f9e3602d82d1c7d3ece9c9735743b5be879a53627f002c37e1ab8412c8fb0ebfe2ad836052663f186a09da4919a207 +004731060966f4b36cad23514d42429f3ce00063010f0579a0f653fe0df64ddea76fe4c4ac35df456d9ca9af04da0a201626d4b5263fd13bfaad103683509e1e25c3b205e2c8f65e311ba92e58472fb28a056f221047cf799709834fa6fb8cb7026cbf46d6cd8f4e83ec4f6c9f73ed83b3260039dc73b4b8bab0c76b244302ec01ff0fa5d4e80000000000010040cf5b067fc19a7fc07f13e2ee77d407ee73e785630bd342a2e88e432b91d9aa5e9ca121d2725da57873ac2551112ea1c93e56b8f73d1902ac0017618ccf701e02 +00b451aaec91e5c5a828ab06445832130a0d95fb8942ff783e9253c563aa1fc594316724b545468708d58c3806ecfb7b406959a221052c3ef70f24b8cf012ae9288e3bd990a285b14ba7d77cc27e15f51f699662055a76aa99faff8a3b93dfe9a89e7c3621b053bdb7e021fd81959937328f962af52f635fae31d3c9f43b01129cff0fa5d4e8000000000001004033d55024954792398fc1105c15412ec61b214f8e2aefbea9ba1dcfa9aef8441103088f652d652aebd60021485e03319d479503869259622e4a41751573c76e06 +002e0e6e6ad100046015364ace5d095553c430fe27287ee682890584c5f425851dab40f7cbbd57130645c8c19910e0b0adc7c47b8e5f285a158bb0649713476500af0e6d3d0f040abaaa346701f8b172494040890f278cd0bc3218289573c1332b8b35dd985b9b1d8ee1b57cbd47e32396033035c69eac82d03f5c2d5b4474b123ff0fa5d4e8000000000001004051bdf67a69af849b8f4f19ebd9eb72c363ea3e5b1eb5caf61bb03b69621b3f6be89a367221f8e270b07852df6f4ab7b5f06d5d3db37d19042ec54959d5de8505 +0093fc32ca4f577de1d53fbda5b914623030218e7ed0f1b8d62e585af18447b91ef2dbcdc71db85d6cf66024a34d37e80176c21f8b674d9b6d5418d446cd572026fc033e6a0d123c9a5229e28d4f774bc406fdf70afb92296a886525d895d81ba6c4a33bc68765ae56886eae3f90032e3e5ef76288bf07e104b465c5dbad508791ff0fa5d4e80000000000010040f628af9ecacaa15c35d3d9989c038f4f7465c0cb435a45920007da7955ab32ab660252062bbf499c2de9716a7c2c5c8d20877cdd288a4766342f83c763ea990f +00e01849566009f7f28a4a1c6743fa5cb2538daa10a785941fc1b3a25249e4d0096c821cb0d746a135210f785e705c6c9f1d54eb25c9f77beb86ede26c94b304233f09fd7d4ee0e2b3f8c48ea39dcedefcb40857b4eca915834c4d2374c2d4941a4c2e3ed29010b1fc5b7e2871ed1199957cf913f0b68937062ddd8b69b95d1d16ff0fa5d4e800000000000100404be8d870bc77d86a7b8649802041213e0703968024dc3274d49109be789ed2ae2bd8b0c17ed0025970541ab98092827a0e0c83b937032f8f3f82d2b3a6cbaa0a +002767c147cb51fc249c1e60d1c2928fb785c19f5b30efda55d614d491d9675397b068329d9afea0948ae3cd2eecdc12e447d36b505e9c1d4f850619eca51da814bac75d176a3e6e366b84dc732b06168088399cc8fbaca899092e6e0fd90180006d1d7ffa9d282e09f68d970d0d72d36a25753fe41526bed52337793593d8ac9bff0fa5d4e80000000000010040a596a58208dfad892c3a16e51ba4340ac8a26830b6acce9e3c1b3719718a7571578b8594a7e44276e344f929179e8331ee2028442932a9179d0631cb73966008 +00cc2e02e84b44d402ecf98334c57cfc0ad8c57445f1fbaabd7be304bdd73cd1035d1654553f9c0ee5c4c28ce7fd8d95f1ae2f4ac731270f36a09db35993feea097fdc1d8c7310d0d96aa54e66b155df922a8e9af90ef595c212dbb7320fd465142d42f89358254171228fed14dfcaf2f86c5aea9d5f74a06cc55257bea776cb28ff0fa5d4e8000000000001004017dc4bf16098359d444332f1e6998ab5d5640f5952651a61d89c58d50f9746a24ff12263328a2bfddaf7f868ac86b158e898dfb2e40855659b35c315339f6206 +0025a7ae5f1d05ba9c2e444be24a6e9daad925231263d855bed0e70ea716743d94bef6296a3247e7d1969006aa2271899a16f5930be17b978f4a426d978ef9e909726bba7b683000eeab5306578b02dc7707cf5b4f607dc355e07616d0112005997d54123f4c39325bb484aa897d4052288d5623d7796c7802932542121349108fff0fa5d4e80000000000010040125aeb086eff4f1f8b49b32f64b58ec7c7785fb2c82df6d1559efe9bb718c186d88f897ecb92db109e227b03f05ed87d296137e2b53d164d51d9181f2e9ec50b +00d0feb607ea32de75ced1f675b1428dfb01f721eb1ba6bf1173d71517a969fd86a87e5c71640f78193ba203d64c90124a81450f03c56844dce549a9b55106711f0c9b8c4888660608bbaf23efa6749aa12e8f97a604f5a323615ca67bca5f7b219ee50f23de0ea0180913c444e15c85ba9b4e3dfb86bea59022a0b7f98ce823a0ff0fa5d4e80000000000010040fef07ed2596f78654f30b3d00455b3491fd13a46512ebb86bcde1e14c0c92f3bac3596ee86920706910c94b1f9ae8105893f2138dbefa166fcca8e6f24ec1105 +0044d941592430e8c17d0007d8122e36708524b5032c9f1951a1628276d17d1804c7615709e24273913e0ac5ede1ddfaf47d78154129e158559901951e658dcb0322d33572586760c7777dec682ab28bc64091c0cd26d2e91a778c104801d4420b0f283f8583b3c38d1670f9130e322b76eafd76fc931398e56b5b056615cceaa0ff0fa5d4e80000000000010040609ed32fcfc5a8415c2a8236bb9709461dc37a3e6341c8650bb58a9f3fadeadad28f3af9270774d4b7324200ff89b51767ec352d4b57b310e898d8078fae650e +002953ed23ecf986e1ebee13406e874a7861e8a77c0a4130266a815ac9230ba41d83a7ca3fc6c46e3395d4813ed6c1bc97dbf8cbfc24a6526173f9510bc199d406bde87527a690f1f1f493ff60bfe768445fa42389b44f37b309d6757d3179c290109118f4b24038ae102d90f90e50bdd9b5b6eadb7a665a3d21638b734b5a212cff0fa5d4e80000000000010040aa985a08c34d4714725f4060f2a743aebd34033049d6e4a89efd8da799f7d72c6393522e40010c47c25d96a72f2ee2395726c585ab4eb33224ba135697c01e07 +00655f3a0de86e0ff15273f16051d4eac176ea9f19bd3d22822fd2600128b590217c7c1ec192518c385bdc38c7a5bd97710b2ffa0cf9422bbb8e16f991219e3321fbfc163d07ba1ad4367a72a816ddb2beac95a158e35b078e3cd2233fa18da9a16dea98af7713b904c1e980d3646bf97f188b83ea00ba72d7512819f1238bef0fff0fa5d4e800000000000100403aecc2a179f7eba9421e16d85916dd64b9f82677599efd076422ac0bcf6cf414b561d51656644a5616e1b9b2d9a4cb8ace0ee8b394276a3851400a6166a3e202 +0030da0e55f1df08c0480ad052c7c4bb1bf8ddbf82eaf8519f1f3b00dc6982d42e42f874cab69c37c0e7d73bd0bc20830a0e61148c9c0241431889c45887c7ae284ed16cc7da5b3de9965a4bec697419fd46751eed5ffd4bd62c79aaa6c7a90d9402318ad1733a902a90bbec045b584fb430b761c2bb36976683562958811c4a0fff0fa5d4e800000000000100405aa010e74b5cb243dac57f391e7a855112abab1c6b432643513c02d18dda7c87f21eb599889d8e997c26ce67aaf1c69d776706bc71a0b68bc22a86a748ce8402 +00dd4454e1ad3bd9694dd1c7a366172e38559b2166118507cae425c8f49560d9140678db5f5acb3361959708265bd8b4b30ef7d02cc625f0f38c7ae0f8a1e0842ce130edc806b737f125cfb8688ed7e2398826d71ad333dc88ece9181ff90119098baf9f66398c4d78b6d822f73a46699dc320b07b5408ac106e8e9f039e3cbb97ff0fa5d4e800000000000100406fedc965f82d6a96ca674fca415958844d6895617228077aa08f3935df018720ac1416cdd91c77795c0677d4cbc3b451774f4b3c33e91b86b6ecc60c1872f209 +00a7469859968bebb189b6128c66530ef16b4f92da458dcda10120541bf21ff62891ca6aaedc8e54713a53b4a264e7e2020bf1b91206f89df1f72ded293f984f07508514c54965e4252caba62f444de8bcbdfc594a34bb6da6a15739b24b26cb9f19c0e13a499d292b13e24ef5d95c39c252be8aeebbbb242bb3af37a0a9f3a898ff0fa5d4e800000000000100404a41b151d31032347e3926ee798338bd3a2a455be9ff532d3e4470dbbf1ce271cf2035721dc6aca04144b490da14215469f86907efe9e84f02d03b1a45dd9806 +005e98e70f20365e2ba86bcebf4a37d015e309934201db41af5bb0600553946f0eff5360561e667a230e8c6602bd57690720c53c43f40252c07769f90eb86eaf0d1d663638330fa01deac674571b85b5e1efd15608fc2e7d21bccad11705bc12a9bbec72fceb79f5f04ead6da9bce357dbec44234328fd1a8ccf28e8af31a9cd21ff0fa5d4e800000000000100407312a8a3e3dbd1ab1fdc7094b450132d2e5e8f49ac5867e24044615a717deb5dd8913aab3f7a4b9990075a1b45ca95f17becedc672c062c4183dc0f03a840403 +00f69cf86bc4c4a429a60f122a48ae1248b8e342660f2bb1a2a2f87c7bb2fb1c093ba6ad779c6e03264cc41834db5751ef64f290a78d6bf6f452b31d5f3a06e12f1302fe71339ff01adb3130a43d9eb0598736f33e954b6c3fe19f8093a6c6e9afc4d9423662de26ab091fb73bf58bd80a26ff3a9976481e43b6d220cc9836328fff0fa5d4e80000000000010040354f99fe9da8965b24faeba46885f5eadf5bd3c24e311540d20ce9390b39f8451a8e5598d85035b00e9d6725138f3314c74e1944f98c8d4549689217afdc9601 +00847af0e4a97f626b0bfc3c3ac67f5a65154f0599ac130a0a124fbe03cdbd7303325f591f86278cd9ea7517dcf36916f14ddd1a3315ff576db8654b9f7ef61a0a668656e1a024a3cc93ccd3991c439f6d605cc860aeff8d4d2366f816c47df2a7336b02c926e744f12286f0b81c5d020e9817d6bb1cdbee2d4a35bb72bf6e6211ff0fa5d4e800000000000100404de0796e8293f04f2938756957e726b77cf6f79d5c9a90fb6b956bba94961f4edc4e447996d9d31f3162ac18158d1043f35e2539c16d385572590228a7c1ff06 +006c9f4af78147729945657a2b5cd20d4876044e77696e02b3901c7509c876628ce36772783892e839b0fe665e71888df0cfdd69ef8c7284d6d4d698cc9befc409a28cca81b59b7590dbe4c4f1c4e2167c3b125c38d44a7ba4a5a776356298781b2821efe603f0d8c94d7874b61caf0e0e89fc7b5c47d3c282cc93ecdebba2cf8cff0fa5d4e800000000000100404e247728d22898f8b5ffa425d218b9f7954985d463d8f8af8c5ae8edc0edb7336d23064266af429caa466baae4318ed4e5423ca19524cd0fb96688798f52cd0f +00a0ee01d9bb122f548f4526ddb3f88d4babbe53ca37f32548d6ef1096ffed3d83f296a48c3df33bfb8fbb744ac1ade0efa862498442d595d3b6c0b36f9fd6f510404f19a6fac651f1e835e8f1b40228c0664450632e78512136f1ea123d79fa02aba26ffaa42bce1071c57f832f9734efa175dc3ab3fec3833fe74693b48e022cff0fa5d4e80000000000010040d41171fa95c89a54400fb930f77491285e568e151ac748a7242ca809d7a59810090d692e2086436d30c1573262ab9941ffc10112d167c913676a97f72bb64e03 +008568754e9801c16f311f12351a0995eaca094137e1e187f3ec744d75ea4d53873e4a47f534cdf483f0e2b8531c472efe336a8747e05fda8ed05831d42bfb3d08e5bdedabe1363317bee6f97f94b091ab05f199a93865be2ee3e2be8428a61d2d0c4247254248ba8c53e27c209c85e428aea01ef7c0c8157558c79103912b8d95ff0fa5d4e800000000000100402d5b9b2e7ab52dda4b9fcc0d490939480ae00c020cb246f7224ca19ffaec570029ee8c4170f082316de7cd82585755e350b97b81ea2c3ba87bb0f63e94a42806 +009f8592d7b37d5c780009769d9e3a446735b4ba949aed07718d06351611c1620c4b7f0915c6778920c8b8bbfb8d6c4f6c55a1e01027bf293006eb5d6e6eb5b10a83d1e3c44090a42c5cc9cb1c3bd9be79ddcec29eb5724609ad1158244c7d76a68b30d3a4ac8545f07bca1e4925488faca7338a8db7cc6174518d7a2dc7e71320ff0fa5d4e80000000000010040746c6e746962259b767aea242360d103ab3e0f47de5b2915f37b86c540392bdecab8d6ae98940d18190036a40e26fa6f0a023543d01a0b68472402b47c858d0a +008ec95d5888fc2b0b472992a5f2064089795a077668ac8af6cd1ccd5a5c7e8e2eb1dd241e18c8c1412e56fa41609ca5afaf9cfa8023aaed59d4dc260aca87310215e1c0ccd52f5670b66b544c3175ee00281f6a770d4f7ba86efe70e1647435814e16aa81f5444b82ee691da2879f3fce3c33c8a994ed847de9fc3be69cdc82aaff0fa5d4e80000000000010040dd5f7a47e3bea521eef574978ffe141f244abcfa2a640594ae77661cf10cb6e4ad9cc4b50d46a7be6fad30f35547bb3a22afe9e51e4933279c0bfff8982c900d +008d371be26fe3b44a7e237799c08b029ea53fefe0b703259e81b83470738c63932787f67db8a43cb6847b754356395ef6a96090613b351f86e10e811afe2f1e02702e5e947d7683b7a299385ac2aae711f1fdf92cbab27fddb9e619e6175f4b883ea3e792cd4bf555cc49af01bd63258771d64309a3ab755e271c64e314f2e1adff0fa5d4e80000000000010040d8c9776a70a727e0f9d2fa8bc0a0450415ef4a5a75abdf3e0bb394d5547c5e6b01e3a0dc3f0e443a44d9650154afc6031230d738cfd023f6952449bf35ff1003 +004dd94074f5d692b7173714418c6984c68316c93547f219d476b3f236eed168944b5f1824454c4e2f35f77b63e6c313b0342929981105e3e0c67f5382780a8228b7780545d17921cee800b71489ae011e8ff46342d2b1e20974cd514590bfd11b09de91d4630c23f75e85fc7af7fd8fd0992d161101b7a91c915b5290a6fc93a9ff0fa5d4e800000000000100406ea886b5bc417ee9954da42a6e9de0e7478c34715a13ce1e8e9b99de4de9272cc30d1538c0ad8db9957b1cef3110cf6cd199bb68a1e971bc85aedcf8622b5805 +00ff4a01c6ea36f029aa42d68f50acd03cd26754f018938428a8098ac5b28b7f1571e39937011e993d33f0f2eab31ab05366205af1fd0fe32f28185c564a568911cd63263e9f4bcfb65d394f8179b002fc7ef9af8505a0f3bee59eac53e964e811456b9628746fee1c61158bc77604c01fc63b5723f3e2edaa8a81b83b73d20d21ff0fa5d4e800000000000100409676d5221a182e8b864f26cbae7ea0fb40230f034ab1d7cbf8c9f9654439c232b03491b5d376475fc0d54b554bd4fa3de1ec6d5b89d8a5c968a66b5d622ceb04 +005ae078bb20958bb86d8c477a028f617983530115896b8dfe9034c951210dca1d153cb0836df754d597a1a748e56a2ee3989fe94dcec54d44b397245ff392770ef422ab4ec5214a1712e4aadc6972cc38664cd50c73b107afb11c366431c93dadec02115b8f58c0bf863a74e422d9d5d0f88d64945ac2e370ed9800e9e5c1c584ff0fa5d4e800000000000100406ac5984a4e1a3550dbc33965261fd3ca50fa6cd591c30e228adaebb4f561fb0e97e18da01209d6448b431821941481433b8604f904cb44e82a831170d2678704 +000cd86a47e26b9d3acb9f7e90bdb9ed9f5c463c68bc2f760c9822e91c92c72714601de3514b3e3caa074af17bc9bb8984ac5c3fed9fccab24e9e5714018bdb10f650f91428a9d666b96b17341d843f263e584fc4a6a8de6cf8145fc5daa735d18fc4ab3f951f3d1a498036cf0a21e0f7b8af40247887387d173218a732c34c487ff0fa5d4e80000000000010040a1ac480eab78ca9b606ac3e83595c654497ba1df24586f68e5d65926a9c8d7649fc81940c7be59f70fd9b7a415fe6bbcaa1b724754db12b2cfc915ef94327c04 +0008484d17e2c0bb523a37eb8795f89ce6e828d19f12aac9267d1b05565c4f16aa148e5ce8f51c66b9e0c8764fc5313f052ecd3951bda168b6a05e82a5ea4e660a386c49b6dc1911088f9a27909bb323ba1eb39dd8485d8bad523d7be983ba8d92ac15f9735bbfeebedf0b238dbaf96d5d1a2564ce7b9696bc4a05d60f5f6ca620ff0fa5d4e800000000000100408820dd77eda803c8dea0bb062484c2254f1140c20cdb942c068e48ba667c4b5880dc0cd6ea22ea85170986610686dbc32398c0585c67766d72b3bf3ba24b6a0e +00e942a3a24bce9d65d812fd7d63e00bc299b38a1abe9edaff5ec9bef44cf124a4032dffe8d53dcf8450316decf2dc892ffa4bb76e9c4334aa2fd09dd5c137f92a5ab3ee10e7b74ae5b1a9a762b5ffaad4c3512f28198efef006ac5f09e36bd89ab41f0e5b88bd5f9d7a13a4f94f6b98a65f360599731968147371c8f400e0dcaeff0fa5d4e8000000000001004032509d709ef3f09b0dcb2c9309d61c1971a4bda264071a7500d6d73462530f8f4a19fdecb4b7e298d021b869a24984a12357aac1e270f5c7690e7e6c5c9be30f +00d00a8318746837f32f527c161fb45eb13cb0b17b42a42f849d534a4decfb5803de13b85a87fdf5567288b322611aa9351e0e5b6004ebd1ce2ad149399f67881c4a6181f5db1cab43773a3029beb793c3f6e2653cb0f02eefea0c012cd4c3850c1a552ce690b5df1120069164f34ce4b40835706e1967d0fa98f49afd88d12a8aff0fa5d4e8000000000001004071826af1d298416e3b070d267b2ad0f97e22e80e304b546e2a8322fbc6ccc0230c2d01f053fa73b467ee37f024472dcec7a3b6d23c0ba23532ea9661c129490e +00510e5646cc8273a667e3d55c7d84b816083aaaac16cc119b74fbab4773642607220eea77e3ac9358a24b1f3a86a0dad63bf76789f56505307be90a5fbb83f51ed7b1ba2b611dab7ce247a01fb4869fd735c0d0f1b7537ac40b21efcebbde7707f90694f98277c3e8ba834264f8a827990e414f85a30bc22921922e936b2137a4ff0fa5d4e80000000000010040dec2f0fb250639b61f9e82e9d0118e7ed3fbde13e989349cce4c89e6f5a045817e328427816c0f9a409fcbc6f39094a8b3b34f5f4da3cbb44a6e2fe3a7f5d801 +00474cae839ebb441ee63d02bf60e9dd430b0ec9a41624afaad83f50b512770599c644c38565863db49076a55c47d0555f2972cd35ad1414d692699b60345255122849ba90ef5ea795b218953391767d8f734786c2d25da0cf76cc31ffbd3dac2d0904faca5c383abc9c09744c5f4ccad7506d9e204e9e1c0aa8fa2fd20298bb1cff0fa5d4e8000000000001004026fae12fbf5e5454adb7793852a9b7bd444f77e501f2922f27262d57a156293879820438e2a8df0c36c3384c93a4f0c3ee7b98b3e29f0dcdfbb568ea7dbefd0a +00aa2d59464eea30880ac1ed8dac6f998d0fee30fd43bf6e0638e9b6ea330eb5948cf364bba0d42e818ddbd772117cde83740158f2db4a13449ca0bf8f787c4b2c5d5bab7050807d1a9e8480cfb5520899c5df47eb48387040becc69f3d04ba51ae9d5f0759b1d5df398b73abcefda88d05c6b80f08f320df1c36d54d5d039b12eff0fa5d4e80000000000010040a6f57ca40a2d02f16425ad0338e38d4b22a1aed7d502a6cc9ea47a58c52db155d5358d793a9f87cf2c9de7d7e9b4eeffabda657200483b47a9ba03c74dffe202 +00c74f306f8efccc8bde40e0b1b3858a065fbbef8ebaf0bd7b448bc107b311b029840af1f5ea8496171dc895c682b9fc5f9aeb55dd9ae705132b472b6f3b9eff0b904413b124f8cc78bed596900f13b1bf86511631ef245ff2472502e62288911d3072107a22942f6b7c2441d566926d5d173b6f68f4381716842b30facaee1217ff0fa5d4e80000000000010040a6a3fd01d8d582fa8d7f628eb6a93b195901faeccd2eb1e766ed146930cde1bdf6e53ea0171f06e7268f27a754ceafd59ca107523a9a3990d5f7334597314f0d +00d3f703dcd1f7cfd5a992ea86a59e5a61c78866f3db86cab92d38caa2a95128002d3f5986ef620fab313544ca972d4a123e450d71a74a8d57f7f824c8eb5d8f127241e9ac60ec56d7293f2c7fdba9213807ca2606a02f08d7d106e9544e79fb9e8fe7895bfd49898fc90b3e0c6b3b2128fb8a6ec2622f1156d05d2cdf8a80241aff0fa5d4e80000000000010040ac6bbf740a6cb357a61bc64012932626e42bc5a6319f53633af20d3a78adeb5419096793fb65ff372570ce48c90803329f14b8058d3dcc5003cc76e7309cec0a +001037d691a111b4ae521f72a9b77e981e01f57e29306274fcee484cdb2883079c64b3cd04470a059b47f75a4490e8389d88782cf5bbced7e075cf3f32656ebd1171969fafcacc5313f2cad92a16e8c0a04e04e5ab9b664ad4b4907cbba1d7600fbe21372980ca80dc5c39b9cc7f7bf63aab3f0bf4bff3595e051cbca91c78df22ff0fa5d4e80000000000010040f5b3070caf2f8bba2c39c925fb36f4985f375330ef94941c91d6f6f13a5db49c44a404ca0cedc0e13a070b74f4237501f3394a645b12b78f3ff038f4a478fd02 +007f5fe5dbb1160de6c5d4989ba57ee3285e18c596ca5f01d241a85c02b2404c84bc8c111486b5cea64453a1393720b2b1f620560ed02f2f6201b3a16abfddd522ba709c8f6a24db0e20943c90384b79a2c6b9f3f7a97772c1c0382df8880bab16dbf1b261387ef7a323d73229d441464238937cc99fe9a9cb175299b354ef6814ff0fa5d4e8000000000001004026099512b9a4c2ba8db8dd5c353e89c307ed2f2ee0de8ea45eb95b848a9dd7240914eb93d09c1e80359b777ef23e8bdc2449af17b2d26d435475b7b81189a60a +00120741a89e8e6f1826d1f6f393acf8ce0e0809bd8666ce5deaf7014b870542890d2e32ef4dc7606eab5fceb63778d01c057078adf966aad979ce229a3bc31e2f091d62f633cf74b49e2db8b5dbbc7794b3b164dc21cbbb8446add8e9f53ac99c2e62d1dd9e59cf143100e5039e5a71200bf2cfccbb94a4a26f40893139667b85ff0fa5d4e800000000000100409a6d840230cf52451647a45ca7a0f66f45aa4a1119989b8f9daa244d2a661b21e65e68508eaa008189bdfd4d29ce94c7696a83dc87b140e1d412ea2c82c26701 +00c1127ec1d4ca9f7be465aaf9ca6e8ee54dbcbc0a8d729a580f993b8d78c8dcaed3a6c6830432ee8cd2e204f2fde182447315f1a3a15138ba15382ebcc95d92078b64172b97a31105823719e33d7839827391573016da165c18d5443bcb33b60b8088ae14aa1f7bbc76aa36b3f38d18c123e7be9635b117e6379245e631eb9a2cff0fa5d4e80000000000010040dd22726ee449aad9f9a21e64555c6272cfce48a935c19529f7b58e4b04ff8435a7fde063144e606a187358e9f7c64c1372be261e983be2f7157f3e03f9ced906 +00334b62cd3be382bf01b327685bebc61e461cce499b003be8a7307593f574f9811dfb9d32e4744c23b9646ea447591ee7ad5469ca3c8073096de43e55b6cd4516d7b9c63777d393eeb2108746a2f1b55c2971b7cf57bb8fb94662ae2279296a0f1623d522f035c81f043c1b6d1c3e3aaa815f21fb9b880bfd00a8bc00b8c396aaff0fa5d4e800000000000100408ef9731b9d5cb08f04fa2f1e7d234ca7ed1985cbce3e4ce3fc771357301aeff7dc00ae3aa13a0f02d575d6343e1a748e6fb15182dffce3635d83daa4f1968005 +0009c9b52f752caf750c1568dd5579408541f9aa9a36b0279cf39efa524a9ae4914a856ab82dc73f2b72e21ebd3dad8099ae4ec78a3a07770f19f5aa16fde8ec24cd6c0908d2588cb7a75e246425d22a24005c596446bfea33db786b7cc5a8cb2f16c9cabbacfd61728a869c20a2570678b52868501250f02049cdf36cf442f922ff0fa5d4e80000000000010040dd04eeb816824ed8eb9b99248c607e88897b57184e4752ec62a75c10704f0e95619383a9db431b4fd6c09a8aa1bc2078bf591280bab7832509b8f9f61afd0608 +00b9cd6fa5f310bfa2293bd8222cac4fa2978f04114189b64c00882555012031045cb41a0c562f001bd31356376a4fae6419387772a21969fa71a385c96034c512036a99edc89c716250e33526dc36799c2772340a6dbf67bfdb4dbdc154ef3a2b5bd7c102eb155c6df4f13c37a2cf3c69701181d525ffc208f5341bbac2da6ca5ff0fa5d4e800000000000100402cf2078adc8137788e622dc29263d6d539f7c1440089a780e7a60a830b42259e9b407c6968b3ae83be747b05f08781ae7a278ca4350850ec4e2daf72472e1c02 +0048247964a36f6e1151c71246fa2658ed8f74bf60d0f28a8536fd332a69f4c4909d0cf20c94d9696b5fca94f23f946cbda9ef1417eef4ab09b5ee4b99d5014d223fdae5e908c133e1f3c4d342ca2afd2848a892ab8c4dbf3b88d6af0a11ac920d2fcf309e08e54277574ffb9eb84084cb438f037b394eaccba76f7dd3c1fd899eff0fa5d4e800000000000100404dcb79646d570eb77e6b85bf3a58f689903faf927cd3876f204b784d26705e9e535f0e2c9a2a9fe06a13ce90de7c67e554cfca9d0a0114e4f86c1bc967253205 +007df9df652d1418a57792750a9c1344ae2aa95e9c72bcaf68564f59adcc5b202c3c9fec2635a113f3a506e9c4c5cb8c285b53f19681e7c20b39e1c6e5ac220b2d45093c97477c9e010c4820aa94b839b14303fc707ea180c05ffbdea3591288af5cd2703a91e8296b8b35d071e65a6bcfec9683e3e821d0c1cec5bd042629bd18ff0fa5d4e800000000000100408cf9c28a695cb9103878c05a9d0ca5eec8472d79d099ceea1f1d66b32f310dfee20ab15c37c7d935418cfef9ee790f53a5470908510ea18f09c5da95ffa6a301 +0025d6773f737a739dfb0fed4a3ea49043ca7a8492f293361dfd9bc421d5fb311323e72fb6c2081179aa88d307e589d4d3a44d502be6ea7463a157c80fd35a152c5e9219831e7dd8680ca4c076ec3c5ae83977d0a3d9f75636f88fb6bdab0bdea41b635ed6becf6b965346a6c3b63650363c5bc1b26722849efe4378a9b7a09c82ff0fa5d4e800000000000100405f4528c7d45b6725ff733f8b1a1340bac7376c530d4e2c2444ace556133e351afb6bf507695b0698e3b83224c3d7de458417bb0850611f52b1f5cbc4f44aef0a +005baab7f37f12950b43dac3c216dd534d7d30d14f64d5d3f87d72a67da5fa3918d8db6a7e4b4556f21da4822f7b6697540efa78dbc2b749f374684b6b4ecff41967331027cecf3e9d098706bb843e838420cf4f49c1caded2ced15ca6545c7c8d4f40be06eb616b829bfa7a3edd5dd59593dd62bb8c25887aff31d61e6e711086ff0fa5d4e800000000000100403e1ec2f2b5c76eff733f8f2a99d4ded1623d70ae96694b48beb0c53985bc1b7661bb79c0bbc8b0cd619546dd69c5767084252512e2b4fde54eef9e727512c508 +001a100206f8be082c8e67e9e20be82447ec58b6ea306a394afebb4790b97eac12b10169a5655ae32f564fc96162f8acfa6c087c2be9cca352093725d97ec48b1de3cb7d0672f40d296cbea87ccd7ca31729f6547458ebb6a7c51b10eb5037c11baa420f1f634177ed8274362031e51217e4d8fa5af43f302e5763e4108de7040fff0fa5d4e8000000000001004016335528be3269e490e3e8372582d1990424b71a880bfb59011e26143635a6b4d81ea0132154afb3a2ff78c78fb73b75317a856a003a2d065a77e1cc8de1600a +0081f828110631f0ac284f5bb76e7c02bcc56a00d7467a75202f3f25b209906f2e1262924408c8c9f399a8ab1e57da3dedb0f2b1bd08ec935de718b6efd3777b23c98cf477ead8ebbb0dc3fc7fcaf180b38f7a2b5ec1f7bd8337c0fae4c326f89706b4bb827296228fb6b688fc1cfda7293a7f317de909ed90de2d25a479b8a629ff0fa5d4e80000000000010040f44c5d21d4b78abdceaa45b9f2037df8c792d892a9de9e43dfb9974d3661738e261a4f672ec7025075ad7ec256379f358ce244dcf6f8033b99cd0861ca2e8b0c +00425b97e45f8c7ffcbe89dcb39bf61045447c85a31cc50cbd7380e63628324e8b2d8038bf0c34966cccb8d9bad3b0300c15e6c71b4c96bed5e7cf9143a145090950d333df4eda3aa7a9636af7c2013f38992b4d92c23b328745cb48c953e84989676e95ab10f3a12e065bb5b93b79820380757f9140b43af469896f9b697f0e17ff0fa5d4e80000000000010040ea6932b19ffce97d17ffdcf0b51bfb3a2e658e5f157eb19fe2bd3dda670518c82569376b4d70ef3401c46632fb71e22e13bfc58a20697d0eb6e63bcb0a3a2e0c +003e2fca822932f3f75b9036b7e5d066e8dfd3198de2be90cad33cbdf346d0fb06f82ef024ed50bec889cdbf59ee0d195cd43c779028275643e1862fc4f8935f04345edd0dab3a1c86f5a77b090b11913a35757e1e038ec605330893f1f541e42574c222b089fa61fc99ec84a4ce57bdcea3e2db4314cf7f61994e778e5031480fff0fa5d4e80000000000010040324041eeb4b2a5f7691492d78ae24a7e3edcde8754b4871d4a01549f5c5f62f110fbc89cbc9b159bb4356d4edb44eac5e51ad0a8a6bd3990f8fe05847b37e005 +00439ebb486025b11b846a851d43a1a5fcf330f5138f8ab1d0dc06b0300109172b8dc1f75e2be72db7f9688517480578cb2e61b7376dc6da9635fc801c62c2fe09eb75dadb38ad29d11e6b0c662ac107f9ad875e13ac971156f99ddc0a3c29351f9d02fabadd10d8219282499d32b026f27b164bada12aa8286e0af92626c5ea2cff0fa5d4e80000000000010040adbb1378997c6a882056b2d961c04ba2326e9f7956e66dc545a27b289d42b84f5afc46402dd310a9d7bec78155a88e1ce450834c203edf8ffed1592de8b40f07 +00fd9893707e772df683de9d58eea5211df3b15da1640ab9ae82b620d892b9d1870bb02ed4140806256e13bf74b2ec1c443135a88c7d15e57bd578f2b1355a1f2b15c9253206ecc9a84dd60e3eef90c69ddd849bafb51fec548f26825c6fbdee193747bc2a3ae1be983b895875740583f392a1ae81bd13c5d3ce9b6925b0e185a3ff0fa5d4e80000000000010040ffddd672d16ce450c200c4e8cb77b679636d6fe6aca06af01bd2dce82c80cb6e4f17af58715b033c7b61ac1114ae0761fc14e47dae5350c37882862722218009 +0099ed22a1a76d43c37b20d814d27e9891e865b408921acac798337ff20aa88e9bad329e2c1d6a59446ac6ebefd3fcfb64d148e62eeea55435844299f928527505c9ded13c502dbff0af7a7458871efaea03c6fae4561bac99d75738874c976bae6b4643d81fa04903df76bdbd4d7ccbf1be0b14da81b9f3844abe0a356f7ed583ff0fa5d4e800000000000100401611e012c76f37d14da5124a39be513f2efda5b4211d115d57ab906abefb03cb4b528309d39faebbba13cb70c19fc72c6d91f4249d8b1ca5577e651cce941c01 +004e27da87d221b2e627b98e2ca83a3e88e5ffb9b33b243c46e2a9ee1f190d471babef74f89ceaedb99daa99bec6bff0bf6183982bafe9fe79036e8ed1de91e625e7302ea04d9f58dce070aee37927b2d70baf759b38b806bd1a0eb112ce33179d9670f9ae2bd43d02cfd9ac2f8300c273e3189bbf14f742c4f30a36cca2d0d02dff0fa5d4e80000000000010040302b420adb1f1730fe05864eb0608d7fa7c9bf34357c5f744b3e11865e8beb45c3e7c727a250acb5aaf16714dba77d79e69029c44dd4db527fac7bd7b6e31801 +004ba66bcf13f7f8606d2a852b67b3b4c11156a52467276db5922f3334370b3f047888baa8e060acaa0d119e35dc6cc016603fd5700561b4a6352d317193f16312b01e607708fb02c80889734669425a168d837ed143dc92f2c671f87033a61697fe777a1fec3840ea73597071cede5cf25871c7e21dfc91df659d8d3de3108c96ff0fa5d4e80000000000010040e025e953537cf137fbbfff2655fe23978d6bcee57f2d3b4256f0c44982d8366bd030e37845febc87b98c6d847f877bbcd39634baef27c1c50dc8a0679a82200d +00436696bb7cde1d9f838d5d5bc8dcd401e73731827ff63c056fe7d367837a971446b5d84b18b4468c0385a5db2dc192c0f9965f6f003f896ea0f04f7c40340d25800087970b2eaecc106d0e6798d65d96bbabc37af37d583bfa6d26b38cd8748596d71321336ca98ad65840ac7c799701de96f3c02d23a41a1c5b3b7b8d9f060aff0fa5d4e80000000000010040421502d1911513f3d3235dd9687c5a352c950b896e07733f57db0856d19cab3faf21e4160a4b890dc68313bbb7519d026bbfe40596edb4eb4a7ad8fcd3db9509 +00ee1958f63a5e2ce4bb11287e2089269e86e01157d55826f089ab9daa65d0fa02c2ddd5687dd8fa18a68d9271e1ad7dfef88573f8fdf330bd8f9a5517a15eab235b4a3d14d882781039a47022d0ba2cf0687859bae4067af897c4c7f8022dc58af692e77e0b30e07b13baa3027bf30732cb3554e19eb8ceee9e59af210dfc8104ff0fa5d4e8000000000001004023b8f98ee6d3268ca1703478ac85badc188b3bd152f8c567e142ca8f099e8cacfa8360c17fea0fd0732e383cc639ed38b2f88fd4e5c591b82508065c19c29700 +009cba1c38041530fd2aaae6890632cf5e707f4999e7b5ec1bc9dafd0dbdde3200906ad3cc44fb7e31603eeb445ff9be4e37aa86b1292a9391e510f00b0d94d023b04a5644b33548e04b12c015973a99fc0c4a52768a386f80b7ce0f40606a49adceca5c3c55685fc0bb3aed23b08b0bc7ab67001b09624ce1728f0e2a4e906e9aff0fa5d4e8000000000001004093f3b8177f4ca6417f73ce59562b0fa6b561383d9d4df2e382db298e03cf6b69b0c784fa0d9696a756044830ca4120c2ee90e68971d456ac0e841592469cf00b +00fc816883cd2fe23e920732bf99a4cc298c43968e7c881464100fa8a37245df0c6024858a56036c6d6df969e3ffad3bd3b9351066b65a74a75bc4dfbe08580412a9139f595b32086d1c4e8ffe39541d2ce95dffe485cbe578ac232136c58c84066d5a4d5d095d356c516d1f60849c68bba56c76f6408045ebdd56dde0a89cbc0dff0fa5d4e8000000000001004043025de88ac8af13283b98cccc641b7b44cf6f9b88a9f54df0e0f44da424e372ef4e206be622a8138cf3a6c89ae0f63e2141a8e42a3fc468f691b79cf383e107 +00ecd69db83e7957e9344ab47cec594359f750297fe5c2bf8929a18dff6df9b794ff98520135b02cd2c839cc5fa5443bbdd16caeef2761acf9d38c5939c304621bdf336eb23e5fa2ddd730bb799e9a67fda807c6f2e6d63b8f296ce57cbfe085044dc05bf32b5261e5624427a1e41eca70d1a9acb1f3cc9f4fa11f89febd804d97ff0fa5d4e80000000000010040f6bb1ca91eb0d6501746b489eb510f1addd9c151796c54ffeb3b9cad371cb3060135bd0290cb70410045e4059f64cd1939aea3ec2e2fee904394b732504ac202 +002892ebff76586d0da4c770532fb051c91d9fb80d5db40827a51a9d29644e24297d3b249adae472c135d0aa0a06e47ab1ab54ccc88ae4bc1d11fd45d92102f026d89639add53d4884771025f38a683b401b8329c3f91710cf9ce3cf463916b72f245c48fad59d8b6cd5f966fb557d5228df9ff5533c0b516193d1f29d88429e84ff0fa5d4e80000000000010040cc1b4ad345f1a2b8e3a655bfd4433f73a8df7e0a48d03ff31a474f69c8c15e260d555c62e4f82f4e7acb8be6b2f44e6511c6fb2d3e7c1bdbc5f5f4b5cd916204 +002870bcdf758a72f37009e8f4d55c3fee0b6c2294f0e9106819afcebe09219c10d571497691e42e58d6cf0480c29f7fc6770eaa9451b081a500113238556d3013b8898e5de4be80d477b33cd2e16a0eda26248323b741f5b5410bcf8b77d62b9d2aa3e6d4f6f1f119120378538da93a56d832f5b0e30b362331dd599fd0126d08ff0fa5d4e8000000000001004067bdbca580881125d288b4db2449a34c03db648c1012a09d6e62301bf32e46e8a3c8a6e39cef8ee119f35b87c8651c9b12688664297984526a00a2496d745805 +00c159e2074630c5f3aea41733b6e0e340d0a470e5e0491c44e6d9b256a1d92c02d38b5ec1df90891fe74820e2cb406446dbcf035610e6282980e2a4ecf44a7f20b8c817ae309767dd675dac691f12473e2eebdf91cfcc2ce4651f9119732b1a8d18e4d6cc28433dcd769269785f5b1283020b6ded3e3d09f43eac9c434011941cff0fa5d4e8000000000001004006aea297d4995a71d0f0e3be5e19f71319abdbeadd5f77f0da05f20e4030f1026e610ceb0ce7c8057dcbe387d62bd5d213d98ae9a576ecaebcfc26b974eff009 +00187366e37ae704527be77d2ea9388252acd8eb914337ec8976f1dd3b5612362546ad86b053434f414636b94360893792c97022e01fff405cc209213cf05c972adfaee6efa91e50dca0643cad837a4036cccd0f79d0477053866888e3e4db4198cb8cc76009d1b07ddd329c2056033b74065f2062a952066172507f4a6e01bfa4ff0fa5d4e800000000000100406c17f31bfd518a02454c6b77eba93ea00bc533b724ceb7300cc6f4a3c072a7d06e080c4593660300aef43e8e8ae45e1bd31dfb8857d0395118ac3229912ac102 +0050c2adcdde30ab24c80df9941821ed49125d508a73d1238ef2c8f358d20ac4ad381f4500d7614975dd786059bbeaa2bc850596f5e56c6ce9f006e4dc39b7d40e42993e21fc5897b4ebc40d44b5d802551b948ac9bd2502d44534e4af8a13f3a91ca5ca3db14aa41cd49dda0f8065ba52306009185bfcecb12b5d71c095ae46b0ff0fa5d4e80000000000010040d4e62d12e1131e6e068de6c436139f8bb01eec7818eaa6ba954242d8f34de1e9c54fe2437d0bdd64419d86bab11eaab2bc7c341616f64e9f83950ccaf217e30d +00eea98ac4c5263ad50e3c56f9d22fc29ad249bcc8c5a43167bbcb8572d810359130ba5a4c43fc0bf1626b143db88f3f2388181d3f079935c7305b4e7b292a242773a96272df03481f2a7a3dec3b84ff75d7ee0f7da6c9d5273993501f2b1a1e8c8a9b1bbe8ac4fd55a99a76f004a3102d87158f6188463a9ff568504f01f6339fff0fa5d4e800000000000100404a6ff5611a20f3438252f39da5e83e9888650eeebb4bb9955b26654210dda6a49509a072e6baa49dd8e531bb2d65ccbcdd9e4b3f4f3e3fb1078ba67fbc62d005 +0036691f817e34629233929fbda81887fd7b8189508053f4b09c97d2b3ebafa39e12dd129acde9baedf5931724d33ec71164af04c852194c4131e1a8c33022291f8166ab95e07355dc5af8cf9c7313fde3bf2b1ae46a97b7e47d2e0d2c629a39128895e81a2fe4152efb05df3d8f9902e6fd7d100b8951bf9e89b2cb71c2d4a607ff0fa5d4e800000000000100409e57c99d6a1a687af27cd569dd6be4f5e6b0ac50b4da14aee342cda3c5f308cb7b063c6be3abc261e1049afae1c7000f4fc0e6af24a28a5ceeefd0da698efc0c +00a72c8d01456daf403d786da64a11cfe463b20e20fde072a38453301c4466241855edb9f3c0318a1953e15e89591b7b2728e7ae6674c7f83a468a1cec97ca020a1e18ca7a4a506da49f33351acc0ed026c57a3b89b56387e603bf2ba47bb7121a785312d6b1fab6d2f191e797ac08276f141648d17c89b7416c0f054f687a472aff0fa5d4e80000000000010040cd2018c67e75cf3003a3db2fdcc41fbc901d72548fb21ad1cb650cc9bcb2cb86d67b43ac3c0fa2efeaf4a23dc6c0f6dd7482e2fb156c94a37dbec8a873e8850a +002cec2949de70b91c8e7e2d839a24aafb9da4864df482c9a5c5642ce10c3bed003544e1f991eb7497b2975cbe3dcbf53f70ab574aa7afa729e9d8a68e6ee4fe161b18991a72162d131ef4cef7f1f8a729db0dc253ec834a0e50fd5fe477ff879bb124af3b4bfa5b9d8a5b1f91b4900f1f1eb7e5dbb7db1ff076b157f5a9538485ff0fa5d4e800000000000100400f0516506f038d17c304b9290d6179cf62d805411d31abb91d1e1aa75d9f9f8a2bcb822d9adc850a185d527db9b5859d375366658d288f2a6bba690416ac0e00 +00d428b326a970fa48c6118b0603772a4f82f5b4a988446edd67d6f5fb2e99b8a48c44d1ea5e20326d90d4a03db8c7caec15c859a13ae9b2dc3c4713aef2825002c2f2ad26cdd1f8a67c02c5e891b9970d1c73e0f5e0b020853614b9e83e853898d3fb743d00d744959199250ec8ded6f6bfba3929faccc147e82a9f1971439388ff0fa5d4e800000000000100400c07f2d470a587bff324140d7d850ca7e42ae9a0a2fe5d2f8096a467afa02b00f369dc0f212f5b34830d81a463d2e30bdfc5aab5695af391299c1bd3e43ffc07 +00038a606b5cf99d25f1651896a30e4d2b8805e0cb687d8e625345a4b1a8afcd904d28ae95dfc15166cd696175ec463f92bffed832f151071ef718dd35c4e1c9205e36aa1d141e6a4af3edcd59bf36a035e90cec076eae0a02170d586ddec12e805f9957927a90de33b3e44da89ed4ac214a36422bf2538042e4cf5fa1859d8216ff0fa5d4e80000000000010040887e7fd7b6c563ffd0cb342ebab359d7b39d1a5880bfd444d31cf9c8c5f8c5f119c3f76e59e9a307eccd4a1ebf7cb763bc5bdc897384ff9477fbbc9c0bd30c03 +007a0e46d9f856b71af6ec53959ffc41ab6c84e5e22f3f336a945a6c25e695b81950ad836896c026dfa9c853751491365702e61d02db25286f6b69ee53375d5b21793735ab1465718b903a08f2fdeadd4f8f3aa94557da3aa6c80d44effe7bb59cc7a734b1f70fbc3359f406b65c3ffd473ce0f3415e88f1abcbf2a9551f218a92ff0fa5d4e8000000000001004022297791d03a8b9fddc9e4ea9f66e140c33af8fcb679593a549c0d7e4c5441cee7f70c365d007d403a3045a3c6f20cc37cdd26f763d960a2deefbf73a0108305 +00f0460cf474a82a90a4696887b502422922a456bcb0365f6a3da7004022d18c12e2ed8e988b586c74d6c4590daa9a803ac8e7cbca9e3c74100a2b73941ece2413f4c01a727af63cd65f5be61ec387441df64eb9914b0034ab98d14ff7c099d38fdcfa40204c9a8f8d081ebb3b3a70eaa6c9579aac5491834305ec1ec74f14a6acff0fa5d4e800000000000100404046c5ab8fea47dabc45e640f855f7fa1af244a270af8b1aae6cab205b455076d272ddda8aff6b185f59d83df677976016d55f32abd0e8d744a51b8dcabe760b +00eb4b225a88b27ed221faf850d0b22e3c8b0b3bb48f58b0d541edd0eee1b69f8c91cd88fb42bd37e1d4a2da3325dce3f0373704657660acfbfddf2cf3e906fe1e6895ca0b237f724a0139900043bdf921fdf171c5abc3462cb1b4e7c5d3f2cf2a2bdecf11abdb2a0b2df53160f7e6404f5af77ad74243744a3411e39200ad4511ff0fa5d4e80000000000010040c4bf10c77c0e2c3c7e87332b23a074357a01a990b58617dde1f138c33634d07edddf69044b090d9330f693d48f84252efafa3d7a14d4d013b6ca04296a143b0c diff --git a/crates/transaction-emitter-lib/src/wrappers.rs b/crates/transaction-emitter-lib/src/wrappers.rs index 4314371229bbb..2cc2188104b89 100644 --- a/crates/transaction-emitter-lib/src/wrappers.rs +++ b/crates/transaction-emitter-lib/src/wrappers.rs @@ -5,10 +5,12 @@ use crate::{ args::{ClusterArgs, EmitArgs}, cluster::Cluster, emitter::{ - account_minter::bulk_create_accounts, get_needed_balance_per_account_from_req, - local_account_generator::PrivateKeyAccountGenerator, stats::TxnStats, - transaction_executor::RestApiReliableTransactionSubmitter, EmitJobMode, EmitJobRequest, - NumAccountsMode, TxnEmitter, + account_minter::bulk_create_accounts, + get_needed_balance_per_account_from_req, + local_account_generator::{create_keyless_account_generator, PrivateKeyAccountGenerator}, + stats::TxnStats, + transaction_executor::RestApiReliableTransactionSubmitter, + EmitJobMode, EmitJobRequest, NumAccountsMode, TxnEmitter, }, instance::Instance, CreateAccountsArgs, @@ -16,7 +18,8 @@ use crate::{ use anyhow::{bail, Context, Result}; use aptos_logger::{error, info}; use aptos_sdk::transaction_builder::TransactionFactory; -use aptos_transaction_generator_lib::{args::TransactionTypeArg, WorkflowProgress}; +use aptos_transaction_generator_lib::{args::TransactionTypeArg, AccountType, WorkflowProgress}; +use aptos_types::keyless::test_utils::get_sample_esk; use rand::{rngs::StdRng, SeedableRng}; use std::{ sync::Arc, @@ -103,6 +106,29 @@ pub async fn emit_transactions_with_cluster( args.coordination_delay_between_instances.unwrap_or(0), )); + if let Some(keyless_ephem_secret_key) = &args.account_type_args.keyless_ephem_secret_key { + emit_job_request = emit_job_request + .account_type(AccountType::Keyless) + .keyless_ephem_secret_key(keyless_ephem_secret_key.private_key()); + emit_job_request = emit_job_request.epk_expiry_date_secs( + args.account_type_args + .epk_expiry_date_secs + .expect("epk expiry should be set"), + ); + emit_job_request = emit_job_request.proof_file_path( + args.account_type_args + .proof_file_path + .as_ref() + .expect("proof file path should be set"), + ); + emit_job_request = emit_job_request.keyless_jwt( + args.account_type_args + .keyless_jwt + .as_ref() + .expect("jwt should be set"), + ) + } + let num_accounts = NumAccountsMode::create(args.num_accounts, args.max_transactions_per_account); @@ -202,11 +228,24 @@ pub async fn create_accounts_command( emit_job_request = emit_job_request.account_minter_seed(seed); } + let account_generator = if let Some(jwt) = &create_accounts_args.keyless_jwt { + emit_job_request = emit_job_request.keyless_jwt(jwt); + + create_keyless_account_generator( + get_sample_esk(), + 0, + jwt, + create_accounts_args.proof_file_path.as_deref(), + )? + } else { + Box::new(PrivateKeyAccountGenerator) + }; + bulk_create_accounts( coin_source_account, &RestApiReliableTransactionSubmitter::new(rest_clients, 6, Duration::from_secs(10)), &txn_factory, - Box::new(PrivateKeyAccountGenerator), + account_generator, (&emit_job_request).into(), create_accounts_args.count, get_needed_balance_per_account_from_req(&emit_job_request, create_accounts_args.count), diff --git a/sdk/src/types.rs b/sdk/src/types.rs index 9fe8e149a8737..9464ac593fff0 100644 --- a/sdk/src/types.rs +++ b/sdk/src/types.rs @@ -14,7 +14,7 @@ use crate::{ transaction::{authenticator::AuthenticationKey, RawTransaction, SignedTransaction}, }, }; -use anyhow::Result; +use anyhow::{Context, Result}; use aptos_crypto::{ed25519::Ed25519Signature, PrivateKey, SigningKey}; use aptos_ledger::AptosLedgerError; pub use aptos_types::*; @@ -61,7 +61,7 @@ impl LocalAccountAuthenticator { let sig = KeylessSignature { cert: EphemeralCertificate::ZeroKnowledgeSig(keyless_account.zk_sig.clone()), - jwt_header_json: keyless_account.get_jwt_header_json(), + jwt_header_json: keyless_account.jwt_header_json.clone(), exp_date_secs: keyless_account.ephemeral_key_pair.expiry_date_secs, ephemeral_pubkey: keyless_account.ephemeral_key_pair.public_key.clone(), ephemeral_signature, @@ -516,50 +516,82 @@ pub struct KeylessAccount { #[allow(dead_code)] pepper: Pepper, zk_sig: ZeroKnowledgeSig, - jwt: String, + jwt_header_json: String, + jwt: Option, } impl KeylessAccount { pub fn new( - jwt: String, + iss: &str, + aud: &str, + uid_key: &str, + uid_val: &str, + jwt_header_json: &str, ephemeral_key_pair: EphemeralKeyPair, pepper: Pepper, zk_sig: ZeroKnowledgeSig, ) -> Result { - let parts: Vec<&str> = jwt.split('.').collect(); - let jwt_payload_json = base64::decode_config(parts[1], base64::URL_SAFE).unwrap(); - let claims: Claims = serde_json::from_slice(&jwt_payload_json)?; - - let uid_key = "sub".to_owned(); - let uid_val = claims.get_uid_val(&uid_key)?; - let aud = claims.oidc_claims.aud; - - let idc = IdCommitment::new_from_preimage(&pepper, &aud, &uid_key, &uid_val)?; + let idc = IdCommitment::new_from_preimage(&pepper, aud, uid_key, uid_val)?; let public_key = KeylessPublicKey { - iss_val: claims.oidc_claims.iss, + iss_val: iss.to_owned(), idc, }; Ok(Self { public_key, ephemeral_key_pair, - uid_key, - uid_val, - aud, + uid_key: uid_key.to_string(), + uid_val: uid_val.to_string(), + aud: aud.to_string(), pepper, zk_sig, - jwt, + jwt_header_json: jwt_header_json.to_string(), + jwt: None, }) } - pub fn get_jwt_header_json(&self) -> String { - let parts: Vec<&str> = self.jwt.split('.').collect(); - let header_bytes = base64::decode(parts[0]).unwrap(); - String::from_utf8(header_bytes).unwrap() + pub fn new_from_jwt( + jwt: &str, + ephemeral_key_pair: EphemeralKeyPair, + uid_key: Option<&str>, + pepper: Option, + zk_sig: Option, + ) -> Result { + let parts: Vec<&str> = jwt.split('.').collect(); + let header_bytes = base64::decode(parts.first().context("jwt malformed")?)?; + let jwt_header_json = String::from_utf8(header_bytes)?; + let jwt_payload_json = + base64::decode_config(parts.get(1).context("jwt malformed")?, base64::URL_SAFE)?; + let claims: Claims = serde_json::from_slice(&jwt_payload_json)?; + + let uid_key = uid_key.unwrap_or("sub").to_string(); + let uid_val = claims.get_uid_val(&uid_key)?; + let aud = claims.oidc_claims.aud; + + let account = Self::new( + &claims.oidc_claims.iss, + &aud, + &uid_key, + &uid_val, + &jwt_header_json, + ephemeral_key_pair, + pepper.expect("pepper fetch not implemented"), + zk_sig.expect("proof fetch not implemented"), + )?; + Ok(account.set_jwt(jwt)) } pub fn authentication_key(&self) -> AuthenticationKey { AuthenticationKey::any_key(AnyPublicKey::keyless(self.public_key.clone())) } + + pub fn public_key(&self) -> &KeylessPublicKey { + &self.public_key + } + + pub fn set_jwt(mut self, jwt: &str) -> Self { + self.jwt = Some(jwt.to_string()); + self + } } #[cfg(test)] diff --git a/testsuite/smoke-test/src/keyless.rs b/testsuite/smoke-test/src/keyless.rs index 1a3048fa14666..d7af6aafb1175 100644 --- a/testsuite/smoke-test/src/keyless.rs +++ b/testsuite/smoke-test/src/keyless.rs @@ -5,13 +5,12 @@ use crate::smoke_test_environment::SwarmBuilder; use aptos::{common::types::GasOptions, test::CliTestFramework}; use aptos_cached_packages::aptos_stdlib; use aptos_crypto::{ - ed25519::{Ed25519PrivateKey, Ed25519PublicKey}, - poseidon_bn254::keyless::fr_to_bytes_le, - SigningKey, Uniform, + ed25519::Ed25519PrivateKey, poseidon_bn254::keyless::fr_to_bytes_le, PrivateKey, SigningKey, }; use aptos_forge::{AptosPublicInfo, LocalSwarm, NodeExt, Swarm, SwarmExt}; use aptos_logger::{debug, info}; use aptos_rest_client::Client; +use aptos_sdk::types::{EphemeralKeyPair, KeylessAccount, LocalAccount}; use aptos_types::{ jwks::{ jwk::{JWKMoveStruct, JWK}, @@ -21,10 +20,12 @@ use aptos_types::{ keyless::{ get_public_inputs_hash, test_utils::{ - self, get_groth16_sig_and_pk_for_upgraded_vk, get_sample_esk, - get_sample_groth16_sig_and_fed_pk, get_sample_groth16_sig_and_pk, - get_sample_groth16_sig_and_pk_no_extra_field, get_sample_iss, get_sample_jwk, - get_sample_openid_sig_and_pk, get_upgraded_vk, + self, get_groth16_sig_and_pk_for_upgraded_vk, get_sample_aud, get_sample_epk_blinder, + get_sample_esk, get_sample_exp_date, get_sample_groth16_sig_and_fed_pk, + get_sample_groth16_sig_and_pk, get_sample_groth16_sig_and_pk_no_extra_field, + get_sample_iss, get_sample_jwk, get_sample_jwt_header_json, get_sample_jwt_token, + get_sample_openid_sig_and_pk, get_sample_pepper, get_sample_tw_sk, get_sample_uid_key, + get_sample_uid_val, get_sample_zk_sig, get_upgraded_vk, }, AnyKeylessPublicKey, Configuration, EphemeralCertificate, Groth16ProofAndStatement, Groth16VerificationKey, KeylessPublicKey, KeylessSignature, TransactionAndProof, @@ -40,7 +41,6 @@ use aptos_types::{ }, }; use move_core_types::account_address::AccountAddress; -use rand::thread_rng; use serde::de::DeserializeOwned; use std::{fmt::Debug, sync::Arc, time::Duration}; // TODO(keyless): Test the override aud_val path @@ -380,6 +380,122 @@ async fn test_keyless_no_training_wheels_groth16_verifies() { } } +#[tokio::test] +async fn test_keyless_groth16_verifies_using_rust_sdk() { + let (_tw_sk, _, _, swarm, mut cli, root_idx) = setup_local_net().await; + + let blinder = get_sample_epk_blinder(); + let exp_date = get_sample_exp_date(); + let esk = get_sample_esk(); + let ephemeral_key_pair = EphemeralKeyPair::new(esk, exp_date, blinder).unwrap(); + + let mut info = swarm.aptos_public_info(); + let keyless_account = KeylessAccount::new( + &get_sample_iss(), + &get_sample_aud(), + &get_sample_uid_key(), + &get_sample_uid_val(), + &get_sample_jwt_header_json(), + ephemeral_key_pair, + get_sample_pepper(), + get_sample_zk_sig(), + ) + .unwrap(); + let addr = info + .create_user_account_with_any_key(&AnyPublicKey::keyless( + keyless_account.public_key().clone(), + )) + .await + .unwrap(); + info.mint(addr, 10_000_000_000).await.unwrap(); + + let account = LocalAccount::new_keyless( + keyless_account.authentication_key().account_address(), + keyless_account, + 0, + ); + + let recipient = info + .create_and_fund_user_account(20_000_000_000) + .await + .unwrap(); + + let builder = info + .transaction_factory() + .payload(aptos_stdlib::aptos_coin_transfer(recipient.address(), 100)); + let signed_txn = account.sign_with_transaction_builder(builder); + + remove_training_wheels(&mut cli, &mut info, root_idx).await; + + info!("Submit keyless Groth16 transaction"); + let result = swarm + .aptos_public_info() + .client() + .submit_without_serializing_response(&signed_txn) + .await; + + if let Err(e) = result { + panic!("Error with keyless Groth16 TXN verification: {:?}", e) + } +} + +#[tokio::test] +async fn test_keyless_groth16_verifies_using_rust_sdk_from_jwt() { + let (_tw_sk, _, _, swarm, mut cli, root_idx) = setup_local_net().await; + + let jwt = get_sample_jwt_token(); + let blinder = get_sample_epk_blinder(); + let exp_date = get_sample_exp_date(); + let esk = get_sample_esk(); + let ephemeral_key_pair = EphemeralKeyPair::new(esk, exp_date, blinder).unwrap(); + + let mut info = swarm.aptos_public_info(); + let keyless_account = KeylessAccount::new_from_jwt( + &jwt, + ephemeral_key_pair, + None, + Some(get_sample_pepper()), + Some(get_sample_zk_sig()), + ) + .unwrap(); + let addr = info + .create_user_account_with_any_key(&AnyPublicKey::keyless( + keyless_account.public_key().clone(), + )) + .await + .unwrap(); + info.mint(addr, 10_000_000_000).await.unwrap(); + + let account = LocalAccount::new_keyless( + keyless_account.authentication_key().account_address(), + keyless_account, + 0, + ); + + let recipient = info + .create_and_fund_user_account(20_000_000_000) + .await + .unwrap(); + + let builder = info + .transaction_factory() + .payload(aptos_stdlib::aptos_coin_transfer(recipient.address(), 100)); + let signed_txn = account.sign_with_transaction_builder(builder); + + remove_training_wheels(&mut cli, &mut info, root_idx).await; + + info!("Submit keyless Groth16 transaction"); + let result = swarm + .aptos_public_info() + .client() + .submit_without_serializing_response(&signed_txn) + .await; + + if let Err(e) = result { + panic!("Error with keyless Groth16 TXN verification: {:?}", e) + } +} + #[tokio::test] async fn test_keyless_groth16_with_mauled_proof() { let (tw_sk, config, jwk, swarm, _, _) = setup_local_net().await; @@ -647,7 +763,7 @@ async fn setup_local_net_inner( (tw_sk, config, jwk, swarm, cli, root_idx) } -async fn remove_training_wheels<'a>( +pub(crate) async fn remove_training_wheels<'a>( cli: &mut CliTestFramework, info: &mut AptosPublicInfo, root_idx: usize, @@ -691,7 +807,7 @@ fun main(core_resources: &signer) {{ .await; } -async fn spawn_network_and_execute_gov_proposals( +pub(crate) async fn spawn_network_and_execute_gov_proposals( swarm: &mut LocalSwarm, cli: &mut CliTestFramework, ) -> (Ed25519PrivateKey, Configuration, RSA_JWK, usize) { @@ -731,8 +847,8 @@ async fn spawn_network_and_execute_gov_proposals( let iss = get_sample_iss(); let jwk = get_sample_jwk(); - let training_wheels_sk = Ed25519PrivateKey::generate(&mut thread_rng()); - let training_wheels_pk = Ed25519PublicKey::from(&training_wheels_sk); + let training_wheels_sk = get_sample_tw_sk(); + let training_wheels_pk = training_wheels_sk.public_key(); info!("Insert JWK and update keyless configuration."); let max_exp_horizon_secs = Configuration::new_for_testing().max_exp_horizon_secs; diff --git a/testsuite/smoke-test/src/txn_emitter.rs b/testsuite/smoke-test/src/txn_emitter.rs index 937509f8cf38f..0a8b2c6fac653 100644 --- a/testsuite/smoke-test/src/txn_emitter.rs +++ b/testsuite/smoke-test/src/txn_emitter.rs @@ -2,15 +2,18 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ + keyless::{remove_training_wheels, spawn_network_and_execute_gov_proposals}, smoke_test_environment::{new_local_swarm_with_aptos, SwarmBuilder}, utils::create_and_fund_account, }; use anyhow::ensure; use aptos_forge::{ - args::TransactionTypeArg, emitter::NumAccountsMode, EmitJobMode, EmitJobRequest, EntryPoints, - NodeExt, Result, Swarm, TransactionType, TxnEmitter, TxnStats, WorkflowProgress, + args::TransactionTypeArg, emitter::NumAccountsMode, AccountType, EmitJobMode, EmitJobRequest, + EntryPoints, NodeExt, Result, Swarm, TransactionType, TxnEmitter, TxnStats, WorkflowProgress, }; use aptos_sdk::{transaction_builder::TransactionFactory, types::PeerId}; +use aptos_types::keyless::test_utils::{get_sample_esk, get_sample_exp_date, get_sample_jwt_token}; +use once_cell::sync::Lazy; use rand::{rngs::OsRng, SeedableRng}; use std::{sync::Arc, time::Duration}; @@ -22,19 +25,76 @@ pub async fn generate_traffic( transaction_mix_per_phase: Vec>, ) -> Result { ensure!(gas_price > 0, "gas_price is required to be non zero"); + let rng = SeedableRng::from_rng(OsRng)?; + let emit_job_request = create_emit_job_request( + swarm, + nodes, + gas_price, + transaction_mix_per_phase, + AccountType::Local, + ) + .await?; + let transaction_factory = + TransactionFactory::new(swarm.chain_info().chain_id).with_gas_unit_price(gas_price); + let emitter = TxnEmitter::new(transaction_factory, rng); + emitter + .emit_txn_for_with_stats( + swarm.chain_info().root_account, + emit_job_request, + duration, + 3, + ) + .await +} + +pub async fn generate_keyless_traffic( + swarm: &mut dyn Swarm, + nodes: &[PeerId], + duration: Duration, + gas_price: u64, + transaction_mix_per_phase: Vec>, +) -> Result { + ensure!(gas_price > 0, "gas_price is required to be non zero"); let rng = SeedableRng::from_rng(OsRng)?; + + let emit_job_request = create_emit_job_request( + swarm, + nodes, + gas_price, + transaction_mix_per_phase, + AccountType::Keyless, + ) + .await?; + let transaction_factory = + TransactionFactory::new(swarm.chain_info().chain_id).with_gas_unit_price(gas_price); + + let emitter = TxnEmitter::new(transaction_factory, rng); + emitter + .emit_txn_for_with_stats( + swarm.chain_info().root_account, + emit_job_request, + duration, + 3, + ) + .await +} + +pub async fn create_emit_job_request( + swarm: &mut dyn Swarm, + nodes: &[PeerId], + gas_price: u64, + transaction_mix_per_phase: Vec>, + account_type: AccountType, +) -> Result { + ensure!(gas_price > 0, "gas_price is required to be non zero"); + let validator_clients = swarm .validators() .filter(|v| nodes.contains(&v.peer_id())) .map(|n| n.rest_client()) .collect::>(); let mut emit_job_request = EmitJobRequest::default(); - let chain_info = swarm.chain_info(); - let transaction_factory = - TransactionFactory::new(chain_info.chain_id).with_gas_unit_price(gas_price); - let emitter = TxnEmitter::new(transaction_factory, rng); - emit_job_request = emit_job_request .rest_clients(validator_clients) .gas_price(gas_price) @@ -42,12 +102,63 @@ pub async fn generate_traffic( .max_gas_per_txn(2000000) .coordination_delay_between_instances(Duration::from_secs(1)) .transaction_mix_per_phase(transaction_mix_per_phase) - .mode(EmitJobMode::ConstTps { tps: 20 }); - emitter - .emit_txn_for_with_stats(chain_info.root_account, emit_job_request, duration, 3) - .await + .mode(EmitJobMode::ConstTps { tps: 20 }) + .account_type(account_type); + + if let AccountType::Keyless = account_type { + emit_job_request = emit_job_request + .keyless_ephem_secret_key(get_sample_esk()) + .epk_expiry_date_secs(get_sample_exp_date()) + .keyless_jwt(&get_sample_jwt_token()); + } + Ok(emit_job_request) } +static TRANSACTION_MIX_PER_PHASE: Lazy>> = Lazy::new(|| { + vec![ + // vec![( + // TransactionType::AccountGeneration { + // add_created_accounts_to_pool: true, + // max_account_working_set: 1_000_000, + // creation_balance: 1_000_000, + // }, + // 20, + // )], + // vec![ + // (TransactionTypeArg::CoinTransfer.materialize_default(), 20), + // // // commenting this out given it consistently fails smoke test + // // // and it seems to be called only from `test_txn_emmitter` + // ( + // TransactionType::PublishPackage { + // use_account_pool: false, + // }, + // 20, + // ), + // ], + vec![ + ( + TransactionTypeArg::NoOp.materialize( + 100, + false, + WorkflowProgress::when_done_default(), + ), + 20, + ), + ( + TransactionType::CallCustomModules { + entry_point: EntryPoints::MakeOrChangeTable { + offset: 0, + count: 60, + }, + num_modules: 1, + use_account_pool: false, + }, + 20, + ), + ], + ] +}); + #[ignore] #[tokio::test] async fn test_txn_emmitter() { @@ -60,72 +171,37 @@ async fn test_txn_emmitter() { &all_validators, Duration::from_secs(20), 100, - vec![ - // vec![( - // TransactionType::AccountGeneration { - // add_created_accounts_to_pool: true, - // max_account_working_set: 1_000_000, - // creation_balance: 1_000_000, - // }, - // 20, - // )], - // vec![ - // (TransactionTypeArg::CoinTransfer.materialize_default(), 20), - // // // commenting this out given it consistently fails smoke test - // // // and it seems to be called only from `test_txn_emmitter` - // ( - // TransactionType::PublishPackage { - // use_account_pool: false, - // }, - // 20, - // ), - // ], - vec![ - ( - TransactionTypeArg::NoOp.materialize( - 100, - false, - WorkflowProgress::when_done_default(), - ), - 20, - ), - ( - TransactionType::CallCustomModules { - entry_point: EntryPoints::MakeOrChangeTable { - offset: 0, - count: 60, - }, - num_modules: 1, - use_account_pool: false, - }, - 20, - ), - ], - // vec![( - // TransactionType::CallCustomModules { - // entry_point: EntryPoints::TokenV1MintAndStoreNFTSequential, - // num_modules: 1, - // use_account_pool: false, - // }, - // 20, - // )], - // vec![( - // TransactionType::CallCustomModules { - // entry_point: EntryPoints::TokenV1MintAndTransferNFTParallel, - // num_modules: 1, - // use_account_pool: false, - // }, - // 20, - // )], - // vec![( - // TransactionType::CallCustomModules { - // entry_point: EntryPoints::TokenV1MintAndTransferNFTSequential, - // num_modules: 1, - // use_account_pool: false, - // }, - // 20, - // )], - ], + TRANSACTION_MIX_PER_PHASE.to_vec(), + ) + .await + .unwrap(); + println!("{:?}", txn_stat.rate()); + // assert some much smaller number than expected, so it doesn't fail under contention + assert!(txn_stat.submitted > 30); + assert!(txn_stat.committed > 30); +} + +#[ignore] +#[tokio::test] +async fn test_keyless_txn_emmitter() { + let (mut swarm, mut cli, _faucet) = SwarmBuilder::new_local(1) + .with_aptos() + .build_with_cli(0) + .await; + + let (_tw_sk, _config, _jwk, root_idx) = + spawn_network_and_execute_gov_proposals(&mut swarm, &mut cli).await; + + remove_training_wheels(&mut cli, &mut swarm.aptos_public_info(), root_idx).await; + + let all_validators = swarm.validators().map(|v| v.peer_id()).collect::>(); + + let txn_stat = generate_keyless_traffic( + &mut swarm, + &all_validators, + Duration::from_secs(20), + 100, + TRANSACTION_MIX_PER_PHASE.to_vec(), ) .await .unwrap(); diff --git a/types/src/keyless/circuit_testcases.rs b/types/src/keyless/circuit_testcases.rs index 9597f994e0856..f58ae07a08ed7 100644 --- a/types/src/keyless/circuit_testcases.rs +++ b/types/src/keyless/circuit_testcases.rs @@ -26,7 +26,7 @@ use ring::signature::RsaKeyPair; /// The JWT header, decoded as JSON pub(crate) static SAMPLE_JWT_HEADER_JSON: Lazy = Lazy::new(|| { format!( - r#"{{"alg":"{}","kid":"{}","typ":"JWT"}}"#, + r#"{{"alg":"{}","typ":"JWT","kid":"{}"}}"#, SAMPLE_JWK.alg.as_str(), SAMPLE_JWK.kid.as_str() ) @@ -57,7 +57,7 @@ pub(crate) static SAMPLE_JWT_PAYLOAD_JSON: Lazy = Lazy::new(|| { "iss":"{}", "azp":"407408718192.apps.googleusercontent.com", "aud":"407408718192.apps.googleusercontent.com", - "sub":"113990307082899718775", + "sub":"{}", "hd":"aptoslabs.com", "email":"michael@aptoslabs.com", "email_verified":true, @@ -72,6 +72,7 @@ pub(crate) static SAMPLE_JWT_PAYLOAD_JSON: Lazy = Lazy::new(|| { "exp":2700259544 }}"#, SAMPLE_TEST_ISS_VALUE, + SAMPLE_UID_VAL, SAMPLE_JWT_EXTRA_FIELD.as_str(), SAMPLE_NONCE.as_str() ) @@ -96,6 +97,8 @@ pub(crate) static SAMPLE_JWK_SK: Lazy<&RsaKeyPair> = Lazy::new(|| &*INSECURE_TES pub(crate) const SAMPLE_UID_KEY: &str = "sub"; +pub(crate) const SAMPLE_UID_VAL: &str = "113990307082899718775"; + /// The nonce-committed expiration date (not the JWT `exp`), 12/21/5490 pub(crate) const SAMPLE_EXP_DATE: u64 = 111_111_111_111; @@ -138,9 +141,9 @@ pub(crate) static SAMPLE_PK: Lazy = Lazy::new(|| { /// https://github.com/aptos-labs/devnet-groth16-keys/commit/02e5675f46ce97f8b61a4638e7a0aaeaa4351f76 pub(crate) static SAMPLE_PROOF: Lazy = Lazy::new(|| { Groth16Proof::new( - G1Bytes::new_from_vec(hex::decode("95030afdb785624d3f305655579775fe216a4780496ccb7abe899dc8a7bcf798").unwrap()).unwrap(), - G2Bytes::new_from_vec(hex::decode("08d5814954cb04ac1f80771f783585162abb2cd673203f7ee22ec87a783f431cc649ca449bc1d2d93ba4aaecd382f94306c23003ed1e1c0592a46c64e5cf6504").unwrap()).unwrap(), - G1Bytes::new_from_vec(hex::decode("117177343a361982883579c3f49eb30b05d79b7ca1e96556be7ccb2ee88ea391").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("3304cc0defd488d770af0439480ec24c8473b30dbcbfad9fdf99ca62256bd908").unwrap()).unwrap(), + G2Bytes::new_from_vec(hex::decode("2f432b9459375ed2032bcb1ff3ccc1dd5d05a752d6956d2bb003f4e3b42d0b242cf4ab4d3dc8dc700ede17bbfeaddedd42033691e3d85ff8d6621663cb2e779a").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("d44ee2772f4b48fdb0dbd8d870d3fb4401cd3a28fbdde535e9c57bac9a263f9c").unwrap()).unwrap(), ) }); @@ -151,13 +154,13 @@ pub(crate) static SAMPLE_PROOF: Lazy = Lazy::new(|| { /// https://github.com/aptos-labs/devnet-groth16-keys/commit/02e5675f46ce97f8b61a4638e7a0aaeaa4351f76 pub(crate) static SAMPLE_PROOF_NO_EXTRA_FIELD: Lazy = Lazy::new(|| { Groth16Proof::new( - G1Bytes::new_from_vec(hex::decode("62b167d43c33169b96c018deaa4efdc5223e095016dc6ee2cd1ad1e61755d8a5").unwrap()).unwrap(), - G2Bytes::new_from_vec(hex::decode("2dd8fcc64014ab9f877c7ba03618cf59c49c69204b981be297dc835f60d4f923192e0f894ad947bd4aee96fd19305eb79ff359e8c341a17e8f6ba470be655e12").unwrap()).unwrap(), - G1Bytes::new_from_vec(hex::decode("5e6e3e076e632f1440327758c634a311d83244ad7d32edcdf66458d7e0ed5619").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("bdfda383c9131ab44dd3d8efe65c59842b28e17467e2d07c4020742407c580a7").unwrap()).unwrap(), + G2Bytes::new_from_vec(hex::decode("d27b4c0296ec1045dd050894c635095c25ff8d89c8adf5da401b3434639c560550e3da14e5ec953769aac9d256ddc9b2a8071c021f271f0937fd5be404f2b919").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("52a25b0b58013a77f8713105d7e0f817468bbdd25d644e9f2a9b3eabd7d4bc17").unwrap()).unwrap(), ) }); -/// A new Groth16 VK to test the VK rotation. +/// A new Groth16 VK to test the VK rotation. Using https://raw.githubusercontent.com/aptos-labs/devnet-groth16-keys/refs/heads/master/verification_key.json pub(crate) static SAMPLE_UPGRADED_VK: Lazy> = Lazy::new(|| { let alpha_g1 = g1_projective_str_to_affine( "20491192805390485299153009773594534940189261866228447918068658471970481763042", @@ -191,12 +194,12 @@ pub(crate) static SAMPLE_UPGRADED_VK: Lazy> = Lazy:: let delta_g2 = g2_projective_str_to_affine( [ - "15739617451905904008434505563810388078669603068902989994513586227673794325099", - "21857380320483623058628157959587768917537193338055331958890662600728443003915", + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634", ], [ - "19098250091710633666997475602144489052978746302163092635335135789683361496958", - "5464980335669797405967071507706948120862078317539655982950789440091501244210", + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531", ], ) .unwrap(); @@ -204,13 +207,13 @@ pub(crate) static SAMPLE_UPGRADED_VK: Lazy> = Lazy:: let mut gamma_abc_g1 = Vec::new(); for points in [ g1_projective_str_to_affine( - "19759886250806183187785579505109257837989251596255610913102572077808842056375", - "8515569072948108462120402914801299810016610043704833841603450087200707784492", + "3314139460766150258181182511839382093976747705712051605578952681462625768062", + "15177929890957116336235565528373348502554233971408496072173139426537995658198", ) .unwrap(), g1_projective_str_to_affine( - "18250059095913215666541561118844673017538035392793529003420365565251085504261", - "21846936675713878002567053788450833465715833259428778772043736890983365407823", + "11040819149070528816396253292991080175919431363817777522273571096667537087166", + "13976660124609527451731647657081915019685631850685519260597009755390746148997", ) .unwrap(), ] { @@ -233,9 +236,9 @@ pub(crate) static SAMPLE_UPGRADED_VK: Lazy> = Lazy:: /// Like `SAMPLE_PROOF` but w.r.t. to `SAMPLE_UPGRADED_VK`. pub(crate) static SAMPLE_PROOF_FOR_UPGRADED_VK: Lazy = Lazy::new(|| { Groth16Proof::new( - G1Bytes::new_from_vec(hex::decode("f8c6b4182fcb28be5e1392297e86e03ed97c0166fcda3861cdb2b17a77778006").unwrap()).unwrap(), - G2Bytes::new_from_vec(hex::decode("0264b7e4bb0ab8eecbed406f02d11f6b0c22a055aa9918a84a81bcf93a5a1324be81a8098c44127eab5cc4fb9cf06d58e1562d69d3b43686d82a1886fd41bf15").unwrap()).unwrap(), - G1Bytes::new_from_vec(hex::decode("58c3e6c6ad0fa09123e4c415b3759b8b61d9ffebf90119b7592a5dc707016299").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("4889b1896f0335f8d375370879136577633c8f7ff6957e66bbb10afe244dfa95").unwrap()).unwrap(), + G2Bytes::new_from_vec(hex::decode("f0e1971b492baf5aff3c5ab2c0083fe2bca911d7414416ca160fce4ae9290d07457a6820251d08500f5f4c3d680b063c7bbb0ab4fe52a509f175cf02ef6afe18").unwrap()).unwrap(), + G1Bytes::new_from_vec(hex::decode("7aab5c31cf2fc43acb9cc470e28c7917259a424a2c9d53fbc1c473d49c302c8d").unwrap()).unwrap(), ) // println!("SAMPLE_PROOF_FOR_UPGRADED_VK: {}", &proof.hash()); }); diff --git a/types/src/keyless/groth16_sig.rs b/types/src/keyless/groth16_sig.rs index 917ef6bf1081f..b0b4db07ca823 100644 --- a/types/src/keyless/groth16_sig.rs +++ b/types/src/keyless/groth16_sig.rs @@ -166,6 +166,15 @@ impl ZeroKnowledgeSig { } } +impl TryFrom<&[u8]> for ZeroKnowledgeSig { + type Error = CryptoMaterialError; + + fn try_from(bytes: &[u8]) -> Result { + bcs::from_bytes::(bytes) + .map_err(|_e| CryptoMaterialError::DeserializationError) + } +} + impl TryFrom<&[u8]> for Groth16Proof { type Error = CryptoMaterialError; diff --git a/types/src/keyless/test_utils.rs b/types/src/keyless/test_utils.rs index 430436219ee22..7b2bdda12410b 100644 --- a/types/src/keyless/test_utils.rs +++ b/types/src/keyless/test_utils.rs @@ -11,7 +11,7 @@ use crate::{ SAMPLE_JWK, SAMPLE_JWK_SK, SAMPLE_JWT_EXTRA_FIELD, SAMPLE_JWT_HEADER_B64, SAMPLE_JWT_HEADER_JSON, SAMPLE_JWT_PARSED, SAMPLE_JWT_PAYLOAD_JSON, SAMPLE_PEPPER, SAMPLE_PK, SAMPLE_PROOF, SAMPLE_PROOF_FOR_UPGRADED_VK, SAMPLE_PROOF_NO_EXTRA_FIELD, - SAMPLE_UID_KEY, SAMPLE_UPGRADED_VK, + SAMPLE_UID_KEY, SAMPLE_UID_VAL, SAMPLE_UPGRADED_VK, }, get_public_inputs_hash, zkp_sig::ZKP, @@ -42,10 +42,20 @@ pub fn get_sample_esk() -> Ed25519PrivateKey { Ed25519PrivateKey::try_from(serialized).unwrap() } +pub fn get_sample_tw_sk() -> Ed25519PrivateKey { + let sk_bytes = + hex::decode("1111111111111111111111111111111111111111111111111111111111111111").unwrap(); + Ed25519PrivateKey::try_from(sk_bytes.as_slice()).unwrap() +} + pub fn get_sample_iss() -> String { SAMPLE_JWT_PARSED.oidc_claims.iss.clone() } +pub fn get_sample_aud() -> String { + SAMPLE_JWT_PARSED.oidc_claims.aud.clone() +} + pub fn get_sample_jwk() -> RSA_JWK { SAMPLE_JWK.clone() } @@ -70,6 +80,10 @@ pub fn get_sample_uid_key() -> String { SAMPLE_UID_KEY.to_string() } +pub fn get_sample_uid_val() -> String { + SAMPLE_UID_VAL.to_string() +} + pub fn get_sample_groth16_zkp_and_statement() -> Groth16ProofAndStatement { let config = Configuration::new_for_testing(); let (sig, pk) = get_sample_groth16_sig_and_pk(); @@ -95,6 +109,18 @@ pub fn get_sample_groth16_zkp_and_statement() -> Groth16ProofAndStatement { } } +pub fn get_sample_zk_sig() -> ZeroKnowledgeSig { + let proof = *SAMPLE_PROOF; + + ZeroKnowledgeSig { + proof: proof.into(), + extra_field: Some(SAMPLE_JWT_EXTRA_FIELD.to_string()), + exp_horizon_secs: SAMPLE_EXP_HORIZON_SECS, + override_aud_val: None, + training_wheels_signature: None, + } +} + /// Note: Does not have a valid ephemeral signature. Use the SAMPLE_ESK to compute one over the /// desired TXN. pub fn get_sample_groth16_sig_and_pk() -> (KeylessSignature, KeylessPublicKey) { @@ -205,7 +231,7 @@ pub fn get_sample_jwt_token() -> String { let jwt_payload_b64 = base64url_encode_str(SAMPLE_JWT_PAYLOAD_JSON.as_str()); let msg = jwt_header_b64.clone() + "." + jwt_payload_b64.as_str(); let rng = ring::rand::SystemRandom::new(); - let sk = *SAMPLE_JWK_SK; + let sk = &*SAMPLE_JWK_SK; let mut jwt_sig = vec![0u8; sk.public_modulus_len()]; sk.sign( @@ -359,7 +385,8 @@ mod test { "exp_horizon_secs": SAMPLE_EXP_HORIZON_SECS, "pepper": hex::encode(get_sample_pepper().to_bytes()), "uid_key": "sub", - "extra_field": SAMPLE_JWT_EXTRA_FIELD_KEY + "extra_field": SAMPLE_JWT_EXTRA_FIELD_KEY, + "use_insecure_test_jwk": true, }); make_prover_request(&client, body, "SAMPLE_PROOF").await; @@ -370,7 +397,8 @@ mod test { "exp_date_secs": get_sample_exp_date(), "exp_horizon_secs": SAMPLE_EXP_HORIZON_SECS, "pepper": hex::encode(get_sample_pepper().to_bytes()), - "uid_key": "sub" + "uid_key": "sub", + "use_insecure_test_jwk": true, }); make_prover_request(&client, body, "SAMPLE_PROOF_NO_EXTRA_FIELD").await; } @@ -380,7 +408,7 @@ mod test { body: Value, test_proof_name: &str, ) -> ProverResponse { - let url = "http://localhost:8080/v0/prove"; + let url = "http://localhost:8083/v0/prove"; // Send the POST request and await the response let response = client.post(url).json(&body).send().await.unwrap();