diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index 79c5f786c48..3b0dab86411 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -104,7 +104,7 @@ library Constants { uint256 internal constant CONTRACT_STORAGE_READ_LENGTH = 2; uint256 internal constant CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH = 2; uint256 internal constant ETH_ADDRESS_LENGTH = 1; - uint256 internal constant FUNCTION_DATA_LENGTH = 2; + uint256 internal constant FUNCTION_DATA_LENGTH = 3; uint256 internal constant FUNCTION_LEAF_PREIMAGE_LENGTH = 5; uint256 internal constant GLOBAL_VARIABLES_LENGTH = 6; uint256 internal constant HEADER_LENGTH = 20; @@ -114,13 +114,13 @@ library Constants { uint256 internal constant NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; uint256 internal constant NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; uint256 internal constant PARTIAL_STATE_REFERENCE_LENGTH = 6; - uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 210; + uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH = 211; uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 207; uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 198; uint256 internal constant STATE_REFERENCE_LENGTH = 8; uint256 internal constant TX_CONTEXT_DATA_LENGTH = 4; - uint256 internal constant TX_REQUEST_LENGTH = 8; - uint256 internal constant ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 11; + uint256 internal constant TX_REQUEST_LENGTH = 9; + uint256 internal constant ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 12; uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674; uint256 internal constant NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/noir-projects/noir-contracts/bootstrap.sh b/noir-projects/noir-contracts/bootstrap.sh index 0d372df5515..d843e9cdc7d 100755 --- a/noir-projects/noir-contracts/bootstrap.sh +++ b/noir-projects/noir-contracts/bootstrap.sh @@ -21,4 +21,4 @@ $NARGO compile --silence-warnings echo "Transpiling avm contracts... (only '#[aztec(public-vm)]')" TRANSPILER=${TRANSPILER:-../../avm-transpiler/target/release/avm-transpiler} -ls target/avm_*.json | parallel -L8 "$TRANSPILER {} {}" \ No newline at end of file +ls target/avm_*.json | parallel "$TRANSPILER {} {}" \ No newline at end of file diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr index 7917108165c..14488c926e4 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr @@ -7,12 +7,15 @@ use crate::{ struct FunctionData { selector : FunctionSelector, is_private : bool, + // Remove once the AVM is fully operational. + is_transpiled: bool, } impl Eq for FunctionData { fn eq(self, other: Self) -> bool { self.selector.eq(other.selector) & - self.is_private == other.is_private + self.is_private == other.is_private & + self.is_transpiled == other.is_transpiled } } @@ -24,6 +27,7 @@ impl Serialize for FunctionData { [ self.selector.to_field(), self.is_private as Field, + self.is_transpiled as Field, ] } } @@ -33,6 +37,7 @@ impl Deserialize for FunctionData { Self { selector: FunctionSelector::from_field(serialized[0]), is_private: serialized[1] as bool, + is_transpiled: serialized[2] as bool, } } } @@ -57,6 +62,6 @@ fn empty_hash() { let hash = data.hash(); // Value from function_data.test.ts "computes empty item hash" test - let test_data_empty_hash = 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed; + let test_data_empty_hash = 0x066e6cdc4a6ba5e4781deda650b0be6c12f975f064fc38df72c1060716759b17; assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr index aa03f8589ef..fb3d8c6362c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr @@ -75,6 +75,6 @@ fn empty_hash() { let hash = item.hash(); // Value from private_call_stack_item.test.ts "computes empty item hash" test - let test_data_empty_hash = 0x13f518365c690d1b96d31454afed495ad29fe530939caf7189dd44f9bd63ef89; + let test_data_empty_hash = 0x06b381be873c42defb570287e3ba23900175838afb6047a27c7dce1f653b4ac5; assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr index 7ffb978ddf1..ec3d1027d7e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr @@ -58,7 +58,7 @@ mod tests { #[test] fn compute_call_stack_item_request_hash() { let contract_address = AztecAddress::from_field(1); - let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false }; + let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false, is_transpiled: false }; let mut public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed(); public_inputs.new_note_hashes[0] = SideEffect{ @@ -69,14 +69,14 @@ mod tests { let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: true, function_data }; // Value from public_call_stack_item.test.ts "Computes a callstack item request hash" test - let test_data_call_stack_item_request_hash = 0x141bbf6bc30f0a19640983354528288239b68edd5c1edd9955a007801230d7b6; + let test_data_call_stack_item_request_hash = 0x09bd19d3ebcda705ab1ed598db287340aed3efda0ad3bbbf3296737bda731fa9; assert_eq(call_stack_item.hash(), test_data_call_stack_item_request_hash); } #[test] fn compute_call_stack_item_hash() { let contract_address = AztecAddress::from_field(1); - let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false }; + let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false, is_transpiled: false }; let mut public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed(); public_inputs.new_note_hashes[0] = SideEffect{ @@ -87,7 +87,7 @@ mod tests { let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: false, function_data }; // Value from public_call_stack_item.test.ts "Computes a callstack item hash" test - let test_data_call_stack_item_hash = 0x05e9e448563aa811c209cc557136ac56b55f9f2f31ee54d41b697389fd45dc1c; + let test_data_call_stack_item_hash = 0x1fe20dd657d73941763bf8437471ac000be6efcb046895014b1a84b5aaf55905; assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash); } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index fcbe5e623f5..9c56ed53949 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -154,7 +154,7 @@ global CONTRACT_INSTANCE_LENGTH: u64 = 6; global CONTRACT_STORAGE_READ_LENGTH: u64 = 2; global CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: u64 = 2; global ETH_ADDRESS_LENGTH = 1; -global FUNCTION_DATA_LENGTH: u64 = 2; +global FUNCTION_DATA_LENGTH: u64 = 3; global FUNCTION_LEAF_PREIMAGE_LENGTH: u64 = 5; global GLOBAL_VARIABLES_LENGTH: u64 = 6; global HEADER_LENGTH: u64 = 20; // 2 for last_archive, 4 for content commitment, 8 for state reference, 6 for global vars @@ -164,7 +164,7 @@ global MAX_BLOCK_NUMBER_LENGTH: u64 = 2; // 1 for the option flag, 1 for the val global NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; global NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; global PARTIAL_STATE_REFERENCE_LENGTH: u64 = 6; -global PRIVATE_CALL_STACK_ITEM_LENGTH: u64 = 210; +global PRIVATE_CALL_STACK_ITEM_LENGTH: u64 = 211; // Change this ONLY if you have changed the PrivateCircuitPublicInputs structure. // In other words, if the structure/size of the public inputs of a function call changes then we should change this // constant as well PRIVATE_CALL_STACK_ITEM_LENGTH @@ -173,9 +173,9 @@ global PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 207; global PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: u64 = 198; global STATE_REFERENCE_LENGTH: u64 = 8; // 2 for snap + 8 for partial global TX_CONTEXT_DATA_LENGTH: u64 = 4; -global TX_REQUEST_LENGTH: u64 = 8; // 2 + TX_CONTEXT_DATA_LENGTH + FUNCTION_DATA_LENGTH +global TX_REQUEST_LENGTH: u64 = 9; // 2 + TX_CONTEXT_DATA_LENGTH + FUNCTION_DATA_LENGTH -global ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH: Field = 11; // 2 + FUNCTION_DATA_LENGTH + CALL_CONTEXT_LENGTH +global ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH: Field = 12; // 2 + FUNCTION_DATA_LENGTH + CALL_CONTEXT_LENGTH global GET_NOTES_ORACLE_RETURN_LENGTH: u64 = 674; global NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048; global NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr index a5f7642811a..247eed10836 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/contract_functions.nr @@ -15,6 +15,7 @@ global default_private_function = ContractFunction { data: FunctionData { selector: FunctionSelector { inner: 1010101 }, is_private: true, + is_transpiled: false, }, vk_hash: 0, acir_hash: 1111, @@ -34,6 +35,7 @@ global default_public_function = ContractFunction { data: FunctionData { selector: FunctionSelector { inner: 3030303 }, is_private: false, + is_transpiled: false, }, vk_hash: 0, acir_hash: 3333, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr index ba6179a05ee..ac29ca6717a 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr @@ -80,10 +80,10 @@ mod tests { origin: AztecAddress::from_field(1), args_hash: 3, tx_context: TxContext { is_fee_payment_tx: false, is_rebate_payment_tx: false, chain_id: 0, version: 0 }, - function_data: FunctionData { selector: FunctionSelector::from_u32(2), is_private: true } + function_data: FunctionData { selector: FunctionSelector::from_u32(2), is_private: true, is_transpiled: false } }; // Value from tx_request.test.ts "compute hash" test - let test_data_tx_request_hash = 0x20af6f595c396494f1177fa196d17e98d55a2416b28c262b76e78a36d6c01daa; + let test_data_tx_request_hash = 0x08e435f993536fd7a9d6faabfc03a18c4314a54d3d90d15a15275fcfe77bc5a3; assert(tx_request.hash() == test_data_tx_request_hash); } } diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index a1ac57a528d..fca307f324a 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -89,7 +89,7 @@ export const CONTRACT_INSTANCE_LENGTH = 6; export const CONTRACT_STORAGE_READ_LENGTH = 2; export const CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH = 2; export const ETH_ADDRESS_LENGTH = 1; -export const FUNCTION_DATA_LENGTH = 2; +export const FUNCTION_DATA_LENGTH = 3; export const FUNCTION_LEAF_PREIMAGE_LENGTH = 5; export const GLOBAL_VARIABLES_LENGTH = 6; export const HEADER_LENGTH = 20; @@ -99,13 +99,13 @@ export const MAX_BLOCK_NUMBER_LENGTH = 2; export const NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH = 4; export const NULLIFIER_KEY_VALIDATION_REQUEST_CONTEXT_LENGTH = 5; export const PARTIAL_STATE_REFERENCE_LENGTH = 6; -export const PRIVATE_CALL_STACK_ITEM_LENGTH = 210; +export const PRIVATE_CALL_STACK_ITEM_LENGTH = 211; export const PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 207; export const PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 198; export const STATE_REFERENCE_LENGTH = 8; export const TX_CONTEXT_DATA_LENGTH = 4; -export const TX_REQUEST_LENGTH = 8; -export const ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 11; +export const TX_REQUEST_LENGTH = 9; +export const ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH = 12; export const GET_NOTES_ORACLE_RETURN_LENGTH = 674; export const NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; export const NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; diff --git a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap b/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap deleted file mode 100644 index 5e018af31d1..00000000000 --- a/yarn-project/circuits.js/src/contract/__snapshots__/contract_class.test.ts.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ContractClass creates a contract class from a contract compilation artifact 1`] = ` -"{ - "version": 1, - "artifactHash": "0x0000000000000000000000000000000000000000000000000000000000001234", - "publicFunctions": [ - { - "selector": { - "value": 2381782501 - }, - "bytecode": "0x1f8b08000000000000ffed9d777414c7dae65b2030782c01ced9c2e13a60632144163038e78c8d31c62004061b104118e76c72744ee49c93c91803c6d8d737e7ec74af6fd87376bf3dbb7fecf79dddf56ed74cbd9f1e8aea4123770d8f34d5e794a6fa5575bfbf7afaedea54dd5510a4a77f85a940e79b86e9c2e0c849fe9fd4bfa5df6fea10e3ba4a5d72163410ce260d84b36903e12c6c209ccd1a0867f306c2795c03e16cd140385bc6c859007cae788f6f60bc8906c67b42d030e2b6a88170163710ce560d84b37503e16cd340384f6c209c273510ce931b08e7290d84f3d406c2795a03e13cbd81709ed14038cf6c209c673510ceb31b08e7390d84f3dc06c2795e03e12c69209c6d1b08e7f90d84f3821839db01a7dccbbf48fffe40ff5eac7f2fd1bf97eadfcbf46f3b5dc7423d7f7998ae0853fb305d69fc4f09a36ee89785a9a3f1bff230750a53e73075d1ff2bd1ffeb1aa66e61ea1ea61e61aa0853cf30f50a536fad479f305d15a6abc3744d98ae0dd37561ba3e4c3784e9c630dd14a69bc3744b986e0dd36d61ba3d4c7784e9ce30dd15a6bbc3744f98fa86e9de30dd67b0f40bd3fd61ea1fa607c234204c0f866960981e0ad3a0300d0e5365988684a92a4c43c3342c4c0f876978984684e991303d1aa691611a15a6d161aa0ed398308d0dd3b8308d0f534d982684e9b1304d34347b3c4c4f84e9c9303d65703e1da667c2f46c989e0bd3f3617a214c2f86e9a530bd1ca657c234294c93c334254c53c3342d4cd3c334234c33c3342b4cb3c334274c73c3f46a985e0bd3eb617a234c6f86e9ad30bd1da677c2f46e98ded32cb223bc1fa679619a1fa605615a18a645615a1ca625615a1aa665615a1ea615615a19a655615a1da635615a1ba675615a1fa60d61da18a64d61da1ca62d61fa204c5bc3b42d4cdbc3b4234c3bc3b42b4cbbc3b4274c1f86696f983e0ad3be30ed0fd381307d1ca68361fa244c87c2f469983e0bd30fc3f479987e6468fee330fd244c3f0dd3cfb4ede7faf717baacecf3bfd4bfbfd2bfbfd6bfbfd1bfbf35caffce98ffbd31ff07fdfb47fdfb27fdfb67fdfb17fdfb85fefd52ff7ea57fbfd6bfdfe8dfbfeadfbfe9df6ff5efdff5ef3ff4ef3ff5af7afef75edb74be45503b258398daa4f2a183d5fd7f11db7cbea89e5d35d5ff93df126d2fd4f3f25ba0edcdf47c33c3de5ccf3737d6d342cfb730ecc57abed8b0b7d6f3ad0dfb897afe44c37eb29e3fd9b0b7d5f36dc19ed0ff4b572cfda36c4db5a9006c129f4dc0d64cdb9a82adb9ac0e6cc7695b33b0c9f66d0eb696da761cd88ed7b616604b685b4bd1324c27685b32882b564a07abf516c5bd5efdcca4387ede4ab5de568e785bc7cf3b44adb78d035e151f27ea751541dc9ca46dc5603b59db5a81ed146d6b0db653b5ad0dd84ed3b613c176bab69d04b633b4ed64b09da96da780ed2c6d3b156c676bdb69603b47db4e07dbb9da7606d8ced3b633c156a26d67814d37b9c1d9603b5fdbce01db05da762ed82ed4b6f3c026e778256093f3bdb6609373bff3c126e78117689b6a3b5a16803f6d97762be54fda6cb0fd40da6bb05d2c6d35d82e91761a6c97826fb15d066d8dd8da699bb45bea7fdd753e19c4b59f94a5f6931e71af375cb35a6fcff8d79b7a7ed72ba8d53a097e7a8056bd753ec6be2d1dd0b79cdb881fb11742fe26282be5440f39f608bb3a1654e87cef0ccb7537962b86321596fa278378ebdfd3e0e969303783bc9b98ed58ea63b6ce53d631db0fca9ab127e7418d31666f050e07315bee63b6ce53d6313b0cca9ab127e7c28d31661f000e0731dbd54dcc9695fa984ddf1b0b027becc9f550638cd911c0117fcc76f2315bf729eb987d11ca9ab127d7c48d3166270247fc31dba5ab3f37a8f39475ccce81b266ecc9fd99c618b3af008783981de2dbd93a4f59c7ec7c286bc69edc2b6c8c31fb1a70c41fb3dd1cc56c471fb341fa396710d8634fee5b37c6985d041cf1c7ec107f7fb6ee53d631bb0bca9ab127cf501a63cc6ed079f59ce1e7fa39c3d960fb85b69d03bcf1c7765599a3d8eee0633bddff2308ec312acff31a636c7fa4f32a8e7f05fd11c4f66be9ab00b6df68dbf960fbadb65d00f572b00f74f1fb40ddeb94ed3ef067286bc6b23c5b6e8cfbc02f80c341cc76f5315bf73a651bb3ff05ca9ab127fd1c1a63cc7e091c0e62b69b8fd9bad729db98fd77286bc6de253adf1863f6bfeabc3a5ff8a33e5fb80c6c7fd2b67660fbb3b65d0eb6bf68db1560fb42dbda83ed4b6dbb126c5f695b29d8bed6b60e60fb46dbcac0f6576deb08b6bf695b39d8bed5b64e60fbbbb67506db3fb4ad0bd8fea96d5dc1f62f6deba66daa9f9ef4bd3aa46d2d803f19c4bb6da5dfa5ac5be63be4c0772bc377ab1cfa6e63f86e63f15de6c077027cc85460cc27215fe696a7b41878d05779fcbe3aaaba770cea5ef772e0e9e4a0ee09f051179e4ec0d3397e9ed4f1b34bfceb4d6de38e86a609f0d511ead5d541bd0ac097ac5be6c55f31d8b06ded6a61ec163f635901f89275cb7c3760141bb6f5f22e95ec3fea787871412daf837d29754e24fee4db55c2510e7629d3a16d2d5b3bcd5604ffc7e35e67c3e6282e537121be64dd322ffe8aa03e9d73cf585657c64e06a3ab36a2007cc9babdefdaed20793c8ebbb8d6b1b569e2bb470e7c77337c971bbeb1ed9429d3b1ad1b30c77ecda98f6d15f1afb714af4fe4da50fce0f9035ec3c55527f42dd786e247ec8590bfada0b6ac94133da41d167615cbb22d91dd5caeabb15c3194e961a97f3288b7fe15064f85c1acb6c9d5702c74b03fa462a087c121f3e5a05d4584763d403b29730968e7aa3deb6ef0c87c67e09176ac0bf0b8ba268ae2c9c5f5d8d17ce3392c5e3fcbfff13cc0d5f6ea6030cabc6d7b750346dbb98a83eb998ce72a9d80516cdd81a7a323cda2b66b4712df0e6225d51e890f393797fdb733d8a54c37fd429d6a2b1f81b6d2458c603cca54d76bdef8b75359ea1abc53163cb8ed1c5c577570148fa578ffe6bb20de5833dba54e865651f7785cb5e51d0d1e99177f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999f17912f6db92729d4918cdfe6faeeef3a7be61a8d725eb57cf75feb7d3fe6065a5d83f46fa415c66d4b910ca1435a92dfbffa03f98f99c0afb487676ab5d6a5b627fcc24cc8b3fec6b85db92a1bf53496cbed3dfa274f1bc4df5b156dfd134fb7e76b668eaa2ff336a5a60688afdf12f3778549c5634ad6573f1ec2fdb6791a895e4e37cb6571cd8633dfeed5276d833eb26c1e1ed071e675cf5df91b65a9e97f7307c174299b39ad46e1be95b25e3cc763496c37e3fb26e59e632b05718eb6ead97158e66c6fabbc0b252e65c6853f737a9d5cc415b59966ddf757c6e1eff7138fd1cbf63163c1d80c7453be3e87ce3b0efadc6fd1cdfec9f663b8f9132d8b7cf41bfca8cfd9dc49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e66c5633e6bc5f76bcb491873d4f721f53c43be5526eb4f7d2fb849ad5fd7cfe1e499533ba3cef8eee87f6f525b768bce170547f67788da96aebe4f11b52dc51f7e7b069f05b978ae5b00be64dd65162d245f129bef32676343c873fc8e86aee5164d5dedaff88c1535c5fdb593c183cf46a3beed5366d85cf61d8a8a0bf187fb5219d8248fef47bbd8ce782c31fbf5883f7c7efd23ad6debc0d5b62f2b75d96ee0775392c191f18ddf53f939b47dbfd479ecc3817d47beb6fc5fa64ccfa9453f556707dfd72c2d8075c9f6b57ddbb30fb0c6e4bb03aeab40a73e86068590ffaa496d59292765456b6157fb887c0306d9cde53a19cb1543995e96fa278378eb6f7e6bb5b7c1acb6c96f20cebe86e3bfab36a95784469781465206cf835cf5c933db48b37f23f6db6b6e94c1731629f32f68a3a2fa8fdafa1cba3a8e45f539b49d1b770046b38e663fcf7cefa7f51fd05ec4dd4feb3f2086b09f5660acbf1dac5fb89a07d1c71629f37f8df59be7e4b20cf603fbcffe4ff03d97329dcfe69cfc585d5fd9cec971b9a8ba2b66fc0e5a3246668c0964c1f3042973bcd65ab65945047737cbb24511cb8a56e6b7c28a8223f573f39db5f43edfdba88bc4357e835cca9c04757173de923e0774f54db924d449e5cb2c759532a7c3be76a6ce27603be17e7ba9e5ff32653a07c431dcaf8abfcea9ed7b357026c10ffabe065863f2dd017dcb39a0f8117b21e42f695a5b56ca891ea2b5b0ab7d44cea390dd5cae87b15c3194e963a97f3288b7fe57193c5719cc6a9b9c03717629f44377d556f789d0a81d682465f09ea2ed3ba0b6638cabbefd51c798326034db4d3c4eba6433df1332efabd9ce11a48c2c8be7085da09d4d58ca9af70be5781967bf617c57a20bf8c577255c7dbbb93be89684793c2f3896be5d7cc756f98b1a33a17b0e7c478d99900bdf6d0cdf6d72e8db6bee3567d2dcc11804a9f7cff09ba56aca745e8ae312c8724d80d1c5580e89e0f06f8f1f8d11c77790e59a02a38be343b6df3eef028cb25c2130ba78b714c7dfa80b237e63188ff3c2e8e05bb11deafbad58bca7d71c1899ded9c46753c701a38b7ba8f57d570fcfe75bc0afab71893a66c188e7f3b25c4b6074716f1c9f0dd68511af8b64b9e381d1c533ac6cc777c26fcfe3bd65978c998eed8efba294657befa5c22d4fc6730df4ed605cc39416789ff1685af474cb93f1dc077d3bb8ef97d202c7193c9a16f86cd0c5b88789e0f0e77047e3c1e797b2dc89c09874c4d83b0bc62430fee7bd6260ece388319905631f6014fbc9c0e8e0fe6b8ab14f168c789f52963b0518af76c47855168c5703a32c772a30bab8979a00bf7561bc061865b9d380f15a478cd764c1782d30ca72a703e3758e18afcd82f13a6094e5ce00c6eb1d315e9705e3f5c028cb9d098c373862bc3e0bc61b8051963b0b186f74c47843168c3702a32c773630dee488f1c62c186f024659ee1c60bcd911e34d5930de0c8cb2dcb9c0788b23c69bb360bc051865b9f380f156478cb764c1782b30ca7225c0789b23c65bb360bc0d1865b9b6c078bb23c6dbb260bc1d1865b9f381f10e478cb767c1780730ca721700e39d8e18efc882f14e6094e52e04c6bb1c31de9905e35dc028cb5d048c773b62bc2b0bc6bb815196fb0130dee388f1ee2c18ef01c6bb2d8c7d1d31de9305635f6094e52e07c67be3674c5d4bf7cd82f15ee0b92f7e9e9466f766c1739f5b9ed477f5eeb5f8ba3f7e5fa96dd12fa87bddef079efef1f3a4b6c5fd59f00843312c879a3d103f634ab3fe59303e003c03e2e74969f640163c0340b3072c9a3d183f634ab30159303e083c03e3e74969f660163c0341b3072d9a3d143f634ab38159303e043c83e2e74969f650163c83825acd1eb26836387ec6946683b2601c0c3c95f1f3a4341b9c054f256836d8a2d990f819539a5566c1380478aae2e7496936240b9e2ad06c8845b3a1f133a634abca827128f00c8b9f27a5d9d02c78868166432d9a3d1c3f634ab36159303e0c3cc3e3e74969f670163cc341b3872d9a8d889f31a5d9f02c184700cf23f1f3a4341b9105cf23a0d9088b668f3a627c240bc6472d3c717f27fb118baf518eea3e32a87bdd85a11896c37e12a31d318eca82713430ca72d84fa2da11e3e82c18ab8151964b3866ccd44fa21a7c8f89df77aa5daa0eeaaecf18b73c19fb49a0efb18eb41813d45d8bb16e7932f69340dfe31c693136a8bb16e38067bc032d12e0a32e3cc2500ccb613f891a478ce3b360ac0146590efb494c70c4589305e3046094e5b09fc4638e182764c1f81830ca72d84f62a223c6c7b2609c088cb21cf69378dc11e3c42c181f0746590efb493ce188f1f12c189f0046590efb493ce988f1892c189f0446590efb493ce588f1c92c189f0246590efb493ced88f1a92c189f0646590efb493ce388f1e92c189f0146590efb493ceb88f1992c189f0546590efb493ce788f1d92c189f0346590efb493cef88f1b92c189f0746590efb49bce088f1f92c185f004659ee51c78c99ae5f5e68e4bea3ae551abbefa8eb92c6eedbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ece997cbfe8c077027cc85460cc27212f0cc5b0dca39eb15133224f497c3ca55877f4f51241dd5fb2f01438aa3bfa7a99a0eec2d0d0185f6c008c8f360046af63ba0f627d1815cf2bf0ff648c3c2f67c1f30af04c72c4f34a163c93806772fc3ca9989a94058f3014c3728f3600c6171b00a3d7d1ebc8c4e875cc1f1d3da367f48c9ef15830368436dc333688782cab2fa3e299123f4f4ab3c959f04c01cd64b9fbdc3296d59751f14c8d9f27a5d9942c78a68266532c9a39602cab2fa3e299163f4f4ab3a959f04c03cda65a3473c058565f46c5333d7e9e9466d3b2e0990e9a4db368e680b1acbe8c8a6746fc3c29cda667c13303349b6ed1cc0163597d1915cfccf879529acdc88267266836c3a29903c6b2fa322a9e59f1f3a4349b9905cf2cd06ca64533078c65f565543cb3e3e74969362b0b9ed9a0d92c8b660e18cbeacba878e6c4cf93d26c76163c7340b3d916cd58191f6d008c2f360046c73a96d59751f1cc75c433270b9eb9c0f3aa239eb959f0bc0a3cafc5cf938aa957b3e011866258eed106c0f8620360f43a7a1d9918bd8ef9a3a367f48c9e313bc6971a00a3dfd69ed133366e4607d7a919df457ab591fb8e7a17a9b1fb8e7a17a9b1fbf671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98f7326dfafc7efbb2cdb6fccbc0e3c2ebe79e3a89ea56abd6fe8757d17a37e4aab370dad5e35b42a86326f807e6f3ad0af00fccaba655efc65cb7c3101b323df65aa7d6909f5171f2f1a7a28ff6f39aa7b545bff5623f71dd5d63776df516d7d63f7ede3dcc7793ef8f671eee33c1f7cfb38f771cee21bf3cd82daf376f9fea95ac7db3a5fa8e7a5fc4b6097324f1d97fe6d1df87dc8856fbf0ff963453ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7395f9c17c3ffc7e680273078820c3c53c978aac878fa91f1dc4cc6d39b8ce771329eae643c23c9781e22e3b98b8ce705329eebc8789e23e3e940c6339e8c671a19cf30329efe643cb792f1f421e379928ce70a329ece643ca3c9780693f1dc43c6534ac6f30a19cf0d643cb9785f281b9ef6643c15643c73c8782690f14c27e3194ec6732919cf00329e4bc8786e27e3b99a8ca7988ca715194f3919cfd3643c63c8788690f1dc4bc67313194f2f329e89643cddc8786690f13c42c633898c672019cf9d643cd792f15c46c6f32c194f19194f53329e71643c43c978ee27e36947c6730b194f928ce709329e2e643c33c9784691f14c26e31944c6733719cfcb643cd793f13c4fc6d3838c6736194f0d19cfc3643c0f90f15c4cc6731b19cf55643c2790f11491f17422e3798a8c6716194f3519cf14329e4a329ebe643c3792f1f424e3994bc6f318194f77329e11643c0f92f1dc41c6730d19cf95643ccf90f1b426e36943c6d3918ca7808027111c39864902feff3ad89a18cbaacfbed6b4adfdff3bdade04967957e79b5ad6fd0ed8e45bb2ef5a96459dde81ba2475bef4fb4d299dd05712e6c55f1170bc4bc2d3918ca70d194f6b329e67c878ae24e3b9868ce70e329e07c9784690f17427e3798c8c672e194f4f329e1bc978fa92f15492f14c21e3a926e39945c6f314194f27329e22329e13c878ae22e3b98d8ce762329e07c8781e26e3a921e3994dc6d3838ce779329eebc9785e26e3b99b8c671019cf64329e51643c33c978ba90f13c41c69324e3b9858ca71d19cffd643c43c978c691f13425e32923e379968ce732329e6bc978ee24e31948c633898ce711329e19643cddc8782692f1f422e3b9898ce75e329e21643c63c8789e26e32927e36945c6534cc6733519cfed643c9790f10c20e391ef79b2f00c27e3994ec633818c670e194f05194f7b329ed7c9786e20e379858ca7948ce71e329ec1643ca3c9783a93f15c41c6f324194f1f329e5bc978fa93f10c23e39946c6339e8ca70319cf73643cd791f1bc40c6731719cf43643c23c978ba92f13c4ec6d39b8ce766329e7e643c55643c53c978c65a785e77c423efbbcbba65fe7512df0eb643a95aef7b8eeaf4be5e5733bd5ee1177f855066f2f1e95ff57e382e2b5ce6f709f0ded7fba0d1fb8eea22dba3c0d83ee8fb6d47bee51d2459b7ccbfddc87db7327cb7ca13df6d0cdf6df2c4b78f731fe7f9e0dbc7b98ff37cf0ede3dcc739936f07d70665f89d34990a8cf924e4f17ac1c5f7e51cd5f3b0ebc4ef62d44f6935cfd0cabcb62a8632ef817ef31ce867bbf69479f1972df3c504cc18172541bc71313ffe3a95a976ab25e83adfd017ebb5c091a651c790058ddc77d431a4b1fb8e3a863476df3ece7d9ce7836f1fe73ecef3c1b78f731fe74cbe17ea7c8cd78da5e8433d5f94eb8185e077b1ce17c4e857ad6b915e57a15eb7702c06bb94699248ffb60efc3eefc2b7dfe7fdb12d1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f73be3837f3d25ffc126073d59f3f2a1673f12ec1b1f41d158b8ddd77542c3676df3ece7d9c33f95ee2c077027cc894a98fdf12e059e480c7513d53cf36961a757adda8533194c163fc5207f52c00bfb26e995f0a3c328d051e177150976d8e3c53c978aac878fa91f1dc4cc6d39b8ce771329eae643c23c9781e22e3b98b8ce705329eebc8789e23e3e940c6339e8c671a19cf30329efe643cf3c8786e25e3e943c6f32419cf15643c9dc9784693f10c26e3b9878ca7948ce715329e1bc878da93f15490f1cc21e39940c6339d8c673819cfa5643c03c8786e27e3b99a8ca7988ca715194f3919cfd3643c63c8788690f1dc4bc67313194f2f329e89643cddc8786690f13c42c633898c672019cf9d643cd792f15c46c6f32c194f19194f53329e71643c43c978ee27e36947c6730b194f928ce709329e2e643c33c9784691f14c26e31944c6733719cfcb643cd793f13c4fc6d3838c6736194f0d19cfc3643c0f90f15c4cc6731b19cf55643c2790f11491f17422e3798a8c6716194f3519cf14329e4a329ebe643c3792f1f424e3994bc6f318194f77329e11643c0f92f12c20e3b9838ce71a329e2bc9789e21e3694dc6d3868ca723194f01014f2238f2ddff04fc7f1ed8e41df5d7c1b64ce71781ad89c547539d5f0ab6429d97751c17a6e7da1eb96ed4c9d57bf9e82b09f3e2af08389691f07424e36943c6d39a8ce719329e2bc978ae21e3b9838c670119cf83643c23c878ba93f13c46c633978ca72719cf8d643c7dc9782ac978a690f15493f1cc22e3798a8ca713194f1119cf09643c5791f1dc46c6733119cf03643c0f93f1d490f1cc26e3e941c6f33c19cff5643c2f93f1dc4dc633888c673219cf28329e99643c5dc8789e20e34992f1dc42c6d38e8ce77e329ea1643ce3c8789a92f19491f13c4bc6731919cfb5643c7792f10c24e39944c6f30819cf0c329e6e643c13c9787a91f1dc44c6732f19cf10329e31643c4f93f19493f1b422e32926e3b99a8ce776329e01643c9792f10c27e3994ec633818c670e194f05194f7b329e1bc8785e21e32925e3b9878c673019cf68329ece643c5790f13c49c6d3878ce756329e79643cfdc9788691f14c23e3194fc6d3818ce739329eebc8785e20e3b98b8ce721329e91643c5dc9781e27e3e94dc67333194f3f329e2a329ea9643c6373c4a3de6d97773903e0c22909f9a5c033cf018fa37a96e2770dbe8b71bd4aabe586560b0cad8aa1cc12d06fb903fd0ac0afac5be697038f9c8f082b7e53e1051246b1cd73cc93803acb94691f580e3c2ef64947f54cc5ea0aa34e2f5874973218ab2b1cd4d3b6efc8fc0ae07959e7853501e55e266114db52c73c09a8b34c99627505f0b8d8771cd53315ab2b8d3abd6cd15dca60acae74504fdbbe23f32b81e7159d17d604947b8584516ccbddf29427a0ce32658ad595c0e362df7154cf54acae32eaf48a45772983b1baca413d6dfb8eccaf82ede0993db38d59f148ff56614d40b949248c625be194a7bc3401759629533bb60a785cb4f38e744fb563ab8d3a4db2e82e653056573ba8a76ddf91f9d516df2541bc5aaca983166b2c3c6b72ac85f8cb9679490364f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e6266d059f1c87822c29a8072934918c5b6d22d4feabda0c9c1e15381319f84fc1ae059e5401f47f54cf5215f6bd469b245772983fbd75a07f5b4ed3b32bf16b64336ccab1b20b3d7b97ecc8a678ace0b6b02ca4d216114db2ab73ca9766c4a70f894a91d5b0b3c2eda7947f54cb563eb8c3a4db1e82e6570ff5ae7a09eb67d47e6d7c176f0cc9ed9c6ac78a6eabcb026a0dc541246b1ad71ca53967abf716a70f894a91d5b073c2eda7947baa7dab1f5469da65a74973218abeb1dd4d3b6efc8fc7ad80ed930af6e80cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7397f74563cd3745e5813506e1a09a3d8d63ae5e9987aee302d387ccaf4dc613df0b8782ee348f7d473870d469da659749732b87f6d70504fdbbe23f31b603b3476e6d50d90d9c7466e987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398a99213614cf749d17d604949b4ec228b6756e7952df3d981e1c3e65eab7b30178d63bd0c7513d53fd76361a759a6ed15dcae0feb5d1413d6dfb8ecc6f84ede0993db38d59f1ccd079614d40b919248c625bef9627d58ecd080e9f32b5631b81c7453befa89ea9766c9351a71916dda50cc6ea2607f5b4ed3b32bf09b68367f6cc3666c53353e7853501e56692308a6d835b9e543b3633387ccad48e6d021e17edbca37aa6dab1cd469d665a74973218ab9b1dd4d3b6efc8fc66d80e9ed933db9815cf2c9d17d604949b45c228b68d8e791250679932b5639b81c7453befa89ea9766c8b51a75916dda50cc6ea1607f5b4ed3b32bf057866ebbcb026a0dc6c1246b16d72cc93803acb942956b7008f8b7dc7513d53b1fa8151a7d916dda50cc6ea070eea69db7764fe03e099a3f3c29a8072734818c5b6d9314f02ea2c53a658fd00785cec3b8eea998ad5ad469de65874973218ab5b1dd4d3b6efc8fc56e099abf3c29a8072734918c586edd85c473c45064f91458b63e55b69d143e74fd0bf09f87f0f6074d5b6cc3518651e635c6c4539d0ac95c1d3cad0ec58fa565a54405e4db8bd2a8091617bb5ca81666d0c9e368666c7d2b7d2a2a7ceb7d6bfb8bd7a0223c3f66a033c0edae7f284c1a3a64cc7eead8ef57154cfd4b17b5b60d71d8f4352068fdddb1cd4d3762e21f3db603b7866cf6c63563c7d755e581350ae2f09a3d8f09c7f7bfc3ce50983474d99dab1ed8ef57154cf543bb623b0ebbe1d74973218ab3b1cd4b300fccaba657e076c876c9857374066af73fd98154f3f9d17d60494eb47c228b66dc0b3337e9ef284c1a3a64cedd84ec7fa38aa67aa1ddb15d875df09ba4b19dcbf7639a86701f89575cbfc2ed80ed930af6e80cc5ee7fa312b9efe3a2fac0928d79f84516c3b806777ec3ce9315f90474d99dab1dd8ef57153cf743bb627b0ebbe1b749732b87fed7150cf02f02beb96f93db01d3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed93373332b9e013a2fac0928378084516cbb80e7c3d879d2cf1d90474d999e3b7ce8581f37f54c3f77d81bd875ff1074973218ab7b1dd4b300fccaba657e2f6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a67a0ce0b6b02ca0d246114db1ee0f9287e9ef284c1a3a64ccf1d3e72ac8fa37aa69e3bec0becba7f04ba4b198cd57d0eea59007e65dd32bf0fb6c33ecfec992dcc8a6790ce0b6b02ca0d226114db5ee0d91f3b4ffaf929f2a829533bb6dfb13e6eea996ec70e0476ddf783ee520663f580837a16805f59b7cc1f80ed900df3ea06c8ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9df34767c553a9f3c29a807295248c62db073c1fc7ced3b13461f0a8a9c0984f42fe63c7fab8a967fab9c3c1c0aefbc7a0bb94c1fdeba0837a16805f59b7cc1f84edd0d899573740661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c553a2fac09285745c228b603c0f349fc3ce50983474d05c67c12f29f38d6c7513d53fd760e0576dd3f01dda50cee5f871cd4b300fccaba65fe106c07cfec996dcc8a6798ce0b6b02ca0d236114db41e0f9d4014fc2e05153a676ec53c7fa38aa67aa1dfb2cb0ebfe29e82e6530563f7350cf02f02beb96f9cf8067b8ce0b6b02ca0d276114db21e07111ab8aa7c8e091f94f097c2b2daa75fe04fd8bdbab1a1819b657510e346b65f0b432343b96be95166320af26dc5e638091617bb5ca81666d0c9e368666c7d2b7d262acceb7d6bfb8bdc60223c3f66a9303cd8e657b782cf7ed6319a75ef363a779c131d4bce0186a5ee035a7d2dcc1f1a50c8f650130e09484fc67c0f379fc3ca97b5c9f65c1f339f0fc307e9e0e8eea59aad6fb23608f6bbd4aab1f1b5a7d6668550c6590e1c70ef42b00bfb26e99177f9ed9334731e3b9adb026a0dca7248c629336c855bba1ea7e855e97acbf59980e9d5cebd7c5b307bcefda4caf5738c45f2194b9bfa4b6ece79aad08fe2fdb4dd5e7a06173f43e7007db333099177f4541eeee8366ba2f8b5ab8787693ed71ffa085e7bbf8784a713f475f071cd53d9be768072c3c31d6bd43d433c4fdf1d73dd57eb4d7eb92f5ab7df48b939d6a5e8efb9eb41fed8d3a1742994e25b565bf81f6c3d656b8de37e59cdcdc379b04b5ed99709568bbf97ce53b6d97729f40796c737ae85fdc3f7b405d5db58b51f798b05d34db6e97da9bcff84cdfc5a0cb27a49ad99e53a08e1516ee0a026e8cc75cee67b26edb33b20a434736cd705b7f62d1b1a785bb270137e37eddd3d0914db3a3edd77d2ddc7d09b819f7ebbe868e6c9a1d6dbfee67e1ee47c0cdb85ff7337464d3ec68fb757f0b777f026ec6fdbabfa1239b6647dbaf0758b807107033eed7030c1dd9343bda7e3dd0c23d90809b71bf1e68e8c8a6d9d1f6eb4116ee4104dc8cfbf5a0e0701dd9343bda7e5d69e1ae24e066dcaf2b0d1dd9343bda7e5d65e1ae22e066dcafab0c1dd9343bda7e3dccc23d8c809b71bf1e66e8c8a6d9d1f6ebe116eee104dc8cfb755dfbedb3eed7d516ee6a026ec6fdbadad0914db3a3edd7632cdc6308b819f7eb31868e6c9a1d6dbf1e6be11e4bc0cdb85f8f357464d3ccb65f3b7a2faf2cdbf7040f39d5273d5ef3a12c783e061e1731e5280e4a1df57349f54ddd6f6875c8d00ac7c13800fa39e80b93f1fd7ef1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f19bf7188cf57a4dc27248c62c367522eeef3abba5fa9d725eb6f16a66ea7d6fa3d10bbdfb2d202c35f1238c45f219469725e6dd99e9aad283872bbe1b8d6b82df7c55e87f4b634e35fe6c55f11d4673ff038783f3fc573c0e03960d102df3b8dc777d910371a9795aaefefb40c6ab7f33ea33ea8e947b1fb3f5cd30243d38f1cfb4e04876f4f61c0290979e471f16cd8513d536dc15ea34ea6c6c550e662a8e75e07f52c00bfb26e99df0b3c32e13379573118183c81451f999a90f15491f1f423e3b9908ce766329ed3c9787a93f13c4ec6d3958ca72519cf48329e87c878ee22e3398f8ce73a329e5c9c8367c3f31c194f07329e93c878c693f11492f10c23e33948c6d39f8ce707643cb792f15c4ec67326194f1f329e27c9783a93f15c41c69320e3194dc633988ce71e329e52329eb6643c3790f19c42c65341c6d39e8c6702194f73329ee1643c9792f10c20e3b9848ce776329eb3c978ae26e3799a8ca79c8ca7988ca71519cf18329e21643cf792f15c40c6731319cf69643cbdc8782692f17423e36941c6f30819cf40329e3bc978ce25e3b9968ce732329e67c978cac8784e24e31947c6d3948c672819cffd643cedc8782e22e3b9858ce70c329e2419cf13643c5dc8788e27e31945c633888ce76e329e12329eebc9789e27e3e941c67332194f0d194f33329e87c9781e20e3b9988ce736329eb3c878ae22e3798a8ca71319cf09643c45643cd5643c95643c7dc978ce27e3b9918ce754329e9e643c8f91f17427e3398e8c670419cf83643c7790f19c43c6730d19cf95643cadc978da90f13c43c6d3918ca7808027111cf92da604fcff00d8e49b411f83ad89657df21c56caabe3e2d4b647aebb8965dd1f591850a70fa12e499d2ffd7e534a27f4958479f157041c1f91f07424e379868ca70d194f6b329e2bc978ae21e339878ce70e329e07c9784690f11c47c6d39d8ce731329e9e643ca792f1dc48c6733e194f5f329e4a329e6a329e22329e13c8783a91f13c45c6731519cf59643cb791f15c4cc6f30019cfc3643ccdc8786ac8784e26e3e941c6f33c19cff5643c25643c7793f10c22e31945c6733c194f17329e27c87892643c6790f1dc42c67311194f3b329efbc9788692f13425e31947c67322194f1919cfb3643c9791f15c4bc6732e19cf9d643c03c9781e21e36941c6d38d8c6722194f2f329ed3c8786e22e3b9808ce75e329e21643c63c8785a91f11493f19493f13c4dc6733519cfd9643cb793f15c42c633808ce752329ee1643ccdc9782690f1b427e3a920e339858ce706329eb6643ca5643cf790f10c26e3194dc69320e3b9828ca73319cf93643c7dc878ce24e3b99c8ce756329e1f90f1f427e33948c6338c8ca7908c673c19cf49643c1dc8789e23e3d94fc6731d19cf79643c7791f13c44c633928ca725194f57329ec7c9787a93f19c4ec6733319cf85643cfdc878aac8789a90f18c3578f0ffeadd30393f926f0715c2ff07eacee5adf5baa48cbca3a4ee75ed316caabebb1dd5774f503b25617e37d457d8f700cf1e473c1f1a3ca6ef22c8578066bb0c9b62dce9887197c128f33b8151f4db053cbb1cf1ec36784cdf4590ef099aed306c8a71bb23c61d06a3cc6f0746d16f07f0ec70c4b3d3e0317d1741be2f68b6cdb029c6ad8e18b7198c32bf151845bf6dc0b3cd11cf7683c7f45d04f97ea0d907864d316e71c4f881c128f35b8051f4fb00783e70c4b3d5e0317d1741be3f68b6d9b029c64d8e18371b8c32bf091845bfcdc0b3d911cf1683c7f45d04f901a0d946c3a618373862dc6830cafc066014fd3602cf46473c9b0c1ed37711e4078266eb0d9b625ce78871bdc128f3eb8051f45b0f3ceb1df16c30784cdf45901f049aad356c8a718d23c6b506a3ccaf0146d16f2df0ac75c4b3cee0317d1741be12345b6dd814e32a478cab0d46995f058ca2df6ae059ed88678dc163fa2e827c1568b6d2b029c6158e18571a8c32bf021845bf95c0b3d211cf2a83c7f45d04f961a0d972c3a6189739625c6e30cafc326014fd9603cf72473c2b0c1ed37711e48783664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df12c33784cdf4590af06cd161b36c5b8c811e3628351e61701a3e8b71878163be25962f098be8b203f06345b68d814e302478c0b0d46995f008ca2df42e059e8886791c163fa2e82fc58d06cbe61538cf31c31ce3718657e1e308a7ef38167be239e05068fe9bb08f277834d78bb83ed7d9def06b6f774be2bd8ded5f92e607b47e73b83ed6d9def04b6b774be1c6c6fea7c47b0bda1f365607b5de73b80ed359def05b65775be37d8e6ea7c126c7374be0fd866ebfc55609ba5f357836da6ce5f03b6193a7f2dd8a6ebfc75609ba6f3d7836daacedf00b6293a7f23d826ebfc4d609ba4f33783ed159dbf056c2febfcad607b49e76f03db8b3a7f3bd85ed0f93bc0f6a8cedf09b6fb74fe2eb01dd2f97bc0f6a9cedf0bb6cf74fe7eb0fd50e71f00dbe73aff20d87ea4f30f81edc73a3f186c3fd1f92160fba9ce0f05dbcf74fe61b0fd5ce74780ed173aff08d87ea9f323c1f62b9d1f05b65febfc68b0fd46e7c781edb73a3f1e6cbfd3f91ab0fd5ee72780ed0f3aff18d8fea8f313c1f6279d7f1c6c7fd6f927c0f6179d7f126c5fe8fc5360fb52e79f06db573aff0cd8bed6f967c1f68dce3f07b6bfeafcf360fb9bcee358b77fd7f99220de76f6dba0762a01dfe24f95f987ce3737cac8b28550e644ddc1513de350efe2493b2cedb2b2493bfc3ed8a41d7e0f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6cd20ebf0ab6a4cecf059bb4c373c026edf06cb0493b3c0b6cd20ecf049bb4c333c026edf074b0493b3c0d6cd20e4f059bb4c353c026edf064b0493b3c096cd20ebf023669875f069bb4c32f814ddae117c126edf00b609376f851b0493b7c1fd8647ff9166cd2361f029bb4cd9f824ddae6cfc0266df30fc1266df3e76093b6f9476093b6f9c76093b6f9276093b6f9a76093b6f9676093b6f9e76093b6f9176093b6f9976093b6f957601badf3bf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cdbf079bb4cd7f009bb4cd7f049bb4cd7f029bb4cd7f069bb4cd7f019bb4cd5f804ddae62fc1266df3576093b6f96bb049dbfc0dd89ed77969ab5b804d9e15aba9f47b4e380e0f9ef30b533288b7edc72909f9e7a0ee323521e379958ca78a8ca71f19cf85643ca793f1dc47c6d3928c673a19cf5b643c7f25e3594dc6b38a8c671b19cf56329ef3c878f693f19c44c65348c633878c671819cffb643c07c978fa93f1fc808ce772329e33c9780e91f15c41c69320e379838c672a19cf4a329e15643c1f90f16c21e32925e3694bc6730a194f05194f7b329ee6643cb3c8788693f1bc4bc6732919cf00329e4bc878ce26e32926e36945c633998c670c19cf6b643ccbc9789691f16c26e3d944c6730119cf5e329e0fc9784e23e36941c633838ce76d329e81643ce792f1cc27e3b98c8ce744329ea6643c73c9789692f12c21e39947c6b3918c6703194f3b329e8bc878f690f1ec26e339838ce778329e69643c6f92f10c22e32921e3e941c67332194f33329ed9643c8bc9781691f1bc47c6b39e8c671d19cfb7643cbbc8787692f19c45c67302194f1119cf14329e6a329ed7c9782ac978fa92f19c4fc6732a194f4f329ee3c8786692f12c24e35940c6f30e19cf5a329e35643c3bc878b693f19c43c67325194f6b329e36643c93c8780a087812c011804dfedf146cdfe8fc41b0c9f77af683ed6b9d9f0fb6af74fe79b03d63b135b1f009c3376093779b9f059bdcfffc1a6cf24ec0576093f32af1afe6e7b63d92bf092c237e9a5af8d1df57162ec9e3f696659241bcdb1b7d258323bfa754041ccf92f04c22e36943c6d39a8ce74a329e73c878b693f1ec20e35943c6b3968ce71d329e05643c0bc9786692f11c47c6d3938ce754329ef3c978fa92f15492f1bc4ec6534dc633858ca7888ce704329eb3c8787692f1ec22e3f9968c671d19cf7a329ef7c8781691f12c26e3994dc6d38c8ce764329e1e643c25643c83c878de24e39946c6733c19cf19643cbbc978f690f15c44c6d38e8c670319cf46329e79643c4bc8789692f1cc25e3694ac6732219cf65643cf3c978ce25e31948c6f33619cf0c329e16643ca791f17c48c6b3978ce702329e4d643c9bc9789691f12c27e3798d8c670c19cf64329e56643cc5643c6793f15c42c633808ce752329e77c9788693f1cc22e3694ec6d39e8ca7828ce714329eb6643ca5643c5bc8783e20e35941c6b3928c672a19cf1b643c09329e2bc8780e91f19c49c6733919cf0fc878fa93f11c24e3799f8c671819cf1c329e42329e93c878f693f19c47c6b3958c671b19cf2a329ed5643c7f25e3798b8c673a194f4b329efbc8784e27e3b9908ca71f194f1519cfab643c4dc878c65a78e63be291be2bb26e999fdfc87def367cefce13df3b0ddf3bf3c4f776c3f7f63cf1bdd5f0bd354f7c6f317c6fc913df9b0cdf9bf2c4f706c3f7863cf1bdcef0bd2e4f7caf317cafc913dfab0cdfabf2c4f70ac3f78a3cf1bdccf0bd2c4f7c2f317c2fc913df8b0cdf8bf2c4f702c3f7823cf1cd7cfdadfa29cbb720f6eadf04fc1fc78fdbef8871bec128f3fb81516c38fe7b0f473c51d7ee3d087c2b2da4efa2bc439f80ff5700a3ab98ea6130cabc2da670bcd10a473c51f71c2a087c2b2de45b8ef24dac04fc1fc74f7115531506a3ccdb620ac7ffeae98827ea5e494f02df4a0bf996a37c033801ffc7f1895cc5544f8351e66d3185e34df475c413758fa72f816fa5853c8b9167e609f87f3f607415537d0d4699b7c5d456e0e9e78827eade543f02df4a0be97b267d9613f0fffec0e82aa6fa198c326f8ba92dc0d3df114fd43db5fe04be9516f26e94bcc39a80ff0f00465731d5df6094795b4c6d029e018e78a2ee050e20f0adb418a8f3f28d9c04fc7f2030ba8aa90106a3ccdb626a03f00c74c413750f7320816fa5c5209d976f7026e0ff8380d1554c0d341865de1653eb806790239ea87baf83087c2b2d2a755ec64048c0ff2b81d1554c0d321865de1653385e5ba5239ea87bc69504be9516d23746fa0c26e0ff55c038c81163a5c128f38380516cab80a7ca114fd4bdee2a02df4a0be9ebbe52ff26e0ffc380d1554c55198c326f8ba915c033cc114fd43dfa6104be9516c3755ebee19180ff0f0746573135cc6094795b4c2d039ee18e78a29e2d0c27f0adb490b10fe49b7c09f83f8e97ed2aa6861b8c326f8ba925c053ed886791c1b3c8a2c5b1f2adb4906fbf2cd6bf09f8ff1860741553d506a3ccdb626a11f08c71c413f52c670c816fa585f4ed5ca87f13f0ffb1c0e82aa6c6188c326f8b291c7f79ac239ea867506373e03bea794a2e7c473d1bc885efa8fbdcb9f01d75cf3617bea3ee3fe6c277d4bdb45cf88eba2f940bdf51f73872e13bea7a3d17bea3ae3d73e13bea3a2a17bea3ae0972e13beafc3617bea3ced572e13beabcc3b7e7be3d8fdbf7b13c77c8d7f6fc581e438fe5b1c45f1bf86b835cf9f6c7127f6d902bdff97a6de0dbf3dcb7e772fd5510445f8f2d73e47b89e15be6f139cb1247be1719be651e9f192c72e47b81e15be6f1fef70247be8b0cdf32bf2007be5b19be5be5d0771bc3771b8b6f17db3b111c7efd2d0c3825218f31b0d0018fa37a96aaf52ed6ebfa2ec6f5daeedb98fb4b3194590cfab96e3b64dd99da8e16f1f92e4d800f19334ed9e459ecfb609336f43db0c933f677c126edfc3b6093e73b6f834d9effbc05b6e13a7f086cf21c16fbbfcbb3f4ed60abd479ec773d48e7b7824dfa25617f5fe95bb6056cd23f10fb994a1fcf4d60937ebad8bf51fa5a6f009bf497c77e75f2cec33ab0c97b2bd89f6bbfceaf019b7ca312fb117dadf3abc0f68dceaf04db733abf026c4febfc7d60fb52e7bf05db533abf006c5fe8fc42b03da9f38bc1f6179d7f136c7fd6f937c0f684cebf0eb6c7751edf0bfb93ce7f08b6893a8fef23fd51e77783ed319dc7f760fea0f33bc1f67b9d7f0d6c1374fe55b0d5e8fc5cb0fd4ee7e7806dbccecf06db6f757e16d8c6e9fc4cb0fd46e76780edd73a3f1d6ca3757e1ad87ea5f353c1364ae7a7806da4ce4f06db2f757e12d81ed1f9bf82ed173abf086c4d747e09d8647c41ecf321dfcc5c063619371bfbf2c8580263c1769cce8f015b0b9daf069b7c676d38d864acde61604be87c15d84ed0f94ab0c9b9ce20b0c9582b03c126e72503c0d65ae7fb834dce21fa814dc63eec0b36f99e674fb0c998de156093eff8f700dba93a3f1f6c32bed97eb0c937d70e824dc611fe1a6cf2ade56fc07696ce3f073619f3e569b09da3f35f82ed5c9d7f0a6cf27dce2fc056a2f34f82adadceff056ce7ebfc9fc126e3833d0136f9a6dbe360937178ff0436f976f244b05dacf37f04db253aff18d8641c953f804dc692fc3dd8dae9fc04b0c937a46bc07685ceff0e6c32b6c578b05da9f3bf059b8c61300e6c1d74fe37602bd3f95f83ada3ce8f065bb9ceff0a6c9d747e14d83aebfc48b075d1f95f82adabce3f02b66e3a2fed8cda9fd57e7e40cf278378cfb33f0e0e9f329d670b03f2c479de5a0c3ce86b5fec752f4b9d234b5bd044af5762681ff8de1bbbeff4f9f9477a5d857abd7b0ddf8550a6b56e1cd47272cc6faa97db6f2c87f78464ddb2cc9560ffd058776b5ddf8f1cd577afc124dca88394395933a963e3769d77f43e7c99da0724d602d010a724e485c18d5665a5782e5c179e8f80675fec3ce96b5f173181fb56dcd7bee63d5133d68aa1cc5ed0ef4307fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f11cd0797cd62ce50e90308a6d1ff0b8b8cf8fcf6165fdeab9ceb2f36afdee8bddefe1cff79ae9f5961a752e84327f87674eab741ec7f194ed16b52d1d3c27ccb82dc55f11d4079f051d70c4b3cfe0d967d142f225b1f92e1be246e3b252d56f453d63df6fe87ac0a2a9abfd759f5e5781a129eeaf1f1b3cf86cb408783fd1bf0958cf27500707fb78c6b8107fb82fed039be43f064617db198f25d21ec8f3707c362d65f61bcfc5e3dff665a52edb8d3d50a76470647c17429943d0f67da6f3d837e400e8f63bcbff65caf49c5af45375de157f9d53db77277026c10ffade01ac31f93eec7d94029dc48fd80b21ff5be8cf21e5440fd15ad8d53e227d3a91dd5cee6363b96228b3db52ff64106ffd77193cbb0c66b54d7e0471f63b38febb6a937647687425682465f68146fb1df1ec33788443fca932b2fd9b1b6564d94228f325b451aa2ed2ce4b3db16f0b1e035c1dc7c497ac5be66de7c61f01a35947151fdd4eade5dd173b6fc3eafff56fd05ec4ddffebdf20860a802330d65f0aeb17aee641f4b145cafc4fe338eae21a03b7a5a927ea2c65fe17b443ed4bd2f96ccef58fd5755bd4b9fe6e073c89e0f06b6f35653abee331668f031e47f52cb51dbb3e34ea540c652e867a3a388fc9f85eed2ef0ed629ba316720eb5d7d0a210cab42c49ff4adb11a5235eab7e9493ba9459cf074b2d759132ad4a6aebd202ec7132b9dc6e3ba04e6abdfb2c7595322797d4ea72aace27603be17d938b2cff9729537b80e3da6c8bbfcea9edbb153893e0077d7f00ac31f93eecbb1a72be2f7ec45e08f90b4b6acb4a39d143b41676b58fc83b7fc86e2eb7d758ae18ca6cb7d43f19c45bff6d06cf3683596d93334a6af312472edbcded111a9582465206ef1fcbb11ddfbbb31df7f739e28e3aeeef0346b3ddc47317976cfb0d36f31eaaed7c50cae0399994e95892fe55ed6cc252d6bc37ece23e26be5b1a403d02a3ae32610c38b8362cc76b2769a7c44f7bb0efd379d1b9bda15d2194e95992fe7578de6dbd77695edfe13585709bfb16befb7155492db78a7bd94efbf46f11d83ed5bf2d0227d769e5b67b86c261bb677843492d3b2e2b5c872c7531af919b0447de53ffce288bf7dd322d87bed474d05846e9fba985699fe1a7052c1bdbbb1a1d4a4ba3f80f02dfc706b34d57d90f30e6f6e9bcb9afe0b5b194b9af24fd2b6d9259566dfb2f4eaed547b6a36887ed09c6e4c7c098d4f9d2ef37a5f6b98346fd655efc2946b9df731078e26fbbd2ef2b65731f783ff0b868db1db5d1a5788c6d11db7abb55da8eff1f1b5ae5f079adf5986f3e736f61e4e3f15d5665bbff64d362af85c7d57394282df65a7cc7a745e721b676cea6452efb3e4469f1a1c5778c5a0cc3fb9e99b4d863e171712f2a93167b2cbee3d3a24b69a6e71aa8c56e0b8fab7b0f515a88bf6c993f24606e61e4e3f15d5e69bb4f66d3629785c7d575739416bb2cbee3d3a24367bc4797498b9d169ef8efcf65d662a7c5777c5a74ed86f7f03269b1c3c2e3ea996e94163b2cbe638c8ba1b67b39362db65b78b6e7588bed16df319e1f76b6dd6bb369b1cdc2e3e0be6b462db6597cc7a8c560bcef9a498bad169ead39d662abc5777c5a5476b2dd13b669f18185c7d53de1282d3eb0f88e4f8bc15d95ef2d75d0628b85674b8eb5d862f11de335542a2e36d7418bcd169ecd39d662b3c5777c5a54a5ceb536d5418b4d169e4d39d66293c5777c5a94a68ea91beba0c5460bcfc61c6bb1d1e23bc6b8485d4f6ea883161b2c3c1b72acc5068bef188f23a9b8585f072dd65b78d6e7588bf516dff169312c75ff695d1db45867e15997632dd6597cc778cf2515176beba0c55a0bcfda1c6bb1d6e23b3e2d3aa68ea96beaa0c51a0bcf9a1c6bb1c6e23b3e2d86a69e89adae8316ab2d3cab73acc56a8bef18cf3b53edc5aa3a68b1cac2b32ac75aacb2f88ef1bc3375ff62651db45869e15999632d565a7cc7d876a6ce3b57d4418b15169e1539d66285c5778ce79d292d96d7418be5169ee539d662b9c5778ce79da9e3c8b23a68b1ccc2e36a3c91282d96597cc71817a9b673691db4586ae1599a632d965a7cc7785f2bd5762ea983164b2c3caec66b88d26289c5778cd723a97b7c8beba0c5620bcfe21c6bb1d8e23bc66745a973f04575d062918567518eb55804bef7c7ee3bdd9f5b7c485fac2b0c2d0aa14cf3b6e95fe98b15a5a3ac03fb95615d16c65e9774bfb2051175590875913227405d5a044ec6fb297754d754cccc873aa9f57e62a9ab9469d3b6569793743e01dbe410e876bee5ff321518f349c88b7eaaceefc75fe754acbe079c49f083bedf05d6987c7740df053a891fb11742be6ddbdab2524ef410ad855ded23f3741ed9cde51619cb1543997996fa278378ebffbec1f3bec19c7aef01e24ce2c84ddb95669a17a1d115a09194c13e7b9f38e231fb100a87f8536564fb3737cac8b28550e63268a3b05fa9d433111cd96fd2515bd601d965dd322ffe8ac1b61f18cd3aaaf838047d3f65ac08194742d9645c888eb09e2e864dd5b5aba3ba8a2f59b7cc77054619a7a24bee19cbeacad8d960543cdd1d6886636fc894e978d11d78ba39e07154cfd471a88751a7ae469d8aa10cbedbd8c3413d0bc0afac5be67b806f17db1cb59063f2a586168550e606e3fc314a4759878adf2e96baf4725c1759b7b44bbd72e0bbc2f0ddc9f09d080edfce419079ffaa00e69e0e98d57a7bc7bfde523c6f9398123f9da04e7d4083b8ea84eb92f3bc3e86b685907f10cef3a49c9495e397b0ab58966d89ece672dd8de58aa14c2f4bfd9341bcf5ef6df0f43698d536b90bceed1cec0fa918e86570c87c27d0ae778476bd403b2983c7bf2e8eb4eb69f0f4347c2b1e39c7e90136395710fe04fcbf630eb8cd76af87855b6c384e9ced5ca773fc8c19cf753a03a3d87a024f8523cdcc6d7da9a10f1e979b1b6564d94228330e8e8d094b59b5df5d5c505bafa6da1edbbb63ba4d6fee402f1ca731007d0243c300f4927a3673c0737c503b56e3f89aea71831f1e7ad7d0f4a347412b3430f1b7c0528d2660c37c538b2d080e1f92b2106c32246533b0353164c1a130a5bc0c69e7422ed443d65d6870b60096387de3709e32650a9de380c74528abd091213d75e8dc376e44cd508c8f6606677d6247fdaf69867251eb72b51dcc7d2209f3660c163af2df14ea9b8479f1a7b68d0cad3a66f09047fb8c7b78c2a8a1a36bc6a350e68e8df982e0f00d60fe4609ee6aa7c300c00a63e3d0cca8173618f23fd930c7c7cf598e63e69ada04e04fa6e341b7960e7453eb97b16f870c1e39f28e099523470cb96ec2e8213523aa47e3d66c612817b5a5e5ffcdc1666be2b1ac9ab0d9c2658fb3d86c138e32dc026c72e46a0936e1391e6c4d212fe5cd2de3245c2f84f5cb2ea5fea7c469a62b7e5c501b02723856edaada7fd5a99cfa84ac3a1552431babcda9862e56770cd5d0c4ea2b766ae86135d4b01a5af8cc203d74b01a2af89c203d14b0fada4549901edaf7fca076e85e351d02ce8b82f4d0bcea36cd2541fab44b0daddb2e480f9dab6e5db60fd29f7953efd6abd377755b409df2aa4b3c7539a24e41d5a9a7ba7da16e65a9533a75baac4e05d5e99bba1ce9adb5ee13a6abc2747598ae09d3b561ba2e4cd787e98630dd18a69bc27473986e09d3ad61ba2d4cb787e98e30dd19a6bbc2747798ee09d2c33bdf1ba4875f57c33fdf1fa487867e20480f1bfd60901e52faa1203ddcf4e0203d14f590203d4cf5d0203d84f5c3417a78eb11417ae8dc4783f450bb6a08ded1417a386c354cb61a3e5b0dfdab860956430aaba186d550c56a58633504b21a1af9c9203d0cb31ab2f999303d1ba487747e3e4c2f84e9c530bd14a697c3f44a901e1e5c0d1b3e25480f33ae861f9f1ea4872b9f19a4873757c39eabe1d0d530e96af87435acba1ae65d0dffae86857f2b4c6f87e99d20fd48423d8a518f28d4ed7ff5184cdda25e18a46f9d2f0ed28fb8d5237fd505427509515d645606e92e54aa4b99ea62a7ba1caa2e98aa4baaeaa2abba2cab2edcaa4bbbeae2af5e7950af80a85762d42b42ea9529f50a997aa54ebd62a85e1355af5daad788d56bd5fb82f46df10341fa51a9ba1dae1e0da87854b7ef3f0bd30fc3f479987e14a61f87e92761fa69987e16a69f07e9218cd570c76ab86435b4b21a72590dcfac8672564341ab21a2ff18a4879e564357ff25480f7ffd6598be0ad243707f13a4875fff5b98be0dd3dfc3f48f30fd334cff0a6a87d2c6c6e24cddc2e8ab9460704dcdd051636a4a6aaa4b464d18593362ccc8274a268ea8195e52fdd8d071c346564fc4853fd70bcb38e07dc68d1bfc44c988d155431f2fa99e5053523daca4b27ac2e8aac30ed4ffd40b9d7da4c7c15555d1cefefdfb90fe9f7a3a6da9db3e1961fdc6cc753ba1693d0439b13e0b756e5abf0a3da98f5272397b77fa5cb764fcc8ea9a92d292d1e1dff0e05a3d716855fb12fcdff850e4f13525e36b068fab291936ae7a544987f6b8de49c7d7a312050937306dceac9f38adf4b794ea1562fbceab87025f9c573fd2fff67d48ff473d9db628a9470d8bebb3505949fd082b4a2265193fa1b266dce02135d10bf7f93e0b5f5f9f6ade5bcf6a366b5b0f6789fa2c7469dbfa115e5f1f6763b37016fc7f9f92ba051c4f0600", - "isInternal": false - }, - { - "selector": { - "value": 2603445359 - }, - "bytecode": "0x1f8b08000000000000ffed9d77701cc795c6679118565810cc99902c538ce06291c104e64c9992ac1c98409116495024942ccb922cc939e76c39cb39675bce392739e7ecf2d5dd3f57bebaab525df76c3fe34373668d5dcd03df60df543d6ccfdbde79bffee64dcf6cf7ec20131497bf1acbb872adb1c705672ff47ebf7bcd3fb6a52dc16de539393329e1ac4909676d4a38eb52c2599f12ce8694704e4809e7c494704e4a9033037c5cbc9353c69b4d19ef79413af2b631259cb9947036a584734a4a389b53c23935259cd352c2393d259c3352c23933259cb352c2393b259c7352c23937259cf352c2393f259c0b52c2b930259c8b52c2d99212cef353c27941829ccb8193c6c82f74af8f77af8bddeb45ee75897b5dea5e97b936d6b975bbcd15c6561a6bf5de5b65998dd9c1f282f75ebbb10e639dc6badc7b2deebd6e633dc67a8df5195b6d6c8db1b5c6d6195bef34d9606ca3b14dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb18b8d3dc1d83e639718bbd4d865c69e68ec728fe50a63571abbcad8d5c6ae3176adb1eb8c5d6fec0663fb8d1d3076d0d82163878d0d183b62ec4663478d1d33f6246337193b6eec84b193c6068d9d3276b3b1d3c6ce181b32768bb15b3dcd6e3376bbb13b8c3dd9e3bcd3d8538cdd65eca9c6ee36768fb17b8d3dcdd87dc6ee37f680b1a71b7b86b1671a7b96b1671b7b8eb1e71a7b9eb1e71b7b81b1171a7b91b1171b7b89b1971a7b99b1971b7b85b1571a7b95b1573b163a105e63ecb5c65e67ecf5c6de60ec41636f34f626636f36f616636f35f636636f37f690b177187ba7b177197bb7b1f7187bafb1f7197bbfb10f18fba0b10f19fbb0b18f18fba8b18f19fbb8b14f18fba4b14f19fbb4b1cf187bd8d8678d7dced8e78d7dc1d8178d7dc9d8978d7dc5d8578d7dcdd8d78d7dc3d3fc9bc6be65ecdbc6bee37cdf75afdf7375e998ffbe7bfd817bfda17bfd917bfdb157ff116ffd27defa4fddebcfdcebcfddeb2fdceb2fddebafdcebafddeb6fdceb6fddebefdcebefddeb1fdceb1fddeb9fdceb9fddeb5fdcab9d576b9f512c4f0c8697fe20a13ea963a0d78eab93d8febc9d9d13aa75efd16b8bf3d7b9757acd387fbd5baff7fc0d6ebdc1dbce44b73ed1f3e7dc7acef34f71eb533cff54b73ed5f34f77ebd33dfff96efd7cf067dd7bc586155facafd6b932e0a3fcac015fbdf3d582af813607be09ce570f3edabf0de09be47c13c037d9f926822feb7c93484b63e7395f7f9054aee40fd8ed3626bd5d3717914b9ef7a0dd6e1313ef94e4790fd9ed3633f0dafc98eab6d5087933cdf972e09bee7c4de0735dd0bf8e39eb9be97ccde09be57c53c137dbf9a6816f8ef34d07df5ce79b01be79ce37137cf39d6f16f81638df6cf02d74be39e05be47c73c1d7e27cf3c077bef3cd07df05ceb7007cd45f2e04df85ceb7087c746dd7023ebace3b1f7c74cd7781f3d97e626206e2393ff551613cea9fc1f778ea9bc1b798fa65f05d447d32f896406cf22d857e857ccb9c8ffa28fb5e9f2bf707491d1385f0185e9df476cd96ed76d726bfdd700e6c5d30ac753fc4590d5aad77e504ef0f69c3d8741d4371c85f07e51d5097ea911e749e2176dbefaf71e5f5253ed7e77d2e0775d644b4bf3f48b6fd6b3d9eb51e733db49f29678f68ce8e7a293b67af80ba7eeed135cf78ccd9ddc0917cceb6b76bce8e7a293b6707a0ae9f7b74dd3b1e73f66ae060c8d96e9e9c2de435678be36041109d7bf4dd673ce6ec51e0483e673b356747bf949db3f7425d3ff7e8fbef78ccd95b8123f99cedeed66b83512f65e7ec0ba0ae9f7b3416331e73f67ee060c8d983dacf8e7a293b675f0775fddca371c1f198b32f068ee473b6972967db356783e29c661044e71e8d518fc79c7d103892cfd9433a3e3bfaa5ec9cfd04d4f5738fe64bc663cebed795ed3cc377dd3cc37cf07dcff916006ff2b97db88d29b7db34b78bf77a0441748ed2dcdd78cced875dd9e6f10fe0de03f2fd90ee4b00df8f9cef02f0fdd8bb6783e918e8d26360f46d2af718f805d4f57399e691c7e331f03de060c8d96ecdd9d1b7a9dc9cfd1bd4f5738fee69188f39fb6be060c8d91ecdd9d1b7a9dc9cfd27d4f5736f892b8fc79cfd872bdbeb859fb9eb8565e0fbb9f32d07df2f9c6f05f87ee97c2bc1f72be76b05dfaf9d6f15f87ee37c79f0fdd6f9dac0f73be72b80eff7ced70ebe3f385f07f8fee87c9de0fb93f37581efcfced70dbebf385f0ff8feea7cbdce67efc9a37bafbee27c76df9246fd41b2fb96eeb1a46dd3fa8a3188dde4c56e1ac3d8cd5eece688d82b19626721062d196fbd1fca2b7979f239e0c158ab928fd56edbde1a8cbeedab8027cfd0f62cc4180d4f1e78da92e709cf9f85e4b71beee3564fd32cc46a8576b533b42b03b168dbb44ef172e0c3febb3d82b12379c6420662d1b669bd0318c987e7133aafd3f163cf878b33c3bc0cc752784d44f1e8f94fc4b10afc54e791e9c36ccb1c5b23bc8fe7d636cfc79497615e502cda36ad53bc46684fdbd8331646cb98f718b9fa880cc4a26dfbb1f1785f39f69a8d6abfe6c0770efaa442a57d5223b08dc5754adcbe96129be37c958118d4b791e605f0539d99ee0709b66fdb06fd2ec3f15728f7fa0dfb83e4f3b890c7e37a343cedc0c371ec331daf793cef3f1a249b6b9d9e566d9e5639a8d301fa7532e857ea3a84e229b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb37c66bcff02e737a9de0a218ce42b000fc7387ff80c28b72ddabe9dd7f929cceb243f6f51c8e39c25dd63b8d46b731dd4f97b66b8ee2f613edd9f1bc439cd15bcda8dea3e8bc6e0ecb958ce39c4b879e0a8f9cb96c462170e71cdb7d97bd4ec73c85a3d5d574468ca709fca084d339ea6789fe2728fc7e6e99cda61368eb9bf72e722512b2a2739b787f718f0ee9762ff41b950138cec3ff03cd39578ec917398345fdee5c5ae833aff9319de37742f2afdaf3bff9e275ba7dbdb367d6629f8bbbd6d4f719f258e7a6ffbadf059aaf37fd0a7bebe26f897661cf77f60bf1c405b71e98732ce9b277f1e2ecee3b797c1d3093c1cfd0cd3f5461e8f81a4e7f1bb3dada2ae63a84e17e8d7cda05fd4b528ad533c6556666556666556666556666556666556666556666556666556666556666596cf8cbf1525d62cd42b08611ca37b1fc2f90c7afe0b6ddfceeb3cb766382ef73c1ccd392df3da5c0775be5d335cf785aedc189c7dbf43dcbe6498cf2bb92f295e23b407e782b87ecfdde1f174446841e596c46217e7f193d778781ebfddd3b510a129d7f18a73aca8291eaf6d1e0fce8d360667df5b9285ed8cc5bd43717941f1f058ea001f95f1f7d11cfb19cf25fe7d3d140fe7af1f72da4e09b8f67d21cfd96ff4409bfa83b3f3bb0eeabc07fabef7b932dec381f78e3c1cf13e2da5e6a9493f9667d9e58bf3beab81b31fe260ec35c09a50ec368c9d714671c85f07e5cfd40cd7a57aa407694decf618a1678221bbffb936ef7339a8d31bd1fefe20d9f6f7793c7d1eb3dd271f843c7b18ceff5c7d526f8c464b4123aa83d7415ce74efffe4affbe42ec471bbc3af4d93aa8f315e8a3e2ee1f8d3a07709fc768db51e731ffbc309afb3cabfd3ead47a0bf48fa3ead472087f03eadc0dbfe32d83e713504f1e716aaf3736ffbfe35397d06ef03a33abf82fea2c9ddb3d8189c7dfd8df74c8dc5f7abb8fba4291e5ed7d07ba369bb65ee81fafd0932634e200b5e27509dbf78fbac3b867b55c467ff1ef359d28a9e4385df5f7cfdac0ebdf099fe4474281ef37d5e5b28af7ba12d54e7bfbc6bc0e4af5b8ad780c9b775e43509f5031d116da53aff0dc7da3fe11a8ff6137eef68a83dfb7d5a4a5d03927eb6cd63fd7c608c2de1f9c0f5b5c375fde7fc92d6e53e1fb8cbfb9cc4e703ff2fe45903dc87ced557af89d16819684475f0b741741ec167f9468d759cabefd3782d85fd731368caf5bb03fffce78fab455d232cf334c66b84e98e798ad3d9afeb8f17d2f932c9fb86f1b712ad10177f2bd1caa4671e74eb8775bc2e3897b1f34cb1e39e399d1f83d871cf9c1e8bd8cd5eece6318cad9aabe6923467782672f8fb337c66a95d4a5d9712430e3e579302c6da1430d6a580b13e058c0d29609c9002c68929609c9402c6c92960cc02e3b93cb733e853a8541faefd55ea5a036333fcef9242b9ffbf83f97fa994bcf6c1d80cdfe9422d5606a3d702bfe7713cfba1dcfff5420cf8bf0ba6a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a185b52c0787e0a182f4801e3e352c078610a181f9f02c6c5ca9808e3725ec642a58c9687e37ffe3d96ff39c6c0938fbae794e9fed9b2ffdf1af3f349db2a7d6e1cde5bc2fb3fe11edbb3ed38ee1d29f7d976a5fedf2a1363a15246ae7b81f0bea3d1f044dd1fd4c6cb58a89491ebf72ff81bbdd1f07481669d119a3130162a65e4ba57aedc7b39f19efeae08cd18180b9532e27dd509f2849a7597c1d3039a754768c6c058a89491ebbee42cc4180d4f2f68d613a1190363a15246a6dfb6859af596c183bf01eb8dd08c81b15029a3e559cda4595f193cab41b3be08cd2431224fd2cfc9ee8b88c5f19bc172db4e0cc83829058c9353c088f74970f45fa5ee93e8e3d5a750a93e5cfbabd47d12189be1f731a116f87b887fa7c55a5e9e92f74960ec754c5ae0ef55fe9d16eb8087e3f7335988311a1e62c8c1e7a6a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a18f1bb2ac3b562c9ef2febc679ecb8ef2ae33d76dcf792f11e5bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73c97143b0d63fcca38fe1891a725399e3cb61d63f50b687b7f044f86a9ed186b8380b61343da18d7a78071750a1855c7e23d8895305a9e8d4c3c1bcae0d9083c9b98783696c1b309783627cf13e6d4a632788821079f5b9d02c6f52960541d5547498caa63f5e8a88ccaa88cca782e18d3d0872b632af2b15029a3e5d9923c4fa8d9e63278b68066f4b9365ec642a58c96676bf23ca1665bcae0d90a9a6d89d08c81b15029a3e5d9963c4fa8d9d63278b681665b233463602c54ca6879b627cf136ab6ad0c9eeda0d9b608cd18180b95325a9e1dc9f3849a6d2f83670768b63d423306c642a58c966767f23ca1663bcae0d9099aed88d08c81b15029a3e5d9953c4fa8d9ce32787681663b233463602c54ca68797627cf136ab6ab0c9edda0d9ae08cd18180b95325a9e3dc9f3849aed2e83670f68b63b4233a98cab53c0b83e058ccc3a162a65b43c7b9978f694c1b317782e66e2d95b06cfc5c0f384e479c29cbab80c1e62c8c1e756a780717d0a185547d55112a3ea583d3a2aa3322a63798cfd2960d47dad8cca38be1919bea796fc2dd2c5e33c769317bba94a62c7fd1669bcc7d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cf25c5de977cec42b9cf98d9073c1ccfbc616a67de6ef712b7ad4713d4cf6a75a9a7d5c59e5639a87309e87729837e19884bdba6758a572ef34502989962176cff3209da4f31d67b7ad8f89731b53daeafbf6c9cc78eebebc77becb8be7ebcc7d63cd73caf86d89ae79ae7d5105bf35cf35c4a6c2cd707c3d7edf4fc53bb8d27ba729d5b4756f2539d2b27145fa7047a0c71c4d66348cf15d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63c9797e73978bf660c78028f2728c1b35018cf6c613c5385f1ac13c6334918cf52613cb5c278760ae3d9268ca74718cf66613c9dc2780ac2781609e359268c678e309e69c2783608e3992c8ca74e184f5e18cf6e613c8b85f1cc15c63316bfaf288767ba309ee5c278b2c278360ae3a917c6b34a18cf1e613cbb84f1f409e3d92e8c6789309e5e613c5dc278da85f16c11c6d32a8c679e309e19c278ce13c6d3288ca74118cf4a613c7b85f1ac11c6335f18cf4c613c39613c4dc2782608e3592b8c6787309eadc278ba85f16c12c6d3218c6785309e05c2786609e399228ca75918cf44613c19013cd9e0ec679265e1fd7de0abf13e6baf07e6cc187eff72e7af81cf5ce1cab511dbbe1c7cf4dbf02b223e8b3a5d0e6de977e5fc635b429d30563fac53bc46e0b84208cf44613ccdc278a608e399258c6781309e15c2783a84f16c12c6d32d8c67ab309e1dc278d60ae399208ca749184f4e18cf4c613cf385f1ac11c6b35718cf4a613c0dc2781a85f19c278c6786309e79c2785a85f16c11c6d32e8ca74b184faf309e25c278b60be3e913c6b34b18cf1e613cab84f1d40be3d9288c272b8c67b9309ee9c278f609e3992b8c67b1309eddc278f2c278ea84f14c16c6b34118cf34613c7384f12c13c6b348184f41184fa7309ecdc2787a84f16c13c6b353184fad309ea5c2782609e359278c67aa309ed9c278160ae3a989e061f8ff97210fddbf46dba6f57d426233ec87f0ff7e5ec9d4a6abdcb6eadd76899fe2d5419d83aee3b2f77be16789cbbfdf10c70aae028dae626a0bed8f8cb77fb863e37d950130049e3e41040fc7fda84ced1c918709feffd9bcd5ea6a4f2b7fdfe5a0ce95a0dfd50cfa45e536ad5f0d3c74de24d62cd45b2784917c9731f364a1cdb4943a06ae061e8e6392a99d61ae5ee3b5695d84ee540773f51a8676461d3bb47e0df06c706562cd42bd0d4218c97715334f16da4c4ba95cbd0678388e1da67686b97aadd7a60d11ba531dccd56b19da1975ecd0fab5c0b3d19589350bf5360a6124dfd5bc3c1d5968332da572f55ae0e1387698da19e6ea755e9b3646e84e753057af636867d4b143ebd7c17e5066658e62b63cf43b0262cd42bd4d4218c9770d2b4f473e0b6da6a5543f761df070f4f34cba87fdd8f55e9b3645e84e753057af676867d4b143ebd747c46e0992d5e2865168714304cf0d63ac05c52b97f9ca1432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac7314bd0d9f2d0734988350bf5360b6124dfb5bc3ce1ef82360723978cb7de0fe51b80e73a067d98da19de43bedf6bd3e608dda90e1e5ffb19da1975ecd0fa7ed80ffbcb60be3e85ccaa7365cc96879ed74cac59a8b7450823f9aee3e509fbb12dc1c8a5543fb61f7838fa79a67686fdd801af4d5b2274a73a787c1d606867d4b143eb144f9995398ed9f2d0ff0122d62cd4db2a84917c37b0f214c2df376e0d462ea5fab103c0b33f719e623fc6a07bd88f1df4dab4354277aa83b97a90a19d51c70ead1f84fd500ef3f52964569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d5b97a74b63cf4ff5788350bf5b6096124df7e569ef670de615b3072c978ebfd503e083c0712e729ce3b30e81ece3b1cf2dab42d4277aa83c7d7218676461d3bb47e08f6c37867be3e85cc9a1b63c3acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc72c21372ccf765726d62cd4db2e84917c077879c2e71e6c0f462ea5eedb39043c0719f4616a6778dfce61af4ddb2374a73a787c1d666867d4b143eb87613f28b33247315b9e1dae4cac59a8b7430823f90ef2f284fdd88e60e452aa1f3b0c3c1cfd3c533bc37e6cc06bd38e08dda90ee6ea00433ba38e1d5a1f80fda0ccca1cc56c7976ba32b166a1de4e218ce43bc4cb13f6633b83914ba97e6c007838fa79a67686fdd811af4d3b2374a73a98ab4718da1975ecd0fa11d80fcaaccc51cc9667972b136b16eaed12c248bec3cc3c5968332da5fab123c0c3d1cf33b533ecc76ef4dab42b4277aa83b97a23433ba38e1d5abf117876bb32b166a1de6e218ce41b60e6c9429b692995ab37020fc7b1c3d4ce30578f7a6dda1da13bd5c15c3dcad0cea86387d68f02cf1e5726d62cd4db2384917c479879b2d0665a4ae5ea51e0e1387698da19e6ea31af4d7b2274a73a98abc718da1975ecd0fa31e0d9ebcac49a857a7b8530920ffbb1bd4c3c8d1e4f638416e331769317bba94a62377bb19bab24b6e6b9e67935c4d63cd73c0faa20b6e6b9e67935c4aed65c53cdab53f3cc39d43c730e35cfa8e622357f34b9d89db96078a981580ce3736da31973449e85c278f609e3992d8c67aa309e49c278960ae3a915c6d3238ca753184f4118cf22613ccb84f1cc11c6334d18cf64613c75c278f2c278160be3992b8c67ba309ee5c278b2c278ea85f1ac12c6d3278c6789309e5e613c5dc278da85f1b40ae399278c6786309ef384f1340ae36910c6b35218cf1a613cf385f1cc14c69313c6d3248c6782309eb5c278ba85f17408e359218c6781309e59c278a608e36916c63351184f46004f3638fbb71df87b825af0d1fdfd7bc1f72457de07be9a8818b49d63e0a3f153da863d5f5d38e36c861af8cc4d115c4f8a8847716e8af8ec58e88eb1fa619de23502c74d4278260ae36916c6334518cf2c613c0b84f1ac10c6d3218ca75b18cf5a613c1384f13409e3c909e399298c67be309e35c278560ae36910c6d3288ce73c613c3384f1cc13c6d32a8ca75d184f97309e5e613c4b84f1f409e359258ca75e184f5618cf72613cd385f1cc15c6b358184f5e184f9d309ec9c278a609e399238c6799309e45c2780ac2783a85f1f408e3a915c6b35418cf24613c5385f1cc16c6b34f18cf42613c35113cfb9878e29ea7b04f406c3b0e4fd7a634469785f7c7e27741fb3c465a3f0a8ce4c3fb62f34c3c71cfa0c80b886db5580565bb64e17dfc5d07574ee53d465a8fca29bcaf7115134fdc733b5609886db5a0b90aba07200befe37dcc5c39b5ca63a4f5a89c6ae6e509ff7fc0ca60e452ea5e233ce638f621533bf378fc25f80c8dc86724aff4b4ca419db1788e445c7f40f1945999e3982d0fcd35112b9ecfc6e27754a3618c3abf32f084fd636b307229d53f1e051e8ef307533bc37eecb8d7a6d608dda90ee6ea718676461d3bb47e3c22764b90ac162746a1c589089e1363ac05c52b97795f0a9925e86c79e85e4462cd42bd154218c997e7e509fbc715c1c8a554ff78027838ce1f4ced0cfb84935e9b5644e84e75f0f83ac9d0cea86387d64fc27e2887f9780a9955e7ca982d0fcd89106b16ea15843092ef282b4f219f8536d352aa1f3b093c1cfd3c93ee613f36e8b5a910a13bd5c1e36b90a19d51c70ead0fc27e5066655666655666655666655666655666655666655666655666655666655666d9cc96877e3b4cac59a8d72e84917c2758798af30eedc1c8a5d4bcc320f09c4c9ca738efc0a07b38ef70ca6b537b84ee540773f514433ba38e1d5a3f05fb419995599995599995599995599995599995599995599995599995599995599965335b1e7a663bb166a15e871046f29de4e5097fb7d5118c5c4acd3b9c021e8e7919a67686f30e377b6dea88d09dea60aedeccd0cea86387d66f86fda0ccca1cc56c79e8d971c49a857a9d4218c937c8ca539c3fed0c462ea5fab19b8187a39f67d23decc74e7b6dea8cd09dea60ae9e666867d4b143eba7613f94c37c3c85ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3a578fce9687fec722b166a15e971046f29d62e5690fe71dba82914ba97987d3c0c3312fc3a47b38ef70c66b535784ee54078faf330ced8c3a7668fd0cec87f1ce7c3c85cc9a1b63c3acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc72c21372c4fb72b136b16ea750b6124dfcdbc3ce1730fba83914ba9fb76ce00cf69067d98da19deb733e4b5a93b4277aa83c7d710433ba38e1d5a1f82fda0ccca1cc56c797a5c9958b350af470823f94e33f364a1cdb494eac7868087a39f676a67d88fdde2b5a9274277aa83b97a0b433ba38e1d5abf05787a5d9958b350af570823f9f01cd7cbc4d3e8f134466871ae625b2dfa5cf93cf79a85f7fb8091ab6fe9f518691d739c7c8dc0d3c7c4d3e4f134456871ae625b2dd640d92e59787f0d3072e5549fc748eb5139d5043c6b98789a3d9ee6082dce556cabc55a579ee25eb3f0fe5a60e4caa9351e23ad47e55433f0ac65e289eb93d68e41ecb8e36b2c62c7e5ca58c456cd5573d55c35e7d43c730e35cf9c43cd33aab928cd19aea3c2b1538a1100032efd50c6ef0a1cd79e4cedcc477d1f5bebb509bf8fe198c3b9fabea1ccca1cc7cc346ed191f562933e81c743cb10b316633906d9e7b549da1864b9ccc753c8ac3a57c66c63df9a7cec8eac179bf4093c1e5a6e65d682a99d617f705b10ad31c5cb411dccd3db18da9981b8b46d5abf0df64339ccc753c8ac3a57c66c63df9e78ece2b3d93136e913783cb4dcceac054f3b8bfdc11d41b4c6142f0775304fef60686706e2d2b669fd0ed80fcaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccca2c9bd9c67e72e2b18be3f7189bf4093c1e5a9eccac054f3b8be3f77706d11a53bc1cd4c17d7e27433b331097b64deb77c27e5066655666655666655666655666655666655666655666655666655666655666d9cc36f653928f1dfe1e0763933e81c743cb5398b5606a67387e7f5710ad31c5cb411ddce77731b433037169dbb47e17ec076556e628661bfba989c72ecee7616cd227f07868792ab3163ced2cf6077707d11a53bc1cd4c17d7e37433b331097b64deb77c37e2887f9780a995567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975ae1e9d6dec7b128fdd1e8edf636cd227f07868b987590b9e7616c7efef0da235a67839a883797a2f433b331097b64deb14af1a988fa7905973636c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e4868dfdb4e46387bf67c7d8a44fe0f1d0f234662d98da19deff725f10ad31c5cb411dccd3fb18da9981b8b46d5abf0ff683322b7314b38d7d3f43ecac179bf4093c1e5aee67d682a99d617ff04010ad31c5cb411ddce70f30b433037169dbb4fe00c446bd138a1dde0349316adcabf53ddd956bc1f70c57ae03df335db91e7ccf72e506f03ddb952780ef39d01ef23dd7959783ef79aebc167ccf77e535e07b812bf781ef85aedc0bbe17b9f210f85eeccab780ef25ae7c2bf85eeacab781ef65ae7c3bf85eeeca7780ef15aefc64f0bdd295ef04dfab5cf929e07bb52bdf05bed7b8f253c1f75a57be1b7caf73e57bc0f77a57be177c6f70e5c5e07b30c2f746577e1af8dee4caf781efcdaebc0f7c6f71e549e07bab2b4f06dfdba04caf6f77e5f3c0f7902b3782ef1dae9c03df3b5db9097cef72e529e07bb72b3783ef3dae3c157cef75e569e07b9f2b4f07dffb5d7906f83ee0ca33c1f741579e05be0fb9f26cf07dd895e780ef23ae3c177c1f75e579e0fb982bcf07dfc75d7901f83ee1ca0bc1f749575e04be4fb932eedf4fbbf2fde0a37ee501f051bff274f051bff20cf051bff24cf051bff22cf051bff26cf051bff21cf051de3d177c9477cf031fe5ddf3c14779f702f051debd107c94772f021fe5dd8bc14779f712f051debd147c94772f031fe5ddcbc14779f70af051debd127c9477af021fe5ddabc14779f71af051debd167c9477af031fe5ddebc14779f706f051de3d083ecabb37828ff2ee4de06b71e53783ef7c577e0bf82e70e5b782ef71ae8cfdcc85aefc76f03dde951f021ff585ef00df45aefc4ef02d71e577816fa92bbf1b7ccb5cf93de05beecaef05df0a577e1ff856baf2fbc1d7eaca1f00df2a57fe20f8f2aefc21f0b5b9f287c15770e58f80afdd953f0abe0e57fe18f83a5df9e3e0eb72e54f80afdb953f09be1e57fe14f8e83c4efd8c3d9eed31483a9046d6476d6e8d680bf926425bfa8364afe928166d9bd6db8191f64161ec190ba3656cf3182d4f2783669857b494fafed1093c1d0c3c4ced0cbf7f74796d6af7da94833a17413bbb18da9981b8b46d5aef82d81cfb1cb5a877db5de269510775fec39de4ecb9b3948eb40d9bbf8588b6f432b785b64dfd52ef18c4eef662e7bdd8d81fd352eaf8ea06e61e0666bbddbee4b71b1e5fabddb628a7284e1edab4063448aa4d183be38ce290bf0eca353386eb523dd283ce5fc46e7399f625b2fb9febf43e97833abd11edef0f926d7f9fc7d3e731db7df2cfe9c31c0cc7439803bd1e07ade741bbbe18ed7a413baa83e7bf3626ed7a3c1e5a6f031ebac6e9021f5d2b103f5e67b58e01b7dfef75457093af1b18db2218f3c93386d73a6d1e23ade781917c3dc0d3cda499bfaf9778fae079b9c1ab439fad833ab35c5f322518f9fd83eadae36e7166b85df41dfcd120d93ebd81412f1c1f08409fc0d33000bda89df50c3c9383e13182334383a70fdc3870c9c081c31940abf330f13513d18c1af061b936c2170423874270489686427048b6c693058760a8befd2a659b45c30d03278e0d3df1e4c0c943a7ef3835347078f7e08d485defd123695c0b90147db44c0c86076dfa836493a7c18b552a7926c2eb04061ea6768627bd495e9b1abc36e5a04e3dbc3789a19d19884bdba6751c00261f6627bd8f1306355e5b308b27c1abbf6f136d10057c1c6c3fe3e0ec7b754ed806074fe2528f614711ed959cdd117654d0f6d676d4cf1e767654cf5e18d98edc8ed2d951393b0a6747ddec289b1d55b3a36876d4cc8e92d951b196a038ea7501f07c0518eda8961dc5b2a356f69ba43d2bd851283bea644799ecd584fd9662cfc0f68ad39e0ded59d05eedd86f53f69bb53dc3d8b3b73d33d9b389bd3ab25745f62ad65ed5d9999975c6d63bad3718db686c93b1cdc6b618db6a6c9bb1edc67618db696c97b1ddc6f618db6bec62634f088a23ca9718bbd4d865c69e68ec72635718bbd2d855c6ae36768db16b8d5d67ec7a633718db6fec80b183c60e193b6c6cc0d81163371a3b6aec98b12719bb2928dee171c2d8496383c64e19bbd9d869636782e22c919d15b2b34076d6c7cef2d8591d3b8b63676dec2c8d9d95b1b33076d6e59ea038ab626747ec6c881d09b723df76a4db8e6c3f33288e5cdb91eae704c591683bf26c479aedc8b21d49b623c776a4d88e0cdb91603bf26b477aedc8ae1dc9b523b776a4d68eccda91583bf26a475aedc8ea834171e4d48e94da91513b126a473eed48a71dd97c28288e5cda914a3b32694722edc8a31d69b4238b7624d18e1cda91423b32684702edc89f1de9b3237b7624cf8edcd9913a3b326747e23e63ec61639f35f639639f37f605635f34f625635f0e8a39f955635f33f67563df30f64d63df32f66d63df31f65d63df33f67d633f30f643633f32f663638f18fb89b19f1afb99b19f1bfb85b15f1afb95b15f1bfb8db1df1afb9db1df1bfb83b13f1afb93b13f1bfb8bb1bf06c3a3f6d851fcd3add008f281a1a18113a7865a86065b4edc727ce8d8a9e377b4dc766ce868cbe0ad03a78f1c1fbc0d3ffc76d735d1f0f886d3a70fdcd172ece4e181db5b066f196a193cd27270f0969387cfe087beec3e34ffec88070e1f8e0ff6e39ac740fab30a83fed97d8e261e76946edbdf2a11e43f2bf9d0b4daca1a74853bb3d0b7d24b8b57712d678e0f0eb5e45b4e9abf078e9bcf0c1c6e6dc1f7ce1891cf0cb59c193a707aa8e5c8e9c1132d6dadb8dd03932a68c43fa657f0a1993346dff2e0ff01dcf19ec8b1020400", - "isInternal": false - } - ], - "packedBytecode": "0x000000028df71de5000000476f1f8b08000000000000ffed9d777414c7dae65b2030782c01ced9c2e13a60632144163038e78c8d31c62004061b104118e76c72744ee49c93c91803c6d8d737e7ec74af6fd87376bf3dbb7fecf79dddf56ed74cbd9f1e8aea4123770d8f34d5e794a6fa5575bfbf7afaedea54dd5510a4a77f85a940e79b86e9c2e0c849fe9fd4bfa5df6fea10e3ba4a5d72163410ce260d84b36903e12c6c209ccd1a0867f306c2795c03e16cd140385bc6c859007cae788f6f60bc8906c67b42d030e2b6a88170163710ce560d84b37503e16cd340384f6c209c273510ce931b08e7290d84f3d406c2795a03e13cbd81709ed14038cf6c209c673510ceb31b08e7390d84f3dc06c2795e03e12c69209c6d1b08e7f90d84f3821839db01a7dccbbf48fffe40ff5eac7f2fd1bf97eadfcbf46f3b5dc7423d7f7998ae0853fb305d69fc4f09a36ee89785a9a3f1bff230750a53e73075d1ff2bd1ffeb1aa66e61ea1ea61e61aa0853cf30f50a536fad479f305d15a6abc3744d98ae0dd37561ba3e4c3784e9c630dd14a69bc3744b986e0dd36d61ba3d4c7784e9ce30dd15a6bbc3744f98fa86e9de30dd67b0f40bd3fd61ea1fa607c234204c0f866960981e0ad3a0300d0e5365988684a92a4c43c3342c4c0f876978984684e991303d1aa691611a15a6d161aa0ed398308d0dd3b8308d0f534d982684e9b1304d34347b3c4c4f84e9c9303d65703e1da667c2f46c989e0bd3f3617a214c2f86e9a530bd1ca657c234294c93c334254c53c3342d4cd3c334234c33c3342b4cb3c334274c73c3f46a985e0bd3eb617a234c6f86e9ad30bd1da677c2f46e98ded32cb223bc1fa679619a1fa605615a18a645615a1ca625615a1aa665615a1ea615615a19a655615a1da635615a1ba675615a1fa60d61da18a64d61da1ca62d61fa204c5bc3b42d4cdbc3b4234c3bc3b42b4cbbc3b4274c1f86696f983e0ad3be30ed0fd381307d1ca68361fa244c87c2f469983e0bd30fc3f479987e6468fee330fd244c3f0dd3cfb4ede7faf717baacecf3bfd4bfbfd2bfbfd6bfbfd1bfbf35caffce98ffbd31ff07fdfb47fdfb27fdfb67fdfb17fdfb85fefd52ff7ea57fbfd6bfdfe8dfbfeadfbfe9df6ff5efdff5ef3ff4ef3ff5af7afef75edb74be45503b258398daa4f2a183d5fd7f11db7cbea89e5d35d5ff93df126d2fd4f3f25ba0edcdf47c33c3de5ccf3737d6d342cfb730ecc57abed8b0b7d6f3ad0dfb897afe44c37eb29e3fd9b0b7d5f36dc19ed0ff4b572cfda36c4db5a9006c129f4dc0d64cdb9a82adb9ac0e6cc7695b33b0c9f66d0eb696da761cd88ed7b616604b685b4bd1324c27685b32882b564a07abf516c5bd5efdcca4387ede4ab5de568e785bc7cf3b44adb78d035e151f27ea751541dc9ca46dc5603b59db5a81ed146d6b0db653b5ad0dd84ed3b613c176bab69d04b633b4ed64b09da96da780ed2c6d3b156c676bdb69603b47db4e07dbb9da7606d8ced3b633c156a26d67814d37b9c1d9603b5fdbce01db05da762ed82ed4b6f3c026e778256093f3bdb6609373bff3c126e78117689b6a3b5a16803f6d97762be54fda6cb0fd40da6bb05d2c6d35d82e91761a6c97826fb15d066d8dd8da699bb45bea7fdd753e19c4b59f94a5f6931e71af375cb35a6fcff8d79b7a7ed72ba8d53a097e7a8056bd753ec6be2d1dd0b79cdb881fb11742fe26282be5440f39f608bb3a1654e87cef0ccb7537962b86321596fa278378ebdfd3e0e969303783bc9b98ed58ea63b6ce53d631db0fca9ab127e7418d31666f050e07315bee63b6ce53d6313b0cca9ab127e7c28d31661f000e0731dbd54dcc9695fa984ddf1b0b027becc9f550638cd911c0117fcc76f2315bf729eb987d11ca9ab127d7c48d3166270247fc31dba5ab3f37a8f39475ccce81b266ecc9fd99c618b3af008783981de2dbd93a4f59c7ec7c286bc69edc2b6c8c31fb1a70c41fb3dd1cc56c471fb341fa396710d8634fee5b37c6985d041cf1c7ec107f7fb6ee53d631bb0bca9ab127cf501a63cc6ed079f59ce1e7fa39c3d960fb85b69d03bcf1c7765599a3d8eee0633bddff2308ec312acff31a636c7fa4f32a8e7f05fd11c4f66be9ab00b6df68dbf960fbadb65d00f572b00f74f1fb40ddeb94ed3ef067286bc6b23c5b6e8cfbc02f80c341cc76f5315bf73a651bb3ff05ca9ab127fd1c1a63cc7e091c0e62b69b8fd9bad729db98fd77286bc6de253adf1863f6bfeabc3a5ff8a33e5fb80c6c7fd2b67660fbb3b65d0eb6bf68db1560fb42dbda83ed4b6dbb126c5f695b29d8bed6b60e60fb46dbcac0f6576deb08b6bf695b39d8bed5b64e60fbbbb67506db3fb4ad0bd8fea96d5dc1f62f6deba66daa9f9ef4bd3aa46d2d803f19c4bb6da5dfa5ac5be63be4c0772bc377ab1cfa6e63f86e63f15de6c077027cc85460cc27215fe696a7b41878d05779fcbe3aaaba770cea5ef772e0e9e4a0ee09f051179e4ec0d3397e9ed4f1b34bfceb4d6de38e86a609f0d511ead5d541bd0ac097ac5be6c55f31d8b06ded6a61ec163f635901f89275cb7c3760141bb6f5f22e95ec3fea787871412daf837d29754e24fee4db55c2510e7629d3a16d2d5b3bcd5604ffc7e35e67c3e6282e537121be64dd322ffe8aa03e9d73cf585657c64e06a3ab36a2007cc9babdefdaed20793c8ebbb8d6b1b569e2bb470e7c77337c971bbeb1ed9429d3b1ad1b30c77ecda98f6d15f1afb714af4fe4da50fce0f9035ec3c55527f42dd786e247ec8590bfada0b6ac94133da41d167615cbb22d91dd5caeabb15c3194e961a97f3288b7fe15064f85c1acb6c9d5702c74b03fa462a087c121f3e5a05d4584763d403b29730968e7aa3deb6ef0c87c67e09176ac0bf0b8ba268ae2c9c5f5d8d17ce3392c5e3fcbfff13cc0d5f6ea6030cabc6d7b750346dbb98a83eb998ce72a9d80516cdd81a7a323cda2b66b4712df0e6225d51e890f393797fdb733d8a54c37fd429d6a2b1f81b6d2458c603cca54d76bdef8b75359ea1abc53163cb8ed1c5c577570148fa578ffe6bb20de5833dba54e865651f7785cb5e51d0d1e99177f9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec99f999f17912f6db92729d4918cdfe6faeeef3a7be61a8d725eb57cf75feb7d3fe6065a5d83f46fa415c66d4b910ca1435a92dfbffa03f98f99c0afb487676ab5d6a5b627fcc24cc8b3fec6b85db92a1bf53496cbed3dfa274f1bc4df5b156dfd134fb7e76b668eaa2ff336a5a60688afdf12f3778549c5634ad6573f1ec2fdb6791a895e4e37cb6571cd8633dfeed5276d833eb26c1e1ed071e675cf5df91b65a9e97f7307c174299b39ad46e1be95b25e3cc763496c37e3fb26e59e632b05718eb6ead97158e66c6fabbc0b252e65c6853f737a9d5cc415b59966ddf757c6e1eff7138fd1cbf63163c1d80c7453be3e87ce3b0efadc6fd1cdfec9f663b8f9132d8b7cf41bfca8cfd9dc49f67f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b667e66c5633e6bc5f76bcb491873d4f721f53c43be5526eb4f7d2fb849ad5fd7cfe1e499533ba3cef8eee87f6f525b768bce170547f67788da96aebe4f11b52dc51f7e7b069f05b978ae5b00be64dd65162d245f129bef32676343c873fc8e86aee5164d5dedaff88c1535c5fdb593c183cf46a3beed5366d85cf61d8a8a0bf187fb5219d8248fef47bbd8ce782c31fbf5883f7c7efd23ad6debc0d5b62f2b75d96ee0775392c191f18ddf53f939b47dbfd479ecc3817d47beb6fc5fa64ccfa9453f556707dfd72c2d8075c9f6b57ddbb30fb0c6e4bb03aeab40a73e86068590ffaa496d59292765456b6157fb887c0306d9cde53a19cb1543995e96fa278378eb6f7e6bb5b7c1acb6c96f20cebe86e3bfab36a95784469781465206cf835cf5c933db48b37f23f6db6b6e94c1731629f32f68a3a2fa8fdafa1cba3a8e45f539b49d1b770046b38e663fcf7cefa7f51fd05ec4dd4feb3f2086b09f5660acbf1dac5fb89a07d1c71629f37f8df59be7e4b20cf603fbcffe4ff03d97329dcfe69cfc585d5fd9cec971b9a8ba2b66fc0e5a3246668c0964c1f3042973bcd65ab65945047737cbb24511cb8a56e6b7c28a8223f573f39db5f43edfdba88bc4357e835cca9c04757173de923e0774f54db924d449e5cb2c759532a7c3be76a6ce27603be17e7ba9e5ff32653a07c431dcaf8abfcea9ed7b357026c10ffabe065863f2dd017dcb39a0f8117b21e42f695a5b56ca891ea2b5b0ab7d44cea390dd5cae87b15c3194e963a97f3288b7fe57193c5719cc6a9b9c03717629f44377d556f789d0a81d682465f09ea2ed3ba0b6638cabbefd51c798326034db4d3c4eba6433df1332efabd9ce11a48c2c8be7085da09d4d58ca9af70be5781967bf617c57a20bf8c577255c7dbbb93be89684793c2f3896be5d7cc756f98b1a33a17b0e7c478d99900bdf6d0cdf6d72e8db6bee3567d2dcc11804a9f7cff09ba56aca745e8ae312c8724d80d1c5580e89e0f06f8f1f8d11c77790e59a02a38be343b6df3eef028cb25c2130ba78b714c7dfa80b237e63188ff3c2e8e05bb11deafbad58bca7d71c1899ded9c46753c701a38b7ba8f57d570fcfe75bc0afab71893a66c188e7f3b25c4b6074716f1c9f0dd68511af8b64b9e381d1c533ac6cc777c26fcfe3bd65978c998eed8efba294657befa5c22d4fc6730df4ed605cc39416789ff1685af474cb93f1dc077d3bb8ef97d202c7193c9a16f86cd0c5b88789e0f0e77047e3c1e797b2dc89c09874c4d83b0bc62430fee7bd6260ece388319905631f6014fbc9c0e8e0fe6b8ab14f168c789f52963b0518af76c47855168c5703a32c772a30bab8979a00bf7561bc061865b9d380f15a478cd764c1782d30ca72a703e3758e18afcd82f13a6094e5ce00c6eb1d315e9705e3f5c028cb9d098c373862bc3e0bc61b8051963b0b186f74c47843168c3702a32c773630dee488f1c62c186f024659ee1c60bcd911e34d5930de0c8cb2dcb9c0788b23c69bb360bc051865b9f380f156478cb764c1782b30ca7225c0789b23c65bb360bc0d1865b9b6c078bb23c6dbb260bc1d1865b9f381f10e478cb767c1780730ca721700e39d8e18efc882f14e6094e52e04c6bb1c31de9905e35dc028cb5d048c773b62bc2b0bc6bb815196fb0130dee388f1ee2c18ef01c6bb2d8c7d1d31de9305635f6094e52e07c67be3674c5d4bf7cd82f15ee0b92f7e9e9466f766c1739f5b9ed477f5eeb5f8ba3f7e5fa96dd12fa87bddef079efef1f3a4b6c5fd59f00843312c879a3d103f634ab3fe59303e003c03e2e74969f640163c0340b3072c9a3d183f634ab30159303e083c03e3e74969f660163c0341b3072d9a3d143f634ab38159303e043c83e2e74969f650163c83825acd1eb26836387ec6946683b2601c0c3c95f1f3a4341b9c054f256836d8a2d990f819539a5566c1380478aae2e7496936240b9e2ad06c8845b3a1f133a634abca827128f00c8b9f27a5d9d02c78868166432d9a3d1c3f634ab36159303e0c3cc3e3e74969f670163cc341b3872d9a8d889f31a5d9f02c184700cf23f1f3a4341b9105cf23a0d9088b668f3a627c240bc6472d3c717f27fb118baf518eea3e32a87bdd85a11896c37e12a31d318eca82713430ca72d84fa2da11e3e82c18ab8151964b3866ccd44fa21a7c8f89df77aa5daa0eeaaecf18b73c19fb49a0efb18eb41813d45d8bb16e7932f69340dfe31c693136a8bb16e38067bc032d12e0a32e3cc2500ccb613f891a478ce3b360ac0146590efb494c70c4589305e3046094e5b09fc4638e182764c1f81830ca72d84f62a223c6c7b2609c088cb21cf69378dc11e3c42c181f0746590efb493ce188f1f12c189f0046590efb493ce988f1892c189f0446590efb493ce588f1c92c189f0246590efb493ced88f1a92c189f0646590efb493ce388f1e92c189f0146590efb493ceb88f1992c189f0546590efb493ce788f1d92c189f0346590efb493cef88f1b92c189f0746590efb49bce088f1f92c185f004659ee51c78c99ae5f5e68e4bea3ae551abbefa8eb92c6eedbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ece997cbfe8c077027cc85460cc27212f0cc5b0dca39eb15133224f497c3ca55877f4f51241dd5fb2f01438aa3bfa7a99a0eec2d0d0185f6c008c8f360046af63ba0f627d1815cf2bf0ff648c3c2f67c1f30af04c72c4f34a163c93806772fc3ca9989a94058f3014c3728f3600c6171b00a3d7d1ebc8c4e875cc1f1d3da367f48c9ef15830368436dc333688782cab2fa3e299123f4f4ab3c959f04c01cd64b9fbdc3296d59751f14c8d9f27a5d9942c78a68266532c9a39602cab2fa3e299163f4f4ab3a959f04c03cda65a3473c058565f46c5333d7e9e9466d3b2e0990e9a4db368e680b1acbe8c8a6746fc3c29cda667c13303349b6ed1cc0163597d1915cfccf879529acdc88267266836c3a29903c6b2fa322a9e59f1f3a4349b9905cf2cd06ca64533078c65f565543cb3e3e74969362b0b9ed9a0d92c8b660e18cbeacba878e6c4cf93d26c76163c7340b3d916cd58191f6d008c2f360046c73a96d59751f1cc75c433270b9eb9c0f3aa239eb959f0bc0a3cafc5cf938aa957b3e011866258eed106c0f8620360f43a7a1d9918bd8ef9a3a367f48c9e313bc6971a00a3dfd69ed133366e4607d7a919df457ab591fb8e7a17a9b1fb8e7a17a9b1fbf671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98ff37cf0ede3dcc7793ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7b98f7326dfafc7efbb2cdb6fccbc0e3c2ebe79e3a89ea56abd6fe8757d17a37e4aab370dad5e35b42a86326f807e6f3ad0af00fccaba655efc65cb7c3101b323df65aa7d6909f5171f2f1a7a28ff6f39aa7b545bff5623f71dd5d63776df516d7d63f7ede3dcc7793ef8f671eee33c1f7cfb38f771cee21bf3cd82daf376f9fea95ac7db3a5fa8e7a5fc4b6097324f1d97fe6d1df87dc8856fbf0ff963453ef8f671eee33c1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f731fe7f9e0dbc7395f9c17c3ffc7e680273078820c3c53c978aac878fa91f1dc4cc6d39b8ce771329eae643c23c9781e22e3b98b8ce705329eebc8789e23e3e940c6339e8c671a19cf30329efe643cb792f1f421e379928ce70a329ece643ca3c9780693f1dc43c6534ac6f30a19cf0d643cb9785f281b9ef6643c15643c73c8782690f14c27e3194ec6732919cf00329e4bc8786e27e3b99a8ca7988ca715194f3919cfd3643c63c8788690f1dc4bc67313194f2f329e89643cddc8786690f13c42c633898c672019cf9d643cd792f15c46c6f32c194f19194f53329e71643c43c978ee27e36947c6730b194f928ce709329e2e643c33c9784691f14c26e31944c6733719cfcb643cd793f13c4fc6d3838c6736194f0d19cfc3643c0f90f15c4cc6731b19cf55643c2790f11491f17422e3798a8c6716194f3519cf14329e4a329ebe643c3792f1f424e3994bc6f318194f77329e11643c0f92f1dc41c6730d19cf95643ccf90f1b426e36943c6d3918ca7808027111c39864902feff3ad89a18cbaacfbed6b4adfdff3bdade04967957e79b5ad6fd0ed8e45bb2ef5a96459dde81ba2475bef4fb4d299dd05712e6c55f1170bc4bc2d3918ca70d194f6b329e67c878ae24e3b9868ce70e329e07c9784690f17427e3798c8c672e194f4f329e1bc978fa92f15492f14c21e3a926e39945c6f314194f27329e22329e13c878ae22e3b98d8ce762329e07c8781e26e3a921e3994dc6d3838ce779329eebc9785e26e3b99b8c671019cf64329e51643c33c978ba90f13c41c69324e3b9858ca71d19cffd643c43c978c691f13425e32923e379968ce732329e6bc978ee24e31948c633898ce711329e19643cddc8782692f1f422e3b9898ce75e329e21643c63c8789e26e32927e36945c6534cc6733519cfed643c9790f10c20e391ef79b2f00c27e3994ec633818c670e194f05194f7b329ed7c9786e20e379858ca7948ce71e329ec1643ca3c9783a93f15c41c6f324194f1f329e5bc978fa93f10c23e39946c6339e8ca70319cf73643cd791f1bc40c6731719cf43643c23c978ba92f13c4ec6d39b8ce766329e7e643c55643c53c978c65a785e77c423efbbcbba65fe7512df0eb643a95aef7b8eeaf4be5e5733bd5ee1177f855066f2f1e95ff57e382e2b5ce6f709f0ded7fba0d1fb8eea22dba3c0d83ee8fb6d47bee51d2459b7ccbfddc87db7327cb7ca13df6d0cdf6df2c4b78f731fe7f9e0dbc7b98ff37cf0ede3dcc739936f07d70665f89d34990a8cf924e4f17ac1c5f7e51cd5f3b0ebc4ef62d44f6935cfd0cabcb62a8632ef817ef31ce867bbf69479f1972df3c504cc18172541bc71313ffe3a95a976ab25e83adfd017ebb5c091a651c790058ddc77d431a4b1fb8e3a863476df3ece7d9ce7836f1fe73ecef3c1b78f731fe74cbe17ea7c8cd78da5e8433d5f94eb8185e077b1ce17c4e857ad6b915e57a15eb7702c06bb94699248ffb60efc3eefc2b7dfe7fdb12d1f7cfb38f7719e0fbe7d9cfb38cf07df3ece7d9ce7836f1fe73ecef3c1b78f73be3837f3d25ffc126073d59f3f2a1673f12ec1b1f41d158b8ddd77542c3676df3ece7d9c33f95ee2c077027cc894a98fdf12e059e480c7513d53cf36961a757adda8533194c163fc5207f52c00bfb26e995f0a3c328d051e177150976d8e3c53c978aac878fa91f1dc4cc6d39b8ce771329eae643c23c9781e22e3b98b8ce705329eebc8789e23e3e940c6339e8c671a19cf30329efe643cf3c8786e25e3e943c6f32419cf15643c9dc9784693f10c26e3b9878ca7948ce715329e1bc878da93f15490f1cc21e39940c6339d8c673819cfa5643c03c8786e27e3b99a8ca7988ca715194f3919cfd3643c63c8788690f1dc4bc67313194f2f329e89643cddc8786690f13c42c633898c672019cf9d643cd792f15c46c6f32c194f19194f53329e71643c43c978ee27e36947c6730b194f928ce709329e2e643c33c9784691f14c26e31944c6733719cfcb643cd793f13c4fc6d3838c6736194f0d19cfc3643c0f90f15c4cc6731b19cf55643c2790f11491f17422e3798a8c6716194f3519cf14329e4a329ebe643c3792f1f424e3994bc6f318194f77329e11643c0f92f12c20e3b9838ce71a329e2bc9789e21e3694dc6d3868ca723194f01014f2238f2ddff04fc7f1ed8e41df5d7c1b64ce71781ad89c547539d5f0ab6429d97751c17a6e7da1eb96ed4c9d57bf9e82b09f3e2af08389691f07424e36943c6d39a8ce719329e2bc978ae21e3b9838c670119cf83643c23c878ba93f13c46c633978ca72719cf8d643c7dc9782ac978a690f15493f1cc22e3798a8ca713194f1119cf09643c5791f1dc46c6733119cf03643c0f93f1d490f1cc26e3e941c6f33c19cff5643c2f93f1dc4dc633888c673219cf28329e99643c5dc8789e20e34992f1dc42c6d38e8ce77e329ea1643ce3c8789a92f19491f13c4bc6731919cfb5643c7792f10c24e39944c6f30819cf0c329e6e643c13c9787a91f1dc44c6732f19cf10329e31643c4f93f19493f1b422e32926e3b99a8ce776329e01643c9792f10c27e3994ec633818c670e194f05194f7b329e1bc8785e21e32925e3b9878c673019cf68329ece643c5790f13c49c6d3878ce756329e79643cfdc9788691f14c23e3194fc6d3818ce739329eebc8785e20e3b98b8ce721329e91643c5dc9781e27e3e94dc67333194f3f329e2a329ea9643c6373c4a3de6d97773903e0c22909f9a5c033cf018fa37a96e2770dbe8b71bd4aabe586560b0cad8aa1cc12d06fb903fd0ac0afac5be697038f9c8f082b7e53e1051246b1cd73cc93803acb94691f580e3c2ef64947f54cc5ea0aa34e2f5874973218ab2b1cd4d3b6efc8fc0ae07959e7853501e55e266114db52c73c09a8b34c99627505f0b8d8771cd53315ab2b8d3abd6cd15dca60acae74504fdbbe23f32b81e7159d17d604947b8584516ccbddf29427a0ce32658ad595c0e362df7154cf54acae32eaf48a45772983b1baca413d6dfb8eccaf82ede0993db38d59f148ff56614d40b949248c625be194a7bc3401759629533bb60a785cb4f38e744fb563ab8d3a4db2e82e653056573ba8a76ddf91f9d516df2541bc5aaca983166b2c3c6b72ac85f8cb9679490364f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e62f63a7b9da398bdce5ee72866afb3d7398ad9ebec758e6266d059f1c87822c29a8072934918c5b6d22d4feabda0c9c1e15381319f84fc1ae059e5401f47f54cf5215f6bd469b245772983fbd75a07f5b4ed3b32bf16b64336ccab1b20b3d7b97ecc8a678ace0b6b02ca4d216114db2ab73ca9766c4a70f894a91d5b0b3c2eda7947f54cb563eb8c3a4db1e82e6570ff5ae7a09eb67d47e6d7c176f0cc9ed9c6ac78a6eabcb026a0dc541246b1ad71ca53967abf716a70f894a91d5b073c2eda7947baa7dab1f5469da65a74973218abeb1dd4d3b6efc8fc7ad80ed930af6e80cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7397f74563cd3745e5813506e1a09a3d8d63ae5e9987aee302d387ccaf4dc613df0b8782ee348f7d473870d469da659749732b87f6d70504fdbbe23f31b603b3476e6d50d90d9c7466e987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398a99213614cf749d17d604949b4ec228b6756e7952df3d981e1c3e65eab7b30178d63bd0c7513d53fd76361a759a6ed15dcae0feb5d1413d6dfb8ecc6f84ede0993db38d59f1ccd079614d40b919248c625bef9627d58ecd080e9f32b5631b81c7453befa89ea9766c9351a71916dda50cc6ea2607f5b4ed3b32bf09b68367f6cc3666c53353e7853501e56692308a6d835b9e543b3633387ccad48e6d021e17edbca37aa6dab1cd469d665a74973218ab9b1dd4d3b6efc8fc66d80e9ed933db9815cf2c9d17d604949b45c228b68d8e791250679932b5639b81c7453befa89ea9766c8b51a75916dda50cc6ea1607f5b4ed3b32bf057866ebbcb026a0dc6c1246b16d72cc93803acb942956b7008f8b7dc7513d53b1fa8151a7d916dda50cc6ea070eea69db7764fe03e099a3f3c29a8072734818c5b6d9314f02ea2c53a658fd00785cec3b8eea998ad5ad469de65874973218ab5b1dd4d3b6efc8fc56e099abf3c29a8072734918c586edd85c473c45064f91458b63e55b69d143e74fd0bf09f87f0f6074d5b6cc3518651e635c6c4539d0ac95c1d3cad0ec58fa565a54405e4db8bd2a8091617bb5ca81666d0c9e368666c7d2b7d2a2a7ceb7d6bfb8bd7a0223c3f66a033c0edae7f284c1a3a64cc7eead8ef57154cfd4b17b5b60d71d8f4352068fdddb1cd4d3762e21f3db603b7866cf6c63563c7d755e581350ae2f09a3d8f09c7f7bfc3ce50983474d99dab1ed8ef57154cf543bb623b0ebbe1d74973218ab3b1cd4b300fccaba657e076c876c9857374066af73fd98154f3f9d17d60494eb47c228b66dc0b3337e9ef284c1a3a64cedd84ec7fa38aa67aa1ddb15d875df09ba4b19dcbf7639a86701f89575cbfc2ed80ed930af6e80cc5ee7fa312b9efe3a2fac0928d79f84516c3b806777ec3ce9315f90474d99dab1dd8ef57153cf743bb627b0ebbe1b749732b87fed7150cf02f02beb96f93db01d3cb367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed93373332b9e013a2fac0928378084516cbb80e7c3d879d2cf1d90474d999e3b7ce8581f37f54c3f77d81bd875ff1074973218ab7b1dd4b300fccaba657e2f6c07cfec993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6ccdccc8a67a0ce0b6b02ca0d246114db1ee0f9287e9ef284c1a3a64ccf1d3e72ac8fa37aa69e3bec0becba7f04ba4b198cd57d0eea59007e65dd32bf0fb6c33ecfec992dcc8a6790ce0b6b02ca0d226114db5ee0d91f3b4ffaf929f2a829533bb6dfb13e6eea996ec70e0476ddf783ee520663f580837a16805f59b7cc1f80ed900df3ea06c8ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9dbdce51cc5e67af7314b3d7d9eb1cc5ec75f63a47317b9df34767c553a9f3c29a807295248c62db073c1fc7ced3b13461f0a8a9c0984f42fe63c7fab8a967fab9c3c1c0aefbc7a0bb94c1fdeba0837a16805f59b7cc1f84edd0d899573740661f1bb961f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e628661f1b9e398ad9c786678e62f6b1e199a3987d6c78e6286686d8503c553a2fac09285745c228b603c0f349fc3ce50983474d05c67c12f29f38d6c7513d53fd760e0576dd3f01dda50cee5f871cd4b300fccaba65fe106c07cfec996dcc8a6798ce0b6b02ca0d236114db41e0f9d4014fc2e05153a676ec53c7fa38aa67aa1dfb2cb0ebfe29e82e6530563f7350cf02f02beb96f9cf8067b8ce0b6b02ca0d276114db21e07111ab8aa7c8e091f94f097c2b2daa75fe04fd8bdbab1a1819b657510e346b65f0b432343b96be95166320af26dc5e638091617bb5ca81666d0c9e368666c7d2b7d262acceb7d6bfb8bdc60223c3f66a9303cd8e657b782cf7ed6319a75ef363a779c131d4bce0186a5ee035a7d2dcc1f1a50c8f650130e09484fc67c0f379fc3ca97b5c9f65c1f339f0fc307e9e0e8eea59aad6fb23608f6bbd4aab1f1b5a7d6668550c6590e1c70ef42b00bfb26e99177f9ed9334731e3b9adb026a0dca7248c629336c855bba1ea7e855e97acbf59980e9d5cebd7c5b307bcefda4caf5738c45f2194b9bfa4b6ece79aad08fe2fdb4dd5e7a06173f43e7007db333099177f4541eeee8366ba2f8b5ab8787693ed71ffa085e7bbf8784a713f475f071cd53d9be768072c3c31d6bd43d433c4fdf1d73dd57eb4d7eb92f5ab7df48b939d6a5e8efb9eb41fed8d3a1742994e25b565bf81f6c3d656b8de37e59cdcdc379b04b5ed99709568bbf97ce53b6d97729f40796c737ae85fdc3f7b405d5db58b51f798b05d34db6e97da9bcff84cdfc5a0cb27a49ad99e53a08e1516ee0a026e8cc75cee67b26edb33b20a434736cd705b7f62d1b1a785bb270137e37eddd3d0914db3a3edd77d2ddc7d09b819f7ebbe868e6c9a1d6dbfee67e1ee47c0cdb85ff7337464d3ec68fb757f0b777f026ec6fdbabfa1239b6647dbaf0758b807107033eed7030c1dd9343bda7e3dd0c23d90809b71bf1e68e8c8a6d9d1f6eb4116ee4104dc8cfbf5a0e0701dd9343bda7e5d69e1ae24e066dcaf2b0d1dd9343bda7e5d65e1ae22e066dcafab0c1dd9343bda7e3dccc23d8c809b71bf1e66e8c8a6d9d1f6ebe116eee104dc8cfb755dfbedb3eed7d516ee6a026ec6fdbadad0914db3a3edd7632cdc6308b819f7eb31868e6c9a1d6dbf1e6be11e4bc0cdb85f8f357464d3ccb65f3b7a2faf2cdbf7040f39d5273d5ef3a12c783e061e1731e5280e4a1df57349f54ddd6f6875c8d00ac7c13800fa39e80b93f1fd7ef1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f19bf7188cf57a4dc27248c62c367522eeef3abba5fa9d725eb6f16a66ea7d6fa3d10bbdfb2d202c35f1238c45f219469725e6dd99e9aad283872bbe1b8d6b82df7c55e87f4b634e35fe6c55f11d4673ff038783f3fc573c0e03960d102df3b8dc777d910371a9795aaefefb40c6ab7f33ea33ea8e947b1fb3f5cd30243d38f1cfb4e04876f4f61c0290979e471f16cd8513d536dc15ea34ea6c6c550e662a8e75e07f52c00bfb26e99df0b3c32e13379573118183c81451f999a90f15491f1f423e3b9908ce766329ed3c9787a93f13c4ec6d3958ca72519cf48329e87c878ee22e3398f8ce73a329e5c9c8367c3f31c194f07329e93c878c693f11492f10c23e33948c6d39f8ce707643cb792f15c4ec67326194f1f329e27c9783a93f15c41c69320e3194dc633988ce71e329e52329eb6643c3790f19c42c65341c6d39e8c6702194f73329ee1643c9792f10c20e3b9848ce776329eb3c978ae26e3799a8ca79c8ca7988ca71519cf18329e21643cf792f15c40c6731319cf69643cbdc8782692f17423e36941c6f30819cf40329e3bc978ce25e3b9968ce732329e67c978cac8784e24e31947c6d3948c672819cffd643cedc8782e22e3b9858ce70c329e2419cf13643c5dc8788e27e31945c633888ce76e329e12329eebc9789e27e3e941c67332194f0d194f33329e87c9781e20e3b9988ce736329eb3c878ae22e3798a8ca71319cf09643c45643cd5643c95643c7dc978ce27e3b9918ce754329e9e643c8f91f17427e3398e8c670419cf83643c7790f19c43c6730d19cf95643cadc978da90f13c43c6d3918ca7808027111cf92da604fcff00d8e49b411f83ad89657df21c56caabe3e2d4b647aebb8965dd1f591850a70fa12e499d2ffd7e534a27f4958479f157041c1f91f07424e379868ca70d194f6b329e2bc978ae21e339878ce70e329e07c9784690f11c47c6d39d8ce731329e9e643ca792f1dc48c6733e194f5f329e4a329e6a329e22329e13c8783a91f13c45c6731519cf59643cb791f15c4cc6f30019cfc3643ccdc8786ac8784e26e3e941c6f33c19cff5643c25643c7793f10c22e31945c6733c194f17329e27c87892643c6790f1dc42c67311194f3b329efbc9788692f13425e31947c67322194f1919cfb3643c9791f15c4bc6732e19cf9d643c03c9781e21e36941c6d38d8c6722194f2f329ed3c8786e22e3b9808ce75e329e21643c63c8785a91f11493f19493f13c4dc6733519cfd9643cb793f15c42c633808ce752329ee1643ccdc9782690f1b427e3a920e339858ce706329eb6643ca5643cf790f10c26e3194dc69320e3b9828ca73319cf93643c7dc878ce24e3b99c8ce756329e1f90f1f427e33948c6338c8ca7908c673c19cf49643c1dc8789e23e3d94fc6731d19cf79643c7791f13c44c633928ca725194f57329ec7c9787a93f19c4ec6733319cf85643cfdc878aac8789a90f18c3578f0ffeadd30393f926f0715c2ff07eacee5adf5baa48cbca3a4ee75ed316caabebb1dd5774f503b25617e37d457d8f700cf1e473c1f1a3ca6ef22c8578066bb0c9b62dce9887197c128f33b8151f4db053cbb1cf1ec36784cdf4590ef099aed306c8a71bb23c61d06a3cc6f0746d16f07f0ec70c4b3d3e0317d1741be2f68b6cdb029c6ad8e18b7198c32bf151845bf6dc0b3cd11cf7683c7f45d04f97ea0d907864d316e71c4f881c128f35b8051f4fb00783e70c4b3d5e0317d1741be3f68b6d9b029c64d8e18371b8c32bf091845bfcdc0b3d911cf1683c7f45d04f901a0d946c3a618373862dc6830cafc066014fd3602cf46473c9b0c1ed37711e4078266eb0d9b625ce78871bdc128f3eb8051f45b0f3ceb1df16c30784cdf45901f049aad356c8a718d23c6b506a3ccaf0146d16f2df0ac75c4b3cee0317d1741be12345b6dd814e32a478cab0d46995f058ca2df6ae059ed88678dc163fa2e827c1568b6d2b029c6158e18571a8c32bf021845bf95c0b3d211cf2a83c7f45d04f961a0d972c3a6189739625c6e30cafc326014fd9603cf72473c2b0c1ed37711e48783664b0d9b625ce28871a9c128f34b8051f45b0a3c4b1df12c33784cdf4590af06cd161b36c5b8c811e3628351e61701a3e8b71878163be25962f098be8b203f06345b68d814e302478c0b0d46995f008ca2df42e059e8886791c163fa2e82fc58d06cbe61538cf31c31ce3718657e1e308a7ef38167be239e05068fe9bb08f277834d78bb83ed7d9def06b6f774be2bd8ded5f92e607b47e73b83ed6d9def04b6b774be1c6c6fea7c47b0bda1f365607b5de73b80ed359def05b65775be37d8e6ea7c126c7374be0fd866ebfc55609ba5f357836da6ce5f03b6193a7f2dd8a6ebfc75609ba6f3d7836daacedf00b6293a7f23d826ebfc4d609ba4f33783ed159dbf056c2febfcad607b49e76f03db8b3a7f3bd85ed0f93bc0f6a8cedf09b6fb74fe2eb01dd2f97bc0f6a9cedf0bb6cf74fe7eb0fd50e71f00dbe73aff20d87ea4f30f81edc73a3f186c3fd1f92160fba9ce0f05dbcf74fe61b0fd5ce74780ed173aff08d87ea9f323c1f62b9d1f05b65febfc68b0fd46e7c781edb73a3f1e6cbfd3f91ab0fd5ee72780ed0f3aff18d8fea8f313c1f6279d7f1c6c7fd6f927c0f6179d7f126c5fe8fc5360fb52e79f06db573aff0cd8bed6f967c1f68dce3f07b6bfeafcf360fb9bcee358b77fd7f99220de76f6dba0762a01dfe24f95f987ce3737cac8b28550e644ddc1513de350efe2493b2cedb2b2493bfc3ed8a41d7e0f6cd20ebf0b366987df019bb4c36f834ddae1b7c026edf09b609376f80db0493bfc3ad8a41d7e0d6cd20ebf0ab6a4cecf059bb4c373c026edf06cb0493b3c0b6cd20ecf049bb4c333c026edf074b0493b3c0d6cd20e4f059bb4c353c026edf064b0493b3c096cd20ebf023669875f069bb4c32f814ddae117c126edf00b609376f851b0493b7c1fd8647ff9166cd2361f029bb4cd9f824ddae6cfc0266df30fc1266df3e76093b6f9476093b6f9c76093b6f9276093b6f9a76093b6f9676093b6f9e76093b6f9176093b6f9976093b6f957601badf3bf069bb4cdbf019bb4cdbf059bb4cdbf039bb4cdbf079bb4cd7f009bb4cd7f049bb4cd7f029bb4cd7f069bb4cd7f019bb4cd5f804ddae62fc1266df3576093b6f96bb049dbfc0dd89ed77969ab5b804d9e15aba9f47b4e380e0f9ef30b533288b7edc72909f9e7a0ee323521e379958ca78a8ca71f19cf85643ca793f1dc47c6d3928c673a19cf5b643c7f25e3594dc6b38a8c671b19cf56329ef3c878f693f19c44c65348c633878c671819cffb643c07c978fa93f1fc808ce772329e33c9780e91f15c41c69320e379838c672a19cf4a329e15643c1f90f16c21e32925e3694bc6730a194f05194f7b329ee6643cb3c8788693f1bc4bc6732919cf00329e4bc878ce26e32926e36945c633998c670c19cf6b643ccbc9789691f16c26e3d944c6730119cf5e329e0fc9784e23e36941c633838ce76d329e81643ce792f1cc27e3b98c8ce744329ea6643c73c9789692f12c21e39947c6b3918c6703194f3b329e8bc878f690f1ec26e339838ce778329e69643c6f92f10c22e32921e3e941c67332194f33329ed9643c8bc9781691f1bc47c6b39e8c671d19cfb7643cbbc8787692f19c45c67302194f1119cf14329e6a329ed7c9782ac978fa92f19c4fc6732a194f4f329ee3c8786692f12c24e35940c6f30e19cf5a329e35643c3bc878b693f19c43c67325194f6b329e36643c93c8780a087812c011804dfedf146cdfe8fc41b0c9f77af683ed6b9d9f0fb6af74fe79b03d63b135b1f009c3376093779b9f059bdcfffc1a6cf24ec0576093f32af1afe6e7b63d92bf092c237e9a5af8d1df57162ec9e3f696659241bcdb1b7d258323bfa754041ccf92f04c22e36943c6d39a8ce74a329e73c878b693f1ec20e35943c6b3968ce71d329e05643c0bc9786692f11c47c6d3938ce754329ef3c978fa92f15492f1bc4ec6534dc633858ca7888ce704329eb3c8787692f1ec22e3f9968c671d19cf7a329ef7c8781691f12c26e3994dc6d38c8ce764329e1e643c25643c83c878de24e39946c6733c19cf19643cbbc978f690f15c44c6d38e8c670319cf46329e79643c4bc8789692f1cc25e3694ac6732219cf65643cf3c978ce25e31948c6f33619cf0c329e16643ca791f17c48c6b3978ce702329e4d643c9bc9789691f12c27e3798d8c670c19cf64329e56643cc5643c6793f15c42c633808ce752329e77c9788693f1cc22e3694ec6d39e8ca7828ce714329eb6643ca5643c5bc8783e20e35941c6b3928c672a19cf1b643c09329e2bc8780e91f19c49c6733919cf0fc878fa93f11c24e3799f8c671819cf1c329e42329e93c878f693f19c47c6b3958c671b19cf2a329ed5643c7f25e3798b8c673a194f4b329efbc8784e27e3b9908ca71f194f1519cfab643c4dc878c65a78e63be291be2bb26e999fdfc87def367cefce13df3b0ddf3bf3c4f776c3f7f63cf1bdd5f0bd354f7c6f317c6fc913df9b0cdf9bf2c4f706c3f7863cf1bdcef0bd2e4f7caf317cafc913dfab0cdfabf2c4f70ac3f78a3cf1bdccf0bd2c4f7c2f317c2fc913df8b0cdf8bf2c4f702c3f7823cf1cd7cfdadfa29cbb720f6eadf04fc1fc78fdbef8871bec128f3fb81516c38fe7b0f473c51d7ee3d087c2b2da4efa2bc439f80ff5700a3ab98ea6130cabc2da670bcd10a473c51f71c2a087c2b2de45b8ef24dac04fc1fc74f7115531506a3ccdb620ac7ffeae98827ea5e494f02df4a0bf996a37c033801ffc7f1895cc5544f8351e66d3185e34df475c413758fa72f816fa5853c8b9167e609f87f3f607415537d0d4699b7c5d456e0e9e78827eade543f02df4a0be97b267d9613f0fffec0e82aa6fa198c326f8ba92dc0d3df114fd43db5fe04be9516f26e94bcc39a80ff0f00465731d5df6094795b4c6d029e018e78a2ee050e20f0adb418a8f3f28d9c04fc7f2030ba8aa90106a3ccdb626a03f00c74c413750f7320816fa5c5209d976f7026e0ff8380d1554c0d341865de1653eb806790239ea87baf83087c2b2d2a755ec64048c0ff2b81d1554c0d321865de1653385e5ba5239ea87bc69504be9516d23746fa0c26e0ff55c038c81163a5c128f38380516cab80a7ca114fd4bdee2a02df4a0be9ebbe52ff26e0ffc380d1554c55198c326f8ba915c033cc114fd43dfa6104be9516c3755ebee19180ff0f0746573135cc6094795b4c2d039ee18e78a29e2d0c27f0adb490b10fe49b7c09f83f8e97ed2aa6861b8c326f8ba925c053ed886791c1b3c8a2c5b1f2adb4906fbf2cd6bf09f8ff1860741553d506a3ccdb626a11f08c71c413f52c670c816fa585f4ed5ca87f13f0ffb1c0e82aa6c6188c326f8b291c7f79ac239ea867506373e03bea794a2e7c473d1bc885efa8fbdcb9f01d75cf3617bea3ee3fe6c277d4bdb45cf88eba2f940bdf51f73872e13bea7a3d17bea3ae3d73e13bea3a2a17bea3ae0972e13beafc3617bea3ced572e13beabcc3b7e7be3d8fdbf7b13c77c8d7f6fc581e438fe5b1c45f1bf86b835cf9f6c7127f6d902bdff97a6de0dbf3dcb7e772fd5510445f8f2d73e47b89e15be6f139cb1247be1719be651e9f192c72e47b81e15be6f1fef70247be8b0cdf32bf2007be5b19be5be5d0771bc3771b8b6f17db3b111c7efd2d0c3825218f31b0d0018fa37a96aaf52ed6ebfa2ec6f5daeedb98fb4b3194590cfab96e3b64dd99da8e16f1f92e4d800f19334ed9e459ecfb609336f43db0c933f677c126edfc3b6093e73b6f834d9effbc05b6e13a7f086cf21c16fbbfcbb3f4ed60abd479ec773d48e7b7824dfa25617f5fe95bb6056cd23f10fb994a1fcf4d60937ebad8bf51fa5a6f009bf497c77e75f2cec33ab0c97b2bd89f6bbfceaf019b7ca312fb117dadf3abc0f68dceaf04db733abf026c4febfc7d60fb52e7bf05db533abf006c5fe8fc42b03da9f38bc1f6179d7f136c7fd6f937c0f684cebf0eb6c7751edf0bfb93ce7f08b6893a8fef23fd51e77783ed319dc7f760fea0f33bc1f67b9d7f0d6c1374fe55b0d5e8fc5cb0fd4ee7e7806dbccecf06db6f757e16d8c6e9fc4cb0fd46e76780edd73a3f1d6ca3757e1ad87ea5f353c1364ae7a7806da4ce4f06db2f757e12d81ed1f9bf82ed173abf086c4d747e09d8647c41ecf321dfcc5c063619371bfbf2c8580263c1769cce8f015b0b9daf069b7c676d38d864acde61604be87c15d84ed0f94ab0c9b9ce20b0c9582b03c126e72503c0d65ae7fb834dce21fa814dc63eec0b36f99e674fb0c998de156093eff8f700dba93a3f1f6c32bed97eb0c937d70e824dc611fe1a6cf2ade56fc07696ce3f073619f3e569b09da3f35f82ed5c9d7f0a6cf27dce2fc056a2f34f82adadceff056ce7ebfc9fc126e3833d0136f9a6dbe360937178ff0436f976f244b05dacf37f04db253aff18d8641c953f804dc692fc3dd8dae9fc04b0c937a46bc07685ceff0e6c32b6c578b05da9f3bf059b8c61300e6c1d74fe37602bd3f95f83ada3ce8f065bb9ceff0a6c9d747e14d83aebfc48b075d1f95f82adabce3f02b66e3a2fed8cda9fd57e7e40cf278378cfb33f0e0e9f329d670b03f2c479de5a0c3ce86b5fec752f4b9d234b5bd044af5762681ff8de1bbbeff4f9f9477a5d857abd7b0ddf8550a6b56e1cd47272cc6faa97db6f2c87f78464ddb2cc9560ffd058776b5ddf8f1cd577afc124dca88394395933a963e3769d77f43e7c99da0724d602d010a724e485c18d5665a5782e5c179e8f80675fec3ce96b5f173181fb56dcd7bee63d5133d68aa1cc5ed0ef4307fae1be2eeb9679f1e7993db367f6cc9ed9337b66cfec993db367f6cc9ed9337b66cfec993db367f6cc9e999f59f11cd0797cd62ce50e90308a6d1ff0b8b8cf8fcf6165fdeab9ceb2f36afdee8bddefe1cff79ae9f5961a752e84327f87674eab741ec7f194ed16b52d1d3c27ccb82dc55f11d4079f051d70c4b3cfe0d967d142f225b1f92e1be246e3b252d56f453d63df6fe87ac0a2a9abfd759f5e5781a129eeaf1f1b3cf86cb408783fd1bf0958cf27500707fb78c6b8107fb82fed039be43f064617db198f25d21ec8f3707c362d65f61bcfc5e3dff665a52edb8d3d50a76470647c17429943d0f67da6f3d837e400e8f63bcbff65caf49c5af45375de157f9d53db77277026c10ffade01ac31f93eec7d94029dc48fd80b21ff5be8cf21e5440fd15ad8d53e227d3a91dd5cee6363b96228b3db52ff64106ffd77193cbb0c66b54d7e0471f63b38febb6a937647687425682465f68146fb1df1ec33788443fca932b2fd9b1b6564d94228f325b451aa2ed2ce4b3db16f0b1e035c1dc7c497ac5be66de7c61f01a35947151fdd4eade5dd173b6fc3eafff56fd05ec4ddffebdf20860a802330d65f0aeb17aee641f4b145cafc4fe338eae21a03b7a5a927ea2c65fe17b443ed4bd2f96ccef58fd5755bd4b9fe6e073c89e0f06b6f35653abee331668f031e47f52cb51dbb3e34ea540c652e867a3a388fc9f85eed2ef0ed629ba316720eb5d7d0a210cab42c49ff4adb11a5235eab7e9493ba9459cf074b2d759132ad4a6aebd202ec7132b9dc6e3ba04e6abdfb2c7595322797d4ea72aace27603be17d938b2cff9729537b80e3da6c8bbfcea9edbb153893e0077d7f00ac31f93eecbb1a72be2f7ec45e08f90b4b6acb4a39d143b41676b58fc83b7fc86e2eb7d758ae18ca6cb7d43f19c45bff6d06cf3683596d93334a6af312472edbcded111a9582465206ef1fcbb11ddfbbb31df7f739e28e3aeeef0346b3ddc47317976cfb0d36f31eaaed7c50cae0399994e95892fe55ed6cc252d6bc37ece23e26be5b1a403d02a3ae32610c38b8362cc76b2769a7c44f7bb0efd379d1b9bda15d2194e95992fe7578de6dbd77695edfe13585709bfb16befb7155492db78a7bd94efbf46f11d83ed5bf2d0227d769e5b67b86c261bb677843492d3b2e2b5c872c7531af919b0447de53ffce288bf7dd322d87bed474d05846e9fba985699fe1a7052c1bdbbb1a1d4a4ba3f80f02dfc706b34d57d90f30e6f6e9bcb9afe0b5b194b9af24fd2b6d9259566dfb2f4eaed547b6a36887ed09c6e4c7c098d4f9d2ef37a5f6b98346fd655efc2946b9df731078e26fbbd2ef2b65731f783ff0b868db1db5d1a5788c6d11db7abb55da8eff1f1b5ae5f079adf5986f3e736f61e4e3f15d5665bbff64d362af85c7d57394282df65a7cc7a745e721b676cea6452efb3e4469f1a1c5778c5a0cc3fb9e99b4d863e171712f2a93167b2cbee3d3a24b69a6e71aa8c56e0b8fab7b0f515a88bf6c993f24606e61e4e3f15d5e69bb4f66d3629785c7d575739416bb2cbee3d3a24367bc4797498b9d169ef8efcf65d662a7c5777c5a74ed86f7f03269b1c3c2e3ea996e94163b2cbe638c8ba1b67b39362db65b78b6e7588bed16df319e1f76b6dd6bb369b1cdc2e3e0be6b462db6597cc7a8c560bcef9a498bad169ead39d662abc5777c5a5476b2dd13b669f18185c7d53de1282d3eb0f88e4f8bc15d95ef2d75d0628b85674b8eb5d862f11de335542a2e36d7418bcd169ecd39d662b3c5777c5a54a5ceb536d5418b4d169e4d39d66293c5777c5a94a68ea91beba0c5460bcfc61c6bb1d1e23bc6b8485d4f6ea883161b2c3c1b72acc5068bef188f23a9b8585f072dd65b78d6e7588bf516dff169312c75ff695d1db45867e15997632dd6597cc778cf2515176beba0c55a0bcfda1c6bb1d6e23b3e2d3aa68ea96beaa0c51a0bcf9a1c6bb1c6e23b3e2d86a69e89adae8316ab2d3cab73acc56a8bef18cf3b53edc5aa3a68b1cac2b32ac75aacb2f88ef1bc3375ff62651db45869e15999632d565a7cc7d876a6ce3b57d4418b15169e1539d66285c5778ce79d292d96d7418be5169ee539d662b9c5778ce79da9e3c8b23a68b1ccc2e36a3c91282d96597cc71817a9b673691db4586ae1599a632d965a7cc7785f2bd5762ea983164b2c3caec66b88d26289c5778cd723a97b7c8beba0c5620bcfe21c6bb1d8e23bc66745a973f04575d062918567518eb55804bef7c7ee3bdd9f5b7c485fac2b0c2d0aa14cf3b6e95fe98b15a5a3ac03fb95615d16c65e9774bfb2051175590875913227405d5a044ec6fb297754d754cccc873aa9f57e62a9ab9469d3b6569793743e01dbe410e876bee5ff321518f349c88b7eaaceefc75fe754acbe079c49f083bedf05d6987c7740df053a891fb11742be6ddbdab2524ef410ad855ded23f3741ed9cde51619cb1543997996fa278378ebffbec1f3bec19c7aef01e24ce2c84ddb95669a17a1d115a09194c13e7b9f38e231fb100a87f8536564fb3737cac8b28550e63268a3b05fa9d433111cd96fd2515bd601d965dd322ffe8ac1b61f18cd3aaaf838047d3f65ac08194742d9645c888eb09e2e864dd5b5aba3ba8a2f59b7cc77054619a7a24bee19cbeacad8d960543cdd1d6886636fc894e978d11d78ba39e07154cfd471a88751a7ae469d8aa10cbedbd8c3413d0bc0afac5be67b806f17db1cb59063f2a586168550e606e3fc314a4759878adf2e96baf4725c1759b7b44bbd72e0bbc2f0ddc9f09d080edfce419079ffaa00e69e0e98d57a7bc7bfde523c6f9398123f9da04e7d4083b8ea84eb92f3bc3e86b685907f10cef3a49c9495e397b0ab58966d89ece672dd8de58aa14c2f4bfd9341bcf5ef6df0f43698d536b90bceed1cec0fa918e86570c87c27d0ae778476bd403b2983c7bf2e8eb4eb69f0f4347c2b1e39c7e90136395710fe04fcbf630eb8cd76af87855b6c384e9ced5ca773fc8c19cf753a03a3d87a024f8523cdcc6d7da9a10f1e979b1b6564d94228330e8e8d094b59b5df5d5c505bafa6da1edbbb63ba4d6fee402f1ca731007d0243c300f4927a3673c0737c503b56e3f89aea71831f1e7ad7d0f4a347412b3430f1b7c0528d2660c37c538b2d080e1f92b2106c32246533b0353164c1a130a5bc0c69e7422ed443d65d6870b60096387de3709e32650a9de380c74528abd091213d75e8dc376e44cd508c8f6606677d6247fdaf69867251eb72b51dcc7d2209f3660c163af2df14ea9b8479f1a7b68d0cad3a66f09047fb8c7b78c2a8a1a36bc6a350e68e8df982e0f00d60fe4609ee6aa7c300c00a63e3d0cca8173618f23fd930c7c7cf598e63e69ada04e04fa6e341b7960e7453eb97b16f870c1e39f28e099523470cb96ec2e8213523aa47e3d66c612817b5a5e5ffcdc1666be2b1ac9ab0d9c2658fb3d86c138e32dc026c72e46a0936e1391e6c4d212fe5cd2de3245c2f84f5cb2ea5fea7c469a62b7e5c501b02723856edaada7fd5a99cfa84ac3a1552431babcda9862e56770cd5d0c4ea2b766ae86135d4b01a5af8cc203d74b01a2af89c203d14b0fada4549901edaf7fca076e85e351d02ce8b82f4d0bcea36cd2541fab44b0daddb2e480f9dab6e5db60fd29f7953efd6abd377755b409df2aa4b3c7539a24e41d5a9a7ba7da16e65a9533a75baac4e05d5e99bba1ce9adb5ee13a6abc2747598ae09d3b561ba2e4cd787e98630dd18a69bc27473986e09d3ad61ba2d4cb787e98e30dd19a6bbc2747798ee09d2c33bdf1ba4875f57c33fdf1fa487867e20480f1bfd60901e52faa1203ddcf4e0203d14f590203d4cf5d0203d84f5c3417a78eb11417ae8dc4783f450bb6a08ded1417a386c354cb61a3e5b0dfdab860956430aaba186d550c56a58633504b21a1af9c9203d0cb31ab2f999303d1ba487747e3e4c2f84e9c530bd14a697c3f44a901e1e5c0d1b3e25480f33ae861f9f1ea4872b9f19a4873757c39eabe1d0d530e96af87435acba1ae65d0dffae86857f2b4c6f87e99d20fd48423d8a518f28d4ed7ff5184cdda25e18a46f9d2f0ed28fb8d5237fd505427509515d645606e92e54aa4b99ea62a7ba1caa2e98aa4baaeaa2abba2cab2edcaa4bbbeae2af5e7950af80a85762d42b42ea9529f50a997aa54ebd62a85e1355af5daad788d56bd5fb82f46df10341fa51a9ba1dae1e0da87854b7ef3f0bd30fc3f479987e14a61f87e92761fa69987e16a69f07e9218cd570c76ab86435b4b21a72590dcfac8672564341ab21a2ff18a4879e564357ff25480f7ffd6598be0ad243707f13a4875fff5b98be0dd3dfc3f48f30fd334cff0a6a87d2c6c6e24cddc2e8ab9460704dcdd051636a4a6aaa4b464d18593362ccc8274a268ea8195e52fdd8d071c346564fc4853fd70bcb38e07dc68d1bfc44c988d155431f2fa99e5053523daca4b27ac2e8aac30ed4ffd40b9d7da4c7c15555d1cefefdfb90fe9f7a3a6da9db3e1961fdc6cc753ba1693d0439b13e0b756e5abf0a3da98f5272397b77fa5cb764fcc8ea9a92d292d1e1dff0e05a3d716855fb12fcdff850e4f13525e36b068fab291936ae7a544987f6b8de49c7d7a312050937306dceac9f38adf4b794ea1562fbceab87025f9c573fd2fff67d48ff473d9db628a9470d8bebb3505949fd082b4a2265193fa1b266dce02135d10bf7f93e0b5f5f9f6ade5bcf6a366b5b0f6789fa2c7469dbfa115e5f1f6763b37016fc7f9f92ba051c4f06009b2d6c6f00000027cb1f8b08000000000000ffed9d77701cc795c6679118565810cc99902c538ce06291c104e64c9992ac1c98409116495024942ccb922cc939e76c39cb39675bce392739e7ecf2d5dd3f57bebaab525df76c3fe34373668d5dcd03df60df543d6ccfdbde79bffee64dcf6cf7ec20131497bf1acbb872adb1c705672ff47ebf7bcd3fb6a52dc16de539393329e1ac4909676d4a38eb52c2599f12ce8694704e4809e7c494704e4a9033037c5cbc9353c69b4d19ef79413af2b631259cb9947036a584734a4a389b53c23935259cd352c2393d259c3352c23933259cb352c2393b259c7352c23937259cf352c2393f259c0b52c2b930259c8b52c2d99212cef353c27941829ccb8193c6c82f74af8f77af8bddeb45ee75897b5dea5e97b936d6b975bbcd15c6561a6bf5de5b65998dd9c1f282f75ebbb10e639dc6badc7b2deebd6e633dc67a8df5195b6d6c8db1b5c6d6195bef34d9606ca3b14dc6361bdb626cabb16dc6b61bdb616ca7b15dc6761bdb636cafb18b8d3dc1d83e639718bbd4d865c69e68ec728fe50a63571abbcad8d5c6ae3176adb1eb8c5d6fec0663fb8d1d3076d0d82163878d0d183b62ec4663478d1d33f6246337193b6eec84b193c6068d9d3276b3b1d3c6ce181b32768bb15b3dcd6e3376bbb13b8c3dd9e3bcd3d8538cdd65eca9c6ee36768fb17b8d3dcdd87dc6ee37f680b1a71b7b86b1671a7b96b1671b7b8eb1e71a7b9eb1e71b7b81b1171a7b91b1171b7b89b1971a7b99b1971b7b85b1571a7b95b1573b163a105e63ecb5c65e67ecf5c6de60ec41636f34f626636f36f616636f35f636636f37f690b177187ba7b177197bb7b1f7187bafb1f7197bbfb10f18fba0b10f19fbb0b18f18fba8b18f19fbb8b14f18fba4b14f19fbb4b1cf187bd8d8678d7dced8e78d7dc1d8178d7dc9d8978d7dc5d8578d7dcdd8d78d7dc3d3fc9bc6be65ecdbc6bee37cdf75afdf7375e998ffbe7bfd817bfda17bfd917bfdb157ff116ffd27defa4fddebcfdcebcfddeb2fdceb2fddebafdcebafddeb6fdceb6fddebefdcebefddeb1fdceb1fddeb9fdceb9fddeb5fdcab9d576b9f512c4f0c8697fe20a13ea963a0d78eab93d8febc9d9d13aa75efd16b8bf3d7b9757acd387fbd5baff7fc0d6ebdc1dbce44b73ed1f3e7dc7acef34f71eb533cff54b73ed5f34f77ebd33dfff96efd7cf067dd7bc586155facafd6b932e0a3fcac015fbdf3d582af813607be09ce570f3edabf0de09be47c13c037d9f926822feb7c93484b63e7395f7f9054aee40fd8ed3626bd5d3717914b9ef7a0dd6e1313ef94e4790fd9ed3633f0dafc98eab6d5087933cdf972e09bee7c4de0735dd0bf8e39eb9be97ccde09be57c53c137dbf9a6816f8ef34d07df5ce79b01be79ce37137cf39d6f16f81638df6cf02d74be39e05be47c73c1d7e27cf3c077bef3cd07df05ceb7007cd45f2e04df85ceb7087c746dd7023ebace3b1f7c74cd7781f3d97e626206e2393ff551613cea9fc1f778ea9bc1b798fa65f05d447d32f896406cf22d857e857ccb9c8ffa28fb5e9f2bf707491d1385f0185e9df476cd96ed76d726bfdd700e6c5d30ac753fc4590d5aad77e504ef0f69c3d8741d4371c85f07e51d5097ea911e749e2176dbefaf71e5f5253ed7e77d2e0775d644b4bf3f48b6fd6b3d9eb51e733db49f29678f68ce8e7a293b67af80ba7eeed135cf78ccd9ddc0917cceb6b76bce8e7a293b6707a0ae9f7b74dd3b1e73f66ae060c8d96e9e9c2de435678be36041109d7bf4dd673ce6ec51e0483e673b356747bf949db3f7425d3ff7e8fbef78ccd95b8123f99cedeed66b83512f65e7ec0ba0ae9f7b3416331e73f67ee060c8d983dacf8e7a293b675f0775fddca371c1f198b32f068ee473b6972967db356783e29c661044e71e8d518fc79c7d103892cfd9433a3e3bfaa5ec9cfd04d4f5738fe64bc663cebed795ed3cc377dd3cc37cf07dcff916006ff2b97db88d29b7db34b78bf77a0441748ed2dcdd78cced875dd9e6f10fe0de03f2fd90ee4b00df8f9cef02f0fdd8bb6783e918e8d26360f46d2af718f805d4f57399e691c7e331f03de060c8d96ecdd9d1b7a9dc9cfd1bd4f5738fee69188f39fb6be060c8d91ecdd9d1b7a9dc9cfd27d4f5736f892b8fc79cfd872bdbeb859fb9eb8565e0fbb9f32d07df2f9c6f05f87ee97c2bc1f72be76b05dfaf9d6f15f87ee37c79f0fdd6f9dac0f73be72b80eff7ced70ebe3f385f07f8fee87c9de0fb93f37581efcfced70dbebf385f0ff8feea7cbdce67efc9a37bafbee27c76df9246fd41b2fb96eeb1a46dd3fa8a3188dde4c56e1ac3d8cd5eece688d82b19626721062d196fbd1fca2b7979f239e0c158ab928fd56edbde1a8cbeedab8027cfd0f62cc4180d4f1e78da92e709cf9f85e4b71beee3564fd32cc46a8576b533b42b03b168dbb44ef172e0c3febb3d82b12379c6420662d1b669bd0318c987e7133aafd3f163cf878b33c3bc0cc752784d44f1e8f94fc4b10afc54e791e9c36ccb1c5b23bc8fe7d636cfc79497615e502cda36ad53bc46684fdbd8331646cb98f718b9fa880cc4a26dfbb1f1785f39f69a8d6abfe6c0770efaa442a57d5223b08dc5754adcbe96129be37c958118d4b791e605f0539d99ee0709b66fdb06fd2ec3f15728f7fa0dfb83e4f3b890c7e37a343cedc0c371ec331daf793cef3f1a249b6b9d9e566d9e5639a8d301fa7532e857ea3a84e229b3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb3322bb37c66bcff02e737a9de0a218ce42b000fc7387ff80c28b72ddabe9dd7f929cceb243f6f51c8e39c25dd63b8d46b731dd4f97b66b8ee2f613edd9f1bc439cd15bcda8dea3e8bc6e0ecb958ce39c4b879e0a8f9cb96c462170e71cdb7d97bd4ec73c85a3d5d574468ca709fca084d339ea6789fe2728fc7e6e99cda61368eb9bf72e722512b2a2739b787f718f0ee9762ff41b950138cec3ff03cd39578ec917398345fdee5c5ae833aff9319de37742f2afdaf3bff9e275ba7dbdb367d6629f8bbbd6d4f719f258e7a6ffbadf059aaf37fd0a7bebe26f897661cf77f60bf1c405b71e98732ce9b277f1e2ecee3b797c1d3093c1cfd0cd3f5461e8f81a4e7f1bb3dada2ae63a84e17e8d7cda05fd4b528ad533c6556666556666556666556666556666556666556666556666556666556666596cf8cbf1525d62cd42b08611ca37b1fc2f90c7afe0b6ddfceeb3cb766382ef73c1ccd392df3da5c0775be5d335cf785aedc189c7dbf43dcbe6498cf2bb92f295e23b407e782b87ecfdde1f174446841e596c46217e7f193d778781ebfddd3b510a129d7f18a73aca8291eaf6d1e0fce8d360667df5b9285ed8cc5bd43717941f1f058ea001f95f1f7d11cfb19cf25fe7d3d140fe7af1f72da4e09b8f67d21cfd96ff4409bfa83b3f3bb0eeabc07fabef7b932dec381f78e3c1cf13e2da5e6a9493f9667d9e58bf3beab81b31fe260ec35c09a50ec368c9d714671c85f07e5cfd40cd7a57aa407694decf618a1678221bbffb936ef7339a8d31bd1fefe20d9f6f7793c7d1eb3dd271f843c7b18ceff5c7d526f8c464b4123aa83d7415ce74efffe4affbe42ec471bbc3af4d93aa8f315e8a3e2ee1f8d3a07709fc768db51e731ffbc309afb3cabfd3ead47a0bf48fa3ead472087f03eadc0dbfe32d83e713504f1e716aaf3736ffbfe35397d06ef03a33abf82fea2c9ddb3d8189c7dfd8df74c8dc5f7abb8fba4291e5ed7d07ba369bb65ee81fafd0932634e200b5e27509dbf78fbac3b867b55c467ff1ef359d28a9e4385df5f7cfdac0ebdf099fe4474281ef37d5e5b28af7ba12d54e7bfbc6bc0e4af5b8ad780c9b775e43509f5031d116da53aff0dc7da3fe11a8ff6137eef68a83dfb7d5a4a5d03927eb6cd63fd7c608c2de1f9c0f5b5c375fde7fc92d6e53e1fb8cbfb9cc4e703ff2fe45903dc87ced557af89d16819684475f0b741741ec167f9468d759cabefd3782d85fd731368caf5bb03fffce78fab455d232cf334c66b84e98e798ad3d9afeb8f17d2f932c9fb86f1b712ad10177f2bd1caa4671e74eb8775bc2e3897b1f34cb1e39e399d1f83d871cf9c1e8bd8cd5eece6318cad9aabe6923467782672f8fb337c66a95d4a5d9712430e3e579302c6da1430d6a580b13e058c0d29609c9002c68929609c9402c6c92960cc02e3b93cb733e853a8541faefd55ea5a036333fcef9242b9ffbf83f97fa994bcf6c1d80cdfe9422d5606a3d702bfe7713cfba1dcfff5420cf8bf0ba6a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a185b52c0787e0a182f4801e3e352c078610a181f9f02c6c5ca9808e3725ec642a58c9687e37ffe3d96ff39c6c0938fbae794e9fed9b2ffdf1af3f349db2a7d6e1cde5bc2fb3fe11edbb3ed38ee1d29f7d976a5fedf2a1363a15246ae7b81f0bea3d1f044dd1fd4c6cb58a89491ebf72ff81bbdd1f07481669d119a3130162a65e4ba57aedc7b39f19efeae08cd18180b9532e27dd509f2849a7597c1d3039a754768c6c058a89491ebbee42cc4180d4f2f68d613a1190363a15246a6dfb6859af596c183bf01eb8dd08c81b15029a3e559cda4595f193cab41b3be08cd2431224fd2cfc9ee8b88c5f19bc172db4e0cc83829058c9353c088f74970f45fa5ee93e8e3d5a750a93e5cfbabd47d12189be1f731a116f87b887fa7c55a5e9e92f74960ec754c5ae0ef55fe9d16eb8087e3f7335988311a1e62c8c1e7a6a680715a0a18a7a78071460a1867a68071560a1867a780714e0a18e7a680715e0a18e7a78071410a1817a68071510a18f1bb2ac3b562c9ef2febc679ecb8ef2ae33d76dcf792f11e5bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73c97143b0d63fcca38fe1891a725399e3cb61d63f50b687b7f044f86a9ed186b8380b61343da18d7a78071750a1855c7e23d8895305a9e8d4c3c1bcae0d9083c9b98783696c1b309783627cf13e6d4a632788821079f5b9d02c6f52960541d5547498caa63f5e8a88ccaa88cca782e18d3d0872b632af2b15029a3e5d9923c4fa8d9e63278b68066f4b9365ec642a58c96676bf23ca1665bcae0d90a9a6d89d08c81b15029a3e5d9963c4fa8d9d63278b681665b233463602c54ca6879b627cf136ab6ad0c9eeda0d9b608cd18180b95325a9e1dc9f3849a6d2f83670768b63d423306c642a58c966767f23ca1663bcae0d9099aed88d08c81b15029a3e5d9953c4fa8d9ce32787681663b233463602c54ca68797627cf136ab6ab0c9edda0d9ae08cd18180b95325a9e3dc9f3849aed2e83670f68b63b4233a98cab53c0b83e058ccc3a162a65b43c7b9978f694c1b317782e66e2d95b06cfc5c0f384e479c29cbab80c1e62c8c1e756a780717d0a185547d55112a3ea583d3a2aa3322a63798cfd2960d47dad8cca38be1919bea796fc2dd2c5e33c769317bba94a62c7fd1669bcc7d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63cd73caf86d89ae79ae7d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cf25c5de977cec42b9cf98d9073c1ccfbc616a67de6ef712b7ad4713d4cf6a75a9a7d5c59e5639a87309e87729837e19884bdba6758a572ef34502989962176cff3209da4f31d67b7ad8f89731b53daeafbf6c9cc78eebebc77becb8be7ebcc7d63cd73caf86d89ae79ae7d5105bf35cf35c4a6c2cd707c3d7edf4fc53bb8d27ba729d5b4756f2539d2b27145fa7047a0c71c4d66348cf15d5105bf35cf3bc1a626b9e6b9e57436ccd73cdf36a88ad79ae795e0db135cf35cfab21b6e6b9e67935c4d63c9797e73978bf660c78028f2728c1b35018cf6c613c5385f1ac13c6334918cf52613cb5c278760ae3d9268ca74718cf66613c9dc2780ac2781609e359268c678e309e69c2783608e3992c8ca74e184f5e18cf6e613c8b85f1cc15c63316bfaf288767ba309ee5c278b2c278360ae3a917c6b34a18cf1e613cbb84f1f409e3d92e8c6789309e5e613c5dc278da85f16c11c6d32a8c679e309e19c278ce13c6d3288ca74118cf4a613c7b85f1ac11c6335f18cf4c613c39613c4dc2782608e3592b8c6787309eadc278ba85f16c12c6d3218c6785309e05c2786609e399228ca75918cf44613c19013cd9e0ec679265e1fd7de0abf13e6baf07e6cc187eff72e7af81cf5ce1cab511dbbe1c7cf4dbf02b223e8b3a5d0e6de977e5fc635b429d30563fac53bc46e0b84208cf44613ccdc278a608e399258c6781309e15c2783a84f16c12c6d32d8c67ab309e1dc278d60ae399208ca749184f4e18cf4c613cf385f1ac11c6b35718cf4a613c0dc2781a85f19c278c6786309e79c2785a85f16c11c6d32e8ca74b184faf309e25c278b60be3e913c6b34b18cf1e613cab84f1d40be3d9288c272b8c67b9309ee9c278f609e3992b8c67b1309eddc278f2c278ea84f14c16c6b34118cf34613c7384f12c13c6b348184f41184fa7309ecdc2787a84f16c13c6b353184fad309ea5c2782609e359278c67aa309ed9c278160ae3a989e061f8ff97210fddbf46dba6f57d426233ec87f0ff7e5ec9d4a6abdcb6eadd76899fe2d5419d83aee3b2f77be16789cbbfdf10c70aae028dae626a0bed8f8cb77fb863e37d950130049e3e41040fc7fda84ced1c918709feffd9bcd5ea6a4f2b7fdfe5a0ce95a0dfd50cfa45e536ad5f0d3c74de24d62cd45b2784917c9731f364a1cdb4943a06ae061e8e6392a99d61ae5ee3b5695d84ee540773f51a8676461d3bb47e0df06c706562cd42bd0d4218c97715334f16da4c4ba95cbd0678388e1da67686b97aadd7a60d11ba531dccd56b19da1975ecd0fab5c0b3d19589350bf5360a6124dfd5bc3c1d5968332da572f55ae0e1387698da19e6ea755e9b3646e84e753057af636867d4b143ebd7c17e5066658e62b63cf43b0262cd42bd4d4218c9770d2b4f473e0b6da6a5543f761df070f4f34cba87fdd8f55e9b3645e84e753057af676867d4b143ebd747c46e0992d5e2865168714304cf0d63ac05c52b97f9ca1432abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac731abceaa731cb3eaac3ac7314bd0d9f2d0734988350bf5360b6124dfb5bc3ce1ef82360723978cb7de0fe51b80e73a067d98da19de43bedf6bd3e608dda90e1e5ffb19da1975ecd0fa7ed80ffbcb60be3e85ccaa7365cc96879ed74cac59a8b7450823f9aee3e509fbb12dc1c8a5543fb61f7838fa79a67686fdd801af4d5b2274a73a787c1d606867d4b143eb144f9995398ed9f2d0ff0122d62cd4db2a84917c37b0f214c2df376e0d462ea5fab103c0b33f719e623fc6a07bd88f1df4dab4354277aa83b97a90a19d51c70ead1f84fd500ef3f52964569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d559758e63569d55e73866d5b97a74b63cf4ff5788350bf5b6096124df7e569ef670de615b3072c978ebfd503e083c0712e729ce3b30e81ece3b1cf2dab42d4277aa83c7d7218676461d3bb47e08f6c37867be3e85cc9a1b63c3acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc72c21372ccf765726d62cd4db2e84917c077879c2e71e6c0f462ea5eedb39043c0719f4616a6778dfce61af4ddb2374a73a787c1d666867d4b143eb87613f28b33247315b9e1dae4cac59a8b7430823f90ef2f284fdd88e60e452aa1f3b0c3c1cfd3c533bc37e6cc06bd38e08dda90ee6ea00433ba38e1d5a1f80fda0ccca1cc56c7976ba32b166a1de4e218ce43bc4cb13f6633b83914ba97e6c007838fa79a67686fdd811af4d3b2374a73a98ab4718da1975ecd0fa11d80fcaaccc51cc9667972b136b16eaed12c248bec3cc3c5968332da5fab123c0c3d1cf33b533ecc76ef4dab42b4277aa83b97a23433ba38e1d5abf117876bb32b166a1de6e218ce41b60e6c9429b692995ab37020fc7b1c3d4ce30578f7a6dda1da13bd5c15c3dcad0cea86387d68f02cf1e5726d62cd4db2384917c479879b2d0665a4ae5ea51e0e1387698da19e6ea31af4d7b2274a73a98abc718da1975ecd0fa31e0d9ebcac49a857a7b8530920ffbb1bd4c3c8d1e4f638416e331769317bba94a62377bb19bab24b6e6b9e67935c4d63cd73c0faa20b6e6b9e67935c4aed65c53cdab53f3cc39d43c730e35cfa8e622357f34b9d89db96078a981580ce3736da31973449e85c278f609e3992d8c67aa309e49c278960ae3a915c6d3238ca753184f4118cf22613ccb84f1cc11c6334d18cf64613c75c278f2c278160be3992b8c67ba309ee5c278b2c278ea85f1ac12c6d3278c6789309e5e613c5dc278da85f1b40ae399278c6786309ef384f1340ae36910c6b35218cf1a613cf385f1cc14c69313c6d3248c6782309eb5c278ba85f17408e359218c6781309e59c278a608e36916c63351184f46004f3638fbb71df87b825af0d1fdfd7bc1f72457de07be9a8818b49d63e0a3f153da863d5f5d38e36c861af8cc4d115c4f8a8847716e8af8ec58e88eb1fa619de23502c74d4278260ae36916c6334518cf2c613c0b84f1ac10c6d3218ca75b18cf5a613c1384f13409e3c909e399298c67be309e35c278560ae36910c6d3288ce73c613c3384f1cc13c6d32a8ca75d184f97309e5e613c4b84f1f409e359258ca75e184f5618cf72613cd385f1cc15c6b358184f5e184f9d309ec9c278a609e399238c6799309e45c2780ac2783a85f1f408e3a915c6b35418cf24613c5385f1cc16c6b34f18cf42613c35113cfb9878e29ea7b04f406c3b0e4fd7a634469785f7c7e27741fb3c465a3f0a8ce4c3fb62f34c3c71cfa0c80b886db5580565bb64e17dfc5d07574ee53d465a8fca29bcaf7115134fdc733b5609886db5a0b90aba07200befe37dcc5c39b5ca63a4f5a89c6ae6e509ff7fc0ca60e452ea5e233ce638f621533bf378fc25f80c8dc86724aff4b4ca419db1788e445c7f40f1945999e3982d0fcd35112b9ecfc6e27754a3618c3abf32f084fd636b307229d53f1e051e8ef307533bc37eecb8d7a6d608dda90ee6ea718676461d3bb47e3c22764b90ac162746a1c589089e1363ac05c52b97795f0a9925e86c79e85e4462cd42bd154218c997e7e509fbc715c1c8a554ff78027838ce1f4ced0cfb84935e9b5644e84e75f0f83ac9d0cea86387d64fc27e2887f9780a9955e7ca982d0fcd89106b16ea15843092ef282b4f219f8536d352aa1f3b093c1cfd3c93ee613f36e8b5a910a13bd5c1e36b90a19d51c70ead0fc27e5066655666655666655666655666655666655666655666655666655666655666d9cc96877e3b4cac59a8d72e84917c2758798af30eedc1c8a5d4bcc320f09c4c9ca738efc0a07b38ef70ca6b537b84ee540773f514433ba38e1d5a3f05fb419995599995599995599995599995599995599995599995599995599995599965335b1e7a663bb166a15e871046f29de4e5097fb7d5118c5c4acd3b9c021e8e7919a67686f30e377b6dea88d09dea60aedeccd0cea86387d66f86fda0ccca1cc56c79e8d971c49a857a9d4218c937c8ca539c3fed0c462ea5fab19b8187a39f67d23decc74e7b6dea8cd09dea60ae9e666867d4b143eba7613f94c37c3c85ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3aabce71ccaab3ea1cc7ac3a578fce9687fec722b166a15e971046f29d62e5690fe71dba82914ba97987d3c0c3312fc3a47b38ef70c66b535784ee54078faf330ced8c3a7668fd0cec87f1ce7c3c85cc9a1b63c3acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc7acb9a1cc71cc9a1bca1cc72c21372c4fb72b136b16ea750b6124dfcdbc3ce1730fba83914ba9fb76ce00cf69067d98da19deb733e4b5a93b4277aa83c7d710433ba38e1d5a1f82fda0ccca1cc56c797a5c9958b350af470823f94e33f364a1cdb494eac7868087a39f676a67d88fdde2b5a9274277aa83b97a0b433ba38e1d5abf05787a5d9958b350af570823f9f01cd7cbc4d3e8f134466871ae625b2dfa5cf93cf79a85f7fb8091ab6fe9f518691d739c7c8dc0d3c7c4d3e4f134456871ae625b2dd640d92e59787f0d3072e5549fc748eb5139d5043c6b98789a3d9ee6082dce556cabc55a579ee25eb3f0fe5a60e4caa9351e23ad47e55433f0ac65e289eb93d68e41ecb8e36b2c62c7e5ca58c456cd5573d55c35e7d43c730e35cf9c43cd33aab928cd19aea3c2b1538a1100032efd50c6ef0a1cd79e4cedcc477d1f5bebb509bf8fe198c3b9fabea1ccca1cc7cc346ed191f562933e81c743cb10b316633906d9e7b549da1864b9ccc753c8ac3a57c66c63df9a7cec8eac179bf4093c1e5a6e65d682a99d617f705b10ad31c5cb411dccd3db18da9981b8b46d5abf0df64339ccc753c8ac3a57c66c63df9e78ece2b3d93136e913783cb4dcceac054f3b8bfdc11d41b4c6142f0775304fef60686706e2d2b669fd0ed80fcaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaaccccaacccca2c9bd9c67e72e2b18be3f7189bf4093c1e5a9eccac054f3b8be3f77706d11a53bc1cd4c17d7e27433b331097b64deb77c27e5066655666655666655666655666655666655666655666655666655666655666d9cc36f653928f1dfe1e0763933e81c743cb5398b5606a67387e7f5710ad31c5cb411ddce77731b433037169dbb47e17ec076556e628661bfba989c72ecee7616cd227f07868792ab3163ced2cf6077707d11a53bc1cd4c17d7e37433b331097b64deb77c37e2887f9780a995567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975569de3985567d5398e5975ae1e9d6dec7b128fdd1e8edf636cd227f07868b987590b9e7616c7efef0da235a67839a883797a2f433b331097b64deb14af1a988fa7905973636c98353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e398353794398e59734399e39825e4868dfdb4e46387bf67c7d8a44fe0f1d0f234662d98da19deff725f10ad31c5cb411dccd3fb18da9981b8b46d5abf0ff683322b7314b38d7d3f43ecac179bf4093c1e5aee67d682a99d617ff04010ad31c5cb411ddce70f30b433037169dbb4fe00c446bd138a1dde0349316adcabf53ddd956bc1f70c57ae03df335db91e7ccf72e506f03ddb952780ef39d01ef23dd7959783ef79aebc167ccf77e535e07b812bf781ef85aedc0bbe17b9f210f85eeccab780ef25ae7c2bf85eeacab781ef65ae7c3bf85eeeca7780ef15aefc64f0bdd295ef04dfab5cf929e07bb52bdf05bed7b8f253c1f75a57be1b7caf73e57bc0f77a57be177c6f70e5c5e07b30c2f746577e1af8dee4caf781efcdaebc0f7c6f71e549e07bab2b4f06dfdba04caf6f77e5f3c0f7902b3782ef1dae9c03df3b5db9097cef72e529e07bb72b3783ef3dae3c157cef75e569e07b9f2b4f07dffb5d7906f83ee0ca33c1f741579e05be0fb9f26cf07dd895e780ef23ae3c177c1f75e579e0fb982bcf07dfc75d7901f83ee1ca0bc1f749575e04be4fb932eedf4fbbf2fde0a37ee501f051bff274f051bff20cf051bff24cf051bff22cf051bff26cf051bff21cf051de3d177c9477cf031fe5ddf3c14779f702f051debd107c94772f021fe5dd8bc14779f712f051debd147c94772f031fe5ddcbc14779f70af051debd127c9477af021fe5ddabc14779f71af051debd167c9477af031fe5ddebc14779f706f051de3d083ecabb37828ff2ee4de06b71e53783ef7c577e0bf82e70e5b782ef71ae8cfdcc85aefc76f03dde951f021ff585ef00df45aefc4ef02d71e577816fa92bbf1b7ccb5cf93de05beecaef05df0a577e1ff856baf2fbc1d7eaca1f00df2a57fe20f8f2aefc21f0b5b9f287c15770e58f80afdd953f0abe0e57fe18f83a5df9e3e0eb72e54f80afdb953f09be1e57fe14f8e83c4efd8c3d9eed31483a9046d6476d6e8d680bf926425bfa8364afe928166d9bd6db8191f64161ec190ba3656cf3182d4f2783669857b494fafed1093c1d0c3c4ced0cbf7f74796d6af7da94833a17413bbb18da9981b8b46d5aef82d81cfb1cb5a877db5de269510775fec39de4ecb9b3948eb40d9bbf8588b6f432b785b64dfd52ef18c4eef662e7bdd8d81fd352eaf8ea06e61e0666bbddbee4b71b1e5fabddb628a7284e1edab4063448aa4d183be38ce290bf0eca353386eb523dd283ce5fc46e7399f625b2fb9febf43e97833abd11edef0f926d7f9fc7d3e731db7df2cfe9c31c0cc7439803bd1e07ade741bbbe18ed7a413baa83e7bf3626ed7a3c1e5a6f031ebac6e9021f5d2b103f5e67b58e01b7dfef75457093af1b18db2218f3c93386d73a6d1e23ade781917c3dc0d3cda499bfaf9778fae079b9c1ab439fad833ab35c5f322518f9fd83eadae36e7166b85df41dfcd120d93ebd81412f1c1f08409fc0d33000bda89df50c3c9383e13182334383a70fdc3870c9c081c31940abf330f13513d18c1af061b936c2170423874270489686427048b6c693058760a8befd2a659b45c30d03278e0d3df1e4c0c943a7ef3835347078f7e08d485defd123695c0b90147db44c0c86076dfa836493a7c18b552a7926c2eb04061ea6768627bd495e9b1abc36e5a04e3dbc3789a19d19884bdba6751c00261f6627bd8f1306355e5b308b27c1abbf6f136d10057c1c6c3fe3e0ec7b754ed806074fe2528f614711ed959cdd117654d0f6d676d4cf1e767654cf5e18d98edc8ed2d951393b0a6747ddec289b1d55b3a36876d4cc8e92d951b196a038ea7501f07c0518eda8961dc5b2a356f69ba43d2bd851283bea644799ecd584fd9662cfc0f68ad39e0ded59d05eedd86f53f69bb53dc3d8b3b73d33d9b389bd3ab25745f62ad65ed5d9999975c6d63bad3718db686c93b1cdc6b618db6a6c9bb1edc67618db696c97b1ddc6f618db6bec62634f088a23ca9718bbd4d865c69e68ec72635718bbd2d855c6ae36768db16b8d5d67ec7a633718db6fec80b183c60e193b6c6cc0d81163371a3b6aec98b12719bb2928dee171c2d8496383c64e19bbd9d869636782e22c919d15b2b34076d6c7cef2d8591d3b8b63676dec2c8d9d95b1b33076d6e59ea038ab626747ec6c881d09b723df76a4db8e6c3f33288e5cdb91eae704c591683bf26c479aedc8b21d49b623c776a4d88e0cdb91603bf26b477aedc8ae1dc9b523b776a4d68eccda91583bf26a475aedc8ea834171e4d48e94da91513b126a473eed48a71dd97c28288e5cda914a3b32694722edc8a31d69b4238b7624d18e1cda91423b32684702edc89f1de9b3237b7624cf8edcd9913a3b326747e23e63ec61639f35f639639f37f605635f34f625635f0e8a39f955635f33f67563df30f64d63df32f66d63df31f65d63df33f67d633f30f643633f32f663638f18fb89b19f1afb99b19f1bfb85b15f1afb95b15f1bfb8db1df1afb9db1df1bfb83b13f1afb93b13f1bfb8bb1bf06c3a3f6d851fcd3add008f281a1a18113a7865a86065b4edc727ce8d8a9e377b4dc766ce868cbe0ad03a78f1c1fbc0d3ffc76d735d1f0f886d3a70fdcd172ece4e181db5b066f196a193cd27270f0969387cfe087beec3e34ffec88070e1f8e0ff6e39ac740fab30a83fed97d8e261e76946edbdf2a11e43f2bf9d0b4daca1a74853bb3d0b7d24b8b57712d678e0f0eb5e45b4e9abf078e9bcf0c1c6e6dc1f7ce1891cf0cb59c193a707aa8e5c8e9c1132d6dadb8dd03932a68c43fa657f0a1993346dff2e0ff01dcf19ec8b1020400", - "privateFunctions": [ - { - "selector": { - "value": 283286945 - }, - "vkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "isInternal": false - }, - { - "selector": { - "value": 332459554 - }, - "vkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "isInternal": false - } - ], - "id": "0x2c7b796a4fde879ee00d7603170a1611c382cc9a0d5bce8622037c43e31f20b5", - "privateFunctionsRoot": "0x2dc1f38d7be98a8e72227d6f8aec393c60db813a1819c9c86b02a00cc18f6687", - "publicBytecodeCommitment": "0x2fcce3b509bf46bbaf03634c4b983109b608e6bbd4084eec3b9880dfd17c8e37" -}" -`; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/function_data.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/function_data.test.ts.snap index f0abf4311e2..97a8e44c93f 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/function_data.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/function_data.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`FunctionData computes empty inputs hash 1`] = `Fr<0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed>`; +exports[`FunctionData computes empty inputs hash 1`] = `Fr<0x066e6cdc4a6ba5e4781deda650b0be6c12f975f064fc38df72c1060716759b17>`; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap index dc69d2469ce..2a5ec283e21 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/private_call_stack_item.test.ts.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PrivateCallStackItem computes empty item hash 1`] = `Fr<0x13f518365c690d1b96d31454afed495ad29fe530939caf7189dd44f9bd63ef89>`; +exports[`PrivateCallStackItem computes empty item hash 1`] = `Fr<0x06b381be873c42defb570287e3ba23900175838afb6047a27c7dce1f653b4ac5>`; -exports[`PrivateCallStackItem computes hash 1`] = `Fr<0x1b1f2424b9b38679cd1520ad44392630ac60f1efd1e73e5a0682d999fdee5f91>`; +exports[`PrivateCallStackItem computes hash 1`] = `Fr<0x22654b49c43ac7bb9abc1a84d46ba1a6c67a9d354b9b4c5aba2496e82f03315f>`; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap index d676ab14aea..f36489ffeba 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/public_call_stack_item.test.ts.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PublicCallStackItem Computes a callstack item hash 1`] = `"0x05e9e448563aa811c209cc557136ac56b55f9f2f31ee54d41b697389fd45dc1c"`; +exports[`PublicCallStackItem Computes a callstack item hash 1`] = `"0x1fe20dd657d73941763bf8437471ac000be6efcb046895014b1a84b5aaf55905"`; -exports[`PublicCallStackItem Computes a callstack item request hash 1`] = `"0x141bbf6bc30f0a19640983354528288239b68edd5c1edd9955a007801230d7b6"`; +exports[`PublicCallStackItem Computes a callstack item request hash 1`] = `"0x09bd19d3ebcda705ab1ed598db287340aed3efda0ad3bbbf3296737bda731fa9"`; -exports[`PublicCallStackItem computes hash 1`] = `Fr<0x0a9961096ae423e5c4bc1175bb191b8c2b2ad63feda7ce5599842909c09d9973>`; +exports[`PublicCallStackItem computes hash 1`] = `Fr<0x131efdeaaf1e936042e5e5a24a8546863bbddfc70b8e6bdd6df457595df30577>`; diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap index 06f830fd9cb..82e06fa0a02 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TxRequest compute hash 1`] = `"0x20af6f595c396494f1177fa196d17e98d55a2416b28c262b76e78a36d6c01daa"`; +exports[`TxRequest compute hash 1`] = `"0x08e435f993536fd7a9d6faabfc03a18c4314a54d3d90d15a15275fcfe77bc5a3"`; diff --git a/yarn-project/circuits.js/src/structs/function_data.ts b/yarn-project/circuits.js/src/structs/function_data.ts index bb8aba83713..444a49aa373 100644 --- a/yarn-project/circuits.js/src/structs/function_data.ts +++ b/yarn-project/circuits.js/src/structs/function_data.ts @@ -13,12 +13,18 @@ export class FunctionData { public selector: FunctionSelector, /** Indicates whether the function is private or public. */ public isPrivate: boolean, + /** + * Transitional: whether the function is an AVM function. + * Remove when the AVM is fully operational. + */ + public isTranspiled: boolean = false, ) {} static fromAbi(abi: FunctionAbi | ContractFunctionDao): FunctionData { return new FunctionData( FunctionSelector.fromNameAndParameters(abi.name, abi.parameters), abi.functionType === FunctionType.SECRET, + abi.isTranspiled ?? false, ); } @@ -27,11 +33,12 @@ export class FunctionData { * @returns The buffer. */ toBuffer(): Buffer { - return serializeToBuffer(this.selector, this.isPrivate); + return serializeToBuffer(this.selector, this.isPrivate, this.isTranspiled); + // return serializeToBuffer(this.selector, this.isPrivate); } toFields(): Fr[] { - const fields = [this.selector.toField(), new Fr(this.isPrivate)]; + const fields = [this.selector.toField(), new Fr(this.isPrivate), new Fr(this.isTranspiled)]; if (fields.length !== FUNCTION_DATA_LENGTH) { throw new Error( `Invalid number of fields for FunctionData. Expected ${FUNCTION_DATA_LENGTH}, got ${fields.length}`, @@ -67,7 +74,7 @@ export class FunctionData { */ static fromBuffer(buffer: Buffer | BufferReader): FunctionData { const reader = BufferReader.asReader(buffer); - return new FunctionData(reader.readObject(FunctionSelector), reader.readBoolean()); + return new FunctionData(reader.readObject(FunctionSelector), reader.readBoolean(), reader.readBoolean()); } static fromFields(fields: Fr[] | FieldReader): FunctionData { @@ -75,8 +82,9 @@ export class FunctionData { const selector = FunctionSelector.fromFields(reader); const isPrivate = reader.readBoolean(); + const isTranspiled = reader.readBoolean(); - return new FunctionData(selector, isPrivate); + return new FunctionData(selector, isPrivate, isTranspiled); } hash(): Fr { diff --git a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts index 579dc24f13d..3dce96dd2a3 100644 --- a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts +++ b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts @@ -5,10 +5,9 @@ import { jest } from '@jest/globals'; import { setup } from './fixtures/utils.js'; -process.env.AVM_ENABLED = 'absofrigginlutely'; const TIMEOUT = 100_000; -describe('e2e_nested_contract', () => { +describe('e2e_avm_simulator', () => { jest.setTimeout(TIMEOUT); let wallet: Wallet; diff --git a/yarn-project/foundation/src/abi/abi.ts b/yarn-project/foundation/src/abi/abi.ts index c131a81f926..1b173c428e0 100644 --- a/yarn-project/foundation/src/abi/abi.ts +++ b/yarn-project/foundation/src/abi/abi.ts @@ -156,6 +156,10 @@ export interface FunctionAbi { * Whether the function is flagged as an initializer. */ isInitializer: boolean; + /** + * Transitional: whether the function is an AVM function. + */ + isTranspiled?: boolean; } /** diff --git a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts index 62622e993a0..f0c35c66437 100644 --- a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts +++ b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts @@ -391,6 +391,7 @@ export function mapFunctionDataToNoir(functionData: FunctionData): FunctionDataN return { selector: mapFunctionSelectorToNoir(functionData.selector), is_private: functionData.isPrivate, + is_transpiled: functionData.isTranspiled, }; } @@ -400,7 +401,11 @@ export function mapFunctionDataToNoir(functionData: FunctionData): FunctionDataN * @returns The function data. */ export function mapFunctionDataFromNoir(functionData: FunctionDataNoir): FunctionData { - return new FunctionData(mapFunctionSelectorFromNoir(functionData.selector), functionData.is_private); + return new FunctionData( + mapFunctionSelectorFromNoir(functionData.selector), + functionData.is_private, + functionData.is_transpiled, + ); } /** diff --git a/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts b/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts index 46474f870ae..5376ae460c2 100644 --- a/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts +++ b/yarn-project/sequencer-client/src/sequencer/abstract_phase_manager.ts @@ -55,8 +55,6 @@ import { } from '@aztec/simulator'; import { MerkleTreeOperations } from '@aztec/world-state'; -import { env } from 'process'; - import { PublicKernelCircuitSimulator } from '../simulator/index.js'; import { HintsBuilder } from './hints_builder.js'; import { lastSideEffectCounter } from './utils.js'; @@ -209,9 +207,9 @@ export abstract class AbstractPhaseManager { const isExecutionRequest = !isPublicExecutionResult(current); const sideEffectCounter = lastSideEffectCounter(tx) + 1; - // NOTE: temporary glue to incorporate avm execution calls + // NOTE: temporary glue to incorporate avm execution calls. const simulator = (execution: PublicExecution, globalVariables: GlobalVariables) => - env.AVM_ENABLED + execution.functionData.isTranspiled ? this.publicExecutor.simulateAvm(execution, globalVariables, sideEffectCounter) : this.publicExecutor.simulate(execution, globalVariables, sideEffectCounter); diff --git a/yarn-project/types/src/abi/contract_artifact.ts b/yarn-project/types/src/abi/contract_artifact.ts index 26694d58a76..b1b4a1d894b 100644 --- a/yarn-project/types/src/abi/contract_artifact.ts +++ b/yarn-project/types/src/abi/contract_artifact.ts @@ -147,6 +147,7 @@ function generateFunctionArtifact(fn: NoirCompiledContractFunction): FunctionArt functionType, isInternal, isInitializer: fn.custom_attributes.includes(AZTEC_INITIALIZER_ATTRIBUTE), + isTranspiled: fn.custom_attributes.includes(AZTEC_PUBLIC_VM_ATTRIBUTE), parameters, returnTypes, bytecode: Buffer.from(fn.bytecode, 'base64'),