diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 6be23dff27..7e562a3f0d 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -19,9 +19,9 @@ jobs: with: filters: | run-ci: - - 'rusk/**/* - - 'node/**/* - predicate-quantifier: "any" + - 'rusk/**' + - 'node/**' + - '.github/workflows/benchmarks.yml' benchmark: needs: changes diff --git a/.github/workflows/ruskwallet_ci.yml b/.github/workflows/ruskwallet_ci.yml index eb6cc20cc5..df9dd55def 100644 --- a/.github/workflows/ruskwallet_ci.yml +++ b/.github/workflows/ruskwallet_ci.yml @@ -25,6 +25,8 @@ jobs: with: filters: | run-ci: + - 'wallet-core/**' + - 'execution-core/**' - 'rusk-wallet/**' - '.github/workflows/ruskwallet_ci.yml' fmt: diff --git a/consensus/src/commons.rs b/consensus/src/commons.rs index efeb48e831..558d5aa63e 100644 --- a/consensus/src/commons.rs +++ b/consensus/src/commons.rs @@ -139,7 +139,6 @@ impl From for ConsensusError { #[async_trait::async_trait] pub trait Database: Send + Sync { fn store_candidate_block(&mut self, b: Block); - fn delete_candidate_blocks(&mut self); } #[derive(Clone)] diff --git a/consensus/src/consensus.rs b/consensus/src/consensus.rs index 95c0915410..8f84add44c 100644 --- a/consensus/src/consensus.rs +++ b/consensus/src/consensus.rs @@ -161,7 +161,7 @@ impl Consensus { Phase::Proposal(proposal::step::ProposalStep::new( executor.clone(), db.clone(), - proposal_handler.clone(), + proposal_handler, )), Phase::Validation(validation::step::ValidationStep::new( executor.clone(), @@ -179,7 +179,6 @@ impl Consensus { let mut iter_ctx = IterationCtx::new( ru.round, iter, - proposal_handler, validation_handler, ratification_handler, ru.base_timeouts.clone(), diff --git a/consensus/src/execution_ctx.rs b/consensus/src/execution_ctx.rs index 26d443a318..016fcf05af 100644 --- a/consensus/src/execution_ctx.rs +++ b/consensus/src/execution_ctx.rs @@ -4,7 +4,7 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::commons::{ConsensusError, Database, QuorumMsgSender, RoundUpdate}; +use crate::commons::{ConsensusError, QuorumMsgSender, RoundUpdate}; use crate::iteration_ctx::IterationCtx; use crate::msg_handler::{HandleMsgOutput, MsgHandler}; @@ -34,8 +34,8 @@ use tracing::{debug, error, info, trace, warn}; /// ExecutionCtx encapsulates all data needed in the execution of consensus /// messages handlers. -pub struct ExecutionCtx<'a, DB: Database, T> { - pub iter_ctx: &'a mut IterationCtx, +pub struct ExecutionCtx<'a, T> { + pub iter_ctx: &'a mut IterationCtx, /// Messaging-related fields pub inbound: AsyncQueue, @@ -57,11 +57,11 @@ pub struct ExecutionCtx<'a, DB: Database, T> { quorum_sender: QuorumMsgSender, } -impl<'a, DB: Database, T: Operations + 'static> ExecutionCtx<'a, DB, T> { +impl<'a, T: Operations + 'static> ExecutionCtx<'a, T> { /// Creates step execution context. #[allow(clippy::too_many_arguments)] pub(crate) fn new( - iter_ctx: &'a mut IterationCtx, + iter_ctx: &'a mut IterationCtx, inbound: AsyncQueue, outbound: AsyncQueue, future_msgs: Arc>>, @@ -220,7 +220,7 @@ impl<'a, DB: Database, T: Operations + 'static> ExecutionCtx<'a, DB, T> { if let Some(committee) = self.iter_ctx.committees.get_committee(step) { if self.am_member(committee) { - RatificationStep::::try_vote( + RatificationStep::try_vote( &self.round_update, msg_iteration, validation, @@ -248,41 +248,40 @@ impl<'a, DB: Database, T: Operations + 'static> ExecutionCtx<'a, DB, T> { async fn on_emergency_mode(&mut self, msg: Message) { self.outbound.try_send(msg.clone()); - // Try to cast validation vote for a candidate block from former - // iteration + // Try to vote for a candidate block from former iteration if let Payload::Candidate(p) = &msg.payload { self.try_cast_validation_vote(&p.candidate).await; - } - - let msg_iteration = msg.header.iteration; - - // Collect message from a previous iteration/step. - if let Some(m) = self - .iter_ctx - .collect_past_event(&self.round_update, msg) - .await - { - match &m.payload { - Payload::Quorum(q) => { - debug!( - event = "quorum", - src = "prev_step", - msg_step = m.get_step(), - vote = ?q.vote(), - ); - - self.quorum_sender.send_quorum(m).await; - } + } else { + let msg_iteration = msg.header.iteration; + + // Collect message from a previous iteration/step. + if let Some(m) = self + .iter_ctx + .collect_past_event(&self.round_update, msg) + .await + { + match &m.payload { + Payload::Quorum(q) => { + debug!( + event = "quorum", + src = "prev_step", + msg_step = m.get_step(), + vote = ?q.vote(), + ); + + self.quorum_sender.send_quorum(m).await; + } - Payload::ValidationResult(validation_result) => { - self.try_cast_ratification_vote( - msg_iteration, - validation_result, - ) - .await - } - _ => { - // Not supported. + Payload::ValidationResult(validation_result) => { + self.try_cast_ratification_vote( + msg_iteration, + validation_result, + ) + .await + } + _ => { + // Not supported. + } } } } diff --git a/consensus/src/iteration_ctx.rs b/consensus/src/iteration_ctx.rs index af8a680bf8..071fcb4685 100644 --- a/consensus/src/iteration_ctx.rs +++ b/consensus/src/iteration_ctx.rs @@ -4,7 +4,6 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::commons::Database; use crate::commons::{RoundUpdate, TimeoutSet}; use std::cmp; @@ -14,7 +13,7 @@ use crate::msg_handler::MsgHandler; use crate::user::committee::Committee; -use crate::{proposal, ratification, validation}; +use crate::{ratification, validation}; use node_data::bls::PublicKeyBytes; use node_data::message::Message; @@ -60,11 +59,10 @@ impl RoundCommittees { /// Represents a shared state within a context of the execution of a single /// iteration. -pub struct IterationCtx { +pub struct IterationCtx { validation_handler: Arc>, ratification_handler: Arc>, - proposal_handler: Arc>>, pub join_set: JoinSet<()>, @@ -79,11 +77,10 @@ pub struct IterationCtx { timeouts: TimeoutSet, } -impl IterationCtx { +impl IterationCtx { pub fn new( round: u64, iter: u8, - proposal_handler: Arc>>, validation_handler: Arc>, ratification_handler: Arc< Mutex, @@ -94,7 +91,6 @@ impl IterationCtx { round, join_set: JoinSet::new(), iter, - proposal_handler, validation_handler, ratification_handler, committees: Default::default(), @@ -152,12 +148,6 @@ impl IterationCtx { let generator = self.get_generator(msg.header.iteration); match msg.topic() { - node_data::message::Topics::Candidate => { - let mut handler = self.proposal_handler.lock().await; - _ = handler - .collect_from_past(msg, ru, committee, generator) - .await; - } node_data::message::Topics::Validation => { let mut handler = self.validation_handler.lock().await; if let Ok(HandleMsgOutput::Ready(m)) = handler @@ -183,7 +173,7 @@ impl IterationCtx { } } -impl Drop for IterationCtx { +impl Drop for IterationCtx { fn drop(&mut self) { self.on_close(); } diff --git a/consensus/src/phase.rs b/consensus/src/phase.rs index 5ce672debf..bb0a159311 100644 --- a/consensus/src/phase.rs +++ b/consensus/src/phase.rs @@ -29,7 +29,7 @@ macro_rules! await_phase { pub enum Phase { Proposal(proposal::step::ProposalStep), Validation(validation::step::ValidationStep), - Ratification(ratification::step::RatificationStep), + Ratification(ratification::step::RatificationStep), } impl Phase { @@ -54,7 +54,7 @@ impl Phase { pub async fn run( &mut self, - mut ctx: ExecutionCtx<'_, D, T>, + mut ctx: ExecutionCtx<'_, T>, ) -> Result { ctx.set_start_time(); diff --git a/consensus/src/proposal/block_generator.rs b/consensus/src/proposal/block_generator.rs index e53a0585e4..43f1f45c4d 100644 --- a/consensus/src/proposal/block_generator.rs +++ b/consensus/src/proposal/block_generator.rs @@ -80,7 +80,7 @@ impl Generator { candidate.sign(&ru.secret_key, ru.pubkey_bls.inner()); - Ok(Message::new_candidate(candidate)) + Ok(candidate.into()) } async fn generate_block( diff --git a/consensus/src/proposal/step.rs b/consensus/src/proposal/step.rs index ec89979aa3..a0c4984c97 100644 --- a/consensus/src/proposal/step.rs +++ b/consensus/src/proposal/step.rs @@ -53,7 +53,7 @@ impl ProposalStep { pub async fn run( &mut self, - mut ctx: ExecutionCtx<'_, D, T>, + mut ctx: ExecutionCtx<'_, T>, ) -> Result { let committee = ctx .get_current_committee() diff --git a/consensus/src/queue.rs b/consensus/src/queue.rs index ddbc208cf9..873c3b33c1 100644 --- a/consensus/src/queue.rs +++ b/consensus/src/queue.rs @@ -58,11 +58,6 @@ impl MsgRegistry { self.0.remove(&round); } - /// Removes all messages that belong to a round greater than the specified. - pub fn remove_msgs_greater_than(&mut self, round: u64) { - self.0.split_off(&round); - } - /// Removes all messages that do not belong to the range (closed interval) /// of keys pub fn remove_msgs_out_of_range(&mut self, start_round: u64, offset: u64) { @@ -121,30 +116,6 @@ mod tests { assert!(reg.drain_msg_by_round_step(round, 2).is_none()); } - #[test] - fn test_remove() { - #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] - struct Item(i32); - - let round = 100; - - let mut reg = MsgRegistry::::default(); - reg.put_msg(round + 1, 1, Item(1)); - reg.put_msg(round + 2, 1, Item(1)); - reg.put_msg(round + 3, 1, Item(1)); - reg.put_msg(round, 1, Item(1)); - - reg.remove_msgs_greater_than(round + 2); - - assert!(reg.drain_msg_by_round_step(round, 1).is_some()); - assert!(reg.drain_msg_by_round_step(round + 1, 1).is_some()); - - assert!(reg.drain_msg_by_round_step(round + 2, 1).is_none()); - assert!(reg.drain_msg_by_round_step(round + 3, 1).is_none()); - - assert_eq!(reg.msg_count(), 0); - } - #[test] fn test_remove_msgs_out_of_range() { #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] diff --git a/consensus/src/ratification/handler.rs b/consensus/src/ratification/handler.rs index 2f04e885e0..d2015e9e98 100644 --- a/consensus/src/ratification/handler.rs +++ b/consensus/src/ratification/handler.rs @@ -205,7 +205,7 @@ impl RatificationHandler { }, }; - Message::new_quorum(quorum) + quorum.into() } pub(crate) fn reset(&mut self, iter: u8, validation: ValidationResult) { diff --git a/consensus/src/ratification/step.rs b/consensus/src/ratification/step.rs index 24335a6a3d..998d5f28c7 100644 --- a/consensus/src/ratification/step.rs +++ b/consensus/src/ratification/step.rs @@ -4,10 +4,9 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::commons::{ConsensusError, Database, RoundUpdate}; +use crate::commons::{ConsensusError, RoundUpdate}; use crate::execution_ctx::ExecutionCtx; use crate::operations::Operations; -use std::marker::PhantomData; use crate::msg_handler::{HandleMsgOutput, MsgHandler}; use crate::ratification::handler; @@ -19,12 +18,11 @@ use tokio::sync::Mutex; use tracing::{info, Instrument}; -pub struct RatificationStep { +pub struct RatificationStep { handler: Arc>, - marker: PhantomData, } -impl RatificationStep { +impl RatificationStep { pub async fn try_vote( ru: &RoundUpdate, iteration: u8, @@ -35,7 +33,7 @@ impl RatificationStep { let ratification = self::build_ratification_payload(ru, iteration, result); - let msg = Message::new_ratification(ratification); + let msg = Message::from(ratification); // Publish ratification vote info!(event = "send_vote", validation_bitset = result.sv().bitset); @@ -70,14 +68,11 @@ pub fn build_ratification_payload( ratification } -impl RatificationStep { +impl RatificationStep { pub(crate) fn new( handler: Arc>, ) -> Self { - Self { - handler, - marker: PhantomData, - } + Self { handler } } pub async fn reinitialize( @@ -112,7 +107,7 @@ impl RatificationStep { pub async fn run( &mut self, - mut ctx: ExecutionCtx<'_, DB, T>, + mut ctx: ExecutionCtx<'_, T>, ) -> Result { let committee = ctx .get_current_committee() diff --git a/consensus/src/step_votes_reg.rs b/consensus/src/step_votes_reg.rs index 69e3bb89a0..39f81c106c 100644 --- a/consensus/src/step_votes_reg.rs +++ b/consensus/src/step_votes_reg.rs @@ -202,7 +202,7 @@ impl AttInfoRegistry { let payload = payload::Quorum { header, att }; - Message::new_quorum(payload) + payload.into() } pub(crate) fn get_failed_atts(&self, to: u8) -> Vec> { diff --git a/consensus/src/validation/handler.rs b/consensus/src/validation/handler.rs index 1a7d236c6f..5d0b37dbc1 100644 --- a/consensus/src/validation/handler.rs +++ b/consensus/src/validation/handler.rs @@ -26,7 +26,7 @@ fn final_result( quorum: QuorumType, ) -> HandleMsgOutput { let p = payload::ValidationResult::new(sv, vote, quorum); - let msg = Message::from_validation_result(p); + let msg = Message::from(p); HandleMsgOutput::Ready(msg) } diff --git a/consensus/src/validation/step.rs b/consensus/src/validation/step.rs index 691f0aa558..c8ef8b15e8 100644 --- a/consensus/src/validation/step.rs +++ b/consensus/src/validation/step.rs @@ -4,7 +4,7 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::commons::{ConsensusError, Database, RoundUpdate}; +use crate::commons::{ConsensusError, RoundUpdate}; use crate::config; use crate::execution_ctx::ExecutionCtx; use crate::operations::{Operations, Voter}; @@ -124,7 +124,7 @@ impl ValidationStep { // Sign and construct validation message let validation = self::build_validation_payload(vote, ru, iteration); info!(event = "send_vote", vote = ?validation.vote); - let msg = Message::new_validation(validation); + let msg = Message::from(validation); // Publish outbound.try_send(msg.clone()); @@ -226,9 +226,9 @@ impl ValidationStep { ) } - pub async fn run( + pub async fn run( &mut self, - mut ctx: ExecutionCtx<'_, DB, T>, + mut ctx: ExecutionCtx<'_, T>, ) -> Result { let committee = ctx .get_current_committee() diff --git a/contracts/alice/src/lib.rs b/contracts/alice/src/lib.rs index 975bc2d147..ba185195fc 100644 --- a/contracts/alice/src/lib.rs +++ b/contracts/alice/src/lib.rs @@ -33,4 +33,14 @@ mod wasm { unsafe fn deposit(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |arg| STATE.deposit(arg)) } + + #[no_mangle] + unsafe fn transfer_to_contract(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |arg| STATE.transfer_to_contract(arg)) + } + + #[no_mangle] + unsafe fn transfer_to_account(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |arg| STATE.transfer_to_account(arg)) + } } diff --git a/contracts/alice/src/state.rs b/contracts/alice/src/state.rs index 7d1c9287c5..fd48fcc39b 100644 --- a/contracts/alice/src/state.rs +++ b/contracts/alice/src/state.rs @@ -4,7 +4,10 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use execution_core::transfer::{withdraw::Withdraw, TRANSFER_CONTRACT}; +use execution_core::transfer::{ + withdraw::Withdraw, TransferToAccount, TransferToContract, + TRANSFER_CONTRACT, +}; /// Alice contract. #[derive(Debug, Clone)] @@ -22,6 +25,24 @@ impl Alice { pub fn deposit(&mut self, value: u64) { let _: () = rusk_abi::call(TRANSFER_CONTRACT, "deposit", &value) - .expect("Transparent withdrawal transaction should succeed"); + .expect("Transparent deposit transaction should succeed"); + } + + pub fn transfer_to_contract(&mut self, transfer: TransferToContract) { + let _: () = rusk_abi::call( + TRANSFER_CONTRACT, + "transfer_to_contract", + &transfer, + ) + .expect("Transferring to contract should succeed"); + } + + pub fn transfer_to_account(&mut self, transfer: TransferToAccount) { + rusk_abi::call::<_, ()>( + TRANSFER_CONTRACT, + "transfer_to_account", + &transfer, + ) + .expect("Transferring to account should succeed"); } } diff --git a/contracts/bob/Cargo.toml b/contracts/bob/Cargo.toml index cf51e94249..c19b43d0ea 100644 --- a/contracts/bob/Cargo.toml +++ b/contracts/bob/Cargo.toml @@ -8,4 +8,8 @@ resolver = "2" crate-type = ["cdylib", "rlib"] [dependencies] -rusk-abi = { version = "0.13.0-rc", path = "../../rusk-abi", features = ["debug"] } +execution-core = { version = "0.1.0", path = "../../execution-core" } +rusk-abi = { version = "0.13.0-rc", path = "../../rusk-abi" } +rkyv = { version = "0.7", default-features = false, features = ["size_32"] } +bytecheck = { version = "0.6", default-features = false } +dusk-bytes = "0.1" diff --git a/contracts/bob/src/lib.rs b/contracts/bob/src/lib.rs index c439622bd7..5e1beb0e56 100644 --- a/contracts/bob/src/lib.rs +++ b/contracts/bob/src/lib.rs @@ -25,6 +25,16 @@ mod wasm { rusk_abi::wrap_call(arg_len, |n| STATE.init(n)) } + #[no_mangle] + unsafe fn reset(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |n| STATE.reset(n)) + } + + #[no_mangle] + unsafe fn owner_reset(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |(sig, msg)| STATE.owner_reset(sig, msg)) + } + #[no_mangle] unsafe fn ping(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |()| STATE.ping()) @@ -39,4 +49,14 @@ mod wasm { unsafe fn value(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |()| STATE.value()) } + + #[no_mangle] + unsafe fn nonce(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |()| STATE.nonce()) + } + + #[no_mangle] + unsafe fn recv_transfer(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |arg| STATE.recv_transfer(arg)) + } } diff --git a/contracts/bob/src/state.rs b/contracts/bob/src/state.rs index b60be17941..cf1e37d6c8 100644 --- a/contracts/bob/src/state.rs +++ b/contracts/bob/src/state.rs @@ -4,15 +4,41 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. +extern crate alloc; +use alloc::string::String; +use bytecheck::CheckBytes; +use dusk_bytes::Serializable; +use execution_core::{ + signatures::bls::{PublicKey as BlsPublicKey, Signature as BlsSignature}, + transfer::ReceiveFromContract, + ContractId, +}; +use rkyv::{Archive, Deserialize, Serialize}; + +#[derive(Debug, Clone, Archive, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct OwnerMessage { + contract_id: ContractId, + args: u8, + fname: String, + nonce: u64, +} + /// Bob contract. #[derive(Debug, Clone)] pub struct Bob { value: u8, + nonce: u64, + total_dusk: u64, } impl Bob { pub const fn new() -> Self { - Self { value: 0 } + Self { + value: 0, + nonce: 0, + total_dusk: 0, + } } #[allow(dead_code)] @@ -24,6 +50,38 @@ impl Bob { impl Bob { pub fn init(&mut self, n: u8) { self.value = n; + self.nonce = 0; + } + + pub fn reset(&mut self, n: u8) { + self.value = n; + } + + pub fn owner_reset(&mut self, sig: BlsSignature, msg: OwnerMessage) { + let mut granted = false; + let message_bytes = rkyv::to_bytes::<_, 4096>(&msg) + .expect("Message should serialize correctly") + .to_vec(); + + let owner_bytes = rusk_abi::self_owner_raw(); + if let Ok(owner) = BlsPublicKey::from_bytes(&owner_bytes) { + if self.nonce == msg.nonce + && msg.fname == "owner_reset" + && msg.contract_id == rusk_abi::self_id() + && rusk_abi::verify_bls(message_bytes, owner, sig) + { + self.owner_only_function(msg.args); + self.nonce += 1; + granted = true; + } + } + if !granted { + panic!("method restricted only to the owner") + } + } + + fn owner_only_function(&mut self, args: u8) { + self.value = args; } pub fn ping(&mut self) {} @@ -35,4 +93,12 @@ impl Bob { pub fn value(&mut self) -> u8 { self.value } + + pub fn nonce(&mut self) -> u64 { + self.nonce + } + + pub fn recv_transfer(&mut self, recv: ReceiveFromContract) { + self.total_dusk += recv.value; + } } diff --git a/contracts/host_fn/src/lib.rs b/contracts/host_fn/src/lib.rs index bece500144..e9678bb011 100644 --- a/contracts/host_fn/src/lib.rs +++ b/contracts/host_fn/src/lib.rs @@ -19,7 +19,6 @@ use execution_core::{ PublicKey as SchnorrPublicKey, Signature as SchnorrSignature, }, }, - transfer::phoenix::PublicKey as PhoenixPublicKey, BlsScalar, }; @@ -64,15 +63,19 @@ impl HostFnTest { rusk_abi::verify_bls(msg, pk, sig) } + pub fn chain_id(&self) -> u8 { + rusk_abi::chain_id() + } + pub fn block_height(&self) -> u64 { rusk_abi::block_height() } - pub fn owner(&self) -> PhoenixPublicKey { + pub fn owner(&self) -> BlsPublicKey { rusk_abi::self_owner() } - pub fn owner_raw(&self) -> [u8; PhoenixPublicKey::SIZE] { + pub fn owner_raw(&self) -> [u8; BlsPublicKey::SIZE] { rusk_abi::self_owner_raw() } } @@ -108,6 +111,11 @@ unsafe fn verify_bls(arg_len: u32) -> u32 { }) } +#[no_mangle] +unsafe fn chain_id(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |_: ()| STATE.chain_id()) +} + #[no_mangle] unsafe fn block_height(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |_: ()| STATE.block_height()) diff --git a/contracts/license/tests/license.rs b/contracts/license/tests/license.rs index 2a37fe02a4..64b2f412f3 100644 --- a/contracts/license/tests/license.rs +++ b/contracts/license/tests/license.rs @@ -41,6 +41,7 @@ const LICENSE_CONTRACT_ID: ContractId = { const POINT_LIMIT: u64 = 0x10000000; const TEST_OWNER: [u8; 32] = [0; 32]; +const CHAIN_ID: u8 = 0xFA; const USER_ATTRIBUTES: u64 = 545072475273; static LABEL: &[u8] = b"dusk-network"; @@ -66,7 +67,7 @@ fn initialize() -> Session { "../../../target/dusk/wasm32-unknown-unknown/release/license_contract.wasm" ); - let mut session = rusk_abi::new_genesis_session(&vm); + let mut session = rusk_abi::new_genesis_session(&vm, CHAIN_ID); session .deploy( diff --git a/contracts/stake/Cargo.toml b/contracts/stake/Cargo.toml index eefa752f63..d2ce858287 100644 --- a/contracts/stake/Cargo.toml +++ b/contracts/stake/Cargo.toml @@ -23,7 +23,6 @@ rusk-prover = { version = "0.3", path = "../../rusk-prover/" } rkyv = { version = "0.7", default-features = false, features = ["size_32"] } hex = "0.4" rand = "0.8" -poseidon-merkle = { version = "0.7", features = ["rkyv-impl"] } ff = { version = "0.13", default-features = false } criterion = "0.5" diff --git a/contracts/stake/src/state.rs b/contracts/stake/src/state.rs index 62c61f4a3c..d46afddf9e 100644 --- a/contracts/stake/src/state.rs +++ b/contracts/stake/src/state.rs @@ -12,8 +12,9 @@ use dusk_bytes::Serializable; use execution_core::{ signatures::bls::PublicKey as BlsPublicKey, stake::{ - next_epoch, Stake, StakeAmount, StakeData, StakeEvent, Withdraw, EPOCH, - MINIMUM_STAKE, STAKE_CONTRACT, STAKE_WARNINGS, + next_epoch, Stake, StakeAmount, StakeData, StakeEvent, + StakeWithReceiverEvent, Withdraw, EPOCH, MINIMUM_STAKE, STAKE_CONTRACT, + STAKE_WARNINGS, }, transfer::TRANSFER_CONTRACT, }; @@ -72,6 +73,10 @@ impl StakeState { let nonce = stake.nonce(); let signature = *stake.signature(); + if stake.chain_id() != self.chain_id() { + panic!("The stake must target the correct chain"); + } + let loaded_stake = self.load_or_create_stake_mut(&account); // ensure the stake is at least the minimum and that there isn't an @@ -110,14 +115,7 @@ impl StakeState { loaded_stake.amount = Some(StakeAmount::new(value, rusk_abi::block_height())); - rusk_abi::emit( - "stake", - StakeEvent { - account, - value, - receiver: None, - }, - ); + rusk_abi::emit("stake", StakeEvent { account, value }); let key = account.to_bytes(); self.previous_block_state @@ -140,12 +138,13 @@ impl StakeState { // ensure there is a value staked, and that the withdrawal is exactly // the same amount - let staked_value = loaded_stake + let stake = loaded_stake .amount - .expect("There must be an amount to unstake") - .value; + .as_ref() + .expect("There must be an amount to unstake"); + let withdrawal_value = stake.locked + stake.value; - if value != staked_value { + if value != withdrawal_value { panic!("Value withdrawn different from staked amount"); } @@ -166,9 +165,9 @@ impl StakeState { rusk_abi::emit( "unstake", - StakeEvent { + StakeWithReceiverEvent { account, - value: staked_value, + value: withdrawal_value, receiver: Some(*transfer_withdraw.receiver()), }, ); @@ -195,8 +194,8 @@ impl StakeState { panic!("There is no reward available to withdraw"); } - if value != loaded_stake.reward { - panic!("Value withdrawn different from available reward"); + if value > loaded_stake.reward { + panic!("Value withdrawn higher than available reward"); } // check signature is correct @@ -212,11 +211,10 @@ impl StakeState { .expect("Withdrawing reward should succeed"); // update the state accordingly - loaded_stake.reward = 0; - + loaded_stake.reward -= value; rusk_abi::emit( "withdraw", - StakeEvent { + StakeWithReceiverEvent { account, value, receiver: Some(*transfer_withdraw.receiver()), @@ -276,14 +274,8 @@ impl StakeState { stake.reward += value; - rusk_abi::emit( - "reward", - StakeEvent { - account: *account, - value, - receiver: None, - }, - ); + let account = *account; + rusk_abi::emit("reward", StakeEvent { account, value }); } /// Total amount burned since the genesis @@ -335,7 +327,6 @@ impl StakeState { StakeEvent { account: *account, value: stake_amount.eligibility, - receiver: None, }, ); } @@ -347,19 +338,13 @@ impl StakeState { let to_slash = min(to_slash, stake_amount.value); if to_slash > 0 { - // Move the slash amount from stake to reward and deduct contract - // balance - stake_amount.value -= to_slash; - stake.reward += to_slash; - - Self::deduct_contract_balance(to_slash); + stake_amount.lock_amount(to_slash); rusk_abi::emit( "slash", StakeEvent { account: *account, value: to_slash, - receiver: None, }, ); } @@ -410,7 +395,6 @@ impl StakeState { StakeEvent { account: *account, value: stake_amount.eligibility, - receiver: None, }, ); @@ -433,7 +417,6 @@ impl StakeState { StakeEvent { account: *account, value: to_slash, - receiver: None, }, ); } @@ -456,6 +439,10 @@ impl StakeState { } } + fn chain_id(&self) -> u8 { + rusk_abi::chain_id() + } + fn deduct_contract_balance(amount: u64) { // Update the module balance to reflect the change in the amount // withdrawable from the contract diff --git a/contracts/stake/tests/common/assert.rs b/contracts/stake/tests/common/assert.rs index 322ea3e684..9b3cf0b0ac 100644 --- a/contracts/stake/tests/common/assert.rs +++ b/contracts/stake/tests/common/assert.rs @@ -8,7 +8,9 @@ use dusk_bytes::Serializable; use rkyv::{check_archived_root, Deserialize, Infallible}; use execution_core::{ - signatures::bls::PublicKey as BlsPublicKey, stake::StakeEvent, Event, + signatures::bls::PublicKey as BlsPublicKey, + stake::{StakeEvent, StakeWithReceiverEvent}, + Event, }; pub fn assert_event( @@ -19,20 +21,30 @@ pub fn assert_event( ) where S: AsRef, { - let event = - events - .iter() - .find(|e| e.topic == topic.as_ref()) - .expect(&format!( - "event: {} should exist in the event list", - topic.as_ref() - )); - let staking_event_data = - check_archived_root::(event.data.as_slice()) - .expect("Stake event data should deserialize correctly"); - let staking_event_data: StakeEvent = staking_event_data - .deserialize(&mut Infallible) - .expect("Infallible"); - assert_eq!(staking_event_data.value, should_amount); - assert_eq!(staking_event_data.account.to_bytes(), should_pk.to_bytes()); + let topic = topic.as_ref(); + let event = events + .iter() + .find(|e| e.topic == topic) + .expect(&format!("event: {topic} should exist in the event list",)); + + if topic == "unstake" || topic == "withdraw" { + let staking_event_data = check_archived_root::( + event.data.as_slice(), + ) + .expect("Stake event data should deserialize correctly"); + let staking_event_data: StakeWithReceiverEvent = staking_event_data + .deserialize(&mut Infallible) + .expect("Infallible"); + assert_eq!(staking_event_data.value, should_amount); + assert_eq!(staking_event_data.account.to_bytes(), should_pk.to_bytes()); + } else { + let staking_event_data = + check_archived_root::(event.data.as_slice()) + .expect("Stake event data should deserialize correctly"); + let staking_event_data: StakeEvent = staking_event_data + .deserialize(&mut Infallible) + .expect("Infallible"); + assert_eq!(staking_event_data.value, should_amount); + assert_eq!(staking_event_data.account.to_bytes(), should_pk.to_bytes()); + } } diff --git a/contracts/stake/tests/common/init.rs b/contracts/stake/tests/common/init.rs index e129149b29..b26a05bf19 100644 --- a/contracts/stake/tests/common/init.rs +++ b/contracts/stake/tests/common/init.rs @@ -20,6 +20,7 @@ use rusk_abi::{ContractData, Session, VM}; use crate::common::utils::update_root; const OWNER: [u8; 32] = [0; 32]; +pub const CHAIN_ID: u8 = 0xFA; const POINT_LIMIT: u64 = 0x100_000_000; /// Instantiate the virtual machine with the transfer contract deployed, with a @@ -37,7 +38,7 @@ pub fn instantiate( "../../../../target/dusk/wasm32-unknown-unknown/release/stake_contract.wasm" ); - let mut session = rusk_abi::new_genesis_session(vm); + let mut session = rusk_abi::new_genesis_session(vm, CHAIN_ID); session .deploy( @@ -81,6 +82,6 @@ pub fn instantiate( // sets the block height for all subsequent operations to 1 let base = session.commit().expect("Committing should succeed"); - rusk_abi::new_session(vm, base, 1) + rusk_abi::new_session(vm, base, CHAIN_ID, 1) .expect("Instantiating new session should succeed") } diff --git a/contracts/stake/tests/common/utils.rs b/contracts/stake/tests/common/utils.rs index d77de40c84..64bab614f3 100644 --- a/contracts/stake/tests/common/utils.rs +++ b/contracts/stake/tests/common/utils.rs @@ -6,16 +6,15 @@ use std::sync::mpsc; -use poseidon_merkle::Opening as PoseidonOpening; use rand::rngs::StdRng; use execution_core::{ transfer::{ - contract_exec::ContractExec, + data::TransactionData, phoenix::{ - Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, - Transaction as PhoenixTransaction, TreeLeaf, - ViewKey as PhoenixViewKey, NOTES_TREE_DEPTH, + Note, NoteLeaf, NoteOpening, NoteTreeItem, + PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, + Transaction as PhoenixTransaction, ViewKey as PhoenixViewKey, }, Transaction, TRANSFER_CONTRACT, }, @@ -29,7 +28,7 @@ const POINT_LIMIT: u64 = 0x100000000; pub fn leaves_from_height( session: &mut Session, height: u64, -) -> Result, PiecrustError> { +) -> Result, PiecrustError> { let (feeder, receiver) = mpsc::channel(); session.feeder_call::<_, ()>( @@ -49,7 +48,7 @@ pub fn leaves_from_height( pub fn leaves_from_pos( session: &mut Session, pos: u64, -) -> Result, PiecrustError> { +) -> Result, PiecrustError> { let (feeder, receiver) = mpsc::channel(); session.feeder_call::<_, ()>( @@ -81,12 +80,18 @@ pub fn root(session: &mut Session) -> Result { pub fn opening( session: &mut Session, pos: u64, -) -> Result>, PiecrustError> { +) -> Result, PiecrustError> { session .call(TRANSFER_CONTRACT, "opening", &pos, POINT_LIMIT) .map(|r| r.data) } +pub fn chain_id(session: &mut Session) -> Result { + session + .call(TRANSFER_CONTRACT, "chain_id", &(), POINT_LIMIT) + .map(|r| r.data) +} + pub fn filter_notes_owned_by>( vk: PhoenixViewKey, iter: I, @@ -148,7 +153,7 @@ pub fn create_transaction( transfer_value: u64, obfuscated_transaction: bool, deposit: u64, - exec: Option>, + data: Option>, ) -> Transaction { // Get the root of the tree of phoenix-notes. let root = root(session).expect("Getting the anchor should be successful"); @@ -171,14 +176,14 @@ pub fn create_transaction( .expect("An opening should exist for a note in the tree"); // sanity check of the merkle opening - assert!(opening.verify(poseidon_merkle::Item::new( - rusk_abi::poseidon_hash(note.hash_inputs().to_vec()), - () - ))); + assert!(opening.verify(NoteTreeItem::new(note.hash(), ()))); inputs.push((note.clone(), opening)); } + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + PhoenixTransaction::new::( rng, sender_sk, @@ -191,7 +196,8 @@ pub fn create_transaction( deposit, gas_limit, gas_price, - exec.map(Into::into), + chain_id, + data.map(Into::into), ) .expect("creating the creation shouldn't fail") .into() diff --git a/contracts/stake/tests/events.rs b/contracts/stake/tests/events.rs index fa8183beed..780d0b08ff 100644 --- a/contracts/stake/tests/events.rs +++ b/contracts/stake/tests/events.rs @@ -51,6 +51,7 @@ fn reward_slash() -> Result<(), PiecrustError> { amount: Some(StakeAmount { value: stake_amount, eligibility: 0, + locked: 0, }), nonce: 0, faults: 0, @@ -142,6 +143,7 @@ fn stake_hard_slash() -> Result<(), PiecrustError> { amount: Some(StakeAmount { value: stake_amount, eligibility: block_height, + locked: 0, }), nonce: 0, faults: 0, diff --git a/contracts/stake/tests/stake.rs b/contracts/stake/tests/stake.rs index 7501bb2f94..8c8d4d72b2 100644 --- a/contracts/stake/tests/stake.rs +++ b/contracts/stake/tests/stake.rs @@ -15,7 +15,7 @@ use execution_core::{ signatures::bls::{PublicKey as BlsPublicKey, SecretKey as BlsSecretKey}, stake::{Stake, StakeData, Withdraw as StakeWithdraw, STAKE_CONTRACT}, transfer::{ - contract_exec::ContractCall, + data::ContractCall, phoenix::{ PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, @@ -26,7 +26,7 @@ use execution_core::{ }; use crate::common::assert::assert_event; -use crate::common::init::instantiate; +use crate::common::init::{instantiate, CHAIN_ID}; use crate::common::utils::*; const GENESIS_VALUE: u64 = dusk(1_000_000.0); @@ -71,8 +71,11 @@ fn stake_withdraw_unstake() { let input_note_pos = 0; let deposit = INITIAL_STAKE; + let chain_id = + chain_id(&mut session).expect("Getting the chain ID should succeed"); + // Fashion a Stake struct - let stake = Stake::new(&stake_sk, deposit, 1); + let stake = Stake::new(&stake_sk, deposit, 1, chain_id); let stake_bytes = rkyv::to_bytes::<_, 1024>(&stake) .expect("Should serialize Stake correctly") .to_vec(); @@ -230,7 +233,7 @@ fn stake_withdraw_unstake() { // set different block height so that the new notes are easily located and // filtered let base = session.commit().expect("Committing should succeed"); - let mut session = rusk_abi::new_session(vm, base, 2) + let mut session = rusk_abi::new_session(vm, base, CHAIN_ID, 2) .expect("Instantiating new session should succeed"); let receipt = @@ -344,7 +347,7 @@ fn stake_withdraw_unstake() { // filtered // sets the block height for all subsequent operations to 1 let base = session.commit().expect("Committing should succeed"); - let mut session = rusk_abi::new_session(vm, base, 3) + let mut session = rusk_abi::new_session(vm, base, CHAIN_ID, 3) .expect("Instantiating new session should succeed"); let receipt = diff --git a/contracts/transfer/Cargo.toml b/contracts/transfer/Cargo.toml index ec98377d4a..2749ab73cc 100644 --- a/contracts/transfer/Cargo.toml +++ b/contracts/transfer/Cargo.toml @@ -9,7 +9,6 @@ crate-type = ["cdylib", "rlib"] [dependencies] execution-core = { version = "0.1.0", path = "../../execution-core" } dusk-bytes = "0.1" -poseidon-merkle = { version = "0.7", features = ["rkyv-impl"] } rkyv = { version = "0.7", default-features = false, features = ["size_32"] } ringbuffer = "0.15" diff --git a/contracts/transfer/src/lib.rs b/contracts/transfer/src/lib.rs index dc2a13d24f..7cc56f902c 100644 --- a/contracts/transfer/src/lib.rs +++ b/contracts/transfer/src/lib.rs @@ -43,6 +43,16 @@ unsafe fn convert(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |arg| STATE.convert(arg)) } +#[no_mangle] +unsafe fn transfer_to_contract(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |arg| STATE.transfer_to_contract(arg)) +} + +#[no_mangle] +unsafe fn transfer_to_account(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |arg| STATE.transfer_to_account(arg)) +} + // Queries #[no_mangle] @@ -77,6 +87,11 @@ unsafe fn num_notes(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |_: ()| STATE.num_notes()) } +#[no_mangle] +unsafe fn chain_id(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |_: ()| STATE.chain_id()) +} + // "Feeder" queries #[no_mangle] @@ -89,6 +104,13 @@ unsafe fn leaves_from_pos(arg_len: u32) -> u32 { rusk_abi::wrap_call(arg_len, |pos| STATE.leaves_from_pos(pos)) } +#[no_mangle] +unsafe fn sync(arg_len: u32) -> u32 { + rusk_abi::wrap_call(arg_len, |(from, count_limint)| { + STATE.sync(from, count_limint) + }) +} + // "Management" transactions #[no_mangle] diff --git a/contracts/transfer/src/state.rs b/contracts/transfer/src/state.rs index 521edc7002..c550f7ddc4 100644 --- a/contracts/transfer/src/state.rs +++ b/contracts/transfer/src/state.rs @@ -13,7 +13,6 @@ use alloc::collections::{BTreeMap, BTreeSet}; use alloc::vec::Vec; use dusk_bytes::Serializable; -use poseidon_merkle::Opening as PoseidonOpening; use ringbuffer::{ConstGenericRingBuffer, RingBuffer}; use execution_core::{ @@ -22,13 +21,14 @@ use execution_core::{ transfer::{ moonlight::{AccountData, Transaction as MoonlightTransaction}, phoenix::{ - Note, Sender, Transaction as PhoenixTransaction, TreeLeaf, - NOTES_TREE_DEPTH, + Note, NoteLeaf, NoteOpening, Sender, + Transaction as PhoenixTransaction, }, withdraw::{ Withdraw, WithdrawReceiver, WithdrawReplayToken, WithdrawSignature, }, - Transaction, TRANSFER_CONTRACT, + ReceiveFromContract, Transaction, TransferToAccount, + TransferToContract, PANIC_NONCE_NOT_READY, TRANSFER_CONTRACT, }, BlsScalar, ContractError, ContractId, }; @@ -302,45 +302,141 @@ impl TransferState { } } + /// Transfer funds from one contract's balance to another. + /// + /// Contracts can call the function and expect that if it succeeds the funds + /// are succesfully transferred to the contract they specify. Contracts + /// receiving funds are expected to expose the function specified by the + /// sender, which is called using a [`ReceiveFromContract`] as argument. It + /// is recommended that the receiving contract check that the call + /// originates from the transfer contract, and subsequently run any logic it + /// may wish to handle the transfer - including panicking, which will + /// effectively reject the transfer. + /// + /// # Panics + /// The function will panic if it is not being called by a contract (or if + /// it is called by the transfer contract itself), if the call to the + /// receiving contract fails, or if the sending contract doesn't have enough + /// funds. + pub fn transfer_to_contract(&mut self, transfer: TransferToContract) { + let from = rusk_abi::caller() + .expect("A transfer to a contract must happen in the context of a transaction"); + + if from == TRANSFER_CONTRACT { + panic!("Cannot be called directly by the transfer contract"); + } + + let from_balance = self + .contract_balances + .get_mut(&from) + .expect("Caller must have a balance"); + + if *from_balance < transfer.value { + panic!("Caller must have enough balance"); + } + + *from_balance -= transfer.value; + + let to_balance = + self.contract_balances.entry(transfer.contract).or_insert(0); + + *to_balance += transfer.value; + + let receive = ReceiveFromContract { + contract: from, + value: transfer.value, + data: transfer.data, + }; + + rusk_abi::call(transfer.contract, &transfer.fn_name, &receive) + .expect("Calling receiver should succeed") + } + + /// Transfer funds from a contract balance to a Moonlight account. + /// + /// Contracts can call the function and expect that if it succeeds the funds + /// are successfully transferred to the account they specify. + /// + /// # Panics + /// The function will panic if it is not being called by a contract, if it + /// is called by the transfer contract itself, or if the calling contract + /// doesn't have enough funds. + pub fn transfer_to_account(&mut self, transfer: TransferToAccount) { + let from = rusk_abi::caller() + .expect("A transfer to an account must happen in the context of a transaction"); + + if from == TRANSFER_CONTRACT { + panic!("Cannot be called directly by the transfer contract"); + } + + let from_balance = self + .contract_balances + .get_mut(&from) + .expect("Caller must have a balance"); + + if *from_balance < transfer.value { + panic!("Caller must have enough balance"); + } + + let account = self + .accounts + .entry(transfer.account.to_bytes()) + .or_insert(EMPTY_ACCOUNT); + + *from_balance -= transfer.value; + account.balance += transfer.value; + } + /// The top level transaction execution function. /// - /// Delegates to [`Self::spend_and_execute_phoenix`] and - /// [`Self::spend_and_execute_moonlight`], depending on if the transaction + /// This will emplace the deposit in the state, if it exists - making it + /// available for any contracts called. + /// + /// [`refund`] **must** be called if this function doesn't panic, otherwise + /// we will have an inconsistent state. + /// + /// It delegate the spending phase to [`Self::spend_phoenix`] and + /// [`Self::spend_moonlight`], depending on if the transaction /// uses the Phoenix or the Moonlight models, respectively. + /// + /// Finally executes the contract call if present. + /// + /// # Panics + /// Any failure while spending will result in a panic. The contract expects + /// the environment to roll back any change in state. + /// + /// [`refund`]: [`TransferState::refund`] pub fn spend_and_execute( &mut self, tx: Transaction, ) -> Result, ContractError> { + transitory::put_transaction(tx); + let tx = transitory::unwrap_tx(); match tx { - Transaction::Phoenix(tx) => self.spend_and_execute_phoenix(tx), - Transaction::Moonlight(tx) => self.spend_and_execute_moonlight(tx), + Transaction::Phoenix(tx) => self.spend_phoenix(tx), + Transaction::Moonlight(tx) => self.spend_moonlight(tx), + } + match tx.call() { + Some(call) => { + rusk_abi::call_raw(call.contract, &call.fn_name, &call.fn_args) + } + None => Ok(Vec::new()), } } /// Spends the inputs and creates the given UTXO within the given phoenix - /// transaction, and executes the contract call if present. It performs - /// all checks necessary to ensure the transaction is valid - hash - /// matches, anchor has been a root of the tree, proof checks out, - /// etc... - /// - /// This will emplace the deposit in the state, if it exists - making it - /// available for any contracts called. - /// - /// [`refund`] **must** be called if this function succeeds, otherwise we - /// will have an inconsistent state. + /// transaction. It performs all checks necessary to ensure the transaction + /// is valid - hash matches, anchor has been a root of the tree, proof + /// checks out, etc... /// /// # Panics /// Any failure in the checks performed in processing the transaction will /// result in a panic. The contract expects the environment to roll back any /// change in state. - /// - /// [`refund`]: [`TransferState::refund`] - fn spend_and_execute_phoenix( - &mut self, - tx: PhoenixTransaction, - ) -> Result, ContractError> { - transitory::put_transaction(tx); - let phoenix_tx = transitory::unwrap_phoenix_tx(); + fn spend_phoenix(&mut self, phoenix_tx: &PhoenixTransaction) { + if phoenix_tx.chain_id() != self.chain_id() { + panic!("The tx must target the correct chain"); + } // panic if the root is invalid if !self.root_exists(phoenix_tx.root()) { @@ -364,39 +460,20 @@ impl TransferState { let block_height = rusk_abi::block_height(); self.tree .extend_notes(block_height, phoenix_tx.outputs().clone()); - - // perform contract call if present - let mut result = Ok(Vec::new()); - if let Some(call) = phoenix_tx.call() { - result = - rusk_abi::call_raw(call.contract, &call.fn_name, &call.fn_args); - } - - result } - /// Spends the amount available to the moonlight transaction, and executes - /// the contract call if present. It performs all checks necessary to ensure - /// the transaction is valid - signature check, available funds, etc... - /// - /// This will emplace the deposit in the state, if it exists - making it - /// available for any contracts called. - /// - /// [`refund`] **must** be called if this function succeeds, otherwise we - /// will have an inconsistent state. + /// Spends the amount available to the moonlight transaction. It performs + /// all checks necessary to ensure the transaction is valid - signature + /// check, available funds, etc... /// /// # Panics /// Any failure in the checks performed in processing the transaction will /// result in a panic. The contract expects the environment to roll back any /// change in state. - /// - /// [`refund`]: [`TransferState::refund`] - fn spend_and_execute_moonlight( - &mut self, - tx: MoonlightTransaction, - ) -> Result, ContractError> { - transitory::put_transaction(tx); - let moonlight_tx = transitory::unwrap_moonlight_tx(); + fn spend_moonlight(&mut self, moonlight_tx: &MoonlightTransaction) { + if moonlight_tx.chain_id() != self.chain_id() { + panic!("The tx must target the correct chain"); + } // check the signature is valid and made by `from` if !rusk_abi::verify_bls( @@ -440,8 +517,11 @@ impl TransferState { // transactions. Since this number is so large, we also // skip overflow checks. let incremented_nonce = account.nonce + 1; - if moonlight_tx.nonce() != incremented_nonce { - panic!("Invalid nonce"); + if moonlight_tx.nonce() < incremented_nonce { + panic!("Already used nonce"); + } + if moonlight_tx.nonce() > incremented_nonce { + panic!("{PANIC_NONCE_NOT_READY}",); } account.balance -= total_value; @@ -463,15 +543,6 @@ impl TransferState { let account = self.accounts.entry(key).or_insert(EMPTY_ACCOUNT); account.balance += moonlight_tx.value(); } - - // perform contract call if present - let mut result = Ok(Vec::new()); - if let Some(call) = moonlight_tx.call() { - result = - rusk_abi::call_raw(call.contract, &call.fn_name, &call.fn_args); - } - - result } /// Refund the previously performed transaction, taking into account the @@ -531,7 +602,7 @@ impl TransferState { /// Note: the method `update_root` needs to be called after the last note is /// pushed. pub fn push_note(&mut self, block_height: u64, note: Note) -> Note { - let tree_leaf = TreeLeaf { block_height, note }; + let tree_leaf = NoteLeaf { block_height, note }; let pos = self.tree.push(tree_leaf.clone()); rusk_abi::emit("TREE_LEAF", (pos, tree_leaf)); self.get_note(pos) @@ -549,8 +620,24 @@ impl TransferState { /// Feeds the host with the leaves in the tree, starting from the given /// position. pub fn leaves_from_pos(&self, pos: u64) { - for leaf in self.tree.leaves_pos(pos) { - rusk_abi::feed(leaf.clone()); + self.sync(pos, 0) + } + + /// Feeds the host with the leaves in the tree (up to `count_limit` + /// occurrences), starting from the given `from` position. + /// + /// If `count_limit` is 0 there is no occurrences limit` + pub fn sync(&self, from: u64, count_limit: u64) { + let iter = self.tree.leaves_pos(from); + + if count_limit == 0 { + for leaf in iter { + rusk_abi::feed(leaf.clone()); + } + } else { + for leaf in iter.take(count_limit as usize) { + rusk_abi::feed(leaf.clone()); + } } } @@ -571,10 +658,7 @@ impl TransferState { } /// Get the opening - pub fn opening( - &self, - pos: u64, - ) -> Option> { + pub fn opening(&self, pos: u64) -> Option { self.tree.opening(pos) } @@ -676,6 +760,10 @@ impl TransferState { let block_height = rusk_abi::block_height(); self.push_note(block_height, note) } + + pub fn chain_id(&self) -> u8 { + rusk_abi::chain_id() + } } fn verify_tx_proof(tx: &PhoenixTransaction) -> bool { diff --git a/contracts/transfer/src/tree.rs b/contracts/transfer/src/tree.rs index 958d51a633..160c560229 100644 --- a/contracts/transfer/src/tree.rs +++ b/contracts/transfer/src/tree.rs @@ -6,42 +6,38 @@ use alloc::vec::Vec; -use poseidon_merkle::{ - Item as PoseidonItem, Opening as PoseidonOpening, Tree as PoseidonTree, -}; - use execution_core::{ - transfer::phoenix::{Note, TreeLeaf, NOTES_TREE_DEPTH}, + transfer::phoenix::{Note, NoteLeaf, NoteOpening, NoteTreeItem, NotesTree}, BlsScalar, }; pub struct Tree { - tree: PoseidonTree<(), NOTES_TREE_DEPTH>, + tree: NotesTree, // Since `dusk-merkle` does not include data blocks with the tree, we do it // here. - leaves: Vec, + leaves: Vec, } impl Tree { pub const fn new() -> Self { Self { - tree: PoseidonTree::new(), + tree: NotesTree::new(), leaves: Vec::new(), } } - pub fn get(&self, pos: u64) -> Option { + pub fn get(&self, pos: u64) -> Option { self.leaves.get(pos as usize).cloned() } - pub fn push(&mut self, mut leaf: TreeLeaf) -> u64 { + pub fn push(&mut self, mut leaf: NoteLeaf) -> u64 { // update the position before computing the hash let pos = self.leaves.len() as u64; leaf.note.set_pos(pos); // compute the item that goes in the leaf of the tree let hash = rusk_abi::poseidon_hash(leaf.note.hash_inputs().to_vec()); - let item = PoseidonItem { hash, data: () }; + let item = NoteTreeItem { hash, data: () }; self.tree.insert(pos, item); self.leaves.push(leaf); @@ -57,7 +53,7 @@ impl Tree { for note in notes { // skip transparent notes with a value of 0 if !note.value(None).is_ok_and(|value| value == 0) { - self.push(TreeLeaf { block_height, note }); + self.push(NoteLeaf { block_height, note }); } } } @@ -68,7 +64,7 @@ impl Tree { /// Return an iterator through the leaves in the tree, starting from a given /// `height`. - pub fn leaves(&self, height: u64) -> impl Iterator { + pub fn leaves(&self, height: u64) -> impl Iterator { // We can do this since we know the leaves are strictly increasing in // block height. If this ever changes - such as in the case of a // sparsely populated tree - we should annotate the tree and use @@ -80,7 +76,7 @@ impl Tree { /// Return an iterator through the leaves in the tree, starting from a given /// `position`. - pub fn leaves_pos(&self, pos: u64) -> impl Iterator { + pub fn leaves_pos(&self, pos: u64) -> impl Iterator { // We can do this since we know the leaves are strictly increasing in // block height. If this ever changes - such as in the case of a // sparsely populated tree - we should annotate the tree and use @@ -92,10 +88,7 @@ impl Tree { self.leaves[pos..].iter() } - pub fn opening( - &self, - pos: u64, - ) -> Option> { + pub fn opening(&self, pos: u64) -> Option { self.tree.opening(pos) } diff --git a/contracts/transfer/tests/common/utils.rs b/contracts/transfer/tests/common/utils.rs index 79393f502f..5a487fa4e5 100644 --- a/contracts/transfer/tests/common/utils.rs +++ b/contracts/transfer/tests/common/utils.rs @@ -9,11 +9,11 @@ use std::sync::mpsc; use execution_core::{ signatures::bls::PublicKey as AccountPublicKey, transfer::{ - contract_exec::ContractExec, + data::TransactionData, moonlight::AccountData, phoenix::{ - Note, PublicKey, SecretKey, Transaction as PhoenixTransaction, - TreeLeaf, ViewKey, NOTES_TREE_DEPTH, + Note, NoteLeaf, NoteOpening, NoteTreeItem, PublicKey, SecretKey, + Transaction as PhoenixTransaction, ViewKey, }, Transaction, TRANSFER_CONTRACT, }, @@ -22,7 +22,6 @@ use execution_core::{ use rusk_abi::{CallReceipt, PiecrustError, Session}; use rusk_prover::LocalProver; -use poseidon_merkle::Opening as PoseidonOpening; use rand::rngs::StdRng; const GAS_LIMIT: u64 = 0x10_000_000; @@ -30,7 +29,7 @@ const GAS_LIMIT: u64 = 0x10_000_000; pub fn leaves_from_height( session: &mut Session, height: u64, -) -> Result, PiecrustError> { +) -> Result, PiecrustError> { let (feeder, receiver) = mpsc::channel(); session.feeder_call::<_, ()>( @@ -50,7 +49,7 @@ pub fn leaves_from_height( pub fn leaves_from_pos( session: &mut Session, pos: u64, -) -> Result, PiecrustError> { +) -> Result, PiecrustError> { let (feeder, receiver) = mpsc::channel(); session.feeder_call::<_, ()>( @@ -106,12 +105,18 @@ pub fn contract_balance( pub fn opening( session: &mut Session, pos: u64, -) -> Result>, PiecrustError> { +) -> Result, PiecrustError> { session .call(TRANSFER_CONTRACT, "opening", &pos, GAS_LIMIT) .map(|r| r.data) } +pub fn chain_id(session: &mut Session) -> Result { + session + .call(TRANSFER_CONTRACT, "chain_id", &(), GAS_LIMIT) + .map(|r| r.data) +} + /// Executes a transaction. /// Returns result containing gas spent. pub fn execute( @@ -183,7 +188,7 @@ pub fn create_phoenix_transaction( transfer_value: u64, obfuscated_transaction: bool, deposit: u64, - exec: Option>, + data: Option>, ) -> PhoenixTransaction { // Get the root of the tree of phoenix-notes. let root = root(session).expect("Getting the anchor should be successful"); @@ -206,14 +211,14 @@ pub fn create_phoenix_transaction( .expect("An opening should exist for a note in the tree"); // sanity check of the merkle opening - assert!(opening.verify(poseidon_merkle::Item::new( - rusk_abi::poseidon_hash(note.hash_inputs().to_vec()), - () - ))); + assert!(opening.verify(NoteTreeItem::new(note.hash(), ()))); inputs.push((note.clone(), opening)); } + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + PhoenixTransaction::new::( rng, sender_sk, @@ -226,7 +231,8 @@ pub fn create_phoenix_transaction( deposit, gas_limit, gas_price, - exec.map(Into::into), + chain_id, + data.map(Into::into), ) .expect("creating the creation shouldn't fail") } diff --git a/contracts/transfer/tests/transfer.rs b/contracts/transfer/tests/transfer.rs index ed5f8619fb..b4149d46dd 100644 --- a/contracts/transfer/tests/transfer.rs +++ b/contracts/transfer/tests/transfer.rs @@ -7,7 +7,7 @@ pub mod common; use crate::common::utils::{ - account, contract_balance, create_phoenix_transaction, execute, + account, chain_id, contract_balance, create_phoenix_transaction, execute, filter_notes_owned_by, leaves_from_height, leaves_from_pos, num_notes, owned_notes_value, update_root, }; @@ -23,16 +23,16 @@ use execution_core::{ PublicKey as AccountPublicKey, SecretKey as AccountSecretKey, }, transfer::{ - contract_exec::{ContractCall, ContractExec}, + data::{ContractCall, TransactionData}, moonlight::Transaction as MoonlightTransaction, phoenix::{ Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, }, withdraw::{Withdraw, WithdrawReceiver, WithdrawReplayToken}, - TRANSFER_CONTRACT, + TransferToAccount, TransferToContract, TRANSFER_CONTRACT, }, - ContractId, JubJubScalar, LUX, + ContractError, ContractId, JubJubScalar, LUX, }; use rusk_abi::{ContractData, Session, VM}; @@ -53,6 +53,7 @@ const BOB_ID: ContractId = { }; const OWNER: [u8; 32] = [0; 32]; +const CHAIN_ID: u8 = 0xFA; /// Instantiate the virtual machine with the transfer contract deployed, with a /// single note carrying the `GENESIS_VALUE` owned by the given public key. @@ -69,10 +70,10 @@ fn instantiate( "../../../target/dusk/wasm32-unknown-unknown/release/alice.wasm" ); let bob_bytecode = include_bytes!( - "../../../target/dusk/wasm32-unknown-unknown/release/alice.wasm" + "../../../target/dusk/wasm32-unknown-unknown/release/bob.wasm" ); - let mut session = rusk_abi::new_genesis_session(vm); + let mut session = rusk_abi::new_genesis_session(vm, CHAIN_ID); session .deploy( @@ -95,7 +96,10 @@ fn instantiate( session .deploy( bob_bytecode, - ContractData::builder().owner(OWNER).contract_id(BOB_ID), + ContractData::builder() + .owner(OWNER) + .contract_id(BOB_ID) + .init_arg(&1u8), GAS_LIMIT, ) .expect("Deploying the bob contract should succeed"); @@ -137,7 +141,7 @@ fn instantiate( // sets the block height for all subsequent operations to 1 let base = session.commit().expect("Committing should succeed"); - rusk_abi::new_session(vm, base, 1) + rusk_abi::new_session(vm, base, CHAIN_ID, 1) .expect("Instantiating new session should succeed") } @@ -265,6 +269,9 @@ fn moonlight_transfer() { "The receiver account should be empty" ); + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + let transaction = MoonlightTransaction::new( &moonlight_sender_sk, Some(moonlight_receiver_pk), @@ -273,8 +280,10 @@ fn moonlight_transfer() { GAS_LIMIT, LUX, sender_account.nonce + 1, - None::, - ); + chain_id, + None::, + ) + .expect("Creating moonlight transaction should succeed"); let gas_spent = execute(session, transaction) .expect("Transaction should succeed") @@ -396,6 +405,9 @@ fn moonlight_alice_ping() { "The account should have the genesis value" ); + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + let transaction = MoonlightTransaction::new( &moonlight_sk, None, @@ -404,8 +416,10 @@ fn moonlight_alice_ping() { GAS_LIMIT, LUX, acc.nonce + 1, + chain_id, contract_call, - ); + ) + .expect("Creating moonlight transaction should succeed"); let gas_spent = execute(session, transaction) .expect("Transaction should succeed") @@ -750,6 +764,9 @@ fn moonlight_to_phoenix_swap() { .to_vec(), }; + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + let tx = MoonlightTransaction::new( &moonlight_sk, None, @@ -758,8 +775,10 @@ fn moonlight_to_phoenix_swap() { GAS_LIMIT, LUX, nonce, + chain_id, Some(contract_call), - ); + ) + .expect("Creating moonlight transaction should succeed"); let gas_spent = execute(&mut session, tx) .expect("Executing transaction should succeed") @@ -849,6 +868,9 @@ fn swap_wrong_contract_targeted() { .to_vec(), }; + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + let tx = MoonlightTransaction::new( &moonlight_sk, None, @@ -857,8 +879,10 @@ fn swap_wrong_contract_targeted() { GAS_LIMIT, LUX, nonce, + chain_id, Some(contract_call), - ); + ) + .expect("Creating moonlight transaction should succeed"); let receipt = execute(&mut session, tx) .expect("Executing transaction should succeed"); @@ -887,3 +911,503 @@ fn swap_wrong_contract_targeted() { assert!(notes.is_empty(), "A new note should not been created"); } + +/// In this test we deposit some Dusk to the Alice contract, and subsequently +/// proceed to call Alice's `transfer_to_contract` function, targetting Bob as +/// the receiver of the transfer. +#[test] +fn transfer_to_contract() { + const DEPOSIT_VALUE: u64 = MOONLIGHT_GENESIS_VALUE / 2; + const TRANSFER_VALUE: u64 = DEPOSIT_VALUE / 2; + + let rng = &mut StdRng::seed_from_u64(0xfeeb); + + let vm = &mut rusk_abi::new_ephemeral_vm() + .expect("Creating ephemeral VM should work"); + + let phoenix_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); + + let moonlight_sk = AccountSecretKey::random(rng); + let moonlight_pk = AccountPublicKey::from(&moonlight_sk); + + let session = &mut instantiate(rng, vm, &phoenix_pk, &moonlight_pk); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + let bob_balance = contract_balance(session, BOB_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, MOONLIGHT_GENESIS_VALUE, + "The depositer account should have the genesis value" + ); + assert_eq!( + alice_balance, 0, + "Alice must have an initial balance of zero" + ); + assert_eq!(bob_balance, 0, "Bob must have an initial balance of zero"); + + let fn_args = rkyv::to_bytes::<_, 256>(&DEPOSIT_VALUE) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("deposit"), + fn_args, + }); + + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + DEPOSIT_VALUE, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_deposit = receipt.gas_spent; + + println!("MOONLIGHT DEPOSIT: {:?}", receipt.data); + println!("MOONLIGHT DEPOSIT: {gas_spent_deposit} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + let bob_balance = contract_balance(session, BOB_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE - gas_spent_deposit - DEPOSIT_VALUE, + "The account should decrease by the amount spent and the deposit sent" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE, + "Alice must have the deposit in their balance" + ); + assert_eq!(bob_balance, 0, "Bob must have a balance of zero"); + + let transfer = TransferToContract { + contract: BOB_ID, + value: TRANSFER_VALUE, + fn_name: String::from("recv_transfer"), + data: vec![], + }; + let fn_args = rkyv::to_bytes::<_, 256>(&transfer) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("transfer_to_contract"), + fn_args, + }); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + 0, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_send = receipt.gas_spent; + + println!("MOONLIGHT SEND_TO_CONTRACT: {:?}", receipt.data); + println!("MOONLIGHT SEND_TO_CONTRACT: {gas_spent_send} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + let bob_balance = contract_balance(session, BOB_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE + - gas_spent_deposit + - gas_spent_send + - DEPOSIT_VALUE, + "The account should decrease by the amount spent and the deposit sent" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE - TRANSFER_VALUE, + "Alice must have the deposit minus the transferred amount in their balance" + ); + assert_eq!( + bob_balance, TRANSFER_VALUE, + "Bob must have the transfer value as balance" + ); +} + +/// In this test we deposit some Dusk from a moonlight account to the Alice +/// contract, and subsequently call the Alice contract to trigger a transfer +/// back to the same account. +#[test] +fn transfer_to_account() { + const DEPOSIT_VALUE: u64 = MOONLIGHT_GENESIS_VALUE / 2; + const TRANSFER_VALUE: u64 = DEPOSIT_VALUE / 2; + + let rng = &mut StdRng::seed_from_u64(0xfeeb); + + let vm = &mut rusk_abi::new_ephemeral_vm() + .expect("Creating ephemeral VM should work"); + + let phoenix_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); + + let moonlight_sk = AccountSecretKey::random(rng); + let moonlight_pk = AccountPublicKey::from(&moonlight_sk); + + let session = &mut instantiate(rng, vm, &phoenix_pk, &moonlight_pk); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, MOONLIGHT_GENESIS_VALUE, + "The depositer account should have the genesis value" + ); + assert_eq!( + alice_balance, 0, + "Alice must have an initial balance of zero" + ); + + let fn_args = rkyv::to_bytes::<_, 256>(&DEPOSIT_VALUE) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("deposit"), + fn_args, + }); + + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + DEPOSIT_VALUE, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_deposit = receipt.gas_spent; + + println!("MOONLIGHT DEPOSIT: {:?}", receipt.data); + println!("MOONLIGHT DEPOSIT: {gas_spent_deposit} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE - gas_spent_deposit - DEPOSIT_VALUE, + "The account should decrease by the amount spent and the deposit sent" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE, + "Alice must have the deposit in their balance" + ); + + let transfer = TransferToAccount { + account: moonlight_pk, + value: TRANSFER_VALUE, + }; + let fn_args = rkyv::to_bytes::<_, 256>(&transfer) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("transfer_to_account"), + fn_args, + }); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + 0, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_send = receipt.gas_spent; + + println!("MOONLIGHT SEND_TO_ACCOUNT: {:?}", receipt.data); + println!("MOONLIGHT SEND_TO_ACCOUNT: {gas_spent_send} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE + - gas_spent_deposit + - gas_spent_send + - DEPOSIT_VALUE + + TRANSFER_VALUE, + "The account should decrease by the amount spent and the deposit sent, \ + and increase by the transfer" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE - TRANSFER_VALUE, + "Alice must have the deposit minus the transferred amount in their balance" + ); +} + +/// In this test we try to transfer some Dusk from a contract to an account, +/// when the contract doesn't have sufficient funds. +#[test] +fn transfer_to_account_insufficient_funds() { + // Transfer value larger than DEPOSIT + const DEPOSIT_VALUE: u64 = MOONLIGHT_GENESIS_VALUE / 2; + const TRANSFER_VALUE: u64 = 2 * DEPOSIT_VALUE; + + let rng = &mut StdRng::seed_from_u64(0xfeeb); + + let vm = &mut rusk_abi::new_ephemeral_vm() + .expect("Creating ephemeral VM should work"); + + let phoenix_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); + + let moonlight_sk = AccountSecretKey::random(rng); + let moonlight_pk = AccountPublicKey::from(&moonlight_sk); + + let session = &mut instantiate(rng, vm, &phoenix_pk, &moonlight_pk); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, MOONLIGHT_GENESIS_VALUE, + "The depositer account should have the genesis value" + ); + assert_eq!( + alice_balance, 0, + "Alice must have an initial balance of zero" + ); + + let fn_args = rkyv::to_bytes::<_, 256>(&DEPOSIT_VALUE) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("deposit"), + fn_args, + }); + + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + DEPOSIT_VALUE, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_deposit = receipt.gas_spent; + + println!("MOONLIGHT DEPOSIT: {:?}", receipt.data); + println!("MOONLIGHT DEPOSIT: {gas_spent_deposit} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE - gas_spent_deposit - DEPOSIT_VALUE, + "The account should decrease by the amount spent and the deposit sent" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE, + "Alice must have the deposit in their balance" + ); + + let transfer = TransferToAccount { + account: moonlight_pk, + value: TRANSFER_VALUE, + }; + let fn_args = rkyv::to_bytes::<_, 256>(&transfer) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: ALICE_ID, + fn_name: String::from("transfer_to_account"), + fn_args, + }); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + 0, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_send = receipt.gas_spent; + + println!( + "MOONLIGHT SEND_TO_ACCOUNT INSUFFICIENT FUNDS: {:?}", + receipt.data + ); + println!( + "MOONLIGHT SEND_TO_ACCOUNT INSUFFICIENT_FUNDS: {gas_spent_send} gas" + ); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + let alice_balance = contract_balance(session, ALICE_ID) + .expect("Querying the contract balance should succeed"); + + assert!( + matches!(receipt.data, Err(_)), + "Alice should error because the transfer contract panics" + ); + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE + - gas_spent_deposit + - gas_spent_send + - DEPOSIT_VALUE, + "The account should decrease by the amount spent and the deposit sent" + ); + assert_eq!( + alice_balance, DEPOSIT_VALUE, + "Alice must have the deposit amount still in their balance" + ); +} + +/// In this test we try to call the function directly - i.e. not initiated by a +/// contract, but by the transaction itself. +#[test] +fn transfer_to_account_direct_call() { + const TRANSFER_VALUE: u64 = MOONLIGHT_GENESIS_VALUE / 2; + + let rng = &mut StdRng::seed_from_u64(0xfeeb); + + let vm = &mut rusk_abi::new_ephemeral_vm() + .expect("Creating ephemeral VM should work"); + + let phoenix_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); + + let moonlight_sk = AccountSecretKey::random(rng); + let moonlight_pk = AccountPublicKey::from(&moonlight_sk); + + let session = &mut instantiate(rng, vm, &phoenix_pk, &moonlight_pk); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + + assert_eq!( + acc.balance, MOONLIGHT_GENESIS_VALUE, + "The depositer account should have the genesis value" + ); + + let transfer = TransferToAccount { + account: moonlight_pk, + value: TRANSFER_VALUE, + }; + let fn_args = rkyv::to_bytes::<_, 256>(&transfer) + .expect("Serializing should succeed") + .to_vec(); + let contract_call = Some(ContractCall { + contract: TRANSFER_CONTRACT, + fn_name: String::from("transfer_to_account"), + fn_args, + }); + + let chain_id = + chain_id(session).expect("Getting the chain ID should succeed"); + + let transaction = MoonlightTransaction::new( + &moonlight_sk, + None, + 0, + 0, + GAS_LIMIT, + LUX, + acc.nonce + 1, + chain_id, + contract_call, + ) + .expect("Creating moonlight transaction should succeed"); + + let receipt = + execute(session, transaction).expect("Transaction should succeed"); + let gas_spent_send = receipt.gas_spent; + + println!("MOONLIGHT SEND_TO_ACCOUNT DIRECTLY: {:?}", receipt.data); + println!("MOONLIGHT SEND_TO_ACCOUNT DIRECTLY: {gas_spent_send} gas"); + + let acc = account(session, &moonlight_pk) + .expect("Getting the account should succeed"); + + assert!( + matches!(receipt.data, Err(ContractError::Panic(_))), + "The transfer contract should panic on a direct call" + ); + assert_eq!( + acc.balance, + MOONLIGHT_GENESIS_VALUE - gas_spent_send, + "The account should decrease by the amount spent" + ); +} diff --git a/execution-core/CHANGELOG.md b/execution-core/CHANGELOG.md index 5df7c16c53..413f91d0e0 100644 --- a/execution-core/CHANGELOG.md +++ b/execution-core/CHANGELOG.md @@ -48,10 +48,13 @@ signatures::{ } } transfer::{ - contract_exec::{ + TransferToContract; + ReceiveFromContract; + TransferToAccount; + data::{ ContractBytecode; ContractCall; - ContractExec; + TransactionData; }; moonlight::{ AccountData; diff --git a/execution-core/Cargo.toml b/execution-core/Cargo.toml index e47293aed5..3a909f8be5 100644 --- a/execution-core/Cargo.toml +++ b/execution-core/Cargo.toml @@ -12,7 +12,7 @@ jubjub-schnorr = { version = "0.5", default-features = false, features = ["rkyv- phoenix-core = { version = "0.32", default-features = false, features = ["rkyv-impl", "alloc"] } phoenix-circuits = { version = "0.4", default-features = false } poseidon-merkle = { version = "0.7", features = ["rkyv-impl"] } -piecrust-uplink = { version = "0.16" } +piecrust-uplink = { version = "0.17" } dusk-bytes = "0.1" rkyv = { version = "0.7", default-features = false, features = ["size_32"] } bytecheck = { version = "0.6", default-features = false } diff --git a/execution-core/src/error.rs b/execution-core/src/error.rs index b2b68e5dfe..a82ae39fca 100644 --- a/execution-core/src/error.rs +++ b/execution-core/src/error.rs @@ -30,6 +30,11 @@ pub enum Error { InvalidChar(char, usize), /// Rkyv serialization. Rkyv(String), + /// The provided memo is too large. Contains the memo size used. The max + /// size is [`MAX_MEMO_SIZE`]. + /// + /// [`MAX_MEMO_SIZE`]: crate::transfer::data::MAX_MEMO_SIZE + MemoTooLarge(usize), } impl fmt::Display for Error { diff --git a/execution-core/src/stake.rs b/execution-core/src/stake.rs index 2fcabc2694..eb6066c665 100644 --- a/execution-core/src/stake.rs +++ b/execution-core/src/stake.rs @@ -43,6 +43,7 @@ pub const fn next_epoch(block_height: u64) -> u64 { #[derive(Debug, Clone, PartialEq, Eq, Archive, Serialize, Deserialize)] #[archive_attr(derive(CheckBytes))] pub struct Stake { + chain_id: u8, account: BlsPublicKey, value: u64, nonce: u64, @@ -50,12 +51,18 @@ pub struct Stake { } impl Stake { - const MESSAGE_SIZE: usize = BlsPublicKey::SIZE + u64::SIZE + u64::SIZE; + const MESSAGE_SIZE: usize = 1 + BlsPublicKey::SIZE + u64::SIZE + u64::SIZE; /// Create a new stake. #[must_use] - pub fn new(sk: &BlsSecretKey, value: u64, nonce: u64) -> Self { + pub fn new( + sk: &BlsSecretKey, + value: u64, + nonce: u64, + chain_id: u8, + ) -> Self { let mut stake = Stake { + chain_id, account: BlsPublicKey::from(sk), value, nonce, @@ -91,6 +98,12 @@ impl Stake { self.nonce } + /// Returns the chain ID of the stake. + #[must_use] + pub fn chain_id(&self) -> u8 { + self.chain_id + } + /// Signature of the stake. #[must_use] pub fn signature(&self) -> &BlsSignature { @@ -102,7 +115,8 @@ impl Stake { pub fn signature_message(&self) -> [u8; Self::MESSAGE_SIZE] { let mut bytes = [0u8; Self::MESSAGE_SIZE]; - let mut offset = 0; + bytes[0] = self.chain_id; + let mut offset = 1; bytes[offset..offset + BlsPublicKey::SIZE] .copy_from_slice(&self.account.to_bytes()); @@ -182,11 +196,21 @@ impl Withdraw { pub struct StakeEvent { /// Account associated to the event. pub account: BlsPublicKey, - /// Value of the relevant operation, be it `stake`, `unstake`, `withdraw`, - /// `reward`, or `slash`. + /// Value of the relevant operation, be it `stake`, `reward` or `slash`. + /// + /// In case of `suspended` the amount refers to the next eligibility pub value: u64, - /// The receiver of the action, relevant in `withdraw` and `unstake` - /// operations. +} + +/// Event emitted after a stake contract operation is performed. +#[derive(Debug, Clone, Archive, Deserialize, Serialize)] +#[archive_attr(derive(CheckBytes))] +pub struct StakeWithReceiverEvent { + /// Account associated to the event. + pub account: BlsPublicKey, + /// Value of the relevant operation, be it `unstake` or `withdraw`. + pub value: u64, + /// The receiver of the action pub receiver: Option, } @@ -254,7 +278,11 @@ impl StakeData { ) -> Self { let amount = match value { 0 => None, - _ => Some(StakeAmount { value, eligibility }), + _ => Some(StakeAmount { + value, + eligibility, + locked: 0, + }), }; Self { @@ -357,6 +385,8 @@ impl Serializable for StakeData { pub struct StakeAmount { /// The value staked. pub value: u64, + /// The amount that has been locked (due to a soft slash). + pub locked: u64, /// The eligibility of the stake. pub eligibility: u64, } @@ -373,7 +403,11 @@ impl StakeAmount { /// the `eligibility`. #[must_use] pub const fn with_eligibility(value: u64, eligibility: u64) -> Self { - Self { value, eligibility } + Self { + value, + eligibility, + locked: 0, + } } /// Compute the eligibility of a stake from the starting block height. @@ -382,9 +416,14 @@ impl StakeAmount { let maturity_blocks = EPOCH; next_epoch(block_height) + maturity_blocks } + /// Move `amount` to locked value + pub fn lock_amount(&mut self, amount: u64) { + self.value -= amount; + self.locked += amount; + } } -const STAKE_AMOUNT_SIZE: usize = u64::SIZE + u64::SIZE; +const STAKE_AMOUNT_SIZE: usize = u64::SIZE + u64::SIZE + u64::SIZE; impl Serializable for StakeAmount { type Error = dusk_bytes::Error; @@ -396,9 +435,14 @@ impl Serializable for StakeAmount { let mut buf = &buf[..]; let value = u64::from_reader(&mut buf)?; + let locked = u64::from_reader(&mut buf)?; let eligibility = u64::from_reader(&mut buf)?; - Ok(Self { value, eligibility }) + Ok(Self { + value, + locked, + eligibility, + }) } #[allow(unused_must_use)] @@ -407,6 +451,7 @@ impl Serializable for StakeAmount { let mut writer = &mut buf[..]; writer.write(&self.value.to_bytes()); + writer.write(&self.locked.to_bytes()); writer.write(&self.eligibility.to_bytes()); buf diff --git a/execution-core/src/transfer.rs b/execution-core/src/transfer.rs index 910457e4d8..bd1dd4b1bc 100644 --- a/execution-core/src/transfer.rs +++ b/execution-core/src/transfer.rs @@ -7,7 +7,9 @@ //! Types related to Dusk's transfer contract that are shared across the //! network. +use alloc::string::String; use alloc::vec::Vec; + use core::fmt::Debug; use bytecheck::CheckBytes; @@ -23,7 +25,7 @@ use crate::{ BlsScalar, ContractId, Error, }; -pub mod contract_exec; +pub mod data; pub mod moonlight; pub mod phoenix; pub mod withdraw; @@ -31,7 +33,10 @@ pub mod withdraw; /// ID of the genesis transfer contract pub const TRANSFER_CONTRACT: ContractId = crate::reserved(0x1); -use contract_exec::{ContractCall, ContractDeploy, ContractExec}; +/// Panic of "Nonce not ready to be used yet" +pub const PANIC_NONCE_NOT_READY: &str = "Nonce not ready to be used yet"; + +use data::{ContractCall, ContractDeploy, TransactionData}; use moonlight::Transaction as MoonlightTransaction; use phoenix::{ Note, Prove, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, @@ -73,7 +78,8 @@ impl Transaction { deposit: u64, gas_limit: u64, gas_price: u64, - exec: Option>, + chain_id: u8, + data: Option>, ) -> Result { Ok(Self::Phoenix(PhoenixTransaction::new::( rng, @@ -87,12 +93,16 @@ impl Transaction { deposit, gas_limit, gas_price, - exec, + chain_id, + data, )?)) } /// Create a new moonlight transaction. - #[must_use] + /// + /// # Errors + /// The creation of a transaction is not possible and will error if: + /// - the memo, if given, is too large #[allow(clippy::too_many_arguments)] pub fn moonlight( from_sk: &AccountSecretKey, @@ -102,12 +112,13 @@ impl Transaction { gas_limit: u64, gas_price: u64, nonce: u64, - exec: Option>, - ) -> Self { - Self::Moonlight(MoonlightTransaction::new( + chain_id: u8, + data: Option>, + ) -> Result { + Ok(Self::Moonlight(MoonlightTransaction::new( from_sk, to_account, value, deposit, gas_limit, gas_price, nonce, - exec, - )) + chain_id, data, + )?)) } /// Return the sender of the account for Moonlight transactions. @@ -229,6 +240,15 @@ impl Transaction { } } + /// Returns the memo used with the transaction, if any. + #[must_use] + pub fn memo(&self) -> Option<&[u8]> { + match self { + Self::Phoenix(tx) => tx.memo(), + Self::Moonlight(tx) => tx.memo(), + } + } + /// Creates a modified clone of this transaction if it contains data for /// deployment, clones all fields except for the bytecode' 'bytes' part. /// Returns none if the transaction is not a deployment transaction. @@ -310,3 +330,42 @@ impl From for Transaction { Self::Moonlight(tx) } } + +/// The payload sent by a contract to the transfer contract to transfer some of +/// its funds to another contract. +#[derive(Debug, Clone, Archive, PartialEq, Eq, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct TransferToContract { + /// Contract to transfer funds to. + pub contract: ContractId, + /// Amount to send to the contract. + pub value: u64, + /// Function name to call on the contract. + pub fn_name: String, + /// Extra data sent along with [`ReceiveFromContract`] + pub data: Vec, +} + +/// The payload sent by the transfer contract to a contract receiving funds from +/// another contract. +#[derive(Debug, Clone, Archive, PartialEq, Eq, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct ReceiveFromContract { + /// Contract that sent the funds. + pub contract: ContractId, + /// Amount sent by the contract. + pub value: u64, + /// Extra data sent by the sender. + pub data: Vec, +} + +/// The payload sent by a contract to the transfer contract to transfer some of +/// its funds to an account. +#[derive(Debug, Clone, Archive, PartialEq, Eq, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct TransferToAccount { + /// Account to transfer funds to. + pub account: AccountPublicKey, + /// Amount to send to the account. + pub value: u64, +} diff --git a/execution-core/src/transfer/contract_exec.rs b/execution-core/src/transfer/data.rs similarity index 92% rename from execution-core/src/transfer/contract_exec.rs rename to execution-core/src/transfer/data.rs index ba744d3859..7ebeabf8b1 100644 --- a/execution-core/src/transfer/contract_exec.rs +++ b/execution-core/src/transfer/data.rs @@ -4,7 +4,8 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -//! Wrapper for a strip-able bytecode that we want to keep the integrity of. +//! Extra data that may be sent with the `data` field of either transaction +//! type. use alloc::format; use alloc::string::String; @@ -18,25 +19,32 @@ use rkyv::{ use crate::{ContractId, Error, ARGBUF_LEN}; +/// The maximum size of a memo. +pub const MAX_MEMO_SIZE: usize = 512; + /// Data for either contract call or contract deployment. #[derive(Debug, Clone, PartialEq, Eq, Archive, Serialize, Deserialize)] #[archive_attr(derive(CheckBytes))] -pub enum ContractExec { +#[allow(clippy::large_enum_variant)] +pub enum TransactionData { /// Data for a contract call. Call(ContractCall), /// Data for a contract deployment. Deploy(ContractDeploy), + /// Additional data added to a transaction, that is not a deployment or a + /// call. + Memo(Vec), } -impl From for ContractExec { +impl From for TransactionData { fn from(c: ContractCall) -> Self { - ContractExec::Call(c) + TransactionData::Call(c) } } -impl From for ContractExec { +impl From for TransactionData { fn from(d: ContractDeploy) -> Self { - ContractExec::Deploy(d) + TransactionData::Deploy(d) } } diff --git a/execution-core/src/transfer/moonlight.rs b/execution-core/src/transfer/moonlight.rs index a480d64b04..45d87ea0ef 100644 --- a/execution-core/src/transfer/moonlight.rs +++ b/execution-core/src/transfer/moonlight.rs @@ -18,10 +18,11 @@ use crate::{ PublicKey as AccountPublicKey, SecretKey as AccountSecretKey, Signature as AccountSignature, }, - transfer::contract_exec::{ - ContractBytecode, ContractCall, ContractDeploy, ContractExec, + transfer::data::{ + ContractBytecode, ContractCall, ContractDeploy, TransactionData, + MAX_MEMO_SIZE, }, - BlsScalar, + BlsScalar, Error, }; /// A Moonlight account's information. @@ -44,7 +45,10 @@ pub struct Transaction { impl Transaction { /// Create a new transaction. - #[must_use] + /// + /// # Errors + /// The creation of a transaction is not possible and will error if: + /// - the memo, if given, is too large #[allow(clippy::too_many_arguments)] pub fn new( from_sk: &AccountSecretKey, @@ -54,9 +58,19 @@ impl Transaction { gas_limit: u64, gas_price: u64, nonce: u64, - exec: Option>, - ) -> Self { + chain_id: u8, + data: Option>, + ) -> Result { + let data = data.map(Into::into); + + if let Some(TransactionData::Memo(memo)) = data.as_ref() { + if memo.len() > MAX_MEMO_SIZE { + return Err(Error::MemoTooLarge(memo.len())); + } + } + let payload = Payload { + chain_id, from_account: AccountPublicKey::from(from_sk), to_account, value, @@ -64,13 +78,13 @@ impl Transaction { gas_limit, gas_price, nonce, - exec: exec.map(Into::into), + data, }; let digest = payload.signature_message(); let signature = from_sk.sign(&digest); - Self { payload, signature } + Ok(Self { payload, signature }) } /// The proof of the transaction. @@ -121,12 +135,18 @@ impl Transaction { self.payload.nonce } + /// Returns the chain ID of the transaction. + #[must_use] + pub fn chain_id(&self) -> u8 { + self.payload.chain_id + } + /// Return the contract call data, if there is any. #[must_use] pub fn call(&self) -> Option<&ContractCall> { #[allow(clippy::match_wildcard_for_single_variants)] - match self.exec()? { - ContractExec::Call(ref c) => Some(c), + match self.data()? { + TransactionData::Call(ref c) => Some(c), _ => None, } } @@ -135,16 +155,25 @@ impl Transaction { #[must_use] pub fn deploy(&self) -> Option<&ContractDeploy> { #[allow(clippy::match_wildcard_for_single_variants)] - match self.exec()? { - ContractExec::Deploy(ref d) => Some(d), + match self.data()? { + TransactionData::Deploy(ref d) => Some(d), + _ => None, + } + } + + /// Returns the memo used with the transaction, if any. + #[must_use] + pub fn memo(&self) -> Option<&[u8]> { + match self.data()? { + TransactionData::Memo(memo) => Some(memo), _ => None, } } - /// Returns the contract execution, if it exists. + /// Returns the transaction data, if it exists. #[must_use] - fn exec(&self) -> Option<&ContractExec> { - self.payload.exec.as_ref() + fn data(&self) -> Option<&TransactionData> { + self.payload.data.as_ref() } /// Creates a modified clone of this transaction if it contains data for @@ -154,7 +183,7 @@ impl Transaction { pub fn strip_off_bytecode(&self) -> Option { let deploy = self.deploy()?; - let stripped_deploy = ContractExec::Deploy(ContractDeploy { + let stripped_deploy = TransactionData::Deploy(ContractDeploy { owner: deploy.owner.clone(), constructor_args: deploy.constructor_args.clone(), bytecode: ContractBytecode { @@ -165,7 +194,7 @@ impl Transaction { }); let mut stripped_transaction = self.clone(); - stripped_transaction.payload.exec = Some(stripped_deploy); + stripped_transaction.payload.data = Some(stripped_deploy); Some(stripped_transaction) } @@ -239,6 +268,8 @@ impl Transaction { #[derive(Debug, Clone, PartialEq, Eq, Archive, Serialize, Deserialize)] #[archive_attr(derive(CheckBytes))] struct Payload { + /// ID of the chain for this transaction to execute on. + pub chain_id: u8, /// Key of the sender of this transaction. pub from_account: AccountPublicKey, /// Key of the receiver of the funds. @@ -257,15 +288,15 @@ struct Payload { /// /// The current nonce is queryable via the transfer contract. pub nonce: u64, - /// Data to do a contract call or deployment. - pub exec: Option, + /// Data to do a contract call, deployment, or insert a memo. + pub data: Option, } impl Payload { /// Serialize the payload into a byte buffer. #[must_use] pub fn to_var_bytes(&self) -> Vec { - let mut bytes = Vec::new(); + let mut bytes = Vec::from([self.chain_id]); bytes.extend(self.from_account.to_bytes()); @@ -286,15 +317,20 @@ impl Payload { bytes.extend(self.gas_price.to_bytes()); bytes.extend(self.nonce.to_bytes()); - // serialize the contract call/deployment - match &self.exec { - Some(ContractExec::Deploy(deploy)) => { + // serialize the contract call, deployment or memo, if present. + match &self.data { + Some(TransactionData::Call(call)) => { + bytes.push(1); + bytes.extend(call.to_var_bytes()); + } + Some(TransactionData::Deploy(deploy)) => { bytes.push(2); bytes.extend(deploy.to_var_bytes()); } - Some(ContractExec::Call(call)) => { - bytes.push(1); - bytes.extend(call.to_var_bytes()); + Some(TransactionData::Memo(memo)) => { + bytes.push(3); + bytes.extend((memo.len() as u64).to_bytes()); + bytes.extend(memo); } _ => bytes.push(0), } @@ -309,6 +345,8 @@ impl Payload { pub fn from_slice(buf: &[u8]) -> Result { let mut buf = buf; + let chain_id = u8::from_reader(&mut buf)?; + let from_account = AccountPublicKey::from_reader(&mut buf)?; // deserialize recipient @@ -326,17 +364,32 @@ impl Payload { let gas_price = u64::from_reader(&mut buf)?; let nonce = u64::from_reader(&mut buf)?; - // deserialize contract call/deploy data - let exec = match u8::from_reader(&mut buf)? { + // deserialize contract call, deploy data, or memo, if present + let data = match u8::from_reader(&mut buf)? { 0 => None, - 1 => Some(ContractExec::Call(ContractCall::from_slice(buf)?)), - 2 => Some(ContractExec::Deploy(ContractDeploy::from_slice(buf)?)), + 1 => Some(TransactionData::Call(ContractCall::from_slice(buf)?)), + 2 => { + Some(TransactionData::Deploy(ContractDeploy::from_slice(buf)?)) + } + 3 => { + // we only build for 64-bit so this truncation is impossible + #[allow(clippy::cast_possible_truncation)] + let size = u64::from_reader(&mut buf)? as usize; + + if buf.len() != size || size > MAX_MEMO_SIZE { + return Err(BytesError::InvalidData); + } + + let memo = buf[..size].to_vec(); + Some(TransactionData::Memo(memo)) + } _ => { return Err(BytesError::InvalidData); } }; Ok(Self { + chain_id, from_account, to_account, value, @@ -344,7 +397,7 @@ impl Payload { gas_limit, gas_price, nonce, - exec, + data, }) } @@ -354,7 +407,7 @@ impl Payload { /// for hashing and *cannot* be used to deserialize the payload again. #[must_use] pub fn signature_message(&self) -> Vec { - let mut bytes = Vec::new(); + let mut bytes = Vec::from([self.chain_id]); bytes.extend(self.from_account.to_bytes()); if let Some(to) = &self.to_account { @@ -366,20 +419,23 @@ impl Payload { bytes.extend(self.gas_price.to_bytes()); bytes.extend(self.nonce.to_bytes()); - match &self.exec { - Some(ContractExec::Deploy(d)) => { + match &self.data { + Some(TransactionData::Deploy(d)) => { bytes.extend(&d.bytecode.to_hash_input_bytes()); bytes.extend(&d.owner); if let Some(constructor_args) = &d.constructor_args { bytes.extend(constructor_args); } } - Some(ContractExec::Call(c)) => { + Some(TransactionData::Call(c)) => { bytes.extend(c.contract.as_bytes()); bytes.extend(c.fn_name.as_bytes()); bytes.extend(&c.fn_args); } - _ => {} + Some(TransactionData::Memo(m)) => { + bytes.extend(m); + } + None => {} } bytes diff --git a/execution-core/src/transfer/phoenix.rs b/execution-core/src/transfer/phoenix.rs index ebd2cafbc1..666e5063c3 100644 --- a/execution-core/src/transfer/phoenix.rs +++ b/execution-core/src/transfer/phoenix.rs @@ -14,7 +14,6 @@ use bytecheck::CheckBytes; use dusk_bytes::{DeserializableSlice, Error as BytesError, Serializable}; use dusk_poseidon::{Domain, Hash}; use ff::Field; -use poseidon_merkle::Opening; use rand::{CryptoRng, RngCore}; use rkyv::{Archive, Deserialize, Serialize}; @@ -22,27 +21,51 @@ use crate::{ signatures::schnorr::{ SecretKey as SchnorrSecretKey, Signature as SchnorrSignature, }, - transfer::contract_exec::{ - ContractBytecode, ContractCall, ContractDeploy, ContractExec, + transfer::data::{ + ContractBytecode, ContractCall, ContractDeploy, TransactionData, + MAX_MEMO_SIZE, }, BlsScalar, Error, JubJubAffine, JubJubScalar, }; // phoenix types +pub use phoenix_circuits::{InputNoteInfo, OutputNoteInfo, TxCircuit}; pub use phoenix_core::{ value_commitment, Error as CoreError, Note, PublicKey, SecretKey, Sender, StealthAddress, TxSkeleton, ViewKey, NOTE_VAL_ENC_SIZE, OUTPUT_NOTES, }; -pub use phoenix_circuits::{InputNoteInfo, OutputNoteInfo, TxCircuit}; +/// The depth of the merkle tree of notes stored in the transfer-contract. +pub const NOTES_TREE_DEPTH: usize = 17; +/// The arity of the merkle tree of notes stored in the transfer-contract. +pub use poseidon_merkle::ARITY as NOTES_TREE_ARITY; +/// The merkle tree of notes stored in the transfer-contract. +pub type NotesTree = poseidon_merkle::Tree<(), NOTES_TREE_DEPTH>; +/// The merkle opening for a note-hash in the merkle tree of notes. +pub type NoteOpening = poseidon_merkle::Opening<(), NOTES_TREE_DEPTH>; +/// the tree item for the merkle-tree of notes stored in the transfer-contract. +pub type NoteTreeItem = poseidon_merkle::Item<()>; + +/// A leaf of the merkle tree of notes stored in the transfer-contract. +#[derive(Debug, Clone, PartialEq, Eq, Archive, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct NoteLeaf { + /// The height of the block when the note was inserted in the tree. + pub block_height: u64, + /// The note inserted in the tree. + pub note: Note, +} + +impl AsRef for NoteLeaf { + fn as_ref(&self) -> &Note { + &self.note + } +} /// Label used for the ZK transcript initialization. Must be the same for prover /// and verifier. pub const TRANSCRIPT_LABEL: &[u8] = b"dusk-network"; -/// The depth of the transfer tree. -pub const NOTES_TREE_DEPTH: usize = 17; - /// Phoenix transaction. #[derive(Debug, Clone, Archive, Serialize, Deserialize)] #[archive_attr(derive(CheckBytes))] @@ -71,6 +94,7 @@ impl Transaction { /// - the `inputs` vector is either empty or larger than 4 elements /// - the `inputs` vector contains duplicate `Note`s /// - the `Prove` trait is implemented incorrectly + /// - the memo, if given, is too large #[allow(clippy::too_many_lines)] #[allow(clippy::too_many_arguments)] #[allow(clippy::similar_names)] @@ -79,15 +103,24 @@ impl Transaction { sender_sk: &SecretKey, change_pk: &PublicKey, receiver_pk: &PublicKey, - inputs: Vec<(Note, Opening<(), NOTES_TREE_DEPTH>)>, + inputs: Vec<(Note, NoteOpening)>, root: BlsScalar, transfer_value: u64, obfuscated_transaction: bool, deposit: u64, gas_limit: u64, gas_price: u64, - exec: Option>, + chain_id: u8, + data: Option>, ) -> Result { + let data = data.map(Into::into); + + if let Some(TransactionData::Memo(memo)) = data.as_ref() { + if memo.len() > MAX_MEMO_SIZE { + return Err(Error::MemoTooLarge(memo.len())); + } + } + let sender_pk = PublicKey::from(sender_sk); let sender_vk = ViewKey::from(sender_sk); @@ -175,9 +208,10 @@ impl Transaction { deposit, }; let payload = Payload { + chain_id, tx_skeleton, fee, - exec: exec.map(Into::into), + data, }; let payload_hash = payload.hash(); @@ -356,6 +390,12 @@ impl Transaction { self.payload.fee.gas_price } + /// Returns the chain ID of the transaction. + #[must_use] + pub fn chain_id(&self) -> u8 { + self.payload.chain_id + } + /// Returns the max fee to be spend by the transaction. #[must_use] pub fn max_fee(&self) -> u64 { @@ -372,8 +412,8 @@ impl Transaction { #[must_use] pub fn call(&self) -> Option<&ContractCall> { #[allow(clippy::match_wildcard_for_single_variants)] - match self.exec()? { - ContractExec::Call(ref c) => Some(c), + match self.data()? { + TransactionData::Call(ref c) => Some(c), _ => None, } } @@ -382,16 +422,25 @@ impl Transaction { #[must_use] pub fn deploy(&self) -> Option<&ContractDeploy> { #[allow(clippy::match_wildcard_for_single_variants)] - match self.exec()? { - ContractExec::Deploy(ref d) => Some(d), + match self.data()? { + TransactionData::Deploy(ref d) => Some(d), + _ => None, + } + } + + /// Returns the memo used with the transaction, if any. + #[must_use] + pub fn memo(&self) -> Option<&[u8]> { + match self.data()? { + TransactionData::Memo(memo) => Some(memo), _ => None, } } - /// Returns the contract execution, if it exists. + /// Returns the transaction data, if it exists. #[must_use] - fn exec(&self) -> Option<&ContractExec> { - self.payload.exec.as_ref() + fn data(&self) -> Option<&TransactionData> { + self.payload.data.as_ref() } /// Creates a modified clone of this transaction if it contains data for @@ -401,7 +450,7 @@ impl Transaction { pub fn strip_off_bytecode(&self) -> Option { let deploy = self.deploy()?; - let stripped_deploy = ContractExec::Deploy(ContractDeploy { + let stripped_deploy = TransactionData::Deploy(ContractDeploy { owner: deploy.owner.clone(), constructor_args: deploy.constructor_args.clone(), bytecode: ContractBytecode { @@ -412,7 +461,7 @@ impl Transaction { }); let mut stripped_transaction = self.clone(); - stripped_transaction.payload.exec = Some(stripped_deploy); + stripped_transaction.payload.data = Some(stripped_deploy); Some(stripped_transaction) } @@ -556,12 +605,14 @@ impl Transaction { #[derive(Debug, Clone, Archive, Serialize, Deserialize)] #[archive_attr(derive(CheckBytes))] pub struct Payload { + /// ID of the chain for this transaction to execute on. + pub chain_id: u8, /// Transaction skeleton used for the phoenix transaction. pub tx_skeleton: TxSkeleton, /// Data used to calculate the transaction fee. pub fee: Fee, - /// Data to do a contract call or deployment. - pub exec: Option, + /// Data to do a contract call, deployment, or insert a memo. + pub data: Option, } impl PartialEq for Payload { @@ -576,7 +627,7 @@ impl Payload { /// Serialize the `Payload` into a variable length byte buffer. #[must_use] pub fn to_var_bytes(&self) -> Vec { - let mut bytes = Vec::new(); + let mut bytes = Vec::from([self.chain_id]); // serialize the tx-skeleton let skeleton_bytes = self.tx_skeleton.to_var_bytes(); @@ -586,15 +637,20 @@ impl Payload { // serialize the fee bytes.extend(self.fee.to_bytes()); - // serialize the contract call/deployment - match &self.exec { - Some(ContractExec::Deploy(deploy)) => { + // serialize the contract call, deployment or memo, if present. + match &self.data { + Some(TransactionData::Call(call)) => { + bytes.push(1); + bytes.extend(call.to_var_bytes()); + } + Some(TransactionData::Deploy(deploy)) => { bytes.push(2); bytes.extend(deploy.to_var_bytes()); } - Some(ContractExec::Call(call)) => { - bytes.push(1); - bytes.extend(call.to_var_bytes()); + Some(TransactionData::Memo(memo)) => { + bytes.push(3); + bytes.extend((memo.len() as u64).to_bytes()); + bytes.extend(memo); } _ => bytes.push(0), } @@ -609,6 +665,8 @@ impl Payload { pub fn from_slice(buf: &[u8]) -> Result { let mut buf = buf; + let chain_id = u8::from_reader(&mut buf)?; + // deserialize the tx-skeleton #[allow(clippy::cast_possible_truncation)] let skeleton_len = usize::try_from(u64::from_reader(&mut buf)?) @@ -619,20 +677,35 @@ impl Payload { // deserialize fee let fee = Fee::from_reader(&mut buf)?; - // deserialize contract call/deploy data - let exec = match u8::from_reader(&mut buf)? { + // deserialize contract call, deploy data, or memo, if present + let data = match u8::from_reader(&mut buf)? { 0 => None, - 1 => Some(ContractExec::Call(ContractCall::from_slice(buf)?)), - 2 => Some(ContractExec::Deploy(ContractDeploy::from_slice(buf)?)), + 1 => Some(TransactionData::Call(ContractCall::from_slice(buf)?)), + 2 => { + Some(TransactionData::Deploy(ContractDeploy::from_slice(buf)?)) + } + 3 => { + // we only build for 64-bit so this truncation is impossible + #[allow(clippy::cast_possible_truncation)] + let size = u64::from_reader(&mut buf)? as usize; + + if buf.len() != size || size > MAX_MEMO_SIZE { + return Err(BytesError::InvalidData); + } + + let memo = buf[..size].to_vec(); + Some(TransactionData::Memo(memo)) + } _ => { return Err(BytesError::InvalidData); } }; Ok(Self { + chain_id, tx_skeleton, fee, - exec, + data, }) } @@ -642,22 +715,27 @@ impl Payload { /// for hashing and *cannot* be used to deserialize the `Payload` again. #[must_use] pub fn to_hash_input_bytes(&self) -> Vec { - let mut bytes = self.tx_skeleton.to_hash_input_bytes(); + let mut bytes = Vec::from([self.chain_id]); - match &self.exec { - Some(ContractExec::Deploy(d)) => { + bytes.extend(self.tx_skeleton.to_hash_input_bytes()); + + match &self.data { + Some(TransactionData::Deploy(d)) => { bytes.extend(&d.bytecode.to_hash_input_bytes()); bytes.extend(&d.owner); if let Some(constructor_args) = &d.constructor_args { bytes.extend(constructor_args); } } - Some(ContractExec::Call(c)) => { + Some(TransactionData::Call(c)) => { bytes.extend(c.contract.as_bytes()); bytes.extend(c.fn_name.as_bytes()); bytes.extend(&c.fn_args); } - _ => {} + Some(TransactionData::Memo(m)) => { + bytes.extend(m); + } + None => {} } bytes @@ -820,15 +898,6 @@ impl Serializable for Fee { }) } } -/// A leaf of the transfer tree. -#[derive(Debug, Clone, PartialEq, Eq, Archive, Serialize, Deserialize)] -#[archive_attr(derive(CheckBytes))] -pub struct TreeLeaf { - /// The height of the block when the note was inserted in the tree. - pub block_height: u64, - /// The note inserted in the tree. - pub note: Note, -} /// This struct mimics the [`TxCircuit`] but is not generic over the amount of /// input-notes. diff --git a/execution-core/tests/serialization.rs b/execution-core/tests/serialization.rs index 22827c652e..dcfa53f492 100644 --- a/execution-core/tests/serialization.rs +++ b/execution-core/tests/serialization.rs @@ -9,22 +9,24 @@ use execution_core::{ PublicKey as AccountPublicKey, SecretKey as AccountSecretKey, }, transfer::{ - contract_exec::{ - ContractBytecode, ContractCall, ContractDeploy, ContractExec, + data::{ + ContractBytecode, ContractCall, ContractDeploy, TransactionData, }, phoenix::{ - Note, Prove, PublicKey as PhoenixPublicKey, - SecretKey as PhoenixSecretKey, TxCircuitVec, NOTES_TREE_DEPTH, + Note, NoteTreeItem, NotesTree, Prove, + PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, + TxCircuitVec, }, Transaction, }, BlsScalar, Error, JubJubScalar, }; use ff::Field; -use poseidon_merkle::{Item, Tree}; use rand::rngs::StdRng; use rand::{CryptoRng, Rng, RngCore, SeedableRng}; +const CHAIN_ID: u8 = 0xFA; + struct TxCircuitVecProver(); // use the serialized TxCircuitVec as proof. This way that serialization is also @@ -40,7 +42,7 @@ impl Prove for TxCircuitVecProver { fn new_phoenix_tx( rng: &mut R, - exec: Option, + data: Option, ) -> Transaction { // generate the keys let sender_sk = PhoenixSecretKey::random(rng); @@ -84,9 +86,9 @@ fn new_phoenix_tx( input_2.set_pos(2); let notes = vec![input_0, input_1, input_2]; - let mut notes_tree = Tree::<(), NOTES_TREE_DEPTH>::new(); + let mut notes_tree = NotesTree::new(); for note in notes.iter() { - let item = Item { + let item = NoteTreeItem { hash: note.hash(), data: (), }; @@ -121,14 +123,15 @@ fn new_phoenix_tx( deposit, gas_limit, gas_price, - exec, + CHAIN_ID, + data, ) - .expect("transcaction generation should work") + .expect("transaction generation should work") } fn new_moonlight_tx( rng: &mut R, - exec: Option, + data: Option, ) -> Transaction { let from_sk = AccountSecretKey::random(rng); let to_account = @@ -141,8 +144,10 @@ fn new_moonlight_tx( let nonce: u64 = rng.gen(); Transaction::moonlight( - &from_sk, to_account, value, deposit, gas_limit, gas_price, nonce, exec, + &from_sk, to_account, value, deposit, gas_limit, gas_price, nonce, + CHAIN_ID, data, ) + .expect("transaction generation should work") } #[test] @@ -176,7 +181,8 @@ fn phoenix_with_call() -> Result<(), Error> { fn_args, }; - let transaction = new_phoenix_tx(&mut rng, Some(ContractExec::Call(call))); + let transaction = + new_phoenix_tx(&mut rng, Some(TransactionData::Call(call))); let transaction_bytes = transaction.to_var_bytes(); let deserialized = Transaction::from_slice(&transaction_bytes)?; @@ -213,7 +219,36 @@ fn phoenix_with_deploy() -> Result<(), Error> { }; let transaction = - new_phoenix_tx(&mut rng, Some(ContractExec::Deploy(deploy))); + new_phoenix_tx(&mut rng, Some(TransactionData::Deploy(deploy))); + + let transaction_bytes = transaction.to_var_bytes(); + let deserialized = Transaction::from_slice(&transaction_bytes)?; + + assert_eq!(transaction, deserialized); + + Ok(()) +} + +#[test] +fn phoenix_with_memo() -> Result<(), Error> { + let mut rng = StdRng::seed_from_u64(42); + + // build a contract deployment + let mut hash = [0; 32]; + rng.fill_bytes(&mut hash); + let mut bytes = vec![0; 100]; + rng.fill_bytes(&mut bytes); + + let mut owner = [0; 32].to_vec(); + rng.fill_bytes(&mut owner); + + let mut constructor_args = vec![0; 20]; + rng.fill_bytes(&mut constructor_args); + + let memo = vec![1u8; 512]; + + let transaction = + new_phoenix_tx(&mut rng, Some(TransactionData::Memo(memo))); let transaction_bytes = transaction.to_var_bytes(); let deserialized = Transaction::from_slice(&transaction_bytes)?; @@ -255,7 +290,7 @@ fn moonlight_with_call() -> Result<(), Error> { }; let transaction = - new_moonlight_tx(&mut rng, Some(ContractExec::Call(call))); + new_moonlight_tx(&mut rng, Some(TransactionData::Call(call))); let transaction_bytes = transaction.to_var_bytes(); let deserialized = Transaction::from_slice(&transaction_bytes)?; @@ -291,7 +326,35 @@ fn moonlight_with_deploy() -> Result<(), Error> { }; let transaction = - new_moonlight_tx(&mut rng, Some(ContractExec::Deploy(deploy))); + new_moonlight_tx(&mut rng, Some(TransactionData::Deploy(deploy))); + + let transaction_bytes = transaction.to_var_bytes(); + let deserialized = Transaction::from_slice(&transaction_bytes)?; + + assert_eq!(transaction, deserialized); + + Ok(()) +} + +#[test] +fn moonlight_with_memo() -> Result<(), Error> { + let mut rng = StdRng::seed_from_u64(42); + + let mut hash = [0; 32]; + rng.fill_bytes(&mut hash); + let mut bytes = vec![0; 100]; + rng.fill_bytes(&mut bytes); + + let mut owner = [0; 32].to_vec(); + rng.fill_bytes(&mut owner); + + let mut constructor_args = vec![0; 20]; + rng.fill_bytes(&mut constructor_args); + + let memo = vec![1u8; 512]; + + let transaction = + new_moonlight_tx(&mut rng, Some(TransactionData::Memo(memo))); let transaction_bytes = transaction.to_var_bytes(); let deserialized = Transaction::from_slice(&transaction_bytes)?; diff --git a/explorer/CHANGELOG.md b/explorer/CHANGELOG.md index 749a1a3019..4ed76b332c 100644 --- a/explorer/CHANGELOG.md +++ b/explorer/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Show the error message for failed transactions [#2220] + ### Changed ### Fixed @@ -55,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#2059]: https://github.com/dusk-network/rusk/issues/2059 [#2061]: https://github.com/dusk-network/rusk/issues/2061 [#2159]: https://github.com/dusk-network/rusk/issues/2159 +[#2220]: https://github.com/dusk-network/rusk/issues/2220 diff --git a/explorer/src/lib/components/__tests__/TransactionStatus.spec.js b/explorer/src/lib/components/__tests__/TransactionStatus.spec.js new file mode 100644 index 0000000000..96d8ae028c --- /dev/null +++ b/explorer/src/lib/components/__tests__/TransactionStatus.spec.js @@ -0,0 +1,67 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { cleanup, render } from "@testing-library/svelte"; + +import { TransactionStatus } from ".."; + +describe("TransactionStatus", () => { + const baseProps = { + errorMessage: "", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it("should render the transaction status", () => { + const { container } = render(TransactionStatus, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names to the rendered `Badge` component", () => { + const props = { + ...baseProps, + className: "foo bar", + }; + + const { container } = render(TransactionStatus, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render the status as error if it receives an error message", () => { + const props = { + ...baseProps, + errorMessage: "Transaction failed", + }; + + const { container } = render(TransactionStatus, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should add tooltip info if it receives an error message and the related property is set", () => { + const props = { + ...baseProps, + errorMessage: "Transaction failed", + showErrorTooltip: true, + }; + + const { container } = render(TransactionStatus, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("shouldn't add tooltip info if there's no error message, even if the related property is set to `true`", () => { + const props = { + ...baseProps, + showErrorTooltip: true, + }; + + const { container } = render(TransactionStatus, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); +}); diff --git a/explorer/src/lib/components/__tests__/__snapshots__/TransactionDetails.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/TransactionDetails.spec.js.snap index 555e7c29db..2fe39e4604 100644 --- a/explorer/src/lib/components/__tests__/__snapshots__/TransactionDetails.spec.js.snap +++ b/explorer/src/lib/components/__tests__/__snapshots__/TransactionDetails.spec.js.snap @@ -104,7 +104,7 @@ exports[`Transaction Details > renders the Transaction Details component 1`] = ` class="details-list__definition" > success @@ -430,7 +430,7 @@ exports[`Transaction Details > renders the Transaction Details component with th class="details-list__definition" > success diff --git a/explorer/src/lib/components/__tests__/__snapshots__/TransactionStatus.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/TransactionStatus.spec.js.snap new file mode 100644 index 0000000000..c81eb3c61a --- /dev/null +++ b/explorer/src/lib/components/__tests__/__snapshots__/TransactionStatus.spec.js.snap @@ -0,0 +1,44 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`TransactionStatus > should add tooltip info if it receives an error message and the related property is set 1`] = ` + + failed + +`; + +exports[`TransactionStatus > should pass additional class names to the rendered \`Badge\` component 1`] = ` + + success + +`; + +exports[`TransactionStatus > should render the status as error if it receives an error message 1`] = ` + + failed + +`; + +exports[`TransactionStatus > should render the transaction status 1`] = ` + + success + +`; + +exports[`TransactionStatus > shouldn't add tooltip info if there's no error message, even if the related property is set to \`true\` 1`] = ` + + success + +`; diff --git a/explorer/src/lib/components/__tests__/__snapshots__/TransactionsCard.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/TransactionsCard.spec.js.snap index 0a090903f5..0a9def3f55 100644 --- a/explorer/src/lib/components/__tests__/__snapshots__/TransactionsCard.spec.js.snap +++ b/explorer/src/lib/components/__tests__/__snapshots__/TransactionsCard.spec.js.snap @@ -179,7 +179,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -254,9 +254,9 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > - success + failed @@ -329,7 +329,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -404,7 +404,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -479,7 +479,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -554,7 +554,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -629,7 +629,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -704,7 +704,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -779,7 +779,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success @@ -854,7 +854,7 @@ exports[`Transactions Card > should disable the \`Show More\` button if there is class="table__data-cell" > success diff --git a/explorer/src/lib/components/__tests__/__snapshots__/TransactionsList.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/TransactionsList.spec.js.snap index 22ca90c48f..bd76e87e83 100644 --- a/explorer/src/lib/components/__tests__/__snapshots__/TransactionsList.spec.js.snap +++ b/explorer/src/lib/components/__tests__/__snapshots__/TransactionsList.spec.js.snap @@ -67,11 +67,10 @@ exports[`Transactions List > should render the \`TransactionsList\` component in class="details-list__definition details-list__definition--table" > success -
should render the \`TransactionsList\` component in class="details-list__definition details-list__definition--table" > success -
should pass additional class names to the rendered class="table__data-cell" > success @@ -184,9 +184,9 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > - success + failed @@ -259,7 +259,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -334,7 +334,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -409,7 +409,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -484,7 +484,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -559,7 +559,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -634,7 +634,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -709,7 +709,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -784,7 +784,7 @@ exports[`Transactions Table > should pass additional class names to the rendered class="table__data-cell" > success @@ -891,7 +891,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -945,9 +945,9 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > - success + failed @@ -999,7 +999,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1053,7 +1053,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1107,7 +1107,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1161,7 +1161,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1215,7 +1215,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1269,7 +1269,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1323,7 +1323,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1377,7 +1377,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1511,7 +1511,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1586,9 +1586,9 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > - success + failed @@ -1661,7 +1661,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1736,7 +1736,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1811,7 +1811,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1886,7 +1886,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -1961,7 +1961,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -2036,7 +2036,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -2111,7 +2111,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success @@ -2186,7 +2186,7 @@ exports[`Transactions Table > should render the \`TransactionsTable\` component class="table__data-cell" > success diff --git a/explorer/src/lib/components/index.js b/explorer/src/lib/components/index.js index 86e43cbe63..95e2609e45 100644 --- a/explorer/src/lib/components/index.js +++ b/explorer/src/lib/components/index.js @@ -22,4 +22,5 @@ export { default as TransactionsCard } from "./transactions-card/TransactionsCar export { default as TransactionDetails } from "./transaction-details/TransactionDetails.svelte"; export { default as TransactionsList } from "./transactions-list/TransactionsList.svelte"; export { default as TransactionsTable } from "./transactions-table/TransactionsTable.svelte"; +export { default as TransactionStatus } from "./transaction-status/TransactionStatus.svelte"; export { default as WorldMap } from "./world-map/WorldMap.svelte"; diff --git a/explorer/src/lib/components/transaction-details/TransactionDetails.svelte b/explorer/src/lib/components/transaction-details/TransactionDetails.svelte index fe23cd19a3..7eaa49f5a0 100644 --- a/explorer/src/lib/components/transaction-details/TransactionDetails.svelte +++ b/explorer/src/lib/components/transaction-details/TransactionDetails.svelte @@ -7,6 +7,7 @@ DataGuard, ListItem, StaleDataNotice, + TransactionStatus, } from "$lib/components"; import { Badge, Card, RelativeTime, Switch } from "$lib/dusk/components"; import { createValueFormatter } from "$lib/dusk/value"; @@ -102,10 +103,10 @@ Status diff --git a/explorer/src/lib/components/transaction-status/TransactionStatus.css b/explorer/src/lib/components/transaction-status/TransactionStatus.css new file mode 100644 index 0000000000..55e99ca19f --- /dev/null +++ b/explorer/src/lib/components/transaction-status/TransactionStatus.css @@ -0,0 +1,3 @@ +.transaction-status[data-tooltip-id] { + cursor: help; +} diff --git a/explorer/src/lib/components/transaction-status/TransactionStatus.svelte b/explorer/src/lib/components/transaction-status/TransactionStatus.svelte new file mode 100644 index 0000000000..fa73714753 --- /dev/null +++ b/explorer/src/lib/components/transaction-status/TransactionStatus.svelte @@ -0,0 +1,40 @@ + + + + + diff --git a/explorer/src/lib/components/transactions-list/TransactionsList.svelte b/explorer/src/lib/components/transactions-list/TransactionsList.svelte index 6ec8525a1a..ba0a8e7250 100644 --- a/explorer/src/lib/components/transactions-list/TransactionsList.svelte +++ b/explorer/src/lib/components/transactions-list/TransactionsList.svelte @@ -1,7 +1,13 @@ -{text} +{text} diff --git a/explorer/src/lib/mock-data/gql-transactions.json b/explorer/src/lib/mock-data/gql-transactions.json index d29d060b4b..5283f8d26b 100644 --- a/explorer/src/lib/mock-data/gql-transactions.json +++ b/explorer/src/lib/mock-data/gql-transactions.json @@ -18,7 +18,7 @@ "blockHash": "6971e17e1603d0651b4145ce404f9c7eeaa72182d94ef8856da980d38530d800", "blockHeight": 1377411, "blockTimestamp": 1716961328, - "err": null, + "err": "Panic: failed deployment", "gasSpent": 215617, "id": "534f753d5a420fddc21c84d76ff26b87cc48ea75b450c082759d155153259c00", "tx": { diff --git a/explorer/src/routes/blocks/block/__tests__/__snapshots__/page.spec.js.snap b/explorer/src/routes/blocks/block/__tests__/__snapshots__/page.spec.js.snap index 54ef722bf2..275a5b5fbe 100644 --- a/explorer/src/routes/blocks/block/__tests__/__snapshots__/page.spec.js.snap +++ b/explorer/src/routes/blocks/block/__tests__/__snapshots__/page.spec.js.snap @@ -565,7 +565,7 @@ exports[`Block Details > should render the Block Details page and query the nece class="table__data-cell" > success @@ -640,7 +640,7 @@ exports[`Block Details > should render the Block Details page and query the nece class="table__data-cell" > success @@ -1235,11 +1235,10 @@ exports[`Block Details > should render the Transaction section of the Block Deta class="details-list__definition details-list__definition--table" > success -
should render the Transaction section of the Block Deta class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > - success + failed -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page with the mobile class="details-list__definition details-list__definition--table" > success -
should render the Transactions page, start polling class="table__data-cell" > success @@ -2061,9 +2046,9 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > - success + failed @@ -2136,7 +2121,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2211,7 +2196,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2286,7 +2271,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2361,7 +2346,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2436,7 +2421,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2511,7 +2496,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2586,7 +2571,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2661,7 +2646,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2736,7 +2721,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2811,7 +2796,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2886,7 +2871,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -2961,7 +2946,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success @@ -3036,7 +3021,7 @@ exports[`Transactions page > should render the Transactions page, start polling class="table__data-cell" > success diff --git a/explorer/src/routes/transactions/transaction/__tests__/__snapshots__/page.spec.js.snap b/explorer/src/routes/transactions/transaction/__tests__/__snapshots__/page.spec.js.snap index 173ca08b62..bab68fdd81 100644 --- a/explorer/src/routes/transactions/transaction/__tests__/__snapshots__/page.spec.js.snap +++ b/explorer/src/routes/transactions/transaction/__tests__/__snapshots__/page.spec.js.snap @@ -142,7 +142,7 @@ exports[`Transaction Details > should render the Transaction details page and qu class="details-list__definition" > success diff --git a/node-data/src/events/transactions.rs b/node-data/src/events/transactions.rs index c94b56bbab..1577352341 100644 --- a/node-data/src/events/transactions.rs +++ b/node-data/src/events/transactions.rs @@ -50,8 +50,8 @@ impl EventSource for TransactionEvent<'_> { fn entity(&self) -> String { let hash = match self { Self::Removed(hash) => *hash, - Self::Executed(tx) => tx.inner.hash(), - Self::Included(tx) => tx.hash(), + Self::Executed(tx) => tx.inner.id(), + Self::Included(tx) => tx.id(), }; hex::encode(hash) } diff --git a/node-data/src/ledger.rs b/node-data/src/ledger.rs index 37c9823170..1423fc1c0a 100644 --- a/node-data/src/ledger.rs +++ b/node-data/src/ledger.rs @@ -11,7 +11,7 @@ mod block; pub use block::{Block, BlockWithLabel, Hash, Label}; mod transaction; -pub use transaction::{SpentTransaction, Transaction}; +pub use transaction::{SpendingId, SpentTransaction, Transaction}; mod faults; pub use faults::{Fault, InvalidFault, Slash, SlashType}; diff --git a/node-data/src/ledger/transaction.rs b/node-data/src/ledger/transaction.rs index bfcd2844da..7a2b413535 100644 --- a/node-data/src/ledger/transaction.rs +++ b/node-data/src/ledger/transaction.rs @@ -4,6 +4,8 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. +use dusk_bytes::Serializable; +use execution_core::signatures::bls; use execution_core::transfer::Transaction as ProtocolTransaction; use execution_core::BlsScalar; use serde::Serialize; @@ -63,12 +65,17 @@ impl Transaction { self.inner.gas_price() } - pub fn to_nullifiers(&self) -> Vec<[u8; 32]> { - self.inner - .nullifiers() - .iter() - .map(|n| n.to_bytes()) - .collect() + pub fn to_spend_ids(&self) -> Vec { + match &self.inner { + ProtocolTransaction::Phoenix(p) => p + .nullifiers() + .iter() + .map(|n| SpendingId::Nullifier(n.to_bytes())) + .collect(), + ProtocolTransaction::Moonlight(m) => { + vec![SpendingId::AccountNonce(*m.from_account(), m.nonce())] + } + } } } @@ -90,12 +97,30 @@ impl PartialEq for SpentTransaction { impl Eq for SpentTransaction {} +pub enum SpendingId { + Nullifier([u8; 32]), + AccountNonce(bls::PublicKey, u64), +} + +impl SpendingId { + pub fn to_bytes(&self) -> Vec { + match self { + SpendingId::Nullifier(n) => n.to_vec(), + SpendingId::AccountNonce(account, nonce) => { + let mut id = account.to_bytes().to_vec(); + id.extend_from_slice(&nonce.to_le_bytes()); + id + } + } + } +} + #[cfg(any(feature = "faker", test))] pub mod faker { use super::*; use crate::ledger::Dummy; use execution_core::transfer::{ - contract_exec::{ContractCall, ContractExec}, + data::{ContractCall, TransactionData}, phoenix::{ Fee, Note, Payload as PhoenixPayload, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, @@ -156,9 +181,10 @@ pub mod faker { ContractCall::new([21; 32], "some_method", &()).unwrap(); let payload = PhoenixPayload { + chain_id: 0xFA, tx_skeleton, fee, - exec: Some(ContractExec::Call(contract_call)), + data: Some(TransactionData::Call(contract_call)), }; let proof = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; diff --git a/node-data/src/message.rs b/node-data/src/message.rs index 30405dbb39..ff0c66eb8c 100644 --- a/node-data/src/message.rs +++ b/node-data/src/message.rs @@ -10,12 +10,14 @@ use execution_core::signatures::bls::{ MultisigSignature as BlsMultisigSignature, PublicKey as BlsPublicKey, SecretKey as BlsSecretKey, }; +use payload::Nonce; use tracing::{error, warn}; use crate::bls::PublicKey; use crate::ledger::{to_str, Hash, Signature}; use crate::StepName; use crate::{bls, ledger, Serializable}; +use core::fmt; use std::cmp::Ordering; use std::io::{self, Read, Write}; use std::net::SocketAddr; @@ -25,7 +27,46 @@ use async_channel::TrySendError; use self::payload::{Candidate, Ratification, Validation}; /// Topic field position in the message binary representation -pub const TOPIC_FIELD_POS: usize = 8 + 8 + 4; +pub const TOPIC_FIELD_POS: usize = 1 + 2 + 2; +pub const PROTOCOL_VERSION: Version = Version(1, 0, 0); + +#[derive(Debug, Clone)] +/// Represent version (major, minor, patch) +pub struct Version(pub u8, pub u16, pub u16); + +impl Default for Version { + fn default() -> Self { + PROTOCOL_VERSION + } +} + +impl fmt::Display for Version { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let Version(maj, min, patch) = self; + write!(f, "{maj}.{min}.{patch}") + } +} + +impl crate::Serializable for Version { + fn write(&self, w: &mut W) -> io::Result<()> { + let Version(maj, min, patch) = self; + w.write_all(&[*maj])?; + w.write_all(&min.to_le_bytes())?; + w.write_all(&patch.to_le_bytes())?; + + Ok(()) + } + + fn read(r: &mut R) -> io::Result + where + Self: Sized, + { + let maj = Self::read_u8(r)?; + let min = Self::read_u16_le(r)?; + let patch = Self::read_u16_le(r)?; + Ok(Self(maj, min, patch)) + } +} pub enum Status { Past, @@ -46,6 +87,7 @@ impl From for Status { /// Message definition #[derive(Debug, Default, Clone)] pub struct Message { + pub version: Version, topic: Topics, pub header: ConsensusHeader, pub payload: Payload, @@ -53,6 +95,16 @@ pub struct Message { pub metadata: Option, } +pub trait WireMessage: Into { + const TOPIC: Topics; + fn consensus_header(&self) -> ConsensusHeader { + ConsensusHeader::default() + } + fn payload(self) -> Payload { + self.into() + } +} + impl Message { pub fn compare(&self, round: u64, iteration: u8, step: StepName) -> Status { self.header @@ -85,6 +137,15 @@ impl Message { _ => StepName::Proposal.to_step(self.header.iteration), } } + + pub fn version(&self) -> &Version { + &self.version + } + + pub fn with_version(mut self, v: Version) -> Self { + self.version = v; + self + } } /// Defines a transport-related properties that determines how the message @@ -97,6 +158,7 @@ pub struct Metadata { impl Serializable for Message { fn write(&self, w: &mut W) -> io::Result<()> { + self.version.write(w)?; w.write_all(&[self.topic as u8])?; match &self.payload { @@ -118,33 +180,21 @@ impl Serializable for Message { where Self: Sized, { + let version = Version::read(r)?; + // Read topic let topic = Topics::from(Self::read_u8(r)?); - let message = match topic { - Topics::Candidate => { - Message::new_candidate(payload::Candidate::read(r)?) - } - Topics::Validation => { - Message::new_validation(payload::Validation::read(r)?) - } - Topics::Ratification => { - Message::new_ratification(payload::Ratification::read(r)?) - } - Topics::Quorum => Message::new_quorum(payload::Quorum::read(r)?), - Topics::Block => Message::new_block(ledger::Block::read(r)?), - Topics::Tx => { - Message::new_transaction(ledger::Transaction::read(r)?) - } - Topics::GetResource => { - Message::new_get_resource(payload::GetResource::read(r)?) - } - Topics::GetBlocks => { - Message::new_get_blocks(payload::GetBlocks::read(r)?) - } - Topics::GetMempool => { - Message::new_get_mempool(payload::GetMempool::read(r)?) - } - Topics::Inv => Message::new_inv(payload::Inv::read(r)?), + let message: Message = match topic { + Topics::Candidate => payload::Candidate::read(r)?.into(), + Topics::Validation => payload::Validation::read(r)?.into(), + Topics::Ratification => payload::Ratification::read(r)?.into(), + Topics::Quorum => payload::Quorum::read(r)?.into(), + Topics::Block => ledger::Block::read(r)?.into(), + Topics::Tx => ledger::Transaction::read(r)?.into(), + Topics::GetResource => payload::GetResource::read(r)?.into(), + Topics::GetBlocks => payload::GetBlocks::read(r)?.into(), + Topics::GetMempool => payload::GetMempool::read(r)?.into(), + Topics::Inv => payload::Inv::read(r)?.into(), Topics::Unknown => { return Err(io::Error::new( io::ErrorKind::InvalidData, @@ -153,114 +203,78 @@ impl Serializable for Message { } }; - Ok(message) + Ok(message.with_version(version)) } } -impl Message { - /// Creates topics.Candidate message - pub fn new_candidate(payload: payload::Candidate) -> Message { +impl From for Message { + fn from(wire_msg: W) -> Self { Self { - header: payload.header.clone(), - topic: Topics::Candidate, - payload: Payload::Candidate(Box::new(payload)), + header: wire_msg.consensus_header(), + topic: W::TOPIC, + payload: wire_msg.payload(), ..Default::default() } } +} - /// Creates topics.Ratification message - pub fn new_ratification(payload: payload::Ratification) -> Message { - Self { - header: payload.header.clone(), - topic: Topics::Ratification, - payload: Payload::Ratification(payload), - ..Default::default() - } +impl WireMessage for Candidate { + const TOPIC: Topics = Topics::Candidate; + fn consensus_header(&self) -> ConsensusHeader { + self.header.clone() } +} - /// Creates topics.Validation message - pub fn new_validation(payload: payload::Validation) -> Message { - Self { - header: payload.header.clone(), - topic: Topics::Validation, - payload: Payload::Validation(payload), - ..Default::default() - } +impl WireMessage for Validation { + const TOPIC: Topics = Topics::Validation; + fn consensus_header(&self) -> ConsensusHeader { + self.header.clone() } +} - /// Creates topics.Quorum message - pub fn new_quorum(payload: payload::Quorum) -> Message { - Self { - header: payload.header.clone(), - topic: Topics::Quorum, - payload: Payload::Quorum(payload), - ..Default::default() - } +impl WireMessage for Ratification { + const TOPIC: Topics = Topics::Ratification; + fn consensus_header(&self) -> ConsensusHeader { + self.header.clone() } +} - /// Creates topics.Block message - pub fn new_block(payload: ledger::Block) -> Message { - Self { - topic: Topics::Block, - payload: Payload::Block(Box::new(payload)), - ..Default::default() - } +impl WireMessage for payload::Quorum { + const TOPIC: Topics = Topics::Quorum; + fn consensus_header(&self) -> ConsensusHeader { + self.header.clone() } +} - /// Creates topics.Inv (inventory) message - pub fn new_inv(p: payload::Inv) -> Message { - Self { - topic: Topics::Inv, - payload: Payload::Inv(p), - ..Default::default() - } - } +impl WireMessage for payload::GetMempool { + const TOPIC: Topics = Topics::GetMempool; +} - /// Creates topics.GetResource message - pub fn new_get_resource(p: payload::GetResource) -> Message { - Self { - topic: Topics::GetResource, - payload: Payload::GetResource(p), - ..Default::default() - } - } +impl WireMessage for payload::Inv { + const TOPIC: Topics = Topics::Inv; +} - /// Creates topics.GetMempool message - pub fn new_get_mempool(p: payload::GetMempool) -> Message { - Self { - topic: Topics::GetMempool, - payload: Payload::GetMempool(p), - ..Default::default() - } - } +impl WireMessage for payload::GetBlocks { + const TOPIC: Topics = Topics::GetBlocks; +} - /// Creates topics.GetBlocks message - pub fn new_get_blocks(p: payload::GetBlocks) -> Message { - Self { - topic: Topics::GetBlocks, - payload: Payload::GetBlocks(p), - ..Default::default() - } - } +impl WireMessage for payload::GetResource { + const TOPIC: Topics = Topics::GetResource; +} - /// Creates topics.Tx message - pub fn new_transaction(tx: ledger::Transaction) -> Message { - Self { - topic: Topics::Tx, - payload: Payload::Transaction(Box::new(tx)), - ..Default::default() - } - } +impl WireMessage for ledger::Block { + const TOPIC: Topics = Topics::Block; +} - /// Creates a message with a validation_result - pub fn from_validation_result(p: payload::ValidationResult) -> Message { - Self { - topic: Topics::default(), - payload: Payload::ValidationResult(Box::new(p)), - ..Default::default() - } - } +impl WireMessage for ledger::Transaction { + const TOPIC: Topics = Topics::Tx; +} + +impl WireMessage for payload::ValidationResult { + const TOPIC: Topics = Topics::Unknown; +} +impl Message { /// Creates a unknown message with empty payload pub fn empty() -> Message { Self { @@ -360,13 +374,82 @@ pub enum Payload { Empty, } +impl Payload { + pub fn set_nonce>(&mut self, nonce: N) { + match self { + Payload::GetMempool(p) => p.set_nonce(nonce), + Payload::GetBlocks(p) => p.set_nonce(nonce), + _ => {} + } + } +} + +impl From for Payload { + fn from(value: payload::Ratification) -> Self { + Self::Ratification(value) + } +} + +impl From for Payload { + fn from(value: payload::Validation) -> Self { + Self::Validation(value) + } +} + +impl From for Payload { + fn from(value: payload::Candidate) -> Self { + Self::Candidate(Box::new(value)) + } +} +impl From for Payload { + fn from(value: payload::Quorum) -> Self { + Self::Quorum(value) + } +} +impl From for Payload { + fn from(value: ledger::Block) -> Self { + Self::Block(Box::new(value)) + } +} +impl From for Payload { + fn from(value: ledger::Transaction) -> Self { + Self::Transaction(Box::new(value)) + } +} +impl From for Payload { + fn from(value: payload::GetMempool) -> Self { + Self::GetMempool(value) + } +} +impl From for Payload { + fn from(value: payload::Inv) -> Self { + Self::Inv(value) + } +} +impl From for Payload { + fn from(value: payload::GetBlocks) -> Self { + Self::GetBlocks(value) + } +} +impl From for Payload { + fn from(value: payload::GetResource) -> Self { + Self::GetResource(value) + } +} + +impl From for Payload { + fn from(value: payload::ValidationResult) -> Self { + Self::ValidationResult(Box::new(value)) + } +} + pub mod payload { use crate::ledger::{self, to_str, Attestation, Block, Hash, StepVotes}; use crate::{get_current_timestamp, Serializable}; use std::fmt; use std::io::{self, Read, Write}; use std::net::{ - Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, + IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, }; use super::{ConsensusHeader, SignInfo}; @@ -709,20 +792,89 @@ pub mod payload { }) } } + #[derive(Debug, Clone, Default)] + pub struct Nonce([u8; 8]); + + impl Serializable for Nonce { + fn write(&self, w: &mut W) -> io::Result<()> { + w.write_all(&self.0) + } + + fn read(r: &mut R) -> io::Result + where + Self: Sized, + { + let nonce = Self::read_bytes(r)?; + Ok(Self(nonce)) + } + } + + impl From for u64 { + fn from(value: Nonce) -> Self { + u64::from_le_bytes(value.0) + } + } + + impl From for Nonce { + fn from(value: u64) -> Self { + Self(value.to_le_bytes()) + } + } + + impl From for Nonce { + fn from(value: IpAddr) -> Self { + match value { + IpAddr::V4(v4) => v4.into(), + IpAddr::V6(v6) => v6.into(), + } + } + } + + impl From for Nonce { + fn from(value: Ipv4Addr) -> Self { + let num = u32::from_le_bytes(value.octets()); + (num as u64).into() + } + } + + impl From for Nonce { + fn from(value: Ipv6Addr) -> Self { + let mut ret = [0u8; 8]; + let value = value.octets(); + let (a, b) = value.split_at(8); + a.iter() + .zip(b) + .map(|(a, b)| a.wrapping_add(*b)) + .enumerate() + .for_each(|(idx, v)| ret[idx] = v); + + Self(ret) + } + } #[derive(Debug, Clone, Default)] - pub struct GetMempool {} + pub struct GetMempool { + pub(crate) nonce: Nonce, + } + + impl GetMempool { + pub fn set_nonce>(&mut self, nonce: N) { + self.nonce = nonce.into() + } + } impl Serializable for GetMempool { - fn write(&self, _w: &mut W) -> io::Result<()> { + fn write(&self, w: &mut W) -> io::Result<()> { + self.nonce.write(w)?; Ok(()) } - fn read(_r: &mut R) -> io::Result + fn read(r: &mut R) -> io::Result where Self: Sized, { - Ok(GetMempool::default()) + let nonce = Nonce::read(r)?; + Ok(GetMempool { nonce }) } } @@ -872,9 +1024,22 @@ pub mod payload { } } - #[derive(Clone, Default)] + #[derive(Clone)] pub struct GetBlocks { pub locator: [u8; 32], + pub(crate) nonce: Nonce, + } + + impl GetBlocks { + pub fn new(locator: [u8; 32]) -> Self { + Self { + locator, + nonce: Nonce::default(), + } + } + pub fn set_nonce>(&mut self, nonce: N) { + self.nonce = nonce.into() + } } impl fmt::Debug for GetBlocks { @@ -885,7 +1050,9 @@ pub mod payload { impl Serializable for GetBlocks { fn write(&self, w: &mut W) -> io::Result<()> { - w.write_all(&self.locator[..]) + w.write_all(&self.locator[..])?; + self.nonce.write(w)?; + Ok(()) } fn read(r: &mut R) -> io::Result @@ -893,7 +1060,8 @@ pub mod payload { Self: Sized, { let locator = Self::read_bytes(r)?; - Ok(Self { locator }) + let nonce = Nonce::read(r)?; + Ok(Self { locator, nonce }) } } diff --git a/node/Cargo.toml b/node/Cargo.toml index b01cbf2d7a..5e6eecc55e 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -12,7 +12,7 @@ license = "MPL-2.0" tracing = "0.1" hex = "0.4" dusk-consensus = { version = "0.1.1-rc.3", path = "../consensus" } -kadcast = "0.6.0-rc" +kadcast = "0.7.0-rc.5" sha3 = { version = "0.10" } anyhow = "1.0" async-trait = "0.1" diff --git a/node/src/chain/acceptor.rs b/node/src/chain/acceptor.rs index f60e1e6742..eb64454bff 100644 --- a/node/src/chain/acceptor.rs +++ b/node/src/chain/acceptor.rs @@ -164,15 +164,27 @@ impl Acceptor { let state_root = vm.read().await.get_state_root()?; info!( - event = "VM state loaded", + event = "VM finalized state loaded", state_root = hex::encode(state_root), ); - // Detect a consistency issue between VM and Ledger states. if tip_height > 0 && tip_state_hash != state_root { - info!("revert to last finalized state"); - // Revert to last known finalized state. - acc.try_revert(RevertTarget::LastFinalizedState).await?; + if let Err(error) = vm.read().await.move_to_commit(tip_state_hash) { + warn!( + event = "Cannot move to tip_state_hash", + ?error, + state_root = hex::encode(tip_state_hash) + ); + + info!("revert to last finalized state"); + // Revert to last known finalized state. + acc.try_revert(RevertTarget::LastFinalizedState).await?; + } else { + info!( + event = "VM accepted state loaded", + state_root = hex::encode(tip_state_hash), + ); + } } Ok(acc) @@ -564,8 +576,8 @@ impl Acceptor { events.push(TransactionEvent::Removed(tx_id).into()); } - let nullifiers = tx.to_nullifiers(); - for orphan_tx in t.get_txs_by_nullifiers(&nullifiers) { + let spend_ids = tx.to_spend_ids(); + for orphan_tx in t.get_txs_by_spendable_ids(&spend_ids) { let deleted = Mempool::delete_tx(t, orphan_tx) .map_err(|e| { warn!("Error while deleting orphan_tx: {e}") diff --git a/node/src/chain/consensus.rs b/node/src/chain/consensus.rs index a7096c7ef4..d851447a4f 100644 --- a/node/src/chain/consensus.rs +++ b/node/src/chain/consensus.rs @@ -211,19 +211,6 @@ impl dusk_consensus::commons::Database for CandidateDB { } } } - - fn delete_candidate_blocks(&mut self) { - match self.db.try_read() { - Ok(db) => { - if let Err(e) = db.update(|t| t.clear_candidates()) { - warn!("Unable to cleare candidates: {e}"); - }; - } - Err(e) => { - warn!("Cannot acquire lock to clear_candidate: {e}"); - } - } - } } /// Implements Executor trait to mock Contract Storage calls. diff --git a/node/src/chain/fsm.rs b/node/src/chain/fsm.rs index 036db72a56..97edbed87e 100644 --- a/node/src/chain/fsm.rs +++ b/node/src/chain/fsm.rs @@ -179,7 +179,7 @@ impl SimpleFSM { self.acc.clone(), self.network.clone(), ); - next.on_entering(&b, peer_addr).await; + next.on_entering(b, peer_addr).await; self.curr = State::OutOfSync(next); } } @@ -702,7 +702,7 @@ impl InSyncImpl { if let Err(err) = network .read() .await - .send_to_peer(&Message::new_get_resource(req), peer_addr) + .send_to_peer(req.into(), peer_addr) .await { warn!("could not request block {err}") @@ -755,7 +755,7 @@ impl } } /// performed when entering the OutOfSync state - async fn on_entering(&mut self, blk: &Block, dest_addr: SocketAddr) { + async fn on_entering(&mut self, blk: Block, peer_addr: SocketAddr) { let (curr_height, locator) = { let acc = self.acc.read().await; (acc.get_curr_height().await, acc.get_curr_hash().await) @@ -770,13 +770,13 @@ impl ); // Request missing blocks from source peer - let gb_msg = Message::new_get_blocks(GetBlocks { locator }); + let gb_msg = GetBlocks::new(locator).into(); if let Err(e) = self .network .read() .await - .send_to_peer(&gb_msg, dest_addr) + .send_to_peer(gb_msg, peer_addr) .await { warn!("Unable to send GetBlocks: {e}") @@ -785,15 +785,11 @@ impl // add to the pool let key = blk.header().height; self.pool.clear(); - self.pool.insert(key, blk.clone()); - self.peer_addr = dest_addr; - - info!( - event = "entering out-of-sync", - from = self.range.0, - to = self.range.1, - peer = format!("{:?}", dest_addr), - ); + self.pool.insert(key, blk); + self.peer_addr = peer_addr; + + let (from, to) = &self.range; + info!(event = "entering out-of-sync", from, to, ?peer_addr); } /// performed when exiting the state diff --git a/node/src/database.rs b/node/src/database.rs index 76a96f9df3..05d8838bf5 100644 --- a/node/src/database.rs +++ b/node/src/database.rs @@ -10,7 +10,7 @@ use std::path::Path; pub mod rocksdb; use anyhow::Result; -use node_data::ledger::{self, Fault, Label, SpentTransaction}; +use node_data::ledger::{self, Fault, Label, SpendingId, SpentTransaction}; use serde::{Deserialize, Serialize}; pub struct LightBlock { @@ -131,8 +131,8 @@ pub trait Mempool { /// Deletes a transaction from the mempool. fn delete_tx(&self, tx_id: [u8; 32]) -> Result; - /// Get transactions hash from the mempool, searching by nullifiers - fn get_txs_by_nullifiers(&self, n: &[[u8; 32]]) -> HashSet<[u8; 32]>; + /// Get transactions hash from the mempool, searching by spendable ids + fn get_txs_by_spendable_ids(&self, n: &[SpendingId]) -> HashSet<[u8; 32]>; /// Get an iterator over the mempool transactions sorted by gas price fn get_txs_sorted_by_fee( diff --git a/node/src/database/rocksdb.rs b/node/src/database/rocksdb.rs index 48c1a17749..08c7723444 100644 --- a/node/src/database/rocksdb.rs +++ b/node/src/database/rocksdb.rs @@ -10,7 +10,9 @@ use super::{ use anyhow::Result; use std::cell::RefCell; -use node_data::ledger::{self, Fault, Header, Label, SpentTransaction}; +use node_data::ledger::{ + self, Fault, Header, Label, SpendingId, SpentTransaction, +}; use node_data::Serializable; use crate::database::Mempool; @@ -750,11 +752,13 @@ impl<'db, DB: DBAccess> Mempool for DBTransaction<'db, DB> { Ok(false) } - fn get_txs_by_nullifiers(&self, n: &[[u8; 32]]) -> HashSet<[u8; 32]> { + fn get_txs_by_spendable_ids(&self, n: &[SpendingId]) -> HashSet<[u8; 32]> { n.iter() - .filter_map(|n| match self.snapshot.get_cf(self.nullifiers_cf, n) { - Ok(Some(tx_id)) => tx_id.try_into().ok(), - _ => None, + .filter_map(|n| { + match self.snapshot.get_cf(self.nullifiers_cf, n.to_bytes()) { + Ok(Some(tx_id)) => tx_id.try_into().ok(), + _ => None, + } }) .collect() } diff --git a/node/src/databroker.rs b/node/src/databroker.rs index 07a1cf0e91..83860e69ea 100644 --- a/node/src/databroker.rs +++ b/node/src/databroker.rs @@ -140,7 +140,7 @@ impl // Send response let net = network.read().await; for msg in resp.msgs { - let send = net.send_to_peer(&msg, resp.recv_peer); + let send = net.send_to_peer(msg, resp.recv_peer); if let Err(e) = send.await { warn!("Unable to send_to_peer {e}") }; @@ -235,7 +235,7 @@ impl DataBrokerSrv { let _ = network .read() .await - .send_to_alive_peers(&msg, 1) + .send_to_alive_peers(msg, 1) .await; } Err(err) @@ -268,7 +268,7 @@ impl DataBrokerSrv { }) .map_err(|e| anyhow::anyhow!(e))?; - Ok(Message::new_inv(inv)) + Ok(inv.into()) } /// Handles GetBlocks message request. @@ -316,7 +316,7 @@ impl DataBrokerSrv { }) .map_err(|e| anyhow::anyhow!(e))?; - Ok(Message::new_inv(inv)) + Ok(inv.into()) } /// Handles inventory message request. @@ -391,12 +391,7 @@ impl DataBrokerSrv { // Send GetResource request with disabled rebroadcast (hops_limit = 1), // Inv message is part of one-to-one messaging flows // (GetBlocks/Mempool) so it should not be treated as flooding request - Ok(Message::new_get_resource(GetResource::new( - inv, - requester_addr, - u64::MAX, - 1, - ))) + Ok(GetResource::new(inv, requester_addr, u64::MAX, 1).into()) } /// Handles GetResource message request. @@ -424,7 +419,7 @@ impl DataBrokerSrv { Ledger::fetch_block_by_height(&t, *height) .ok() .flatten() - .map(Message::new_block) + .map(Message::from) } else { None } @@ -434,7 +429,7 @@ impl DataBrokerSrv { Ledger::fetch_block(&t, hash) .ok() .flatten() - .map(Message::new_block) + .map(Message::from) } else { None } @@ -449,7 +444,7 @@ impl DataBrokerSrv { .ok() .flatten() }) - .map(Message::new_block) + .map(Message::from) } else { None } @@ -459,7 +454,7 @@ impl DataBrokerSrv { Mempool::get_tx(&t, *tx_id) .ok() .flatten() - .map(Message::new_transaction) + .map(Message::from) } else { None } diff --git a/node/src/lib.rs b/node/src/lib.rs index 240a6ccbdb..ac504c63ac 100644 --- a/node/src/lib.rs +++ b/node/src/lib.rs @@ -53,14 +53,14 @@ pub trait Network: Send + Sync + 'static { /// Sends a message to a specified peer. async fn send_to_peer( &self, - msg: &Message, + msg: Message, peer_addr: std::net::SocketAddr, ) -> anyhow::Result<()>; /// Sends to random set of alive peers. async fn send_to_alive_peers( &self, - msg: &Message, + msg: Message, amount: usize, ) -> anyhow::Result<()>; diff --git a/node/src/mempool.rs b/node/src/mempool.rs index 7ddf67184a..9f2c689611 100644 --- a/node/src/mempool.rs +++ b/node/src/mempool.rs @@ -31,8 +31,8 @@ enum TxAcceptanceError { AlreadyExistsInMempool, #[error("this transaction exists in the ledger")] AlreadyExistsInLedger, - #[error("this transaction's input(s) exists in the mempool")] - NullifierExistsInMempool, + #[error("this transaction's spendId exists in the mempool")] + SpendIdExistsInMempool, #[error("this transaction is invalid {0}")] VerificationFailed(String), #[error("Maximum count of transactions exceeded {0}")] @@ -192,15 +192,10 @@ impl MempoolSrv { // Try to add the transaction to the mempool db.read().await.update(|db| { - let nullifiers: Vec<_> = tx - .inner - .nullifiers() - .iter() - .map(|nullifier| nullifier.to_bytes()) - .collect(); - - // ensure nullifiers do not exist in the mempool - for m_tx_id in db.get_txs_by_nullifiers(&nullifiers) { + let spend_ids = tx.to_spend_ids(); + + // ensure spend_ids do not exist in the mempool + for m_tx_id in db.get_txs_by_spendable_ids(&spend_ids) { if let Some(m_tx) = db.get_tx(m_tx_id)? { if m_tx.inner.gas_price() < tx.inner.gas_price() { if db.delete_tx(m_tx_id)? { @@ -208,7 +203,7 @@ impl MempoolSrv { }; } else { return Err( - TxAcceptanceError::NullifierExistsInMempool.into(), + TxAcceptanceError::SpendIdExistsInMempool.into() ); } } @@ -246,12 +241,11 @@ impl MempoolSrv { .conf .mempool_download_redundancy .unwrap_or(DEFAULT_DOWNLOAD_REDUNDANCY); - - let payload = payload::GetMempool {}; + let msg = payload::GetMempool::default().into(); if let Err(err) = network .read() .await - .send_to_alive_peers(&Message::new_get_mempool(payload), max_peers) + .send_to_alive_peers(msg, max_peers) .await { error!("could not request mempool from network: {err}"); diff --git a/node/src/network.rs b/node/src/network.rs index abb05f71e1..994970e7f0 100644 --- a/node/src/network.rs +++ b/node/src/network.rs @@ -5,6 +5,7 @@ // Copyright (c) DUSK NETWORK. All rights reserved. use std::net::{AddrParseError, SocketAddr}; +use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; use crate::{BoxedFilter, Message}; @@ -12,15 +13,12 @@ use async_trait::async_trait; use kadcast::config::Config; use kadcast::{MessageInfo, Peer}; use metrics::counter; -use node_data::get_current_timestamp; -use node_data::message::payload::{GetResource, Inv}; -use node_data::message::{AsyncQueue, Metadata}; -use std::sync::atomic::{AtomicU64, Ordering}; +use node_data::message::payload::{GetResource, Inv, Nonce}; +use node_data::message::{AsyncQueue, Metadata, PROTOCOL_VERSION}; +use node_data::{get_current_timestamp, Serializable}; use tokio::sync::RwLock; use tracing::{error, info, trace}; -mod frame; - /// Number of alive peers randomly selected which a `flood_request` is sent to const REDUNDANCY_PEER_COUNT: usize = 8; @@ -59,10 +57,8 @@ impl Listener { impl kadcast::NetworkListen for Listener { fn on_message(&self, blob: Vec, md: MessageInfo) { let msg_size = blob.len(); - match frame::Pdu::decode(&mut &blob.to_vec()[..]) { - Ok(d) => { - let mut msg = d.payload; - + match Message::read(&mut &blob.to_vec()[..]) { + Ok(mut msg) => { counter!("dusk_bytes_recv").increment(msg_size as u64); counter!(format!("dusk_inbound_{:?}_size", msg.topic())) .increment(msg_size as u64); @@ -99,14 +95,14 @@ pub struct Kadcast { filters: Arc>>, conf: Config, - counter: AtomicU64, - /// Represents a parsed conf.public_addr public_addr: SocketAddr, + + counter: AtomicU64, } impl Kadcast { - pub fn new(conf: Config) -> Result { + pub fn new(mut conf: Config) -> Result { const INIT: Option> = None; let routes = Arc::new(RwLock::new([INIT; N])); @@ -121,19 +117,23 @@ impl Kadcast { routes: routes.clone(), filters: filters.clone(), }; + conf.version = format!("{PROTOCOL_VERSION}"); + conf.version_match = format!("{PROTOCOL_VERSION}"); let peer = Peer::new(conf.clone(), listener)?; let public_addr = conf .public_address .parse::() .expect("valid kadcast public address"); + let nonce = Nonce::from(public_addr.ip()); + Ok(Kadcast { routes, filters, peer, conf, - counter: AtomicU64::new(0), public_addr, + counter: AtomicU64::new(nonce.into()), }) } @@ -171,7 +171,8 @@ impl crate::Network for Kadcast { None => None, }; - let encoded = frame::Pdu::encode(msg, 0).map_err(|err| { + let mut encoded = vec![]; + msg.write(&mut encoded).map_err(|err| { error!("could not encode message {msg:?}: {err}"); anyhow::anyhow!("failed to broadcast: {err}") })?; @@ -208,27 +209,29 @@ impl crate::Network for Kadcast { let ttl_as_sec = ttl_as_sec .map_or_else(|| u64::MAX, |v| get_current_timestamp() + v); - self.send_to_alive_peers( - &Message::new_get_resource(GetResource::new( - msg_inv.clone(), - self.public_addr, - ttl_as_sec, - hops_limit, - )), - REDUNDANCY_PEER_COUNT, - ) - .await + let msg = GetResource::new( + msg_inv.clone(), + self.public_addr, + ttl_as_sec, + hops_limit, + ); + self.send_to_alive_peers(msg.into(), REDUNDANCY_PEER_COUNT) + .await } /// Sends an encoded message to a given peer. async fn send_to_peer( &self, - msg: &Message, + mut msg: Message, recv_addr: SocketAddr, ) -> anyhow::Result<()> { // rnd_count is added to bypass kadcast dupemap let rnd_count = self.counter.fetch_add(1, Ordering::SeqCst); - let encoded = frame::Pdu::encode(msg, rnd_count) + + msg.payload.set_nonce(rnd_count); + + let mut encoded = vec![]; + msg.write(&mut encoded) .map_err(|err| anyhow::anyhow!("failed to send_to_peer: {err}"))?; let topic = msg.topic(); @@ -241,10 +244,16 @@ impl crate::Network for Kadcast { /// Sends to random set of alive peers. async fn send_to_alive_peers( &self, - msg: &Message, + mut msg: Message, amount: usize, ) -> anyhow::Result<()> { - let encoded = frame::Pdu::encode(msg, 0) + // rnd_count is added to bypass kadcast dupemap + let rnd_count = self.counter.fetch_add(1, Ordering::SeqCst); + + msg.payload.set_nonce(rnd_count); + + let mut encoded = vec![]; + msg.write(&mut encoded) .map_err(|err| anyhow::anyhow!("failed to encode: {err}"))?; let topic = msg.topic(); diff --git a/node/src/network/frame.rs b/node/src/network/frame.rs deleted file mode 100644 index 12d485e2c4..0000000000 --- a/node/src/network/frame.rs +++ /dev/null @@ -1,97 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) DUSK NETWORK. All rights reserved. - -use node_data::message::Message; -use node_data::Serializable; -use std::io::{self, ErrorKind, Read, Write}; - -const PROTOCOL_VERSION: [u8; 8] = [0, 0, 0, 0, 1, 0, 0, 0]; - -/// Defines PDU (Protocol Data Unit) structure. -#[derive(Debug, Default)] -pub struct Pdu { - pub header: Header, - pub payload: node_data::message::Message, -} - -/// Frame Header definition. -#[derive(Debug, Default)] -pub struct Header { - version: [u8; 8], - reserved: u64, - checksum: [u8; 4], -} - -impl Pdu { - pub fn encode(msg: &Message, reserved: u64) -> io::Result> { - let mut payload_buf = vec![]; - msg.write(&mut payload_buf)?; - - let mut header_buf = vec![]; - Header { - checksum: calc_checksum(&payload_buf[..]), - version: PROTOCOL_VERSION, - reserved, - } - .write(&mut header_buf)?; - - Ok([header_buf, payload_buf].concat()) - } - - pub fn decode(r: &mut R) -> io::Result - where - Self: Sized, - { - let header = Header::read(r)?; - - let mut payload_buf = vec![]; - r.read_to_end(&mut payload_buf)?; - - if header.checksum != calc_checksum(&payload_buf[..]) { - return Err(io::Error::new(ErrorKind::Other, "Checksum is wrong")); - } - - let payload = Message::read(&mut &payload_buf[..])?; - Ok(Pdu { header, payload }) - } -} - -impl Serializable for Header { - fn write(&self, w: &mut W) -> io::Result<()> { - w.write_all(&self.version)?; - w.write_all(&self.reserved.to_le_bytes())?; - w.write_all(&self.checksum)?; - Ok(()) - } - - /// Deserialize struct from buf by consuming N bytes. - fn read(r: &mut R) -> io::Result - where - Self: Sized, - { - let version = Self::read_bytes(r)?; - let reserved = Self::read_u64_le(r)?; - let checksum = Self::read_bytes(r)?; - - Ok(Header { - version, - reserved, - checksum, - }) - } -} - -fn calc_checksum(buf: &[u8]) -> [u8; 4] { - use blake2::{digest::consts::U32, Blake2b, Digest}; - - let mut h = Blake2b::::new(); - h.update(buf); - let res = h.finalize(); - - let mut v = [0u8; 4]; - v.clone_from_slice(&res[0..4]); - v -} diff --git a/node/src/vm.rs b/node/src/vm.rs index 8e29e30184..adfdc85856 100644 --- a/node/src/vm.rs +++ b/node/src/vm.rs @@ -63,6 +63,8 @@ pub trait VMExecution: Send + Sync + 'static { fn get_state_root(&self) -> anyhow::Result<[u8; 32]>; + fn move_to_commit(&self, commit: [u8; 32]) -> anyhow::Result<()>; + /// Returns last finalized state root fn get_finalized_state_root(&self) -> anyhow::Result<[u8; 32]>; diff --git a/rusk-abi/CHANGELOG.md b/rusk-abi/CHANGELOG.md index 2fd12cb248..678062e6c8 100644 --- a/rusk-abi/CHANGELOG.md +++ b/rusk-abi/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update `piecrust-uplink` to `0.15` - Change dependencies declarations enforce bytecheck [#1371] - Update dusk dependencies [#1609] +- Made owner methods compatible with BLS key [#2230] ## [0.11.0] - 2023-10-12 @@ -200,6 +201,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add LICENSE - Add README.md +[#2230]: https://github.com/dusk-network/rusk/issues/2230 [#1710]: https://github.com/dusk-network/rusk/issues/1710 [#1630]: https://github.com/dusk-network/rusk/issues/1630 [#1609]: https://github.com/dusk-network/rusk/issues/1609 diff --git a/rusk-abi/Cargo.toml b/rusk-abi/Cargo.toml index 1f3960e256..bf9905068e 100644 --- a/rusk-abi/Cargo.toml +++ b/rusk-abi/Cargo.toml @@ -15,8 +15,8 @@ dusk-poseidon = "0.39" dusk-bytes = "0.1" bytecheck = { version = "0.6", default-features = false } -piecrust-uplink = { version = "0.16" } -piecrust = { version = "0.23", optional = true } +piecrust-uplink = { version = "0.17" } +piecrust = { version = "0.24", optional = true } execution-core = { version = "0.1.0", path = "../execution-core", features = ["zk"] } diff --git a/rusk-abi/src/abi.rs b/rusk-abi/src/abi.rs index 24aceaaae9..8e2ae2d9cd 100644 --- a/rusk-abi/src/abi.rs +++ b/rusk-abi/src/abi.rs @@ -14,7 +14,6 @@ use execution_core::{ PublicKey as SchnorrPublicKey, Signature as SchnorrSignature, }, }, - transfer::phoenix::PublicKey as PhoenixPublicKey, BlsScalar, ContractId, }; use piecrust_uplink::{host_query, meta_data}; @@ -55,6 +54,11 @@ pub fn verify_bls(msg: Vec, pk: BlsPublicKey, sig: BlsSignature) -> bool { host_query(Query::VERIFY_BLS, (msg, pk, sig)) } +/// Get the chain ID. +pub fn chain_id() -> u8 { + meta_data(Metadata::CHAIN_ID).unwrap() +} + /// Get the current block height. pub fn block_height() -> u64 { meta_data(Metadata::BLOCK_HEIGHT).unwrap() @@ -63,27 +67,26 @@ pub fn block_height() -> u64 { /// Query owner of a given contract. /// Returns none if contract is not found. /// Panics if owner is not a valid public key (should never happen). -pub fn owner(contract: ContractId) -> Option { +pub fn owner(contract: ContractId) -> Option { owner_raw(contract).map(|buf| { - PhoenixPublicKey::from_bytes(&buf) + BlsPublicKey::from_bytes(&buf) .expect("Owner should deserialize correctly") }) } /// Query self owner of a given contract. /// Panics if owner is not a valid public key (should never happen). -pub fn self_owner() -> PhoenixPublicKey { +pub fn self_owner() -> BlsPublicKey { let buf = self_owner_raw(); - PhoenixPublicKey::from_bytes(&buf) - .expect("Owner should deserialize correctly") + BlsPublicKey::from_bytes(&buf).expect("Owner should deserialize correctly") } /// Query raw "to_bytes" serialization of the owner of a given contract. -pub fn owner_raw(contract: ContractId) -> Option<[u8; PhoenixPublicKey::SIZE]> { +pub fn owner_raw(contract: ContractId) -> Option<[u8; BlsPublicKey::SIZE]> { piecrust_uplink::owner(contract) } /// Query raw "to_bytes" serialization of the self owner. -pub fn self_owner_raw() -> [u8; PhoenixPublicKey::SIZE] { +pub fn self_owner_raw() -> [u8; BlsPublicKey::SIZE] { piecrust_uplink::self_owner() } diff --git a/rusk-abi/src/host.rs b/rusk-abi/src/host.rs index a6fb2b4ff4..13cefec46d 100644 --- a/rusk-abi/src/host.rs +++ b/rusk-abi/src/host.rs @@ -32,20 +32,24 @@ use crate::{Metadata, Query}; pub fn new_session( vm: &VM, base: [u8; 32], + chain_id: u8, block_height: u64, ) -> Result { vm.session( SessionData::builder() .base(base) + .insert(Metadata::CHAIN_ID, chain_id)? .insert(Metadata::BLOCK_HEIGHT, block_height)?, ) } /// Create a new genesis session based on the given `vm`. The vm *must* have /// been created using [`new_vm`] or [`new_ephemeral_vm`]. -pub fn new_genesis_session(vm: &VM) -> Session { +pub fn new_genesis_session(vm: &VM, chain_id: u8) -> Session { vm.session( SessionData::builder() + .insert(Metadata::CHAIN_ID, chain_id) + .expect("Inserting chain ID in metadata should succeed") .insert(Metadata::BLOCK_HEIGHT, 0) .expect("Inserting block height in metadata should succeed"), ) diff --git a/rusk-abi/src/lib.rs b/rusk-abi/src/lib.rs index 6724ceb2a6..52712d2449 100644 --- a/rusk-abi/src/lib.rs +++ b/rusk-abi/src/lib.rs @@ -28,7 +28,7 @@ pub use piecrust_uplink::debug as piecrust_debug; mod abi; #[cfg(feature = "abi")] pub use abi::{ - block_height, hash, owner, owner_raw, poseidon_hash, self_owner, + block_height, chain_id, hash, owner, owner_raw, poseidon_hash, self_owner, self_owner_raw, verify_bls, verify_proof, verify_schnorr, }; @@ -40,6 +40,7 @@ pub use piecrust_uplink::{ call_with_limit, caller, emit, + emit_raw, feed, limit, self_id, @@ -65,6 +66,7 @@ enum Metadata {} #[allow(dead_code)] impl Metadata { + pub const CHAIN_ID: &'static str = "chain_id"; pub const BLOCK_HEIGHT: &'static str = "block_height"; } diff --git a/rusk-abi/tests/lib.rs b/rusk-abi/tests/lib.rs index 61bf1a15fa..68648e0f8b 100644 --- a/rusk-abi/tests/lib.rs +++ b/rusk-abi/tests/lib.rs @@ -23,15 +23,13 @@ use execution_core::{ PublicKey as SchnorrPublicKey, SecretKey as SchnorrSecretKey, }, }, - transfer::phoenix::{ - PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, - }, BlsScalar, ContractId, }; use ff::Field; use rusk_abi::{ContractData, Session, VM}; -const POINT_LIMIT: u64 = 0x1000000; +const POINT_LIMIT: u64 = 0x4000000; +const CHAIN_ID: u8 = 0xFA; #[test] fn hash_host() { @@ -62,7 +60,7 @@ fn instantiate(vm: &VM, height: u64) -> (Session, ContractId) { "../../target/dusk/wasm32-unknown-unknown/release/host_fn.wasm" ); - let mut session = rusk_abi::new_genesis_session(vm); + let mut session = rusk_abi::new_genesis_session(vm, CHAIN_ID); let contract_id = session .deploy( @@ -74,7 +72,7 @@ fn instantiate(vm: &VM, height: u64) -> (Session, ContractId) { let base = session.commit().expect("Committing should succeed"); - let session = rusk_abi::new_session(vm, base, height) + let session = rusk_abi::new_session(vm, base, CHAIN_ID, height) .expect("Instantiating new session should succeed"); (session, contract_id) @@ -336,6 +334,22 @@ fn plonk_proof() { assert!(!valid, "The proof should be invalid"); } +#[test] +fn chain_id() { + const HEIGHT: u64 = 123; + + let vm = + rusk_abi::new_ephemeral_vm().expect("Instantiating VM should succeed"); + let (mut session, contract_id) = instantiate(&vm, HEIGHT); + + let chain_id: u8 = session + .call(contract_id, "chain_id", &(), POINT_LIMIT) + .expect("Query should succeed") + .data; + + assert_eq!(chain_id, CHAIN_ID); +} + #[test] fn block_height() { const HEIGHT: u64 = 123; @@ -352,11 +366,11 @@ fn block_height() { assert_eq!(height, HEIGHT); } -fn get_owner() -> &'static PhoenixPublicKey { - static OWNER: OnceLock = OnceLock::new(); +fn get_owner() -> &'static BlsPublicKey { + static OWNER: OnceLock = OnceLock::new(); OWNER.get_or_init(|| { - let sk = PhoenixSecretKey::random(&mut OsRng); - PhoenixPublicKey::from(&sk) + let sk = BlsSecretKey::random(&mut OsRng); + BlsPublicKey::from(&sk) }) } @@ -366,7 +380,7 @@ fn owner_raw() { rusk_abi::new_ephemeral_vm().expect("Instantiating VM should succeed"); let (mut session, contract_id) = instantiate(&vm, 0); - let owner: [u8; 64] = session + let owner: [u8; 96] = session .call(contract_id, "contract_owner_raw", get_owner(), POINT_LIMIT) .expect("Query should succeed") .data; @@ -380,7 +394,7 @@ fn owner() { rusk_abi::new_ephemeral_vm().expect("Instantiating VM should succeed"); let (mut session, contract_id) = instantiate(&vm, 0); - let owner: PhoenixPublicKey = session + let owner: BlsPublicKey = session .call(contract_id, "contract_owner", get_owner(), POINT_LIMIT) .expect("Query should succeed") .data; diff --git a/rusk-recovery/config/testnet.toml b/rusk-recovery/config/testnet.toml index b8e52c120a..4a079a1346 100644 --- a/rusk-recovery/config/testnet.toml +++ b/rusk-recovery/config/testnet.toml @@ -1,13 +1,19 @@ +# Dusk account + [[phoenix_balance]] address = '68UiBbsJ4PumJyVpS91VbffhKgq9p6QaLC8QCqzgLiKBX71mvCswmeViTHDsBJ3RMwsVcxBSkZ3HbjHAL9qCNxh' seed = 0xdead_beef notes = [1_000_000_000_000] +# Faucet wallet + [[phoenix_balance]] address = '4LULsDGr3CkeZcVDSfM9UtNr1Xa9DF7HqCEnfnbsDH2HXkkoCfdQWKpEwKwPF6enrSVoTTfb2bGCB8v2VyHHFoUJ' seed = 0xdead_beef notes = [500_000_000_000_000_000] +# Faucet wallets (Fulvio) + [[phoenix_balance]] address = '9Qary8ZQHYRZos3jmk4FBqo35mjJVqzsLwFthRB2vDY3wNnFTNaKcVrw66aeF8X2nYf5YqSq6BDs4TfsbBEnGjd' seed = 0xdead_beef @@ -58,6 +64,8 @@ address = '33GGzrthCdzCT98ZvHSoXGbQVKkYPXkRfTuxxcTVDW44fJpzTdgoaZYj8tDADmfQX44Cd seed = 0xdead_beef notes = [10_000_000_000_000_000] +# 30 Dusk network provisioners + [[stake]] address = 'pFPEcfxidLvwmFKRQoifrSyWmmVY9UDEThoRFvGXddXRLZ8hB7xfWDYQYwHhTvZvXeL1p5Ygcnsuuxm1X8nHFJH6tEgK3cS76squcFVFSejaKJGMorYZdTup5uscNq6eDU2' amount = 500_000_000_000_000 @@ -179,1667 +187,1400 @@ address = '21SQ3HyThUvJUAtn3cfYUAisdw9h25DCp5hT2vzeiiQrvjGpmjsZKmbMMQTFSfU3EsEYt amount = 500_000_000_000_000 # ITN2 Rewards -[[stake]] +[[moonlight_account]] address = 'mAkcDzY2uVvqbEv6Vkxbbro6V11z98ExmjCiNCD79Jrx3dLYrfPzrofpA5JZTDB8DWTBUUY2X895qmBkyEPTH8qs2nMStoXxv7XjxMkeCigGWjp877yzbZg2h1tsdeh99V8' -amount = 0 -reward = 39200810000000 +balance = 39200810000000 -[[stake]] +[[moonlight_account]] address = 'mLx5HUo5PhsobwgMJhzL9j8TY7TjC13EsxHL7cKLTmMJ9BqvnG2RttD2uMg1FEDprnSvmN7BwCkpr6wW9XSco2ASrUjou2neUXj4uq16NreXVk4jmfr3CEHqvBrRgEzoka8' -amount = 0 -reward = 45302459315405 +balance = 45302459315405 -[[stake]] +[[moonlight_account]] address = 'mNhNu5Zn21iBuPXYKfdrzQvX4Lr45MAWoxcYRS7dQz9v17ecGUJ5aXPTn8jwh4shui4N744VHN5CmDhjwVcARQ74TRtksQsxpUjYgWnypHSmxyHCD3QafCGrTFEwfApX5Ze' -amount = 0 -reward = 10688011305745 +balance = 10688011305745 -[[stake]] +[[moonlight_account]] address = 'mSejRRFwVH4qSGajDVDsJoEySYr42UetyVoKJnq9F3RZ8egfyMrDNs2wB4iaJ9ZWrTkXcPGHCsW4arhfow54DnuT5gQ4oB1E4RbFmPoNW9AHFDSv8pr5gAZtiPtNuGDuta7' -amount = 0 -reward = 5479200000000 +balance = 5479200000000 -[[stake]] +[[moonlight_account]] address = 'mW82qfkVP8tn3go9AUVJjvfgWTt6ERG6ZVC3zf9G31UtDvTZnKuj4akUDDzrua7tE4GSCAHn7jn26XQnhGjfB3e2EAixJY6TgJjAfrXdzuRFdwdaLTwnLWQmUddgggpXGHM' -amount = 0 -reward = 13199848921534 +balance = 13199848921534 -[[stake]] +[[moonlight_account]] address = 'mZzBqZhW5hzF9f4QD15f6DQhiHCTUUuTcJp9sbgYzMmUSr2dXWdw9feeAp8Qvcq1HxYhLPY41Zot6Sc59gw76hTPPLPWajDbQBFMK2stvy7ftQT8Z8cx8PbPk4cYdq7tjKz' -amount = 0 -reward = 7749200000000 +balance = 7749200000000 -[[stake]] +[[moonlight_account]] address = 'maR3HHEZi46zj7QkmUXHMrochpVGYhpKq6G2iwVMuG7qknLomQ6phVgnKx2mq7wvHxLefPM5H5Xn7wWZK8wKm7RRykovsczD97zZ1M4BXQohqza5ujVzw65fKhGFupJ9vT1' -amount = 0 -reward = 9353601884217 +balance = 9353601884217 -[[stake]] +[[moonlight_account]] address = 'maV5d1FQYH4MSszXDQAYy9DaL1kcBa9MynPzNCypRAhvmc9RXbDJgGcfaHZqzhJddTfc9et4GdibXEYEP22y8UKCZ8dW3V6HJFaoQ8GvtbG2P4oGx5Gih9cWyPDUz85KXg7' -amount = 0 -reward = 495109442243226 +balance = 495109442243226 -[[stake]] +[[moonlight_account]] address = 'mby7GWjqMPKj7ULWpGvpp4DC9tmg223nWzEffLirY4qKXZ3ziLpDs4MntQXwmn3JHrh5q4mdjSg6qLyi7eDQyDT2eSQ72yhB2mkDkrGbFw7TwXfB4ZeEa9eLgQ8gtq6UGWk' -amount = 0 -reward = 5683000000000 +balance = 5683000000000 -[[stake]] +[[moonlight_account]] address = 'miqXjVi2xxy49Vp7wiK2YWpt2t7xj4HzTqAW1JyrSqjF7y4i4rGCgD6AijmZnZihuLd3aEq3BcM4nAeUKWvTLvmTEa78axDtH3Z8zLooQaQDNtfM7KfJ9Uvekv19YGNPTCd' -amount = 0 -reward = 249517000000000 +balance = 249517000000000 -[[stake]] +[[moonlight_account]] address = 'mntoByrCpbZTBDyfsMvTMmDT9pDPhng3HA9ZKSBEerexYWAGuiEYQVdDiJAY7PAAH3AwNK3m2aspQNnFJKEEVAD9rBLAwJJwrzQQPMeTJSEMoDezNCezzSGbFGiF7fxx79r' -amount = 0 -reward = 2621013761332640 +balance = 2621013761332640 -[[stake]] +[[moonlight_account]] address = 'msnVj3UUqD9DMVm94JkQVxx4Xt9fvkQSTMF7GhmKZqhjveLnAqnSANpksiSq6sqegdhgkkGBppBeMPf9eRcS5f1Pewqkp9kYcefV3hn63162wNDv13hybXtjjgJeupovbCG' -amount = 0 -reward = 5587200712853 +balance = 5587200712853 -[[stake]] +[[moonlight_account]] address = 'mvft6AXjR1mDtg1Qo3GzGBKZAvvxY1S6h41DSEPh9Ewj9GFR61rPQnjVaM1W9nqkHijRC2d5Yo4FSBwU8wf9eHeEJYXuMSrB7eJxvsY6HjCeDJ9pKfJLdjayAfrxEyudvx2' -amount = 0 -reward = 26345376764288 +balance = 26345376764288 -[[stake]] +[[moonlight_account]] address = 'mzwpsJtkMT3qLnfPinDcN3HdfLk2VEdoogBh5B26G1U9BtfTZjCSQpHCXX2fhLg1XfkXuCVVvTDG55y6dm9szxUmEWZS1PB26UJTq6zooo74C8W9gmwbk6zSKMMHKaLFhSX' -amount = 0 -reward = 51409601347772 +balance = 51409601347772 -[[stake]] +[[moonlight_account]] address = 'n6qpRa3TTmDzaiMmnqNjviJhFpj26A9RznWx8YbpQbiqs4kArZGtqyGka6FQovWWqsU3SYMDFpuRKxtoe7xGcvbh9T7GFZfM1mfFXGp1kpbT7mvooMWWGpm3rBztodgRTZ4' -amount = 0 -reward = 140392911355009 +balance = 140392911355009 -[[stake]] +[[moonlight_account]] address = 'nGeRcG3E5je63fSAqXQSbAtj3U4DfqrScQUSbFWEK8c1367EfTQsNr2MbTHRq1eAAgvTtnmcNjFoC5Tj136vYAM6MeRSu1v7ZpGYLSU3QKbeGe1bm9YdRYCtMRcBLViZjRm' -amount = 0 -reward = 162400000000000 +balance = 162400000000000 -[[stake]] +[[moonlight_account]] address = 'nKfphGtCdB6YDbRu1dVSDHqqKa7LwJpcYg9NhXxHpdpPaQqePqYzQXkVKJFXCqp8QD37Sv9s9gR8gkJtrAB14CnfTr386JpP4BtwqUbUnyNt73EJhzssH7GxrfL9N8Nn9Cv' -amount = 0 -reward = 5599200262277 +balance = 5599200262277 -[[stake]] +[[moonlight_account]] address = 'nMTvZn6GYd7q9R6RVNv2mfBjVCDpS2eQkKncrpJB3tbUNwtbyb5fv13NsmKz5NaA5t2VuKF7qK7oCFUdNoJunvAjBHMJGdGrxoZhpgsgK512gqGeeaFjkYGQpwzYMVGuHfQ' -amount = 0 -reward = 19999000000000 +balance = 19999000000000 -[[stake]] +[[moonlight_account]] address = 'nMhCGLmaEc24n3Z3sBnXAkna3de2RerwkfW12cmPyPvBtaavprAYtmi93JZgRaEa9hnQ4nPKVcCaQEmVNMvJiuTjPMWfHfxPDFwqtyExbUr67r2LooXottsEMQCqW3mRknu' -amount = 0 -reward = 10325453961913 +balance = 10325453961913 -[[stake]] +[[moonlight_account]] address = 'nRDZTNgsRsaCc7aT8q9VVdy56UNRuMffEZhhRMsETEicgQunqHqKagrDsfivA4ZsEXfdmEaT1iWYmCacCuJKUFGGxpdoySzs9znfSbJscAjp2nT3jQRhtcpvujVAEYwM8eh' -amount = 0 -reward = 24490000000000 +balance = 24490000000000 -[[stake]] +[[moonlight_account]] address = 'nURCBF2EPB1dDTkTPAYE4HcL65pUJm8NzohttGMHmZ712Ggt9JNGHXFs6RhQcYNzq8zsb68Tifzv52ZN7f9rwENeDhXirKjEzKzBk3fV6LyiS4xYAqGgjibPm9hVeWXpG4J' -amount = 0 -reward = 10975202735911 +balance = 10975202735911 -[[stake]] +[[moonlight_account]] address = 'nWDih3TSkrMG1X4BG8A12BRQcrqdV5rd1YnCyieromYEcJZ8F8Ep3tA1DQyGFoAudgNVRwMBT5ZcmkMnG4aFgTh6DAonSun8WdnQtvCZUDAUWjSx7JoH4oD4N8qkWoiuy9X' -amount = 0 -reward = 81238424886556 +balance = 81238424886556 -[[stake]] +[[moonlight_account]] address = 'nZrqbqw8mnHJf7S7waTEoVjWss5JnaHHuKex75KfRafoYJYmCErefhZikd7yMiJbUPoPcnVuH6hGPvkBha3MdedXDgdSG9PrkP78CS8GQ7Bp8tivcSoYHd8meb56SFTYrNZ' -amount = 0 -reward = 10162229123068 +balance = 10162229123068 -[[stake]] +[[moonlight_account]] address = 'nb4fYpm7TANxd9u32Nkgny6KV53MkGVdLn1zLFsPt739WujLMd2MMoM1wd5F411totxVhpDMJvWAjEs5UXArgiWaozsdkr7QSwWnFYmG6DChoj6nVp1CadXJpYW18Mr5H5U' -amount = 0 -reward = 33285403641795 +balance = 33285403641795 -[[stake]] +[[moonlight_account]] address = 'nb8hbL5ynH2yuG5t9PZGVbvLkwfXD4cGCEFkwdnYYSwEkqjN6qZcWoFsESWUGLE3138QTH9FHVpuH7xCvjDspqmkzNn8VCp75LgC9cMgBqUFtkX97fdXMeFnt3HNMscRB9c' -amount = 0 -reward = 8672800000000 +balance = 8672800000000 -[[stake]] +[[moonlight_account]] address = 'ncrjNJfkoiPEVA5BSvfLsQmvJRyFn7GsjTKZQtmxP18pGKvMfFdkfVUmqs5TGUfAF6xFeFFBnWc2JuJTLg6uEscS1M9uGiRcPFg9Y8yyrsQTS85ETWHySYoKdUgKDf7FrhP' -amount = 0 -reward = 7770000000000 +balance = 7770000000000 -[[stake]] +[[moonlight_account]] address = 'ndLdw8byg1bpsf7gyw7JmsbAXiSRfJSo8cgmVDn1JG3tqTkQdbQVypqDBqKiqxG44KXCcFbBnFtVnu8dzzBrBuJxFGpDj6D5V2RtySnVF7s4uHytNMULrxxgq3P93Nq1FzH' -amount = 0 -reward = 24000000000000 +balance = 24000000000000 -[[stake]] +[[moonlight_account]] address = 'nem5qAR1LQqTxfhdMN7zq6Kn4ZrSjyY44uNcjev5rVjcsior9YtytswXpG1MJBk7Y3FRgEHc4Js6T546r4XF7Ugc33aKMGgq8ogjGxEmLo2nd28NgmJz3XNtV4BRJS2N7Qi' -amount = 0 -reward = 6572000000000 +balance = 6572000000000 -[[stake]] +[[moonlight_account]] address = 'nfLSEvQFS6v4BwrgJ59TQBHJikeDyvrapcJGmtkRD45ryhH8daJRqcRUGFpW2kKtxWHx9P2P4H1YisyEC2ynYQDKTcqusfVo6EdRQnetRNRbBifxz16PNU2JV46S7QHyRjH' -amount = 0 -reward = 9254403223912 +balance = 9254403223912 -[[stake]] +[[moonlight_account]] address = 'nhBn2phxNgSd9AmuzGzNvzk5ysQ2x28MwpYhNTk1qijTy73XXnB6oXk3hWgH1AJEApdzBRRa4UGDxqbhDWAGmSjdikR7EzPaXhCBUgyZ2gESgEEu9MCK1VT1FFRGwEwKrgS' -amount = 0 -reward = 6624800000000 +balance = 6624800000000 -[[stake]] +[[moonlight_account]] address = 'nhurdFSUBzYNZXSwdtAkMvhxqytRvuxTkCBpcpiDeLBk1kWNzxFRQrxE3M9WDfUNAj2HaLFcFTKNvL3iFxt62ZweD8J216cf1yXLbiFgHmTLDDoQo7cAjVR5MXy19pQsxAv' -amount = 0 -reward = 7398400262743 +balance = 7398400262743 -[[stake]] +[[moonlight_account]] address = 'nkCSuijXuecL4B6LQHAS7eyB5G1CFBSn6Vp92noCJjbgNEzuLbNGHdcUmz5BkhmkQGCmff49XdMEKtFPkQjydjh9LGGao39wnC3CvsefMUETUt8MJSLZxSyqJtgttqYcKRU' -amount = 0 -reward = 35246404919171 +balance = 35246404919171 -[[stake]] +[[moonlight_account]] address = 'nkmW2iW76pbZg25DkTSu8UwkpjPCST884Wx9pPGjixuNmLRZo83tRtFqPePy7vENxsngEZfPdASCsp524chVGoQiUa75ieHZhJ7bB87D8vh4iwQFyzEaateNWDPms9Ssyee' -amount = 0 -reward = 5300000000000 +balance = 5300000000000 -[[stake]] +[[moonlight_account]] address = 'nmbqJjGwnov6ya5CSStPWctWdaZiJa7W1aWsYWK7N4J45yS1HRDZkVpSTxGABcuugXjPdzpWHAZMk4Pb5yXUwBZVm4Nzq7nFQN6ueV1K4Rfp25VL19u3xzzosEaHDzC161C' -amount = 0 -reward = 38501610128182 +balance = 38501610128182 -[[stake]] +[[moonlight_account]] address = 'noK13uKANRgCS99YmRTKGkvyjuWbCi7nNe2kTyEAyeGi9mwyP3G9jpLeU2YThgnf769uhECABiCdSuRLdHDtZjnny1KWcj6RA4hGBpUw6Mm8j83i4dhvY9gXzBgwnZkJbCF' -amount = 0 -reward = 10187000713342 +balance = 10187000713342 -[[stake]] +[[moonlight_account]] address = 'nqXnf25MwWnij462yBAYBgUxFwKqss3P76H7w2JisE1czyzE4B66pQpcc9MPoi53abYhhNovWN7X9LtTip2mRJyMAH2g8UAzr3BiXzFpjTjAGaM6FN9eVbi8qk2HdvA9fF2' -amount = 0 -reward = 6020810582643 +balance = 6020810582643 -[[stake]] +[[moonlight_account]] address = 'nrQnZmwCsFNfe9yBNzfieSjahmVRerYQPdXanCdiUjym7H5ML22RNYZMvWx65mJzfERUt3agRDKagz3b9fwRjGh4pjmdVhMZANAdn5djbJ9DYwGjZNq6G85QMtZ8BWopLCE' -amount = 0 -reward = 8954800462778 +balance = 8954800462778 -[[stake]] +[[moonlight_account]] address = 'nva7jM9VG7TfQVHiGHUkrn6jpGq8QFgCMtAWLnJJj8X5PjR29PXqUPK9At37vSqszVpPmshPBKpzGHjjPLtjZzGRP8waF4fbLsP1Bxs2SqvWQGsR94E8X5mq21y2eJNxV6F' -amount = 0 -reward = 108928268094203 +balance = 108928268094203 -[[stake]] +[[moonlight_account]] address = 'nxjyrUsJcWh4HwfKBk1NTNstfDvFGR2aU8YnERdrngWWrUjKLwjvnw6KDNa4Hs3Mbv2Q2rcWwx9L6uuiAyX5PvkZNfE7mkwf2PPrikwvCpDyj9NxpgXSgfXvgmtcwyozeuc' -amount = 0 -reward = 1000000000000000 +balance = 1000000000000000 -[[stake]] +[[moonlight_account]] address = 'nyDfR3XeNq9qnA2C2SuYW1CwBW4kJ6qRjs8YLDht6vWaESukBFRzdWtBs6ZtsQexKzAExASTk5pGtHZhRSEAPU51W4xx1irvCgHagvRsXuyKk1NqMi5tmXiWMrAY1uopgrx' -amount = 0 -reward = 5499000000000 +balance = 5499000000000 -[[stake]] +[[moonlight_account]] address = 'nyGaY1MXjMexh5Q81dP1Dugw2MSh2e6bgzGBqdn6o2LeseKpLn9HuT7id2NExgnR9d1VQ42PfrLybhvvNvpnxLTCvgFLnNnxTVCkZTyqJv5enLFK3DT9P4qbxrahQA2gsTm' -amount = 0 -reward = 37779037544779 +balance = 37779037544779 -[[stake]] +[[moonlight_account]] address = 'o2pBnhTUsiqEvoFoFkHSk5ozhvRygk2FaQYaUM6PfjaT9MWvcCZbYZcMQgxqYJPvrfkPXbCL2dobZpsxuXoaKC7YExbsckY6LCtni5iRxPu1Sz7bXdQpJb2fkQTg9wHCx4o' -amount = 0 -reward = 10169600000000 +balance = 10169600000000 -[[stake]] +[[moonlight_account]] address = 'o71GNGA3SPb8UpArQjHv1VsLSpzgigYtCFhgReDXiypGW8rGBChrHgodTbGgx5qwmXQ6k2rziNmUC7ts8q8hGPT19DeTrYFQna9D7e9jtNzaotfy2imaEV3LBnu8KMMwuMW' -amount = 0 -reward = 11042886069611 +balance = 11042886069611 -[[stake]] +[[moonlight_account]] address = 'o8ZifNuDmwYwZPWS6AgwJaUTcMNuGomUcNu3a9nxSsEzXo4XV8B1vCP8rz6Q3EfQmQimT9eYxy5dX3WwMz2T6FDFgZgWZDu5dsbKVb6tSkeyv3uCK9MxWdJXY52ZCYSYXKU' -amount = 0 -reward = 18217227365897 +balance = 18217227365897 -[[stake]] +[[moonlight_account]] address = 'oA2RhVM1Z4FfhZNoth64MzVzuFik4TU8RPUWrmEtnq4Ua5PT6xhfEhQ5Swgz562NB91aqURtpwcuXH6VoJVTnVeKnhAm1dfWz2Lkmjt67v51qjfJb1us65YHgL25tjdYPyc' -amount = 0 -reward = 22003200971588 +balance = 22003200971588 -[[stake]] +[[moonlight_account]] address = 'oAr3WkVyZxb6X6ZxLSzaU3FfA3FwA6YhdXQU41NYpE3FW6LMWo7dLcYqrCepJDGWMfynZKnoNahndT2rLQx47w48aMs7TMSUYnqpVMbYkG2RxyqZMxey3znVXQWZANbQsxG' -amount = 0 -reward = 12310001050396 +balance = 12310001050396 -[[stake]] +[[moonlight_account]] address = 'oExoRHYtZVuhmTbuXcJhmoYWcKBU7A9DEKYE7j7P2AWRsA3kriqx89pWUR1XRgK4xmUSbvwQjPfabBYydvUoNExmFNEEwTkghhQTpbdrFD3JUJYKf9GW9f9rMUpicsaeGCu' -amount = 0 -reward = 99146156296088 +balance = 99146156296088 -[[stake]] +[[moonlight_account]] address = 'oHUEt3hvyrMsTJyv79KfK7QzB7pnvLNgHNtzr79N6Dte24F6bL3Ja5pW75Yamrfpp3tEaaLmbAWNYnFHkLoFAmw8B7pApC4gSkPCTKeSakZmzE44SrJwukXZMWR4PXjXZcH' -amount = 0 -reward = 21190400000000 +balance = 21190400000000 -[[stake]] +[[moonlight_account]] address = 'oKMXBgysxs8i4qi98KMjq2Ed3eEJDbyc5phzZBdMVUr3MJFgqmrcimCchR2n1G7PyVveaVp3UJcQGL4BqQ3M1aAsQvYgSDehv6rSMP54d9tphQLDBqV7zA7gB8QZ1torQGi' -amount = 0 -reward = 9694502137300 +balance = 9694502137300 -[[stake]] +[[moonlight_account]] address = 'oMGbH2JZD2YPGPWYb2pj1Mf6ZJjwMKGpqU93p8GpDMHakJNXv8fQ9ku15k5LwwZkyHZnyg4kqeEkAkcu4TDFbVTd1ucfk2GCSx3CRHEj8sr1dGomx3i5PRG8PRMS2yRRBgw' -amount = 0 -reward = 19374000792664 +balance = 19374000792664 -[[stake]] +[[moonlight_account]] address = 'oR3HnvP9EmnGi3ayx1skEaKrqijcy76Tg5z3S4mB7yqWifVBEqerccGpvkCHoiVxfL7orFZMeo2fmuxV9Hjg5TovqKXvnsixjpxVxKmmFM99Jw7gF6aBmSMjF8k6QgAa1nT' -amount = 0 -reward = 8900000000000 +balance = 8900000000000 -[[stake]] +[[moonlight_account]] address = 'oTV9s4iUjmBSh839fvav4vjatfvzQpLZi7zBAhsQ5ryRTwaCGde9AvV3qPAPtr6DQ3WUgjPwKGXcxHA7ZxguDHHexhiu8HnFTGnKdT6q1aksi5sn296iZ9FWxLLDs1LLThX' -amount = 0 -reward = 6707600000000 +balance = 6707600000000 -[[stake]] +[[moonlight_account]] address = 'oVRzGkBwFYa5VWsM6ZQYLhHeZtCiX96HvXU4CWeWQgkVg1gfk5LL5Aq2XVrth7g1J71oPq98w3ey83yRvNVggxiiKHMpPEnZFgfxVrJCWiqpHUG1pxJANaBFrWnoRDXu7VF' -amount = 0 -reward = 5914000000000 +balance = 5914000000000 -[[stake]] +[[moonlight_account]] address = 'oVkYoZ68JmRTp8AtYwrEwbjafdQrGJQ6H56rekdPgCfnJKVFo6GSJhAeRxB8A4QHn6XAFkEczSA2xJkbybsSTxHWJQwuF7RrJg3ucdCfxiQSaEXEbnjbbBNT4Q3MzEtxzZG' -amount = 0 -reward = 39407200262521 +balance = 39407200262521 -[[stake]] +[[moonlight_account]] address = 'oZmwy4BokY7GPcuTcokw7JiCJwXmPT4Ya9cx2L5iZC49chCbozBT1Xb5YMK2x2HrN9RSp91FMLNNSWPZwUkCM1kaEyHZyksqJeXExJJJBRqaZ3frLCVsDkiHJEmhxii8BJU' -amount = 0 -reward = 137127021316298 +balance = 137127021316298 -[[stake]] +[[moonlight_account]] address = 'obQddzZvEE7mNJQfedj1yD8xvZzoUmw6RTL6xwbgu8MipU5trTuuPSegKHtPdvBuYHiQWRMDRP9ie3cteaTMCPBBo4WF8tmm1EtTpUdgTLNX8tkiqSSMsfLvekspivUzc5H' -amount = 0 -reward = 22216000264213 +balance = 22216000264213 -[[stake]] +[[moonlight_account]] address = 'oceM43dkarVTxXx84CvSWGf96CdpKf4VGRLmwksHLaSnxuCWUtatx5g9vXpw2VXb3pHnjPgUUD8TAmUqC299Rgr6QATL7zzyaveKZ9nMam2XRGebCL4u8KMdixskDbuYamB' -amount = 0 -reward = 5549610472784 +balance = 5549610472784 -[[stake]] +[[moonlight_account]] address = 'odVTKr1e3qGtnhqYbFhAwYAAaCod4bdz9kKL46Z1C9GFnofMG3pUexxd3usG7BFwM3t5fMyQsSkVziQZmtrBjHC13ZCEA78JEtKsvMuYrhfy7mYBj3AnvBqGdsVHTeeqpHA' -amount = 0 -reward = 5399902962599 +balance = 5399902962599 -[[stake]] +[[moonlight_account]] address = 'oeL1eYoKSbfcDNHaRYf4NqUau6zUtJeaPaYZoAjqLuuG3PpLrG3ETdqDWh774sQprAakTD59KBdmQd7JscrgzwHCpPMmsbSzCBWwzUFRaqRTHoU79z7R5koATZqhoAxfABU' -amount = 0 -reward = 137800000000000 +balance = 137800000000000 -[[stake]] +[[moonlight_account]] address = 'ohdBJHiXBMqGfB5pDDtCqRNzsraGepxUH36Evj5VowP4wyVBmGgq1Y3rPZ35nuT3emodxceT4wpio1JqQVS79LHxGbdL3oNxJLQRakTFcWsNVyPeA9uKrU2eSGR9C8JpmJp' -amount = 0 -reward = 6599938302026 +balance = 6599938302026 -[[stake]] +[[moonlight_account]] address = 'oiGPqjfiKyZdxjJKPWAYdHMtaW6dVyiv5aUVFNCbsTMm5MpBywEpx7qmbUueototshKP2JkFNgGPT4iYd1nnSjgucHXQ4Rh5t4Tf4oWGLfRcdQTKBzphaVrDFaFKaR75uNQ' -amount = 0 -reward = 326762645753103 +balance = 326762645753103 -[[stake]] +[[moonlight_account]] address = 'onqd5ZqKfbQVsjVzfXiDf4d1p6acut7haQjaSyihjCkvmBpBWEKZP33efMRerxSFRggk3hwpJ572bBeGwN23nu6mjTsNisSVRgDAV7LDxbYpSY6U3mJ5nLgtX1GNGrQXa5N' -amount = 0 -reward = 66740708096447 +balance = 66740708096447 -[[stake]] +[[moonlight_account]] address = 'oqcCuFGu8zyT6wn9KNFY7vczeBFRx8ecrW4Raa3tAbKCVGz1p3QuoTsfaNB5dSMMziJLeo6t8MjYTuaasEhFU2XZsjGqkp5PXoTDuva4sgrgG9SeMeVHf3GkyMMxh8efxpg' -amount = 0 -reward = 9000600262502 +balance = 9000600262502 -[[stake]] +[[moonlight_account]] address = 'ou1oqWcTmqnkDMRFb6yDZ5FYbbf3qXPeSdURanbWSZ4F4kXEsDVanxpTnLhRW7uAF2MPRjxii1eAmyQvHvhEWeCSkQQXz6eAz2foxGcCM5WGQzjxGGreAuQWBfsjv5y7PZF' -amount = 0 -reward = 5749600711611 +balance = 5749600711611 -[[stake]] +[[moonlight_account]] address = 'ozZES9sJc2KfPDM4ovagzb6PrVkftgGmsM3wsamBKCgPWAtn2zV2Hvx55ToWcxektLCQw89na4U1DxvDUPioFSkJA3CtR2tbMtcU2PuYiKnCNcRrBuXFtmoiLcRzBqSZXJB' -amount = 0 -reward = 104941048640966 +balance = 104941048640966 -[[stake]] +[[moonlight_account]] address = 'p6a2qicX5qJnDU5c7XTEpUwxyy8xG5Li91jtiZV5TzdDDiAGETraZaKTfyr9LAUDYjsYQjPjsi9GDhKfhpQAyy3XXPBtNFpYgdrX4C24pS9kMW9UWDuo56hLx6dypNt3ZTj' -amount = 0 -reward = 8988400000000 +balance = 8988400000000 -[[stake]] +[[moonlight_account]] address = 'p7PBqdXXgguTJF7xQc4KMmwVAmttrNC6HVVEHXJaukPxLGUk4C5s1gMUdSkb1QH68wk46UyUhLoTbJGvpgG98n95i5u8EsNhLTEJPP3EFGAEw7jZDWadcPr4Yih2TVjDjZc' -amount = 0 -reward = 5430400000000 +balance = 5430400000000 -[[stake]] +[[moonlight_account]] address = 'p7yuxdAct4dyvBwsGPzWMDChZaiaVzAxcPyBvBU5CGqzZL3dDZ2zvyC2hZh3GhQuc99kgo1fJ3SnbCvhKbj9uVCAwYUXU7L1FnWRUYD8tD6LiBAMVLwgGANPhWNdYJWeKdC' -amount = 0 -reward = 494489074269455 +balance = 494489074269455 -[[stake]] +[[moonlight_account]] address = 'p9oEB9ADAntjt3DXHC4WsWFzEzwzSkV2emgVSVKtceXWjbKjam13Xx9X2fSzDBSTEi1PvjVEhACGNy5ApjE79Wnq3nhhvUWhfDfMH5ndg9bgBfkxTmBX9ez3fNhtVnihSRk' -amount = 0 -reward = 19891000000000 +balance = 19891000000000 -[[stake]] +[[moonlight_account]] address = 'pAsCGjoiMA2vo1TRxzsxjUvtQcKVd65skAZSU5gr2Ux9u42t8zWgv66rWP2fe6vYDPmXEF9stEvcjw9NdJxmVLfGGueDqgmZcLXhyafoRC4rrgRkMfUPHmoXvzEqmVdZnHv' -amount = 0 -reward = 14263200000000 +balance = 14263200000000 -[[stake]] +[[moonlight_account]] address = 'pCUybfSSyDJbvV2YMNrP1za2rhdbpsHSzkd1XnFwbHjeBUkmd8ZQqpBi1L9YgnSQ4zLmjPRshxQqASjiHdNuKybbCjX8e13xA3sniWyj79aaoNBYrTb2Ui3xVKsoiiG6Rwz' -amount = 0 -reward = 6697709493387 +balance = 6697709493387 -[[stake]] +[[moonlight_account]] address = 'pDDBV64AFS8dg2gtCzaQs1Y1if1JnNKWaFtWDvKuvs81UNBvL4DMnfVp7B4ebPPkMoMPPYishHBQbr4jYuFrQDxb8e1QZbuhPC8NdARAgmYEK7fBN9cwL2EA2heKGEbEjbm' -amount = 0 -reward = 9265400000000 +balance = 9265400000000 -[[stake]] +[[moonlight_account]] address = 'pFLMu1aTPAUTWqCw2aLxBJfZFruGKHkaasPXsGPnL6tfnecfxkgt2mWqrxoNPyexM3awpa8oyT2yjC8aERMrVwT4JNDMaXWaNyHRKb3kzaW3K24m3Z9QvDZ7FZhmczh9bs2' -amount = 0 -reward = 21989200000000 +balance = 21989200000000 -[[stake]] +[[moonlight_account]] address = 'pGzWWgBxDyqTFNxhcr2DsYm4L9MoeXQNMVGpX8y4gogocQaRnywhxu1EorFDWHCASBb6BhVkbzGxtjDQAtggAUGb8o4cPbQxF7BvpNTFrtRfbxSPr4uc7E3i4jvqbh1HkYF' -amount = 0 -reward = 7854321746103 +balance = 7854321746103 -[[stake]] +[[moonlight_account]] address = 'pLikTcXcNLCJtR9zTPphEQb3LAnRihcoi8kfUkq3G9CGSdHgVLbnrop48XSYb6u8RGsRctCTNiSwh7FWmRUwg8bEaJjXF2bDbBiTbQneFck2DD1YnMDNkDHE1EXAEDRn8eh' -amount = 0 -reward = 1696992395934189 +balance = 1696992395934189 -[[stake]] +[[moonlight_account]] address = 'pLvoQB7HbGymTsVZ3GPkwhZqR49yHM8PF89xDsxoqRWXLCHfiDLzyma5TmjeffpjiaLe7F68PxyUiCsnjorr2MJSDxN9jD8Uu44QW8EiEGds3hFm84ZtgE7qF5PzHeJ7zYA' -amount = 0 -reward = 15127200000000 +balance = 15127200000000 -[[stake]] +[[moonlight_account]] address = 'pNnVt4BaNZT8Gq4Xyj5Ss9m7VpCXBSD4URAfF8iBKc17L2T2tM2mSczK6nVy7nT4kx8LLqhmz1zTbLWatcg8FYUvrFvmLa3WS7mqCgP9hoKeE5eejU56ANSwrUd4PrVh7hc' -amount = 0 -reward = 9122800000000 +balance = 9122800000000 -[[stake]] +[[moonlight_account]] address = 'pRo3ETFJ68V4k5nUbv3rM6pvw8qsyrkRVTcj6xdW5nFNcqez3B1HCJNtYzgws2a3mVG4zppR3VC3rRfdd4ysfv2fFWjyXAEmSijxnDCsr469Ah2H8VZYVi6b5mdS5pNHiCT' -amount = 0 -reward = 18195218836647 +balance = 18195218836647 -[[stake]] +[[moonlight_account]] address = 'pVLcJqm7111D3erTS6aKzJF75mHWjYZJvtEsXDATBccNMeywptiPQ6VDaE57PvBjpEx3Pf7BjgPfqSkk7PQvPcK7p88mtv6ssLYjXKpsMdWNxmNf6GgVHWzqJ5Hs4HNy9LA' -amount = 0 -reward = 30161635235715 +balance = 30161635235715 -[[stake]] +[[moonlight_account]] address = 'pY9T2Wo96HoY2tFRAtLmY8o8Gkna5aoyphgedWuLAXsSaYUCnYPgYMJDRvMbvCUbFzRUfKw2kvjfqjWZf5rw7PWsbbuq7CiQj7GsUcJB5qhcZxMuPvKxjuxDVfAxzPP1qJh' -amount = 0 -reward = 9371200529547 +balance = 9371200529547 -[[stake]] +[[moonlight_account]] address = 'pf9xrHjYmZpm9LcoTMDmDHBQqizPv1Rbwb3H5QJ4yFSv1TXiqJ1whXeNygTEjfKcaCJamBEePzoaaYZ3Cq61Zu6Kr72Ny3ofPh37TPWQGcMv43rZ1wQK85EbTrxKn7gSWLd' -amount = 0 -reward = 5400800000000 +balance = 5400800000000 -[[stake]] +[[moonlight_account]] address = 'pjePGzrrEvBrjZd82VeAZgfr7J9jsidbw8or1YXkoiCtbkAaupmwg5ghAaAY8YNCgayNKiUUt7qtPG4utZq4GEzYCwq5JfFQsDHqooDuzRZUjqFmzHhjZtAJq9QyPUE3nnj' -amount = 0 -reward = 1772762993758444 +balance = 1772762993758444 -[[stake]] +[[moonlight_account]] address = 'ppMLM6t6GLmZb7xzx617TTHQPdHHRNSfB8PjtGe8YNbWAo4BRYfnNYZxCj62pLY8gXZqsrx7TaBS17dRsHoE81wLHgMHaYoq2z6GHX7KAD5TiRcX1w5ctiSqV3idx3SJdAe' -amount = 0 -reward = 10202400000000 +balance = 10202400000000 -[[stake]] +[[moonlight_account]] address = 'puGcF44mE8Rbs957Ej7j2gaaqVZ27b5M9rgecRczcMEKSuvStpaRumM9C5qmmxKfjasdpgQo2YPfwGGHFeGb8qitEGQjE3tx4BGupxDPQBkyKpPumz7Pn2SQVtitng8CB6x' -amount = 0 -reward = 454022495484893 +balance = 454022495484893 -[[stake]] +[[moonlight_account]] address = 'q2FsZVLeregzwyTowJRENLpUbTRv63xxvq6yrLVnofVt5m3UKnmStKQHmkEmeBTTLYRrAMADTz87Ga2eP72rjETLvKkxujXDyS7u7DbW59VzNiUmUVMEjh8nTs66FaxBHbD' -amount = 0 -reward = 5349600000000 +balance = 5349600000000 -[[stake]] +[[moonlight_account]] address = 'qBEsVmMVqcefAtZbwAtK4JWtmtqezVJNPWY25XNoaqnEt2rBJ3iJNufmtt66Qut6rkcCiHZt5DeKEZ58psWDBAUxFnbYte2KyUg69j8NsV4M8ow6gDs47EJbpTXQrbSJH1K' -amount = 0 -reward = 27980000000000 +balance = 27980000000000 -[[stake]] +[[moonlight_account]] address = 'qQBaPNADKYuK74UdXtBdq9CGrXxcaA1CAYeU5WjDdbBDwwB62fKJuNV1JGDfVgk2uog78uTmWsaCYANdQd4EqLDnYMVwC98Zn6KfX9CLUgYnQFYNS3JHgpCiq62Pi6QYGcn' -amount = 0 -reward = 8948400000000 +balance = 8948400000000 -[[stake]] +[[moonlight_account]] address = 'qQFwqieL1RWKAsFqowJ2wVSE7YrGzH5yeBgePnvG4cP6hMFfmoLM5qhPqhmGSWqMifkwvvbnTvV3KzUjhwaXNf282yFQG2ZJ7mzz33faCfFk39NeeM1DPktXkod1v3qCnSi' -amount = 0 -reward = 5632600000000 +balance = 5632600000000 -[[stake]] +[[moonlight_account]] address = 'qRRitpCxAnHQN2Wp6SkXktNiFLaJWdFftkznkkbYGpt9FntwEUiPy1shbfSgSLLBuXK9ZZcGWSm41VGG1Cm1ugnkCLzjnDQAFc8GQcFwVsRkddoUA5ByVPh59hiFRuixraR' -amount = 0 -reward = 9015200897679 +balance = 9015200897679 -[[stake]] +[[moonlight_account]] address = 'qTnyKiDC7ou7aELMngJCzWNBP3qSo9DRwDE2cjPr34ck4UKbqxTSL5bkDSHyKRJ22o4Wgqwu8ZnZ7ijfQcQGtsFtmajYqToc3FbQ6VxpFpT52snvhXb6BtotruZtC2pzTMN' -amount = 0 -reward = 184479076251338 +balance = 184479076251338 -[[stake]] +[[moonlight_account]] address = 'qVQusJyZMLYVXfB1DSh6iFXSG6XC41rF5C31grp7b3uBBMchPVc8wQxxpJpkkkcmBNxExuU32vE2oKMwY7qxAHyBoEjUUu5bYcvPAzRcwyvXULs8NHBDqAt4cY2YXbbERX3' -amount = 0 -reward = 6730800000000 +balance = 6730800000000 -[[stake]] +[[moonlight_account]] address = 'qVmKFAqDACSK5Qb5PV3U79TYw5HdpWERTTUryoULCGSBnfcWCHpPU6w1DnMiLhN7v5rLhGfsrWRNatovrNhWHhdVsPhqTe2bNrU75cdLG8oWdNwNQG7Tkq1kcaFRwkiwzi3' -amount = 0 -reward = 13773600000000 +balance = 13773600000000 -[[stake]] +[[moonlight_account]] address = 'qXPydJBqGQySjkFNnh2NkuU2RtE6hwwxS95pC2Zqpcn9ZpGaJj57QbgiB2GzEWCdDtG2WzbiF9hG9cNAkQjN1unePJ2jv244sHsDyYCZWbRM9x78qkEsLDQL1BgqpLdUqV4' -amount = 0 -reward = 7650000000000 +balance = 7650000000000 -[[stake]] +[[moonlight_account]] address = 'qeitmKWiCXPkujPFVCYv9GzPSYzBU6djxCJqahUVZkymDurowd3tfhYXa28177UZ79RsuokuRmizFRJv9268Zc5PjojC2ZEEwscPTeF3HHCvbz2vTmycTUddWsxedU8ZwFJ' -amount = 0 -reward = 5115200000000 +balance = 5115200000000 -[[stake]] +[[moonlight_account]] address = 'qi4CRDd5rTkdwVNG2ou4QaS67nDWcMkedaiHWhuMZVCU5r3jbtZRb3VGra6ggj6VnyTaQ4nyfKQmb5LV4qPpGSCgbvYtyAiTgnXDNzDLG8ZYhVQtHCqMgQoRMNpqUM2mbKG' -amount = 0 -reward = 5115200897408 +balance = 5115200897408 -[[stake]] +[[moonlight_account]] address = 'qkciKKjrVoqGQJSfYmk5zhV991Uwzc6G9FH9p15wYLTFUxJkbGqySHHzUudSRHqQLNjUy8J9f3r8qKhipijfeXwMDx2VSA8HGpxicKGQDx1WybgS8EeqNKX2doadzVxS7Jg' -amount = 0 -reward = 5614200000000 +balance = 5614200000000 -[[stake]] +[[moonlight_account]] address = 'qvNKWk62uzxZPxroiSnj1sxKRLi75zMppBbBoYNoBynnJcCgGJxo6Ak9RLU4herbjdbye4Vp6P7R2uQrvGC6jRbbwg8sy8hEyJGWwcpwYYhWxvhDQgvQZZ8ntjd5PiRFa5E' -amount = 0 -reward = 116019200262435 +balance = 116019200262435 -[[stake]] +[[moonlight_account]] address = 'qwokK2bPQcV3Cgzesxid2T11Tr7j4rpNW4RoF3ZzsSfCYnh2gajPp87Zd8N8SaN63Aw473CJyus1LGFJHMzc4ZugmBFE6VrHESRs6ic6178WpkyRS5PpSni3f3tszkpW9zp' -amount = 0 -reward = 21990000000000 +balance = 21990000000000 -[[stake]] +[[moonlight_account]] address = 'qz4WMjXDjEXV2UxooEEYsB1TbeoSXuDgBY8A3TqBr6SddEB14v5Gxy7HNH7Yxec1VLVZducU66Q7rkLfBQLZQ3PmMLQQAT8HwjjpFAd1rehVz1FoXZxXddTPrpQc9WpYyAv' -amount = 0 -reward = 5504400000000 +balance = 5504400000000 -[[stake]] +[[moonlight_account]] address = 'r31n4t8CfsQ3iPsFZQipRMMwBsLZY1QPWApA12UmZQL4ovcWcSQJzSqGKu3khwmKnpr7Gy3Asd8yMhVa5iQbrJqdAacfRWkFRheaPPxzfBRfYCH3Mj1wGW9SrjRGYs21xZH' -amount = 0 -reward = 7784000000000 +balance = 7784000000000 -[[stake]] +[[moonlight_account]] address = 'r9SdR2HASMr6ZqfpAZsmYquajKTDeYFgcQTJ4YRctrmmeTqFUEx6oeiGvgCjzm5zsDLHW5ynJz58m3rbiKXHv1fbBHng8VUm5YmCtFKU2raAYKVJdhf6kvQ1a5K5NwWPc9h' -amount = 0 -reward = 22221000000000 +balance = 22221000000000 -[[stake]] +[[moonlight_account]] address = 'rBD2awoqYzYni1MwhqLqDLLy4DQXSPkhHUbidV2L4nGpYmhQEt6a79Ur9Z1mwZtAePPzUArTr2nR4w6wMnHPJmZNaYjNR1UewhK4pvwtfZQt9ji83iapMtnMaGmeshCkf6k' -amount = 0 -reward = 73308082293129 +balance = 73308082293129 -[[stake]] +[[moonlight_account]] address = 'rBQ5m4uwswQQ5mvSSMKXADpcZ9qAsHMWdTm4QgVhFKtxaA55FipuEBeCzTLqEcDJ79WDXQysHzMccGs4hCwtFMcnHEg7WT1YP11Ng1EU4KauvHvf5P2wmF82qs7zfJFRVKK' -amount = 0 -reward = 10272811380575 +balance = 10272811380575 -[[stake]] +[[moonlight_account]] address = 'rC7VrR2X35N4nq8c9o5xsT8buA3xwPu5WUavfDmQEyW59KbANGuHYA6LLwiWmDpfWhxuzmdV5PfpW6GGhrE78eBNjA2wP27pZWASEsbJfEVboF5ZUuvVKCiESwfVXypG279' -amount = 0 -reward = 25172800000000 +balance = 25172800000000 -[[stake]] +[[moonlight_account]] address = 'rE6MWaDh79JSVRKdtQDrNfc4KfnR5VWX7FZAFY5QcsZFFKibQ1Wy3vjSDanEVN3nJhLYnv3B4HSWgwyQ1v1399MYiSgxdfw9xmr2p6qPqYhBr6mY5o2HEw1eFMvszxFQTPA' -amount = 0 -reward = 7901479565968 +balance = 7901479565968 -[[stake]] +[[moonlight_account]] address = 'rFiWhUsdEpsmGh4HSYEWZCr6P8NuQ732ye9NDVdrh49KWQYB41pTFnWYt2e8ujCotA1EZpZm6vGYPKABNiwF3bVz3c3fc9Zotxe6MhsG2fBYRc8Au4s1fnpPvGBzQHwRej2' -amount = 0 -reward = 120369731716968 +balance = 120369731716968 -[[stake]] +[[moonlight_account]] address = 'rGjnXmEYPRvF6YKxXihXb848bprK3t1GhEji6komWv7v65dNAdhURxFmwGxjtnmDrDzmj3P4V78Dw1eDLxC6ekGAjVQMKxEg6LpaLHYZSQYyXkRDeonhB6wpnpRmmjHastN' -amount = 0 -reward = 7253111358097 +balance = 7253111358097 -[[stake]] +[[moonlight_account]] address = 'rJDGXiHS9VeK7JxWXQPy8BpbKgg3ix1rPc2aKKX3TWeWMiUamoa5ovdq2vNE49HtUARYHXqwLZP5E4Mhe4yL2KNRWsvkbTChh445HiAJzDaVBQjxeXLGYm9wcQXKF7TBpiX' -amount = 0 -reward = 5501200000000 +balance = 5501200000000 -[[stake]] +[[moonlight_account]] address = 'rLHb3rJXQoVbx8F2BEbn4jkTcia2hY79XcSCwKQac2KGiNpzaji6WqPS9XuDUGJogUgmQdTJffhZHCFWx4Cyivb27r34e2DVQtAHb7MJzUrF9fKWhPVGnQK1XTuYmGi5eop' -amount = 0 -reward = 15257600000000 +balance = 15257600000000 -[[stake]] +[[moonlight_account]] address = 'rLhm5Ct3eNZdZaG4tm86YFvJjK9Dd8sYSx18uYWaAABw1En8w7YUTTp8Vm8GB6DGpNcomNPSmXJjMPHRhx7Uv5hwg7C1GvAMZC7x1n8drEXuFyy7QzmuY8Foj1NN7LKf2EM' -amount = 0 -reward = 29215200709199 +balance = 29215200709199 -[[stake]] +[[moonlight_account]] address = 'rMAiHCC6hf6vFvAfXsDgRRwHbmNV2VSE6NkTiqJGjPyQkdiygztkZ9F6g19MdWDYjnYc5HPnJx6iFqHG947b5KFHsAYCmf6CaDkXHz2x3uf7EwtJp9KoMmB6ihYeY8tHVBU' -amount = 0 -reward = 6590938214355 +balance = 6590938214355 -[[stake]] +[[moonlight_account]] address = 'rP8XG26cbast2vHNfE7V1y3X1Lo9fFqm616PhW2XZtopP696VZc9CNts3zUewyfFW8ZMANpjhXyF3RQ1suQRevFTdEXMnuijLnB9xdGHSBQixPtXVpEUJHAnnXXyfhKfkDE' -amount = 0 -reward = 36200481261580 +balance = 36200481261580 -[[stake]] +[[moonlight_account]] address = 'rPLftv5akA8hT1996Q57ofCTkGkpPyJr3ZRQrEhRqCbpcuy77KprDteZDZaoSDuzKG3JJgbcDiBt2yG5cBcoLnijo4PjcjHi6qeYMCoTctWvyRdSd81d9gYmrG16gzXMib1' -amount = 0 -reward = 18000000000000 +balance = 18000000000000 -[[stake]] +[[moonlight_account]] address = 'rZ4YsASuX9Y2oeJhjzTv9RXxAqtqJQYaRbQvbkiXfEqwJ5waWUn2tWuhE1ZWiwjiHK7heB3tPfzh9gzBLbPmHNyKoWzLeziSCPxXt117TG1drQoQiHUjGceCLpAJKjVfxYF' -amount = 0 -reward = 11149600000000 +balance = 11149600000000 -[[stake]] +[[moonlight_account]] address = 'raHQAn9SKW7HhTUZooDaDjXcFEPnhePSEGxfV8i5zEYcuDAQLzgSEdDf9whzJfTcUFNM9DWa5QXGJ6QFYs6YMMoa71C92PPnJYJqpaGUFAi1QSp981uAM8ySxTbdCVZQj2n' -amount = 0 -reward = 10130000000000 +balance = 10130000000000 -[[stake]] +[[moonlight_account]] address = 'rb5zC89sQGRfRRH5m8VKCCf7Y5i2NVnxdAxkbQFvJZ941SCJKBdUFmDXX1tRzkeg19QSW8YFb65Adc8aCJTYGzw3MAHMbkQWrQbDiFZruw5CRh9En5qJ2LaGy1dnzWqC8vs' -amount = 0 -reward = 6697600000000 +balance = 6697600000000 -[[stake]] +[[moonlight_account]] address = 'rhxkRkHKe2ZzFoQfWuuUfgDsSMTqQ173rR1QNbpPhffD9WrJTH16DQvFUpaQEmtboCaVXvY8V6Yx8iiS5n1zpftATo7fRkmCswS48baiXE57NuUA3viJsh1VGnyRCPzT5u7' -amount = 0 -reward = 19770602960467 +balance = 19770602960467 -[[stake]] +[[moonlight_account]] address = 'rjMoWLdr5cG3PKwXUw7jmAsEzPv9Tk1QYdV5ASqCw4YEQXBLGDcVLepYUyuakd4wrhMuYZGgXKihd2o1YJVuufjGhLGV3nWZdVe2vup1yF4LFepABXmTybtDVHGsk2L8XZS' -amount = 0 -reward = 400156238274898 +balance = 400156238274898 -[[stake]] +[[moonlight_account]] address = 'rn2Z6pqzKr4XYHA47S6McLcX2AGeDYMzMt6KQm445R6eYegccafK57QXVBqxfNi8f15KVKBSnQM5XZ3Jujkj6cydufTMdT35dR76cQ4wymdnFgqA75VopvzHkN6EFVpNAtS' -amount = 0 -reward = 250441756185618 +balance = 250441756185618 -[[stake]] +[[moonlight_account]] address = 'rogBxKsqTJ6XHv2b7JoQ3UGGyYm5gCLvfnx6x4wXRAdJZXPaSSELitiAwuv6wJiwxNX43uw41FPGwHfoHcwJMBSNjCeKEBoEvdS2QgE2mt8DuatKPFKXu7Q3bCaeH6Bbpiu' -amount = 0 -reward = 82476932713507 +balance = 82476932713507 -[[stake]] +[[moonlight_account]] address = 'rutEHbuJDm7N4WuQa7bR5JywjqYUZtaCmUYS25v9Q3CiAJBESLazbn6zWVr33tEbV91Xf2RXNYpuDsooEWQBhFYSrMtmtQ21vRjDtc5HT7WNVtyBfZ9XGFq5Z7nutHzDKHS' -amount = 0 -reward = 21671308328783252 +balance = 21671308328783252 -[[stake]] +[[moonlight_account]] address = 'rwrs8NYX8Q24aVPthSL6fNfL4AM8c66hbTTwAsCTjv5zjEbNLDbqjg8qMLSyNjqQ1CHMmML5oLsJb17FKh3C4Ke3v9Yg5yo8EnB4Z34RLG6NuNU2VWJvESCQdBav2yvBT1y' -amount = 0 -reward = 6680400000000 +balance = 6680400000000 -[[stake]] +[[moonlight_account]] address = 'rynwxcWTyXSTcu9NjebjmdXotHwnPMQwVXrbHDwH8RD8aztdfFqLb8kZBeBw2Qnwk2pxv41RFkaAsd5Cy6Q5xR9MM9fNka9sXnpXKVxpUBXxBcuinBCisN82wKpTPu3QCBq' -amount = 0 -reward = 7788000468347 +balance = 7788000468347 -[[stake]] +[[moonlight_account]] address = 'rzZsFKYjH7k2TPFrd53XhUep8FpCuDbBZ8ATdYoUbjyNwYFUY3iU4vrRMSJJ5tDQgcJCUYGHViC45SstFwjnKZU2a1E7xYfMtJT1mbTuELbpTmY94fMLVXzcRhJvMHFuozf' -amount = 0 -reward = 5608400436807 +balance = 5608400436807 -[[stake]] +[[moonlight_account]] address = 's34mds1AiVPHpjv3bozk9vUcbKVYRjggdpWhAqMHtLjgWCmk6B2dCoLCoUk372xXgMLpq6Fug3Fw1gKjm3VGcugigAcup9L9zDRqqKAtbLoEV9hwJwacndqWSCn5JeokDER' -amount = 0 -reward = 12572800000000 +balance = 12572800000000 -[[stake]] +[[moonlight_account]] address = 's4gBrQgvmm8MSfzzxg1jDY226kG1MeFAN7a63Y4nrLwg9nZTKDPGWEcYpwmjY6k7Bx2DEmLbi8MNQBuw6P16jX1LU6YFhkquoSLHak7zN45mxMxRymUZjD4mjnFjCGRu88L' -amount = 0 -reward = 5464400000000 +balance = 5464400000000 -[[stake]] +[[moonlight_account]] address = 's9t5WdSfrj2JAoQy9Hf2A3zS1VuEQigBSWipLK1yGrFSnrTDbFpAQEvC8NM4WJQ9FxmAQqBJCm9YZEYjRqFt4y6nEA66RDPxVqfXJEEZF9wStzKeEc5s3TmW5eozwsBP4gf' -amount = 0 -reward = 1720284046808227 +balance = 1720284046808227 -[[stake]] +[[moonlight_account]] address = 'sEXLeRwwwY5ZVZyRDJj85VXWj9zoTGUkQby1aUr4wcjVhCCUydT2tGABKgStPkhDsNgMLMydZWDMqyKwjaAuQy6PFo9pQ6th7hWGt7vaf5y6s96D4Rhf4ea52uN9qzQm1vx' -amount = 0 -reward = 147222128463444 +balance = 147222128463444 -[[stake]] +[[moonlight_account]] address = 'sKYi3Gw5FTZoipuf8iX3HU7UDhyWcP8cFycikFUsKR95FJyiqURNhgQ1JzGXiwBQp8paSvqnqf38rsvtBa1TRZizi1GuJBUpnAnCohCWVGo3SjgV6gBm1sfsxFeWtM7ppua' -amount = 0 -reward = 268525701221888 +balance = 268525701221888 -[[stake]] +[[moonlight_account]] address = 'sMPzEDwM5xhgh5vHGcNEg1JNs1SCFpAsAtDm3SR4eys9quPvotEM5tMNWuUh9qmCWtQajr9NYi9aonDVpfKJRg7XpzT2Rg5RHFX7MnmMV9nYsH9c8rraPuSyMjDPAWVyxV7' -amount = 0 -reward = 213026782765120 +balance = 213026782765120 -[[stake]] +[[moonlight_account]] address = 'sQrCiff7hiDSijtL796ihfqfuqdiCXe26P7o5p5umNEzbMBntGrTgmmZsERy5FWnmFShnXcouagQjDDabVRpaQWcBHHpGMVVtUPLeyUB9TsK9FiKqia7SszvRtU91WVZteX' -amount = 0 -reward = 6908400974609 +balance = 6908400974609 -[[stake]] +[[moonlight_account]] address = 'sSmc5wpcrH5KxWu6KhAY2nPrVBK5md38WLTBs75tL4qfaz7porCD1iLs8Qnc4HVzwuPAKN4uADBxB3YZ6ucNzyXNXVCsMiNP5dwf31wLx5VT7CgQaSjxvDoHdshmYnNpZNt' -amount = 0 -reward = 5566000000000 +balance = 5566000000000 -[[stake]] +[[moonlight_account]] address = 'sTHkTR3RnBEC4ipYXhAuFkUxN4YvK78dhHvhvbK4gHWBZzRfaEAytg669hAhefKfvsiRmAcw16Ckv7bvbjHRhgd9oi7NouJXYo7weRbssnHr6evtEb6J4qswBCKzYKPjAxm' -amount = 0 -reward = 5350000000000 +balance = 5350000000000 -[[stake]] +[[moonlight_account]] address = 'sa2MdiJhznhPH64AVHYGoZkVW162AEB2UXUYCyLNnW6PdqLb3gCD98bRYUHYtBnrn8Swu2Hgx5ZshKwS68hPcXRncC9dsiiJqAwNDupteayAPmnR5hm1ABkNsKPNdXXZoi7' -amount = 0 -reward = 506550600000000 +balance = 506550600000000 -[[stake]] +[[moonlight_account]] address = 'scRkV9xaMCNTsjEx2mwDABavD5exRSNAyCnTZT9hYi2HGKPRAYhqzff5BmdsXgqaYRxgSxkyiDUBFiyHGhuHxMC2R5ztdmG8QUe6jBXsyFMJoGx6H9faXfyA2XwXrJMpbfo' -amount = 0 -reward = 594985632097446 +balance = 594985632097446 -[[stake]] +[[moonlight_account]] address = 'sfeCjqxLAsEpv4Y8nkMJRq5k9N6bdMuz27TNPXBx8HBnNATRxe4P2iiCriXY6PZAbnt1bFt4VY6vGzswFResCwFWeHRko5nSebJc1uxTx7Ct67y5V15kyYaEYtUtfoMwpLT' -amount = 0 -reward = 24296284389805 +balance = 24296284389805 -[[stake]] +[[moonlight_account]] address = 'snoU2rVDYQHg9abS45uPa8MsCLauHiQWKj7i3U2cSrQJZrzPymYnTjdPvQmy9Syi3VowM8tZXMZNRoJfdtirminSgiVDLrV9GRhXM9Mp9q5NUen3xWsQpzLAR52e2Xv8PYG' -amount = 0 -reward = 6782200000000 +balance = 6782200000000 -[[stake]] +[[moonlight_account]] address = 'stEepsCQ13uvpoDyizqGtiZPYPY6HdhLVqViCMuRE3aRucNPTPVCkEaAW8W1zw7Pr99v2BCEw5cNWCcdxBmJwu9sv2pYd7BS5gbnHYT2j9cLPvufKBKzXWC3pY6xw2wuBwd' -amount = 0 -reward = 8856000000000 +balance = 8856000000000 -[[stake]] +[[moonlight_account]] address = 'sv9sfihYdVFBm5RWuZae8d4JqwEf8ifNxmAjFxAV1xY9YJkq4SQ1huaLV3MfbauSk9vAXgCcWVZkPHnfJdeaA7agCCNAJ3z8ZgLXeYW3qA2uWUyYBaBmqNRG4vAvVMtCdrC' -amount = 0 -reward = 5658326994815 +balance = 5658326994815 -[[stake]] +[[moonlight_account]] address = 'swXdfo1CkNtns8BTxkGxS8B1KXZsgnwd3NPwn4UcL7849o3tSf3zq9qZFwUZRwBUhvVheyAjmhYt7DAtjSvf3nypr3V6UWD5ypSaX2ovspDv5s7bvxiNdLJTufGw3UCK67L' -amount = 0 -reward = 9999052548047 +balance = 9999052548047 -[[stake]] +[[moonlight_account]] address = 'swt5oVf8T8vk4RyCCgqm8ZAHcEUwmv3cfWJxirK881kRsjgLp6X7bUGgnmTmiNjMsxHBsEVxiTFsx5iGdgJ26hoFTJ4tK5gUVtZkMeuuN6eQRibjBCqfsLFzvE95C1Lze7A' -amount = 0 -reward = 5113600000000 +balance = 5113600000000 -[[stake]] +[[moonlight_account]] address = 'sxpZtmeqGXh49S23ftxzhMYNUdAgAMprAxocTNBWaqZ3LGF5KZ6VwgjKMWD5de9JC4kWucvcNiX9AAzKZW4v3cKqmnp7tq8KhZp55QUdTkfLSVSMtFewGE7rFosnsR2Fq67' -amount = 0 -reward = 11143000268096 +balance = 11143000268096 -[[stake]] +[[moonlight_account]] address = 'sxwbTP5dLLu6sXYQBC7xDF3SRBK8LrTVw825CFocxxhfmszUQF5Fks8o2yk2p9xnyyu36Pzzvbbt4AFPVqxCAupTdbfp9m3FS91pgV92vmz3B6Fw5hUy62KYvSnTcyPWZt3' -amount = 0 -reward = 6607200000000 +balance = 6607200000000 -[[stake]] +[[moonlight_account]] address = 't1CJG9ks9aAoh8SZRiPWNdhDBubfMxM6afrQLLUgcMdPCEX5o4V3uBQVr6wq9RJCc9QvCFnJgNbxGrfnhfcsSAtuXHAn7ZYtcFj1AWJB4gpejC6bci5TziTuECqiikGX1PB' -amount = 0 -reward = 7285600524723 +balance = 7285600524723 -[[stake]] +[[moonlight_account]] address = 't7e39EETKLqNmaUWmKyKc9S7wi2hLjyzfzikWcpKmSukCvVgj4rzL92x5gBgNFQKASgm53p9RkKxm62X9WeoEPBgpPeNf8qt9MUaLbos64NfXSmFZdDK8Da56SBfpnVsBvj' -amount = 0 -reward = 8270400272862 +balance = 8270400272862 -[[stake]] +[[moonlight_account]] address = 't9ph1a3NyuZUZdPDCQNzA4ypLPvUhMZW3WiJzDPEjJCrB39pG53qpfmHoigk42ARHDWzQXwdFXSNtu2zyZC5JRi4eZshUzVEGsJy4GEL3CKmKRQ9RwkRBMpkJqyPscbq4AD' -amount = 0 -reward = 6000800000000 +balance = 6000800000000 -[[stake]] +[[moonlight_account]] address = 'tCR9c1pQU1jC5QgmRi3JRb2g1Rhtrc6AxT24VQPtMY3wrsuRrnMBMP6wSoKWXH2opKTeCm5aniEG2HH8ATcUHzeWe6814e8qdECGvLLZvhaRKsi7MJgLAA33PiWZ4b6ptNt' -amount = 0 -reward = 195125697840907 +balance = 195125697840907 -[[stake]] +[[moonlight_account]] address = 'tHPPwLrkFMnXG6Ax9nj23peFwLtqKn5zf48433qWXRyWMu3QsL1ta6x1DrsdWH46CmV8DLFdU1tp5eTohfdL8Lq26tqgT2soNejN9mXaJAXvSJ4Ma8yauiTj6fUT1z5gNfy' -amount = 0 -reward = 9899887809980 +balance = 9899887809980 -[[stake]] +[[moonlight_account]] address = 'tMKhKbfefQvC5Tqw8HT2NWEpuj34WHSvko2T7gQewGwQ2MvNXvuJy6LRoVKb7LBY7hyyrZVYt6mdr71sgnPpj493oy2f6yeQrbESAj5ms7sVh3ve866BsLuiSucjpdb9jv3' -amount = 0 -reward = 16091200000000 +balance = 16091200000000 -[[stake]] +[[moonlight_account]] address = 'tT8VygN8dxQmmg7pDcNBT7hA2zKeEcVTQiYkMXdupjnehcmLQQziLTFG2E7xGP9U112brALxBJQXa4MnjHKxi4g4EFtFHfaviN9oddcxwVWpmuity1PZpnjYfVpnQ4FtkDv' -amount = 0 -reward = 6669600000000 +balance = 6669600000000 -[[stake]] +[[moonlight_account]] address = 'tUFyVmch4NW8GrF73UdDA8hr1WK5Qu1ofrzuEyoq1d7Vxd28fAYiA2Rw4ZHpcp8nwch85sdiuDLxYw2eJuc9GGpXavckpd78ZuyND2rQrp6WP1hq3RC4h8YsDMzz1W4SGCS' -amount = 0 -reward = 1202402016819536 +balance = 1202402016819536 -[[stake]] +[[moonlight_account]] address = 'tZ9FShxGJjs3HDKCzsx99wU6KG9RMGrVT8Y1mkWMWUeNjm1WXn7dgeZ7PxirEcsjLGxppVoLTYsWSAGxbSnJNocjkYZHqVrHmDNAkszZaAYnqi2rNa6aQ8yQyvhrVewvzMB' -amount = 0 -reward = 42700000000000 +balance = 42700000000000 -[[stake]] +[[moonlight_account]] address = 'tfWVRRo69w4aAKmG13DGg1dZyB8yCTL3uXNHWCbYugGWedGpQ1wwRA22BE6Z6nNmxeCd1jC7AzRHcqwGoVUck8WC5W85snoLLBb4k1GFEKxj7z4DjyRqoouefL5H1mKZzCE' -amount = 0 -reward = 21413402402986 +balance = 21413402402986 -[[stake]] +[[moonlight_account]] address = 'tghFy5YuBGkD5ntBNwt6bSDMmYot5AS59q2Gte4udEBxJPqwY3XEnFKjuKKNfoyANutdP4AZTxoPB2kRr8ftELPoh73fVpSHHcLXaWkmWaomyS8zK9THunbWLr182xMw3yg' -amount = 0 -reward = 8316800000000 +balance = 8316800000000 -[[stake]] +[[moonlight_account]] address = 'th1DAbbtJ4zbidXjB66AMjxPrtAnNVKEM6dQ2C3FM9gzbsKpVjkHHanWjqQg2Rno6guNf318wQLZKuaitMm55R3VacTZRsjXCfnMXWLh9UNW7QwLcbwDqsdhD45v7rBGQuZ' -amount = 0 -reward = 17108000000000 +balance = 17108000000000 -[[stake]] +[[moonlight_account]] address = 'tjrjDcQkAjjsq1uHZJozQnZt9d1YJbTJSDpMaNLaxaHdSnmBHXaJGE9qDi6QVsYKbStoJ287Q5aP92seN4xKq8CKxyPXX8DrTXfJJSjfCguW17C9TFSmUv8Zax91U7XUjCf' -amount = 0 -reward = 22500023368788 +balance = 22500023368788 -[[stake]] +[[moonlight_account]] address = 'tne3FzWMwuDf5gAFRSSign4NwTbt9cBJX7XsD1t1CE6uadAA67QckxNuHxaeHqbifrAk38cmS9bYsh3HjxmkUVwN69iiVmi8o6yxVUA9EzBGkZcD3FHLa7mEbunjceU5hcf' -amount = 0 -reward = 11130274673124 +balance = 11130274673124 -[[stake]] +[[moonlight_account]] address = 'tp4Y9csNhSeAjEFZCc9byh66TpNMgqCU73KgBdtdyKhGwBui4anbBTVnS9TSfTZJQuxd5r3VwVMvpBogqcESQtB3o8PFsFZZ7gW7Ux7vZG1VzaewdxNqWBSqg6GZpFZ8hMd' -amount = 0 -reward = 12656010419784 +balance = 12656010419784 -[[stake]] +[[moonlight_account]] address = 'tvWXpE6etEWNp2NKU6NbahyEP9maEaX9hD2oD9iWPrSCUkpAvcN36hyBWaXn6R8dE4ih2DmGBfcoUGnSBYj3NjB9Qv8YxtKNvFXDEmp5bVtA2DFwZnJKAb87zU6252UTonD' -amount = 0 -reward = 5420000000000 +balance = 5420000000000 -[[stake]] +[[moonlight_account]] address = 'tvfqeATUMWrZgJNgGo1ZyExzZEx43qWkddTdDMgiXwEi4hD1v2P5pF6bDr71rZf8xmUn4NFovSrscDYMhFGtbybrPMytBT1LwveJ1dEof22AtGjxweEnsp3W6umMbDntDu7' -amount = 0 -reward = 5528000000000 +balance = 5528000000000 -[[stake]] +[[moonlight_account]] address = 'u1kHrzF7WzQ3xypBoEkvESvvjUtgZ37oYE3E5fXG5PwX8Zcaj7HnUUatjBWLcVEG6k7vJ978TMZrAWovqHSM7hEudzXSZCMWZqCM33xiqEQMsPAdYCeK4J1HWQCRCnyJjQZ' -amount = 0 -reward = 8070400000000 +balance = 8070400000000 -[[stake]] +[[moonlight_account]] address = 'u3KXp6oqtdkPpJLBdxEyuY4dXWK2QLrCE7LzGaz8bFUYKgmJ44SbiY5Twdohx27EV3FwkbH3V96rHLdVNXK8p884d6osaqVNyXvd9LAiePWwxuQ1QGhpbwiy4TmzC5gwiug' -amount = 0 -reward = 6590000000000 +balance = 6590000000000 -[[stake]] +[[moonlight_account]] address = 'u3sDnKzNrVqtLEhSuCCxwftHErrwf4C1hUyhkv63onNJstVfcRyZ7f81Tec7Z6Y1ZDtam8BVrutRA2SskeCwBmHqhiAkAefLZHtW9gZU3FoygCZ2prur87rigciNenKxPWt' -amount = 0 -reward = 7825400000000 +balance = 7825400000000 -[[stake]] +[[moonlight_account]] address = 'uANZNgU1ZwWNRaA1LaissV3HYEiDQoTxvPqLgdmeJrYEDjcd1pJmTMoPQDRwtkpP7eNk8Ga2kwbQdMguPPU5oe2xHGEVwktaw9sft3qMyf3Tz9p6SAAUpMeG4CBWpTGALPR' -amount = 0 -reward = 5490000000000 +balance = 5490000000000 -[[stake]] +[[moonlight_account]] address = 'uBKP21CP5uveoZJXDX7M26iuCALqDQhkNu7U9HBpm7utzYgmhTp8dbAQk6grYxWzA7QTtXSkAR4ZJgqwBdBTaMaMvQ47dZX4ciKrtQxyUA9yiXqg3Z91hAM7ekzBsGpCR59' -amount = 0 -reward = 251813600000000 +balance = 251813600000000 -[[stake]] +[[moonlight_account]] address = 'uBq7cEHwY8m6CC11dz6rSgYrJEUEUSCCF84kDYVRgfikAdmrrJhug6eXGstdygYUYEZfQF7tGcuNWG39eLhbmke7xTuJPmSCsJRcY9PDyjVthNTpmwdk2w1s2ef4rGAVWkU' -amount = 0 -reward = 5388810403307 +balance = 5388810403307 -[[stake]] +[[moonlight_account]] address = 'uGhpjPggMZW6iAUtBEnXF72KLe765U49YQ4wo3nE8fdWWCbzi9Q4xrUFwcMkLzzpbgaN9eJQRmXnrS2g3vnKXY7pwGWJTr7zn8VxPXBNCLpCQNgbJLbxZyCwZE7oFCzaEQ6' -amount = 0 -reward = 107484284275281 +balance = 107484284275281 -[[stake]] +[[moonlight_account]] address = 'uPqx9aWdRWgTQ83wpLucCexRNKGqKygZAHPVrjGqvGoRBza8R6gt6sc8z2oebuV8F2Eh8SDoUzYLqEoQhwh7Zi8YavHhCLn4CKC3VCxsFyKkqub7HKrLkCSKVRHTdnTN7Zb' -amount = 0 -reward = 50491219447324 +balance = 50491219447324 -[[stake]] +[[moonlight_account]] address = 'uQF7v44trLFQYUGSLHJiDZGyNSKt96RfrAes1zxvx2ci7XCHcnmu6VKTE7x7w6RM8x7YbWexquXjBXSv3Ur9tnrsUXbA2eLifMSGhnnXeBG1oyczdC3GSBsjXXkXGPjr3nz' -amount = 0 -reward = 11286401311774 +balance = 11286401311774 -[[stake]] +[[moonlight_account]] address = 'uWrQUSrs5gDruoPUGHGM5v4vgf4ENDqe953eZwR3mzu68zxYg6L62WEfACejLmBbp3N79AJ5QqmGv4oFdhNaNgBx65HE7VqZAD1ctcv1fqMziKDoxpd1gFxbeG25dMyjXQW' -amount = 0 -reward = 9084810133807 +balance = 9084810133807 -[[stake]] +[[moonlight_account]] address = 'uZ3MBVBFQcawEZtNXym686drXshFumPJN4kN6mK2d1y9MzNkhb4Xy1dMzwKC9QF6pKjWrvXrrQsTpYvzbH8UZVb3Q6qD2J4TwVrmb9SygpgfDs3A4vK4CJs5ykExkHpNN5v' -amount = 0 -reward = 183305872389953 +balance = 183305872389953 -[[stake]] +[[moonlight_account]] address = 'urGYn1mxup5RWLX3jVgBwtig3BWEcyLY1SSSuzeDxwP81oRgyC4JCc5yYVPU5j2EJhgjmjdkEAszt5zZc2D8JcWBNE5j1zDejtaLij3szttxWGjvGaUm8f3qAtePiuYRzwT' -amount = 0 -reward = 10072800000000 +balance = 10072800000000 -[[stake]] +[[moonlight_account]] address = 'uty5NEZ27bQLwS4hSeUxPRrCeowfBy3gn8zsh1pnScurspMZJny2kiVaDuVZEUyr2BrmhhPKi44URyYYUoK3SYekQr44TTpgxTxGm1WrtBgWcFYcPw1bpaA385TfKvdJMS5' -amount = 0 -reward = 262545243755726 +balance = 262545243755726 -[[stake]] +[[moonlight_account]] address = 'uuxVto5NVRDmBxHgyVdQ3DXzvfADjEdafcB8WVpw2jJ1b7i1xZTM4M9miuFHUoDfTX465EXfJMT91NU9Cww7Hp1hrpjtgc5PtD9wASzm9kRhZE3aLwmR7vZk1hMCW6ApMCg' -amount = 0 -reward = 8401600000000 +balance = 8401600000000 -[[stake]] +[[moonlight_account]] address = 'uxXzwyqrAS14hxPA2Bpgy5a7Jq9yCetZ6kaY8dxQKnABW6WVSy95caSywheEr1ZvNtGid7N9KjJCATJ5rxucsX3wGNV11arHr94KW8iJoFCgaVKCo6Rym4kXyEu9VPJvx1G' -amount = 0 -reward = 5072000000000 +balance = 5072000000000 -[[stake]] +[[moonlight_account]] address = 'uyNDdFT6f8ySYeDMBVuZNmGxWef7kM1BimdiTu5rH68r327ftDaTSLR2tJKxNhwnfFqdC3FnmDVL4YuTLTh9cZrRks8oM3tbL42bc3TdHXyGb2LBdK3MiVmkEiPCsDaRnbW' -amount = 0 -reward = 21396827029865 +balance = 21396827029865 -[[stake]] +[[moonlight_account]] address = 'uzbp5YFi1RrWEmTv4yWfAhJucTxU5aFwD7Jpu5hXmrvwHXQ8NaFusWQDBE5ZiKHJdjMM1C6HriZarcTQ8o1uW4wQg7VMiCSGfGYz9CP4NXGXGp3aSbEdum6BVGjH339pmPC' -amount = 0 -reward = 8824800000000 +balance = 8824800000000 -[[stake]] +[[moonlight_account]] address = 'v2UVzGyVJe1ZoFJnShjDbj6Q6q6E2qVh1WKHfpyapAp4JBWpDEV5MGbTeaCdFxNCAX3HdUCge7icoNPVNGDusmDTwfsxiR3d9BRfqq4XuW7ckamknT1evi9an3cbMFsGGpz' -amount = 0 -reward = 9324200643433 +balance = 9324200643433 -[[stake]] +[[moonlight_account]] address = 'v3Fhh7Gxq6rcFWu8aCPoGxJ8keUbhZcChrDLeGzpUBj1q6wT6ihK8R6mP1Qic4b1rcKgyAheZohYbZ5Vm1PvPrSfPhihZoB2rrZfTr6vyzx9aZweCFYFHPLVw6o2SjLizEp' -amount = 0 -reward = 7720000000000 +balance = 7720000000000 -[[stake]] +[[moonlight_account]] address = 'x8WBJWv4Kyoq12YKGS4D4kNy1Z8CHSQQuU3My4BH1AAcuCk2L9LPQqe92UZzyk1x2DYU2Wj1MMXGjAfFtwGjv9W7N1JnrdWTzNrNBnhVBCpe47narvC5hJUE4iKeUmv1c6H' -amount = 0 -reward = 13240000000000 +balance = 13240000000000 -[[stake]] +[[moonlight_account]] address = 'x9eZscywy9zBmyXbvETQjeVPMVbxCq9AQkQvv9w61AwTGTYX9hDsXE9c8wnuZFxans2ZNzDr1e8KgZtLK2aoEjZPtcctyzmH1aqgtcucX2m5LCYkMvVWRpx7JsQWC2D15Ee' -amount = 0 -reward = 7980000000000 +balance = 7980000000000 -[[stake]] +[[moonlight_account]] address = 'xFWTwqexxEqRmvU4SVXEQxidHHsSRy11KZJCFEm8VrsXc8tRKtPki8f239y2K8e5QBdpuhbixNsEBJWqw2zm9B5959Q3hr8AvNFA76ZWWCtM2MU4kSSXjsbLVH2gpc5h6rg' -amount = 0 -reward = 11378800000000 +balance = 11378800000000 -[[stake]] +[[moonlight_account]] address = 'xG5bwCvarGdGd7xaD1eH7jpp6U4SESN4ZEUNU7s2da4AmUcCJmvXm9w87KrLgNHsaukxMAa2s3iYAgYHhXoRBzQFaJeY2aYf4geR5Ux6tc5huFjfQ6vbaNYsSUoW9xqXkZv' -amount = 0 -reward = 18195201878395 +balance = 18195201878395 -[[stake]] +[[moonlight_account]] address = 'xSz12jSUHAYVPB2om5FYFzYB6ik4mQ4YziwUw1pPmLMfgaWr7KoDZS1V6yfeKZY3Ptgs28oA5TAM3RFC5FkwzJb7rCwpJR7nDVVKhPAVP1TYcSNZQiiuGXER67rQ4ruWmYU' -amount = 0 -reward = 5443200000000 +balance = 5443200000000 -[[stake]] +[[moonlight_account]] address = 'xTCRQ4o7BqiVpuk9jUAN8NdvJGCvq7gMvEjaBGCmW4128SzeXmvbxvziz5fCE3dqntrKvD8PmGD3odawh2iQQXkgqgEYqTBfjpywroAR1kCWmKa5oUMN1Y8iexkrf9W2K3z' -amount = 0 -reward = 7700800000000 +balance = 7700800000000 -[[stake]] +[[moonlight_account]] address = 'xVV9W5aF5K2jhrFMcAuu86cbVeypdCYJFSFghvw1GQsmmsLxU3i6eMb99hXfipordiRaMEtjw4vPxBjJDvpNSAokMAxJea4QzK6zAG6cLJ8QDothLEaezRmsfXnwZfcRpmj' -amount = 0 -reward = 5878800000000 +balance = 5878800000000 -[[stake]] +[[moonlight_account]] address = 'xXa3GAGYrZ9ESbxeuR7GtCKHogVWCUp17fA3McPshu2RPJMFhmQwDfBNjPMiGgU88kkVuP9tgeCS5u2RumYA5ddxhVHKyQHiTz4aMfiBhzDpBZAhpivYqiHKFyuWhDctaHx' -amount = 0 -reward = 12325200523328 +balance = 12325200523328 -[[stake]] +[[moonlight_account]] address = 'xcDjhg7yccQBiAJtL57nBQTUukbcJDrvX6PQRm2JVgLxAFpLC7Uuray9d8rrxbtBgUaCVHVQf7rxTaY8HEuLsV7KcTMiisQPVRhepEuMAjxgijpD2BjCkb9cKZMMLicqP9s' -amount = 0 -reward = 64732000000000 +balance = 64732000000000 -[[stake]] +[[moonlight_account]] address = 'xdyUJMXqLb1NzSNbupE1GunBMuMmSdSzTKeL8TBd69coJvT5vvnj55z571Y4PiEXtXRJePcDps5x7ert6J3BYbSKLb99jF3rDqVExBFRT1C7AvhTXJfCiYstzdKZKm1QfPe' -amount = 0 -reward = 5527800000000 +balance = 5527800000000 -[[stake]] +[[moonlight_account]] address = 'xiyiMEDmhCBtHEFcx529rZgaMh2sXWRx3gmFUuVJn78ohr5HZQufxPd5PnR9Q1g8rUndTbs6Vs5D3i2WerVwko4sE4FQGBZu3P17heGCpCp4BswALMU8MiDe6TSTNsQ31Dd' -amount = 0 -reward = 10100800000000 +balance = 10100800000000 -[[stake]] +[[moonlight_account]] address = 'xnmexZ8DkifqtphgasgE33XYfy9yEo2oCmfbCQntiAyAAd4YWYrmjVpe27KenaubCa7b1asfm4ZH3kKziT8Xy8k37pgJm6zqmQbexAcayYtE1LURbCrq5BESYr6TEneoHHs' -amount = 0 -reward = 10000000000000 +balance = 10000000000000 -[[stake]] +[[moonlight_account]] address = 'xujHsfcTZB2Wff1x9LXPqYwFVEqF2ogyEPzq3fWa2KH9tn95SivNTKJTBKyyptRPN4NDKr3yqnWcyVqSHR2RfKtrHJ3rQo8GbFDGZ1RD9Ptjh4CJ2uXWEb4SPwKGayaZADR' -amount = 0 -reward = 196856024454238 +balance = 196856024454238 -[[stake]] +[[moonlight_account]] address = 'xwMHJQgF9EGawzuMt5Pvjp1tSWEQmWbeU9T34qTeTeoY8nPijm3qd7G6PrNVWCm53FGsHL5Pc442oLqwwLZZZoqky7Cz2yUYf9jEcMzsGKj45rBmG5CbdhLLmzFm8Tb2Lih' -amount = 0 -reward = 3014586663848423 +balance = 3014586663848423 -[[stake]] +[[moonlight_account]] address = 'xzAZihCwfS2UUDWnoEGvMZyYzusHDLe8VKcofqGgRrLDNg35Y1V31meqJfVx8Yx12QQap8HLdJz8Bgo3GyPGB3vdkMBZJQFqHkhuNWvSqvR9RdrJ12Ye1ugMp6rWDgTgzuo' -amount = 0 -reward = 6960800000000 +balance = 6960800000000 -[[stake]] +[[moonlight_account]] address = 'y1q47PKFhxXHM3KuvArt1DBrGjyER2r4kt4BYcbWNFkjrWCtSuX1Ev2Lw6X1q6QsWHAvkAJawQ7MZyvZsjE5iTPXikbRS3HmsSwrRNC3vLRCMkfLPxqqFED7SHevaDrQzFK' -amount = 0 -reward = 5290000000000 +balance = 5290000000000 -[[stake]] +[[moonlight_account]] address = 'y2rDpdHBAZj7a1TtviVssGtkwTXfB2xZngtYGNyoQTCn3J7B7m4Wqqzc1aUGosGdsdiMKP69j5FmLicWqnUdgVYPUBrHT2rm2Xc3VVrKML9DBwbk3feEWmGFE95fSfmyLpi' -amount = 0 -reward = 20516812011357 +balance = 20516812011357 -[[stake]] +[[moonlight_account]] address = 'y46vKQCjqKdYrsuj2m7HvNMey8LTd3QhX15cebBzhEASXneWhbn55VaDfWFu7Vms5pN9Zr1CLR92i5vLbJK6pNaGkhfdGgVsZ6CDkzQ4mc7R9FZCYNLpR3tE99pifZ65Qor' -amount = 0 -reward = 7028800000000 +balance = 7028800000000 -[[stake]] +[[moonlight_account]] address = 'yJvEprSVScDr7kKKfxHJ7U6H4LXoxa4akcAGGWJkTxhzhBUCHuHDAFs4uTCSwxTJdwKTsv4F8WiYf7zzKP5EUGhYwcn4aJes15Z9h6AkvL1Fb2R6gfpRqbbaymwK77G2bzB' -amount = 0 -reward = 1284084981598327 +balance = 1284084981598327 -[[stake]] +[[moonlight_account]] address = 'yKahEkwrYUvDoY3wnhK4rcToMrvBVHtNZqcLK3nNdggP9dFJz8ah5xJFt3MvSxQjxc5zTL93iDzTkA7MvWZL4yhRs2KWWjeyrnzhiNZ1jLmE4mBVCcCbdAeTuj1rvbRqL5r' -amount = 0 -reward = 5135000000000 +balance = 5135000000000 -[[stake]] +[[moonlight_account]] address = 'yLWh6C8gGG3PhkzMTz7WUTyXQLudWLN7EXu5PZaEaKJT3aQa2Sf9kodH4HF3WQK3mUfh5edqsGEBjW9pq6JHLigezJPZyYnUAnjMRuKFstBktwf5rSw1TgD8Dwz1SmNi6nV' -amount = 0 -reward = 32257600000000 +balance = 32257600000000 -[[stake]] +[[moonlight_account]] address = 'yMhGLXRiP9z8TNq6Y1tS4vCJXHHjWrtzbGzeQAedf3uGG8GCGdj5R9XraJNLzHcJtMeaRE9eeSkzLp7Rj2ARdpu5Do8R8wX2bqu7DmrjUzv2vApqFn997Y4u9pqh1hmJZRf' -amount = 0 -reward = 8832210000000 +balance = 8832210000000 -[[stake]] +[[moonlight_account]] address = 'yNaJn5QMKKyrpbhuq5AawQuDLvW87Gskmh9p1xtCaLMQHhvksBEgSPe6WzteyK2gNPQgjeb55iGfKGrXmv1wQz8nndJtT1HjbU2RuptsefrWoSvDQRwd9D74A22ge8amPhb' -amount = 0 -reward = 7868400446011 +balance = 7868400446011 -[[stake]] +[[moonlight_account]] address = 'ySLf2tp6ogU6dwgZDXf44MLiABDwVL2Dm3q9QbAWhtbLJSKVMB4T7Kua2dS2aaA3XxdpYuMkWNUNa4fVNrtoeZ43pgLv3NVYez2AE8S6P4Zp42mjtoRDjB3Tk7KJGXc4v7L' -amount = 0 -reward = 10999926151426 +balance = 10999926151426 -[[stake]] +[[moonlight_account]] address = 'yTZu81m3G7tAWX77nX7HuZNx89Q3WbMiqfds5o8rYhnbt9bgA1BV6XDS2MbwggwziXb2uySJccodNp9MVFaMDMvFJJqrs7aQ6wRXsAz5QGFqct4xGw2fzN9jHRsjKqBoHZH' -amount = 0 -reward = 5731200524205 +balance = 5731200524205 -[[stake]] +[[moonlight_account]] address = 'yUTVeY7a7Ci4cYefZg9vjyCgjNiuFJ2YKkZ3SF3zrKUCrs5PmfsTW4tNp767UDffR5ZpJkvKQSWgauDaJiP2J55Csj9EB1j6VMbB9UNQ1GKcPCb34o9c3qLBTPpRFzeVbaH' -amount = 0 -reward = 2038616064106218 +balance = 2038616064106218 -[[stake]] +[[moonlight_account]] address = 'yUxfsbLHQ1jZxw5VfhQpQ6BdZhLTxTQbeUezV12cStSCvhcdcSQJNyeuvPeQkFLvJRRpEKBrhUiWCHubQErZjyUiSPHh8mNZRyMUrhX2bn4QFbf79cLvbQkpy4kUbb8kWTQ' -amount = 0 -reward = 8895000000000 +balance = 8895000000000 -[[stake]] +[[moonlight_account]] address = 'yVaYRuob5R9WSif9Jx1k5ttPRXNKZBfz2dy3PitqPvnJU1hWTyJKh6PMmEnv2ZX87Dvhdko1EggdcbkkXurQvSPY3y6rNR8Z7oWMBkdA6WutMuRwDxCyH3zGGSFuUJzw7Rg' -amount = 0 -reward = 53564800000000 +balance = 53564800000000 -[[stake]] +[[moonlight_account]] address = 'yWNgmFY5CBDfoNYCCvgnpnN26hgmpWNYStfdpd289PtNwm6wJtgh8Ltpt1LQDRK4L6Q3m9LTNockGhfQuVwzdYtzj4R2oCfPdSytjRfCGDW1aMVVFiZwVi6JkjugJjhT2w4' -amount = 0 -reward = 15573000000000 +balance = 15573000000000 -[[stake]] +[[moonlight_account]] address = 'yWynRKzN1BdKJQDtv848LdSRJrFqdrudoDTnre2fiWAC8XvZuTb4UAjAkStu9idW4N9R8ncnuk4dsMFPE63AgF3Jbdemax5pH2YMkngxkjEBBaRpEV1wHHZh2ecS3vKeGiN' -amount = 0 -reward = 5600800000000 +balance = 5600800000000 -[[stake]] +[[moonlight_account]] address = 'yYX53cm5SWCLBGFBwNrspAyQN7M2kdpeyGY5R3tcUJKsYQNaNbqjPqWZisti3Bw2gXK9imRqdstqeHQPoejDkEb1rqeozmsu3JmEtYNjsN8ThGb9GxvNE4azi89Z7H6dxtk' -amount = 0 -reward = 1018508974016800 +balance = 1018508974016800 -[[stake]] +[[moonlight_account]] address = 'yYr2sH83nV3q9MKFjbNdMRVwkyAUtw2YeUh6X9cuzZ652KDUfk9yfhTaJ8EBPkdYLRFmo2Grcq3PmayAiyPHJGT2cXp7jUWyzktFqqe124KSaFZQNhs58HqwndfQ4uJp4Ny' -amount = 0 -reward = 9071000451143 +balance = 9071000451143 -[[stake]] +[[moonlight_account]] address = 'ygyEFN1DYN2CNUmiWuGNHTK97avgmCspRKP61uW7ZPwQ79EQiXTZMD9E8XjbTF55DVwVvyCUAqoZ5vBBpoH2Lo6kA6Aq2UsZbc2fzZurnBj1nCumk1xDXKQRR4VB4kqUfHQ' -amount = 0 -reward = 52029600267329 +balance = 52029600267329 -[[stake]] +[[moonlight_account]] address = 'ypg1hkUrxVuN781MVWMewVnPi6EZojkKEw7Ek3H7fbjJoaL1a4DaZAebLuaZjAkzfXk6J2UFt1D7fEYfiVEUGohQ3QwQcVYDj9VUUHg6MrE7UzgnV8NP9DNsnP7C6majid4' -amount = 0 -reward = 7991400898989 +balance = 7991400898989 -[[stake]] +[[moonlight_account]] address = 'ywGDXL2dEoxcatrN5vcc8e8dZ7qyJqV8Jgvvq4Y18z32eNRXnFiZ3j8h8Nd4zwEJ4Y1eHxANEuZ4XrySgAyrbNFj2CN1qDNMJFyWvVdHDN2Z5CSgK5iSezsmuL5qFY8gpE5' -amount = 0 -reward = 72532800000000 +balance = 72532800000000 -[[stake]] +[[moonlight_account]] address = 'z135yXX1WL91FuzC4nnF9NSSiCCpJhqQHpiUvdRGPzsYbSLJAtLT8pNptoMx6sDei7obXP6knmt6Q8ohk8oSRNw3uZKp5PGp4vrNEeQwqCHPg3497ssCpWAEEntrgLR7R7o' -amount = 0 -reward = 10000000000000 +balance = 10000000000000 -[[stake]] +[[moonlight_account]] address = 'z5orATvpys3uVb55nYzLTakTQjbspR8zX6dfPmqw8wziy4a77quP4AeDqP9LQi9c1HrCnmoqjaH2xogeqQgRGKxq1aV95X6K9WzwGzpeZc88j7skrxAjoUVQU7YAyzUHUdw' -amount = 0 -reward = 6528800000000 +balance = 6528800000000 -[[stake]] +[[moonlight_account]] address = 'zBBH6MSK6d2wcg7ZfgtByBqjdnj3H33LANQnswWJXN7NVV8ZFF7GeBH98WAWFPqEUf24VvKwnmMwjYrB8XKKy3LkgxkEvWBpVg9ikMGbEg3Ry9Bqji8qj9i26qTvTqYzZgQ' -amount = 0 -reward = 10000000000000 +balance = 10000000000000 -[[stake]] +[[moonlight_account]] address = 'zBcFg68J7k8zqw6cZpz7XWbdJje6uJMgz5PhPdN3hRTjdsm3LDHFF36y3NYRW5L4DPsoqcHn5GR6TwkZFTU3tNS8MNoQ7yRwQnhp9rz8PentCpJR5vNziPcF9oZf1oJUFx9' -amount = 0 -reward = 165941956517210 +balance = 165941956517210 -[[stake]] +[[moonlight_account]] address = 'zENbQ1SwNtCrkGRACZnxEp2L1CZkytdysS3qVAJ5BxSzgnMGhs5BxzDGdcZtQwNh5pGkj5hopVNW5LS6kwSvViXQ8vHqxixEethfFEAVeZDpQDBDVhpodaXxcVGhaic4QWP' -amount = 0 -reward = 6712000000000 +balance = 6712000000000 -[[stake]] +[[moonlight_account]] address = 'zFGX4RrmCDdUx1o8krtPyJ26jR3qyZEctBN2tt9s1DwhsDLvz6Z2SA3wweCdHBAfobGmDtQ77v4qXfhJgzGLtj6TgVunRzwpwFmZJ2LzWBAgX5bLuskwQ2EwjEWXw5gvXC2' -amount = 0 -reward = 31451201248407 +balance = 31451201248407 -[[stake]] +[[moonlight_account]] address = 'zNeNZmVeY4QAADxXUPS63BLE11BEuboRAuPV8QJ65YQfHjbiPYvsPZngrGj3vu4YtLhxfJ3dFEf1KxkiakWuYTxjAi7RXuhvy9g7jH29xb2zGSLpRLuoCvKFHYCWZwRf8VY' -amount = 0 -reward = 47979209516401 +balance = 47979209516401 -[[stake]] +[[moonlight_account]] address = 'zQk8Mnum2E72ghQ9MXtDsr14vFyzNyGQEnxKBUUVMCmHcPdj1Ka2hu7qNnek4JgJ22n1yYMdy5cQ6PppmK1wbkZUBWTF6AynTDbZpBRVvw7GDduv1nJuXJyMWM9AakCBt6t' -amount = 0 -reward = 8799899485443 +balance = 8799899485443 -[[stake]] +[[moonlight_account]] address = 'zSb3T89J88WQrek9uWM1qgtpdJVUSHV4e9XtmyAuUrvQ1pUABxvWChH4MVwAcrNxQ34WffsFGJdUsVndEHCWy6EmmQYBFHJNo4ym57CQwwJk5FzeNBB3YsHFRjpsbipfEX6' -amount = 0 -reward = 8988000000000 +balance = 8988000000000 -[[stake]] +[[moonlight_account]] address = 'zSkQ1TAVPecVW1psstMzTGZYviX4Km6n9VotaEgqRhdSomygGBszQQGLyLxePZNcWZHssxsiP2XoM55TMXE9EP19EArR8y9ySKgGNhXBeeByBqCcZ8muZyn7LVoBWeRQG32' -amount = 0 -reward = 13391000263070 +balance = 13391000263070 -[[stake]] +[[moonlight_account]] address = 'zSyACoVUroCpGhcGjvxjvQ2HvTuoSnVKpcZCjJhmxniACErgXmMmDQVZLAojmcdpzpFTxxGfDxkuxa9MoKEaPRsgaND7STdWwdZRZHtyMAxZnDJTgjJkdbWW45rmCD1XDc1' -amount = 0 -reward = 10006200000000 +balance = 10006200000000 -[[stake]] +[[moonlight_account]] address = 'zUfqvS9HcohTwgQSU3ad6yEEs2wcDzgt91JN4SwGk6G67z8n8S6pZvnEBiWgb1Dkq5BFHtkVpX2i2xxm6S3n65JLCrVGKS7SjXeGw8sM9euZT5hqEyDj9NQAfbvj22TN16P' -amount = 0 -reward = 5500000000000 +balance = 5500000000000 -[[stake]] +[[moonlight_account]] address = 'zW7ivcZEJHDnWMbKKQmEH2g6qsGY9Gjp6i6RyY3GkGfaSnYWhcYnBZW3MzbVtPpzWWMBUwcoBAcZ9TUt8RJkUgCzaE4NC1HnYhGv12kkw4f5zhNiB9g5rerpiPbEyTAeGCL' -amount = 0 -reward = 10000000000000 +balance = 10000000000000 -[[stake]] +[[moonlight_account]] address = 'zYz7NZABzXhsCndD5aqNDm8zRD9p4Nyd4mwtJEtGKZ1eL3csrzBq71YawoLQKpmUX2cGHcHSFrRjdpAxVzdoLRbyYG3TffLwLkfY92kyTCrTsK1MnjKsfG7jwo9Bm5mmHRi' -amount = 0 -reward = 5443200000000 +balance = 5443200000000 -[[stake]] +[[moonlight_account]] address = 'zdoJeiRaVJxNkyqWAmKrXgNbPJ1VKJ7dfgsrNGnDpBgJg6Rufo1eN4zZ3yFcVafh4PRbzXNLZVvBXV7s4hstNtjMTEE8X1Pm9PUt3Gi7sPupA9yA4Mbwgs4DRG3CmUCcFnu' -amount = 0 -reward = 1040393799070571 +balance = 1040393799070571 -[[stake]] +[[moonlight_account]] address = 'zfMiBiZkoar1e3gBmnpZoq9vpNyzGfyKKYo1GqvPMpjSEiUd279tYXwLY73SmWAniBCH1YgiB2cV7oEsRgbfT3muFxQDym4H36D5wBEpfYbfuakTm62drSYbz6DCJS95tAZ' -amount = 0 -reward = 10057600000000 +balance = 10057600000000 -[[stake]] +[[moonlight_account]] address = 'zpbLi8Gs2rYpfj4cmUErgEKvv5sP19ncfTtYttBGLrqk1PsJriih9L3vcFywfTPbvvKEdimzVwagEzWLg5yAq45q47yFN2WfNSNUYwhtUs2F3yYnmB5vrppbNQ9aVZftdJK' -amount = 0 -reward = 17043200000000 +balance = 17043200000000 -[[stake]] +[[moonlight_account]] address = 'zvpj2P5DPpjwxf72kb4cJYmPSEEcrPsUxL7pcpdgE4qXJYCSJxPvPniu94CNVXnEwLjMBEgL33jkv3Mw8fh7nKWsDgJPCT2PCzND8BMQ7cszuQR9PtB3a3Sm3xbLbr1ub4k' -amount = 0 -reward = 7877824178977 +balance = 7877824178977 -[[stake]] +[[moonlight_account]] address = 'zxvZ6CdmnrMgUAHirRev38Uk6ANr3Nuxebzop1ywbTnfEBGmDjtgNCvzPSAFBUvS1zy7T524sGS2FAe7tAXBzZ86WYG1k2MdABQLcpJ4iCtszLFNJuEjg5rwXLejGJ39V8k' -amount = 0 -reward = 47246800000000 +balance = 47246800000000 -[[stake]] +[[moonlight_account]] address = '211bUgLCxQmvsEDHuSLnUyAgwxjdQBFaC1jNcG4VRRxWWnwnT7SL4dRQNqQRAEEHTtKjzpYcCdzjjapKxPJA4D3Pf2ZfvfLEZB92UCgTUzsB59oTHqULz48jaeekiYAC8AjC' -amount = 0 -reward = 6626400000000 +balance = 6626400000000 -[[stake]] +[[moonlight_account]] address = '2188oqHnty21XHkmJ8TW4VM2kC5X8HkVNLcAdjuNeiRdFtJnAj1nvFUMBCnEX6Jt5GDjJtK58miKr8Av2hdsJoKSaJNE8TuYF8EUFc6LDPQJT4crHCQEhLEpJc9z6M9NWvaC' -amount = 0 -reward = 814763518329998 +balance = 814763518329998 -[[stake]] +[[moonlight_account]] address = '21AmKpzPeK6VG46NHEKFARz3NneMwNnPBu9kxdztPE3CnoGbzUZMQxMZuTc1dPdNNE1QQ6BJUqE4gE28bu4NdFxWgMov6moQwUpJVgYznVMA9un2kf3WpkQ8L15Rxw7MooBK' -amount = 0 -reward = 5185600000000 +balance = 5185600000000 -[[stake]] +[[moonlight_account]] address = '21DBCGStPTHyEaP3K1woM6srQUBo6MKZrCh4V3H4qDWSQGpofbqb5BzafTUh4p1kxTJJZzgL4qH2PLkHB5o2bWetPXSEtDMYfCoNGfYW2RVRdJi1pyh8owmoBFTLdvmtjsa2' -amount = 0 -reward = 9142000524894 +balance = 9142000524894 -[[stake]] +[[moonlight_account]] address = '21JEftF3fTvFJhhxLak7dVdmrxTXYuAYawJ4Gn57ULhVBteF6o9DDt4i9HzaSiombXDPKcA49ubdkW1GhDEh5JqHaYdoZWc94yqXYLw21aufNiTcV2NBAxAMpcAX2s11zdAk' -amount = 0 -reward = 11619200704238 +balance = 11619200704238 -[[stake]] +[[moonlight_account]] address = '21KL9R1h2CWF4Su1RGkf6MucN92yUKMRKgBE4gns9mV1r8BW46APhvBBVX4Ut7f5Zxf639KTZUb2zanB4UZiYsEJkzkwoNJ1GQuKKPBNQkUGKwKq5iudjQJ2UiQFHZ71rMvN' -amount = 0 -reward = 59309035905630 +balance = 59309035905630 -[[stake]] +[[moonlight_account]] address = '21TsQKKWEm4o2kn2U9oiuV4ryEa45KsFzp5qy1tCpFLX8x5exLuez1VvqXKyr3isbaTmMsazSeibLby8Cpqdv6TWDuPqNm2QdNaY8w7Nzz23jvnsyzFdJGiDHuk6JK71YvSe' -amount = 0 -reward = 8143271354298 +balance = 8143271354298 -[[stake]] +[[moonlight_account]] address = '21VNkmNPA8A1ksJcgSVGBmYXL9Gr2qZyLmh8CS8hXuhmgKGZaxRAaHZ1wsTeQHWD1836SqHiD1YhRhhhbSEH1HPtyD2tVCeXN9oePb7sMwGhaSTpMKBkgrw88K28DuUG2uSo' -amount = 0 -reward = 5499888013386 +balance = 5499888013386 -[[stake]] +[[moonlight_account]] address = '21VnoXyZKGmgn6qSDSpJaEP8mHcWpCAgrJRMtkNA2ffnSzZhhNZ7ET9vxhoPLm3bG2RKuWVyDwTWZrfU66PivRswjzWBc3eQuomRQAE4gkkSiBpp2iuWU6eguu4voFFYj278' -amount = 0 -reward = 6503200000000 +balance = 6503200000000 -[[stake]] +[[moonlight_account]] address = '21abEbhtdAyFiLmN2wwMEHqdkTq9ispxrbjt1aJgUode64TTCqhCYG1vkQ8gWGXQNwZb8ou1tGgorERrqSt8gKSVDeeoYPzURxzz1tKK8t5pdzxLja7VjwKhFnmf45SDHJH3' -amount = 0 -reward = 10000000000000 +balance = 10000000000000 -[[stake]] +[[moonlight_account]] address = '21dd7HTACGM9cm6wXmfzinkjVMs7R2F43oJ2xjLS4MUq8ypqLfmDVWpBRydj8oUFDgbNHwDvTKDEJrKVoKZ9tq1i5P4ie32Dy3FvRbEDYXjW7i7TVKUGtZS74ukHWtqF6h3r' -amount = 0 -reward = 6079000000000 +balance = 6079000000000 -[[stake]] +[[moonlight_account]] address = '21e5AaF8k84BJjh4uUARKTyFVbafW5MbczPiQVQz1Rhb8J5oKKZ1TTnaXJYqkFV78P3UJscamW68NMivMDdhCLYMM8UYdGcLRbvHQDjHtphN1eC5gNV13ocwxzfM2Dad9JEd' -amount = 0 -reward = 20998000000000 +balance = 20998000000000 -[[stake]] +[[moonlight_account]] address = '21gC1spPN8nGfo23AS33D3j5zmofXFLQuJfqFyqs6VXjAj1PkqDVyW63QRn6Y8EASYpKcyB9nohJcaziqox7f7XMcfbJy6GsZyJPCLeXRZQzMaMh22VUArHDQrgGTmgf25Sc' -amount = 0 -reward = 8999000000000 +balance = 8999000000000 -[[stake]] +[[moonlight_account]] address = '21iMpzwGMDhnRGzw434RNyvPoyX4bHiJ3bLAGFFkWz96LXvjDTqTtMAczghCvekPs58Mbh3UmNN6J1PPpPU3zUPYPZgGu6NRZ5nJu5E6JkJfMDeoHBgcSRJGavPFE7L3LhiC' -amount = 0 -reward = 7759224462961 +balance = 7759224462961 -[[stake]] +[[moonlight_account]] address = '21jZS71qjvaMs6G6tUqZcvKmD6sd4xSnahAQws9Jh8dsvAWEUECaKQEU3owrj1baYybXsB28csw2rft6G5tFbPWUiVRbdmYJUJKZ8z2jrMqT2wZJhXhRcp7b6NVztJnQTNw5' -amount = 0 -reward = 11263819540711 +balance = 11263819540711 -[[stake]] +[[moonlight_account]] address = '21vpqs5CxSMLuQRr9fotfJYYaEdbSjqaAMmQYCcEDQ92zHahUQqaKN5cNLdnityZFCLBVxWRaWoZHjVBeWobxtvYLhHwzbs32kFcNfSXc9AtFfFAdtEUt6sw4diwkXf11tbC' -amount = 0 -reward = 504734455667412 +balance = 504734455667412 -[[stake]] +[[moonlight_account]] address = '21zUAMeKZPKqrKtgKwsTV9jnFHj9EjQRiP16Qh5QiULbjFJEBzE7xHP7KfHh3HUxQZTtapoeZvDcdb34JsmK77KgrcAQuMqBWCF7QwvNrxmYaUEZiusQtMyrXWqgUcvMg413' -amount = 0 -reward = 6625727610368 +balance = 6625727610368 -[[stake]] +[[moonlight_account]] address = '222TDbjqrGrySJiv8DuiS4nvrtkNZyfSdck9i8bG9z3fzCwRKBWetb4zxSa6ABhxwcr9jKZGUy9A2y1hmrPXdBDJWaXcUiFhT73Y8gUmwxhbaSAvka5MM1XKX6YbsYNNNYUo' -amount = 0 -reward = 7521000000000 +balance = 7521000000000 -[[stake]] +[[moonlight_account]] address = '225P3Ppu1S18FgNAsC2D7ou4E9dBdZ6MAPBYNQJyFE9M1ntVFGFs3imxL7febHBAxPhiYEHrtRp72ySjmbza9iJcAnVrfDg1WhirwQs52VmvebYP7Z99tDNCiLGL2RpamrT3' -amount = 0 -reward = 5620800000000 +balance = 5620800000000 -[[stake]] +[[moonlight_account]] address = '2262WQqqiFonBaKtdKdsAxurcYuD3Ag5C6QAfZXQXq6DwufZUbFP5CEvU6hYAvURQWY2iRmfQZD2HqniuYFqXTFE1R2wjBkoy7zNY9GWzduegdzTBYk5PpxT5W8t9U3P29xU' -amount = 0 -reward = 5441600449891 +balance = 5441600449891 -[[stake]] +[[moonlight_account]] address = '229iYpKRZnEQKKaN8extESUjfUC39cPBXYXut1iACo1bsWSqkxNohRCeiBiyjS4TH8ptbwHhdtvC8kHVEsx1A97MA1TWAswVR863f5cH12emnQV1aPthWYLkgFdCGpYssT1a' -amount = 0 -reward = 78027249699769 +balance = 78027249699769 -[[stake]] +[[moonlight_account]] address = '22DgXnsogaUJTKwX26ia6UtKgWrpDzBstzcFTSQRgA7EVBUMcaK5B1v91pNG8DXohsevAcs46z3zY9wyVxp8RSDD6NhKy3XR5P5d8krEajw8fc1wgEszc5JwYatDkJvrALmS' -amount = 0 -reward = 6157600000000 +balance = 6157600000000 -[[stake]] +[[moonlight_account]] address = '22Fu1jXN4YyLBpTvE7GmwZBbSowUSuHUW8pXFr8FwSYeyy3nGkdfwMdGvKEs5soetQFvELMHFxLtptrLe9UYS5bWGLrT2WdhfCU9nZsEzYmWpwk7d2qqN2Wuyrs3ZYGfqcqi' -amount = 0 -reward = 5587248358448 +balance = 5587248358448 -[[stake]] +[[moonlight_account]] address = '22GgyF3dW9D4UReJm5ZfhDrcqnXzGe1knLLsGdPRzjAg4T57uGSu65VBPm1u4MbYuWSCPNWgsmq6386vnP7vPfcBouyrsMdrfBxHf2M5s42ognrGjzXMNs7Q8xvbnjT4UFNk' -amount = 0 -reward = 7312000000000 +balance = 7312000000000 -[[stake]] +[[moonlight_account]] address = '22KPWHTfyHyazUbLe9Ub2G89jisHZA63ANbwRFhVevjQkPH1dXv3CHedZdtkzRTiWyUPG1D4zWodg4VNE6T4oLaPbZuVtYFTaN43VkaWf7xqLLbjaNQgSP3RWSQokKovZMx9' -amount = 0 -reward = 8879200000000 +balance = 8879200000000 -[[stake]] +[[moonlight_account]] address = '22UmXg3k2CJsPf3FepwAmoukeAUbgvP4ivj12gJF2CbrkXr2Cmmh6vfvnRWcVgEsDEf3R7RwRG9219sKAnMW5L7J5FScwQtqhQmCyKMBVpK9uNtg3aP2Ryvt2r977phViZ8U' -amount = 0 -reward = 134692104718372 +balance = 134692104718372 -[[stake]] +[[moonlight_account]] address = '22VGggU8TUwPQdR6EJZBCD8MFEA3yrvk5GHHkC5d1mrVmtbxxKfwQS1xgwX4ARuXfbe9KRf4pAwBF7fZR9UdcTF8gjZeT2yw7CNz86iegjR7ZEoDDH9SBXaqWrciqQHGGi41' -amount = 0 -reward = 18197202612085 +balance = 18197202612085 -[[stake]] +[[moonlight_account]] address = '22WcjM2zXTGqvMtUEA4ef6BCzPGTijqs49aBYok4X3xYZBp7LkWLxUy95AEdSbLU8of4LTtYJi855eL8Hk4THrQMHcgY1qYQ7WZgb9V6kvgYhrD9LRdLnaoVGn64wQgKYJY9' -amount = 0 -reward = 5500000000000 +balance = 5500000000000 -[[stake]] +[[moonlight_account]] address = '22Y2adibhscn7noPkrv4cpiNYmV3Ft2d9WQrRygrttZhnFic4omqm9x1ViGQmm1voC71q99PqyG1SVrv8TFVgV84qx5babCVYdwSrESwFXL3NSeYs8ToiYZEYcQhZNmW8zM1' -amount = 0 -reward = 7872000000000 +balance = 7872000000000 -[[stake]] +[[moonlight_account]] address = '22YqD7idXP3b5Q5eUzpGXm1E8cnxWcYmk8pjEo9NceGX6eJ1PAgcCM9bjVw26ofXQ2qyaUpRm1Xq2c3SSe5CXAcb3QDBAf5xMCTvqeRMxV4Ynxy8MJTL8ipsSYK4Yf6cSE2t' -amount = 0 -reward = 10430400466252 +balance = 10430400466252 -[[stake]] +[[moonlight_account]] address = '22ZV8fwZmuoyBbeCPdnBFX4SRBXnBX719whCM6ZQLffiF58AqSA1RmyZ8rruZV27eD3Pd7m5ng6c2UnBZLyxkbrtHJ2w49Ygq9JxE7vg3QKujgSTSURNSWJap9q6gPFdvQE6' -amount = 0 -reward = 6818400000000 +balance = 6818400000000 -[[stake]] +[[moonlight_account]] address = '22dJGLKaRdcUrGZV1TFTnSnp6y95jyvPEqqyuur5vpfrmiZB5cgU8xh1PyPZ2J5C1ioR4bHE1rQH1od6CdYYNqR88NfMgx3m9ueCLczXqbbirAwPMbC2HZaUA782n9hJQLw4' -amount = 0 -reward = 6773600000000 +balance = 6773600000000 -[[stake]] +[[moonlight_account]] address = '22gGW8Zh1fFgtbknUW4PdxXoJZapZ6CGFaZ8joB8wLvCnRzKLED9rekUuq2oAqe2K43KYAMhmzxBBe8RzyNKagX1Th85sqdSyYTWiLeehrSX2ukbz4Z7eymXSBmAMiJ6un3U' -amount = 0 -reward = 6297222850308835 +balance = 6297222850308835 -[[stake]] +[[moonlight_account]] address = '22h5RtQYQt6buxfSNXgBmCpU2Z3Q8wDtHw6R4o3uNYtBfViy4s7m9C86QzmAqczwnn4x6MV4SRVe4VtVhe5HBtovEzdGJgPevAwLAq1L9SbFXGCmyC6ddz6Nv49G1XE8Bg7Z' -amount = 0 -reward = 6728000000000 +balance = 6728000000000 -[[stake]] +[[moonlight_account]] address = '22iv75ExGi3hAvUezGwA3PVcKXc8rgTT457PG8XJg3wJgg12AjD5pwaAbQpwuQG79UhfHt7tfMVfV1TnkfcW9aJYTjQy1trh52nY8CqgqKGFfAvEyzQPzxX29XxQsUR4cWMr' -amount = 0 -reward = 11072000000000 +balance = 11072000000000 -[[stake]] +[[moonlight_account]] address = '22oNCaUfKyrnrkxWZKdCCzWnWfksw4dchFAdqGonm4oCzuyuxn6jkwVpYyU8aZdDLzq1TRvS4K8ApZifv1uE9EB37Geqos82DY22FpxMFpS5DUpBffa2HyiFNn8RWC3eAVaf' -amount = 0 -reward = 10215800000000 +balance = 10215800000000 -[[stake]] +[[moonlight_account]] address = '22pjfKwVXqRSWQH8MKFYZDMDUe4EdXGPowmnScUjyQktofTd3zntL2J4TafdHhr1VyMGtFQmhoR53XMKAd3S31X8GaaMvC3qzf44MqjwQoGtL1Q7XnZXwQynTGAUzUcV51gn' -amount = 0 -reward = 8007200000000 +balance = 8007200000000 -[[stake]] +[[moonlight_account]] address = '22yz3aSfzdT4t5b5GmQSwFHWwcCNVQgc1qNvqGCUxnrQd6LXFMobxRR3JG7ZXG1Dbn2zN5gX5BDPA34UvyEqicySwRA4Rf8uLboLcRR6QrQ1LkFRCZ2hnKFFETLEvsqJxcjC' -amount = 0 -reward = 5486400000000 +balance = 5486400000000 -[[stake]] +[[moonlight_account]] address = '23SMLJFJuwA6HETvWjdx923qfAoMBmGXjrVHKa8voQbEBVaYubezfS8xuZYs5QVK3YiUZEdsPACdfTupbYvfxSV7RJeVYbetNWRBpWiWA4ryFP4zQ74K3K1jAhhcqXCH6WLb' -amount = 0 -reward = 422887596504216 +balance = 422887596504216 -[[stake]] +[[moonlight_account]] address = '23Xq6SRmWoSjehJ7ZH5Yk43zAvo7gFVThoEH7XApHNwCQEr5DkhoGeX65QAea9muMJyXH77VCnNNitxWErLncQBze959RGYsfr4C6nWWvUKtha7EKA5wnudr1ZoEgCjHaN86' -amount = 0 -reward = 39879228412689 +balance = 39879228412689 -[[stake]] +[[moonlight_account]] address = '23esVsLQ9ZA2fikVMdifHzLvi1HFqWAXqRwK5jfNVNb2t7MFMFNcVEcuFEATrxuptQSEZPu4EmwECgoFZDciMaVrKBozJUWbPDAhTYa33NZWQHLGzUHyaV51Sx2wBJSrb4TS' -amount = 0 -reward = 5634000000000 +balance = 5634000000000 -[[stake]] +[[moonlight_account]] address = '23jFPiYSVEabmdo3zENKt4qSdBsVMDRTcneZ7LYKhfuB7E8UHXCLiPKDwXWTx4DAQirk2PhVkh6PiZKzaYhAkHuRwsKc7EAaB44yETLLzaWPoBGYDeoiwE82x9oY913RFUPH' -amount = 0 -reward = 119428448619037 +balance = 119428448619037 -[[stake]] +[[moonlight_account]] address = '23kFt6zjr93HKDcCpj6oLCkG8Qvd4FYgYAD8SdsBkhepdwQLb4MEAthQWEwrThVoqEPnYEdzGwUGPWqXq9rmN72yuqauiVqyoFxWHFUqDceYFkmUeZY2kAYmEaz7JFrPNr6f' -amount = 0 -reward = 35820404207891 +balance = 35820404207891 -[[stake]] +[[moonlight_account]] address = '23ku6X344VffeD9qH228Q83TJXZtWwfnugc2mVipWYLh1FNVuWXg8XHEYyF8zg9ykK6MAJrKvi4mLXH9hz6MZh8bzwEyaAHKKo9ttFB5UdneiLPQNJgi9oK93EmH3Npf6WLC' -amount = 0 -reward = 33333000000000 +balance = 33333000000000 -[[stake]] +[[moonlight_account]] address = '23oZwXzMs7MwcBLKBexma7jGzLwDenQkNzkbL15rFeNB2N9fKBCfdTHDgGNncScqgKM7iBF4wn5FoB9iWUp9AAvdCPiCFAa7EsGLFV33XeSJSLNbCeRsxPmCx9pFnkoTHUU3' -amount = 0 -reward = 6638498897482 +balance = 6638498897482 -[[stake]] +[[moonlight_account]] address = '23tQbtUhEih3hCZSHnQV6JWRyWJYgU6KrehoDDP4Ga6xVQEypCHxYLwSFEYoiVGaFcUuDDPuSMSjy1r76wZDe1GSWLeBpi1akMRTMD4WBztfREZdao5HuRiS1Zv8hYpU9W9n' -amount = 0 -reward = 67045600000000 +balance = 67045600000000 -[[stake]] +[[moonlight_account]] address = '23uW7My963Vbf7YvD6DWYX3QafQa7xEQYkpxZNcurm6tdmPB8U7UqzTfYjXuy4Uw52nMPgj1We59xV12Qqwj7VbJWbk6UtfnyV4MJ36yoN5T5KiBm9gLPRntNVpewGH4h1yw' -amount = 0 -reward = 5043200000000 +balance = 5043200000000 -[[stake]] +[[moonlight_account]] address = '23uWoHkBm7qQPRWRr1deANtvKXew8fA7H8oRBfuMo4HNhrY3AnxGX6FcnfdGTjynBgk7rvy2QKDohYcCzDJYajDox8X2hJhTAvobmGYVV6NKXchzr6NifVpZxo1ojZg9B7yJ' -amount = 0 -reward = 51914003704610 +balance = 51914003704610 -[[stake]] +[[moonlight_account]] address = '23yRmDP3VxFzJbhnweMnFJEeVAJvjo5H2A1BbvfJYAWJYSw1CeK47YU9zHpe4gUfao7SCNbG14nkzbYWhCkDVZcZiUgMrBjChYLTb1kvhNWhcYkKCstTn5N7H9z6Ufe8wnRE' -amount = 0 -reward = 5435202066749 +balance = 5435202066749 -[[stake]] +[[moonlight_account]] address = '244JNuKVneRjRDYGnYUKTAfcgA4wn36JG5XJyP4j3vcECQNPWKCYV2yNhwN9ERA8F8QAtyHyGojRUvDvpBi54rCoRqZaWjDrTES9DyVwNxAcjsFZbVboYeKXzPeCFYmPRGQV' -amount = 0 -reward = 7698000000000 +balance = 7698000000000 -[[stake]] +[[moonlight_account]] address = '2457tV7h776iFzyh9aicXARLfPTdthkAiZyVzyxC7M2daSAQbei5jGbMoPJVWUK8yRpqp66S7zMcytSYdCdfU8iziJYrYAuoZFk42RVa6T8u7B154qMGdrDpNcvsmo2ASa1k' -amount = 0 -reward = 6500000000000 +balance = 6500000000000 -[[stake]] +[[moonlight_account]] address = '24LaJTrgM9dczt1eRXjxeTdg1pGoyiGTGqWmdQrTfN8XwXD61ooEGiifhMDFcRZ6ZJyuniwwy9GtUUQAxzkGT8YHF71NrUn9fnaaBNfMCDZTpnmkK4JihDyuPoSLjQQDPbzE' -amount = 0 -reward = 5100800000000 +balance = 5100800000000 -[[stake]] +[[moonlight_account]] address = '24Pj8252ssT5UVZaJ26Xps7wPHujAHRZhXrQGT5bgdjYLF22TPc1fdFDuJ4CqEvzdZN9fVuBjdo8HnBnHKHrZaPbwKmoUSTE9DqY9a29yjtkYL9hWuDoiNCqVJgEZ4Evp2gT' -amount = 0 -reward = 9081200000000 +balance = 9081200000000 -[[stake]] +[[moonlight_account]] address = '24S9mCTzrH6H9Z8T7cjk69t28AkYx82vatnQCbNTfiiuSumePuEX5iB2rtzhb1ognZKwgpb2q58zEY4mDTxLjst83xCH5Wc3bKaen6VnC6SwstSSrcAiGhZ63ULqgymrzX75' -amount = 0 -reward = 147300000000000 +balance = 147300000000000 -[[stake]] +[[moonlight_account]] address = '24SwSTWfVhozFBQYBS7pCW5A3gnxbw1oCGD4a3BLiCoj5wGmgptqnQskrwtKyCMzE4eVmdsVLEJzRWPQ8kBs6hpiiD4VCbPeRiraKF8zhKDSUnP3WcWCubiZrCtCAFnR1uKs' -amount = 0 -reward = 11111000000000 +balance = 11111000000000 -[[stake]] +[[moonlight_account]] address = '24TmZV7YSCnBaN587ViKeMzq4KhqkuEHiaau9CqZHduB2HpLuF6QHsNScnDza9RHpYp42eQVPj8SX3ApQFyuExE1wribJknvSQksRb1AVKo8246MWv2PxXVe9hm3MfoWN2uG' -amount = 0 -reward = 5479926479714 +balance = 5479926479714 -[[stake]] +[[moonlight_account]] address = '24Ujm5AZ1JfSXe1PsVohP4aeuFRRM3TY9sHVULR5WKh7qkK5JxVR7xJBSEFDd81bsFtTFXq9ANuiEEF9jZRVDVHEWSXVmS249fkgc3KnxWse2wrQrVGLmDLzNtySddyiJuCS' -amount = 0 -reward = 172541600260993 +balance = 172541600260993 -[[stake]] +[[moonlight_account]] address = '24WTeF1pK7cY7L6BMi6XG1APuJMmXFDVyw7r8ZHkHMBWxSgjfoNnD8skQNDYWKNXyZoP3C8kt6kM5JQcmWdDYVe88NBeSjv4v3Ff8nZ8U37PMzicVUs336QqG9Nf8iUa4pPE' -amount = 0 -reward = 102624004006336 +balance = 102624004006336 -[[stake]] +[[moonlight_account]] address = '24ZoKfWVppDApT7LhyfbAEWyAHgGUeGgqAVdGbgTocjmsmS3YJQtKRsSXZ3Ekyn6BotZQhQwAaNshAZk7e5oGWJ2p1UN4DJRakCWYoLVZYHoPQRQXUPbEtmhp4hvKiCHa5RV' -amount = 0 -reward = 10910400000000 +balance = 10910400000000 -[[stake]] +[[moonlight_account]] address = '24adNFu3zfFjc7Bc56ktvNV7isGqKU2EbkPHAEsrAUkyJEzuMpCUTA8LRdTBHVpQsFkayEj5ajT7jw58qxCs7t81jo7yfu8NMwFxhaXSPncYhX6cJyWLCUKn2bSuduoFza4b' -amount = 0 -reward = 5695600452423 +balance = 5695600452423 -[[stake]] +[[moonlight_account]] address = '24baRKVFkkS13HURrWsPpjbNZ7HWBwCDaPs6JZc5Ry5f4y3XknztzqoueU6zFbH5C9vqHW4gsw6LqMCDtCt3FWyXTyctAFgGQnua9qPdFofqBFWU2bxYsYhr2NPFb6znVmVZ' -amount = 0 -reward = 21032000000000 +balance = 21032000000000 -[[stake]] +[[moonlight_account]] address = '24dkpUUU9gAbEhsrPjXHVB2oPSA55yEaNNJFTZ1uHktYpbzHfnreDZAWNPHjonHNoaFijDUWdsiMaWKbYwSBCDj87m5wq8R9xbrpgNJF3Y2jkhJwJQiiErZy9a5RLco8hGfa' -amount = 0 -reward = 6000000000000 +balance = 6000000000000 -[[stake]] +[[moonlight_account]] address = '24gJHyDmFQxXzeTS7d6PYjTe3E4a7GcmUF1kNbD8dWRzGcCpX2PgkrFRGUQdTSksRHka6yUMLAn1bZhKReZCPgWyoaGB716S1wCcPg3Kh8zeQhjFnf9GVb7P18F839yd6CoL' -amount = 0 -reward = 5500000000000 +balance = 5500000000000 -[[stake]] +[[moonlight_account]] address = '24hBGdobzcyw16WvvH7vdmo8weVwqPRw16K8Bfy5XvuKphW77h4PCWuiYRWHR2Cq3WcxsJv63cDB1SMj6LzcDmMo47ZdtZvK8Wk8t3b5DLoUNDTDtffGMJ6U5EzyqTFNWjxe' -amount = 0 -reward = 6794800262024 +balance = 6794800262024 -[[stake]] +[[moonlight_account]] address = '24mgbjMGwBvdruzCjCwa8vxYPLoAnp9DHjhx6xwDm1rmiKkLkT9heHJ56rxLcjj4uYP38Ubw3GHRxKsFmGbQAEijanKc5yKB2Ng4i3udnBpwkFSyETnzK1nZQTvEcoH2HwJ2' -amount = 0 -reward = 14460800262466 +balance = 14460800262466 -[[stake]] +[[moonlight_account]] address = '24qrGKg3o3Cbsxo1Mt7LsTyk9bzmUW32iJQgYGKwv4Ek8digxBr27vvvTB5obfyrqHR4354ykxnL7C4j2NfUPJaLBumWBGgHdcYVg5MAQBu86c5osNX6RWpwGyCDp13S9gXm' -amount = 0 -reward = 11130410135976 +balance = 11130410135976 -[[stake]] +[[moonlight_account]] address = '24r4QSsv8GknEN4tqxF6nSxeiq1hS4GLuDVyCnTQRWWuHRfaPrnuKCmkaGmS7GL7y84DsHEkAGg47TBsKWi1n3kMKLLWasNUURfPdRFYh1GZV8Bdqxf5Nhoh3JswTuNfn3D5' -amount = 0 -reward = 21559203857141 +balance = 21559203857141 -[[stake]] +[[moonlight_account]] address = '24rzmANCHnfWc1g8gPUnQXcQtQeaEyr2AWoTN2tNHf9SwJhCjtueDkKj4zQXK1qtjti84SfugNbwff5c8fQ6RPWYrarxwK3pCnzLNtc3fx5aSqwPao34yJb1uGbqWDSXSxz5' -amount = 0 -reward = 5901624452309 +balance = 5901624452309 -[[stake]] +[[moonlight_account]] address = '24tRR3tz72AAdeJbRQ41EjrmJyGdnn83HJQFknCnrw4pJiSMXVmP2qWDzeRbP7YyJQ4b54nNWTKWx5pB4rJmd813tKqFr6E8ZpqeD52iKtV5BKqcqzC1a69x1dSADuCzuhuK' -amount = 0 -reward = 5608400267642 +balance = 5608400267642 -[[stake]] +[[moonlight_account]] address = '24xnNjE4zZWEhYtLdtKLLkE5HM4FPpx7NVFcePwx7UAnFYMENaDKNSRb8YM7QTBvBNjnXfPJN5sqv7XA8G5WXDhwpdDzq65gYBKVVwswmdZ2D4Yr9e28Z2rQAtXtHrhNUX5Z' -amount = 0 -reward = 10718150678681 +balance = 10718150678681 -[[stake]] +[[moonlight_account]] address = '251rgqjRMpRkGyLAXpLaP7qfW6MWdSS6Cw6qvYrCE52ehvbJLX8KiHggDBnNXU1FrEZkyF8WcbNbGZbPzLMjpPJ22TLQtYe2jmodkBhx17xhxn7kXvftoMAqBXXXnmD1feiS' -amount = 0 -reward = 50962473604344 +balance = 50962473604344 -[[stake]] +[[moonlight_account]] address = '2528hUdZbLmzDv5EvyozenEcZhSXw2in9HGm5wB1UaoADpCLQHoFgAZNZvukps8FtRt3RDDkfv3EMaQqsRaF9S2fpHjnrFi8caSD1Qsyrox8SByH9GztUx48uRAiVKDxYWnu' -amount = 0 -reward = 16500000000000 +balance = 16500000000000 -[[stake]] +[[moonlight_account]] address = '25DS4UaodE6Dax76EKSu2EVQob71VFSn9dewQNXfMt7dsLrDdVoavTvuzEHuQqkaCHJfDCySz5QqCof8hzK2V72tseEUCbg8BKkGwqjGwUsKHNpdKfjQx13VXAkynVLeG8kF' -amount = 0 -reward = 6414376174648 +balance = 6414376174648 -[[stake]] +[[moonlight_account]] address = '25HS2S3Sx5gMRBv5H7XJKAbuU3FP5bcoszKAJXGkk7MMdEgChpaH8rtCxkKnQZjPdPCXe7ao2Lnkz9jwXjWfmsBkL29nxzEsH1ux6rPunB8KaDV3mQEhFfnds5tMUJRcRSXi' -amount = 0 -reward = 5547800448699 +balance = 5547800448699 -[[stake]] +[[moonlight_account]] address = '25HruDCwRM4qc96e6NMu3eWF3Jfwt4i7kpJPM4Vteh5neZf1PRLnXoTad8F8NaxEskQFHzDYkccBCUTAirvakT56Up2KWXDH7w8mKCkTbQYY7fRPwLy2bytwvraT6djBA5zL' -amount = 0 -reward = 5443200000000 +balance = 5443200000000 -[[stake]] +[[moonlight_account]] address = '25Jq7UFjfVf94mGDem2iy7K9pDtgo8tNWyYdF57V1Xjo2XCwkPNwME2bKosChUYvrbySiGKoU5ffaZZkYaEdChDinHs8uvFzLjrnoNh8ZjtNNPpDKiS3qwCAQZNA6ChqhaWF' -amount = 0 -reward = 5555200449980 +balance = 5555200449980 -[[stake]] +[[moonlight_account]] address = '25KVegFD3Bxmoi87MU2fkvNM7PburSBx5qA7kaw5yUMKVrNs6uQG7Xf8wZdJr34mJbXcXRLPwPXaqf8Pnoztd86Shy9n6DLiMXjsEkJexMnEu3ADHH7rSaANMBtSq5XiNqkd' -amount = 0 -reward = 51939850000000 +balance = 51939850000000 -[[stake]] +[[moonlight_account]] address = '25LAWNqy2XDXnsdi7ruc83MEa1Uveibvkh5vZ1XurXtMity7m17Vbxa652a5YZKN3iX9JDbMS5JK5TtjFhEeWp1CvXNs7nL6zrMLnGYZcNf57MkZ4KMr7GNcS2w5bUHdN7qR' -amount = 0 -reward = 77592018708996 +balance = 77592018708996 -[[stake]] +[[moonlight_account]] address = '25LiRxJx7LEviv7PQYUXa5ihFbJDSy2XJKrperZLSJKqzR4zPwxeLqVco7cgLiJpJbmwDDy7BPPBWGNmL8rPE2a5r6pgGXpupD9pxAA79eAeSVjnd5GGtWqh2ocPViH1CvCt' -amount = 0 -reward = 2501218219969554 +balance = 2501218219969554 -[[stake]] +[[moonlight_account]] address = '25Uq6FJwzM6s2vPMD9CMUY8rwh9gars2KiUMM7kLTLVv8JuQzjLrayKJFWWguk8uPGLG333wJcavwBaZ67w7QM1Nc4uebwR8f5N4j3g9HLZSpV2jGPCp8hDh6hmbXc8eP69R' -amount = 0 -reward = 8384900718622 +balance = 8384900718622 -[[stake]] +[[moonlight_account]] address = '25VVzgDRCTM4GXZGhq3DnZEKUvTpSaNFx3YMzH3yRTFehs6CU7HxZDtbr1ri8tMHY6SSmp6CLe2LFRXhDMD2vRAenvr5zZNFPbgXCMqEhvJGon9hTCQPJ5PJKnj226UpP9hZ' -amount = 0 -reward = 106092900567800 +balance = 106092900567800 -[[stake]] +[[moonlight_account]] address = '25YoGbhRYMmPioz7XfUUQJTeiPMjaJ6YVoSbg2Rh5QUXNwz3cAUg8NTPdFbnQs38pnhuXxQJxnS6muLVuVCtLRqtP5RdRE4dtpsY9n25dUQLQjHDdtaCdAWcT4wJH4ySbW5h' -amount = 0 -reward = 218244908365169 +balance = 218244908365169 -[[stake]] +[[moonlight_account]] address = '25YuvCqyNCzKSngi4LdLG1VRCF5agY82ceyznQsSeqFrAwQ4AHYfRxRBTKhNpA5bjhg2GgxKUY8BDi3GnvYgA9Q4iBUMtnEai7X39G4ymgsh2mDxGNyzMUofFnxkQ7RCGU3X' -amount = 0 -reward = 6670400000000 +balance = 6670400000000 -[[stake]] +[[moonlight_account]] address = '25c3YekLzr4Pdz6YKaRjGTqaK5SDnu752qoDoLhoDzo7Ts6Hf1jLZBCZVercFpi5nMrvgGW3kCQRVp4PYw6E3pjzdLSDUtHPQ4zU8xS8qQEehjxFTC6wAEXaBRxAhMxz1tGF' -amount = 0 -reward = 88310717088553 +balance = 88310717088553 -[[stake]] +[[moonlight_account]] address = '25npbaG6zNbDfbJFCbfaUBi8KgbVRKu1RgvmJZTC1rofphbf6P5cELdzCPeJQJC9Bd9GfurXM9ntyxaC6yrqgMk5eo7BH3N6bpDMrFje7ogW3ZU57zHorJWky7ztWJrHUjWG' -amount = 0 -reward = 5645810000000 +balance = 5645810000000 -[[stake]] +[[moonlight_account]] address = '25oS9Um1eqVBpbvLxNm7niCwKgC4bA1Hq2umUM182y4b79N1bQ7AnotV26sK2W9yjrK2sskweFKWzA35zJm6kkRicJxmYmL7pH5FEthAJ1t7wfxWzwtjk99Vkkfkza8bDbw9' -amount = 0 -reward = 536667786991572 +balance = 536667786991572 -[[stake]] +[[moonlight_account]] address = '25qGrk7rpoeoQH83NLLsgr8x3BiqFwsEmiU2qTjsiUJjdMBscA7zDEVfcjoPnxn462Yye9ztoHAUPmzLG4da7QYhHinmGHyre9HxFDgqkRs2PjD7E6v5Wa48H4sdRfzgSS2K' -amount = 0 -reward = 7079621873814 +balance = 7079621873814 -[[stake]] +[[moonlight_account]] address = '25wy1DHR51t1PkhYhMGujjZZyQRBW27G1ykmKnyNyEwwQLhHe4fPAcCyv7uh2EhRgx16LptSvwnFo9VRgS7jKwZriFMN4qiCX9iAZQG6NPGk1tyU5NHotGVwYecVJsed6CaY' -amount = 0 -reward = 105195610541298 +balance = 105195610541298 -[[stake]] +[[moonlight_account]] address = '25xRzpViWjweW1vB1EADyksgVzUrxhxjEdqVyE5P3jeFXNqx3T9y29nKCyaSNaHwK1n18agnqwK1H4C7At61sUekqPT7pCkW4yJ6PZZuK1SkkZLFovxCVcqcXhdH5HmMhnQ2' -amount = 0 -reward = 6432001426352 +balance = 6432001426352 -[[stake]] +[[moonlight_account]] address = '268TuebiFmaqQYuWA5qT3j5GcQfLt1eCpXfjQixgycg49evgEeeNNc8zhyXLDoRduCZgZCM9SDxHKQrbh6cVudBPfYFNmboZrRLNw79HU5vqThy57daQJzJKh1QzYcupMv2e' -amount = 0 -reward = 69818600527679 +balance = 69818600527679 -[[stake]] +[[moonlight_account]] address = '26A7czdjDiKJDbWb6RcZagf2CiqRvtXmEE4KTJJS7KfkRASDHaKw3hrCTXYXqxgZpWwZSTkhkezPpUWTR5ec3nrDvaMmAaNnoc4F1c9f2p6JB486AMPydirf2He6vvNqKgT9' -amount = 0 -reward = 126921631311845 +balance = 126921631311845 -[[stake]] +[[moonlight_account]] address = '26DXWeuszw7gStdctvVpRmLWjUjmby4CkSXypmm62ADcC2Bcm6Xy7kuJqe5uXVrpATrRMoHe2T7rgKxdgMgnQxUBcth23UHnXfSUSS8bdN21TuXDVDkcJomaJWwN1kSrZbCQ' -amount = 0 -reward = 121856014324602 +balance = 121856014324602 -[[stake]] +[[moonlight_account]] address = '26Tx84EZfjWN7bXGAKgP5MWnnfJ53jdPBn9oJbyHfGd8Vu2DNQKatnLoCkxYu1udqe73b1RCmCFWgJVpooj6dXFkfyVudbn4YGHAAmy1JWHPzKUxMSYPvCLGvaci6UfB4YPo' -amount = 0 -reward = 17076000262476 +balance = 17076000262476 -[[stake]] +[[moonlight_account]] address = '26XX4Y3qf5MpfE5BjmwMw1NzDvAVBGvqfTTtH1ksTsZ4EadNEk3bdjrSdpfJLWb9Wc2nh7J9P75Gxe7EfxHLR6N1VG73xS9dZAx7ijy7tfQXK3W5LCabgZA7JqUP6YUKv6yW' -amount = 0 -reward = 5588800523790 +balance = 5588800523790 -[[stake]] +[[moonlight_account]] address = '26d92JjRZZic6LgmKHU96TJnrtc8yezRuTFx5HbwRiwrdMUbGqGGT3CTeVZvpKpTUjL2sL6h8cw9DRwH5SSVT6ihLT243FuzCuvvEDk1pvu3Y7nkmpThw2dFsfgYN7rzgwmX' -amount = 0 -reward = 10112200525132 +balance = 10112200525132 -[[stake]] +[[moonlight_account]] address = '26f9Bq3htZLpHWPGi8nhfna4kXhTNhiUq3PkZx1gAY4LnhzhyHKnXSzMzqUHB5Bef8hBc4yvu68tdLsgFM4SruvXiagJQ4gXb8941EYzdER5tBT9MFJ1vf1MuCuDT2nBdNvA' -amount = 0 -reward = 5682800000000 +balance = 5682800000000 -[[stake]] +[[moonlight_account]] address = '26fo4EiE3ZoZxT3mfZpzf91AhdD1Gjpdz3UhKcF7aRs65phJpuRdaxot3soY7foEtben4gYkMbuzeshcKgiCsPbezCvzA9VnEphrcyd6JcAddMc6V19Zy32wWVkEjirNNGzs' -amount = 0 -reward = 10199801420673 +balance = 10199801420673 -[[stake]] +[[moonlight_account]] address = '26sLNdu4ZZQZWc27Kw9V2LVrURxep7i75eyCcKBLby46gDSSCABm269p9PHfvaBBQuKaLfa6QdmgH1hvzp8KU5kM3mRx1N2iSxgERY7BgBLzwRArjhMXTS7DPkvS4Ek4s4np' -amount = 0 -reward = 101154400000000 +balance = 101154400000000 -[[stake]] +[[moonlight_account]] address = '271Kgzh1TWeYPf1CU7BbnGHJZDJttZ7FRKZ7Wt68wwUWPuJjQZQRsseYjaLDxbJhP4TVuLzRVfXd6H8sJHM216VEMKcArdunLqLNh1mMdsaCdtinNFUjqyRTztwoHYskhXpq' -amount = 0 -reward = 52315800000000 +balance = 52315800000000 -[[stake]] +[[moonlight_account]] address = '271zWxBm6QnM2qjfypWjE2h2RP7yYmc7nUqsozWCoZewDCUaBs86y7rmqCN6ejwoc6BPzrdu3erPBAev1yNRGdnVtemubxAQPPjzKK6bsHZrwKLPTHCJ8bZKXByaD4F9MFrk' -amount = 0 -reward = 8331482328410616 +balance = 8331482328410616 + +# Test moonlight accounts (Milosz) + +[[moonlight_account]] +address = '21QVDgB74QDYPy8n7SFnfhKaJfQi72eHh9XWJeXV33zKN7rjSGP1dgrVyn7FDGyz5QSH3HeRm73JZxAykoF51Cxn92hpvcad6XAS22R9H9CypYs5w3XuQdzw66MRJNmncSXv' +balance = 6_000_000_000_000_000 + +[[moonlight_account]] +address = '23uR8GKVMs54YHzo4JLmBwEHs3uMZpaHnogAjViiWJWgRCjpyzFC3QdwixAMVGDG7DxURKxQgnBmD6QdeWyuKs9AKNhG6J4ZV16uQK2gpLLBC5bY93Jn5porChsAbWmwUEx6' +balance = 6_100_000_000_000_000 + +[[moonlight_account]] +address = '26qQBmhVHSSny3bDnUgLKaiiRon92K7hVqih9r5mh2vD85gJ5Xm9uV7mfZTeR2hgmfVtPFd7Ndwejb5AKZE2aoYAJwsmSrTeK2MNLna29xrwcSBFe8hdL9r6AwsoVoKYrUYU' +balance = 6_200_000_000_000_000 + +[[moonlight_account]] +address = 'miYKKT714d8EfWtCXaxHwXLE3ecU4MpzNiefRr6eCypaSgfWrFMHHwmLdfiMJiEV5yoMuBmMk9zwfMpCMxaWzUgjXqvzvQpZVkQKSgAJH48z9UsnWqtvKYNHvEzQgLE6k4d' +balance = 6_300_000_000_000_000 + +[[moonlight_account]] +address = 'ybqmEJESvmA7iENSncBg8WBjeqgWiCDtGJBMpwujnHYW2yQQCu8MBXwbGAe1W9MnNnzA5beiWniHjJi5LYqRy65UrpRR23ks4ce4QEzEoewpsJZVDRmdJsAen6HfxMK8vfT' +balance = 6_400_000_000_000_000 + +[[moonlight_account]] +address = '24VYQ1kMbaUQQRzDBACk464BDg49cqUa1NqGJMmobkt2yNJmyDXV7g9oGHQWwSWCuJcyhisko8PotZgmEwPH8PtD7NuYcmuCkGfExgdR34nJyasXexGC3T7giQdR1DByU9Fp' +balance = 6_500_000_000_000_000 + +[[moonlight_account]] +address = 'mpZpUmJbZbHVRCpkxa4xX1cPH4u9GAe5P3HrFnTjXnPH2qb9M5vjJVjYmiZpevvfqYP4CSkN1mH9n6vpzp16iXeqHboMWiEZ5DwiD2qLG6tiviKAMuexcbEUSrczz3r4Q12' +balance = 6_600_000_000_000_000 + +[[moonlight_account]] +address = 'xPW1XCytA26P2WghNe3gcZ9831J9x8dakJCfGzGUYggkHH7zbp2kcJ6Qo3j72n3i7rjn11VpAHYyxRsV1zEJFukRGgpWBMfUuBu8t6aahi3By1vkP1RVV6Z8yzNLwhJcZSW' +balance = 6_700_000_000_000_000 + +[[moonlight_account]] +address = 'uHFCgFffLmQEiERwJDkSBo1Yzz2jiAnYhVukoiNji22zpLVJmZosBBnSkEtRofzUhVVYVeXkzVUNiuFhyF3jZUgxNdW4eJLS6zPX51DB1ULUpNQ8ttgnTBMvbZBKehCz1i6' +balance = 6_800_000_000_000_000 + +[[moonlight_account]] +address = '23kPyggJ6jrmf1kfkRFr9bRJYGEKqAg7a5zhW5zYq4VswVT7pBuFF7f3hd6Us2teRaCHkURqUJpRALGHwa9dKNvovKAuS6oUtyXdyrkh3rPVKoAS8qAyWrMYbsXUBrDB3Bb3' +balance = 6_900_000_000_000_000 + +[[moonlight_account]] +address = '22qWN8wCZLKXoLgdVCF1noGm65jQkRSs5XvKzARSNPFfcTXExXXCnwro1RuVRiVK84hUWXqWegieBo72qdWr8i9ALMuaxzmrKGVLFMoP59crzePUnYopEmyJDbWTHyhwX8Ps' +balance = 7_000_000_000_000_000 + +[[moonlight_account]] +address = 'qpLZtWwmNBMTGzcgC7sZ7Ctq2dDjNbc5iSN4aVmVtVK8B5RrbJfS9uLqmvcCn9CBFkq6GS8N6YXqJWPivWWY8LRdRnMkp9xxMFngGCc5SV3ZnUMpnnh7vzLF2Q7mP8cCS3a' +balance = 7_100_000_000_000_000 + +[[moonlight_account]] +address = '214twXJifCt8TeGRFaxcAcb1HUScSuGa9K5vLHZ26Xyb9iTUCesPjH4YCiMN2tzHQeYuB6e2HEtNvXitaWqP68NiV71wrfNPft4ExcoKzR29LduJb3iM3kQNnMrFS8aw197F' +balance = 7_200_000_000_000_000 + +[[moonlight_account]] +address = '212Pk7N9EgebdFtU8tBc998LEp7Xa6i3fh14P4LeXwXWcM4wkqXUmzBgaUVxWHohUNbRmhv5wAxEwidVR6YqHb8bXEtVDR6B6CTD8V2StqEaqjfBFA6aFgXxEkDRG8AzoyqH' +balance = 7_300_000_000_000_000 + +[[moonlight_account]] +address = 'xtnvj8ZT6WNGNmKVU4rUKABzKtxgY5NYwxb9vXZdEMwkXg4XNQzuiF9uXqYWDyzd4hMnyNqDZMjb7xteQXg5S5jLD3MFoeyrKL3MWMRMCjpTUTnXnvLbA92uKRQci194KKY' +balance = 7_400_000_000_000_000 + +[[moonlight_account]] +address = 'mx2GUePBkCsJENhowYK1ugn3XzT7iuMSqRUmK3ri39m8oF6wjsCtSUWN4CwPzzvLd5sijTnnecCortKhHgKSFZRjZHxUZf8V14AV9Bhv7u7LC45X2FkfNm7MRKsmaNPnseN' +balance = 7_500_000_000_000_000 diff --git a/rusk-recovery/src/state.rs b/rusk-recovery/src/state.rs index fa57461e82..6b63b4079c 100644 --- a/rusk-recovery/src/state.rs +++ b/rusk-recovery/src/state.rs @@ -40,6 +40,7 @@ pub const DEFAULT_SNAPSHOT: &str = include_str!("../config/testnet_remote.toml"); const GENESIS_BLOCK_HEIGHT: u64 = 0; +const GENESIS_CHAIN_ID: u8 = 0xFA; pub static DUSK_KEY: Lazy = Lazy::new(|| { let addr = include_str!("../assets/dusk.address"); @@ -126,6 +127,7 @@ fn generate_stake_state( let amount = (staker.amount > 0).then(|| StakeAmount { value: staker.amount, eligibility: staker.eligibility.unwrap_or_default(), + locked: 0, }); let stake = StakeData { @@ -171,7 +173,7 @@ fn generate_empty_state>( let state_dir = state_dir.as_ref(); let vm = rusk_abi::new_vm(state_dir)?; - let mut session = rusk_abi::new_genesis_session(&vm); + let mut session = rusk_abi::new_genesis_session(&vm, GENESIS_CHAIN_ID); let transfer_code = include_bytes!( "../../target/dusk/wasm64-unknown-unknown/release/transfer_contract.wasm" @@ -259,8 +261,12 @@ where None => generate_empty_state(state_dir, snapshot), }?; - let mut session = - rusk_abi::new_session(&vm, old_commit_id, GENESIS_BLOCK_HEIGHT)?; + let mut session = rusk_abi::new_session( + &vm, + old_commit_id, + GENESIS_CHAIN_ID, + GENESIS_BLOCK_HEIGHT, + )?; generate_transfer_state(&mut session, snapshot)?; generate_stake_state(&mut session, snapshot)?; diff --git a/rusk-wallet/Cargo.toml b/rusk-wallet/Cargo.toml index 0bb2c41335..41a9226df2 100644 --- a/rusk-wallet/Cargo.toml +++ b/rusk-wallet/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "dusk-wallet" -version = "0.22.1" +name = "rusk-wallet" +version = "0.1.0" edition = "2021" autobins = false description = "A library providing functionalities to create wallets compatible with Dusk Network" @@ -32,7 +32,6 @@ requestty = "0.5.0" futures = "0.3" base64 = "0.13" crypto = "0.3" -whoami = "1.2" blake3 = "1.3" sha2 = "0.10.7" toml = "0.5" @@ -44,24 +43,17 @@ aes = "0.7" rocksdb = "0.22" flume = "0.10.14" reqwest = { version = "0.11", features = ["stream"] } - -dusk-wallet-core = "0.24.0-plonk.0.16-rc.2" dusk-bytes = "0.1" -dusk-pki = "0.13" -rusk-abi = { version = "0.12.0-rc", default-features = false } -phoenix-core = { version = "0.21", features = ["alloc"] } -dusk-schnorr = { version = "0.14", default-features = false } -dusk-poseidon = "0.31" -dusk-plonk = "0.16" -dusk-bls12_381-sign = { version = "0.5", default-features = false } -ff = { version = "0.13", default-features = false } -poseidon-merkle = "0.3" + +zeroize = { version = "1", default-features = false, features = ["derive"] } +wallet-core = { path = "../wallet-core" } +execution-core = { path = "../execution-core" } tracing = "0.1" tracing-subscriber = { version = "0.3.0", features = [ - "fmt", - "env-filter", - "json", + "fmt", + "env-filter", + "json", ] } rkyv = { version = "=0.7.39", default-features = false } diff --git a/rusk-wallet/src/bin/command.rs b/rusk-wallet/src/bin/command.rs index a390669369..e75126097b 100644 --- a/rusk-wallet/src/bin/command.rs +++ b/rusk-wallet/src/bin/command.rs @@ -7,17 +7,19 @@ mod history; use clap::Subcommand; -use dusk_plonk::prelude::BlsScalar; -use rusk_abi::hash::Hasher; use std::{fmt, path::PathBuf}; use crate::io::prompt; use crate::settings::Settings; use crate::{WalletFile, WalletPath}; -use dusk_wallet::gas::{Gas, DEFAULT_LIMIT, DEFAULT_PRICE}; -use dusk_wallet::{Address, Dusk, Lux, Wallet, EPOCH, MAX_ADDRESSES}; -use dusk_wallet_core::{BalanceInfo, StakeInfo}; +use execution_core::{stake::StakeData, BlsScalar}; +use rusk_wallet::{ + currency::{Dusk, Lux}, + gas::{Gas, DEFAULT_LIMIT, DEFAULT_PRICE}, + Address, Error, Wallet, EPOCH, MAX_ADDRESSES, +}; +use wallet_core::BalanceInfo; pub use history::TransactionHistory; @@ -230,7 +232,7 @@ impl Command { let gas = Gas::new(gas_limit).with_price(gas_price); let tx = wallet.transfer(sender, &rcvr, amt, gas).await?; - Ok(RunResult::Tx(Hasher::digest(tx.to_hash_input_bytes()))) + Ok(RunResult::Tx(tx.hash())) } Command::Stake { addr, @@ -246,14 +248,16 @@ impl Command { let gas = Gas::new(gas_limit).with_price(gas_price); let tx = wallet.stake(addr, amt, gas).await?; - Ok(RunResult::Tx(Hasher::digest(tx.to_hash_input_bytes()))) + Ok(RunResult::Tx(tx.hash())) } Command::StakeInfo { addr, reward } => { let addr = match addr { Some(addr) => wallet.claim_as_address(addr)?, None => wallet.default_address(), }; - let si = wallet.stake_info(addr).await?; + let si = + wallet.stake_info(addr).await?.ok_or(Error::NotStaked)?; + Ok(RunResult::StakeInfo(si, reward)) } Command::Unstake { @@ -270,7 +274,7 @@ impl Command { let gas = Gas::new(gas_limit).with_price(gas_price); let tx = wallet.unstake(addr, gas).await?; - Ok(RunResult::Tx(Hasher::digest(tx.to_hash_input_bytes()))) + Ok(RunResult::Tx(tx.hash())) } Command::Withdraw { addr, @@ -286,7 +290,7 @@ impl Command { let gas = Gas::new(gas_limit).with_price(gas_price); let tx = wallet.withdraw_reward(addr, gas).await?; - Ok(RunResult::Tx(Hasher::digest(tx.to_hash_input_bytes()))) + Ok(RunResult::Tx(tx.hash())) } Command::Export { addr, dir, name } => { let addr = match addr { @@ -329,7 +333,7 @@ impl Command { pub enum RunResult { Tx(BlsScalar), Balance(BalanceInfo, bool), - StakeInfo(StakeInfo, bool), + StakeInfo(StakeData, bool), Address(Box
), Addresses(Vec
), ExportedKeys(PathBuf, PathBuf), @@ -366,13 +370,13 @@ impl fmt::Display for RunResult { let hash = hex::encode(hash.to_bytes()); write!(f, "> Transaction sent: {hash}",) } - StakeInfo(si, _) => { - let stake_str = match si.amount { - Some((value, eligibility)) => format!( + StakeInfo(data, _) => { + let stake_str = match data.amount { + Some(amt) => format!( "Current stake amount is: {} DUSK\n> Stake eligibility from block #{} (Epoch {})", - Dusk::from(value), - eligibility, - eligibility / EPOCH + Dusk::from(amt.value), + amt.eligibility, + amt.eligibility / EPOCH ), None => "No active stake found for this key".to_string(), }; @@ -380,7 +384,7 @@ impl fmt::Display for RunResult { f, "> {}\n> Accumulated reward is: {} DUSK", stake_str, - Dusk::from(si.reward) + Dusk::from(data.reward) ) } ExportedKeys(pk, kp) => { diff --git a/rusk-wallet/src/bin/command/history.rs b/rusk-wallet/src/bin/command/history.rs index 2e8e573daa..3ccc437c0c 100644 --- a/rusk-wallet/src/bin/command/history.rs +++ b/rusk-wallet/src/bin/command/history.rs @@ -8,9 +8,9 @@ use std::collections::hash_map::Entry; use std::collections::HashMap; use std::fmt::{self, Display}; -use dusk_wallet::DecodedNote; -use dusk_wallet_core::Transaction; -use rusk_abi::dusk; +use rusk_wallet::DecodedNote; + +use execution_core::{dusk, from_dusk, transfer::Transaction}; use crate::io::{self, GraphQL}; use crate::settings::Settings; @@ -35,17 +35,17 @@ impl TransactionHistory { impl Display for TransactionHistory { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let dusk = self.amount / dusk::dusk(1.0) as f64; + let dusk = self.amount / dusk(1.0) as f64; let contract = match self.tx.call() { None => "transfer", - Some((_, method, _)) => method, + Some(call) => &call.fn_name, }; let fee = match self.direction { TransactionDirection::In => "".into(), TransactionDirection::Out => { let fee = self.fee; - let fee = dusk::from_dusk(fee); + let fee = from_dusk(fee); format!("{: >12.9}", fee) } }; @@ -95,8 +95,8 @@ pub(crate) async fn transaction_from_notes( let note_hash = decoded_note.note.hash(); // Looking for the transaction which created the note let note_creator = txs.iter().find(|(t, _, _)| { - t.outputs().iter().any(|&n| n.hash().eq(¬e_hash)) - || t.nullifiers + t.outputs().iter().any(|n| n.hash().eq(¬e_hash)) + || t.nullifiers() .iter() .any(|tx_null| nullifiers.iter().any(|(n, _)| n == tx_null)) }); @@ -114,13 +114,14 @@ pub(crate) async fn transaction_from_notes( true => TransactionDirection::Out, false => TransactionDirection::In, }; + match ret.iter_mut().find(|th| &th.id == tx_id) { Some(tx) => tx.amount += note_amount, None => ret.push(TransactionHistory { direction, height: decoded_note.block_height, amount: note_amount - inputs_amount, - fee: gas_spent * t.fee().gas_price, + fee: gas_spent * t.gas_price(), tx: t.clone(), id: tx_id.clone(), }), diff --git a/rusk-wallet/src/bin/interactive.rs b/rusk-wallet/src/bin/interactive.rs index f6494ae3e4..07f35cea34 100644 --- a/rusk-wallet/src/bin/interactive.rs +++ b/rusk-wallet/src/bin/interactive.rs @@ -5,10 +5,12 @@ // Copyright (c) DUSK NETWORK. All rights reserved. use bip39::{Language, Mnemonic, MnemonicType}; -use dusk_wallet::dat::{DatFileVersion, LATEST_VERSION}; -use dusk_wallet::gas; -use dusk_wallet::{Address, Dusk, Error, Wallet, WalletPath, MAX_ADDRESSES}; use requestty::Question; +use rusk_wallet::{ + currency::Dusk, + dat::{DatFileVersion, LATEST_VERSION}, + gas, Address, Error, Wallet, WalletPath, MAX_ADDRESSES, +}; use crate::command::DEFAULT_STAKE_GAS_LIMIT; use crate::io; @@ -68,7 +70,7 @@ pub(crate) async fn run_loop( // get balance for this address prompt::hide_cursor()?; let balance = wallet.get_balance(&addr).await?; - let spendable: Dusk = balance.spendable.into(); + let spendable = balance.spendable.into(); let total: Dusk = balance.value.into(); prompt::hide_cursor()?; @@ -159,7 +161,7 @@ fn menu_addr(wallet: &Wallet) -> anyhow::Result { )); } - if let Some(rx) = &wallet.sync_rx { + if let Some(rx) = &wallet.state()?.sync_rx { if let Ok(status) = rx.try_recv() { action_menu = action_menu .separator() diff --git a/rusk-wallet/src/bin/io/gql.rs b/rusk-wallet/src/bin/io/gql.rs index d1fafc6648..4b0c9d6c08 100644 --- a/rusk-wallet/src/bin/io/gql.rs +++ b/rusk-wallet/src/bin/io/gql.rs @@ -4,10 +4,10 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use dusk_wallet_core::Transaction; +use execution_core::transfer::Transaction; use tokio::time::{sleep, Duration}; -use dusk_wallet::{Error, RuskHttpClient, RuskRequest}; +use rusk_wallet::{Error, RuskHttpClient, RuskRequest}; use serde::Deserialize; /// GraphQL is a helper struct that aggregates all queries done @@ -129,7 +129,7 @@ impl GraphQL { pub enum GraphQLError { /// Generic errors #[error("Error fetching data from the node: {0}")] - Generic(dusk_wallet::Error), + Generic(Error), /// Failed to fetch transaction status #[error("Failed to obtain transaction status")] TxStatus, @@ -137,8 +137,8 @@ pub enum GraphQLError { BlockInfo, } -impl From for GraphQLError { - fn from(e: dusk_wallet::Error) -> Self { +impl From for GraphQLError { + fn from(e: Error) -> Self { Self::Generic(e) } } @@ -150,10 +150,7 @@ impl From for GraphQLError { } impl GraphQL { - pub async fn query( - &self, - query: &str, - ) -> Result, dusk_wallet::Error> { + pub async fn query(&self, query: &str) -> Result, Error> { let request = RuskRequest::new("gql", query.as_bytes().to_vec()); self.client.call(2, "Chain", &request).await } @@ -177,7 +174,7 @@ async fn test() -> Result<(), Box> { .await?; let block_txs = gql.txs_for_block(90).await?; block_txs.into_iter().for_each(|(t, chain_txid, _)| { - let hash = rusk_abi::hash::Hasher::digest(t.to_hash_input_bytes()); + let hash = t.hash(); let tx_id = hex::encode(hash.to_bytes()); assert_eq!(chain_txid, tx_id); println!("txid: {tx_id}"); diff --git a/rusk-wallet/src/bin/io/prompt.rs b/rusk-wallet/src/bin/io/prompt.rs index e4200d9161..b358af1478 100644 --- a/rusk-wallet/src/bin/io/prompt.rs +++ b/rusk-wallet/src/bin/io/prompt.rs @@ -15,13 +15,14 @@ use crossterm::{ use anyhow::Result; use bip39::{ErrorKind, Language, Mnemonic}; -use dusk_wallet::{dat::DatFileVersion, Error}; use requestty::Question; -use dusk_wallet::{Address, Dusk, Lux}; - -use dusk_wallet::gas; -use dusk_wallet::{MAX_CONVERTIBLE, MIN_CONVERTIBLE}; +use rusk_wallet::gas; +use rusk_wallet::{ + currency::{Dusk, Lux}, + dat::DatFileVersion, + Address, Error, MAX_CONVERTIBLE, MIN_CONVERTIBLE, +}; use sha2::{Digest, Sha256}; /// Request the user to authenticate with a password @@ -244,6 +245,7 @@ pub(crate) fn request_token_amt( .build(); let a = requestty::prompt_one(question)?; + Ok(a.as_float().expect("answer to be a float").into()) } diff --git a/rusk-wallet/src/bin/main.rs b/rusk-wallet/src/bin/main.rs index 7ddb9cadae..050c4d8742 100644 --- a/rusk-wallet/src/bin/main.rs +++ b/rusk-wallet/src/bin/main.rs @@ -12,7 +12,6 @@ mod menu; mod settings; pub(crate) use command::{Command, RunResult}; -use dusk_wallet::dat::LATEST_VERSION; pub(crate) use menu::Menu; use clap::Parser; @@ -25,8 +24,11 @@ use bip39::{Language, Mnemonic, MnemonicType}; use crate::command::TransactionHistory; use crate::settings::{LogFormat, Settings}; -use dusk_wallet::{dat, Error}; -use dusk_wallet::{Dusk, SecureWalletFile, Wallet, WalletPath}; +use rusk_wallet::{currency::Dusk, SecureWalletFile, Wallet, WalletPath}; +use rusk_wallet::{ + dat::{self, LATEST_VERSION}, + Error, +}; use config::Config; use io::{prompt, status}; @@ -83,7 +85,7 @@ where // check for connection errors match con { - Err(Error::RocksDB(e)) => panic!{"Invalid cache {e}"}, + Err(Error::RocksDB(e)) => panic!{"Please reset the cache! {e}"}, Err(e) => warn!("[OFFLINE MODE]: Unable to connect to Rusk, limited functionality available: {e}"), _ => {} } @@ -121,7 +123,7 @@ async fn exec() -> anyhow::Result<()> { // Finally complete the settings by setting the network let settings = settings_builder .network(cfg.network) - .map_err(|_| dusk_wallet::Error::NetworkNotFound)?; + .map_err(|_| rusk_wallet::Error::NetworkNotFound)?; // generate a subscriber with the desired log level // @@ -314,7 +316,7 @@ async fn exec() -> anyhow::Result<()> { println!("{}", Dusk::from(info.reward)); } else { let staked_amount = match info.amount { - Some((staked, ..)) => staked, + Some(info) => info.value, None => 0, }; println!("{}", Dusk::from(staked_amount)); diff --git a/rusk-wallet/src/bin/settings.rs b/rusk-wallet/src/bin/settings.rs index 99517c2e1b..3284bb96d9 100644 --- a/rusk-wallet/src/bin/settings.rs +++ b/rusk-wallet/src/bin/settings.rs @@ -7,7 +7,7 @@ use crate::config::Network; use crate::io::WalletArgs; -use dusk_wallet::Error; +use rusk_wallet::Error; use std::fmt; use std::path::PathBuf; diff --git a/rusk-wallet/src/cache.rs b/rusk-wallet/src/cache.rs index acc7b3552c..2dd4936d57 100644 --- a/rusk-wallet/src/cache.rs +++ b/rusk-wallet/src/cache.rs @@ -4,18 +4,15 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use std::cmp::Ordering; -use std::collections::BTreeSet; use std::path::Path; +use std::{cmp::Ordering, collections::BTreeSet}; use dusk_bytes::{DeserializableSlice, Serializable}; -use dusk_pki::PublicSpendKey; -use dusk_plonk::prelude::BlsScalar; -use dusk_wallet_core::Store; -use phoenix_core::Note; use rocksdb::{DBWithThreadMode, MultiThreaded, Options}; -use crate::{error::Error, store::LocalStore, MAX_ADDRESSES}; +use super::*; + +use crate::error::Error; type DB = DBWithThreadMode; @@ -30,21 +27,9 @@ impl Cache { /// Returns a new cache instance. pub(crate) fn new>( path: T, - store: &LocalStore, + cfs: Vec, status: fn(&str), ) -> Result { - let cfs: Vec<_> = (0..MAX_ADDRESSES) - .flat_map(|i| { - let ssk = - store.retrieve_ssk(i as u64).expect("ssk to be available"); - let psk = ssk.public_spend_key(); - - let live = format!("{:?}", psk); - let spent = format!("spent_{:?}", psk); - [live, spent] - }) - .collect(); - status("Opening notes database"); let mut opts = Options::default(); @@ -59,16 +44,16 @@ impl Cache { Ok(Self { db }) } - // We store a column family named by hex representation of the psk. + // We store a column family named by hex representation of the pk. // We store the nullifier of the note as key and the value is the bytes // representation of the tuple (NoteHeight, Note) pub(crate) fn insert( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, height: u64, note_data: (Note, BlsScalar), ) -> Result<(), Error> { - let cf_name = format!("{:?}", psk); + let cf_name = format!("{:?}", pk); let cf = self .db @@ -85,16 +70,16 @@ impl Cache { Ok(()) } - // We store a column family named by hex representation of the psk. + // We store a column family named by hex representation of the pk. // We store the nullifier of the note as key and the value is the bytes // representation of the tuple (NoteHeight, Note) pub(crate) fn insert_spent( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, height: u64, note_data: (Note, BlsScalar), ) -> Result<(), Error> { - let cf_name = format!("spent_{:?}", psk); + let cf_name = format!("spent_{:?}", pk); let cf = self .db @@ -113,14 +98,14 @@ impl Cache { pub(crate) fn spend_notes( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, nullifiers: &[BlsScalar], ) -> Result<(), Error> { if nullifiers.is_empty() { return Ok(()); } - let cf_name = format!("{:?}", psk); - let spent_cf_name = format!("spent_{:?}", psk); + let cf_name = format!("{:?}", pk); + let spent_cf_name = format!("spent_{:?}", pk); let cf = self .db @@ -160,12 +145,12 @@ impl Cache { })) } - /// Returns an iterator over all unspent notes nullifier for the given PSK. + /// Returns an iterator over all unspent notes nullifier for the given pk. pub(crate) fn unspent_notes_id( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, ) -> Result, Error> { - let cf_name = format!("{:?}", psk); + let cf_name = format!("{:?}", pk); let mut notes = vec![]; if let Some(cf) = self.db.cf_handle(&cf_name) { @@ -183,13 +168,13 @@ impl Cache { Ok(notes) } - /// Returns an iterator over all unspent notes inserted for the given PSK, + /// Returns an iterator over all unspent notes inserted for the given pk, /// in order of note position. pub(crate) fn notes( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, ) -> Result, Error> { - let cf_name = format!("{:?}", psk); + let cf_name = format!("{:?}", pk); let mut notes = BTreeSet::::new(); if let Some(cf) = self.db.cf_handle(&cf_name) { @@ -208,13 +193,13 @@ impl Cache { Ok(notes) } - /// Returns an iterator over all notes inserted for the given PSK, in order + /// Returns an iterator over all notes inserted for the given pk, in order /// of block height. pub(crate) fn spent_notes( &self, - psk: &PublicSpendKey, + pk: &PhoenixPublicKey, ) -> Result, Error> { - let cf_name = format!("spent_{:?}", psk); + let cf_name = format!("spent_{:?}", pk); let mut notes = vec![]; if let Some(cf) = self.db.cf_handle(&cf_name) { @@ -249,7 +234,7 @@ impl PartialOrd for NoteData { } impl Ord for NoteData { - fn cmp(&self, other: &Self) -> Ordering { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { self.note.pos().cmp(other.note.pos()) } } diff --git a/rusk-wallet/src/clients.rs b/rusk-wallet/src/clients.rs index 35a5de5afb..4c1a7ff9f9 100644 --- a/rusk-wallet/src/clients.rs +++ b/rusk-wallet/src/clients.rs @@ -6,43 +6,34 @@ mod sync; -use dusk_bls12_381_sign::PublicKey; -use dusk_bytes::{DeserializableSlice, Serializable, Write}; -use dusk_pki::ViewKey; -use dusk_plonk::prelude::*; -use dusk_plonk::proof_system::Proof; -use dusk_schnorr::Signature; -use dusk_wallet_core::{ - EnrichedNote, ProverClient, StakeInfo, StateClient, Transaction, - UnprovenTransaction, POSEIDON_TREE_DEPTH, +use dusk_bytes::Serializable; +use execution_core::{ + transfer::{phoenix::Prove, Transaction}, + Error as ExecutionCoreError, }; -use flume::Sender; -use phoenix_core::transaction::StakeData; -use phoenix_core::{Crossover, Fee, Note}; -use poseidon_merkle::Opening as PoseidonOpening; +use flume::Receiver; use tokio::time::{sleep, Duration}; +use wallet_core::{ + input::try_input_notes, + keys::{derive_phoenix_pk, derive_phoenix_sk, derive_phoenix_vk}, +}; +use zeroize::Zeroize; -use std::path::Path; -use std::sync::{Arc, Mutex}; +use std::{ + path::Path, + sync::{Arc, Mutex}, +}; use self::sync::sync_db; -use super::block::Block; -use super::cache::Cache; - -use crate::rusk::{RuskHttpClient, RuskRequest}; -use crate::store::LocalStore; -use crate::Error; - -const STCT_INPUT_SIZE: usize = Fee::SIZE - + Crossover::SIZE - + u64::SIZE - + JubJubScalar::SIZE - + BlsScalar::SIZE - + Signature::SIZE; +use super::{block::Block, cache::Cache, *}; -const WFCT_INPUT_SIZE: usize = - JubJubAffine::SIZE + u64::SIZE + JubJubScalar::SIZE; +use crate::{ + cache::NoteData, + rusk::{RuskHttpClient, RuskRequest}, + store::LocalStore, + Error, MAX_ADDRESSES, +}; const TRANSFER_CONTRACT: &str = "0100000000000000000000000000000000000000000000000000000000000000"; @@ -53,191 +44,84 @@ const STAKE_CONTRACT: &str = // Sync every 3 seconds for now const SYNC_INTERVAL_SECONDS: u64 = 3; -/// Implementation of the ProverClient trait from wallet-core -pub struct Prover { - state: RuskHttpClient, - prover: RuskHttpClient, - status: fn(status: &str), -} - -impl Prover { - pub fn new(state: RuskHttpClient, prover: RuskHttpClient) -> Self { - Prover { - state, - prover, - status: |_| {}, - } - } +/// A prover struct that has the `Prove` trait from executio-core implemented. +/// It currently uses a hardcoded prover which delegates the proving to the +/// `prove_execute` +pub struct Prover; - /// Sets the callback method to send status updates - pub fn set_status_callback(&mut self, status: fn(&str)) { - self.status = status; - } - - pub async fn check_connection(&self) -> Result<(), reqwest::Error> { - self.state.check_connection().await?; - self.prover.check_connection().await +impl Prove for Prover { + fn prove( + tx_circuit_vec_bytes: &[u8], + ) -> Result, ExecutionCoreError> { + Ok(tx_circuit_vec_bytes.to_vec()) } } -impl ProverClient for Prover { - /// Error returned by the prover client. - type Error = Error; - - /// Requests that a node prove the given transaction and later propagates it - fn compute_proof_and_propagate( - &self, - utx: &UnprovenTransaction, - ) -> Result { - self.status("Proving tx, please wait..."); - let utx_bytes = utx.to_var_bytes(); - let prove_req = RuskRequest::new("prove_execute", utx_bytes); - let proof_bytes = self.prover.call(2, "rusk", &prove_req).wait()?; - self.status("Proof success!"); - let proof = Proof::from_slice(&proof_bytes).map_err(Error::Bytes)?; - let tx = utx.clone().prove(proof); - let tx_bytes = tx.to_var_bytes(); - - self.status("Attempt to preverify tx..."); - let preverify_req = RuskRequest::new("preverify", tx_bytes.clone()); - let _ = self.state.call(2, "rusk", &preverify_req).wait()?; - self.status("Preverify success!"); - - self.status("Propagating tx..."); - let propagate_req = RuskRequest::new("propagate_tx", tx_bytes); - let _ = self.state.call(2, "Chain", &propagate_req).wait()?; - self.status("Transaction propagated!"); - - Ok(tx) - } - - /// Requests an STCT proof. - fn request_stct_proof( - &self, - fee: &Fee, - crossover: &Crossover, - value: u64, - blinder: JubJubScalar, - address: BlsScalar, - signature: Signature, - ) -> Result { - let mut buf = [0; STCT_INPUT_SIZE]; - let mut writer = &mut buf[..]; - writer.write(&fee.to_bytes())?; - writer.write(&crossover.to_bytes())?; - writer.write(&value.to_bytes())?; - writer.write(&blinder.to_bytes())?; - writer.write(&address.to_bytes())?; - writer.write(&signature.to_bytes())?; - - self.status("Requesting stct proof..."); - - let prove_req = RuskRequest::new("prove_stct", buf.to_vec()); - let res = self.prover.call(2, "rusk", &prove_req).wait()?; - - self.status("Stct proof success!"); - - let mut proof_bytes = [0u8; Proof::SIZE]; - proof_bytes.copy_from_slice(&res); - - let proof = Proof::from_bytes(&proof_bytes)?; - Ok(proof) - } - - /// Request a WFCT proof. - fn request_wfct_proof( - &self, - commitment: JubJubAffine, - value: u64, - blinder: JubJubScalar, - ) -> Result { - let mut buf = [0; WFCT_INPUT_SIZE]; - let mut writer = &mut buf[..]; - writer.write(&commitment.to_bytes())?; - writer.write(&value.to_bytes())?; - writer.write(&blinder.to_bytes())?; - - self.status("Requesting wfct proof..."); - let prove_req = RuskRequest::new("prove_wfct", buf.to_vec()); - let res = self.prover.call(2, "rusk", &prove_req).wait()?; - self.status("Wfct proof success!"); - - let mut proof_bytes = [0u8; Proof::SIZE]; - proof_bytes.copy_from_slice(&res); - - let proof = Proof::from_bytes(&proof_bytes)?; - Ok(proof) - } -} - -impl Prover { - fn status(&self, text: &str) { - (self.status)(text) - } -} - -/// Implementation of the StateClient trait from wallet-core -/// inner is an option because we don't want to open the db twice and lock it -/// We construct StateStore twice -pub struct StateStore { - inner: Mutex, +/// The state struct is responsible for managing the state of the wallet +pub struct State { + cache: Mutex>, status: fn(&str), - pub(crate) store: LocalStore, -} - -struct InnerState { client: RuskHttpClient, - cache: Arc, + prover: RuskHttpClient, + store: LocalStore, + pub sync_rx: Option>, } -impl StateStore { +impl State { /// Creates a new state instance. Should only be called once. pub(crate) fn new( - client: RuskHttpClient, data_dir: &Path, - store: LocalStore, status: fn(&str), + client: RuskHttpClient, + prover: RuskHttpClient, + store: LocalStore, ) -> Result { - let cache = Arc::new(Cache::new(data_dir, &store, status)?); - let inner = Mutex::new(InnerState { client, cache }); + let cfs = (0..MAX_ADDRESSES) + .flat_map(|i| { + let pk: PhoenixPublicKey = + derive_phoenix_pk(store.get_seed(), i as u8); + + [format!("{:?}", pk), format!("spent_{:?}", pk)] + }) + .collect(); + + let cache = Mutex::new(Arc::new(Cache::new(data_dir, cfs, status)?)); Ok(Self { - inner, - status, + cache, + sync_rx: None, store, + prover, + status, + client, }) } - pub async fn check_connection(&self) -> Result<(), reqwest::Error> { - let client = { self.inner.lock().unwrap().client.clone() }; + pub(crate) fn cache(&self) -> Arc { + let state = self.cache.lock().unwrap(); - client.check_connection().await + Arc::clone(&state) } - pub async fn register_sync( - &self, - sync_tx: Sender, - ) -> Result<(), Error> { - let state = self.inner.lock().unwrap(); + pub async fn register_sync(&mut self) -> Result<(), Error> { + let (sync_tx, sync_rx) = flume::unbounded::(); + + self.sync_rx = Some(sync_rx); + + let cache = self.cache(); let status = self.status; + let client = self.client.clone(); let store = self.store.clone(); - let client = state.client.clone(); - let cache = Arc::clone(&state.cache); - let sender = Arc::new(sync_tx); status("Starting Sync.."); tokio::spawn(async move { loop { - let status = |_: &_| {}; - let sender = Arc::clone(&sender); - let _ = sender.send("Syncing..".to_string()); - - let sync_status = - sync_db(&client, &store, &cache, status).await; - let _ = match sync_status { - Ok(_) => sender.send("Syncing Complete".to_string()), - Err(e) => sender.send(format!("Error during sync:.. {e}")), + let _ = sync_tx.send("Syncing..".to_string()); + + let _ = match sync_db(&client, &cache, &store, status).await { + Ok(_) => sync_tx.send("Syncing Complete".to_string()), + Err(e) => sync_tx.send(format!("Error during sync:.. {e}")), }; sleep(Duration::from_secs(SYNC_INTERVAL_SECONDS)).await; @@ -248,133 +132,179 @@ impl StateStore { } pub async fn sync(&self) -> Result<(), Error> { - let store = self.store.clone(); + sync_db(&self.client, &self.cache(), &self.store, self.status).await + } + + /// Requests that a node prove the given transaction and later propagates it + /// Skips writing the proof for non phoenix transactions + pub fn prove_and_propagate( + &self, + utx: Transaction, + ) -> Result { let status = self.status; - let (cache, client) = { - let state = self.inner.lock().unwrap(); + let prover = &self.prover; + let mut utx = utx; - let cache = state.cache.clone(); - let client = state.client.clone(); - (cache, client) - }; + if let Transaction::Phoenix(tx) = &mut utx { + let status = self.status; + let proof = tx.proof(); - sync_db(&client, &store, cache.as_ref(), status).await - } + status("Attempt to prove tx..."); - pub(crate) fn cache(&self) -> Arc { - let state = self.inner.lock().unwrap(); - Arc::clone(&state.cache) - } -} + let prove_req = RuskRequest::new("prove_execute", proof.to_vec()); + + let proof = + prover.call(2, "rusk", &prove_req).wait().map_err(|e| { + ExecutionCoreError::PhoenixCircuit(e.to_string()) + })?; + + tx.set_proof(proof); + + status("Proving sucesss!"); + } -/// Types that are clients of the state API. -impl StateClient for StateStore { - /// Error returned by the node client. - type Error = Error; + let tx_bytes = utx.to_var_bytes(); + + status("Attempt to preverify tx..."); + let preverify_req = RuskRequest::new("preverify", tx_bytes.clone()); + let _ = self.client.call(2, "rusk", &preverify_req).wait()?; + status("Preverify success!"); + + status("Propagating tx..."); + let propagate_req = RuskRequest::new("propagate_tx", tx_bytes); + let _ = self.client.call(2, "Chain", &propagate_req).wait()?; + status("Transaction propagated!"); + + Ok(utx) + } /// Find notes for a view key, starting from the given block height. - fn fetch_notes( + pub(crate) fn inputs( &self, - vk: &ViewKey, - ) -> Result, Self::Error> { - let psk = vk.public_spend_key(); - let state = self.inner.lock().unwrap(); - - Ok(state - .cache - .notes(&psk)? + index: u8, + target: u64, + ) -> Result, Error> { + let vk = derive_phoenix_vk(self.store().get_seed(), index); + let mut sk = derive_phoenix_sk(self.store().get_seed(), index); + let pk = derive_phoenix_pk(self.store().get_seed(), index); + + let inputs: Result, Error> = self + .cache() + .notes(&pk)? .into_iter() - .map(|data| (data.note, data.height)) - .collect()) - } + .map(|data| { + let note = data.note; + let nullifiers = note.gen_nullifier(&sk); + let value = note.value(Some(&vk)).unwrap(); - /// Fetch the current anchor of the state. - fn fetch_anchor(&self) -> Result { - let state = self.inner.lock().unwrap(); + Ok((note, value, nullifiers)) + }) + .collect(); - self.status("Fetching anchor..."); + let inputs = try_input_notes(inputs?, target) + .into_iter() + .map(|(note, scalar)| { + let opening = self.fetch_opening(¬e)?; - let anchor = state - .client - .contract_query::<(), 0>(TRANSFER_CONTRACT, "root", &()) - .wait()?; - self.status("Anchor received!"); - let anchor = rkyv::from_bytes(&anchor).map_err(|_| Error::Rkyv)?; - Ok(anchor) - } + Ok((note, opening, scalar)) + }) + .collect(); - /// Asks the node to return the nullifiers that already exist from the given - /// nullifiers. - fn fetch_existing_nullifiers( - &self, - _nullifiers: &[BlsScalar], - ) -> Result, Self::Error> { - Ok(vec![]) + sk.zeroize(); + + inputs } - /// Queries the node to find the opening for a specific note. - fn fetch_opening( + pub(crate) fn fetch_notes( &self, - note: &Note, - ) -> Result, Self::Error> { - let state = self.inner.lock().unwrap(); + pk: &PhoenixPublicKey, + ) -> Result, Error> { + self.cache() + .notes(pk)? + .into_iter() + .map(|data| { + Ok(NoteData { + note: data.note, + height: data.height, + }) + }) + .collect() + } - self.status("Fetching opening notes..."); + /// Fetch the current root of the state. + pub(crate) fn fetch_root(&self) -> Result { + let status = self.status; + status("Fetching root..."); - let data = state + let root = self .client - .contract_query::<_, 1024>(TRANSFER_CONTRACT, "opening", note.pos()) + .contract_query::<(), 0>(TRANSFER_CONTRACT, "root", &()) .wait()?; - - self.status("Opening notes received!"); - - let branch = rkyv::from_bytes(&data).map_err(|_| Error::Rkyv)?; - Ok(branch) + status("root received!"); + let root = rkyv::from_bytes(&root).map_err(|_| Error::Rkyv)?; + Ok(root) } /// Queries the node for the amount staked by a key. - fn fetch_stake(&self, pk: &PublicKey) -> Result { - let state = self.inner.lock().unwrap(); - - self.status("Fetching stake..."); + pub(crate) fn fetch_stake( + &self, + pk: &AccountPublicKey, + ) -> Result, Error> { + let status = self.status; + status("Fetching stake..."); - let data = state + let data = self .client .contract_query::<_, 1024>(STAKE_CONTRACT, "get_stake", pk) .wait()?; let res: Option = rkyv::from_bytes(&data).map_err(|_| Error::Rkyv)?; - self.status("Stake received!"); + status("Stake received!"); let staking_address = pk.to_bytes().to_vec(); let staking_address = bs58::encode(staking_address).into_string(); println!("Staking address: {}", staking_address); - // FIX_ME: proper solution should to return an Option - // changing the trait implementation. That would reflect the state of - // the stake contract. It would be up to the consumer to decide what to - // do with a None - let stake = res - .map( - |StakeData { - amount, - reward, - counter, - }| StakeInfo { - amount, - reward, - counter, - }, + Ok(res) + } + + pub(crate) fn store(&self) -> &LocalStore { + &self.store + } + + pub(crate) fn fetch_chain_id(&self) -> Result { + let status = self.status; + status("Fetching chain_id..."); + + let data = self + .client + .contract_query::<_, { u8::SIZE }>( + TRANSFER_CONTRACT, + "chain_id", + &(), ) - .unwrap_or_default(); + .wait()?; + + let res: u8 = rkyv::from_bytes(&data).map_err(|_| Error::Rkyv)?; + status("Chain id received!"); - Ok(stake) + Ok(res) } -} -impl StateStore { - fn status(&self, text: &str) { - (self.status)(text) + /// Queries the node to find the opening for a specific note. + fn fetch_opening(&self, note: &Note) -> Result { + let status = self.status; + status("Fetching opening notes..."); + + let data = self + .client + .contract_query::<_, 1024>(TRANSFER_CONTRACT, "opening", note.pos()) + .wait()?; + + status("Opening notes received!"); + + let branch = rkyv::from_bytes(&data).map_err(|_| Error::Rkyv)?; + Ok(branch) } } diff --git a/rusk-wallet/src/clients/sync.rs b/rusk-wallet/src/clients/sync.rs index 40e2e27ee6..c884c91b63 100644 --- a/rusk-wallet/src/clients/sync.rs +++ b/rusk-wallet/src/clients/sync.rs @@ -6,33 +6,36 @@ use std::mem::size_of; -use dusk_plonk::prelude::BlsScalar; -use dusk_wallet_core::Store; use futures::StreamExt; -use phoenix_core::transaction::{ArchivedTreeLeaf, TreeLeaf}; use crate::block::Block; use crate::clients::{Cache, TRANSFER_CONTRACT}; use crate::rusk::RuskHttpClient; -use crate::store::LocalStore; -use crate::{Error, RuskRequest, MAX_ADDRESSES}; +use crate::{Error, RuskRequest}; -const RKYV_TREE_LEAF_SIZE: usize = size_of::(); +use super::*; -pub(crate) async fn sync_db( +const TREE_LEAF: usize = size_of::(); + +pub(crate) async fn sync_db( client: &RuskHttpClient, - store: &LocalStore, cache: &Cache, - status: F, + store: &LocalStore, + status: fn(&str), ) -> Result<(), Error> { - let addresses: Vec<_> = (0..MAX_ADDRESSES) - .flat_map(|i| store.retrieve_ssk(i as u64)) - .map(|ssk| { - let vk = ssk.view_key(); - let psk = vk.public_spend_key(); - (ssk, vk, psk) - }) - .collect(); + let seed = store.get_seed(); + + let addresses: Vec<(PhoenixSecretKey, PhoenixViewKey, PhoenixPublicKey)> = + (0..MAX_ADDRESSES) + .map(|i| { + let i = i as u8; + ( + derive_phoenix_sk(seed, i), + derive_phoenix_vk(seed, i), + derive_phoenix_pk(seed, i), + ) + }) + .collect(); status("Getting cached note position..."); @@ -63,51 +66,62 @@ pub(crate) async fn sync_db( // This buffer is needed because `.bytes_stream();` introduce additional // spliting of chunks according to it's own buffer let mut buffer = vec![]; + let mut note_data = Vec::new(); while let Some(http_chunk) = stream.next().await { buffer.extend_from_slice(&http_chunk?); - let mut leaf_chunk = buffer.chunks_exact(RKYV_TREE_LEAF_SIZE); + let mut leaf_chunk = buffer.chunks_exact(TREE_LEAF); for leaf_bytes in leaf_chunk.by_ref() { - let TreeLeaf { block_height, note } = + let NoteLeaf { block_height, note } = rkyv::from_bytes(leaf_bytes).map_err(|_| Error::Rkyv)?; last_pos = std::cmp::max(last_pos, *note.pos()); - for (ssk, vk, psk) in addresses.iter() { - if vk.owns(¬e) { - let nullifier = note.gen_nullifier(ssk); - let spent = - fetch_existing_nullifiers_remote(client, &[nullifier]) - .wait()? - .first() - .is_some(); - let note = (note, nullifier); - match spent { - true => cache.insert_spent(psk, block_height, note), - false => cache.insert(psk, block_height, note), - }?; - - break; - } - } - cache.insert_last_pos(last_pos)?; + note_data.push((block_height, note)); } + cache.insert_last_pos(last_pos)?; + buffer = leaf_chunk.remainder().to_vec(); } + for (sk, vk, pk) in addresses.iter() { + for (block_height, note) in note_data.iter() { + if vk.owns(note.stealth_address()) { + let nullifier = note.gen_nullifier(sk); + let spent = + fetch_existing_nullifiers_remote(client, &[nullifier]) + .wait()? + .first() + .is_some(); + let note = (note.clone(), nullifier); + + match spent { + true => cache.insert_spent(pk, *block_height, note), + false => cache.insert(pk, *block_height, note), + }?; + } + } + } + // Remove spent nullifiers from live notes - for (_, _, psk) in addresses { - let nullifiers = cache.unspent_notes_id(&psk)?; + // zerorize all the secret keys + for (mut sk, _, pk) in addresses { + let nullifiers: Vec = cache.unspent_notes_id(&pk)?; if !nullifiers.is_empty() { let existing = - fetch_existing_nullifiers_remote(client, &nullifiers).wait()?; - cache.spend_notes(&psk, &existing)?; + fetch_existing_nullifiers_remote(client, nullifiers.as_slice()) + .wait()?; + + cache.spend_notes(&pk, existing.as_slice())?; } + + sk.zeroize(); } + Ok(()) } diff --git a/rusk-wallet/src/currency.rs b/rusk-wallet/src/currency.rs index 8222045d18..377ff0be3d 100644 --- a/rusk-wallet/src/currency.rs +++ b/rusk-wallet/src/currency.rs @@ -11,7 +11,7 @@ use std::num::ParseFloatError; use std::ops::{Add, Deref, Div, Mul, Sub}; use std::str::FromStr; -use rusk_abi::dusk; +use super::*; /// The underlying unit of Dusk pub type Lux = u64; @@ -24,7 +24,7 @@ impl Dusk { /// The smallest value that can be represented by Dusk currency pub const MIN: Dusk = Dusk(0); /// The largest value that can be represented by Dusk currency - pub const MAX: Dusk = Dusk(dusk::dusk(f64::MAX / dusk::dusk(1.0) as f64)); + pub const MAX: Dusk = Dusk(dusk(f64::MAX / dusk(1.0) as f64)); /// Returns a new Dusk based on the [Lux] given pub const fn new(lux: Lux) -> Dusk { @@ -70,18 +70,18 @@ impl Sub for Dusk { impl Mul for Dusk { type Output = Self; fn mul(self, other: Self) -> Self { - let a = dusk::from_dusk(self.0); - let b = dusk::from_dusk(other.0); - Self(dusk::dusk(a * b)) + let a = from_dusk(self.0); + let b = from_dusk(other.0); + Self(dusk(a * b)) } } impl Mul for Dusk { type Output = Self; fn mul(self, other: Lux) -> Self { - let a = dusk::from_dusk(self.0); - let b = dusk::from_dusk(other); - Self(dusk::dusk(a * b)) + let a = from_dusk(self.0); + let b = from_dusk(other); + Self(dusk(a * b)) } } @@ -89,14 +89,14 @@ impl Mul for Dusk { impl Div for Dusk { type Output = Self; fn div(self, other: Self) -> Self { - Self(dusk::dusk(self.0 as f64 / other.0 as f64)) + Self(dusk(self.0 as f64 / other.0 as f64)) } } impl Div for Dusk { type Output = Self; fn div(self, other: Lux) -> Self { - Self(dusk::dusk(self.0 as f64 / other as f64)) + Self(dusk(self.0 as f64 / other as f64)) } } @@ -118,7 +118,7 @@ impl PartialEq for Dusk { } impl PartialEq for Dusk { fn eq(&self, other: &f64) -> bool { - self.0 == dusk::dusk(*other) + self.0 == dusk(*other) } } @@ -141,7 +141,7 @@ impl PartialOrd for Dusk { } impl PartialOrd for Dusk { fn partial_cmp(&self, other: &f64) -> Option { - self.0.partial_cmp(&dusk::dusk(*other)) + self.0.partial_cmp(&dusk(*other)) } } @@ -154,13 +154,13 @@ impl From for Dusk { if val < 0.0 { panic!("Dusk type does not support negative values"); } - Self(dusk::dusk(val)) + Self(dusk(val)) } } impl From for f64 { fn from(val: Dusk) -> f64 { - dusk::from_dusk(*val) + from_dusk(*val) } } diff --git a/rusk-wallet/src/dat.rs b/rusk-wallet/src/dat.rs index 836f549e2a..6ab92adaf0 100644 --- a/rusk-wallet/src/dat.rs +++ b/rusk-wallet/src/dat.rs @@ -4,13 +4,12 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use dusk_bytes::DeserializableSlice; - use std::fs; use std::io::Read; +use wallet_core::keys::Seed; + use crate::crypto::decrypt; -use crate::store; use crate::Error; use crate::WalletPath; @@ -51,7 +50,7 @@ pub(crate) fn get_seed_and_address( file: DatFileVersion, mut bytes: Vec, pwd: &[u8], -) -> Result<(store::Seed, u8), Error> { +) -> Result<(Seed, u8), Error> { match file { DatFileVersion::Legacy => { if bytes[1] == 0 && bytes[2] == 0 { @@ -61,7 +60,8 @@ pub(crate) fn get_seed_and_address( bytes = decrypt(&bytes, pwd)?; // get our seed - let seed = store::Seed::from_reader(&mut &bytes[..]) + let seed = bytes[..] + .try_into() .map_err(|_| Error::WalletFileCorrupted)?; Ok((seed, 1)) @@ -69,23 +69,24 @@ pub(crate) fn get_seed_and_address( DatFileVersion::OldWalletCli((major, minor, _, _, _)) => { bytes.drain(..5); - let result: Result<(store::Seed, u8), Error> = match (major, minor) - { + let result: Result<(Seed, u8), Error> = match (major, minor) { (1, 0) => { let content = decrypt(&bytes, pwd)?; - let mut buff = &content[..]; + let buff = &content[..]; - let seed = store::Seed::from_reader(&mut buff) + let seed = buff + .try_into() .map_err(|_| Error::WalletFileCorrupted)?; Ok((seed, 1)) } (2, 0) => { let content = decrypt(&bytes, pwd)?; - let mut buff = &content[..]; + let buff = &content[..]; // extract seed - let seed = store::Seed::from_reader(&mut buff) + let seed = buff + .try_into() .map_err(|_| Error::WalletFileCorrupted)?; // extract addresses count @@ -102,7 +103,8 @@ pub(crate) fn get_seed_and_address( let content = decrypt(rest, pwd)?; if let Some(seed_buff) = content.get(0..65) { - let seed = store::Seed::from_reader(&mut &seed_buff[0..64]) + let seed = seed_buff[0..64] + .try_into() .map_err(|_| Error::WalletFileCorrupted)?; let count = &seed_buff[64..65]; diff --git a/rusk-wallet/src/error.rs b/rusk-wallet/src/error.rs index ba1a892525..a5ee8670c7 100644 --- a/rusk-wallet/src/error.rs +++ b/rusk-wallet/src/error.rs @@ -4,18 +4,10 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::clients::StateStore; -use crate::store::LocalStore; -use phoenix_core::Error as PhoenixError; use rand_core::Error as RngError; use std::io; use std::str::Utf8Error; -use super::clients; -/// Wallet core error -pub(crate) type CoreError = - dusk_wallet_core::Error; - /// Errors returned by this library #[derive(Debug, thiserror::Error)] pub enum Error { @@ -52,9 +44,6 @@ pub enum Error { /// Random number generator errors #[error(transparent)] Rng(#[from] RngError), - /// Transaction model errors - #[error("An error occurred in Phoenix: {0:?}")] - Phoenix(PhoenixError), /// Not enough balance to perform transaction #[error("Insufficient balance to perform this operation")] NotEnoughBalance, @@ -124,6 +113,12 @@ pub enum Error { /// The cache database couldn't find column family required #[error("Cache database corrupted")] CacheDatabaseCorrupted, + /// Prover errors from execution-core + #[error("Prover Error")] + ProverError(String), + /// Memo provided is too large + #[error("Memo too large {0}")] + MemoTooLarge(usize), } impl From for Error { @@ -138,21 +133,24 @@ impl From for Error { } } -impl From for Error { - fn from(e: CoreError) -> Self { - use dusk_wallet_core::Error::*; +impl From for Error { + fn from(e: execution_core::Error) -> Self { + use execution_core::Error::*; + match e { - Store(err) | State(err) | Prover(err) => err, - Rkyv => Self::Rkyv, - Rng(err) => Self::Rng(err), - Bytes(err) => Self::Bytes(err), - Phoenix(err) => Self::Phoenix(err), - NotEnoughBalance => Self::NotEnoughBalance, - NoteCombinationProblem => Self::NoteCombinationProblem, - AlreadyStaked { .. } => Self::AlreadyStaked, - NotStaked { .. } => Self::NotStaked, - NoReward { .. } => Self::NoReward, - Utf8(err) => Self::Utf8(err.utf8_error()), + InsufficientBalance => Self::NotEnoughBalance, + Replay => Self::Transaction("Replay".to_string()), + PhoenixOwnership => Self::AddressNotOwned, + PhoenixCircuit(s) | PhoenixProver(s) => Self::ProverError(s), + InvalidData => Self::Bytes(dusk_bytes::Error::InvalidData), + BadLength(found, expected) => { + Self::Bytes(dusk_bytes::Error::BadLength { found, expected }) + } + InvalidChar(ch, index) => { + Self::Bytes(dusk_bytes::Error::InvalidChar { ch, index }) + } + Rkyv(_) => Self::Rkyv, + MemoTooLarge(m) => Self::MemoTooLarge(m), } } } diff --git a/rusk-wallet/src/lib.rs b/rusk-wallet/src/lib.rs index ab967a9fe4..5d0371c63b 100644 --- a/rusk-wallet/src/lib.rs +++ b/rusk-wallet/src/lib.rs @@ -14,12 +14,13 @@ #![deny(missing_docs)] +/// module to help with currency conversions +pub mod currency; + mod block; mod cache; mod clients; mod crypto; - -mod currency; mod error; mod rusk; mod store; @@ -30,11 +31,24 @@ pub mod dat; pub use rusk::{RuskHttpClient, RuskRequest}; -pub use currency::{Dusk, Lux}; pub use error::Error; pub use wallet::gas; pub use wallet::{Address, DecodedNote, SecureWalletFile, Wallet, WalletPath}; +use execution_core::{ + dusk, from_dusk, + signatures::bls::PublicKey as AccountPublicKey, + stake::StakeData, + transfer::phoenix::{ + ArchivedNoteLeaf, Note, NoteLeaf, NoteOpening, + PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, + ViewKey as PhoenixViewKey, + }, + BlsScalar, +}; + +use currency::Dusk; + /// The largest amount of Dusk that is possible to convert pub const MAX_CONVERTIBLE: Dusk = Dusk::MAX; /// The smallest amount of Dusk that is possible to convert @@ -44,7 +58,7 @@ pub const EPOCH: u64 = 2160; /// Max addresses the wallet can store pub const MAX_ADDRESSES: usize = get_max_addresses(); -const DEFAULT_MAX_ADDRESSES: usize = 25; +const DEFAULT_MAX_ADDRESSES: usize = 1; const fn get_max_addresses() -> usize { match option_env!("WALLET_MAX_ADDR") { diff --git a/rusk-wallet/src/rusk.rs b/rusk-wallet/src/rusk.rs index fbcd06581d..b1eb580f5b 100644 --- a/rusk-wallet/src/rusk.rs +++ b/rusk-wallet/src/rusk.rs @@ -38,6 +38,7 @@ impl RuskRequest { Ok(buffer) } } + #[derive(Clone)] /// Rusk HTTP Binary Client pub struct RuskHttpClient { diff --git a/rusk-wallet/src/store.rs b/rusk-wallet/src/store.rs index d8470a3170..b5c31aec54 100644 --- a/rusk-wallet/src/store.rs +++ b/rusk-wallet/src/store.rs @@ -4,18 +4,18 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::clients::StateStore; -use crate::Error; +use crate::clients::State; use dusk_bytes::{Error as BytesError, Serializable}; -use dusk_wallet_core::Store; + +use wallet_core::keys::{self, RNG_SEED}; #[derive(Clone)] -pub struct Seed([u8; 64]); +pub struct Seed(keys::Seed); impl Default for Seed { fn default() -> Self { - Self([0u8; 64]) + Self([0u8; RNG_SEED]) } } @@ -36,27 +36,22 @@ pub(crate) struct LocalStore { seed: Seed, } -impl Store for LocalStore { - type Error = Error; - +impl LocalStore { /// Retrieves the seed used to derive keys. - fn get_seed(&self) -> Result<[u8; Seed::SIZE], Self::Error> { - Ok(self.seed.to_bytes()) + pub fn get_seed(&self) -> &[u8; Seed::SIZE] { + &self.seed.0 } } -impl Store for StateStore { - type Error = Error; - - /// Retrieves the seed used to derive keys. - fn get_seed(&self) -> Result<[u8; Seed::SIZE], Self::Error> { - Ok(self.store.seed.to_bytes()) +impl From<[u8; Seed::SIZE]> for LocalStore { + fn from(seed: [u8; Seed::SIZE]) -> Self { + LocalStore { seed: Seed(seed) } } } -impl LocalStore { - /// Creates a new store from a known seed - pub(crate) fn new(seed: Seed) -> Self { - LocalStore { seed } +impl State { + /// Retrieves the seed used to derive keys. + pub fn get_seed(&self) -> &[u8; Seed::SIZE] { + self.store().get_seed() } } diff --git a/rusk-wallet/src/wallet.rs b/rusk-wallet/src/wallet.rs index 54f5abab0d..f68f4edcbc 100644 --- a/rusk-wallet/src/wallet.rs +++ b/rusk-wallet/src/wallet.rs @@ -9,44 +9,55 @@ mod file; pub mod gas; pub use address::Address; -use dusk_plonk::prelude::BlsScalar; pub use file::{SecureWalletFile, WalletPath}; use bip39::{Language, Mnemonic, Seed}; -use dusk_bytes::{DeserializableSlice, Serializable}; -use ff::Field; -use flume::Receiver; -use phoenix_core::transaction::ModuleId; -use phoenix_core::Note; -use rkyv::ser::serializers::AllocSerializer; +use dusk_bytes::Serializable; +use rand::rngs::StdRng; +use rand::SeedableRng; + use serde::Serialize; use std::fmt::Debug; use std::fs; use std::path::{Path, PathBuf}; -use dusk_bls12_381_sign::{PublicKey, SecretKey}; -use dusk_wallet_core::{ - BalanceInfo, StakeInfo, StateClient, Store, Transaction, - Wallet as WalletCore, MAX_CALL_SIZE, +use wallet_core::{ + phoenix_balance, + prelude::keys::{ + derive_bls_sk, derive_phoenix_pk, derive_phoenix_sk, derive_phoenix_vk, + }, + transaction::{ + phoenix, phoenix_stake, phoenix_stake_reward, phoenix_unstake, + }, + BalanceInfo, }; -use rand::prelude::StdRng; -use rand::SeedableRng; -use dusk_pki::{PublicSpendKey, SecretSpendKey}; +use execution_core::{ + signatures::bls::{PublicKey as BlsPublicKey, SecretKey as BlsSecretKey}, + transfer::{ + data::{ContractCall, TransactionData}, + Transaction, + }, +}; -use crate::cache::NoteData; -use crate::clients::{Prover, StateStore}; -use crate::crypto::encrypt; -use crate::currency::Dusk; -use crate::dat::{ - self, version_bytes, DatFileVersion, FILE_TYPE, LATEST_VERSION, MAGIC, - RESERVED, +use zeroize::Zeroize; + +use super::*; + +use crate::{ + cache::NoteData, + clients::{Prover, State}, + crypto::encrypt, + currency::Dusk, + dat::{ + self, version_bytes, DatFileVersion, FILE_TYPE, LATEST_VERSION, MAGIC, + RESERVED, + }, + store::LocalStore, + Error, RuskHttpClient, }; -use crate::store::LocalStore; -use crate::{Error, RuskHttpClient}; -use gas::Gas; -use crate::store; +use gas::Gas; /// The interface to the Dusk Network /// @@ -62,14 +73,11 @@ use crate::store; /// able to perform common operations such as checking balance, transfernig /// funds, or staking Dusk. pub struct Wallet { - wallet: Option>, addresses: Vec
, + state: Option, store: LocalStore, file: Option, file_version: Option, - status: fn(status: &str), - /// Recieve the status/errors of the sync procss - pub sync_rx: Option>, } impl Wallet { @@ -78,23 +86,23 @@ impl Wallet { &self.file } - /// Returns spending key pair for a given address - pub fn spending_keys( + /// Returns phoenix key pair for a given address + pub fn phoenix_keys( &self, addr: &Address, - ) -> Result<(PublicSpendKey, SecretSpendKey), Error> { + ) -> Result<(PhoenixPublicKey, PhoenixSecretKey), Error> { // make sure we own the address if !addr.is_owned() { return Err(Error::Unauthorized); } - let index = addr.index()? as u64; + let index = addr.index()?; // retrieve keys - let ssk = self.store.retrieve_ssk(index)?; - let psk: PublicSpendKey = ssk.public_spend_key(); + let sk = derive_phoenix_sk(self.store.get_seed(), index); + let pk = addr.pk(); - Ok((psk, ssk)) + Ok((*pk, sk)) } } @@ -113,29 +121,18 @@ impl Wallet { // derive the mnemonic seed let seed = Seed::new(&mnemonic, ""); // Takes the mnemonic seed as bytes - let mut bytes = seed.as_bytes(); - - // Generate a Store Seed type from the mnemonic Seed bytes - let seed = store::Seed::from_reader(&mut bytes)?; - - let store = LocalStore::new(seed); + let bytes = seed.as_bytes().try_into().unwrap(); // Generate the default address - let ssk = store - .retrieve_ssk(0) - .expect("wallet seed should be available"); - - let address = Address::new(0, ssk.public_spend_key()); + let address = Address::new(0, derive_phoenix_pk(&bytes, 0)); // return new wallet instance Ok(Wallet { - wallet: None, addresses: vec![address], - store, + state: None, + store: LocalStore::from(bytes), file: None, file_version: None, - status: |_| {}, - sync_rx: None, }) } else { Err(Error::InvalidMnemonicPhrase) @@ -161,47 +158,31 @@ impl Wallet { let (seed, address_count) = dat::get_seed_and_address(file_version, bytes, pwd)?; - let store = LocalStore::new(seed); - // return early if its legacy if let DatFileVersion::Legacy = file_version { - let ssk = store - .retrieve_ssk(0) - .expect("wallet seed should be available"); - - let address = Address::new(0, ssk.public_spend_key()); + let address = Address::new(0, derive_phoenix_pk(&seed, 0)); // return the store return Ok(Self { - wallet: None, addresses: vec![address], - store, + store: LocalStore::from(seed), + state: None, file: Some(file), file_version: Some(DatFileVersion::Legacy), - status: |_| {}, - sync_rx: None, }); } let addresses: Vec<_> = (0..address_count) - .map(|i| { - let ssk = store - .retrieve_ssk(i as u64) - .expect("wallet seed should be available"); - - Address::new(i, ssk.public_spend_key()) - }) + .map(|i| Address::new(i, derive_phoenix_pk(&seed, i))) .collect(); // create and return Ok(Self { - wallet: None, addresses, - store, + store: LocalStore::from(seed), + state: None, file: Some(file), file_version: Some(file_version), - status: |_| {}, - sync_rx: None, }) } @@ -219,7 +200,7 @@ impl Wallet { header.extend_from_slice(&version_bytes(LATEST_VERSION)); // create file payload - let seed = self.store.get_seed()?; + let seed = self.store.get_seed(); let mut payload = seed.to_vec(); payload.push(self.addresses.len() as u8); @@ -250,6 +231,15 @@ impl Wallet { self.save() } + /// Access the inner state of the wallet + pub fn state(&self) -> Result<&State, Error> { + if let Some(state) = self.state.as_ref() { + Ok(state) + } else { + Err(Error::Offline) + } + } + /// Connect the wallet to the network providing a callback for status /// updates pub async fn connect_with_status( @@ -274,10 +264,6 @@ impl Wallet { _=> {}, } - // create a prover client - let mut prover = Prover::new(http_state.clone(), http_prover.clone()); - prover.set_status_callback(status); - let cache_dir = { if let Some(file) = &self.file { file.path().cache_dir() @@ -287,58 +273,33 @@ impl Wallet { }; // create a state client - let state = StateStore::new( - http_state, + self.state = Some(State::new( &cache_dir, - self.store.clone(), status, - )?; - - // create wallet instance - self.wallet = Some(WalletCore::new(self.store.clone(), state, prover)); - - // set our own status callback - self.status = status; + http_state, + http_prover, + self.store.clone(), + )?); Ok(()) } /// Sync wallet state pub async fn sync(&self) -> Result<(), Error> { - self.connected_wallet().await?.state().sync().await + self.state()?.sync().await } /// Helper function to register for async-sync outside of connect pub async fn register_sync(&mut self) -> Result<(), Error> { - match self.wallet.as_ref() { - Some(w) => { - let (sync_tx, sync_rx) = flume::unbounded::(); - w.state().register_sync(sync_tx).await?; - self.sync_rx = Some(sync_rx); - Ok(()) - } + match self.state.as_mut() { + Some(w) => w.register_sync().await, None => Err(Error::Offline), } } /// Checks if the wallet has an active connection to the network pub async fn is_online(&self) -> bool { - match self.wallet.as_ref() { - Some(w) => w.state().check_connection().await.is_ok(), - None => false, - } - } - - pub(crate) async fn connected_wallet( - &self, - ) -> Result<&WalletCore, Error> { - match self.wallet.as_ref() { - Some(w) => { - w.state().check_connection().await?; - Ok(w) - } - None => Err(Error::Offline), - } + self.state.is_some() } /// Fetches the notes from the state. @@ -350,18 +311,18 @@ impl Wallet { return Err(Error::Unauthorized); } - let wallet = self.connected_wallet().await?; - let ssk_index = addr.index()? as u64; - let ssk = self.store.retrieve_ssk(ssk_index).unwrap(); - let vk = ssk.view_key(); - let psk = vk.public_spend_key(); + let seed = self.store.get_seed(); + + let index = addr.index()?; + let vk = derive_phoenix_vk(seed, index); + let pk = addr.pk(); - let live_notes = wallet.state().fetch_notes(&vk).unwrap(); - let spent_notes = wallet.state().cache().spent_notes(&psk)?; + let live_notes = self.state()?.fetch_notes(pk)?; + let spent_notes = self.state()?.cache().spent_notes(pk)?; let live_notes = live_notes .into_iter() - .map(|(note, height)| (None, note, height)); + .map(|data| (None, data.note, data.height)); let spent_notes = spent_notes.into_iter().map( |(nullifier, NoteData { note, height })| { (Some(nullifier), note, height) @@ -388,29 +349,37 @@ impl Wallet { &self, addr: &Address, ) -> Result { + let state = self.state()?; // make sure we own this address if !addr.is_owned() { return Err(Error::Unauthorized); } - // get balance - if let Some(wallet) = &self.wallet { - let index = addr.index()? as u64; - Ok(wallet.get_balance(index)?) - } else { - Err(Error::Offline) - } + let index = addr.index()?; + let notes: Vec = state + .fetch_notes(addr.pk())? + .into_iter() + .map(|data| NoteLeaf { + note: data.note, + block_height: data.height, + }) + .collect(); + + let seed = self.store.get_seed(); + + Ok(phoenix_balance( + &derive_phoenix_vk(seed, index), + notes.into_iter(), + )) } /// Creates a new public address. /// The addresses generated are deterministic across sessions. pub fn new_address(&mut self) -> &Address { + let seed = self.store.get_seed(); let len = self.addresses.len(); - let ssk = self - .store - .retrieve_ssk(len as u64) - .expect("wallet seed should be available"); - let addr = Address::new(len as u8, ssk.public_spend_key()); + let pk = derive_phoenix_pk(seed, len as u8); + let addr = Address::new(len as u8, pk); self.addresses.push(addr); self.addresses.last().unwrap() @@ -427,18 +396,14 @@ impl Wallet { } /// Executes a generic contract call - pub async fn execute( + pub async fn execute( &self, sender: &Address, - contract_id: ModuleId, - call_name: String, - call_data: C, + reciever: &Address, + deposit: Dusk, + data: Option>, gas: Gas, - ) -> Result - where - C: rkyv::Serialize>, - { - let wallet = self.connected_wallet().await?; + ) -> Result { // make sure we own the sender address if !sender.is_owned() { return Err(Error::Unauthorized); @@ -449,22 +414,45 @@ impl Wallet { return Err(Error::NotEnoughGas); } + let seed = self.store.get_seed(); + + let state = self.state()?; + let deposit = *deposit; + let mut rng = StdRng::from_entropy(); - let sender_index = - sender.index().expect("owned address should have an index"); + let sender_index = sender.index()?; + let mut sender_sk = derive_phoenix_sk(seed, sender_index); - // transfer - let tx = wallet.execute( + let inputs = state + .inputs(sender_index, deposit + gas.limit * gas.price)? + .into_iter() + .map(|(a, b, _)| (a, b)) + .collect(); + + let root = state.fetch_root()?; + let chain_id = state.fetch_chain_id()?; + + let tx = phoenix::<_, Prover>( &mut rng, - contract_id.into(), - call_name, - call_data, - sender_index as u64, - sender.psk(), + &sender_sk, + sender.pk(), + reciever.pk(), + inputs, + root, + 0, + true, + deposit, gas.limit, gas.price, + chain_id, + data, )?; - Ok(tx) + + let tx = state.prove_and_propagate(tx); + + sender_sk.zeroize(); + + tx } /// Transfers funds between addresses @@ -475,7 +463,6 @@ impl Wallet { amt: Dusk, gas: Gas, ) -> Result { - let wallet = self.connected_wallet().await?; // make sure we own the sender address if !sender.is_owned() { return Err(Error::Unauthorized); @@ -489,23 +476,48 @@ impl Wallet { return Err(Error::NotEnoughGas); } + let state = self.state()?; + let mut rng = StdRng::from_entropy(); - let ref_id = BlsScalar::random(&mut rng); - let sender_index = - sender.index().expect("owned address should have an index"); + let sender_index = sender.index()?; + let amt = *amt; + + let seed = self.store.get_seed(); - // transfer - let tx = wallet.transfer( + let mut sender_sk = derive_phoenix_sk(seed, sender_index); + let change_pk = sender.pk(); + let reciever_pk = rcvr.pk(); + + let inputs = state + .inputs(sender_index, amt + gas.limit * gas.price)? + .into_iter() + .map(|(a, b, _)| (a, b)) + .collect(); + + let root = state.fetch_root()?; + let chain_id = state.fetch_chain_id()?; + + let tx = phoenix::<_, Prover>( &mut rng, - sender_index as u64, - sender.psk(), - rcvr.psk(), - *amt, + &sender_sk, + change_pk, + reciever_pk, + inputs, + root, + amt, + true, + 0, gas.limit, gas.price, - ref_id, + chain_id, + None::, )?; - Ok(tx) + + let tx = state.prove_and_propagate(tx); + + sender_sk.zeroize(); + + tx } /// Stakes Dusk @@ -515,7 +527,6 @@ impl Wallet { amt: Dusk, gas: Gas, ) -> Result { - let wallet = self.connected_wallet().await?; // make sure we own the staking address if !addr.is_owned() { return Err(Error::Unauthorized); @@ -529,31 +540,54 @@ impl Wallet { return Err(Error::NotEnoughGas); } + let state = self.state()?; + let seed = self.store.get_seed(); + let mut rng = StdRng::from_entropy(); + let amt = *amt; let sender_index = addr.index()?; + let mut sender_sk = derive_phoenix_sk(seed, sender_index); + let mut stake_sk = derive_bls_sk(seed, sender_index); - // stake - let tx = wallet.stake( - &mut rng, - sender_index as u64, - sender_index as u64, - addr.psk(), - *amt, - gas.limit, - gas.price, + let nonce = state + .fetch_stake(&AccountPublicKey::from(&stake_sk))? + .map(|s| s.nonce) + .unwrap_or(0); + + let inputs = state + .inputs(sender_index, amt + gas.limit * gas.price)? + .into_iter() + .map(|(a, b, _)| (a, b)) + .collect(); + + let root = state.fetch_root()?; + let chain_id = state.fetch_chain_id()?; + + let stake = phoenix_stake::<_, Prover>( + &mut rng, &sender_sk, &stake_sk, inputs, root, gas.limit, + gas.price, chain_id, amt, nonce, )?; - Ok(tx) + + let tx = state.prove_and_propagate(stake); + + sender_sk.zeroize(); + stake_sk.zeroize(); + + tx } /// Obtains stake information for a given address - pub async fn stake_info(&self, addr: &Address) -> Result { - let wallet = self.connected_wallet().await?; - // make sure we own the staking address - if !addr.is_owned() { - return Err(Error::Unauthorized); - } - let index = addr.index()? as u64; - wallet.get_stake(index).map_err(Error::from) + pub async fn stake_info( + &self, + addr: &Address, + ) -> Result, Error> { + let seed = self.store.get_seed(); + + self.state()? + .fetch_stake(&AccountPublicKey::from(&derive_bls_sk( + seed, + addr.index()?, + ))) } /// Unstakes Dusk @@ -562,24 +596,49 @@ impl Wallet { addr: &Address, gas: Gas, ) -> Result { - let wallet = self.connected_wallet().await?; // make sure we own the staking address if !addr.is_owned() { return Err(Error::Unauthorized); } let mut rng = StdRng::from_entropy(); - let index = addr.index()? as u64; + let index = addr.index()?; + let seed = self.store.get_seed(); + + let state = self.state()?; + + let mut sender_sk = derive_phoenix_sk(seed, index); + let mut stake_sk = derive_bls_sk(seed, index); + + let unstake_value = state + .fetch_stake(&AccountPublicKey::from(&stake_sk))? + .and_then(|s| s.amount) + .map(|s| s.value) + .unwrap_or(0); + + let inputs = state.inputs(index, gas.limit * gas.price)?; + + let root = state.fetch_root()?; + let chain_id = state.fetch_chain_id()?; - let tx = wallet.unstake( + let unstake = phoenix_unstake::<_, Prover>( &mut rng, - index, - index, - addr.psk(), + &sender_sk, + &stake_sk, + inputs, + root, + unstake_value, gas.limit, gas.price, + chain_id, )?; - Ok(tx) + + let tx = state.prove_and_propagate(unstake); + + sender_sk.zeroize(); + stake_sk.zeroize(); + + tx } /// Withdraw accumulated staking reward for a given address @@ -588,41 +647,62 @@ impl Wallet { addr: &Address, gas: Gas, ) -> Result { - let wallet = self.connected_wallet().await?; + let state = self.state()?; // make sure we own the staking address if !addr.is_owned() { return Err(Error::Unauthorized); } let mut rng = StdRng::from_entropy(); - let index = addr.index()? as u64; + let index = addr.index()?; + let seed = self.store.get_seed(); + + let mut sender_sk = derive_phoenix_sk(seed, index); + let mut stake_sk = derive_bls_sk(seed, index); + + let inputs = state.inputs(index, gas.limit * gas.price)?; + + let root = state.fetch_root()?; + let chain_id = state.fetch_chain_id()?; - let tx = wallet.withdraw( + let reward_amount = state + .fetch_stake(&AccountPublicKey::from(&stake_sk))? + .map(|s| s.reward) + .unwrap_or(0); + + let withdraw = phoenix_stake_reward::<_, Prover>( &mut rng, - index, - index, - addr.psk(), + &sender_sk, + &stake_sk, + inputs, + root, + reward_amount, gas.limit, gas.price, + chain_id, )?; - Ok(tx) + + let tx = state.prove_and_propagate(withdraw); + + sender_sk.zeroize(); + stake_sk.zeroize(); + + tx } /// Returns bls key pair for provisioner nodes pub fn provisioner_keys( &self, addr: &Address, - ) -> Result<(PublicKey, SecretKey), Error> { + ) -> Result<(BlsPublicKey, BlsSecretKey), Error> { // make sure we own the staking address if !addr.is_owned() { return Err(Error::Unauthorized); } - let index = addr.index()? as u64; - - // retrieve keys - let sk = self.store.retrieve_sk(index)?; - let pk: PublicKey = From::from(&sk); + let index = addr.index()?; + let sk = derive_bls_sk(self.store.get_seed(), index); + let pk = BlsPublicKey::from(&sk); Ok((pk, sk)) } @@ -672,7 +752,7 @@ impl Wallet { pub fn claim_as_address(&self, addr: Address) -> Result<&Address, Error> { self.addresses() .iter() - .find(|a| a.psk == addr.psk) + .find(|a| a.pk == addr.pk) .ok_or(Error::AddressNotOwned) } diff --git a/rusk-wallet/src/wallet/address.rs b/rusk-wallet/src/wallet/address.rs index 8c4c46d5c6..dd3e19f094 100644 --- a/rusk-wallet/src/wallet/address.rs +++ b/rusk-wallet/src/wallet/address.rs @@ -4,25 +4,27 @@ // // Copyright (c) DUSK NETWORK. All rights reserved. -use crate::Error; -use dusk_bytes::{DeserializableSlice, Error as BytesError, Serializable}; -use dusk_pki::PublicSpendKey; use std::fmt; use std::hash::Hasher; use std::str::FromStr; +use super::*; +use crate::Error; + +use dusk_bytes::{DeserializableSlice, Error as BytesError, Serializable}; + #[derive(Clone, Eq)] /// A public address within the Dusk Network pub struct Address { pub(crate) index: Option, - pub(crate) psk: PublicSpendKey, + pub(crate) pk: PhoenixPublicKey, } impl Address { - pub(crate) fn new(index: u8, psk: PublicSpendKey) -> Self { + pub(crate) fn new(index: u8, pk: PhoenixPublicKey) -> Self { Self { index: Some(index), - psk, + pk, } } @@ -31,8 +33,8 @@ impl Address { self.index.is_some() } - pub(crate) fn psk(&self) -> &PublicSpendKey { - &self.psk + pub(crate) fn pk(&self) -> &PhoenixPublicKey { + &self.pk } pub(crate) fn index(&self) -> Result { @@ -41,7 +43,7 @@ impl Address { /// A trimmed version of the address to display as preview pub fn preview(&self) -> String { - let addr = bs58::encode(self.psk.to_bytes()).into_string(); + let addr = bs58::encode(self.pk.to_bytes()).into_string(); format!("{}...{}", &addr[..7], &addr[addr.len() - 7..]) } } @@ -52,10 +54,10 @@ impl FromStr for Address { fn from_str(s: &str) -> Result { let bytes = bs58::decode(s).into_vec()?; - let psk = PublicSpendKey::from_reader(&mut &bytes[..]) + let pk = PhoenixPublicKey::from_reader(&mut &bytes[..]) .map_err(|_| Error::BadAddress)?; - let addr = Address { index: None, psk }; + let addr = Address { index: None, pk }; Ok(addr) } @@ -69,15 +71,15 @@ impl TryFrom for Address { } } -impl TryFrom<&[u8; PublicSpendKey::SIZE]> for Address { +impl TryFrom<&[u8; PhoenixPublicKey::SIZE]> for Address { type Error = Error; fn try_from( - bytes: &[u8; PublicSpendKey::SIZE], + bytes: &[u8; PhoenixPublicKey::SIZE], ) -> Result { let addr = Address { index: None, - psk: dusk_pki::PublicSpendKey::from_bytes(bytes)?, + pk: PhoenixPublicKey::from_bytes(bytes)?, }; Ok(addr) } @@ -85,26 +87,26 @@ impl TryFrom<&[u8; PublicSpendKey::SIZE]> for Address { impl PartialEq for Address { fn eq(&self, other: &Self) -> bool { - self.index == other.index && self.psk == other.psk + self.index == other.index && self.pk == other.pk } } impl std::hash::Hash for Address { fn hash(&self, state: &mut H) { self.index.hash(state); - self.psk.to_bytes().hash(state); + self.pk.to_bytes().hash(state); } } impl fmt::Display for Address { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", bs58::encode(self.psk.to_bytes()).into_string()) + write!(f, "{}", bs58::encode(self.pk.to_bytes()).into_string()) } } impl fmt::Debug for Address { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", bs58::encode(self.psk.to_bytes()).into_string()) + write!(f, "{}", bs58::encode(self.pk.to_bytes()).into_string()) } } diff --git a/rusk/Cargo.toml b/rusk/Cargo.toml index 4139d1095e..935ceaea9e 100644 --- a/rusk/Cargo.toml +++ b/rusk/Cargo.toml @@ -41,10 +41,9 @@ dirs = "4" blake3 = "1" blake2b_simd = { version = "1", default-features = false } -poseidon-merkle = { version = "0.7", features = ["rkyv-impl", "size_32"] } sha3 = "0.10" dusk-bytes = "0.1" -kadcast = "0.6.0-rc" +kadcast = "0.7.0-rc.5" pin-project = "1" tungstenite = "0.21" hyper-tungstenite = "0.13" @@ -93,13 +92,14 @@ criterion = "0.5" rustc_tools_util = "0.3" [features] -default = ["ephemeral", "recovery-state", "recovery-keys", "prover", "node"] +default = ["ephemeral", "recovery-state", "recovery-keys", "prover", "node", "http-wasm"] ephemeral = ["dep:rusk-recovery", "dep:tempfile", "recovery-state", "node"] recovery-state = ["rusk-recovery/state", "dep:tempfile"] recovery-keys = ["rusk-recovery/keys"] prover = ["dep:rusk-prover"] testwallet = ["dep:futures"] node = ["dep:node", "dep:dusk-consensus", "dep:node-data"] +http-wasm = [] [[bench]] name = "block_ingestion" diff --git a/rusk/benches/moonlight-txs b/rusk/benches/moonlight-txs index 5ee8ecba22..133d2adf62 100644 --- a/rusk/benches/moonlight-txs +++ b/rusk/benches/moonlight-txs @@ -1,100 +1,100 @@ -01ea000000000000008d31d41cb190cb54fab965d3edba820a8e8fc5cdf5df2ef0b17ed7b318c290808564ec96651502cb086f4e2317de88441376dca3359fcf084a904343591c9c6d420dea1e576a957120af2ea4c46ef9d3bb1394ad3cbc92413c59b1ce518c085001b6532a7b799b7911b4631bb91c07f2d1b10b0641cdb8fdf53bfc8194c9700e22d2fe0068142786be7a79cce92920d2a518dd851e2d7ee65addb2d79f7a8f8487d6df24627a5bf74428e060be27adca21250cb3382c2a4c8b4a78b699c1d752c940420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009338f5d83b9af91ad88f82e79f095aeb3c51e86c1eb86debcc07f35508f882c5453d371a04f8e643e3a00ec457cdcf81 -01ea00000000000000b6532a7b799b7911b4631bb91c07f2d1b10b0641cdb8fdf53bfc8194c9700e22d2fe0068142786be7a79cce92920d2a518dd851e2d7ee65addb2d79f7a8f8487d6df24627a5bf74428e060be27adca21250cb3382c2a4c8b4a78b699c1d752c90182264d6e2d74b1c837692590461ace1bec066787c45a43ce2069cdfde86ecc9ee39943e18ab0d265426a46656491088701ac039ad5d7c59bb3f0ab7589977cad7eee944fac90d10e847e99cdef22b1f29c139b8ca5ec5706c2ce14e064500eb340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aa633731df87d6c8b6b4222f5865e71c985ac0c44ae259c895ec618c635943d4a0a77eac235289cc9420c3ac073f3256 -01ea0000000000000082264d6e2d74b1c837692590461ace1bec066787c45a43ce2069cdfde86ecc9ee39943e18ab0d265426a46656491088701ac039ad5d7c59bb3f0ab7589977cad7eee944fac90d10e847e99cdef22b1f29c139b8ca5ec5706c2ce14e064500eb301ab89ed1e5cf7dfef077864e59ab0f668b9ddcee6037e1367c19f31dd6eb3073d123bee37ca14929dd8a237459ee9b80c032490ccd14acfd81e9d9e99237d6e45a6a0783b4ce9cc3ba2c5943a172cdd3cd0d7362a6a80e72db946d55e6242c39a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a97602191430c1877604e206cf4b50ea2a2cf52b680b39c2cd178b9c6e3ad10e84a33998285e06d34b1623d776646d74 -01ea00000000000000ab89ed1e5cf7dfef077864e59ab0f668b9ddcee6037e1367c19f31dd6eb3073d123bee37ca14929dd8a237459ee9b80c032490ccd14acfd81e9d9e99237d6e45a6a0783b4ce9cc3ba2c5943a172cdd3cd0d7362a6a80e72db946d55e6242c39a01b36febad973e492620ec23bd0f0546442bc445c97e84ce0217db901b6adefe44b25e860f5c2176f34dac3ae24bf8d02d00895e619029269b46836b49d9f7d3fe647a939add202fed72803881ac065c4ea4bb9b24d7f4179cd93c0eae912a017b40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a32f671f0a469eb12e2daedc67df7cf12e9965e86a1857efdd1e7342514b34e41a3babb051980943aadbaebd945919e8 -01ea00000000000000b36febad973e492620ec23bd0f0546442bc445c97e84ce0217db901b6adefe44b25e860f5c2176f34dac3ae24bf8d02d00895e619029269b46836b49d9f7d3fe647a939add202fed72803881ac065c4ea4bb9b24d7f4179cd93c0eae912a017b01944f003e00ee144b44655a21ac808f42d75b4b78095b44e921ef034dcfb31c22ea4119a0c9ecc3178791bc4162427b0813bd445a36851ddf9c7e87c6571fad5fd76f0ee71ccbd00846e893cb29fbb852fe65b2deec192a98766e7deee91d9c0b40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b23bd21d9f07b211a973004129c982477795619d79fde42791c7f4a32688cbbcbba02c34910da303fd1e8345408568f7 -01ea00000000000000944f003e00ee144b44655a21ac808f42d75b4b78095b44e921ef034dcfb31c22ea4119a0c9ecc3178791bc4162427b0813bd445a36851ddf9c7e87c6571fad5fd76f0ee71ccbd00846e893cb29fbb852fe65b2deec192a98766e7deee91d9c0b0198efb3414d4dee951e1391a32f006333295f49383468d5e8c94c7d2ae4f09b54548e24f38672897a1285b56bd97fad5710c0dd9963b805abf6cf69b460c221ae7bb04a23bf79b000e1754e900e7bf2a32065024d009be5c2bc3c18af548e84fb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ab740d73bf27e7e5e732cf7f32c90a8ae3790c27adb60e8389a7e73f614868418ab0ed5dfd99d9c0e8ee8b44aadd5fa6 -01ea0000000000000098efb3414d4dee951e1391a32f006333295f49383468d5e8c94c7d2ae4f09b54548e24f38672897a1285b56bd97fad5710c0dd9963b805abf6cf69b460c221ae7bb04a23bf79b000e1754e900e7bf2a32065024d009be5c2bc3c18af548e84fb01b73b47dcecb50fa831335e8e5bebccce2755b6850fee3418db178cf63eebd1009827147aecd577687c0bd9ca3c3c100b0439e2ff1b26d2ba4d71a2606c3bc5b75b528342e77a19ae1bc43a9e4b6b28fd10aa0247959a8c327d8440948277019040420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000095f8e5606095b2b0f08e8b605fdf3370fe0b64724f9ee31f3ca752a2fbc042f805d1a1d7bdbb9f9b877511a5306be43d -01ea00000000000000b73b47dcecb50fa831335e8e5bebccce2755b6850fee3418db178cf63eebd1009827147aecd577687c0bd9ca3c3c100b0439e2ff1b26d2ba4d71a2606c3bc5b75b528342e77a19ae1bc43a9e4b6b28fd10aa0247959a8c327d8440948277019001958f3e0c8c6beb2a34f68ec6db7cd46fc4f7fd5376b5d17e9be5a6357a2618fc97c566f314f407fac76001e761b2123c04d9d1dbb1d66109296f1bb8e6dc86656cef4b0fc85fe3b47aaf087c7c706d9c2abe132701a0506531e385e34887286940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b6eff0a0e7d88812201675bd5ebc97cbd4061af659ea217d061144e95e345a1116ef13b613f99816c96b2ba26eb556de -01ea00000000000000958f3e0c8c6beb2a34f68ec6db7cd46fc4f7fd5376b5d17e9be5a6357a2618fc97c566f314f407fac76001e761b2123c04d9d1dbb1d66109296f1bb8e6dc86656cef4b0fc85fe3b47aaf087c7c706d9c2abe132701a0506531e385e34887286901875b7101d6deed445642a16bf04fe9ec7b9b83f3be3e7fa72825bb92026819adca57099c9d11adcdb830ab881c8226ed00860532520ccb427edd366d0326076be4130ac4936fef9218e99ec1979acff4f0fdfd4ff6181b5945211ac8264da0eb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000997981b2bc01a70ecded0cee725bd884ef1a73d6cef448761f73502c1db6e4071c12f29580fa1261344bccd59f23b9d9 -01ea00000000000000875b7101d6deed445642a16bf04fe9ec7b9b83f3be3e7fa72825bb92026819adca57099c9d11adcdb830ab881c8226ed00860532520ccb427edd366d0326076be4130ac4936fef9218e99ec1979acff4f0fdfd4ff6181b5945211ac8264da0eb01b7626d33f354c9a5743e31be0d40849b05cdab288bb2993737d444450a3196e8be9785690ec9703c5dad93b9a66593611221e837ef46a58f095fb4e765b3b48a356af904fcf287354c3c32a6514a1c289e647d604b16c374c0ac8c0d1c1fb19440420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009746757a4fd249f82ae4b970703c341d850765212eba195c7f60d1a8c5e4fa1dd46fb3d94b1b713bbf91d1b3e9e9bec7 -01ea00000000000000b7626d33f354c9a5743e31be0d40849b05cdab288bb2993737d444450a3196e8be9785690ec9703c5dad93b9a66593611221e837ef46a58f095fb4e765b3b48a356af904fcf287354c3c32a6514a1c289e647d604b16c374c0ac8c0d1c1fb19401a66ca7c857f3297501bc0b65f24284f7921bac9c60bdece5914f02bb7166d16d440af14c25367be48629599c94cf98bd0d518133cc75942aae40d8d5391bad7164e37e966385419e7046186a913a60c37f093e4622fe21cd680d7b0d26d72d9940420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008cc86e2277a2fd16b49fc9fc4ba4010a5484622960cb40be1bd0108ab3b9254d4881f8de330812ac41267368ea5c03fb -01ea00000000000000a66ca7c857f3297501bc0b65f24284f7921bac9c60bdece5914f02bb7166d16d440af14c25367be48629599c94cf98bd0d518133cc75942aae40d8d5391bad7164e37e966385419e7046186a913a60c37f093e4622fe21cd680d7b0d26d72d9901a09d5c38db453aa22044dd9d5e8d38c48b6d5d67382bcb5b92eec17e41167e405f15f9e9ac539d130c2136491243eb860ffabc0e8820c47343b24cd9c98af35f2db95a590510f452686a7b27c6ee7196f60c63bc6208d98b87483e68dbcdc5f640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b71c907ad470fadc8525c6dff5886aa9d616c6d5fc1921c99134f5fd4e25d9843f18a38a99645dabc44eab5a377e917f -01ea00000000000000a09d5c38db453aa22044dd9d5e8d38c48b6d5d67382bcb5b92eec17e41167e405f15f9e9ac539d130c2136491243eb860ffabc0e8820c47343b24cd9c98af35f2db95a590510f452686a7b27c6ee7196f60c63bc6208d98b87483e68dbcdc5f60192e15dd8d5f2940969cf9bd74b67418d43693b23c243a9fbcd582040ccca8abc678f0dd93d304c6230d9f9931402998d0c33f57d638c8ac734d1bd395a09af091677d493c377091353812c7691d4b227c51c00758bb7e882dcd2f9d74dde998540420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000088f6fe93496a0a2c275033ddf28df7d3b597650dbafd267610e5d46eee1f7275c47432850cb6a26400bbaccd53b1defe -01ea0000000000000092e15dd8d5f2940969cf9bd74b67418d43693b23c243a9fbcd582040ccca8abc678f0dd93d304c6230d9f9931402998d0c33f57d638c8ac734d1bd395a09af091677d493c377091353812c7691d4b227c51c00758bb7e882dcd2f9d74dde99850182b25aa6f8e6ac4650136c92c0ac311aeeb8af274e985c9ec1dafa220a4a7c52eabc06affae35ef56e0825c912a212d717b0e32d09e905f50c0eabfc639b5aa794971a5ffac2a69e948af0af00f6cc58a2a84a9c078a223375904246b9bfba6040420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008d2588168296fbbe1266f3a0ef9193f5a057f692df0373e85dda32133eafb3c14dc9a4fe7c1c42781692249b9b54bddf -01ea0000000000000082b25aa6f8e6ac4650136c92c0ac311aeeb8af274e985c9ec1dafa220a4a7c52eabc06affae35ef56e0825c912a212d717b0e32d09e905f50c0eabfc639b5aa794971a5ffac2a69e948af0af00f6cc58a2a84a9c078a223375904246b9bfba600195d75b02af80f8f91c610bccf5fbc4f8059f84203d9c6437f5388a7b7a84a70bea35a09529d7a851821aa83555c7d89a02ab451d15bdd94f8796049f1bf6b3f4a0088a0a17cb256b5702fa71876e6feb9863d3b16d5a5d46ba7cc6bb29fc7e0740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ad0a2c395a862d0950b783a46dbd07fc91a4b371cb5f9060a908a5c2bd3e025363ffaff1b4a7996b6a7824a41650bc41 -01ea0000000000000095d75b02af80f8f91c610bccf5fbc4f8059f84203d9c6437f5388a7b7a84a70bea35a09529d7a851821aa83555c7d89a02ab451d15bdd94f8796049f1bf6b3f4a0088a0a17cb256b5702fa71876e6feb9863d3b16d5a5d46ba7cc6bb29fc7e07019952c290953166ec8bbfd259826e910888d31bbdd7112c9ca5a3047d89516205bb75e586461504f5a6d6771a6e9145ea0d1c677b2495a93b25cbe28cccdd993d76a14225572483e966f5d48c4e4eb759570d6a2e3ca2a4a0e580ff394b6137d140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b104a9977a2375e9fd840bccb0d5431f4067db486ebea602147afb98809b92175209c67e9037f8070d0efa48ea9fb34d -01ea000000000000009952c290953166ec8bbfd259826e910888d31bbdd7112c9ca5a3047d89516205bb75e586461504f5a6d6771a6e9145ea0d1c677b2495a93b25cbe28cccdd993d76a14225572483e966f5d48c4e4eb759570d6a2e3ca2a4a0e580ff394b6137d10199201c741f5c7471d4182ebb91cf11c09b47f13e7ef4a303a350c312cf8fab0e54cb6b559bf3968458095a019933f8d90d0373beddb177f1fff22e2cb0a1ff21075e720a696ea4cc84bffad8a5e7a4c1560683cfbadcdfe0551712a285254c3040420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008e1ba89a68775b42775520640214b07c6822a8987c8dd758affa72070eaf06b51b4752edc25c0f49ead3a276505bb9dd -01ea0000000000000099201c741f5c7471d4182ebb91cf11c09b47f13e7ef4a303a350c312cf8fab0e54cb6b559bf3968458095a019933f8d90d0373beddb177f1fff22e2cb0a1ff21075e720a696ea4cc84bffad8a5e7a4c1560683cfbadcdfe0551712a285254c30018ec01bb93a9049ecef5f667a8b1660e0ec04bc321f0ebe45e4850ed9eadc37db6d8a82138f544108c480d548c299b4b61492608ae8826b3c79fdd162bb6abdc8c4ca456e025d31733a47439bde124fbfad3e73a132e93fde2d1775229079d0e440420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000082dfec3e57d17c9791b173ac1044ddeb92e7e77095abe1b31c8778e940f9b7fb6d9c6920c2654e6c86309f573877dd02 -01ea000000000000008ec01bb93a9049ecef5f667a8b1660e0ec04bc321f0ebe45e4850ed9eadc37db6d8a82138f544108c480d548c299b4b61492608ae8826b3c79fdd162bb6abdc8c4ca456e025d31733a47439bde124fbfad3e73a132e93fde2d1775229079d0e40184873639c79029c0ab2090a7647dec527426c166fb8befeaea5f3e7833dc97f313a8e9041dad191f350e9daccad80f551726f351f12412825fc5594bae866c074195d9959cfe18d945008867cccec58877509070f9f9a3df1460aa114668d70440420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a6491c6e5755ea100370970cb12ab30448c806b0afb94806fb1204c32ea54beda2fb8f608125e318a1a27e54a36d2027 -01ea0000000000000084873639c79029c0ab2090a7647dec527426c166fb8befeaea5f3e7833dc97f313a8e9041dad191f350e9daccad80f551726f351f12412825fc5594bae866c074195d9959cfe18d945008867cccec58877509070f9f9a3df1460aa114668d70401ad52a2d92356a7c43c6223b53f391c6bc41c556201c79ad9525db1205715649896a2e4d95b790b8e4eab7e9f6c28a7a0093683d486d81c33173b5c32b54114def41a2c01b39af7f28636d0de9978761ac06fd931a44fa519c4eebda4a744279340420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000085efd65283fe89628d5894befc71633b52a49e8c0206d204e7becb188c0a4b5f107e269e9c79ddb1302fc7187c389e67 -01ea00000000000000ad52a2d92356a7c43c6223b53f391c6bc41c556201c79ad9525db1205715649896a2e4d95b790b8e4eab7e9f6c28a7a0093683d486d81c33173b5c32b54114def41a2c01b39af7f28636d0de9978761ac06fd931a44fa519c4eebda4a744279301b0897a885184ac65da3a8144e0605dee5a0835ff801a3f9bed9c9ed433e9c1a63bd9fe0768f615caa7ee79f5e0c3ae79086d922343598a24604c08f1c0da93a6bb890b08ae3dd9fe44efcdfa36f7aae20580386d745085e8fdceedbc05b208ad40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000085fb0325293be10b06962b531cba14360801c382d3592f3340d683b05b86acc940e8db81ad3afc52c428441daf517554 -01ea00000000000000b0897a885184ac65da3a8144e0605dee5a0835ff801a3f9bed9c9ed433e9c1a63bd9fe0768f615caa7ee79f5e0c3ae79086d922343598a24604c08f1c0da93a6bb890b08ae3dd9fe44efcdfa36f7aae20580386d745085e8fdceedbc05b208ad0180217bef9a4a4c9b52179f73b89c8f59bfcd6b96c0a5e50864fe43ddad3491dae4917577e94a705e12116ed1816132a20693efa1d49097329fd91682731e8244cb61e73bf557f5658a6be82af9e49535e95af7c4b099a6bb5c2ef6303e6b2d8b40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000968cb587babaf329a56d8bdcc70079fd1b97a901149156f9d74adebe213801209375c2b8790f06b8bb6969ccb02cc260 -01ea0000000000000080217bef9a4a4c9b52179f73b89c8f59bfcd6b96c0a5e50864fe43ddad3491dae4917577e94a705e12116ed1816132a20693efa1d49097329fd91682731e8244cb61e73bf557f5658a6be82af9e49535e95af7c4b099a6bb5c2ef6303e6b2d8b01842d95c2f84cf9739ee10e45888d23cb01e7537ed6c58919db85ae1fae3f22985434a2aa25b279b52f814f05f60f1bdf18b37c2fe00c2f36dd6afb9e9bcbe347c90b475ae48955144c89f109d4e291cd99b18daa59c2f41c753596e6cb2b252a40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008a90ba6fb68a443771e5f2ee34b3a82e32b9a1e42fce96b580d97dc134c1913e26bc7a8679623fa87fdc7db2e278399a -01ea00000000000000842d95c2f84cf9739ee10e45888d23cb01e7537ed6c58919db85ae1fae3f22985434a2aa25b279b52f814f05f60f1bdf18b37c2fe00c2f36dd6afb9e9bcbe347c90b475ae48955144c89f109d4e291cd99b18daa59c2f41c753596e6cb2b252a01b77b4ee2fd3554f5bc8f20982b4135f49a7364ecd281575d3e83c360f3a0586e565834a7620b30ec0077281f9e22385a0f4797b6cee99c4860f520e09c2ee34c4f31a2cd17aea9d7cfca96e1e9ab3d46bcc6fa76e56a26db96a06a83f728e71f40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b1f26e17e2619279ae01ed887dd9e62cb9cc22ceef6859dcaf61a20fb93f201460a24145fd8ad820683bc8dd00278e63 -01ea00000000000000b77b4ee2fd3554f5bc8f20982b4135f49a7364ecd281575d3e83c360f3a0586e565834a7620b30ec0077281f9e22385a0f4797b6cee99c4860f520e09c2ee34c4f31a2cd17aea9d7cfca96e1e9ab3d46bcc6fa76e56a26db96a06a83f728e71f0181831c806b72e16f4c86c1f3c3d21848bff839558a08f64de5ced8b34eb13b2812ae003b9dbf2eabe0e974a209eeb39e0322da840489781a357803b4cf16288adfb060d16bed494c9474d3343aa182a2e51a75d9c8a219171a333e21d02263bb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b98c96a2dfa1f412d71e81beb76eed94cec11caf80ea1381dbc7337fbb8c9c5ebdd25b99474fed90aab0cf2a654f9217 -01ea0000000000000081831c806b72e16f4c86c1f3c3d21848bff839558a08f64de5ced8b34eb13b2812ae003b9dbf2eabe0e974a209eeb39e0322da840489781a357803b4cf16288adfb060d16bed494c9474d3343aa182a2e51a75d9c8a219171a333e21d02263bb01b466bfc5caf876637b3d514dda309cc00877ae33f13c70b23552b3ff0a74539cd3c820e2ccdb2bd7b3c5ad7218e4263618cfe690a73ab6fb1a84c9d0505972938cd5509565235cdad30741a614ee9d6dfcfcd46de4022ca52373443b11c6c6a340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a062b51b3d7058ced0923a53569df71697ab552d1c94d0c067b3d8ecaade0ca51a623790579c7cb529499e04ea69eb02 -01ea00000000000000b466bfc5caf876637b3d514dda309cc00877ae33f13c70b23552b3ff0a74539cd3c820e2ccdb2bd7b3c5ad7218e4263618cfe690a73ab6fb1a84c9d0505972938cd5509565235cdad30741a614ee9d6dfcfcd46de4022ca52373443b11c6c6a301ad8533139e5d66dad1b63e11b548aeb579eb3f485601fc70888287e3105c066d0428627fd44478e89e01defb2abe527b114164d69d2ffcef1563aa61d5e49b1eac3c14fb287aa139a7ce70c748f62815395b2c1d2eb04f384645ff5d839fe57440420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aa2bdb0332b9c2849405f2d9e0c9f58c04a1e4312e960a921a446809e4733c658498c0fa856ea369be69d66c58984fdf -01ea00000000000000ad8533139e5d66dad1b63e11b548aeb579eb3f485601fc70888287e3105c066d0428627fd44478e89e01defb2abe527b114164d69d2ffcef1563aa61d5e49b1eac3c14fb287aa139a7ce70c748f62815395b2c1d2eb04f384645ff5d839fe57401a8aa762439cfb3ad54177030e59db0874cbc484029fd3c48ea9d36debce777e3bd834c46288b8282843ef40cf7d85ddb0e4d286642cea988804c87e1016a68dd45cde02645e6e98fc0eeadcd68cb156b9d402f5a7fe96041ed0272511091660640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000938ae76d116c896956a420c730f86b4cb080daeb4e69336603968aaef2dd34632214c39d143b18f10a361eafaf6a2b1f -01ea00000000000000a8aa762439cfb3ad54177030e59db0874cbc484029fd3c48ea9d36debce777e3bd834c46288b8282843ef40cf7d85ddb0e4d286642cea988804c87e1016a68dd45cde02645e6e98fc0eeadcd68cb156b9d402f5a7fe96041ed0272511091660601aa6e391c91601ce3dad444d526def3b1ff1e922d34f0d05c3091ee2af235cc8fc6c031256c0486e32c75f86f45d0f79311e60250b8e905abbfef85394288a6696a4bd38ec75ae9bc98c9ef922f3adb35b580221ad2f538a0d3a705f0f6a1c0c940420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000099b2ed6ca317e7a7586affe24038bcf00730b712abca6563d5521f9af7cd72c0b03adcfa4c23231d6937da5a199090e7 -01ea00000000000000aa6e391c91601ce3dad444d526def3b1ff1e922d34f0d05c3091ee2af235cc8fc6c031256c0486e32c75f86f45d0f79311e60250b8e905abbfef85394288a6696a4bd38ec75ae9bc98c9ef922f3adb35b580221ad2f538a0d3a705f0f6a1c0c901b5b4fa146ce040a4515b233e6d2f433fb07de0792a02d525eaf1bebad079e8215d0ed09214b7bff11971045b9ab32cd4143a4b7c53539bba0a7996de8f4865d4a5df2e63be5fd6258dfa3ce45871178efeec1cad6199a8e015a937b18385d63b40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000959ee01e25d3c49fcb12e489d02ab3b7bf50703dd7aad6c6e75ff03ef08f8c1e0b3534ef10d326e462f81c1f83556edc -01ea00000000000000b5b4fa146ce040a4515b233e6d2f433fb07de0792a02d525eaf1bebad079e8215d0ed09214b7bff11971045b9ab32cd4143a4b7c53539bba0a7996de8f4865d4a5df2e63be5fd6258dfa3ce45871178efeec1cad6199a8e015a937b18385d63b0196e56fcf360d56b5de10fa6aa6e8008f32aa9b210c85d135723061e21c1ade5317cde980b672cea87733df0e81f704e618e09c8ae089813b68b1855b7e82e249d318d7f959a1ba362738e3de2f47de1ceac99919168ad9ed801d0f5597bd8f5340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000984de97180539cce8d661359e93db983cdaa320a15288bd686e53ee904aea1be8305ee0d008bbf52b0d13582ec856ef4 -01ea0000000000000096e56fcf360d56b5de10fa6aa6e8008f32aa9b210c85d135723061e21c1ade5317cde980b672cea87733df0e81f704e618e09c8ae089813b68b1855b7e82e249d318d7f959a1ba362738e3de2f47de1ceac99919168ad9ed801d0f5597bd8f53018eb8f62adbf34801040bd866ae138e3e727a64b901b1195d521c6588880efadb84d131527a9a5efe9a37edffc3f6d98c160b00c7541fe26c27dac4ae4339dae34868ab657d1df65e385deba78aa548a5d4eb165fbdfc0068ab02ed18ba05869940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000afd2c6f84b15d21f5af365d22ca7c5aa7ceab47a66769a1745fc460c33b20be2423e4eea83ee973b94b85e92041d05cf -01ea000000000000008eb8f62adbf34801040bd866ae138e3e727a64b901b1195d521c6588880efadb84d131527a9a5efe9a37edffc3f6d98c160b00c7541fe26c27dac4ae4339dae34868ab657d1df65e385deba78aa548a5d4eb165fbdfc0068ab02ed18ba05869901b9174a0fa4cfac258271eb5a17ad68801288a69bb26aa75ff62c90b8fbbe2ee7829ee1f41e3863e3cff77e65ae718c03001619e80569ea2ad54e4e424ea387c5ab265b3d2dfa55835c5c21e7c2abcef91e1ecfd325ae36135721aeb0ad9fb59640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000820438cdda220cb3d5f52edf8fb919e89fda6e0cd9036b56172dc468fbae1799bd1786f47fd29146a7de3e45129e14b2 -01ea00000000000000b9174a0fa4cfac258271eb5a17ad68801288a69bb26aa75ff62c90b8fbbe2ee7829ee1f41e3863e3cff77e65ae718c03001619e80569ea2ad54e4e424ea387c5ab265b3d2dfa55835c5c21e7c2abcef91e1ecfd325ae36135721aeb0ad9fb5960192082a1f4fdc82eec7070cdc0311e65e5346ca8fe4012ecc935373483ef2c70dda8c2d3803261c095b6085f9bc01c4a30b663c586dfba34c5afc169ce950ec64b462199310b4c9b9b0c383377b5e868afbe5b2a977d5cfe0a706bc0674ec69cc40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000080c186d63ca40a37e1bdd82d08db89118ddcc54939ba4b601636511b93e13d2d5e164ccb2e832815162e1572af33b340 -01ea0000000000000092082a1f4fdc82eec7070cdc0311e65e5346ca8fe4012ecc935373483ef2c70dda8c2d3803261c095b6085f9bc01c4a30b663c586dfba34c5afc169ce950ec64b462199310b4c9b9b0c383377b5e868afbe5b2a977d5cfe0a706bc0674ec69cc0189c05652e960b4a7525f336a6e1efe40764dfe9a9eb89392bd814c84eca361a9eba3e22c09c721ca306e4ebaffecdd0c0c63846e46440d0161d20b43a75c18e90ba93f4ca0a4485d51ae29cc0a2ea8e660ddbcd1307524b4a286326316e66fd040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ad8b19212c53465ab3779afeda9c1f1205b7b5be2edf7d6b6351a2d9cfd7b3fd52571fb115a1be666eb30bc085700c03 -01ea0000000000000089c05652e960b4a7525f336a6e1efe40764dfe9a9eb89392bd814c84eca361a9eba3e22c09c721ca306e4ebaffecdd0c0c63846e46440d0161d20b43a75c18e90ba93f4ca0a4485d51ae29cc0a2ea8e660ddbcd1307524b4a286326316e66fd00192cf863e45a1874de11c3703031d47f3b651a5d0c8d1030338eb65c03843984f0545c13df630cb3235cdb40856aadf5c0a0068a33d06e18147d93ce012a85791f358d410c726131e85bff2cbc393ba5bd563d43a60d796259e528e2a01aedaad40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a75e84281d847cf9e07128b4bfb94bf04541a3fda70b66c6fd77fb958ae2e0c0d6bd80c2b1ed488090ce821d44aac7a7 -01ea0000000000000092cf863e45a1874de11c3703031d47f3b651a5d0c8d1030338eb65c03843984f0545c13df630cb3235cdb40856aadf5c0a0068a33d06e18147d93ce012a85791f358d410c726131e85bff2cbc393ba5bd563d43a60d796259e528e2a01aedaad01b788905c2f2de91dcbb558ad5126749c962676f7734fb84b1d0bd4d1d24138513fd7a0ea52215595f54eb03a53276f4609a31140b756959a3ec693bb70199edc976debb75dd6fabd6881297112dbe13bd7fc227f9191c9a9daa309d7fe97186f40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a28a732fbb4df5f196079bf0deb6842947f84ac655de8aa821429836ae28a363dcdaa00f0ab3f394ecaf4570f9db18ab -01ea00000000000000b788905c2f2de91dcbb558ad5126749c962676f7734fb84b1d0bd4d1d24138513fd7a0ea52215595f54eb03a53276f4609a31140b756959a3ec693bb70199edc976debb75dd6fabd6881297112dbe13bd7fc227f9191c9a9daa309d7fe97186f01b37108dc3a0312cb00de57234b987d35f145d4d1ac60dda25a39e1f08d5cf88330be28f07204d9e4a1a79b5a6b59461800657df37e09b0b0882ca7cbd160ada36c1750954f292c1cf218b11416c99c70d6b85ae284fae829cffe9bdecda4560140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b0d65b5843207f2f62d6535f5e56a2baf107f2ea5a8ad255b83447c7c5a70bf0f8dfc04db4c687b80ef9ceb30e3abed3 -01ea00000000000000b37108dc3a0312cb00de57234b987d35f145d4d1ac60dda25a39e1f08d5cf88330be28f07204d9e4a1a79b5a6b59461800657df37e09b0b0882ca7cbd160ada36c1750954f292c1cf218b11416c99c70d6b85ae284fae829cffe9bdecda4560101b380ee5be0c99e515b6dc0ab74e8ce7ddb1d8c860291f2d868fcb7efdd79bf66038a749860868c80d32b33502808cf7b0f78852892ed5c5f9fa46466e8b76ad52e135d0fe80b377bb4bd1c0d1be33a4669562db4d62a353348aefa6e51b9091040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b38a1f85bfea2237740ad43154ff66df5402e4b244c30eb6d338c559a0befbba4cb57f7f0d04631389d98c0632e45125 -01ea00000000000000b380ee5be0c99e515b6dc0ab74e8ce7ddb1d8c860291f2d868fcb7efdd79bf66038a749860868c80d32b33502808cf7b0f78852892ed5c5f9fa46466e8b76ad52e135d0fe80b377bb4bd1c0d1be33a4669562db4d62a353348aefa6e51b90910018ea0c4f75df9f4663ee422e91064c08d3a636833c83aa1bf7d7830641079c2bb66723b135f21447b4d9d8667aa18669a17c01a087075a41b507bbca1de4788cd76395e043658401be699cb9fddaf8dfb93797fbba2cc63eb6320fbe438c9972540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000961b1e0c5d5b1134bca65e8c6f6a41f84b3020bdd33620e922e7cf6680d08a8c943d774e651aabd194fae855d334ec33 -01ea000000000000008ea0c4f75df9f4663ee422e91064c08d3a636833c83aa1bf7d7830641079c2bb66723b135f21447b4d9d8667aa18669a17c01a087075a41b507bbca1de4788cd76395e043658401be699cb9fddaf8dfb93797fbba2cc63eb6320fbe438c9972501810071e338fed3022b5aad0eb4daadc215ffd63375cc6f6d7954df38bec79f0ed47ea9f655b5a284cd55cfa213fd93fb0e45b12e53e8298e4c6fedb52cb705cb5a8e019f9bb842581836fbcfe3996834c220f096fd5a916ca6e16b9bf3e1172840420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000098a2b4f65b2b07b000a983799b38e995b338707ab6ca220926f39c63adf428a58367ab9c9c0c5fb4c4bfef1b9607aefe -01ea00000000000000810071e338fed3022b5aad0eb4daadc215ffd63375cc6f6d7954df38bec79f0ed47ea9f655b5a284cd55cfa213fd93fb0e45b12e53e8298e4c6fedb52cb705cb5a8e019f9bb842581836fbcfe3996834c220f096fd5a916ca6e16b9bf3e11728018edb61724d977ddaf3fb94872ca1b7e12ecd7e891d96549cff9f133704df96251b71062614ee3f4a7c81c418e66363530e08fc029a2fd1b465ebdc54ab567eb0615c6e7c79c4dea44aefe1b95bf94e31d265ba2cdf20bdbcae2f5960b094839740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000af73936b84d13a9eafb0f12a7014582aa0159b36b312b4ee0b99e699c68626d161177b00b26c80dd613c21bdbe957a0c -01ea000000000000008edb61724d977ddaf3fb94872ca1b7e12ecd7e891d96549cff9f133704df96251b71062614ee3f4a7c81c418e66363530e08fc029a2fd1b465ebdc54ab567eb0615c6e7c79c4dea44aefe1b95bf94e31d265ba2cdf20bdbcae2f5960b09483970187f54651e27d510193f50ebf6f033ce249081c9fd18fc1a05a4f8d1a1654d8c31f2e16bbfd94f89f035e79d387a86a6518801714942af5d5eb1ac130cdca53f115c899b1ab8aca2cf48aa10ce0d437677ac9be86d0cbc5be926c23e9b14eb5cf40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000953883fdbd1a80c584784478a5978fb1061cbbf26f31a35339b388b273db19414dfccc8a9d2fe0ed2c70f9d5c4d39802 -01ea0000000000000087f54651e27d510193f50ebf6f033ce249081c9fd18fc1a05a4f8d1a1654d8c31f2e16bbfd94f89f035e79d387a86a6518801714942af5d5eb1ac130cdca53f115c899b1ab8aca2cf48aa10ce0d437677ac9be86d0cbc5be926c23e9b14eb5cf01aa14153c5ef154e67ae390d79718d245fd9ae631ba3e2a7dd57c3e62e7f8cda529d678212101f18ac06685e04390565a099336f7fae35a8f128c1661f1bdb9ee4ca4b691d1946e963a14d1d95e013d8583a13540cc0123ef16454a1af7fd2c2340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000854c3c0c27e1c0aa17cfac842bcc41f5a43ddc49abf53bedddeebb3a150d15f96df4892a2f772a283db12f1f6f67773f -01ea00000000000000aa14153c5ef154e67ae390d79718d245fd9ae631ba3e2a7dd57c3e62e7f8cda529d678212101f18ac06685e04390565a099336f7fae35a8f128c1661f1bdb9ee4ca4b691d1946e963a14d1d95e013d8583a13540cc0123ef16454a1af7fd2c2301b5060ee6040cf10d90a7fc7583186fc50306825ac4606ef665e58a9caba05d5622b88f9d606f2afbbbe44dcf1b5822360a063a25daffb180173efa5775e9beee155bb925c0b488f1bec30c8565c026ce61c12f4f8d00b7d9d1712978af47745540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b944fbc2cd2cea741b6043ce5dc1327272e4a587a2edec693fdefef5b2cf264dedc223fc0517a7f55269b1f0a9b025b6 -01ea00000000000000b5060ee6040cf10d90a7fc7583186fc50306825ac4606ef665e58a9caba05d5622b88f9d606f2afbbbe44dcf1b5822360a063a25daffb180173efa5775e9beee155bb925c0b488f1bec30c8565c026ce61c12f4f8d00b7d9d1712978af47745501a5d9545148567e0b2b2e86498eaa9a97021203005cc3e2faa17c87331781423f20034fd521ae99de2dee13f02a6f988a16981558d4e36839eb396256f5077de223bba679a493350057f24fa39156c0f6e69b78ea03278017e8185a9cfd8224c540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b22b2d331422a4ac95c7df82c137228d5fead78c2798dfb49ab13c268f77c9128b85e0513b8d9ae517b38c61168b3429 -01ea00000000000000a5d9545148567e0b2b2e86498eaa9a97021203005cc3e2faa17c87331781423f20034fd521ae99de2dee13f02a6f988a16981558d4e36839eb396256f5077de223bba679a493350057f24fa39156c0f6e69b78ea03278017e8185a9cfd8224c501ab297159791a4221baf2a866327173c95afb8f7e137194ff60e1b00403e2187970703d089a85476f968de7e1c8a59dc90e299d86e342ab4b6e9fb41463608ea03858141ccdc536e9a14cb11754449f7d120205ac3a5175d280a4d16fa4292b3140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b91a089a2cc38a6cac53ccc90fe06a58afb721a5fb0ffdcc4bf4ad3f83fecf2e4fae3ad28ddabe46298a38c76c685d88 -01ea00000000000000ab297159791a4221baf2a866327173c95afb8f7e137194ff60e1b00403e2187970703d089a85476f968de7e1c8a59dc90e299d86e342ab4b6e9fb41463608ea03858141ccdc536e9a14cb11754449f7d120205ac3a5175d280a4d16fa4292b3101912083dc1244e717312e2e8409066e0b45105066427fe8d71a8668c7b2f54543e0534f70518a86181b14e05aa3bb294c1320b80306b8acfca91c0f13ec371f12129aef9b631f3a063f65784d8e72764db85977a2bad47d1f51780f972cef023840420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000092016733e4195d2d86532424ada95ad7dd2fc1b22abcbe4e64a332dacfea96c17aff42b93d4e11a0b303c611a805c094 -01ea00000000000000912083dc1244e717312e2e8409066e0b45105066427fe8d71a8668c7b2f54543e0534f70518a86181b14e05aa3bb294c1320b80306b8acfca91c0f13ec371f12129aef9b631f3a063f65784d8e72764db85977a2bad47d1f51780f972cef023801af5d3782b73bd568841499ebf3fb651b147ae6fe13cc17cb0e6055e909685981c9b3b11adc063c8b817a472d238293c010d8b8d9b8bb3b4222d2ba3d0b8bc14b0a33aefad31671844d506fd21c931b3809c40105c374870e2a631d974f7c3f8440420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008b74c79bccba1525f1bde12dee78f542f5ad20d93d38dc0e362bc2fd6ec8a9587b60445e21d3a41f053f3ef746301fed -01ea00000000000000af5d3782b73bd568841499ebf3fb651b147ae6fe13cc17cb0e6055e909685981c9b3b11adc063c8b817a472d238293c010d8b8d9b8bb3b4222d2ba3d0b8bc14b0a33aefad31671844d506fd21c931b3809c40105c374870e2a631d974f7c3f8401b1275a92da6f74da25e08404ac325019af00be8abf5a7e6b8cee9543de3e208b2bbec9dc5d7bad7f6a280660bea799a50396367636b8c17a1b7c3ee4727e68446a45211f4f9899e0f297a5698f98e935d08379567a26b956825962ed04ba97eb40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008ac54428f0d8e612e642fd773390cd2b822635007432b6fd4bea75dd44f23023b97fe0aeef70193d6c005f59a9e56716 -01ea00000000000000b1275a92da6f74da25e08404ac325019af00be8abf5a7e6b8cee9543de3e208b2bbec9dc5d7bad7f6a280660bea799a50396367636b8c17a1b7c3ee4727e68446a45211f4f9899e0f297a5698f98e935d08379567a26b956825962ed04ba97eb01a191e04fdd20d0bee8efe762cf13603b78c6e61b90f6c976c4be25348c53ed7cad8b05cc137ab029e605d8ad63e8bb7f001bd9c0a1cab509d0e7780d0493ce68efd02007fab9c1d164b765fc8598b4a1ba1bae694689e5753cbc7c29ae47de5040420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000081d8596c7685abc3850b2e2ac2c219c61a1f1964b5be0a0fe63d8e0ea9558bb08a2f0cd060719628f26433d2e9a1f968 -01ea00000000000000a191e04fdd20d0bee8efe762cf13603b78c6e61b90f6c976c4be25348c53ed7cad8b05cc137ab029e605d8ad63e8bb7f001bd9c0a1cab509d0e7780d0493ce68efd02007fab9c1d164b765fc8598b4a1ba1bae694689e5753cbc7c29ae47de5001b065f8cdc26fad7d6737b11e7b0289a9cce3d13d7b772f6eff441f83744984932b9db6994795f45b36ddaddcf1115ed20f8ddde5c7f258644db26c64b43ab9e4fcd7def04be4357aa037d7754f81862c190c31e0af508dac1187fbe65059fe9a40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008f3312820d500ff99b2e1913c099de74a3f3de2381e9285d8614d38348adfab017c4e4e3f5f34e9e7b7c101c76bcd644 -01ea00000000000000b065f8cdc26fad7d6737b11e7b0289a9cce3d13d7b772f6eff441f83744984932b9db6994795f45b36ddaddcf1115ed20f8ddde5c7f258644db26c64b43ab9e4fcd7def04be4357aa037d7754f81862c190c31e0af508dac1187fbe65059fe9a01a4a36d2ebbba0b101b685651dddea0d3bc897b949ddba4ddf6b717939280de64f9b03c3367170d70e2f82cf18882d1b9112166231cae11ef914df20d74197e5f15cc82ee7f100e743e4dba3281f17b32773fd850dde3363f8b268b6583dc6cc840420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000908900fa934af1f8782fc94121410d72013193be3e6b9a19851e6b9fdeb781bc8ae0aab59e224004007d57a57fe300f4 -01ea00000000000000a4a36d2ebbba0b101b685651dddea0d3bc897b949ddba4ddf6b717939280de64f9b03c3367170d70e2f82cf18882d1b9112166231cae11ef914df20d74197e5f15cc82ee7f100e743e4dba3281f17b32773fd850dde3363f8b268b6583dc6cc8019571a5f4a8192b2944a0e1ac9195b2f3f81182fda0c18ff5c7ece42c83f0f83005fc32317021ea36aece781a83240af10d1c53c0d4eeeb3a1af932841c823b6685705f6ad0c6e8f259f09a8845a4a08aaaab9cfc2c54e855204c3a83d8bf8ab140420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000096d12f9731b6b3a6ff5b6c70a8a6cacf347ab2608c62056be594987efeaea56cf9f56343bc8834953dd179066691cac7 -01ea000000000000009571a5f4a8192b2944a0e1ac9195b2f3f81182fda0c18ff5c7ece42c83f0f83005fc32317021ea36aece781a83240af10d1c53c0d4eeeb3a1af932841c823b6685705f6ad0c6e8f259f09a8845a4a08aaaab9cfc2c54e855204c3a83d8bf8ab1018a2a776459786bd1a382fa9da3b4f3f4fedf9d268b9c069d320f51b2246d1d87596edbf7e910fc4f6610350ab4b6e9dc0d4fcfb475d78de1677466367687f5a21c11ec6757b1e2811317f327b991eaddefac2ebb05582197cf4df13e9f7bede240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000903588de6a850c0ae34b351cefcdea5f45ebb0a751a0674cf20c7d335059d160c7af048265608b8de1c5b68276eca8b7 -01ea000000000000008a2a776459786bd1a382fa9da3b4f3f4fedf9d268b9c069d320f51b2246d1d87596edbf7e910fc4f6610350ab4b6e9dc0d4fcfb475d78de1677466367687f5a21c11ec6757b1e2811317f327b991eaddefac2ebb05582197cf4df13e9f7bede2018248093de6a5e86314d66ec0f1cf09822d1b975163fead31e92745e24a1c48192a0cbe2ed7e71793aef1c43a340c0fcb0082f6abf7d0799422adc3c6fa7718c0f84b580a26d9488f35d417b43a62cc79b50d92b275d0413c7a1c00ed90ca379540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ac082e8601a41175e003d9fe59c5060f7217dd93221b3ab0c19004bc4830603c990edd9d2cc8b70e06ade54aa933ceef -01ea000000000000008248093de6a5e86314d66ec0f1cf09822d1b975163fead31e92745e24a1c48192a0cbe2ed7e71793aef1c43a340c0fcb0082f6abf7d0799422adc3c6fa7718c0f84b580a26d9488f35d417b43a62cc79b50d92b275d0413c7a1c00ed90ca379501b4e8b32b323a77ca7750b37128afd1fe3e4d184c5bedfd6619dfc1f64afbbd864d324423fd005a6dfb93d0e9dd7031540212f96092ada6f1c8f73b69290eb813791fe73efc5009185d5694182e85588b674c5aeed021f9921a6acb323fe6cd7a40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008b572d9102f560a03213078095550ec04a719e39057edce7afb7fabfef79a7d61874afc740664be0e2d587336d7176e1 -01ea00000000000000b4e8b32b323a77ca7750b37128afd1fe3e4d184c5bedfd6619dfc1f64afbbd864d324423fd005a6dfb93d0e9dd7031540212f96092ada6f1c8f73b69290eb813791fe73efc5009185d5694182e85588b674c5aeed021f9921a6acb323fe6cd7a01aa33e2c3123e426f8007fb05cdcee119237dc1eec67e1a53b8e120bf315669673d449ca957c12f98f71a053dccd221a80287945992ec3933e3d5807768f9391cd9fbeda7b133e14453079b85f62298cc6fe92e075db9e90ba8ab07e071f45f1940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a28eca7c7a884596a0ca0a80e9653d75c269e3f3e0c03d3521d429efb53da6d534b51b56027cfafce595c2f15da9e811 -01ea00000000000000aa33e2c3123e426f8007fb05cdcee119237dc1eec67e1a53b8e120bf315669673d449ca957c12f98f71a053dccd221a80287945992ec3933e3d5807768f9391cd9fbeda7b133e14453079b85f62298cc6fe92e075db9e90ba8ab07e071f45f1901927dc8acdab4a63bbf57514406cba2cfe4b2edc2d14b1fc225017732cc46c9b961877c0fdcc08e97c5b743322c24bd030a98dd7e6ba3c6cead352954d51f9dee62c38f682a872372dab67611b7b481e612f8dae4163206b123fc7e6369e8219640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b90605e79c1855483da9dd34d23ec69c88b532dc26ccf74e4ec26e6b7c3c4ed6f71501949f98aa024cdf352136838678 -01ea00000000000000927dc8acdab4a63bbf57514406cba2cfe4b2edc2d14b1fc225017732cc46c9b961877c0fdcc08e97c5b743322c24bd030a98dd7e6ba3c6cead352954d51f9dee62c38f682a872372dab67611b7b481e612f8dae4163206b123fc7e6369e82196018b13dec1e65b5cd9d2e62cd0da6ab5641986a8c6116babc3f53d311f8b235928becf0b90af6613bd52f2970511dec81c14c0bc1f8bdfed0399fa4d844d271abded77a05ae57c067b9ee5223053f5bddd5a7f627b3d8a12c5234f1cf4c75d116a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b4930fa2ca076c04257ac041d070bb3c05a6513a2f323cf74aeae5f898a5ded34cca4abc07c76c51c8d204e4053be39e -01ea000000000000008b13dec1e65b5cd9d2e62cd0da6ab5641986a8c6116babc3f53d311f8b235928becf0b90af6613bd52f2970511dec81c14c0bc1f8bdfed0399fa4d844d271abded77a05ae57c067b9ee5223053f5bddd5a7f627b3d8a12c5234f1cf4c75d116a01b3ec482a649fee0eb4af237daded7caf2c782076cd78212bbb832ece6cb29e68b9ffc8741b7ad4dfb32acae3df4c91a90f453134e01ec3524ece4548119362b81a5313bbe0f3ee2938517bf048b53ce62ab413321791d2b1a8ec68e90847697f40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b90100134382cfbb3ad39c5a1beb199912e91b7de85b5dd1ad9b1dcaeedb6d866ee54f6f1176b0c321389e0bc11396e3 -01ea00000000000000b3ec482a649fee0eb4af237daded7caf2c782076cd78212bbb832ece6cb29e68b9ffc8741b7ad4dfb32acae3df4c91a90f453134e01ec3524ece4548119362b81a5313bbe0f3ee2938517bf048b53ce62ab413321791d2b1a8ec68e90847697f01a6d070edf3915837e8c062e1ad2156ad1d194faddcf0bcfc4d257f5b97b26d9f87f90526ccfc3e788db18496e0726eaf0707082f2d3321b7350c18f458c649be00c7393596c9cd6849bcbcfa2280d461c63840c86bc4554024ef9677f312804640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000915dac80c0787495559e2efcb9248b7dc481e534cf93a816976036d2a662efe9515d12bc7df04adce722c8415b39adfc -01ea00000000000000a6d070edf3915837e8c062e1ad2156ad1d194faddcf0bcfc4d257f5b97b26d9f87f90526ccfc3e788db18496e0726eaf0707082f2d3321b7350c18f458c649be00c7393596c9cd6849bcbcfa2280d461c63840c86bc4554024ef9677f312804601b5737fd0219f73f3bb07849b98c8e4f98943baf42cd80a352efcb00125d8eb3c72a5f5f7ac96ff13bdfb3c8ca858aec7076c8a45f61b7dd2b2645eb9e4683d5058cc8238658fab4f06cc6fa60154acd9a08fe321a172d2ed89b8f47279cf21ac40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a4f04f79ba5c90ca75793b43f9e67bbf4a4e40c4d8104862568a16df5ac515f6b7296c7b71dc153ed69c036d461247a2 -01ea00000000000000b5737fd0219f73f3bb07849b98c8e4f98943baf42cd80a352efcb00125d8eb3c72a5f5f7ac96ff13bdfb3c8ca858aec7076c8a45f61b7dd2b2645eb9e4683d5058cc8238658fab4f06cc6fa60154acd9a08fe321a172d2ed89b8f47279cf21ac018e00153c3ff0d4acbeeec3b9e5087d77fcb271778f3d1abfe9845f26ec53c7d55228aabe0d33f9de0734b2efb53b5af118a3b99acd4e5b573e9acad1480e5105fe4a66e1760907af3c3a4875f91e63538e8e36413e07fc6e3e42a639b106a6d640420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008bd762637d5604659cf395c833dbd3ba4f00b1e591134b17603152babff04127d2ab1336125f4e2e86a5fde8dbf20b19 -01ea000000000000008e00153c3ff0d4acbeeec3b9e5087d77fcb271778f3d1abfe9845f26ec53c7d55228aabe0d33f9de0734b2efb53b5af118a3b99acd4e5b573e9acad1480e5105fe4a66e1760907af3c3a4875f91e63538e8e36413e07fc6e3e42a639b106a6d6018cc68fa0339be31f9a0b0bebeddbe0362a0402d38a11637c07902412fe99df492b8f243b5ae6cb12434b24c05a96ee0005a75854e3a7ea1310464553f867566564587e6d82a910929a43779901894c97e4c32b8e52cd804723afa051a2ac4c1040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a7dea808f4340dd0f5b8aa2dc1a516271ef80885460c957b89f999a40f743146dca533040ea8dc1d6c9d70edc0926b12 -01ea000000000000008cc68fa0339be31f9a0b0bebeddbe0362a0402d38a11637c07902412fe99df492b8f243b5ae6cb12434b24c05a96ee0005a75854e3a7ea1310464553f867566564587e6d82a910929a43779901894c97e4c32b8e52cd804723afa051a2ac4c1001963af41e23aa1ac5db53b304b48cfefc08711ec031d7192447a3f6ae66c382775c3b23bf6aae50b9383febbd8a4ca68a0a99b39199f6c5a4e3ac1bba87bac0324866e26f25584f6c3e88c69e8f3a6e1abd27ffa8d0db39bbae16acd1071794ea40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000092ab133be7ed6356959bc3242853b365e217abbb32dacc7f51b7bfe6de27eabbe544e271a53bb50a93dc3c391a6bdba3 -01ea00000000000000963af41e23aa1ac5db53b304b48cfefc08711ec031d7192447a3f6ae66c382775c3b23bf6aae50b9383febbd8a4ca68a0a99b39199f6c5a4e3ac1bba87bac0324866e26f25584f6c3e88c69e8f3a6e1abd27ffa8d0db39bbae16acd1071794ea01b7a48e6b8ab8d373570ac7c49bf87f50e8ed96b8f85bfbf3cc876ebd109cec31ca38a5d5b7af312471b74f364565ab0317d33366bac87779a0a580147bd3cf4e655ab115a9ef34708b1dad09dfb3440a359789faffbcd6616a3dad4bd778c2c240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a1f85b25232901f7576e5da6cc71ccb6cfa1f0971b31b1fdbab0e2e2ae89cc3ec74666375a6ee8a44e6844e6bfb4fe4c -01ea00000000000000b7a48e6b8ab8d373570ac7c49bf87f50e8ed96b8f85bfbf3cc876ebd109cec31ca38a5d5b7af312471b74f364565ab0317d33366bac87779a0a580147bd3cf4e655ab115a9ef34708b1dad09dfb3440a359789faffbcd6616a3dad4bd778c2c201b6254baa4a16e32e9ebfc5170aca4b30fe320017ed4a59470973ba89b00379e8c004557259ca2e159b4189d610fe7f9409adc8a4339a315d513c18c53734ea2f27e7b70f4ca1abfe97291f0a3ac7042b220dd3ffb2a2ed78fa19ab7b5f83804540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b17a9a212de050ccc4b07e777be0ca882c8a2bab356ab4b39dc63158256fd695216367066180f1eefc4f71883d2aa7e6 -01ea00000000000000b6254baa4a16e32e9ebfc5170aca4b30fe320017ed4a59470973ba89b00379e8c004557259ca2e159b4189d610fe7f9409adc8a4339a315d513c18c53734ea2f27e7b70f4ca1abfe97291f0a3ac7042b220dd3ffb2a2ed78fa19ab7b5f83804501803684a80adff86234ae0b5427d228bf46a0eabac52293644343fac42ec82a3f3794c7c59b9043f2625694d3ad3a39df180cc4a79c30a7d81a48ed440db5e577e0f9c0360b9315f947dba078a25590939536edfca7b18e5cbeee9fa508b4bb7240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a62e78b5ed5df47c75a63069089d6a467d6213754b13bfaf9d97ce87e9bf236627cb79be705138dfbd167788acf88967 -01ea00000000000000803684a80adff86234ae0b5427d228bf46a0eabac52293644343fac42ec82a3f3794c7c59b9043f2625694d3ad3a39df180cc4a79c30a7d81a48ed440db5e577e0f9c0360b9315f947dba078a25590939536edfca7b18e5cbeee9fa508b4bb720196212323bac6b5e2e6536121eb52c65844bd533b8de6c78059d41cf9fbd414c26ddc6945b1db197e12ba2ce5f9175e7b036669d11da5c228363defdb71a5592e00df7c6c3168b11a385480f74034017ffd640c1a14ad76b62a597dc0b02926dd40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b4b46ebaf331a44ebefbeab2f86b30c1bc6fcac5f1578da101b60ef7c69684f4309fe9facf4f1c46ab47a2cac247b62f -01ea0000000000000096212323bac6b5e2e6536121eb52c65844bd533b8de6c78059d41cf9fbd414c26ddc6945b1db197e12ba2ce5f9175e7b036669d11da5c228363defdb71a5592e00df7c6c3168b11a385480f74034017ffd640c1a14ad76b62a597dc0b02926dd01899e64a0ea0178e09965c763d9231e319a5314b6fa1b7e6ddc69571d4e0017cd592da1a38893b288655b608fd435414d0bb6066ae4bfca448a3653dd9081fa10fe5924c37feb65a9fd40d4537787811e8984500bf992eb0d7d9b156ca3d9542e40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ac614e09381ce83e54fdad0492a49d4ea5b6b361e3faa98d7440000e07668e5bf5c46754db2d6a843fdd423867d30948 -01ea00000000000000899e64a0ea0178e09965c763d9231e319a5314b6fa1b7e6ddc69571d4e0017cd592da1a38893b288655b608fd435414d0bb6066ae4bfca448a3653dd9081fa10fe5924c37feb65a9fd40d4537787811e8984500bf992eb0d7d9b156ca3d9542e01b09232fac2f4dc06ed35592691aceaebdbe914204d6db4cb7966e8549c16df81639dfa4cca7ad387abf194f2aa9a6a3e0002e1e3d3e9d260bb9de47de04f3c4b64ca8724c6412b195e8a5a2e09cd120d18b14750e0c77701e80702a80d0cf19740420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000088b35978b19b84a6a4724317d5cbbf4fe29b428048156d83377f557904554e2130f0a8d8a518eeff52b1ff8b7584cff7 -01ea00000000000000b09232fac2f4dc06ed35592691aceaebdbe914204d6db4cb7966e8549c16df81639dfa4cca7ad387abf194f2aa9a6a3e0002e1e3d3e9d260bb9de47de04f3c4b64ca8724c6412b195e8a5a2e09cd120d18b14750e0c77701e80702a80d0cf197018c7fd098c59ad95d7ed779570a01e291a1badbe9acde7474a4f0d5696bf8f249c7a9b6b414359088dc504892ea9209f0123d8a95437bd0587c390f2f990b04c272a50d0afe2fbf2c8413d55fda00a566442bf5bf76a669aa97a275985ad0f3f640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a1e3cd83d66f57c0abfb69162c514cb8bdf1ce2fd0ad27f4e3467da465641182df0bb753c752f4d78eab3960252271c2 -01ea000000000000008c7fd098c59ad95d7ed779570a01e291a1badbe9acde7474a4f0d5696bf8f249c7a9b6b414359088dc504892ea9209f0123d8a95437bd0587c390f2f990b04c272a50d0afe2fbf2c8413d55fda00a566442bf5bf76a669aa97a275985ad0f3f601b9f213a0089a669561fe3abaaf1c50588632c457ceda29b9595ec545e0f30141dfd50ecda09af8d88593170e6d3995a5112be3e42c7e1e3146f59f9c028a26c97f6e505fe0e296f5e1c45a24eb1d675fca8de617d2701fda1ff020740f8ba79c40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b454508ddb23d8fe30f0d916e32dab040b594de958aa6b1c600e2f3cb0cde202cc9c84ddc4cc4d6a9fc1f8f324c7790c -01ea00000000000000b9f213a0089a669561fe3abaaf1c50588632c457ceda29b9595ec545e0f30141dfd50ecda09af8d88593170e6d3995a5112be3e42c7e1e3146f59f9c028a26c97f6e505fe0e296f5e1c45a24eb1d675fca8de617d2701fda1ff020740f8ba79c0183831204787b6cff761e61157b7dfc17deaa91945ed20f21c072e25923459eaeb8a3673ca69069f3cef6f127ef6871d5027481c5bf49db28818717cda24ac42354ed7a2dbfc40d5a599581eab1a195970e6e9f00bb14a7f8cca313ca0fafdec640420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000098107beb1cd2080e5fbf6d626f4b9e3886ffb4de14f9af4555047e2b22b1b37b1a654bc4f95184a069d6f74ee80d82ec -01ea0000000000000083831204787b6cff761e61157b7dfc17deaa91945ed20f21c072e25923459eaeb8a3673ca69069f3cef6f127ef6871d5027481c5bf49db28818717cda24ac42354ed7a2dbfc40d5a599581eab1a195970e6e9f00bb14a7f8cca313ca0fafdec601ae0bf8014acf2d6489892c2da83e0196558353f12928cf807f687f60917030aaa066b3ed8faa84297279503a036776c70a6c91b7f3065c0c87d4f26369b5568212bb0e1aad5165fb81536caa9865026694e6890405ed6dcc2a5bee283d8237e540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b568645506bbace9173077a8edde83e90b1913c75042e5cfe367beff97dea5fa5efb82acf22cb0514553b9315eb10220 -01ea00000000000000ae0bf8014acf2d6489892c2da83e0196558353f12928cf807f687f60917030aaa066b3ed8faa84297279503a036776c70a6c91b7f3065c0c87d4f26369b5568212bb0e1aad5165fb81536caa9865026694e6890405ed6dcc2a5bee283d8237e50190bded8a6919561a8beb2c4fac3792b0aa6dee67836fc305bba07b836d05e2df582a8d45ed52d03cacdd7a77be3afe8e185f4a7fa6979dbfb9969d2b68d52e7b1cf8d3ad71680f5d8b222fc4f713db2b3a0634378196795d20e293cbc70bb4e940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a4e18f0483689e7550520f4311817a9dac0c38ecfc28bc62b244c3d4ce356553ab8ff6c17f94f79b00279bfff502bcd1 -01ea0000000000000090bded8a6919561a8beb2c4fac3792b0aa6dee67836fc305bba07b836d05e2df582a8d45ed52d03cacdd7a77be3afe8e185f4a7fa6979dbfb9969d2b68d52e7b1cf8d3ad71680f5d8b222fc4f713db2b3a0634378196795d20e293cbc70bb4e9018444ef39e0bbd22bc279b94d9b76347d0ac6d5ac456aece2407e0cfbacd6ed0afc0e65d675cb7d63155f04cb27f8ad7f091c5d7f77d4474427469760aafa3ba72a64437ceb74afc289bbcc86dd6db98f972deb2284c74be740938b4af5ded73f40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a6a536dd6f0aed5085684e946251e3251f96a2e60b1b6065f3d9e091056875358d9c60311d76c863ed0474f9292e8b62 -01ea000000000000008444ef39e0bbd22bc279b94d9b76347d0ac6d5ac456aece2407e0cfbacd6ed0afc0e65d675cb7d63155f04cb27f8ad7f091c5d7f77d4474427469760aafa3ba72a64437ceb74afc289bbcc86dd6db98f972deb2284c74be740938b4af5ded73f01925cb1dc9b8bb3dba9695204f3a1ea9ddd9ff3742e34b9df47b417ca780f48104c5a576911b19653fe8e09aef49eb1d81393ed25f45c4230836a45995a6c66021c9453f7af2182a83a87635586bd283c925a93228069d7a52a05090b1403fa5a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b94938a3a0b2964ed2b504d6048c20ab8ff6a144de1431ee31a0825539915494301aaafe8d6680c82062adeff7c33db7 -01ea00000000000000925cb1dc9b8bb3dba9695204f3a1ea9ddd9ff3742e34b9df47b417ca780f48104c5a576911b19653fe8e09aef49eb1d81393ed25f45c4230836a45995a6c66021c9453f7af2182a83a87635586bd283c925a93228069d7a52a05090b1403fa5a019031eb88bab33185963087e1fbbf96ce5cc153e6abcb02314ab4d0bcbc9ed301f6fa075185173d5b485e8ea755383cbd098878afeaf06323ccab122f456161d5d992e81aa8431eceba3840c1e95282a1bba57084b941645540182b0c352fadc940420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000096c7f6e7207565d6dbf2fbb2f79f8a56c72f7bed4e5d1649fae63bb79ded7131433a608c75c654c066a0a5191c3604ff -01ea000000000000009031eb88bab33185963087e1fbbf96ce5cc153e6abcb02314ab4d0bcbc9ed301f6fa075185173d5b485e8ea755383cbd098878afeaf06323ccab122f456161d5d992e81aa8431eceba3840c1e95282a1bba57084b941645540182b0c352fadc901a990c4c0750588c6922633dad84eaaee6178d7698aeee542bafdbb1ae0b654d4e03d9380fae87596235b181f8b71d51a11b316218b029e40ba3e54a52d075f12b8486a3e3975b916b0e6c1bc848da555275224005892b6f44fd063ae058e164540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000892ee4bec8d4c6ff9c22ceadd8fddc0e5e89de9b626ed7c4f21ac13af25ee224eabeb1a0d71da4707768ee6fce972a72 -01ea00000000000000a990c4c0750588c6922633dad84eaaee6178d7698aeee542bafdbb1ae0b654d4e03d9380fae87596235b181f8b71d51a11b316218b029e40ba3e54a52d075f12b8486a3e3975b916b0e6c1bc848da555275224005892b6f44fd063ae058e164501b6b6060f242a71b480f2ebf1b702cb2ece4f55ecf8f50a2878816e38041bc4b4ab7e007938a1d8d51dc531eb064e9ff70ef5637b13d48838df32894ce353335af6d3eee6f417ad4804e688c4a81e5df6aad9133885c41ed368c1bd836b1faafc40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000085ca64a1ac8696c2752ffc3bdeb6dfd640b4d3eaf99375ea547e686f3724e1a1b79cc88c4116f176e46182af78e71b45 -01ea00000000000000b6b6060f242a71b480f2ebf1b702cb2ece4f55ecf8f50a2878816e38041bc4b4ab7e007938a1d8d51dc531eb064e9ff70ef5637b13d48838df32894ce353335af6d3eee6f417ad4804e688c4a81e5df6aad9133885c41ed368c1bd836b1faafc018823a0ef0e5fe0d16677e23854848db2db80cc15750c4bd797a0014841b7fb8e27bbc787ddf7fadbe329f99b8ca70e28012a8fa8a32e07d2688029104ed01dadb684966312c8fd12fde26605522b7080ef52bf848ffd7ba23aa0d058f039c40640420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000097dbeb221e17963b45db996ac4c8c1c93f4f0cfa1d280a66dccc9b7cc0753565f1ed741311fcb749e79cdebc7789a754 -01ea000000000000008823a0ef0e5fe0d16677e23854848db2db80cc15750c4bd797a0014841b7fb8e27bbc787ddf7fadbe329f99b8ca70e28012a8fa8a32e07d2688029104ed01dadb684966312c8fd12fde26605522b7080ef52bf848ffd7ba23aa0d058f039c4060180b3c0fbedea5479e51e6d56d6336c7a65f76311c579d41494da4d1bf1e43270028ff9aa5fa125937beeb9c6a067162b0759e9f26790f7ce57fead375958666da31ec1bb8f0c1bd300731c345ca95e2a05f0429ff6638f2a4c7fe10e48dfad6a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a13e86b56f3d72e9057b5141e3d813427c248e474079da84835061c5e554a9801b5473c3a7536419e8f154c5ae1e9bd0 -01ea0000000000000080b3c0fbedea5479e51e6d56d6336c7a65f76311c579d41494da4d1bf1e43270028ff9aa5fa125937beeb9c6a067162b0759e9f26790f7ce57fead375958666da31ec1bb8f0c1bd300731c345ca95e2a05f0429ff6638f2a4c7fe10e48dfad6a0190ffde44e069f6d4ab591d40dc2a17c7eacebf0eeef6da3019ef4dc958c3dca8cdb5731c5e867ab9efe2c3b54370a551162cbf450dd0192c08f822197223141c6b8acf3aef06fe9ef1fbd977f6a7e79272573f055648cfd1a45b1637d4c812f740420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008f8f5bdbc01c4e16dc6fa27b2d111af56ddb4ab2f9917ac5fe1b3d9461fac218e87f1612c247e3b1adbe0bd6a330ecf5 -01ea0000000000000090ffde44e069f6d4ab591d40dc2a17c7eacebf0eeef6da3019ef4dc958c3dca8cdb5731c5e867ab9efe2c3b54370a551162cbf450dd0192c08f822197223141c6b8acf3aef06fe9ef1fbd977f6a7e79272573f055648cfd1a45b1637d4c812f7019420244f16d68896e0dfccc0448ce28e9f7ecd3c217ffbf8045a2c110c5e5af3aff207947a6f553f42c261b31b3ff3760253a01594ea58b354f6d10bfc4c2dd4aee55bdae0fd93a7319aa797164d91564842fd2408f53c361edba48442d10eca40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aaf7f5a12f0e2c87b23176f9a92ab8732694818cf0b1bbc964f59b4d89c95a912b6e8ea2862b4ab32009aaac04c5349c -01ea000000000000009420244f16d68896e0dfccc0448ce28e9f7ecd3c217ffbf8045a2c110c5e5af3aff207947a6f553f42c261b31b3ff3760253a01594ea58b354f6d10bfc4c2dd4aee55bdae0fd93a7319aa797164d91564842fd2408f53c361edba48442d10eca018cf23e3cfc2faac0a551fce076313209abae0ea869b708c0771577e3877fac05c1b3ff3bfe8982bef50c9fe74e55a31613f080224b14f0f891430495a6f0c94f2cdcc2bf8127484182fa60745b82c43885873af6739a86c7ac040a15eca2829740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000862c843da97ccc1604e2bbb1441d093c1aff89ef9c78af14445312f7bbd5a4f5f7208b02a3752c4e09c7f1ca5510d816 -01ea000000000000008cf23e3cfc2faac0a551fce076313209abae0ea869b708c0771577e3877fac05c1b3ff3bfe8982bef50c9fe74e55a31613f080224b14f0f891430495a6f0c94f2cdcc2bf8127484182fa60745b82c43885873af6739a86c7ac040a15eca282970192c5f7b905dde2a97e903a7fc3e63f88c3d509f0f0122f789368009f4b0ea02f77a59972b0af830ab54e2209bbff694b0df38fa651d500c610b867706c71228eb9c80bbeb1215a4e00b52c9805a6b622e24bd7e9f3b8c12908d287124a20534640420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008bfb1351edbedf9a71b1329f4f5554e149dcc42b558742f3ba59fce29a8bc3417a340363815e8502b67c1bdad3431faf -01ea0000000000000092c5f7b905dde2a97e903a7fc3e63f88c3d509f0f0122f789368009f4b0ea02f77a59972b0af830ab54e2209bbff694b0df38fa651d500c610b867706c71228eb9c80bbeb1215a4e00b52c9805a6b622e24bd7e9f3b8c12908d287124a20534601b3df15846333468779e0d30456871392dba2c28eabd0e699a6f358308e89dc9822ca126154cf1c4a7bf853b26456569e15e4be28cd07caf0ba110b66b2a932cc4e95400fbf4a0e812f8bd539785b7fe78d07d437cbe81b6142fc530bbbbc630040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b24aed63567cad525fda1df52414f316311fc25263c9a254be15afbe67fc0d5b73b5401edf05e8ac31d41a99b42035dd -01ea00000000000000b3df15846333468779e0d30456871392dba2c28eabd0e699a6f358308e89dc9822ca126154cf1c4a7bf853b26456569e15e4be28cd07caf0ba110b66b2a932cc4e95400fbf4a0e812f8bd539785b7fe78d07d437cbe81b6142fc530bbbbc630001ab6d9e7db56766bff16a4511cfad9a6d5e336b3dea04fa00e3e0f36c177bfd9d8a112a837f45a6cc6ddcba1413b69d1112d28f967b9b90a500104e6a730c294637dfd944a83aff22e3bc215669f58513b47763133a4abf41914e163d6c23acc740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000872b233141a5229e507cd5d139e9c0cb30bcdbcfbf7302d80513c73870e297abc0f666fb4ee7808b8ee9491b50f7b52d -01ea00000000000000ab6d9e7db56766bff16a4511cfad9a6d5e336b3dea04fa00e3e0f36c177bfd9d8a112a837f45a6cc6ddcba1413b69d1112d28f967b9b90a500104e6a730c294637dfd944a83aff22e3bc215669f58513b47763133a4abf41914e163d6c23acc7018117e7bdc7e84c197c08fa089a3ee85b8bb9e9aac01a81b0365a86a5e00ee7b6229fcbe7302165fd9490adbb5f991fce0bfcd1e4bc43de62b7a70b909dd8baebe151fd36580f5b847ca0ba64a9b03d1fc14ad2b54d0b0ed766fc754d0c3525ea40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b29902f1fbba01e8d711497d83a2358cdfcdc3217f34c5cc8a65c3cf84b20bbbbec1fcc382a9f767f9b7bb471757636b -01ea000000000000008117e7bdc7e84c197c08fa089a3ee85b8bb9e9aac01a81b0365a86a5e00ee7b6229fcbe7302165fd9490adbb5f991fce0bfcd1e4bc43de62b7a70b909dd8baebe151fd36580f5b847ca0ba64a9b03d1fc14ad2b54d0b0ed766fc754d0c3525ea0197ac46f79bb62c41852a681a6a21ad8a0bf32522523a73e3c200d62cba80aa6248111c9b7e3931f9dce5876360aab1200e00101e6cbfc352b0b7bfff1837aa31b897cdb6e4e00d5307efa7bbeae78f3a031fd933c662b106cbbf727e90d41d0d40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aa22e7c00ec00bc695bf99f59d16a5082eadab83453ef305d5810c0af664440941bdecea15ecc64be006289ce722772b -01ea0000000000000097ac46f79bb62c41852a681a6a21ad8a0bf32522523a73e3c200d62cba80aa6248111c9b7e3931f9dce5876360aab1200e00101e6cbfc352b0b7bfff1837aa31b897cdb6e4e00d5307efa7bbeae78f3a031fd933c662b106cbbf727e90d41d0d01a29fef7a4a1174cc7b179f1c5ff5c15fc760f743279241d03da8eae9ac208d6442430b6adadafeaeaa0feb9b0a300b2d00564ab4a656e936ed944aa22580d302f499e67a93065b43f254bc1490678c9a1b0e634d318a60b942e922509b287a4940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b683595076cdfa454d1e533562b710119e385efabc3481c5e6584aeb8bbcf1f600fb590c55bf7a087f4bfa344ffe6f6c -01ea00000000000000a29fef7a4a1174cc7b179f1c5ff5c15fc760f743279241d03da8eae9ac208d6442430b6adadafeaeaa0feb9b0a300b2d00564ab4a656e936ed944aa22580d302f499e67a93065b43f254bc1490678c9a1b0e634d318a60b942e922509b287a4901aeb51a3926de36e493243b3bf815c521393047ff6d1535974737a981ef7652fc189d60dd3aa3a6cfd38910d18192118517c4aa1099ee39372a92f2635e05b9218881227c1174a6bad9ddc143ac0f335974505a293f6375d81fc21c74059ec03640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a0a21eeb4623bdab3b1c20e3d9522d5e4e21cabe30b4efce85d43dcac84e75e03d9fc3be1c08d14e6dd2cbe27ae472a2 -01ea00000000000000aeb51a3926de36e493243b3bf815c521393047ff6d1535974737a981ef7652fc189d60dd3aa3a6cfd38910d18192118517c4aa1099ee39372a92f2635e05b9218881227c1174a6bad9ddc143ac0f335974505a293f6375d81fc21c74059ec03601acb686f36f2a12ebbb2d2408c3cf75821eca6e917b1eda620bd123432840815cd9610835e90584da1abf5bc6cb26292b09d08188b7a8bc27f8d4a50138888754c9381d3e72c731fb6306e064e62ce647b52f3395b9d95a2cfc77d19084e5fe7940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a7459a5f9192628fe191a2f6795d987cc582eff347c7736e20ee8b7109c5ac97fe1485cc32deb414873bfe8f1c2a9214 -01ea00000000000000acb686f36f2a12ebbb2d2408c3cf75821eca6e917b1eda620bd123432840815cd9610835e90584da1abf5bc6cb26292b09d08188b7a8bc27f8d4a50138888754c9381d3e72c731fb6306e064e62ce647b52f3395b9d95a2cfc77d19084e5fe790180b4b29b306852bd6accd13dedc4f379b3cad1d44f97798e19466c911842a1a5bc90dd545a36042e4f5cd814d0a4013706de007b9889d577c589057ee8eef811bd31d925d5b1f9564ec217f43ff0286e10bb5ccf7754f42770b236c7ba207ab740420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000099221af81a6c39c9d6a06614772745cbd7e968b0950de5ed3a52eabb62859b9b924a9bb26a9653ba6cc36fee360aee6b -01ea0000000000000080b4b29b306852bd6accd13dedc4f379b3cad1d44f97798e19466c911842a1a5bc90dd545a36042e4f5cd814d0a4013706de007b9889d577c589057ee8eef811bd31d925d5b1f9564ec217f43ff0286e10bb5ccf7754f42770b236c7ba207ab7018cd173e54f2d62803916d873bb709dc1a54aa1609ba0bf776891fa2b23c0850ea2042954c63d7d9ba9be4ba5b201cfda0e5cf19f3207fe4496686adf839da36a5b6ef004291c4c00c8173ce428c253833aaaf824b81f2b5de8b733a000362ad740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000970eb84cca38db815298c367a58334a5579afeedd9a75b9d4d4da56f5ed5ea0354fb6c2742db8c500818c985fe2d91cf -01ea000000000000008cd173e54f2d62803916d873bb709dc1a54aa1609ba0bf776891fa2b23c0850ea2042954c63d7d9ba9be4ba5b201cfda0e5cf19f3207fe4496686adf839da36a5b6ef004291c4c00c8173ce428c253833aaaf824b81f2b5de8b733a000362ad7018a862e3cf4e4d9a57edb886762fbf0f783821f97a76e15be18f1b38007034fd2f4333c4bb0064d11e736fc9bdc2817220c38a29602c8b20dd91b6d98838dca2db64afd3d93ad93568505a86f22a521418159b1bd1bee70f6fe9494d68da5a5f240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000868867dae11f816510120e12400a0dcc8322f46e4a11d86da685752505b3052484f017e6498f3805fa655e38776621fb -01ea000000000000008a862e3cf4e4d9a57edb886762fbf0f783821f97a76e15be18f1b38007034fd2f4333c4bb0064d11e736fc9bdc2817220c38a29602c8b20dd91b6d98838dca2db64afd3d93ad93568505a86f22a521418159b1bd1bee70f6fe9494d68da5a5f201b361321e4403d925349551752acd2528b438111afc767656d85e1af18390257adc4113372c9cf5ca56ac982a7e96cc651012efa63ea74ad9d48b8e0be7e010b18643b68faeec02b5bd210f3559a05cfc61569e26c4cb85006755ee9ea7d1caae40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000099f6ff8c1b248ba4ec92c725308e4d0e120ac1cd033e51aad0b7be3c72c2846a2a9c7882b1187fd790656a72c93283b3 -01ea00000000000000b361321e4403d925349551752acd2528b438111afc767656d85e1af18390257adc4113372c9cf5ca56ac982a7e96cc651012efa63ea74ad9d48b8e0be7e010b18643b68faeec02b5bd210f3559a05cfc61569e26c4cb85006755ee9ea7d1caae018d31d41cb190cb54fab965d3edba820a8e8fc5cdf5df2ef0b17ed7b318c290808564ec96651502cb086f4e2317de88441376dca3359fcf084a904343591c9c6d420dea1e576a957120af2ea4c46ef9d3bb1394ad3cbc92413c59b1ce518c085040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a50ac11c182f268520cf4dac9334e48ba1fc132fd0af877e5f32f2301554fc65ef971ab4808dab1856f9cd3b51bd66d2 +01eb00000000000000fa8d31d41cb190cb54fab965d3edba820a8e8fc5cdf5df2ef0b17ed7b318c290808564ec96651502cb086f4e2317de88441376dca3359fcf084a904343591c9c6d420dea1e576a957120af2ea4c46ef9d3bb1394ad3cbc92413c59b1ce518c085001b6532a7b799b7911b4631bb91c07f2d1b10b0641cdb8fdf53bfc8194c9700e22d2fe0068142786be7a79cce92920d2a518dd851e2d7ee65addb2d79f7a8f8487d6df24627a5bf74428e060be27adca21250cb3382c2a4c8b4a78b699c1d752c940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a1684a2771ef0a7c71f1e681951e98c823c0eeac4a9aab1f561223b68b35d0dc25b0ffdad5aa89f78fd859b94a1ae184 +01eb00000000000000fab6532a7b799b7911b4631bb91c07f2d1b10b0641cdb8fdf53bfc8194c9700e22d2fe0068142786be7a79cce92920d2a518dd851e2d7ee65addb2d79f7a8f8487d6df24627a5bf74428e060be27adca21250cb3382c2a4c8b4a78b699c1d752c90182264d6e2d74b1c837692590461ace1bec066787c45a43ce2069cdfde86ecc9ee39943e18ab0d265426a46656491088701ac039ad5d7c59bb3f0ab7589977cad7eee944fac90d10e847e99cdef22b1f29c139b8ca5ec5706c2ce14e064500eb340420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000098cd93cdf162c97f5403d08ffb5722d1535cc5355643ea549af479e5380ec68491aba228ab0c5c1e270563aa84821b0d +01eb00000000000000fa82264d6e2d74b1c837692590461ace1bec066787c45a43ce2069cdfde86ecc9ee39943e18ab0d265426a46656491088701ac039ad5d7c59bb3f0ab7589977cad7eee944fac90d10e847e99cdef22b1f29c139b8ca5ec5706c2ce14e064500eb301ab89ed1e5cf7dfef077864e59ab0f668b9ddcee6037e1367c19f31dd6eb3073d123bee37ca14929dd8a237459ee9b80c032490ccd14acfd81e9d9e99237d6e45a6a0783b4ce9cc3ba2c5943a172cdd3cd0d7362a6a80e72db946d55e6242c39a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aacf088c2bf7da8fb98c9b3cc6f52f68c9a96d6ad334bdf87693e6fac4bcb305d0f42358cc6d07830b208a9f2a2880b7 +01eb00000000000000faab89ed1e5cf7dfef077864e59ab0f668b9ddcee6037e1367c19f31dd6eb3073d123bee37ca14929dd8a237459ee9b80c032490ccd14acfd81e9d9e99237d6e45a6a0783b4ce9cc3ba2c5943a172cdd3cd0d7362a6a80e72db946d55e6242c39a01b36febad973e492620ec23bd0f0546442bc445c97e84ce0217db901b6adefe44b25e860f5c2176f34dac3ae24bf8d02d00895e619029269b46836b49d9f7d3fe647a939add202fed72803881ac065c4ea4bb9b24d7f4179cd93c0eae912a017b40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000086fd34aedf963ec28c29736af89b17617adcbd9b17dc74744b3725da3a0c623915afd73879f24580331148f66c3bd0ca +01eb00000000000000fab36febad973e492620ec23bd0f0546442bc445c97e84ce0217db901b6adefe44b25e860f5c2176f34dac3ae24bf8d02d00895e619029269b46836b49d9f7d3fe647a939add202fed72803881ac065c4ea4bb9b24d7f4179cd93c0eae912a017b01944f003e00ee144b44655a21ac808f42d75b4b78095b44e921ef034dcfb31c22ea4119a0c9ecc3178791bc4162427b0813bd445a36851ddf9c7e87c6571fad5fd76f0ee71ccbd00846e893cb29fbb852fe65b2deec192a98766e7deee91d9c0b40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000080c363086e9f67af63459409d276579fcdad893f43b5fdf087e1864975d2491ba01737bbd678c32d5bf517270bfa0669 +01eb00000000000000fa944f003e00ee144b44655a21ac808f42d75b4b78095b44e921ef034dcfb31c22ea4119a0c9ecc3178791bc4162427b0813bd445a36851ddf9c7e87c6571fad5fd76f0ee71ccbd00846e893cb29fbb852fe65b2deec192a98766e7deee91d9c0b0198efb3414d4dee951e1391a32f006333295f49383468d5e8c94c7d2ae4f09b54548e24f38672897a1285b56bd97fad5710c0dd9963b805abf6cf69b460c221ae7bb04a23bf79b000e1754e900e7bf2a32065024d009be5c2bc3c18af548e84fb40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008db7822c70a6641ea73e3d32f487c455beab16ee83df0a437d66ac801f5b9f8b9ce76c721e3508e1f029a99fed97e177 +01eb00000000000000fa98efb3414d4dee951e1391a32f006333295f49383468d5e8c94c7d2ae4f09b54548e24f38672897a1285b56bd97fad5710c0dd9963b805abf6cf69b460c221ae7bb04a23bf79b000e1754e900e7bf2a32065024d009be5c2bc3c18af548e84fb01b73b47dcecb50fa831335e8e5bebccce2755b6850fee3418db178cf63eebd1009827147aecd577687c0bd9ca3c3c100b0439e2ff1b26d2ba4d71a2606c3bc5b75b528342e77a19ae1bc43a9e4b6b28fd10aa0247959a8c327d8440948277019040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000acb3e94e840ba2af096bd07d7c24fd55ad7e27005090d6d5fe1ab18c12f155369cd2cf31ad3eb6ca23a57f92f12b3044 +01eb00000000000000fab73b47dcecb50fa831335e8e5bebccce2755b6850fee3418db178cf63eebd1009827147aecd577687c0bd9ca3c3c100b0439e2ff1b26d2ba4d71a2606c3bc5b75b528342e77a19ae1bc43a9e4b6b28fd10aa0247959a8c327d8440948277019001958f3e0c8c6beb2a34f68ec6db7cd46fc4f7fd5376b5d17e9be5a6357a2618fc97c566f314f407fac76001e761b2123c04d9d1dbb1d66109296f1bb8e6dc86656cef4b0fc85fe3b47aaf087c7c706d9c2abe132701a0506531e385e34887286940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a9fffbfbd345f6d79b0a62a274bcbff137d3b148a348726d3f1c2bf1e3c6b8931f2ad78f7ce20a6a4f3a6b4ad9f265ec +01eb00000000000000fa958f3e0c8c6beb2a34f68ec6db7cd46fc4f7fd5376b5d17e9be5a6357a2618fc97c566f314f407fac76001e761b2123c04d9d1dbb1d66109296f1bb8e6dc86656cef4b0fc85fe3b47aaf087c7c706d9c2abe132701a0506531e385e34887286901875b7101d6deed445642a16bf04fe9ec7b9b83f3be3e7fa72825bb92026819adca57099c9d11adcdb830ab881c8226ed00860532520ccb427edd366d0326076be4130ac4936fef9218e99ec1979acff4f0fdfd4ff6181b5945211ac8264da0eb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a4608a5bd698fc8aadd84cea4d3e6a569b6f85c1dd4cbb745b3fcb9fe89a6d364f2f010f9400e758713691969b41024a +01eb00000000000000fa875b7101d6deed445642a16bf04fe9ec7b9b83f3be3e7fa72825bb92026819adca57099c9d11adcdb830ab881c8226ed00860532520ccb427edd366d0326076be4130ac4936fef9218e99ec1979acff4f0fdfd4ff6181b5945211ac8264da0eb01b7626d33f354c9a5743e31be0d40849b05cdab288bb2993737d444450a3196e8be9785690ec9703c5dad93b9a66593611221e837ef46a58f095fb4e765b3b48a356af904fcf287354c3c32a6514a1c289e647d604b16c374c0ac8c0d1c1fb19440420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000089bcaab375e2727ffa26cc17eb6b6cb878bcaadc19995d3877348f39ced82dd84ba92706009db245a9f0fa65730d56eb +01eb00000000000000fab7626d33f354c9a5743e31be0d40849b05cdab288bb2993737d444450a3196e8be9785690ec9703c5dad93b9a66593611221e837ef46a58f095fb4e765b3b48a356af904fcf287354c3c32a6514a1c289e647d604b16c374c0ac8c0d1c1fb19401a66ca7c857f3297501bc0b65f24284f7921bac9c60bdece5914f02bb7166d16d440af14c25367be48629599c94cf98bd0d518133cc75942aae40d8d5391bad7164e37e966385419e7046186a913a60c37f093e4622fe21cd680d7b0d26d72d9940420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000097f86489d147b42593f20ab57508efeef0b955a25e9d2f7ed642204ceef74b46ac916dc7990098575a5262e39c2fbf80 +01eb00000000000000faa66ca7c857f3297501bc0b65f24284f7921bac9c60bdece5914f02bb7166d16d440af14c25367be48629599c94cf98bd0d518133cc75942aae40d8d5391bad7164e37e966385419e7046186a913a60c37f093e4622fe21cd680d7b0d26d72d9901a09d5c38db453aa22044dd9d5e8d38c48b6d5d67382bcb5b92eec17e41167e405f15f9e9ac539d130c2136491243eb860ffabc0e8820c47343b24cd9c98af35f2db95a590510f452686a7b27c6ee7196f60c63bc6208d98b87483e68dbcdc5f640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a9824dc15153afd662b29c03037a51a5e892332fbca01423ed33a77d27d7cb9581394e6b11c5be5af420c88ff1c4b3ac +01eb00000000000000faa09d5c38db453aa22044dd9d5e8d38c48b6d5d67382bcb5b92eec17e41167e405f15f9e9ac539d130c2136491243eb860ffabc0e8820c47343b24cd9c98af35f2db95a590510f452686a7b27c6ee7196f60c63bc6208d98b87483e68dbcdc5f60192e15dd8d5f2940969cf9bd74b67418d43693b23c243a9fbcd582040ccca8abc678f0dd93d304c6230d9f9931402998d0c33f57d638c8ac734d1bd395a09af091677d493c377091353812c7691d4b227c51c00758bb7e882dcd2f9d74dde998540420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008c8dd97a3b3a2a21cea60864588d1dade044d804fb877971c9da9f56841b843466f68b990b83699423b1d777da469163 +01eb00000000000000fa92e15dd8d5f2940969cf9bd74b67418d43693b23c243a9fbcd582040ccca8abc678f0dd93d304c6230d9f9931402998d0c33f57d638c8ac734d1bd395a09af091677d493c377091353812c7691d4b227c51c00758bb7e882dcd2f9d74dde99850182b25aa6f8e6ac4650136c92c0ac311aeeb8af274e985c9ec1dafa220a4a7c52eabc06affae35ef56e0825c912a212d717b0e32d09e905f50c0eabfc639b5aa794971a5ffac2a69e948af0af00f6cc58a2a84a9c078a223375904246b9bfba6040420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000090c9f7422aab8b2eefb613f4175b162ecb16aebd9465566d6861824b2edf2b3baddae177d2d705f18d0d9d7875460a43 +01eb00000000000000fa82b25aa6f8e6ac4650136c92c0ac311aeeb8af274e985c9ec1dafa220a4a7c52eabc06affae35ef56e0825c912a212d717b0e32d09e905f50c0eabfc639b5aa794971a5ffac2a69e948af0af00f6cc58a2a84a9c078a223375904246b9bfba600195d75b02af80f8f91c610bccf5fbc4f8059f84203d9c6437f5388a7b7a84a70bea35a09529d7a851821aa83555c7d89a02ab451d15bdd94f8796049f1bf6b3f4a0088a0a17cb256b5702fa71876e6feb9863d3b16d5a5d46ba7cc6bb29fc7e0740420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008e2940101625296b471af62fa82c3438b4fd8fce2b16b1c0d115a4d5f17abda3115acd2c509bb5c27c909ba49a388acc +01eb00000000000000fa95d75b02af80f8f91c610bccf5fbc4f8059f84203d9c6437f5388a7b7a84a70bea35a09529d7a851821aa83555c7d89a02ab451d15bdd94f8796049f1bf6b3f4a0088a0a17cb256b5702fa71876e6feb9863d3b16d5a5d46ba7cc6bb29fc7e07019952c290953166ec8bbfd259826e910888d31bbdd7112c9ca5a3047d89516205bb75e586461504f5a6d6771a6e9145ea0d1c677b2495a93b25cbe28cccdd993d76a14225572483e966f5d48c4e4eb759570d6a2e3ca2a4a0e580ff394b6137d140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000978c341bce5d0b2060431df7ca658828604977d74f67a652b4f70e17b531a29083317fec7a18a8fcf90832964bdff9e2 +01eb00000000000000fa9952c290953166ec8bbfd259826e910888d31bbdd7112c9ca5a3047d89516205bb75e586461504f5a6d6771a6e9145ea0d1c677b2495a93b25cbe28cccdd993d76a14225572483e966f5d48c4e4eb759570d6a2e3ca2a4a0e580ff394b6137d10199201c741f5c7471d4182ebb91cf11c09b47f13e7ef4a303a350c312cf8fab0e54cb6b559bf3968458095a019933f8d90d0373beddb177f1fff22e2cb0a1ff21075e720a696ea4cc84bffad8a5e7a4c1560683cfbadcdfe0551712a285254c3040420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009134c8df476eafc952195044191a4fb17c7a0844458e7a3682ad0f4babc201c26b7bfe2ef47f51fb609dc60a611ceade +01eb00000000000000fa99201c741f5c7471d4182ebb91cf11c09b47f13e7ef4a303a350c312cf8fab0e54cb6b559bf3968458095a019933f8d90d0373beddb177f1fff22e2cb0a1ff21075e720a696ea4cc84bffad8a5e7a4c1560683cfbadcdfe0551712a285254c30018ec01bb93a9049ecef5f667a8b1660e0ec04bc321f0ebe45e4850ed9eadc37db6d8a82138f544108c480d548c299b4b61492608ae8826b3c79fdd162bb6abdc8c4ca456e025d31733a47439bde124fbfad3e73a132e93fde2d1775229079d0e440420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009330b46a2433735ebe029435d65f316b5bfbfeb29236fd29fcde919ab54f35e53b444bcb534ec532f85bcb297a274946 +01eb00000000000000fa8ec01bb93a9049ecef5f667a8b1660e0ec04bc321f0ebe45e4850ed9eadc37db6d8a82138f544108c480d548c299b4b61492608ae8826b3c79fdd162bb6abdc8c4ca456e025d31733a47439bde124fbfad3e73a132e93fde2d1775229079d0e40184873639c79029c0ab2090a7647dec527426c166fb8befeaea5f3e7833dc97f313a8e9041dad191f350e9daccad80f551726f351f12412825fc5594bae866c074195d9959cfe18d945008867cccec58877509070f9f9a3df1460aa114668d70440420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008cecbc6cab797ac19935c33787d46c4c18549bbf1084881a8e1ca9ca2636503ed4b967abc941dda0ccc286d16b90a069 +01eb00000000000000fa84873639c79029c0ab2090a7647dec527426c166fb8befeaea5f3e7833dc97f313a8e9041dad191f350e9daccad80f551726f351f12412825fc5594bae866c074195d9959cfe18d945008867cccec58877509070f9f9a3df1460aa114668d70401ad52a2d92356a7c43c6223b53f391c6bc41c556201c79ad9525db1205715649896a2e4d95b790b8e4eab7e9f6c28a7a0093683d486d81c33173b5c32b54114def41a2c01b39af7f28636d0de9978761ac06fd931a44fa519c4eebda4a744279340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aef645c266aa3a24e3d90e21cbdb0d5853a8eb971dd8aa20862ad48f56c68ab5a147589b2070dbf07ccf52d96baf1520 +01eb00000000000000faad52a2d92356a7c43c6223b53f391c6bc41c556201c79ad9525db1205715649896a2e4d95b790b8e4eab7e9f6c28a7a0093683d486d81c33173b5c32b54114def41a2c01b39af7f28636d0de9978761ac06fd931a44fa519c4eebda4a744279301b0897a885184ac65da3a8144e0605dee5a0835ff801a3f9bed9c9ed433e9c1a63bd9fe0768f615caa7ee79f5e0c3ae79086d922343598a24604c08f1c0da93a6bb890b08ae3dd9fe44efcdfa36f7aae20580386d745085e8fdceedbc05b208ad40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008d3a4d6d39319ac4e2c67304062a1933aab8a3fb0778ea50468a5c870d6dcc5a0b9a5d10616ca0dff87e34cd642e26b0 +01eb00000000000000fab0897a885184ac65da3a8144e0605dee5a0835ff801a3f9bed9c9ed433e9c1a63bd9fe0768f615caa7ee79f5e0c3ae79086d922343598a24604c08f1c0da93a6bb890b08ae3dd9fe44efcdfa36f7aae20580386d745085e8fdceedbc05b208ad0180217bef9a4a4c9b52179f73b89c8f59bfcd6b96c0a5e50864fe43ddad3491dae4917577e94a705e12116ed1816132a20693efa1d49097329fd91682731e8244cb61e73bf557f5658a6be82af9e49535e95af7c4b099a6bb5c2ef6303e6b2d8b40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000080ef5542569ca046a94e92d09f24c63ba8f16ab1db5aff07ef012876c04a9e554821276669a9744859dc6f52bbbfa0c9 +01eb00000000000000fa80217bef9a4a4c9b52179f73b89c8f59bfcd6b96c0a5e50864fe43ddad3491dae4917577e94a705e12116ed1816132a20693efa1d49097329fd91682731e8244cb61e73bf557f5658a6be82af9e49535e95af7c4b099a6bb5c2ef6303e6b2d8b01842d95c2f84cf9739ee10e45888d23cb01e7537ed6c58919db85ae1fae3f22985434a2aa25b279b52f814f05f60f1bdf18b37c2fe00c2f36dd6afb9e9bcbe347c90b475ae48955144c89f109d4e291cd99b18daa59c2f41c753596e6cb2b252a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b995870468b52f54a04009ee6a56034f6889479596aad45ac32cb27da554639a0c0a414a9a51de34cc648621378a285b +01eb00000000000000fa842d95c2f84cf9739ee10e45888d23cb01e7537ed6c58919db85ae1fae3f22985434a2aa25b279b52f814f05f60f1bdf18b37c2fe00c2f36dd6afb9e9bcbe347c90b475ae48955144c89f109d4e291cd99b18daa59c2f41c753596e6cb2b252a01b77b4ee2fd3554f5bc8f20982b4135f49a7364ecd281575d3e83c360f3a0586e565834a7620b30ec0077281f9e22385a0f4797b6cee99c4860f520e09c2ee34c4f31a2cd17aea9d7cfca96e1e9ab3d46bcc6fa76e56a26db96a06a83f728e71f40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000082dee939cb89ba94daf1d6dcaeb0576dfa52a914c2d0a2807ea96d96bbe051eb862be77b0509a7be112063d5ffb3c328 +01eb00000000000000fab77b4ee2fd3554f5bc8f20982b4135f49a7364ecd281575d3e83c360f3a0586e565834a7620b30ec0077281f9e22385a0f4797b6cee99c4860f520e09c2ee34c4f31a2cd17aea9d7cfca96e1e9ab3d46bcc6fa76e56a26db96a06a83f728e71f0181831c806b72e16f4c86c1f3c3d21848bff839558a08f64de5ced8b34eb13b2812ae003b9dbf2eabe0e974a209eeb39e0322da840489781a357803b4cf16288adfb060d16bed494c9474d3343aa182a2e51a75d9c8a219171a333e21d02263bb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000960ce51eab4335c4f0991352f891a1228595a9bd90dd9ab8b115768c90178b40a117cec2f9cca8256717e3e636a0587f +01eb00000000000000fa81831c806b72e16f4c86c1f3c3d21848bff839558a08f64de5ced8b34eb13b2812ae003b9dbf2eabe0e974a209eeb39e0322da840489781a357803b4cf16288adfb060d16bed494c9474d3343aa182a2e51a75d9c8a219171a333e21d02263bb01b466bfc5caf876637b3d514dda309cc00877ae33f13c70b23552b3ff0a74539cd3c820e2ccdb2bd7b3c5ad7218e4263618cfe690a73ab6fb1a84c9d0505972938cd5509565235cdad30741a614ee9d6dfcfcd46de4022ca52373443b11c6c6a340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a85db6bcc72a43ee9218afe4e641a32e6250b2bf0ac24451c260e99e6c8698fda46bb634b3c3de5e3225088c81da33e6 +01eb00000000000000fab466bfc5caf876637b3d514dda309cc00877ae33f13c70b23552b3ff0a74539cd3c820e2ccdb2bd7b3c5ad7218e4263618cfe690a73ab6fb1a84c9d0505972938cd5509565235cdad30741a614ee9d6dfcfcd46de4022ca52373443b11c6c6a301ad8533139e5d66dad1b63e11b548aeb579eb3f485601fc70888287e3105c066d0428627fd44478e89e01defb2abe527b114164d69d2ffcef1563aa61d5e49b1eac3c14fb287aa139a7ce70c748f62815395b2c1d2eb04f384645ff5d839fe57440420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000acc84d981bda3b5374fb1e851635872e1eb1f703e4a561d0bcab697b39a448b68434c3c91a9bb396ab144d2af149ceaf +01eb00000000000000faad8533139e5d66dad1b63e11b548aeb579eb3f485601fc70888287e3105c066d0428627fd44478e89e01defb2abe527b114164d69d2ffcef1563aa61d5e49b1eac3c14fb287aa139a7ce70c748f62815395b2c1d2eb04f384645ff5d839fe57401a8aa762439cfb3ad54177030e59db0874cbc484029fd3c48ea9d36debce777e3bd834c46288b8282843ef40cf7d85ddb0e4d286642cea988804c87e1016a68dd45cde02645e6e98fc0eeadcd68cb156b9d402f5a7fe96041ed0272511091660640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a5b4b4b869ff8e4afe1f576301b0743f3576f494ab6444a7411edb32b8b0cb6708a7c3e4534df587094bf0dcf294bab3 +01eb00000000000000faa8aa762439cfb3ad54177030e59db0874cbc484029fd3c48ea9d36debce777e3bd834c46288b8282843ef40cf7d85ddb0e4d286642cea988804c87e1016a68dd45cde02645e6e98fc0eeadcd68cb156b9d402f5a7fe96041ed0272511091660601aa6e391c91601ce3dad444d526def3b1ff1e922d34f0d05c3091ee2af235cc8fc6c031256c0486e32c75f86f45d0f79311e60250b8e905abbfef85394288a6696a4bd38ec75ae9bc98c9ef922f3adb35b580221ad2f538a0d3a705f0f6a1c0c940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ae55f9c493c27eae2d22c6392942ac9ab896edc5bab2af97b856f5100aa73d665b87bbe4bb0606bd89f800be1899fd03 +01eb00000000000000faaa6e391c91601ce3dad444d526def3b1ff1e922d34f0d05c3091ee2af235cc8fc6c031256c0486e32c75f86f45d0f79311e60250b8e905abbfef85394288a6696a4bd38ec75ae9bc98c9ef922f3adb35b580221ad2f538a0d3a705f0f6a1c0c901b5b4fa146ce040a4515b233e6d2f433fb07de0792a02d525eaf1bebad079e8215d0ed09214b7bff11971045b9ab32cd4143a4b7c53539bba0a7996de8f4865d4a5df2e63be5fd6258dfa3ce45871178efeec1cad6199a8e015a937b18385d63b40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000aa5b1d8f7928fd562031f0b9db5c863b59a444a38e5295c83e3c65a45ba4877cbdd502fac40f998cb82c308974ce537b +01eb00000000000000fab5b4fa146ce040a4515b233e6d2f433fb07de0792a02d525eaf1bebad079e8215d0ed09214b7bff11971045b9ab32cd4143a4b7c53539bba0a7996de8f4865d4a5df2e63be5fd6258dfa3ce45871178efeec1cad6199a8e015a937b18385d63b0196e56fcf360d56b5de10fa6aa6e8008f32aa9b210c85d135723061e21c1ade5317cde980b672cea87733df0e81f704e618e09c8ae089813b68b1855b7e82e249d318d7f959a1ba362738e3de2f47de1ceac99919168ad9ed801d0f5597bd8f5340420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a45b54e04586dd73210c8012459dbe50acc0ed01cced76725c884874c41a172f5ff7ea9c8d30993b1d73d38257e2fc5e +01eb00000000000000fa96e56fcf360d56b5de10fa6aa6e8008f32aa9b210c85d135723061e21c1ade5317cde980b672cea87733df0e81f704e618e09c8ae089813b68b1855b7e82e249d318d7f959a1ba362738e3de2f47de1ceac99919168ad9ed801d0f5597bd8f53018eb8f62adbf34801040bd866ae138e3e727a64b901b1195d521c6588880efadb84d131527a9a5efe9a37edffc3f6d98c160b00c7541fe26c27dac4ae4339dae34868ab657d1df65e385deba78aa548a5d4eb165fbdfc0068ab02ed18ba05869940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b95b920d4da2bf8d69bee3e47871e12c990fd90f5dc65b80ced42b98b60af1fad944e73237f3f254f25bbe03794544d5 +01eb00000000000000fa8eb8f62adbf34801040bd866ae138e3e727a64b901b1195d521c6588880efadb84d131527a9a5efe9a37edffc3f6d98c160b00c7541fe26c27dac4ae4339dae34868ab657d1df65e385deba78aa548a5d4eb165fbdfc0068ab02ed18ba05869901b9174a0fa4cfac258271eb5a17ad68801288a69bb26aa75ff62c90b8fbbe2ee7829ee1f41e3863e3cff77e65ae718c03001619e80569ea2ad54e4e424ea387c5ab265b3d2dfa55835c5c21e7c2abcef91e1ecfd325ae36135721aeb0ad9fb59640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000921e41263de7e58e58797ac94ac1ea8da66c9bdb881a6abf965be4978e281042a6bd09ff8d22468b20d5dce21441861a +01eb00000000000000fab9174a0fa4cfac258271eb5a17ad68801288a69bb26aa75ff62c90b8fbbe2ee7829ee1f41e3863e3cff77e65ae718c03001619e80569ea2ad54e4e424ea387c5ab265b3d2dfa55835c5c21e7c2abcef91e1ecfd325ae36135721aeb0ad9fb5960192082a1f4fdc82eec7070cdc0311e65e5346ca8fe4012ecc935373483ef2c70dda8c2d3803261c095b6085f9bc01c4a30b663c586dfba34c5afc169ce950ec64b462199310b4c9b9b0c383377b5e868afbe5b2a977d5cfe0a706bc0674ec69cc40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a3945fdad72ac25735b87c4b8bdfbb4abca860081f3140d7c64a43c987fcc6965689d41e5c9f32732e05b8573943e899 +01eb00000000000000fa92082a1f4fdc82eec7070cdc0311e65e5346ca8fe4012ecc935373483ef2c70dda8c2d3803261c095b6085f9bc01c4a30b663c586dfba34c5afc169ce950ec64b462199310b4c9b9b0c383377b5e868afbe5b2a977d5cfe0a706bc0674ec69cc0189c05652e960b4a7525f336a6e1efe40764dfe9a9eb89392bd814c84eca361a9eba3e22c09c721ca306e4ebaffecdd0c0c63846e46440d0161d20b43a75c18e90ba93f4ca0a4485d51ae29cc0a2ea8e660ddbcd1307524b4a286326316e66fd040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b95092122569b2b2f716ac7ca38efeaa78b8de60fd99c13200b3b8d4682b22438082bedc5f960e85e4712f438b9703a6 +01eb00000000000000fa89c05652e960b4a7525f336a6e1efe40764dfe9a9eb89392bd814c84eca361a9eba3e22c09c721ca306e4ebaffecdd0c0c63846e46440d0161d20b43a75c18e90ba93f4ca0a4485d51ae29cc0a2ea8e660ddbcd1307524b4a286326316e66fd00192cf863e45a1874de11c3703031d47f3b651a5d0c8d1030338eb65c03843984f0545c13df630cb3235cdb40856aadf5c0a0068a33d06e18147d93ce012a85791f358d410c726131e85bff2cbc393ba5bd563d43a60d796259e528e2a01aedaad40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000086d2d1d446a5ae42c0578cb5d3357667441fc29c35ae8db6e95429103de9bdd23b1002c4f71a7e7d1f0b20a47b43e755 +01eb00000000000000fa92cf863e45a1874de11c3703031d47f3b651a5d0c8d1030338eb65c03843984f0545c13df630cb3235cdb40856aadf5c0a0068a33d06e18147d93ce012a85791f358d410c726131e85bff2cbc393ba5bd563d43a60d796259e528e2a01aedaad01b788905c2f2de91dcbb558ad5126749c962676f7734fb84b1d0bd4d1d24138513fd7a0ea52215595f54eb03a53276f4609a31140b756959a3ec693bb70199edc976debb75dd6fabd6881297112dbe13bd7fc227f9191c9a9daa309d7fe97186f40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a56dd1fd244b6f4a295d608bc63514aa1446fb9a31a7bb06e6178ecc6bd21e6501ee9f58e1c429d62f7bec9805cf30da +01eb00000000000000fab788905c2f2de91dcbb558ad5126749c962676f7734fb84b1d0bd4d1d24138513fd7a0ea52215595f54eb03a53276f4609a31140b756959a3ec693bb70199edc976debb75dd6fabd6881297112dbe13bd7fc227f9191c9a9daa309d7fe97186f01b37108dc3a0312cb00de57234b987d35f145d4d1ac60dda25a39e1f08d5cf88330be28f07204d9e4a1a79b5a6b59461800657df37e09b0b0882ca7cbd160ada36c1750954f292c1cf218b11416c99c70d6b85ae284fae829cffe9bdecda4560140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a5dd3df03ee0c609816d5ab1f12d518de230ffefbc2cb67c18052b024cbb738db30d18adbfaf2b62cd0958b52a32ed63 +01eb00000000000000fab37108dc3a0312cb00de57234b987d35f145d4d1ac60dda25a39e1f08d5cf88330be28f07204d9e4a1a79b5a6b59461800657df37e09b0b0882ca7cbd160ada36c1750954f292c1cf218b11416c99c70d6b85ae284fae829cffe9bdecda4560101b380ee5be0c99e515b6dc0ab74e8ce7ddb1d8c860291f2d868fcb7efdd79bf66038a749860868c80d32b33502808cf7b0f78852892ed5c5f9fa46466e8b76ad52e135d0fe80b377bb4bd1c0d1be33a4669562db4d62a353348aefa6e51b9091040420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009494e681ebe765922f42a14faf9a18e318e1e15e6c54451ab55f56444a3589558c826887cbd14d2d1623c83f5a91b9e5 +01eb00000000000000fab380ee5be0c99e515b6dc0ab74e8ce7ddb1d8c860291f2d868fcb7efdd79bf66038a749860868c80d32b33502808cf7b0f78852892ed5c5f9fa46466e8b76ad52e135d0fe80b377bb4bd1c0d1be33a4669562db4d62a353348aefa6e51b90910018ea0c4f75df9f4663ee422e91064c08d3a636833c83aa1bf7d7830641079c2bb66723b135f21447b4d9d8667aa18669a17c01a087075a41b507bbca1de4788cd76395e043658401be699cb9fddaf8dfb93797fbba2cc63eb6320fbe438c9972540420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000099a6961675c37d0918c33bd37e58d1ef8badb98b9cab7529082c7be4c9abf3b2f8c3b6b510f63afe32ddc48aea68e19f +01eb00000000000000fa8ea0c4f75df9f4663ee422e91064c08d3a636833c83aa1bf7d7830641079c2bb66723b135f21447b4d9d8667aa18669a17c01a087075a41b507bbca1de4788cd76395e043658401be699cb9fddaf8dfb93797fbba2cc63eb6320fbe438c9972501810071e338fed3022b5aad0eb4daadc215ffd63375cc6f6d7954df38bec79f0ed47ea9f655b5a284cd55cfa213fd93fb0e45b12e53e8298e4c6fedb52cb705cb5a8e019f9bb842581836fbcfe3996834c220f096fd5a916ca6e16b9bf3e1172840420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000af444be6259d907f44fdd81508de547fd5fa74e65757fa462b4dd8cb7d8da82a689e01862cb807500e1171f3dd72d348 +01eb00000000000000fa810071e338fed3022b5aad0eb4daadc215ffd63375cc6f6d7954df38bec79f0ed47ea9f655b5a284cd55cfa213fd93fb0e45b12e53e8298e4c6fedb52cb705cb5a8e019f9bb842581836fbcfe3996834c220f096fd5a916ca6e16b9bf3e11728018edb61724d977ddaf3fb94872ca1b7e12ecd7e891d96549cff9f133704df96251b71062614ee3f4a7c81c418e66363530e08fc029a2fd1b465ebdc54ab567eb0615c6e7c79c4dea44aefe1b95bf94e31d265ba2cdf20bdbcae2f5960b094839740420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000080b444e3f29b1af20120a34b3de4aa123bd1abc4c17be12fa6e98e4fc20bbf3da6d09da737fd06dc27ca1f09569219bb +01eb00000000000000fa8edb61724d977ddaf3fb94872ca1b7e12ecd7e891d96549cff9f133704df96251b71062614ee3f4a7c81c418e66363530e08fc029a2fd1b465ebdc54ab567eb0615c6e7c79c4dea44aefe1b95bf94e31d265ba2cdf20bdbcae2f5960b09483970187f54651e27d510193f50ebf6f033ce249081c9fd18fc1a05a4f8d1a1654d8c31f2e16bbfd94f89f035e79d387a86a6518801714942af5d5eb1ac130cdca53f115c899b1ab8aca2cf48aa10ce0d437677ac9be86d0cbc5be926c23e9b14eb5cf40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008fdcfba3cf1f92be7d7f582f7b965ea6f575163badbc411bd0b8e2abdcf9aaedb1c2fb984c300e41a0c6f6cd55c74b4a +01eb00000000000000fa87f54651e27d510193f50ebf6f033ce249081c9fd18fc1a05a4f8d1a1654d8c31f2e16bbfd94f89f035e79d387a86a6518801714942af5d5eb1ac130cdca53f115c899b1ab8aca2cf48aa10ce0d437677ac9be86d0cbc5be926c23e9b14eb5cf01aa14153c5ef154e67ae390d79718d245fd9ae631ba3e2a7dd57c3e62e7f8cda529d678212101f18ac06685e04390565a099336f7fae35a8f128c1661f1bdb9ee4ca4b691d1946e963a14d1d95e013d8583a13540cc0123ef16454a1af7fd2c2340420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000095756097aead03edd66ee82852da88ac4d7d0c2c4dab5a8eb86ab6f78245273e7f354c76138f8c6a705b20a2a4e21eaf +01eb00000000000000faaa14153c5ef154e67ae390d79718d245fd9ae631ba3e2a7dd57c3e62e7f8cda529d678212101f18ac06685e04390565a099336f7fae35a8f128c1661f1bdb9ee4ca4b691d1946e963a14d1d95e013d8583a13540cc0123ef16454a1af7fd2c2301b5060ee6040cf10d90a7fc7583186fc50306825ac4606ef665e58a9caba05d5622b88f9d606f2afbbbe44dcf1b5822360a063a25daffb180173efa5775e9beee155bb925c0b488f1bec30c8565c026ce61c12f4f8d00b7d9d1712978af47745540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a89e2bb0fa592796b7111b2458ff526d267dc7a23dc1886df4657dad7d6d9399220eea40560dca4fb514caf19ebbda45 +01eb00000000000000fab5060ee6040cf10d90a7fc7583186fc50306825ac4606ef665e58a9caba05d5622b88f9d606f2afbbbe44dcf1b5822360a063a25daffb180173efa5775e9beee155bb925c0b488f1bec30c8565c026ce61c12f4f8d00b7d9d1712978af47745501a5d9545148567e0b2b2e86498eaa9a97021203005cc3e2faa17c87331781423f20034fd521ae99de2dee13f02a6f988a16981558d4e36839eb396256f5077de223bba679a493350057f24fa39156c0f6e69b78ea03278017e8185a9cfd8224c540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b9172c25e6321d3565e436f80669ceafcd7872eea8b9edac6dda7481fe4565de529ea60ecff300d565e6b27598d0950d +01eb00000000000000faa5d9545148567e0b2b2e86498eaa9a97021203005cc3e2faa17c87331781423f20034fd521ae99de2dee13f02a6f988a16981558d4e36839eb396256f5077de223bba679a493350057f24fa39156c0f6e69b78ea03278017e8185a9cfd8224c501ab297159791a4221baf2a866327173c95afb8f7e137194ff60e1b00403e2187970703d089a85476f968de7e1c8a59dc90e299d86e342ab4b6e9fb41463608ea03858141ccdc536e9a14cb11754449f7d120205ac3a5175d280a4d16fa4292b3140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b35775f70b7cae96269abe262035388f06b4c0e421e014ac36151ef701da548f64462d20d0c48366b8de5175aaaffb5e +01eb00000000000000faab297159791a4221baf2a866327173c95afb8f7e137194ff60e1b00403e2187970703d089a85476f968de7e1c8a59dc90e299d86e342ab4b6e9fb41463608ea03858141ccdc536e9a14cb11754449f7d120205ac3a5175d280a4d16fa4292b3101912083dc1244e717312e2e8409066e0b45105066427fe8d71a8668c7b2f54543e0534f70518a86181b14e05aa3bb294c1320b80306b8acfca91c0f13ec371f12129aef9b631f3a063f65784d8e72764db85977a2bad47d1f51780f972cef023840420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008985196d3b8a4ce5c99b566b5c8c23cd962ef8f1895875e83429d01106d7df56c5a3cf6bd079ef5256846d00711bded1 +01eb00000000000000fa912083dc1244e717312e2e8409066e0b45105066427fe8d71a8668c7b2f54543e0534f70518a86181b14e05aa3bb294c1320b80306b8acfca91c0f13ec371f12129aef9b631f3a063f65784d8e72764db85977a2bad47d1f51780f972cef023801af5d3782b73bd568841499ebf3fb651b147ae6fe13cc17cb0e6055e909685981c9b3b11adc063c8b817a472d238293c010d8b8d9b8bb3b4222d2ba3d0b8bc14b0a33aefad31671844d506fd21c931b3809c40105c374870e2a631d974f7c3f8440420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000087ec6b55b568a85e54019dc799dd70a74387eb5a1add12e5f35f0a9a0a98b9347f5c098c4be9aa3376f7469827c54355 +01eb00000000000000faaf5d3782b73bd568841499ebf3fb651b147ae6fe13cc17cb0e6055e909685981c9b3b11adc063c8b817a472d238293c010d8b8d9b8bb3b4222d2ba3d0b8bc14b0a33aefad31671844d506fd21c931b3809c40105c374870e2a631d974f7c3f8401b1275a92da6f74da25e08404ac325019af00be8abf5a7e6b8cee9543de3e208b2bbec9dc5d7bad7f6a280660bea799a50396367636b8c17a1b7c3ee4727e68446a45211f4f9899e0f297a5698f98e935d08379567a26b956825962ed04ba97eb40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b4f9f0ebf4d6b4626b5d4e96f92dd3150daeda05fdc144ff79eaed002ca9ae925116b54cd98694eb2f8a1140eebf03d6 +01eb00000000000000fab1275a92da6f74da25e08404ac325019af00be8abf5a7e6b8cee9543de3e208b2bbec9dc5d7bad7f6a280660bea799a50396367636b8c17a1b7c3ee4727e68446a45211f4f9899e0f297a5698f98e935d08379567a26b956825962ed04ba97eb01a191e04fdd20d0bee8efe762cf13603b78c6e61b90f6c976c4be25348c53ed7cad8b05cc137ab029e605d8ad63e8bb7f001bd9c0a1cab509d0e7780d0493ce68efd02007fab9c1d164b765fc8598b4a1ba1bae694689e5753cbc7c29ae47de5040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000adea94e7fdc156b6a23c38fa23111462f4547bfe136bc50cb2d53035ffbae29f61472fdcc13b3050614fe018e4ee5de9 +01eb00000000000000faa191e04fdd20d0bee8efe762cf13603b78c6e61b90f6c976c4be25348c53ed7cad8b05cc137ab029e605d8ad63e8bb7f001bd9c0a1cab509d0e7780d0493ce68efd02007fab9c1d164b765fc8598b4a1ba1bae694689e5753cbc7c29ae47de5001b065f8cdc26fad7d6737b11e7b0289a9cce3d13d7b772f6eff441f83744984932b9db6994795f45b36ddaddcf1115ed20f8ddde5c7f258644db26c64b43ab9e4fcd7def04be4357aa037d7754f81862c190c31e0af508dac1187fbe65059fe9a40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000094ffda27974773c5b30674668913517d21494ffab6d2a21cd1c9037c541dfb493b9c85c5d646aebf27970354ab367f15 +01eb00000000000000fab065f8cdc26fad7d6737b11e7b0289a9cce3d13d7b772f6eff441f83744984932b9db6994795f45b36ddaddcf1115ed20f8ddde5c7f258644db26c64b43ab9e4fcd7def04be4357aa037d7754f81862c190c31e0af508dac1187fbe65059fe9a01a4a36d2ebbba0b101b685651dddea0d3bc897b949ddba4ddf6b717939280de64f9b03c3367170d70e2f82cf18882d1b9112166231cae11ef914df20d74197e5f15cc82ee7f100e743e4dba3281f17b32773fd850dde3363f8b268b6583dc6cc840420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a7dde160dce45113cede46235b9c4e1ab40deb56c1acf8866ef8ca42b0bf7b326f3cd4a04d644d09dc645a314806cd86 +01eb00000000000000faa4a36d2ebbba0b101b685651dddea0d3bc897b949ddba4ddf6b717939280de64f9b03c3367170d70e2f82cf18882d1b9112166231cae11ef914df20d74197e5f15cc82ee7f100e743e4dba3281f17b32773fd850dde3363f8b268b6583dc6cc8019571a5f4a8192b2944a0e1ac9195b2f3f81182fda0c18ff5c7ece42c83f0f83005fc32317021ea36aece781a83240af10d1c53c0d4eeeb3a1af932841c823b6685705f6ad0c6e8f259f09a8845a4a08aaaab9cfc2c54e855204c3a83d8bf8ab140420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b31069e58321031c268ae43d6acf2c07092638df774b6fd2b45776aeb3b0834d9c7d37a276bc6d5cf9ae922b7a803373 +01eb00000000000000fa9571a5f4a8192b2944a0e1ac9195b2f3f81182fda0c18ff5c7ece42c83f0f83005fc32317021ea36aece781a83240af10d1c53c0d4eeeb3a1af932841c823b6685705f6ad0c6e8f259f09a8845a4a08aaaab9cfc2c54e855204c3a83d8bf8ab1018a2a776459786bd1a382fa9da3b4f3f4fedf9d268b9c069d320f51b2246d1d87596edbf7e910fc4f6610350ab4b6e9dc0d4fcfb475d78de1677466367687f5a21c11ec6757b1e2811317f327b991eaddefac2ebb05582197cf4df13e9f7bede240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000962280777090e153c6c32130bde554e319437f4463da3bd9ead63f4e9c67ebb691de6dde4fca50fad243db953b12ea94 +01eb00000000000000fa8a2a776459786bd1a382fa9da3b4f3f4fedf9d268b9c069d320f51b2246d1d87596edbf7e910fc4f6610350ab4b6e9dc0d4fcfb475d78de1677466367687f5a21c11ec6757b1e2811317f327b991eaddefac2ebb05582197cf4df13e9f7bede2018248093de6a5e86314d66ec0f1cf09822d1b975163fead31e92745e24a1c48192a0cbe2ed7e71793aef1c43a340c0fcb0082f6abf7d0799422adc3c6fa7718c0f84b580a26d9488f35d417b43a62cc79b50d92b275d0413c7a1c00ed90ca379540420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000081d2586b33b0b809e78b3a2c3d8722400ab8c22cfce6475d29c8fdd04ae4a0fdf62e713ff6a6d98f7d13db3728f26ed3 +01eb00000000000000fa8248093de6a5e86314d66ec0f1cf09822d1b975163fead31e92745e24a1c48192a0cbe2ed7e71793aef1c43a340c0fcb0082f6abf7d0799422adc3c6fa7718c0f84b580a26d9488f35d417b43a62cc79b50d92b275d0413c7a1c00ed90ca379501b4e8b32b323a77ca7750b37128afd1fe3e4d184c5bedfd6619dfc1f64afbbd864d324423fd005a6dfb93d0e9dd7031540212f96092ada6f1c8f73b69290eb813791fe73efc5009185d5694182e85588b674c5aeed021f9921a6acb323fe6cd7a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000adf8cc8984e097d07234c119851fed9f2b65d82d8bee769228b07a016f4aff94c12bf1cb885109d5f04fa5d4140ca8f4 +01eb00000000000000fab4e8b32b323a77ca7750b37128afd1fe3e4d184c5bedfd6619dfc1f64afbbd864d324423fd005a6dfb93d0e9dd7031540212f96092ada6f1c8f73b69290eb813791fe73efc5009185d5694182e85588b674c5aeed021f9921a6acb323fe6cd7a01aa33e2c3123e426f8007fb05cdcee119237dc1eec67e1a53b8e120bf315669673d449ca957c12f98f71a053dccd221a80287945992ec3933e3d5807768f9391cd9fbeda7b133e14453079b85f62298cc6fe92e075db9e90ba8ab07e071f45f1940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a2095db8329e1387f48bf8c6d5323166250f8cff8def9f5d5e10d3404ec49f167d0eb5fd1b6e9a476bffeed595d31b65 +01eb00000000000000faaa33e2c3123e426f8007fb05cdcee119237dc1eec67e1a53b8e120bf315669673d449ca957c12f98f71a053dccd221a80287945992ec3933e3d5807768f9391cd9fbeda7b133e14453079b85f62298cc6fe92e075db9e90ba8ab07e071f45f1901927dc8acdab4a63bbf57514406cba2cfe4b2edc2d14b1fc225017732cc46c9b961877c0fdcc08e97c5b743322c24bd030a98dd7e6ba3c6cead352954d51f9dee62c38f682a872372dab67611b7b481e612f8dae4163206b123fc7e6369e8219640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a92340f139e7f7a7f9219c15f47cd9910ee6d92a0e5c7cba5218865a6ad4885b0f4705d65d91d0fd365acbe46f25a708 +01eb00000000000000fa927dc8acdab4a63bbf57514406cba2cfe4b2edc2d14b1fc225017732cc46c9b961877c0fdcc08e97c5b743322c24bd030a98dd7e6ba3c6cead352954d51f9dee62c38f682a872372dab67611b7b481e612f8dae4163206b123fc7e6369e82196018b13dec1e65b5cd9d2e62cd0da6ab5641986a8c6116babc3f53d311f8b235928becf0b90af6613bd52f2970511dec81c14c0bc1f8bdfed0399fa4d844d271abded77a05ae57c067b9ee5223053f5bddd5a7f627b3d8a12c5234f1cf4c75d116a40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b9285cea3f1b6d725c4c0e1dbf3418301ae5a7e795e179522da5d4b501ef45819410794d26bd44443f4221cba490570a +01eb00000000000000fa8b13dec1e65b5cd9d2e62cd0da6ab5641986a8c6116babc3f53d311f8b235928becf0b90af6613bd52f2970511dec81c14c0bc1f8bdfed0399fa4d844d271abded77a05ae57c067b9ee5223053f5bddd5a7f627b3d8a12c5234f1cf4c75d116a01b3ec482a649fee0eb4af237daded7caf2c782076cd78212bbb832ece6cb29e68b9ffc8741b7ad4dfb32acae3df4c91a90f453134e01ec3524ece4548119362b81a5313bbe0f3ee2938517bf048b53ce62ab413321791d2b1a8ec68e90847697f40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000094ef13576cd36beebc8e44895c46c4ae918d403d370ccc54ddf823b3b75e3efd94f26c2285640c71e80ae7b4843a7589 +01eb00000000000000fab3ec482a649fee0eb4af237daded7caf2c782076cd78212bbb832ece6cb29e68b9ffc8741b7ad4dfb32acae3df4c91a90f453134e01ec3524ece4548119362b81a5313bbe0f3ee2938517bf048b53ce62ab413321791d2b1a8ec68e90847697f01a6d070edf3915837e8c062e1ad2156ad1d194faddcf0bcfc4d257f5b97b26d9f87f90526ccfc3e788db18496e0726eaf0707082f2d3321b7350c18f458c649be00c7393596c9cd6849bcbcfa2280d461c63840c86bc4554024ef9677f312804640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a7dce45ce236e68f8fcfd9be1dad63ab28e181a146efb8500b90d5aeac7681ad4d3c4c78818a3a1488134832698fb2ad +01eb00000000000000faa6d070edf3915837e8c062e1ad2156ad1d194faddcf0bcfc4d257f5b97b26d9f87f90526ccfc3e788db18496e0726eaf0707082f2d3321b7350c18f458c649be00c7393596c9cd6849bcbcfa2280d461c63840c86bc4554024ef9677f312804601b5737fd0219f73f3bb07849b98c8e4f98943baf42cd80a352efcb00125d8eb3c72a5f5f7ac96ff13bdfb3c8ca858aec7076c8a45f61b7dd2b2645eb9e4683d5058cc8238658fab4f06cc6fa60154acd9a08fe321a172d2ed89b8f47279cf21ac40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008dc731bb2309e5b540a889d31b0adc15755f917f32eed41e3ff01ef9b41f057f654df05f3c916d0809836bf073804643 +01eb00000000000000fab5737fd0219f73f3bb07849b98c8e4f98943baf42cd80a352efcb00125d8eb3c72a5f5f7ac96ff13bdfb3c8ca858aec7076c8a45f61b7dd2b2645eb9e4683d5058cc8238658fab4f06cc6fa60154acd9a08fe321a172d2ed89b8f47279cf21ac018e00153c3ff0d4acbeeec3b9e5087d77fcb271778f3d1abfe9845f26ec53c7d55228aabe0d33f9de0734b2efb53b5af118a3b99acd4e5b573e9acad1480e5105fe4a66e1760907af3c3a4875f91e63538e8e36413e07fc6e3e42a639b106a6d640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b60fe38366c2ea62c4c5aefeddbce5d23fa688c6e543fb417a9bdb97ea08005b533dd6642e2e73e2e92d399b53873fa0 +01eb00000000000000fa8e00153c3ff0d4acbeeec3b9e5087d77fcb271778f3d1abfe9845f26ec53c7d55228aabe0d33f9de0734b2efb53b5af118a3b99acd4e5b573e9acad1480e5105fe4a66e1760907af3c3a4875f91e63538e8e36413e07fc6e3e42a639b106a6d6018cc68fa0339be31f9a0b0bebeddbe0362a0402d38a11637c07902412fe99df492b8f243b5ae6cb12434b24c05a96ee0005a75854e3a7ea1310464553f867566564587e6d82a910929a43779901894c97e4c32b8e52cd804723afa051a2ac4c1040420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000927bfb94213cbc48ec4e269a4f97e758bcdc92fc033b304ac6da7178aec7f996e9910516a379ff221fdf0c30db3c7cc7 +01eb00000000000000fa8cc68fa0339be31f9a0b0bebeddbe0362a0402d38a11637c07902412fe99df492b8f243b5ae6cb12434b24c05a96ee0005a75854e3a7ea1310464553f867566564587e6d82a910929a43779901894c97e4c32b8e52cd804723afa051a2ac4c1001963af41e23aa1ac5db53b304b48cfefc08711ec031d7192447a3f6ae66c382775c3b23bf6aae50b9383febbd8a4ca68a0a99b39199f6c5a4e3ac1bba87bac0324866e26f25584f6c3e88c69e8f3a6e1abd27ffa8d0db39bbae16acd1071794ea40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000081110698b03470342a60aabe3ebf0f87c8de863377b0a83d04814f312d5332730bdb3d65e1f616ef05b9dc83b98d5d75 +01eb00000000000000fa963af41e23aa1ac5db53b304b48cfefc08711ec031d7192447a3f6ae66c382775c3b23bf6aae50b9383febbd8a4ca68a0a99b39199f6c5a4e3ac1bba87bac0324866e26f25584f6c3e88c69e8f3a6e1abd27ffa8d0db39bbae16acd1071794ea01b7a48e6b8ab8d373570ac7c49bf87f50e8ed96b8f85bfbf3cc876ebd109cec31ca38a5d5b7af312471b74f364565ab0317d33366bac87779a0a580147bd3cf4e655ab115a9ef34708b1dad09dfb3440a359789faffbcd6616a3dad4bd778c2c240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ac39423a304fe2807a8361d116b20f930e6f233893f0f1b76fb23eaf94f0a0193e6278b70f4067b017cec7c9ac0d9514 +01eb00000000000000fab7a48e6b8ab8d373570ac7c49bf87f50e8ed96b8f85bfbf3cc876ebd109cec31ca38a5d5b7af312471b74f364565ab0317d33366bac87779a0a580147bd3cf4e655ab115a9ef34708b1dad09dfb3440a359789faffbcd6616a3dad4bd778c2c201b6254baa4a16e32e9ebfc5170aca4b30fe320017ed4a59470973ba89b00379e8c004557259ca2e159b4189d610fe7f9409adc8a4339a315d513c18c53734ea2f27e7b70f4ca1abfe97291f0a3ac7042b220dd3ffb2a2ed78fa19ab7b5f83804540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b6d3482b9594984f52443d3d8bb2e13d3e251f75c73e9a86fbd7e699e19ee40a31edf7ca47ed5fac0d550dffea67b91d +01eb00000000000000fab6254baa4a16e32e9ebfc5170aca4b30fe320017ed4a59470973ba89b00379e8c004557259ca2e159b4189d610fe7f9409adc8a4339a315d513c18c53734ea2f27e7b70f4ca1abfe97291f0a3ac7042b220dd3ffb2a2ed78fa19ab7b5f83804501803684a80adff86234ae0b5427d228bf46a0eabac52293644343fac42ec82a3f3794c7c59b9043f2625694d3ad3a39df180cc4a79c30a7d81a48ed440db5e577e0f9c0360b9315f947dba078a25590939536edfca7b18e5cbeee9fa508b4bb7240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b9471bd9a10cec80d396ecba6682e49128b7d5fc4640e108538dae9172e388fcbaac2d4d070b9eb4cb45106de605f19c +01eb00000000000000fa803684a80adff86234ae0b5427d228bf46a0eabac52293644343fac42ec82a3f3794c7c59b9043f2625694d3ad3a39df180cc4a79c30a7d81a48ed440db5e577e0f9c0360b9315f947dba078a25590939536edfca7b18e5cbeee9fa508b4bb720196212323bac6b5e2e6536121eb52c65844bd533b8de6c78059d41cf9fbd414c26ddc6945b1db197e12ba2ce5f9175e7b036669d11da5c228363defdb71a5592e00df7c6c3168b11a385480f74034017ffd640c1a14ad76b62a597dc0b02926dd40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ac07582460e01df3126176a07a84d0548b5309c79fb75068a28f6f4ea3ef2c6f076fe8ed62aa8ff0790082b4105eff1a +01eb00000000000000fa96212323bac6b5e2e6536121eb52c65844bd533b8de6c78059d41cf9fbd414c26ddc6945b1db197e12ba2ce5f9175e7b036669d11da5c228363defdb71a5592e00df7c6c3168b11a385480f74034017ffd640c1a14ad76b62a597dc0b02926dd01899e64a0ea0178e09965c763d9231e319a5314b6fa1b7e6ddc69571d4e0017cd592da1a38893b288655b608fd435414d0bb6066ae4bfca448a3653dd9081fa10fe5924c37feb65a9fd40d4537787811e8984500bf992eb0d7d9b156ca3d9542e40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008692b7a2235755f771bce98cb37ae0e60cddeae9fb6de5f2616efee5c7125c4e98f289b987f9403ec81f607a3391f4a2 +01eb00000000000000fa899e64a0ea0178e09965c763d9231e319a5314b6fa1b7e6ddc69571d4e0017cd592da1a38893b288655b608fd435414d0bb6066ae4bfca448a3653dd9081fa10fe5924c37feb65a9fd40d4537787811e8984500bf992eb0d7d9b156ca3d9542e01b09232fac2f4dc06ed35592691aceaebdbe914204d6db4cb7966e8549c16df81639dfa4cca7ad387abf194f2aa9a6a3e0002e1e3d3e9d260bb9de47de04f3c4b64ca8724c6412b195e8a5a2e09cd120d18b14750e0c77701e80702a80d0cf19740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b1cfb04af232a91992b2b75d8d56a87fa45b784203229deca1946a786c11ccf8ef0da1023cfaf3c40ed7f7bd9e35b29c +01eb00000000000000fab09232fac2f4dc06ed35592691aceaebdbe914204d6db4cb7966e8549c16df81639dfa4cca7ad387abf194f2aa9a6a3e0002e1e3d3e9d260bb9de47de04f3c4b64ca8724c6412b195e8a5a2e09cd120d18b14750e0c77701e80702a80d0cf197018c7fd098c59ad95d7ed779570a01e291a1badbe9acde7474a4f0d5696bf8f249c7a9b6b414359088dc504892ea9209f0123d8a95437bd0587c390f2f990b04c272a50d0afe2fbf2c8413d55fda00a566442bf5bf76a669aa97a275985ad0f3f640420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000082945d6d97ff78297aca5cc4674546ed40fb8d7e4e67578a457f82bb4e048a81afd0e33481d7d1f927c021be82eaab22 +01eb00000000000000fa8c7fd098c59ad95d7ed779570a01e291a1badbe9acde7474a4f0d5696bf8f249c7a9b6b414359088dc504892ea9209f0123d8a95437bd0587c390f2f990b04c272a50d0afe2fbf2c8413d55fda00a566442bf5bf76a669aa97a275985ad0f3f601b9f213a0089a669561fe3abaaf1c50588632c457ceda29b9595ec545e0f30141dfd50ecda09af8d88593170e6d3995a5112be3e42c7e1e3146f59f9c028a26c97f6e505fe0e296f5e1c45a24eb1d675fca8de617d2701fda1ff020740f8ba79c40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008c93bf2d78f3b17b932017f03bde1a0317f2cdfe2e9e46d2847a836dd2de5fc8c65b8fefda5da535db390b298efaeb38 +01eb00000000000000fab9f213a0089a669561fe3abaaf1c50588632c457ceda29b9595ec545e0f30141dfd50ecda09af8d88593170e6d3995a5112be3e42c7e1e3146f59f9c028a26c97f6e505fe0e296f5e1c45a24eb1d675fca8de617d2701fda1ff020740f8ba79c0183831204787b6cff761e61157b7dfc17deaa91945ed20f21c072e25923459eaeb8a3673ca69069f3cef6f127ef6871d5027481c5bf49db28818717cda24ac42354ed7a2dbfc40d5a599581eab1a195970e6e9f00bb14a7f8cca313ca0fafdec640420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008acbe723306173803b3948da53354a2a21116ce7189efca64ba1001a4ce5e3621eef8b3ee94efe4c763e2f1d40c91757 +01eb00000000000000fa83831204787b6cff761e61157b7dfc17deaa91945ed20f21c072e25923459eaeb8a3673ca69069f3cef6f127ef6871d5027481c5bf49db28818717cda24ac42354ed7a2dbfc40d5a599581eab1a195970e6e9f00bb14a7f8cca313ca0fafdec601ae0bf8014acf2d6489892c2da83e0196558353f12928cf807f687f60917030aaa066b3ed8faa84297279503a036776c70a6c91b7f3065c0c87d4f26369b5568212bb0e1aad5165fb81536caa9865026694e6890405ed6dcc2a5bee283d8237e540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a1923a497dd17e6bba935de161340c08f9e47ab14469b46eaaf2a4cc1046dd278782e8f3384d22e2ad285c3ac5254afd +01eb00000000000000faae0bf8014acf2d6489892c2da83e0196558353f12928cf807f687f60917030aaa066b3ed8faa84297279503a036776c70a6c91b7f3065c0c87d4f26369b5568212bb0e1aad5165fb81536caa9865026694e6890405ed6dcc2a5bee283d8237e50190bded8a6919561a8beb2c4fac3792b0aa6dee67836fc305bba07b836d05e2df582a8d45ed52d03cacdd7a77be3afe8e185f4a7fa6979dbfb9969d2b68d52e7b1cf8d3ad71680f5d8b222fc4f713db2b3a0634378196795d20e293cbc70bb4e940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000895cbf3f82336934ea7d34bdd3933eea572dbd105ec77bd17a0d64e2582883f26522813456e59f0bbec21fa0b085f602 +01eb00000000000000fa90bded8a6919561a8beb2c4fac3792b0aa6dee67836fc305bba07b836d05e2df582a8d45ed52d03cacdd7a77be3afe8e185f4a7fa6979dbfb9969d2b68d52e7b1cf8d3ad71680f5d8b222fc4f713db2b3a0634378196795d20e293cbc70bb4e9018444ef39e0bbd22bc279b94d9b76347d0ac6d5ac456aece2407e0cfbacd6ed0afc0e65d675cb7d63155f04cb27f8ad7f091c5d7f77d4474427469760aafa3ba72a64437ceb74afc289bbcc86dd6db98f972deb2284c74be740938b4af5ded73f40420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000083a62048682986b7d2e27c2c5e00013533a91f3bf32794658d0507b301daf9f943cf7e0258987995e9daa2cccd345dbc +01eb00000000000000fa8444ef39e0bbd22bc279b94d9b76347d0ac6d5ac456aece2407e0cfbacd6ed0afc0e65d675cb7d63155f04cb27f8ad7f091c5d7f77d4474427469760aafa3ba72a64437ceb74afc289bbcc86dd6db98f972deb2284c74be740938b4af5ded73f01925cb1dc9b8bb3dba9695204f3a1ea9ddd9ff3742e34b9df47b417ca780f48104c5a576911b19653fe8e09aef49eb1d81393ed25f45c4230836a45995a6c66021c9453f7af2182a83a87635586bd283c925a93228069d7a52a05090b1403fa5a40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008836e7900a63b0df3dbed0503b3fd4dfcefea82caf14647e5eac202113cbc07a2d434f9149ee87694be3f9be91659855 +01eb00000000000000fa925cb1dc9b8bb3dba9695204f3a1ea9ddd9ff3742e34b9df47b417ca780f48104c5a576911b19653fe8e09aef49eb1d81393ed25f45c4230836a45995a6c66021c9453f7af2182a83a87635586bd283c925a93228069d7a52a05090b1403fa5a019031eb88bab33185963087e1fbbf96ce5cc153e6abcb02314ab4d0bcbc9ed301f6fa075185173d5b485e8ea755383cbd098878afeaf06323ccab122f456161d5d992e81aa8431eceba3840c1e95282a1bba57084b941645540182b0c352fadc940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000853dd7bd8a8842333496629f9e6b808d14e8d9c1413a4e76700bf1dc344f0d1f7f1360a020f9a61498b26edea7893a62 +01eb00000000000000fa9031eb88bab33185963087e1fbbf96ce5cc153e6abcb02314ab4d0bcbc9ed301f6fa075185173d5b485e8ea755383cbd098878afeaf06323ccab122f456161d5d992e81aa8431eceba3840c1e95282a1bba57084b941645540182b0c352fadc901a990c4c0750588c6922633dad84eaaee6178d7698aeee542bafdbb1ae0b654d4e03d9380fae87596235b181f8b71d51a11b316218b029e40ba3e54a52d075f12b8486a3e3975b916b0e6c1bc848da555275224005892b6f44fd063ae058e164540420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a8ecc2c7085ad558d6d2ff19ad32dceca00043f59ba548e935f71f88110dd766eb20cb0be94e4895364ce64324d24787 +01eb00000000000000faa990c4c0750588c6922633dad84eaaee6178d7698aeee542bafdbb1ae0b654d4e03d9380fae87596235b181f8b71d51a11b316218b029e40ba3e54a52d075f12b8486a3e3975b916b0e6c1bc848da555275224005892b6f44fd063ae058e164501b6b6060f242a71b480f2ebf1b702cb2ece4f55ecf8f50a2878816e38041bc4b4ab7e007938a1d8d51dc531eb064e9ff70ef5637b13d48838df32894ce353335af6d3eee6f417ad4804e688c4a81e5df6aad9133885c41ed368c1bd836b1faafc40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008f69b664bd2a8f673d58d45891da84792ad73143a26f38bb6e4b02c0a990d10911701189b15238acb644315f105b1959 +01eb00000000000000fab6b6060f242a71b480f2ebf1b702cb2ece4f55ecf8f50a2878816e38041bc4b4ab7e007938a1d8d51dc531eb064e9ff70ef5637b13d48838df32894ce353335af6d3eee6f417ad4804e688c4a81e5df6aad9133885c41ed368c1bd836b1faafc018823a0ef0e5fe0d16677e23854848db2db80cc15750c4bd797a0014841b7fb8e27bbc787ddf7fadbe329f99b8ca70e28012a8fa8a32e07d2688029104ed01dadb684966312c8fd12fde26605522b7080ef52bf848ffd7ba23aa0d058f039c40640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000948488fe16633ea506e181657ca6e53e12d08a65f4b76f15d982f73a1b031f10dc7b87ecc8372ebf8d8cf2b1dd8d9b94 +01eb00000000000000fa8823a0ef0e5fe0d16677e23854848db2db80cc15750c4bd797a0014841b7fb8e27bbc787ddf7fadbe329f99b8ca70e28012a8fa8a32e07d2688029104ed01dadb684966312c8fd12fde26605522b7080ef52bf848ffd7ba23aa0d058f039c4060180b3c0fbedea5479e51e6d56d6336c7a65f76311c579d41494da4d1bf1e43270028ff9aa5fa125937beeb9c6a067162b0759e9f26790f7ce57fead375958666da31ec1bb8f0c1bd300731c345ca95e2a05f0429ff6638f2a4c7fe10e48dfad6a40420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000008ccc22855c3b0eefa27741ff5cff7d444a0812e10dc10d25f1a62a0de50b14ef28e9cf81a81d007d59562008064ebe89 +01eb00000000000000fa80b3c0fbedea5479e51e6d56d6336c7a65f76311c579d41494da4d1bf1e43270028ff9aa5fa125937beeb9c6a067162b0759e9f26790f7ce57fead375958666da31ec1bb8f0c1bd300731c345ca95e2a05f0429ff6638f2a4c7fe10e48dfad6a0190ffde44e069f6d4ab591d40dc2a17c7eacebf0eeef6da3019ef4dc958c3dca8cdb5731c5e867ab9efe2c3b54370a551162cbf450dd0192c08f822197223141c6b8acf3aef06fe9ef1fbd977f6a7e79272573f055648cfd1a45b1637d4c812f740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b646b2fd1a4c3b196ea0d31315f5b7a3d71612cfa1159e7ee6c4f750c1dc4b61e1b1c261cf0e6c13219dd7c6e507a268 +01eb00000000000000fa90ffde44e069f6d4ab591d40dc2a17c7eacebf0eeef6da3019ef4dc958c3dca8cdb5731c5e867ab9efe2c3b54370a551162cbf450dd0192c08f822197223141c6b8acf3aef06fe9ef1fbd977f6a7e79272573f055648cfd1a45b1637d4c812f7019420244f16d68896e0dfccc0448ce28e9f7ecd3c217ffbf8045a2c110c5e5af3aff207947a6f553f42c261b31b3ff3760253a01594ea58b354f6d10bfc4c2dd4aee55bdae0fd93a7319aa797164d91564842fd2408f53c361edba48442d10eca40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a56abe7f09cae0f927035e88bd2a6ed4b983664f3d855b2137db1546e235d7dccf9424ced54b23ee950c23befae3d30a +01eb00000000000000fa9420244f16d68896e0dfccc0448ce28e9f7ecd3c217ffbf8045a2c110c5e5af3aff207947a6f553f42c261b31b3ff3760253a01594ea58b354f6d10bfc4c2dd4aee55bdae0fd93a7319aa797164d91564842fd2408f53c361edba48442d10eca018cf23e3cfc2faac0a551fce076313209abae0ea869b708c0771577e3877fac05c1b3ff3bfe8982bef50c9fe74e55a31613f080224b14f0f891430495a6f0c94f2cdcc2bf8127484182fa60745b82c43885873af6739a86c7ac040a15eca2829740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a7ec8ad6b26c69009d34263dd4634d158da5d940fd847d37485802ae952d9e1f135a5e0bf48607ca1fee504b16e37f75 +01eb00000000000000fa8cf23e3cfc2faac0a551fce076313209abae0ea869b708c0771577e3877fac05c1b3ff3bfe8982bef50c9fe74e55a31613f080224b14f0f891430495a6f0c94f2cdcc2bf8127484182fa60745b82c43885873af6739a86c7ac040a15eca282970192c5f7b905dde2a97e903a7fc3e63f88c3d509f0f0122f789368009f4b0ea02f77a59972b0af830ab54e2209bbff694b0df38fa651d500c610b867706c71228eb9c80bbeb1215a4e00b52c9805a6b622e24bd7e9f3b8c12908d287124a20534640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b8f10e38a73e3ee75f5ecc4b648e4b31ae6d1b5e7b484ec06a7668719dc6d67c1e36b58b79cbe27fe9dbfb561b5b5859 +01eb00000000000000fa92c5f7b905dde2a97e903a7fc3e63f88c3d509f0f0122f789368009f4b0ea02f77a59972b0af830ab54e2209bbff694b0df38fa651d500c610b867706c71228eb9c80bbeb1215a4e00b52c9805a6b622e24bd7e9f3b8c12908d287124a20534601b3df15846333468779e0d30456871392dba2c28eabd0e699a6f358308e89dc9822ca126154cf1c4a7bf853b26456569e15e4be28cd07caf0ba110b66b2a932cc4e95400fbf4a0e812f8bd539785b7fe78d07d437cbe81b6142fc530bbbbc630040420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000090b4272a8d3bb4850dfa2e2bb6743c994eb2ddddba3411372f39f2914669431eff6cd640f9b257cbdd4ca3dfc002eac2 +01eb00000000000000fab3df15846333468779e0d30456871392dba2c28eabd0e699a6f358308e89dc9822ca126154cf1c4a7bf853b26456569e15e4be28cd07caf0ba110b66b2a932cc4e95400fbf4a0e812f8bd539785b7fe78d07d437cbe81b6142fc530bbbbc630001ab6d9e7db56766bff16a4511cfad9a6d5e336b3dea04fa00e3e0f36c177bfd9d8a112a837f45a6cc6ddcba1413b69d1112d28f967b9b90a500104e6a730c294637dfd944a83aff22e3bc215669f58513b47763133a4abf41914e163d6c23acc740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a6a1cb720b16947ec017fb36349d32a16cae66d2977a1047497eca60a9acdc13335abe5e7696249d25561ae32c851a98 +01eb00000000000000faab6d9e7db56766bff16a4511cfad9a6d5e336b3dea04fa00e3e0f36c177bfd9d8a112a837f45a6cc6ddcba1413b69d1112d28f967b9b90a500104e6a730c294637dfd944a83aff22e3bc215669f58513b47763133a4abf41914e163d6c23acc7018117e7bdc7e84c197c08fa089a3ee85b8bb9e9aac01a81b0365a86a5e00ee7b6229fcbe7302165fd9490adbb5f991fce0bfcd1e4bc43de62b7a70b909dd8baebe151fd36580f5b847ca0ba64a9b03d1fc14ad2b54d0b0ed766fc754d0c3525ea40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ac81cd763c1f736bf9b804e919ad463f0954ab9da4ccb83e18c9331bdc78f1e7e974c23d2a2928f4247bc77d23f68ace +01eb00000000000000fa8117e7bdc7e84c197c08fa089a3ee85b8bb9e9aac01a81b0365a86a5e00ee7b6229fcbe7302165fd9490adbb5f991fce0bfcd1e4bc43de62b7a70b909dd8baebe151fd36580f5b847ca0ba64a9b03d1fc14ad2b54d0b0ed766fc754d0c3525ea0197ac46f79bb62c41852a681a6a21ad8a0bf32522523a73e3c200d62cba80aa6248111c9b7e3931f9dce5876360aab1200e00101e6cbfc352b0b7bfff1837aa31b897cdb6e4e00d5307efa7bbeae78f3a031fd933c662b106cbbf727e90d41d0d40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000adb8a34fb272fdfc2da7907f0ced8fa31d3d0b25b57b55e44f84ef5bbce11bd108acc4cb59490a3a1fc0e68248748496 +01eb00000000000000fa97ac46f79bb62c41852a681a6a21ad8a0bf32522523a73e3c200d62cba80aa6248111c9b7e3931f9dce5876360aab1200e00101e6cbfc352b0b7bfff1837aa31b897cdb6e4e00d5307efa7bbeae78f3a031fd933c662b106cbbf727e90d41d0d01a29fef7a4a1174cc7b179f1c5ff5c15fc760f743279241d03da8eae9ac208d6442430b6adadafeaeaa0feb9b0a300b2d00564ab4a656e936ed944aa22580d302f499e67a93065b43f254bc1490678c9a1b0e634d318a60b942e922509b287a4940420f0000000000000000000000000000e1f50500000000010000000000000001000000000000000084223aaec04a464ad758ab5b9d4e6478b0ce25c137e570a2631427d6cad45d43b24a10d8f071699e98ead11a48480437 +01eb00000000000000faa29fef7a4a1174cc7b179f1c5ff5c15fc760f743279241d03da8eae9ac208d6442430b6adadafeaeaa0feb9b0a300b2d00564ab4a656e936ed944aa22580d302f499e67a93065b43f254bc1490678c9a1b0e634d318a60b942e922509b287a4901aeb51a3926de36e493243b3bf815c521393047ff6d1535974737a981ef7652fc189d60dd3aa3a6cfd38910d18192118517c4aa1099ee39372a92f2635e05b9218881227c1174a6bad9ddc143ac0f335974505a293f6375d81fc21c74059ec03640420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000ae9925eff65d0c4e266971c3f5a6cfd34a09ae202f8ed184a705288b85bbc4b16b28b5fb24cadf56a223de604074e7b6 +01eb00000000000000faaeb51a3926de36e493243b3bf815c521393047ff6d1535974737a981ef7652fc189d60dd3aa3a6cfd38910d18192118517c4aa1099ee39372a92f2635e05b9218881227c1174a6bad9ddc143ac0f335974505a293f6375d81fc21c74059ec03601acb686f36f2a12ebbb2d2408c3cf75821eca6e917b1eda620bd123432840815cd9610835e90584da1abf5bc6cb26292b09d08188b7a8bc27f8d4a50138888754c9381d3e72c731fb6306e064e62ce647b52f3395b9d95a2cfc77d19084e5fe7940420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000af993241eea076c3eac46b18aa8ad00235165f75ffe8f557f2a1371b625705c4072a6d2c5658468103ff965db5422f6f +01eb00000000000000faacb686f36f2a12ebbb2d2408c3cf75821eca6e917b1eda620bd123432840815cd9610835e90584da1abf5bc6cb26292b09d08188b7a8bc27f8d4a50138888754c9381d3e72c731fb6306e064e62ce647b52f3395b9d95a2cfc77d19084e5fe790180b4b29b306852bd6accd13dedc4f379b3cad1d44f97798e19466c911842a1a5bc90dd545a36042e4f5cd814d0a4013706de007b9889d577c589057ee8eef811bd31d925d5b1f9564ec217f43ff0286e10bb5ccf7754f42770b236c7ba207ab740420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009164bc88f8e479e27e646ffc3a27287e7c2701779237402a3ae8a2fa9cbd84fde300d99f3cd446ee5e1d4cb10fc1e81a +01eb00000000000000fa80b4b29b306852bd6accd13dedc4f379b3cad1d44f97798e19466c911842a1a5bc90dd545a36042e4f5cd814d0a4013706de007b9889d577c589057ee8eef811bd31d925d5b1f9564ec217f43ff0286e10bb5ccf7754f42770b236c7ba207ab7018cd173e54f2d62803916d873bb709dc1a54aa1609ba0bf776891fa2b23c0850ea2042954c63d7d9ba9be4ba5b201cfda0e5cf19f3207fe4496686adf839da36a5b6ef004291c4c00c8173ce428c253833aaaf824b81f2b5de8b733a000362ad740420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000848929245c05f08432890c66f84e4d23e3c40a584d79a444f342f1da1690c99c90129f241977a2db800850f38450f717 +01eb00000000000000fa8cd173e54f2d62803916d873bb709dc1a54aa1609ba0bf776891fa2b23c0850ea2042954c63d7d9ba9be4ba5b201cfda0e5cf19f3207fe4496686adf839da36a5b6ef004291c4c00c8173ce428c253833aaaf824b81f2b5de8b733a000362ad7018a862e3cf4e4d9a57edb886762fbf0f783821f97a76e15be18f1b38007034fd2f4333c4bb0064d11e736fc9bdc2817220c38a29602c8b20dd91b6d98838dca2db64afd3d93ad93568505a86f22a521418159b1bd1bee70f6fe9494d68da5a5f240420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000b7bf3c39e25c92a2af8ab0b78e2bd963e2f3dc9e6d07bddfd01b0c25c921d12a5d36a51ccddcbe3bc788fc802db131a0 +01eb00000000000000fa8a862e3cf4e4d9a57edb886762fbf0f783821f97a76e15be18f1b38007034fd2f4333c4bb0064d11e736fc9bdc2817220c38a29602c8b20dd91b6d98838dca2db64afd3d93ad93568505a86f22a521418159b1bd1bee70f6fe9494d68da5a5f201b361321e4403d925349551752acd2528b438111afc767656d85e1af18390257adc4113372c9cf5ca56ac982a7e96cc651012efa63ea74ad9d48b8e0be7e010b18643b68faeec02b5bd210f3559a05cfc61569e26c4cb85006755ee9ea7d1caae40420f0000000000000000000000000000e1f505000000000100000000000000010000000000000000a065301bcd37385c1ceb9ba452724009e5dcfec2ac8d7aa816a01e02c681dcf6ef5ed2a2f6ca84f1a86815b77dfe8980 +01eb00000000000000fab361321e4403d925349551752acd2528b438111afc767656d85e1af18390257adc4113372c9cf5ca56ac982a7e96cc651012efa63ea74ad9d48b8e0be7e010b18643b68faeec02b5bd210f3559a05cfc61569e26c4cb85006755ee9ea7d1caae018d31d41cb190cb54fab965d3edba820a8e8fc5cdf5df2ef0b17ed7b318c290808564ec96651502cb086f4e2317de88441376dca3359fcf084a904343591c9c6d420dea1e576a957120af2ea4c46ef9d3bb1394ad3cbc92413c59b1ce518c085040420f0000000000000000000000000000e1f5050000000001000000000000000100000000000000009622a15ef3bd92428fb20f2ab5f070dfe70227d2d53b38b8fbe9067a0e657e1bf45582605c1d0c851fd7580a42de3c09 diff --git a/rusk/benches/phoenix-txs b/rusk/benches/phoenix-txs index 6d35f65730..54a2f527c3 100644 --- a/rusk/benches/phoenix-txs +++ b/rusk/benches/phoenix-txs @@ -1,100 +1,100 @@ -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000005bfb898474fdfbba494090bb456897f7ef4ed062cf25bb2b193d65bff9f1d1e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389a4f8f3753efb38091e73a641f78e82422c8de47a0b38e09046f2cf5a3ae8ed7ffffffffffffffffbf312247533d481e255cc4144885873c587b21e931c14da4e64bce4bc3cc737c76ca7237603dcabd0a4e6f98179e9ed0cebe63b6b6ef0ec9827eb86b5f9e286717616aa100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c70c62cb8b9e4ff0c0f4105b0ebd553da265d5aa82849ceb17a4c1c4b2b5a7e1b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861154a36b58bd449cdf4114146a3d1f4a9e6fd23ba7517af0721f089552dcf8933000d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33b7655baf78588d61e843a2d3f97782daae217abe3f7cfd44b4fe215ec573582effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691c234d52d8e1118462ce92422399963650cc41953b934f1f756f5797532e0102863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0778feb7dbc53e77785cbd3be49c44c03a721b328d10cfd8eda15953d0735d50800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0993d55e001ffaa453dd53ff981e1c1327cafc6a15ee372028fb91677a89d94e900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a461079976447711bbb8c8158ceb939fbca4f99f371056ed60c60a84b999c2e58c03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec11ce9db9d0ad29f8121248b23f2d50b853a79ef3c57354034f23e0d1a926a1900f003000000000000b4dadb01a877a387b75fc3b552932106349fe2ccea137903c4fab8e9ace0735fca92a021fab59c97689bf874055fd92ab8c84ea5cd1b83fa89274fccfc51ae44165a9ca56d932c64243440742698dbc307b673f5f88d7753f0842b6b2ea3d387847c32d580ec3cbb880ace505471155fb6f56a5043b9ed68c7f34d12577ffae79d2be7d96b51bbb44ddb0e751ce22fbc89507d33519cb4bbb434fc6507c9381379f44417be4b31b8442b07dc4198f88297bf856e875e749c0a103e25f2e3e021a22e6437ad3ae54d42bda5f89fe94fb57fc7dc25e1a18949eabf6c72883607f13f37ffcaa54b6555fa771957b3ee71d0b9cb37ef3a7a76ead74f98a55127cd1887ecb529a3243e52e86e7071c4b3b1d580dc6426c2b13ab5661de62ec89c394691d893849505375a8669db6b00465a89d08bf817e2a8de1d57ddd2c46f46e8c290b52a4d3284fb59dfe301723bb8958682adfa10219baa2a7ec8a31d520ea9a5daa1a433a021ee1077278198d7c3b204b6cfb5553f4b2edcdc965e01ad4f649eb72f6070dc410c4065abf25fef93f3825bc99a3e54be7f3dd03784f6f09d176745fbc579f7dfec626a4b3f288e8f90eda12fd11c773a1a5dc2fac4c3e4379c84ed2765f7334c714caebc89bd2b732a8c267225b4588cb86a24bf721405c6e75d83ee5d70ec9d029e592e93034a3954948d7b47486834b461c07c3b49b0ab70318d61c0aadfd7304d36edf108d277ff8f9510b22f2e3d0ce930999d2a4ea3fc40ef31f71167e7c656e76844079a29ea715601175c0bf8917f4c661ead1886689359baba5306fd428b42e84c64783fef331a851e60f5db3cdea40fcac40160e4c258b9873d94b7dd6345c7b5504d8bb66622dc2085b9ac40c912ce6c11c6190d221d6d8d189a6e90fc52ea5541fd5ee950e458df7c0ffdceed4fc7c48a7f3ca6434fe9384f3443672ac01fa4ce093f6f17b211c5e4ad672d01a067881c1d5d1dc2aaf01e3af724665ef0a2793b0ecb485608e1deef89aa39149f254b6a29af3dac33cbed3ae239609870c669081ec2340cd7e31ee5b9455ca990db8267481b119a40068e3833c34481f7798b54de05a00e2eda6a326430739f0d575fd9cc081f83c0c7e2f0a0c265be759821804bcf042f41555436a4cf455a1b6b584edd2566268a6ca2a9423b9a8322c1355a7dddf35edfb6f9ffabfc9572198f239b300f82abd3b436f8f401f0965c96d5ddaf0d37356805e5aae5d2e2b1ab64cd3bc9c8380169fefc5afa2dffab00ad76c833e5f8353c88618c4f1492e72836879eeee92ca0c986fc36346622091764fecad370ca032076add30e979ad7ab61dd6ddfb3f0fb49747c99e91b1d80e81a4a89cb1c614fe2e5c306ff4ba52922f49f7856dc0d63c373b7ea6b45fc09547b7f279c4cab33 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a02543f14f555be04a88b0be306fed7afb8707fc9a89b23f5be95ae65b5a093501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3848ede948bb4e2add9d4204a18eb32ee19b646f0a8f43eb5a463b732f236fc1f2ffffffffffffffffbf312247533d481e255cc4141ea8fa07f5c824d97d45efaf74263a0d2bc0059bac68d31fb6c079b58fb8ede79ab053ca5d1b0c51b4b5e439d073ea782d1dbe9dabde5dcb00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc21232f6c0193c06e97c950966cbe5c7fad5cad673a1635e0ecc30d35609d5724bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861120984c54f2efc58d90ebf7b552b14412f057b086dd176366d20604235ab5728b00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e335ec1c1040ee34a450cd2d3ed719ba590eed2fc27df75a2eb00ef24387b462f24ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691703a41446d02d27547d4901ef100786450e20fe94340473c0d22cc08cb204ce863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0ca2a0cdd044dcba1d90d5345f2231fe525ed26d54a609a8173a71cb917dedc5600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0f5ea8e0e06e760974eda035236e021526030fd4f8bfc9e5125f509142bfef32100d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a49ab9add575a28d26dfcd3d278b76cdd159592244e0a0afe9e9d839fdb9785ee203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2b9804bcd7d65ffc8f8a88050ef699d1264f2c2e4861ae61ec196bbb5d71b50c00f003000000000000a204637419904f33bbd6a405d7b3208cc2bbca4e1a8d7b60be6c9bc8b506c75e1f23e3fd9cb7127fa1e18108b22ff555a6087359c5505fe32e6cea61ae3d65628ce866c4935c25462dcf150969b1d734ed1aac8e63e63bd4c7ee20798c7ab67db5c0ceb35a2f9137070752ad4fd555512e8196b9ff3264f2c38cb61c9d46a9878764c3204c552fa4af3adac9160b1d08b7a3bd00dbe0cecf8f0fca2032198ffaa6537f8e5e3fbe90d4962d9ba0c1c997517b663f8109711399ddbc1cdb68f07e890a1fb73e8e04a241c6b13cf3879514b435f4ee5903f21c473dbce8c111a1153ad4583b2bf85f2f11da67cfa786aaa685288ff1cf2935cbc454c2ba19c0ee47cce55acb374f56bac08806133ff7f7f8a52563efcafa82372efb5b47440b52c0aa5279dffbf2e175ad46bad49ae1d3d3e8d1f3e20f7fbe081b0f9c8865b4bd5e20a24dcdf9044d883fc926bf5ad3b0ecb805a49cc9145ae9434512ddcb737e2324033da14a9bfb10fa583298708d778d83b8350435ce04d8b93ad6195d6bb35290063a1aad689adae483a74edfc7689c050ba6b3f2adebdf2a5becbebd0f8bb501a42b105d70e8f3f8ffc40c9960259d81b9f4d86a756f6b6f33cf013bb237588cade179051996223fe89a5f4e77fdb57f989bfacf92c6ca8694b56a971060b4862fda60c85a2c784cba3f7b5698ffda4e3257be021ef46d7b91966cc6a09091b4c48cd0a64cb2e30420b553e063f280cc7c03b3780a2e15c861c3c373d18a6df83edd84061e221ce40c5c3c2059371544bf5b5e9dc8f20a029815a2c3305a49096259482af424ee5f955f32f55d281ae9736e370f712495cd9b5ee40d78dceb59a0a6d630052f1c91f595fa2893ff347eb3ca59bb67c8af2fa9dde15ec5cbb6f6c3b2cf9741906c03d4acbcd0c76323b62ce8200e92090e8e2c14a8e7af18a3de6f3c822cda22eac9ae56132b7fa9378fc4323098d7959e7ff1fe3f2a975a090de5fbf68d7794fd50e6270925e5573af4d47d2c8ef77f4a14ef211b6072d36f310324813d4735cc4563073080915560f01812934f52d7b2e8defa5bb8dd803085215000e70598ef8e857c93f775710bef2fb031c3548ad60aac02435b48b46ed390f3b57f2b8244444853db5d2e881d371deb1805a554082c2585d78a6033e64827cd0707f5f6cadee221160497b8553f5b2c8969a4ff9dbca96234837e051c829812beeb5e1f50eb0a331376e23806fa74b548a7c2d9babcfeff27eb78705a16712f720ddd49be76b56597be5a194c971e7453ca8e47413f617d6076804edc0bb0e84ff3a0a1d04e17e3d2094063023bd2b2e16aa9139d9db80786b1f60ef32ccce4e4d2b8d24b6c8b3e3e00a2560399f56884c30d9c028412576fbab2eda3306322b638a343a7d2237e9f7e93e66b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000000e564b646d6f2958c45a17d7df37cebe785ea0c89f3aa04aa8494b4ec2df3c01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc383649ba97e1f1de64c2da54cce3b87b361492bbb361b38c5585a9d5667beee0e7ffffffffffffffffbf312247533d481e255cc414569f3cafe45dff3eb0604022f749a57b07dbed89d8952794ef0d033acdffcaa91a27c85d4d325fe578380c2bd1d4b1a5db8a962a95c1bc0d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c61a61540c06eb393e94c0375d001d71d04f8b5f2e88189be4c94f17e29ba250d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d84323d0b3517513a343db37b1c1a132a162990da197e96d13c98dc50dce4cb300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e339c4055836b22d53d8691d68c33b4bc6900283a9c071d3cb11bada63b5695fd52ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569fba1cb786d17dd6911d7e81f8fc09fd348ac63fd7d0a558eb76d3834674391c3863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a08a802adf387c91f08b1dde9cc59ba6d0aefb2416df670a87ea1f45c3d52ecfc400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b04ad50154d955834c002d39a1fb6e00a3e55266af3555482c739a16832e1140ad00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4dab7edf42fc64367e364ac2020429099e6d7fc8d585cc1955cb439175c9d648d03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec85ebe96564823a847b0ed5d66e49e9942d39886d09b9a2044a2ad5f1f32a4b800f003000000000000864145b1f00be3e3dce4fbeb35ec578fb48e02b9f668108b413b1e83355b37cd873785ca7449f2345ed9cf53b5096a0ea9bfc677c39f58abb0109306316a30274a017466af0315d1257515e757fec05df01d2fdba77cbc05f610b63786e6092bb3b1e090aee21c80c98f8ff2482721e25933342d6438c58379c4333d4835a515bd22908906ce8ba9141c7f4a04ce27ec819fc1fd60db3d7f3d8d087fe8a41c7a41a68e6e9d962a2139b13f6ba833fc0a7b5f5ca64ff641d599e0af2f23d271b8ad44282d3818caa908d6a105d9975498b722467a6eea6b40da5cbc7c60aec9607da8a638e5502cad66a70acf872d38d4a18c7f323ce52ede7d0e24e59e9b347dd97fc126113483e6be3644ddf02aaba9d7ed5746b36ddf3872a8cf7e6ad47c2f8e1d526da2d242088d121144b8fa78f606f77c7d58c592a6c9afebb905149befc64a5aab9884c5d40a18d9873a6ebde88f7d75d09828a2b5b9571787e0b55a8f1ac444236d9a511a86ad8975e7ad412094be13239a8b8172ad7c5aafccbc1690ac3ace8ed1aae7a7d58a760e8a583537a3074917838d1262e9fa49cf2b7c25c0d2321254a1b92523c6d115c3188c11b0a681b4dd0ded49977e7972d80ed8af6ab5cd8c658db23ca8bef3027a2e1e25aa9382f88d442d0415497b697064eed64aa8a70ca65890b61b0d8f35f5703f2be90c6b750765f050a8676b1dd596b3ac1f9d639a3ef5a14862f68a7cebf5e223102241a250351c1fecd084f9238665a79b165a10c7ee1f9e2971f27759dd0d11555f739a87be37d78cc6ceae8b5a3128d2a45aab483da4707326abb1b3c8b11d5d64d5905a98aabeac14336f705e4176971f651ff0c51ae070f96871c29920aa17ca5f3b8c39e6e91e7b354824a8cac26a2652453a172709b92f17a5407bb1f3210ee2b864de1d248f692897c186ef94c73c939893b351bc6f60f9ccfc6ade243765c48a39b16558e7321b1d4164bd71d72735c4dde8b1af6f78cf6d81c2e51333317878548f77b79e683f6349576698abd15645a3e6c224621d9b625a516c8969e9b63ece3c432ed19f70c77f8e778974687c088dc845e217fc3b577e0eaad128cc6fbb1affc2ac05d82c0d688bc16fc94012e680f1b93f849c787a7a2e8a7e3755e7f43a14a4adac0a3257e179bd4bdc32ef24382310984d87bda084079128639e02aad28dc9f90dbc60b52426f6ddb4d042cbd71d83d0605bbce3ffdb095511f1fdc6c3ccccaab5353522548924d1d570fbc967759246638bd3798f9e2f07175b46310b08cd1ce99fb3616effbe2772fa9b9f184bfb76931e28f435e1b6ec3afb5416462986258fdd6687e975186a326f5e6654586f3db405c41e2ea8fd50327c52e35694d6515f99b92fa5d3533977c6bf8cf425af6784927c9c33af7a8035 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005b2f6ce60b7d167d311dcdc53b54c4e9c5c192815b5680df54683babebc7515b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc388d47e023a9c8ceb0ed543654dab6027a398a6edb318731a1f1533550134aec10ffffffffffffffffbf312247533d481e255cc41490b431db6c7dea592fb1d57dedb452b2d46e93439745588f9561403e48abab27b76714cc2ea1f3c746647d66464b7fce82addc7276127d1300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cdcd40db020986cf34b4de9d9b49a3a82636696ba5f6f26281e605b13fe0d4ba04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a5bbe7fde9a95b9a4efe8ed38c697fbc96c380f7ba0109ae6b1daaa95899d81800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e334ef9ae444b934dcbb806d57e384e7714e786383cd3fa6658e738df0d98184227ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569ba2a1c48e9b9041bfd8f5bc27779fc49bd7ddac197bf985ce4a6225d0ea67def863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0ff4a06b892655a7135e2966b224e7f4353a19444dcf85d76bab04ef2e916f59300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b06bd14552e2c83ba4525ba691bcef0c35b5f9dafcc550413504493efe23b22db500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4487b5fab7018493311f1c6dbbe392c2733bedd778bf689f3d0ac3e19828b0bdd03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e1d6431a88b2d15994af2d7980831ef37d5cc04150a11943aa218023de7cfabf000f003000000000000b5091d249759841f822636d35afdf4c66e92ca85313d4180c577776ee8cb0266f5f0f97aea702af81c655f3778e161f6976041f501436946cb6410aec4523fd69ef2c52142d6775f223b54de6c5be97a5d91f319ae65ccc3a81070c37e665c05af82d5752ef96ab06729fe654dfe9f84b987d1207b75d26e640ba1eaa8715dc902e76c6c247e87b890bbc276b72274bd87e6fca3a360b376bc8d9f2e46ec74460ece1871f5ad5d5efb093db3f9c2103ab2b86255f83519e5fc6cd413a61e411aa42db9eecc362422d5d532e8c67a1e71997bd0e918aeeec4375ff71b2551b7206ea5386d0ac42c9747a47b2455acba598d1051ae4df879e5c91d8dd66d8a61fb3319c023124e587b395d8f2b2abf362563c8fc28c992ba3baf30ee38a43a8014b3333cba667bb79cf2381d74fdd23893111c306deaf105371a1fa448ae07f0a9dc487eb5fbd5988c14d29723f085cadc96ba4525a4a0986bfa027d61b82dcf964f81682aef0e99ba109f1c748d19c04358d4e695baab3a905cac33e2390e6ee88a9f14ca62bd7f165defc3045f0f76e8d3153900955ec339cfafea1059201f557ad5fac2b2cb645ab85723a7eb0326f2a92fd3122184931d4b818edbfdce9eb3e32c2cfe85d4bb5369f02b4462a237f83b21c90c300edbb138ecef6001162e088a8fff50f4185657a746188a74d789bad1c509e002f3d5b9b9533248dc3f6801a9d9082912d50a42978c8d1eba36f042c1e378c3eb7d2d3daba08b120f062cd6bb76e4001f974875970c08d2a9434e385e1f8f885a0cd5d2afa4a13c10e6d8091697ae9a63bedd10feb6e14c3fa47c330d20c2f3d9b1dfc991985f4488a3943e9a39702ef2ee74269dc7ffe9985a2b162b09ee0e48cf136e9ab1c7a52183198f4235ce498276adf7a11f975b202ef43f8b2a5b8f86e7e888fee966f0b57ee459aa35022806a674f4065282ef3319fb11540a06c28c63a585aa94f31cd3cfb5ec8c53d0739c73bcbd1e3ccbdb667f235abacff55cd19b354a8ea23e85b3458d6a2eedacfb0ac12ed73ac78ebafbd0ad0128f6ba372e3b40dc9fbdc6792ca69fdf872a9987dcaecc1e70e45d920bb26d322c24f5fbcbb0f3d367b967abeda2cb42e21ad60b2f8cb2d5e558277bad955818c92c3d94ce2895706f4bac8c3c0e37c553071e6917d8ac128a3bdd05257a5a1e953a9fb50b02944ff025d13375da13c5c5c2588f60d402a2dafbd688bead410f21ccbca86e18f83bbe37d0e2de1369d209e574ff3d3e42d6dfdfaccd5e4fc2597f30048c372ae18d7ba2ec49dc8e441d081153d6383bf81cd0abda9d2449e1196cf6aafe1b0e5faaaab457740c9f7db2bff14f5cdad7c9a869a51bec19fee64be08becab75b95a6c44eeb3c01f3812b6fde18fd17ae98873ec2f9efba14eac1a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000093c7c309512705d8fa9b847a0982e23b4cd91ca0be2baa9cd0e72a259e1dcf4501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389892929cc2ae7c8a4cbb72a7700fe524fc0234544c91b93ac5b32760e4223d3affffffffffffffffbf312247533d481e255cc41433c4d8cde488a44066a381d93ef1f46167347453849c0b4ebc451699884fa29dbd1a66cc904de0e9de44cccb4c76511b54a292aa3a24f7a600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3c1a791d119e9fc05fe049161d7b50b6debe2c69b7ab1d69c6bf6042159c1ac34bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861156b51c08d633ade1dc93d00f2da65ccd6237c976a2ca32e12a247ea2f6c0b84d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e338de3803556b433d9b4ea8cf4cb80fe2ace91dcbcd7737d31cd40d8e4717907bfffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856954b366b64ef3bc5c84ca01a391b5f84bc6a10b27bfa45b5d886841bdcb08fb4d863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a078dc1ebf46d8c7b7ea5bbc0f9b18ec230f7efd8ce8fd5a0185a1a3a06a8d281900e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0961f57f141fa778fd958eb6b3b42927000f1315022813b81cb7faa7eb3d683cf00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a47fc1359c66e5697d33edf3d139c7ba249124204222d67401bed91cafd28210d703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e9486648e4f3470cf8731b61336e49eb314ac31ccfac2894004d58e3615e5b44300f003000000000000a9379a4d06b9102063172fd2e465a6c4683ea242e4da80c4917a6f443dfa337b43da674e3bce624fa06734138e3157e382e830a9ea350e9ebd5741b101d14899795a3b55a53e386489e6a75319ce231a1b6c6cf8e3ca04156000e1a2441dfd76868e3daef01ef79a8a21378a85bb76486dd4b71fbb4b404452f7fa1bbec058ae6be50477df904de48ae2a24b16ace9f786b7027bfdb2c9e7fb8b66c797826f7fbeac5472466b15a4458ccecf62bd160a522a75e39b520716f4e880f8f0423a39b318ea9cd9079641b1ae9d74a77eafb916d3c0f3fe08377844aaac1f60a7bce97a6b1fe2410911deaa404d4816e8f52186ce4fb726a62b098ca493cdc340c185086f688654a8dd58d495506d8c9db0fae99364f168584804af81b7a11d66ad53a730162f1cee061df06555493c9f5f3c5cdefb5d5c03f15886318efb0dfd57c85ec67847e728941b920dbef7b11e1c05a8ffaa136f00350d3a197aa48b9cd292cbd0570fbcf515af663cf97b0b2abb6388bce06a4b0fc193d036c7ae539ccf67800c46878631a5cfd7baaa5c6639af79b496f6746995a52da907c31f3e4923b5f509eb55ccf13fb0f940970b7d9733b8a45cd1b7c9a31b576168b068f9b576bc1ace2b4819cfa8eaf9b6ba2efdfc008e4f3541b5740223632f278bf9d6854ed0a4fd7be82bff680003e131cb962a033b733664e5be787cacf5090dfbeac08df32d3a9a04e975d9f418b30692d99ea2f92990c28f6398f9d6dfa733affa35b3d74da492c6885bb8c6979df4a3efa4c03fb3b5c628856698bff4c3ac25094a770a96efc75b414189d3509cade09e9b3b1b1d0fc2e7511c52d10a93b9a9b25805f9ffb829b851b98cdfb07faed5386cdd140cc1ab0ff9a0a21c5d78d59c791bc82b127afce5a9bb11a044bb18d62855a45a0e496e812e3bd65e20580440487fa323cbd2793669e0db6135a381d5c7e3d0595e3be6f4b1fa1784e7f13f7b21eeb3f5918a091f7fb228999efeb5d47ec4135aee8f88d2d1fb620e69e1f928936c7570925ad1dfc013e436ac9f24512d14264c019b1e9a5a8b1ee9336388c717ddb4e7bb790f028ce7f98c7090cf0f5d07610425a7dc81ee38db06bfebbf7e159f51745b297f1449c718bc4009a53e62e63a5daa18a70774c8481b88e96db510e88f99e12a6f3ec3d4a14ffbfcf135f656f9352f027fb36fc1313c24e23f98f81723b63943c46d49edadcf3d1371c68c73c33c229f65818c7e19e680c1255390489ae99a764c0b50d41c3c1016ab9d3180353047c2f97555ee940e290cb3e90b490b2a7bc0e97946b5f13575830a06225fe4247b0e302ed4939157792fa208021bf2d488f1777178ed6847983af0273d141a37e1580184cf7c922e04ab79002c7bd3f7a1412c75135e8c928586c57f8badc367 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000055fdeb7dcd573d34c454c43ba9f1464fd213b973b0ef922d7e5de71e8ba1d93e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc383263c53c33f95f4beb9a114a289a086b81d59f40619fbdd48adf0039db84fb8dffffffffffffffffbf312247533d481e255cc414f8136ba6cd3b1516876562a1283024dfb60c94219ef23afaad8a48c3c2dc36d99ee813f35efa439a51e08ca4c5401828aeb6361b0113671800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca02a17fc223532bb97ba809339b2a74659a1457b6de3ed414732322b3661f0074bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611784ec0ddac3f432e2926e6d0b42f53aa51a526a6cf6857bf4a412217d84953c100d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e336eb90a31b0148b47a14967582f580e025e69c1bea409edd1b6d1212cdaa37609ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569cb25cf83d8e32653db6f52adc23e36ad57589c58aed790ff2352fa6d8e9fa5d5863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a09be95317edd86255f0999f991589a4d7e8640885dae87d63473f219c5029af9d00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0c45f6adbf66c1a9cdcc6043b3969bb35ad079e55bb681b6656ab203c598815dc00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4419a476a2f451d6d44a8d48900fffb9740e52b61d88c8c881ed695604cc41faa03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e43775dc645fe4e3384db23a952e213c4e4db385f37562168890fd8bda2714f4000f0030000000000009545490098fc7e71824eb82a0b1954d19976266e7fa6061aeb13b1c5300955900a8d5a90e481d8d331a246e31372304c85bcb3c6888a5708774a7b4bb91e5e075a1b721d46b98d48d1e3fb8bbe421edcc8d28d651bd70068c5b445fa431ba1488056c1ca31c77f6702dc6970990b96296870dab84f40065856f99e0bc8dfdab4360a98238277f918a7f7e579e1671389ad8e95bcc44d7541524b153782199dc7b5e62f3a8d50a925e857cc17e3341e7cf645406be96e727335dbb5adb1403fb9a79d8da6e742db487f611a7e06572f8c044559bf66a5de41391e1fa4d251c02292dfb7490ac9b59fab9934a979da8ad495b62c3a5701dfea79507de7ba9fb9ed8bfea59fa642394790f5d4359b7e7a6765f6111d3c135aebe7da81f634e7232586d7f1c59cddfe718e788b5ad49efdc8a21ee390db1b44165028fe729dd6f14f8f99f0301d734bb2405d47bfe9432e20b3affbf2d5b0756daa255954367b49cfef57f2feb4b3defa3152644ca8e339f94715fac08e370a1a39e0fc58391f94afa4ff6606e05e00c2cab70d7ce76afacf430ffb0738e6ce8c34d49cce02ed4ccdb1ad722455b5b5aa948b5edc4b58c840a9f0e6b81525dcefe1026a7bec11a35c2571a73b81ae9f11ec257ae911d1187bfaed1f3e9d2cc9263751719caf56a6da908ec5289a0883c305f66c757c1e49c374b36c46c510bb3a841b1ac5ef3c25e02f5ceaac65f1a4e3988b6352450cc5136aa4cf13c2f13849ab1e52dbc2eb33c3751bcc8ca1e1d32150e89ebf9a42962a34c91be2e701360e9cf48f6c2823fbede084e61a0e203aca447670f0e1d5670fadc87b8c78d25f67c20ba074acd30ea933de150a0284eb9af26a62f1b3b7fb5768805ac57ba872c8bb380e91c4367e7b15b473a6fa94e994f2b89bee8f38546115ddb686a934d55f103da0bb9a7648f2ed81b0c5b7845b704fe6c003ae7d6e4482b0b888ba1307c2c0833d176ba499ea96f81bc95e9d3c18fc991c64f1ad1e57e5982f5b5713b723b28280bb8a239aa58a0070e4c2dcfd7d1c4c688e33c72120c35f5a85ebb1a2ce3b02ab7fc4aa89f1b434178d7f4dbc9dbfb9b72a6786ac6da15de29b39ee06a0d0b11476eae8c550ac779ba278d9b4bdef3adf4bfc17204d9731b9bd8ba750b5585b964ecb5296c223f81eecb9720fc25ba727a02df84a5db59a9cf0da23ddf66800e7bd74c9744bcac58b5762338d84804c404dca895b6d0c45dba6228204da8a821340efaee065c49bb8c8647470f4b1d54dc3e10f5b1a0ce90564284c0a7c6f459afb10b627cf4cafaee5f4f1c1f0fdd3755a34417e62a8a23015d204bc4175af9c4ecbe20472e366b6aa808d6aa0f4330b38ea461507ee8bcb28d0b79814c44c9c8c5db552ef3aec1324410945c761ab6515cfa41d60 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000052126d41fe4202322f89a7c868000fb785a1661a1680c1c8bb20fab616d1c15d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f819b7ea026607c228dfe8b6b5bdcab7925264983c17a5fd78663b53f7da3fbeffffffffffffffffbf312247533d481e255cc414e7501d93d55b10b9db54d93d482471713e97d2cc8a9abe9925a2c052b20b7fb1e0b876e33c7e44c497b2b8b18e5f24c522f516792c95948600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cbf4999f42c8ce3f3565345b428f64e69dee909ea9280f18deb5bf219589ed2c34bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b763edef93bc45cc65fba2826125ae69839e7357d3110b89f1d680f1a65f81cc00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e339376017da29a993ba71e1eb0109ad964add32ea0b97f8faf9b516f64cf64ea44ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569803f27880d64e7eed1dbfbc68bec6b5875cec10feb3af8542af00a4b9b24ad9f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a028b11047416206d6a413e6b98638ca4302c6d46eb50834988604dc3f237c29c000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0b97de97f769e602767bde53438005ae82d4a4d91d19eea624d0f1aa0be9789b300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a47d388e5adccfb799733e86f5c184c39cefaae8ce850f39a88030c1b74a1b2b1e03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee3faf2891aceda6810676c90ba5989831ddc4a93b74a2a7afa3b9d193923908c00f0030000000000009412f4a15b3a69242f580f68e4e9d15e65c5e5fdc650f03d4ca6c30559f9509a6a4c84cf5142af83989b4e87ca4b18dfa7784cb760bceeebbea705376f9d337b10916f490481a770b4bb99f23dc5ab70d8e3f3412c0f4d3642ad6fa573a5b36dafc9e58950667e05522723dbc34ad3aff46b433ee1f19943f498252ce92871b1c11a09ca6ec44dca8e0a84a03b650ebca0200d633267a9d65c4284eea78d024111b5007d96bdb9f8e5a83c9033ff005909da8717db311fe1c50d9ea0766299d3a8033cb6e3ecf42929f4954caa8be76bd8eeb95a947f77dd971741f25f23984e892523108824322a744f87a0408806b0818dd2d88c013af0d7b29c972b0814883256d20aa5bb460cbbbdcd06f892bbfbf005e62ba00fff51449c26dfaae4a080a7408138f7e3c3d5cf1448026bd518bf43a5ca52d108f85a64153328966819468d905617bfeb977ac47a2abacef54ec682c199bdf8dcd74dc89cd7b1ebe75ff686686021ccf4fb6c27c21f92984b5f3636122f7cad767e644e57f00c27b162c1b8655cc6cb0c8335d6ae4978cdcd07921c7396a55045d5a6e4172c42e8a93881f6ff954d96a5a7a82888079d3c379f9bb9dd106d722060b3753deba476f354004e30be33c6212eba5158e392a56cafd0ed8ac4ea38d95ce791b3f54c1f33e3de89b61fce3d3698858bcceb14d0e5a46b4916f58f0b3b2fe25466a47edd86dd2751bf0623c9387191ab25dd514a4ba72368c6f9443051eeb93fc1f7978ee34cea1f5b9248da4b00c149d9337c70d2ef6a6785f1c95687f420b467c9f70b26ab465240a1263adff114c75809b63a2cc214a06cd3f81fef3ac39e2c33076569a52d945a18af591e07647c2c3295a509fd65ade0a113b59f0c622bb455306dc1ef8ef2af47e037b159a1bc264a2015081a54979daba7582e58b28c581301d5146cc58f8400147ff2fd4921ec767f5f796c125e277ab9ec325dd83b8b4ae19784dad956fee15746e2d456b5ee2173fca0bb39df70c3d0a5cfae04a08aedbe6fdd0cbdf00c1e194f50727c8ff5cfef1137ac35266bd822d68a1fe6f90b56ced25aa524c59c0619b2b356e820db7464be323c0999a1add9fceb96c1ec19afb2048e76f6246c819c9a9797b84371ee454eaad4412f5b4affd8ad3b6d4844aebec85e1e3d4d965dab683289b5fcc5020e7ddd5e5145592e9ed2b133e9c8f0cbb2798ea11a842ff6d5a26414ff3b6c314744edc4130f64403a4342ab7d68baf66a169f30e02ec1d1d867dfcfde03d9463085cc3f61bfe738f0ca9baa50c140bcefd8605c75728363cdf80e317a773f97f94d79e6135048dc8d51a90f79e2467013c215a39495b9b65bc1cead565bd366d95898d332ca417de9198d4301532cf60bd8d6200843c2309cb60a33740c3d0829c806b123 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000047872dbad2709d9cf26fd8f7f3c7fd9ccbede759a33fd3cb5d8c04147dd42e0001e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc381e986052bdf4efafbaeaf696eb8c12f68ced320acfd1348f20878de6016ac573ffffffffffffffffbf312247533d481e255cc414771c37ba6a175b625138dda501cb71608dc19827b73fb98f6a7e416656e8032bdcf8fa31b08ee4baf882d8f6a56560a64adb090f6b912f9e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5663294312cdc161844618db32862ff33a6c7ffe6c31ffbadd1f12713ecd741e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fbf526b58d56ff3a11d319c581b3c5f7e63f89166e201c4168f221d39a88ff2700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3352b627d6e0c5104a6eb8e99e648a2214078436751c44ee40666f5fde08eefc51ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569730d8cc523b173bde4b998719a673e866e908d43e6ff942b9d270f01fa7e84e2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a08c115e9e66a798e6b1dbc7e017d75daac2cc99b646817f38b655aa18dbc6f4d200e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0f110c22e0c7be18bc87ea86ecf01dac00ac19e7df96251af6993f2a418c32b6500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a428bbfa07e25eb547b873318c5b4cb64e75b63588f8c16f072e416743c008008703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee0e74f5453d6e64acd15d1e33ff73b41c74a42bc434905f149047e60c0f1a4cf00f003000000000000835a590dee520fe288e621afcc91da245e93f5c7efe9f58a2e8ae31401a274af8f9e4d560764c9431ac1e491128121c68bc4873963e01adcf6cbf8fd1253b89f168f7b28a54b9ca7d48bdd1b048814fbd346085eef9576dda2c6cf37f3640fd38284090f6e4cd6ff393e5c38d2687f77af91afebac50b7424862825965af6ad27c7a12552e5bd5ec32078d97e2d80cb685020de893d99c3c53a8d1804bfd591192b75a220c506e32bffbc324b07937b65e40d82b66d5ec76ec337ff95cd501428c81eefec7b0039814ad676123e8ca69062d7049ab1e0ce0a247db61de159a720bf30838491844877c2752f962a6dcc99713228a08b7830c8c6ed881148680c200de0fd9bf6dfd61c8aaff11c9466dcba914cdd1a623608a4d0ee0d243328ba7a843a723c52f5781a31d930ef7f0b9d0f78ad715fceb20dd383096cc40162c98c316b23cffe999538a7f05f8443793b288584317eb69318affd7e2fcdef3329e7135d848f8d6c76b54b0ffcacd39ace3c7c6507d8aea66a464e1f5c267ecc1afb69e69e7d91a82d03f100ee35a3605c9a5afe60152b1ec558f9777cb79b6c7ce76e04c15743be6a4c574b2d3ec1141a6b4ca8595b1556c47544b2ab26dbbe0452ee94d5cbc8d41881181bbac23fd86981c8258c09b83f17b014108b16cc28af897fa043a9d26362218c89d48c40ce7f51ad7b0d33c6c57886965066bc3a9e0528210fa3698317c9c28e6b282bce8521a83a532e547cf28de7140eb9afb1a381ef3331ec6df23b7791d6e9333a867b159db98782ba539ba0bb191e2fcea6a452ea8d36fa40c423f3fafe6d1cfc4eef55d43a35eee904795b311064cbcc794c6499cd33bcde1d8ac741a20f48a50fca20b8abc65d3953821121d9c19103cd8c73999f7f70585afa0d278c479c672b2ad593db06c4da5defcf5270f13570e081aee23541d18d396fd4ea3af54341407f03fbad3d63f967f2654ea1921218e2ac3a8545b9e61b26a914dfded4fc278be48623cf1c5b9eb9b1176cdd6ae3c86176f569f56294dcab95ef3775d6e490ba2e93af7f53dfd1d870b1f486e82c2c7d82e1fc40c7394ae8347e5b932fdccfa15e95d8b86904260f9bf5e70ad9816892e8d62b9a81854bf8bf7d65e3111ac3099f1500cb3ad8eccd9e84a87bb8c6e080b26974ce572935f3cbadcdacff0c721e0702cf97b11775bc5227acdd1b43a7402c1041542191c157e466c7034161d49206b65caf2821e221ec9db05a927e93de60cec26465eee2f7053b9aa0b422398e2f2096e82d3ca8af06582dfec5195e75a9ac274a272dc0ecc9ba69f8f1257e1c3016c7111c97ebcb6db995a53bef0d9e665c78cea1628bb4a176002993709964d7a42d98b2e6a046c73e70f4ce6079efc2e4fb69786678aaa7e449fbc7ef3d9ebaf01 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008936aa4df03e3c14f7d829ab7ac8853f683e4f4d71287743822f087dd884e44e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc386f2d9994c36a5801563b39de39a978c96e3c6dd2a93a64e4539e7188719269aaffffffffffffffffbf312247533d481e255cc414265393763fdb492a131f2084ebcced61076e2af121a7249a2c40b00c430b51ef9d8e0a5186374de39e0697ca7b0bc7d679bc4cf36c8bcc1d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce26474a91c05cf4b0e4efb9e35aa56e492d5c267d11bc4e1ed93a78f9f7e7bd64bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f0537b6f59d251f274ce9bd69aadac2ebccdbd2b947c6335188dd8e2f4e7c3b800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e331bb3bf86653bcdbf3e30e2483b7ef265cb9ab747bb9c478d8e6804285a2f41c9ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569e1341d36dcf162ea4a48ccd29cb8fd9101b7cc3d8019b6fa9dd89a89e6efa483863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a022c898c346e66e29d13e92bdf9fb8a6f4b0ca17ebccd356546b7590c6ab6200100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0b327e9ee0396d801b404cbf7e4a43ad4293e1065c5dc8a46a440b2593d07272200d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a41166c1daafe57dcab05cadcb4c4ea8bb023a1cd18410dac3a5d7067864c633c703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e5c1541e891890bff0b01a088a2935c103a382a8ac3ffc55f592825cbb4db1f0300f0030000000000008509c0fea4d220878b9bfc4e54ad3651f40f75e4a20b8fe17d0c302c7d165ed12b1466a0b30b7baa6c6a37dedbbfc28e95519bfeca3cf1656df40ccc892c85b811bb6d625d57ead9db52e7ff532a1622ad425a786f0e7f293b99eb0e73faaaea889595a344742fe75539827e21ff2303fc1ff9a70dc988b634f556f584620e83cfd83603a265d97e78e967be7a8b120f928af33285ff74f4a1f3a4c3e344531f869f28ba5d5516ff782280bb68e424aa6aa229e07204fd707c6661b1d01c395f8b02a298f8dd388061f468eb65c00d16f595b05197a8234e8d42bae7bb06747d2e4367365405257f418b6064cf723ff5aed71997fd50d9d61070c8a641152d0806a1ea16443d4604e9219d1355bdc8535e7355f374d6d6f68be2f3f1a5b879efb76f97dc1a196261313e9bb698051f5722a184bb601fc2b577467eafe23c4b46026ed82065e9fa65b36184d0ee254a998005e592ecb3594d6f90fb45cb864cc17d17479056ae40dc17b5b9bbe667abf251976a5ed7c4aa9ed16373dc60c84dda82b658e5743d98319ba143f871955502f220425c40476a15e8d080ce027ea0d3830b6ab1bb86ad8ff7c75c7f5dbae5b5aa0a04539a621147b47470a977692882cc55238d6292416307aa7850e32d8d51351e01d9d55d4197d405375c02709853b7a115700961abd6ae4b0edab2fd1c6ea6a6b8ce445ab5a1bbe7a3475a9668c6f4c96c8dcededabea0e6a3cae48bfbb7ba928cf5243ce547faba171377a96f1fe92fd7b8751790346417e3968cd71e3811515222279d65d6a05c0831cdc369c8beecad5c030901d4f19bb3554af5b90c8410d475452b59122b1566247e9b78e1ba88570c0513fa05a14ce243ed49bc097a2069487cada5bd14fafac2716fa88e005c1549523e1c223783fd07cb30433b6b691ef34fd03bb3b51f06412f66ed0da5f8491d68ef561800d6a0f2a85b500066b1cc9ca38f09de31a7c1ce02ff928a49c7c324ce3c3002f4a44bc438dc272800936e33b66677376ebca0971d217fc8d8d258c5d21227a90ace804224ebd65807428a15d373be8ec80264f2fff1d1dc88ba7ca1a2eecb61c7ac1d5b59eb843ab040db71058c97caebca5a76fffd85973886f31cbc8a1fdeea30d8bba82d6e2d275f718acfbd8b1d0ae1c690cfed405c69d7f15b74c4f8df6d496b3337ebae3a6bddab1a413400bdfb6de2b5bdb182e9b188530902b375894d677f1a00112e681324eda7b247d96259b3c514e69f754875c6a57c4ab14578b6910f091f381c33c23bd749e405950197195cad243e2940a301f1e16443e2f8d9e7d4f78ee1ea452c3b50caa62d3786560990c28b309566d816c76799cb7f7bd41b3a54d743c371bb76b7994c5ac81e40ecedbfda659959b73dc72716f78744a42bd9038fbfa837 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000069e5b076ef8314399f0b9191f5cf192df2439a7362815a104194e9418554c75601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38433e1c54294aeb8773a3e35c10ac729375504e7cd8247c991c1f4bc3362e2c84ffffffffffffffffbf312247533d481e255cc41402957c4d5118d30307aca9bd25d8fe126a9586b301bcff352dac187c67d958bb9b38f8ccb80999ee5730b1988fe3f4ad4893568db66b5dbe00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c40a5fbde11309155e6fa32ed6c44be0b69e7c46e00bad23fe62a22e379c577504bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861149a4866887179ae835a548a0ecde7cc178994962f06959611a53a02a2f908a7300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e337308682bf6e1984e843b903e0f3d5de88798a0fae2055b8375697c1cc986a90effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085696a70a14aeaa7585629490e9933ff987040bb3ae270334c2baf84410f6591b470863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a03eedbb28413d068ab840fbc1bb583049ba9fe2cc89583dd0c4e919149e978ca000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b094a986f594ecbf93ce03f69926c2a48a902b5ce4e83dfd781287b20c80ee20e800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a473789fb8f9ed3efc4d0b74f3bac32d648404c210743d6835ac8f47348f018d4903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e3bf470a7a493c58d6ed5f20bddeb6a6e3e453119de3bf4d99cca90e83a42cc4700f00300000000000082251e19c7ca4d946724252c4bd1db00b6292b245ddc5542fcecde5154673d82045935f37a7731a4a996ecc64232176fabe5ce402d40479e6ce2b8442772c30edb0f36578a6d6156d88e1720f761c9acbd46145569afa509b2ce28841f37dcc8b418de20d1aea2cb929e057114ac1fabfe6af101205cb89e2e87613f0007ff9e7c858d55b4169f3b2df8de12e057cf2bb5e3d8afcb298f6dedcd2484f4174e8b4c72f8e12bcd5c589fea406e38bc3a5f8323823925012a9ed60f723a407621e683c8a7e52f729cc69e4d9b9394ab25c264bf26c69c803e9644fed935337f6ff28f07e1711784c8a2478c2f8369629de098382f030f5495dcd7fa5e39b8544ad5fca1a05e87f95d652681f73a641cd737820ce10c6ab296a29f7c50dabea91c56980b93e6a5af78a4a5360680f55798ce546f9e364a3c883f8b58e9f1dfd5c54cd39140d4cadd255e893243585ba04e19a9ddfb7523f60a2b1372db747b6976af4e9f023464906596505872726033cce92bda515536486c40a314821250303da59634331cf565c2068e9c31001457a767bd4067fb07b46a9c1d7d1d17a1da8c9f50577ccb058ac144375a0c45751cba048ebda97284fee45ce32c869a47b9b8d9a96c6e8f19bb864858759cfaabf8818107f3ee27fdfa5a22bf491f52ff7ace7e895e51f994dce7f3bb29d4a7c9db286912e99aa3e8728d01580b8d8a9b29d557882cc7ee36d53b42f214350b37cc62f310a415def28ca7d9cad9f2c4cc6eb2b1bbd20265cd1fc78094dd9b426144540ea3db69b1a816dcf223c1178cb74d0370157e874c22626c6467eed93118a798644e6fb7c896b98e668cad46ce2f7833246cb2df4e6bab97d95948c068b16ab5133b5f29cfee8fe789f0f2ef3a38e3251946e79507f034a2a2ca6991f3c108121d8c787c5d9389f1aea15e80fe0b894b1f09021cd8e59b56c331d56ab2c8103811a8f97e9bca9d1b4939945bb9b08d458be5218384cfa14654d62fc29753dbe358cdde0e2b4116ea75726713e6e51018c8c9c57cd714d6abab4895ed126d32f626231d5c13524e079c20ae6410b86b83318efb73deb721d077a4ddf028b46991435585656822813e53f922751e8cd7fc5abbd8dfb150ebe02fb8069ab03b5e224c9770482770d0596121a8f9a05193440daa59495aab66ad501271dd1d8bc4c84187587ea374b7ff115739842f06de25f6da3115503a0cb1f80cc04875ecf40a1bedd839f3b5b0acd4e77c3a070cc943a14d49cd200191cb7b093200dd045631340c0150e29e073d26a953950e9d0a7e3882a24d0f269a2debe4467d8a12e6de3ac53e8154d2b6e91119442d21082f3fedd31bf87bd2336cc891977a4f79b15919754f0701c0296a1af43bcd8ea25fde1c1d269bb1a499d021ae7e02f96048cb60 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000020abb48a634800cc6c33d99c9b871433fc88233427d2a4027d6eec0c685d535101e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3844db933e6c814af05aa3794dd7ade09664f61114619dac9bfccb2759cf1f9fccffffffffffffffffbf312247533d481e255cc4149c4cbdf08fd78a29fd88d96d1de9debcf400b7cbb06505af49b7362197bd146dcd01a12838e5cc192a81ed6242abe976544dede6d82c557500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c23c7a51df693b9f4a5af715c56a451b50d33b4b8eb412093f49d7d8de932db5d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861138a541cca6e704cbe7c9810f548a20186b629affa0e8237b9458375814f66c1e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33630e0fc9e5831605d6b21d6bec5d924b46970f7da49a8dcf2ece8de21ddcc352ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569f0e58e045ae986eab384f3e6fe9a0566ecf5354122793c9b46cbc7fbd6644fc7863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a049350b197d056de532072cb1ea819d6b6ee1aad38dfaea63c38036d67e775fb300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b05f3410f195dec6094588c5cc1f2df551bfebb92f3087ccbf0c908a479649b71600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a49c0a036c0380a6633a2f76cc87a74048d5744111df28f502e85b3ae0ee7f0d5403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee43fe5d2a91d0a7a154b50d6d373d8144450e082c64ebcec14c5e7af9cbe1b4c00f003000000000000a6d20597c7e5edb44ea96cfbbf4752ccebd1d354f6f6111245be4f00593a726e5ac6b187a5eec53422d9541b9650647d8da39917a79d5de8e728b699fbd88a784e42ba6d6b3b5202c3917e0fb3be3498953dc79eddcc5ea023a5cfcd0ff2efb7acda7911f771fbd9898371a09844e10c61626e28a82da86654b40a58e830e4f4b162ae4348655caf073cdb2378d4187e882dfd467a01d171c53370371fa677c66e04094cd9bdf2024bc117e7c61b0264ad3597d441b9070a6eb312fc018db47b8c954606d92976c9e9d771693b533464ccfb1732ba93bbae34dc6dc20b42d15198459af7dd59141f6c495150de7921d88ce40a3bb25d2f88ea394c1a4ce62a70ebd3bf3a664c6e263983583c1347c792288721f52975454b0cc5663da82e8241a9e5650b932c68d9ff9af7480eadc387ed910494b99f70066fe8da67e34143346aafcb423f2352c50662b4ef2e6971158b234d10686777e443f0fab68628adc8e54382caaa2e722ad1f58841658a0bead21b953436b828844e765de346145cc2ac002bc2b9c0b5eaf344ba1f2b8b35efcdc940255d550be9f38de4056fe53319a8e1fabc28e527dbf1691d8fbeb64be693c7e3cc961d6e7e277920ad91f054b9a8f011f28b1af7c2a3ac9e68d6c5c2be4988785c35159276ceb686ee49197d77983c5d5c31fc86a17d7d4803e8d2e4fc675dce8c879f59866bf88cb4841ba136b0a66bc04880b7f0117f96baa34e429ac0a5d5a21b879c172fa5a4290ebb69b5e0b3a9f135fe66512c77b0792f1607328f46e3f919a1e771d2eee82d25e5b131eb4ca30762ddd738fc9988326f30903b27fd4224f3146f603af588ec2858429bb05f1341030f5cf0803d532d23657d3011e30f46f1ae6daf73e53154658f04e14f7d69837615a826db015b212067db3101a6f0a0c266d3d0ada0e57cda66669a7a305ea5d53a737772e062fc3cdc751c8f23f7aba23135b10cf32bcbcf7173bf759d5539f0d3545aa4ec5632b3d2543038aee3f3e72b5ab5e92c8a7f7d81f43e3c5a0c185605f6ecdade43943e6d3f417336b3f8effd2c7f1c013a1b11698679f714f552746a6ea51e49f208e574885352487cda32f99d1f657432778f3e1ce692e5d6b05f15c7d701ca81fb2d79b94a235775b200b40ae0af1ce0ceb1cc51043b3755cbce8418eb2eb0da2f0f4964034456f4c532fd0585d14cecd956d125cc0f5b655c7592026900942ed4ac64c167a8745e8712f96c297a332815bf1335ecca7c3e4492aaa1b1338aa35e07cd4f1c8cacbb0a783752c6bdb0a75f4b8263ed55c3984479d51967f2865ae92a4cf657a56bad81924098ccca47adad5d85a15c71ca750698522bf687b729fcde95845b8f91861083311721ef7a84ed3968898768c31c8a2886ef7623834e9bf1963e67 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cec660929904e227f6f859b8e28d96dcd0ea27c17a08257dc50782b1067bd45601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc386f14a915e0218301a6d939bbed55678a1a9184aea08f927307040b9579680a5fffffffffffffffffbf312247533d481e255cc414cf781337961cf65289d25064747d807999ac9957e3205f96fc7b4a0df742525227ed097782a7d4471ea43e5497845b945fefbd6664f14e5500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c38e0be8ade34799e852c0fbd0f3dffbfae4765f88b6d7e671f4c348153964f8f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cee0afddd73935661c0c7c09d16aa90b657acfd23f3b73319d524972ed52c11a00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33fc33b3390c376f0b60c92b8b89582b503baf5e527b44c033ac1cac23c194590fffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569e40e62fb3d6c4846b7c77e8c2e8ab5e96514a0bdbb68ebf7bfd8a3986cf44ac8863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0b639fcbb39d59318393694db2f723aef0d3ca42408fbca6c1eaf24785e8acf9300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b00be22ef1b1e65735f7009e597b227563336499ddee6327a54b240351908f47be00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a470603d0489270246c751d8df97386e00ec01b9dfda5214693f2acbbdc6c25ec203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ed21871b50fd1851d104df1f0f4fdd096e448e51cd281320a80b596425c58fd6b00f003000000000000977f5d8d164c83f03e984c8100592d94707f48aefbe8c086b2c38060b294ac946c3738baf0e5ae37111b4a97beafd1e1b99e14f05db9686fda6b1503f5ddef1daa5864ebc168f3beeb3a2df281d36c8f278f2a5a7f89e051b4d83bed92cbda8b8193a8425c0cebb373dd535e0a6d4579ca637019e9a98f5dcae4a3098577db81b1633915af5f95d0399aa00e22c1a1c2b145f0c013638b557f69b429d7ce290c392092a287d6f8952087560ed16c43d7a25488c2e696eca23c21500f2273685985ffddceebd4f3ea73f5c66c40184a2647bf38d389694363af1e7ca3aba58dcb7c5bb36e90691722aef7f49fadbaeaafa97e6e68a5fc68e7ebe3238f40adc1d2ce64ae974e2c5e1f30cc2d33df8dff23cb182b4c590f42a398e75036b981e182916331e0a0b161ead2e28d3723daac00ebbff52ce3ec12021ee2226863681068bf52c8a8d7cf468b97c6305abf52e84394a5c54069fd7bee5ec13294caed31345ced755263a86c3175d818829efbe0ba355c4bfd43349f29330762a58334bec5a3c5f90730654782cd5fabf92e3ae12d69973d16966806f509ef1d74a1402f4ada3dcc0fdc7062968c32e0eb211e3431b59a68c72d025f892d317e47cb3fb8a597acf40eab2b7b4441654db9c99b73f539ca9909f1872d14c5f714250761e87796caeb0fd90ce6f33ef60ebc9014250438c13ac0f96c5a0b0db4c119f46918f9a005d11819a346e9f9a847d4b9ff8b5ba9399c2243c28a5cd97ed7a147c459db85fd22b64e7c39c956f24f81746e0b673c53da99aff6577ac8648739a3f61e3c63ad0327deb4408b3ed0fa3cae0a1968c00d4685b67940e21cb0383905de332e4c9891887b369c6c955ca217141cf44f6227282bc054578ecd07317f5d319afa8a848b171212182c86f8bf3373fe2903eb9e16038aed84d1c0551e5e2b97b27b27a190f1f8ea05785fa999dfd5d0e1274a41c55b4c3667c7c54fd51d0f0e88741ae63cd988b42ded7d214e550c448e7040d696a6e36f6d0476d83f7aea384cab0360568a320f3bb52b9b3c686332fc2136e88755067439e0ce39c5d5a4860976d48b00cc4bdeffba7cfa27f4a6f07816a57f5ef0e4c8f01bdccdae11625d446f5d4d41906e377384a8385345d1eb21538ccd81bcac4a67afc8c1fd9923fa9d3dda12e52ea3ad815b51fa74cc573baf695825e80970d3be262e28257c7a44237c472db8211dc4a94b7233d8b8bff7290b5204971925c0f4caec0e66760012d9d0aff3995cdbb43ad3a99281011f12891fa99b96368c241537bc8b84fc1479bb3de6bb59bc1ed86c87c7217424c6c12b34195b43595fe4130fc4455c484b13bae338c63107da045d475086784f8d4d2136e2c37076aa5ed9bb6b07ca99163bba00e6b7f9bbc5b4cda29f5cab6b3845de13 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004c1d37643c6e0d1571b4e02c04a3b4f5e808d67c91a1ef5629859a29f5371d6b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc380649f1d87b8c2b0db9e1d1ec2ffe925a59465720eb19e68dcb0ab26c2ca55feeffffffffffffffffbf312247533d481e255cc4146849a681016157fb5443dfd7852ff163e87b0cb9204b86bc2f2a0d2509013956ec2917d22e70bb4104f271b3746ca8ac00af0852163ca8b300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c581a78179b72b5b6f4589c1c9dbadb3c719e2ee60d654818de294a0ad912966e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b825ef73308275382968ac29abb6ed6299623b26d554f6d3287be8f98cdd88b900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3348f8a5371eba9fd138bd3a751a0a037b48eb09927e7edad859b5d1c8332ba42fffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569699f1b7ddb6c5d22bfc03b6ead0496abf4d2bd93dc4153e856847589d51b111b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0299718aed72f9349a7c836538ea99d1e7a669eb19e9a1b33f94ba5afa70cc81900e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b04a36119415175aaeae95973c5f22226d071efb425e42cfcac59f040442806cd700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4c8db1b56da826d645554b1a7d980616fb7a27f6a60a3ee39d7166251e18958ee03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ea65b566f8cecc22e5aae1055795ae65de4e24f3346d49ab0c1f1e8b0f90023f200f0030000000000008bf8064cef90fe2226b298d72c163b3e76f441f94083203cfac464a10361d4ff241c43c5b48b94d37ee0d066a0ac882b97ff4df5f66ffa9cda160a5f59bd85df161552118de273f91645bc9638e0292262e8c359d7ae1f194d2208207bdcdeadab6f5738ac67862a2f037bfe99abfb60693cbac125b72506a05fb550ef116ac94b322ef2b2ada45e32d519d1f8d990e0a1678daa6fd1c6d84ba2018c95a2d6b7cedc64f84d26aa99813990107405401965c38fc9ea2e68a364110bfed606737e8d8b025736a6396581285682d1066d6210784c6197193db6ed2cf66dd62f6ab9a29ca358a2eb7e6302c6fbc32d02550a851347a031c4d3336801a9bf78e0304fc07ec5989720b6b405be40257521bb1bc916cc5517ee184637297429c8f33312a91e79c3132774a24ba3c4b6102f5d268c07c473cb82ad1c258fa04f41e3afb52c02a872998d73560e0531dfc57c3af5a9c0d616d8ac7ef93b1d331116d3500d9864c7bb01094e172facc4ac86c3da05c21b800640e2309e949db8fa2a5f6a07aecfe29e388028e51f634f314fcfd3242c2079d15daace42baba79e2963565fd11239aa7a7b6def2f4f0f6eff269209097d9edf406099ca4e0a6b5ba7ce2cd5d43fbb710df0ed211daeed5f5e7ac2da0496fd345fbdc4f8c6ec69a634f6bb4b7a24b0fcbf048f02bc2275c203e56cd9233e34c68bf24227e2373cae2974ecaa6c9d9cf9580fc43e57ede51500306693ab476b135a08322d29de8d07bf50f56a5d3c11e2788351283b75d4865602d31442c47caa9f40cd2f983e3037cdf9664dbf55600613cc8f7dd45eaed643158d841f2d87608b9fe163fd9807580a1ac3e46449d79cd329d434a80ad2ec0bc381948b46a83af71dae41dc9fceb91dd41f43958fbade6c614a9f3a9e71585b6a3774f9b43ba7cfedea370f679b9d20ab3dcaa904e598bcbbe1dc5b14ec9fd93f9684577d93e56d6437a670b410c3d1174631e89dcbfe1b88593d0539890c1d443da07dbcc68d66995fe40f7773c748d43200ed3fe4fd17161a7796ed9cf15fb296c6bfcdb5ca5e508b3541dad682222d87f95ceacd87e89c2f3cb9779fa36f272ea0d76756b27dfef172084f7c5f3af5dd58b83f98e5f6ed1de06fdbd8099094eec2b4348b955590bfd67540221b0906b015739a339ee32b4dbab69cbc5115cca104b0cf70f9210cd256f2dd02a7a989a7d1c850e9cf86790832adac9e90f984c0f50f0e6fd84e5b1da4eeed54f87fdf598dc41956968fe7f88c852856ecc075add0f28405158d383ce6be3c3d8f1a546d0516c2413d06a6fd7314b29435f18bedc341905d2dcfed5124d6f46b1721622eb5a74af36ab57a0d2b2e3d7b448c4e3ac06fe030211cf2707e4a86611f058bd2333133bf91810037f17fae671be4333406b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000013c56b4cc379538908057d1be2b3b87d877af0c677bc56f00a54bfec58f9533d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3827fafece90b268e6d3718df28e2f5202673c81eb63d1e284f6ccc93da9137c34ffffffffffffffffbf312247533d481e255cc414999d79988017a3b10dd3f1cd79e5f8acd289d7f7b0077e31aefe31078311db220c9bd768d7048002189d3d8ab081e804fe76b3efa610439100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc55cf1bae9efba0fcad841de3164fd1e01b6145cf745cfb82dd353c46f193c904bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861105375028cc72893f28a78c071395471c8fbcf1b3b4ad25e7fa8f0a5c6423763e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3336b7fe1f0dbe101a2fc103461e495d6d0421c6c1c3e943a4cb333e47ef511b0bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085692caae798b5d3c5113408cc5ce402724f05d9a5528119d3f211622a067ba22b6d863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a040bca225d4ef7afcd1d7cd7ca9ea056f6115a9502f417c303def0004cd721f2f00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b09e607f8f32e38588d06b94d0d738db2eb21d94b1660774e8e22a1ad4e207276a00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4017e6cadf36b7e22046bece79a19fecd64c07a738d2377038eb5a65ae23c478b03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec4865f087c4c3d9e3157e1e9d25f9a2ed938a752ad566f2d44038c8b7f6bc62100f00300000000000090f16ddb9b7aa8cbec2ff8351316663c958751c22acc0cadab7378e935556457cd0056e5c723ae9d3da85e94ff1773a4a87c564ba56ef407a958a05a35e5a2f5656a5d4f314d25a9d693cdf5c083a690b1bb7d09c369ae685792e37fe249090cb362d9db5aa9ae6ef6463fad9420c788f7bf95730805acedbab74aeb91f96816c4a02f66f7fd0f18a26ae75f314ef389829f4bf6789279faddad43b1a86a139673bfa20bde4f29746ccd764cbbcc346efd54350c45745945bbdaf3944037f5c2b12dbd47b74cd5cfe51a735e4b46750dc6c1b66708ad2c9a5740491a659bc6f5522f7675aaa68a50230f5d53b736150ab287f4bf9f6771f05e29e827ffcfed48230be66a5e36e5b6317924d4f70cb9935bf8740ee3dde195e58c8c4a4faa03a5999769d3c73d236a4c4c9425b63744071d3e89f3bc9442ac77357faec3116bc58a36f76829fdf30d3aa446bbd11da62fa33f21e478d46a42cf9d2b935a7c70bcda27807d932c21d684998205a5dba69d90e866bafbc6b10f05ce7392b4de0de0ab0b320284c7e2cc4beba9b5e94b33c9ce8038544b80a1224671a4c2e03d49068fae987b3af0a3f4916781b384e9c84e89882712e0a9dde2de1a93c3ef18b7e199f618b9ecf5e10c7c30c2ee8d22d516825937d3aecfd873da4f2c49d661957e834831e3323d744efe85b5630090430d88dd69f91e5ab363b7cb2256fdec244dea05850060ef0c013fc7ece978ac36dd2cbc90912a00b6906eefa29c14eae09b42c075e66f9fd9363903fb10dc363735567229dcfc683127979120588143a3ea8cf28c7fdf4837e1472ad43fbc1f0462915751827c9e447d5ebcd92d7fc9164ef9d22029c66a7c6d68d90c7f8cda40697e784bb97278d5b9833ad218259c050b873563dbc94adcbb6fdcbc5ff42c2b4c17dd095f6af4e425c6bbc657d140832dcb89bdd98d092a3b0079336b8edd3716183c22e910d54fed2c165c495bdf0626328d3576539b3e8e37be8ae40702ea6da8140d19226980de710a6b2ef5bca668b8a825c301fdba61001a8220b369da3e1d2a2118c175a96aea9d584e412cff1905f899aebb943706db7d56bc42e7342178b9f5ddb254a066aa6f3c63096076f9196a8a70d40b812124114817cea253081aef59ab8c081688b0046c99583b8edc4d8456efb93572d14afdc3dda1d9bd017a2d49454292ca7274e2e52c9f83dfd14ebb48b35e55efd4ec0deeaf23604a61ea2a132a75af3d2b97eb10f92d6213548f940c1b6a3443be31dd67dbc0a6313e65eca03ae188a395719f402abf2bfb28e46e8eae5c972a79c5f06a75883b7e289233b8c217c53f0dbd2bcd6e2aef2bbdb592beb63d38527f049e357e128f7d1809c2c12533707e238cac8238c3d380ac71f5abf394a06e2823fa4078a3ee3c5e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000829a9c6baad64537c0f54ddd7d1eba7039ba19477c1d530d9f4805c8e733af4501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f2f6523a4566e5b75c5a5700c2d020962f78aa6c464a21c3a9c7b230513a17d1ffffffffffffffffbf312247533d481e255cc414ede95ae5b2c71a36767c91d1cfef02fa7507c3ae5f090809f348fb6e8820b1faca0f19eaa58ac452bf249b5a2b8e7d03cc435cae365a56c600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c9b7106154544c19cd0343d483e483818c94aadf26d6f2e3759dc66fb00dca8984bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861164502a0bb4c6113c0816493efb16fb14a92a74b31db60af748cee1661e88121500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33924a4d786b64f71404b26f5e0f90f617a2d10718265ea23b03bc64f7dea7c59dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569dc86c1a58636627b177f7ff048cd9711931be9da09a7e24167c346fad4247b10863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a09b1dd78b67ad5ffd5034332078ef17e21a4d648db13bca9fb323e859c94d323900e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b072c25a12848707bfc035f4c8d3f57e8456cf366378cc0490489632dcb97d63db00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4717df7b5efe1e308408baa63cf9125d435d719a38d811acda91e49b014ad872303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec176e111559a7827c3a20b20e200085e13c1e62a7d8e2ac2283ae25517fbdd0900f003000000000000b435c1da8ae3cb486672796baf5fe1139144e71fe0be65b67af55d6e12cb44f946095308fa1eac09e7257879812d36d199315e52800721b5f8ea6ac3b926b54c2d11379d9f50603fda4dcb3f0c3c2d1a3b87467f2552bf9ae1cb7031d8556547969de9e7c10d522fa35e59d3a8f708f901a8bdeef2671333f3a5215a1e367c127b1a61d64dc595540c25b799ec293cb6852923b4758d77f4a390b489c7d972e3e7a44f89aef6f4baf44602e3bf0ff0fedd03fb7fd648de080a20b0f89adbb7dfb861e4c9b3584e9ca3f0f0a26c1d5ae3cd0b696112ab5481bfe99e0d245ea8381e1c594689df1df9c067405a28bdf2bbadacbeac947d7bfd2af2a10432e54f059b9de50b40b618277c74a07a1f16e03b14cd3cf6bf080cfb60b0f90b44c7ea1b87cc0c1ad81ffb508b0b8ea014aceda61ca03909bf12c3c14bcba43adbdafabe8b882ed2e20529764a1e51b497bd057cb95fac5b624a22cfacf55b1f946e6d51123bbf426cfaca11ab7888f6fc1ccb7f765d6926aceba43f8801a463ea7ab334b4ab40855f03cd36736aa94139a2f3130f187c146497d871dc5f6fd204e293e7e9e6f2b9bf49f3f22ec2d0658c683e399325c1efb89ce419cfe1af7235255887864fab92b301955e6e7ef9bef0c422b193efbcbc85c4891462112bd841a795118963a8ff69dc64bf01add25fa17c29c15774ec268434137b669ca423a1b05f42509f44b0f93855de8eabd0ce61aee53c503e951249a350446cdcf33a834936dfa0a3bf63e5f4813461ecfc698563412ed104600de31d43c7fa739776cf44fa4c75d4c5f2d9e19b8cf53a08ef2ca5295ba1222ec07be3776ae7ee7d26a5c06aee2dbaa07fe020591c0604022602d29a46c3c7a96194c85b73871aa802a5d6c44445c98d9f00eff3d46d00a31e2d605d315129dae1ce7839d247af630ee223dd2e1cc0f71af58cff9fbd9a716e850758256f2fc0192c55db23c80a627f7cc46aa51cba11224038a87bd86aa2e678bf0b16ed871393d0b08b6b01d81d1b7087f85040bfd3df188d67225be7328fd2a0d85c8e5fac9201c51997a293eff9d36002f80ff92bbda1b77f186badc858f982933adf4ac6e66b41d833b4cd6619ec65ea836d225719e568cc167b78223c452bc8377e56ee5925c86130a13f0d047329c17e4335d60f5db7b69b7c598fc5f0ae192e39355fb98c4e38691d88c788761111a4cd19e98a324db14cb2de26731822a2559754d076c5c84e0c37e7ac95823a3230ebd3dbd3429c047fc743bbb31b259d5626d064611df12971bb9e9e88f449dc85661253a88fed7ee0bb611644d07a5d1fe440e095b41daa9457e739a60b5eae5a936041441fb755657fff04382e9576453f2bc6f2238184b3afe8aa7a8d3c07d24a8004b67cd2d1d1447c0fd12e177439 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000058bf2bb415cf3a907f4a262e683cbf8c662a713af560da15387812118019b53d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3894c057bd1236f66f949efdc206a8141499674809fe62e295a2ecc830a227be1cffffffffffffffffbf312247533d481e255cc414bb0a496a1fbba8dbe813373ddebe46d6c844715e64b15888955a47fe16f0fa1c68f9ddb7b884e4bdab52dfe3743dc9081c0f9079bcd7f0fd00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfcef2b7ad785e94f95b125508ff10f9ec413229abb073fa9cbfd32a7c025ebd64bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fc7a8b8c873cf392aeda3af09a9efcf4883fd4d1b9e4c48831727bb47fa4c10700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e330cb7af6c2996c1dee3cccef95ae48729f25e3d65901d28305eed36f726490889ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085699574f8ab8d48a049aebfe46cd413f90a7cf0aa90bc0d66d203c103aa532db563863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0af5a76e004d31fdcac8ee6e3c509fdd0a58f0693a9df8747ddabda8c67e78e9400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ce66b608676077d276c16911a9c62b74729040d3e2ab14e045e64f00a1f73d0b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a41159f27df450f44514afc2c88ccc55ae0808aa630dd285c9d65acc1fc54e494103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eafbd011486897e862f7bb45bbf5ef1510be8b795b09f4ad5b0df8ec3b1d3af0800f0030000000000008d22f2c39997c0a6a8cf39b58267fd4152a1748262ec561eb5efbca74799020b74a6931b9e0fb764d11fb4ead8833342aefcc78151f7be7dd0aa1e4b4e687e10ad2869abbe39578a20ba329f14ced784c294bc2bba8d4fa7d2f08c142651a6f0a87ca2a4209d1ab1a2b88c9b539f1b0ccf43ba79bf70bb3e28e2b05c3911943c9c456dd8c42455d34bae17b6eef7a0e493f1c1070c04e60e88cbd4415dc5b1507dba45630553dc852f77dd5f4d9479325b88995a240d279fa3c105595dc121e0b450798fc48a6c1d8c45294d6be51e173ad66198639fe97072a0b803a5992b119750f1d4055082951081ab50611369949257ca78caa9ac843d3a673390ff6cd313ddaaa414b21b9141988ffa4e5c6ea6873e1e8379bd4212beba46abb4bece7ab381227da7a16cca64d8c53060e7ffa4402a786d40b8867f600c68e96c7889276a34ac4777afdaac0b3b36bfcbd0f3f1839eab4476777108f4c1697f8fdf76352e1e4559b6d86c9738762a419cabc23931e9564c3ebe855ce79a68390b582e40b7ebb2c2dfa84d83481a95b63f173d77c7c4cff0dcee07b0f22291eb800473feec8cd2ebfd4af10c92559097b314b36a827fc8cfef2d608b73344833e81f75a7c22b5e25b0c1c3fc0c49fdeb024654fdb6025ed149b34ec374b28f94750457218a3ad673a4adb155b9d0a3348c62dc33195bdfe7d926034b7f362e000af3bb3d6ab4dffab3a0945874cc4f1bc47bac29c6a8cf065199df6a39895bfac19ea8c14f17ea1ccda588b90c2922e3b1d9f568868c0a2afbe493b12eac789c9f953e0fc496336ff1d749bcfdea5622e52e8357e6c5c13b8e3aeb798beab2b5b256571e8920b6514fe51b1dbb5bff62ead0f951d402edfe057a27e506128e52d86a686526f1b3b0141e951f5c47df55129a6d33a71a1d22e502b126ade3ed78fe379ee43c777dda6dd319acb53ed92f50d1e0563ff5e0a6f2768b87e162cc5f627cf4e23a0a79b4c9b221fb626480b7d30eaa239a586a0090e0b3884ccb4294dadc2ff5afa93eee0ac592e2a7a3465da28dc6263f7d5e9903b996571907525e4ad613a1135b480577f21ddcf3fff8ad7f252c0f2e635f585fb1f4a242934b7fc28aca1e029cf034c37ffe4b95f4c6a141afe643b52ed4f65c67b9a0211bc062ef3a32a9d47d6fac1da55895eacf263ff0ec9a347ebb1a5144d554dee5236cff9e2f2b7371827f56649677a65b1ddb27c30ead342023d64e6f7c3f04c278cfa83b5f08284958217026322f4bdd9856e0601fb14535878827cde37aa4e6428e08459b90f7603725d56724ff5f4b62a5a8184e376c15696824f43a39ca965ba30a06fb7051b2d43b7cd027af1f62e76bc18f7aa751d8b587c935644338663ccda9afea16de9c89a6c65ade2da8e756c18bb89c9a60 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007588b63dcfa23fc309e54e0bffcff99b08e5cac092ddb0547a7844a3b1bddd0901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3894420c026e537f04bb1134f1073ce250b2230c6dff740445e3c93fe24aba2304ffffffffffffffffbf312247533d481e255cc4147ce0411f1a01a4ddea36c2f8acecc877c0dae0043353ea6ccde909dd45fbf5f1b6f2ca1f6fd648bc8d1b4d9ffa09789ebfaeec273ed117f300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce184af002c1fc77b1a508fca2541449769406f21eb263c26d48e0a639d33e9254bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119904e9ee59b339d6b584f050a5ddca2b633a957f88a878427d35043917cef7f200d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e334c4aa897c642d41964dabf1424b14b513d16acca09a969f5cff989bff0ea793bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856921c4db8b0a72ef14a7172aa9ce41b93bb21aa03cb5ebeee9bffe3b6fdbd46603863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0f9dec2b0bd4ef7c1491d217396d8560259265e334f335984719b324e59b825d500e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b02124e6fc5a9b61f4d8669ad97c93a0b85c1ab6b1a4ff6130c6c7465891ffb75b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4809d433cf62262deff8e86abc086682cfaa730077671b1759a9c93d2e265b47203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54edc12fc82cb4c98a33b1614e52efcc5e75c4aa7fb8eaece87eb7321e4535a27f300f003000000000000a24f662b0b1f771d79d633eb4163e7a41d26756d8a195ef6491f803a2823390e9d1525dc941602f70b36cd780bb5565bb06eabddc6e11f5a23c4a95fa4bd6f50f4e48b831344778154bfb37169cc8495c0ce5ee2faa24e2a7e4246bf77eeba248f719457d5c24a2e083e4b1c918f2406a717da3aad70778f01b39d9aa65fd6496566f355a9f72bca57ede1e298becb3a8de8544c2c8aeb8c4292a7c85c1e136853dfe45401273f049d3c172f665d4a7517f7f138e4290fc3e4edd0e0ccce94c0b8953cde4266573b4434f3eb06442330f362c60e9c3bc9fcef5a476151b1d049b935629cee6e8fa2b2f0d49daf759d0da76c9267eb2577412a7d6af6ea5af7bd8de90b8023e0adaf188fd25f5630bf071d5c122f9f8d5f8fa99958b3121c7571b2983aea45aee183122a8599e03c30019856780935ed46f7f6a0aef93d26e042f264edb3d31a74258442ffc1b8bfdfb8832e8e6546187e46354ab0c3172eed4866c019456123277310493eda983a8b6ca79529f1466cdc6bb208fb55dc33866182bbea34698d1e7712160a268892471f172f8bdca3d49b1d63ad513bf59a84d4d12930966ce64d5867797f3b9d451224a3ad6ab79c1e343da4fdb7c3e675f9751442229f64d081c3ae90114d9ba0f7dfd2eb9674c44b43248c7f4f74ec59dbfaafd25f3f154d3e60cd6f7fc97de26121be55d4b0a3dcd5593337695bc8856869bb0a36e54b619c80878c9667cafa7ee8977d189ed2c28fc3c9a25a48db3d25461dec779844d1546a750fbd6b96631e0cb42499cbdf2e9da362b93144a3c8fbd553771d60e3e2f8565564e3dca6557e0272469cbeada08873fda14e30753e15d728421222e3b942b626c5db5446f548088e2550c512cf2f14c03aa453c8fb9e68ff6a4bc7d882f6a46253fdc2d6216854d48aa5ffdb098a2124958635c092090d021e5661cf93fa814afce818d148f359a82b986dd462b38b86bf5a4e1ae5bb2fe06beea8a3078970c7e2b3bea1ed666fd7030d4c3976bd1c075a76449efea981f706387db17af1ae466648ba798f0735bc9d0b1775797bb778aab66a47b13667128238129c44883d01136c32b3cb541b755cee486cc96d5969ccab1ffc23dcf85406cd3b2df675a9cb5f33704a18ff200dcacf0a4a508a7ebf8bfd6b574bf2c839fa4b9b6dcaa38bb013d819d7409439f62d35104c8f0491818b072e6f480f5fd5218716e65c6f89aa66e62700aac865cf0ee4e2fe00fc6c6d12af2ef93c460fdd61c68fe725c9762bb9320c76feec1d1c8cf4a84704f1dff7fb81879a514ba26c9d9b6182e89c33c115a5c82a387d1e4407220d422f90548fa29e0622047c8891fce9ef8c07f452efc1c974ea79e7541ac581113c184b71609b86c8d6d948a1a444c4d91c2bbe5db756df440ea9464a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e2026cb96d903f314364d42ae88bba9b3932bc9e9a56158b019b6cca2c2f9e4701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc385ec8bc30074af11ded49ef4c7559186adc070f41e6c62856b3d28ac42cda9df2ffffffffffffffffbf312247533d481e255cc414d58275768b302d673715c583dd0a1b90a42f5e56a5c06e969ff0bf0c4baa8fd2da7671d250e62347ba10fc805cafa1af86d40c5d5564441300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0bee5578089f8501470190eeb6150fd5162b2a3bec975afbd7729098b3593f1d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611902e33baf6643c6cc7c546ce69d0bc99586ac1c998a9aa7ffcf4d3a7a8eaaec800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e333d6e8fa1100317b8c94169625b9b49ce5c56c73b58734fd13ab1fb7c1cf4dc47ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085695c31783ff7bcfd4481c4628ea1f70a899d4cfb36b03127bdb30e222337db13c4863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a048e11039b3136f51bafded0217e5b004ea7935cc34792e0ad968e4a6d1b637af00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b02de88d5916e3c3288907eb472ff8f2ad61427fad8f7e73a4bcb085913e58a2ef00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a41f3f0eceae0524bcfdc677e0049b8b591252218c403c9d2f2726b5e59d57f76f03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e7425da15a236fbd34473994bf60d16af05b54eeb6a53fd09cc05da271a72d84d00f00300000000000086c518d004170409094f15fb1306ec096ec976852d786a4816e6e9ec3c39e3d7e6fa50f3c7c202d55c471b2ada794a5bb8aabcea1ced472676f88731fb95e4eb8aaa395e0af6eff3cab07daaf93f52395624b43b9dd485c2a43af964ae378c208791ccf940c41f6484517c2353409d27a28c4d1f533b974951a540abeb222c3723cdaf3b1a7ef941cbc7002f67e7d9bfb29bb4cfc27ce5f4478363e19cec04701f15e63cd88272ee6b60ab547cf643a35c432c32302e6e91cb61a0125a78423185d0bc128af18e688d7d16394289b63f33cd9aca09f5a1de2ccc281868126ead229c30ad9ad1a677ff811fe2d993827487df73eadd5386095402e3054f40890ba054fa21d5fe554b1a1df4f1d87d9b368122d0a878e67be1a993ba232a7457be8a1c0b30abdbb1670fc1e8d1af677c28ad0a70f6d34dddc73035de38f7fee6138b07bc44a030d53d36137d501a7b0004afe2b1970b07e4ac902bdf02ebd45c1368b64ec1b5bd08868f09aafc59e2bb0b1400fd4cd5c78047cf5df7886954dc2581a57fb6fcdb1b30c0424c8326a43c635a7387617b7477a6feff277d9e0e899b3ddce7c704a5390f1c245182fc8bccac8cb870b737d1849de5d8bcc70b8aea853e8b2f1927def193e063bec5b61b53cb10059fd836d8c9c7519e9ad5bef274be9679a8b317f3c95f57727598e663e2da44f01192613ff1498455f08148f85e42b71cbdba848f51d678fe68d135bc7086d96aba9322d8a87d070280e62315a3a176163c5b57e512d01864f72b24e9df3cc073450bb18c6aba8ba1859fd35b92bcd73d487ffb0173bdea946b0c51fab556d60907fd4ca5df50ed9c77e98ac003e0317341fdad51b2193f683e545842a06e7f10cdc83b9858d3a236957f42e23aab6beb9e3215ebf7a0aeebc8734f474f60d04ce852a323b87c628d7da1c5576aff44abdcb850de1d85dbab412fe2bb274d46169b7365ab579fd0506b113a9a5e05d3427f009afd57eeb0bf169977ce2a5ae08cad036e5376dc767274ee78bf5563dd3f8a622dbc5ff9e33c783b1f23e35d2f4a0e3b34e1b0d232ac8af4499487129b961735806358a182c0c66157f91732a3a2f27015846707b22d7fe581e63ee5d106e5bf04144360b048abd4006f342183fb7a8ba3713924f06f13c3531c2c1ac29b698b94c35de87b03abefffc52e509c2ecbb10256e36d7ef6b228326c7145e19276392dba84ab03ab53659005770f85cb1e0d6dfafb57bf64f8b29bf9c001a02215e4f2ac44d75f57be9a74535003dbe604e13bbc168fe74ba513ff38f894bb9f7bd56dde8d24623fdee4432b166612c784ebe2b832aeb0c7078a32fb14bf320fdc435322fe9361927462dade8131db7074eaced692205c4bc6cbb1e31a275b86aa56e15accd34bd00d1ac09e3649 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000002c4e36b9d6d2c081d6a6c1b24216e99851299855bfebfcb5ef26a0561373fa3001e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3830beed3faff10cba8ed893d46005a775c9f4a3e95c94b4ad215ec35359635e3affffffffffffffffbf312247533d481e255cc4140d664cdd6bc0dccb8ff3fa3f186ed7a0b95a79b4203647fd79f93f9a30504231a2b7d34a9de1fb8296e6393ce57e813fa21ae0061fcad0a000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cdcc01ac0175e4f7e7773dfde4f1b3e04596042b30c29f24eefac7ba8977a90024bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611c012f2d6e8484388f2406421316d1ff1ff74ba3c3c769db53a204f748b89926e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3341ada88dd40bb1007f3de4186f1538092803c3c886189abb54a07e0f08dacdd2ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085698c880dadd5a2a3af5860603e848c16d5d15f6abb72325a3da7ac8994acb426c9863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a067bf92a3a018d06088d421234681d8c8c2cfaebec47ba1f1e7fe1a0e6a47a90300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b025b5dc5c6fb3afe16d1698377bf7d8f12e0934fad15e053e492f165b9fe1069b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a46dbcba21f4b16a025336fe26bd638216eec7df306fe10fef4b043a43681051bc03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e64771deed1f43f89b70fcf69dd9b28162e8f0a64c4fdd579d391cdc15654539f00f003000000000000ad54ce62546edb070199855efd20a0a8eb79fd8fddf5d87e732c87766e48ac0be32b9f4693bf3cca87876a4f1a30cbb0a18e17ff33687f838adc90ceca994d805ad254c85ea2a2df3dc481ea1a21fe25fa2a44acd9073f7b0a843adaffd2416ca1e7d2b3855449bda5f75ea075b0fda72006edf3223940108834dd778de370b3448de8f155efa5cd8a8e3473dadcee9895c9a22a051bf50678afe159ec750448ecfb5a347f37cbca95c7f173f8b3f824da519e48d36ca1016f4bcd96a7e4447c8c722ae21cc60e4914d99e32673733f5bb3e7ce36adeb6a1598415d30d515aacef5d13c5ce205bc85adf243dee57f834959dd17c7f94ea039f07094ab3f369242f82694fbe2dccc02fe118a71b33ca1552cc25b99599ea73e6a7109fdcc67f49ace1ac58c1323e5952f632b560e99d368e743bc9c9c0efd096aa3cbb4a6bb70a7151df319b3e1151fb6f77ee999d4712a9c18a6b4d5d9eeeb296d4ee86b0ddd0eeae0877dca7fab37acbe7076c48437eaeafe73103faa2ef2517f33ede82ce27998a6a6c9f8e3babb094d4b965a61c24431b3145a6b6ca4065164a72ca96023c114ffc63fd47c3a406391ec19c41a8b08acc75630fb2d16845d3fa8429d522761674b5ce1a12e2f81dbeb9c5cefea57cc326d30b7734fa2f331b80a31b06dda9b5e1c9001af79a7a70d1c8b28bef52ec9b4ea0117821e4e2bead7b8e7da021c38d86d6d8f050a1ad3df14146c83010f000b92706a4e4019f3c40fbc6388587fdd79fd6da270c20f6d2bb47f4c417db089f9665f14e560f2ebe58aab81b0db0d612e1aabd5432fe2ceb9013f9e05d693fec383caed4ddc6079c701c396e25bb92a8fe9c73e90ce5e81868112f68b6af0035ea0569193ba28544efe9f000532cd4fba478541cf8be1976633ddee939060f374a8b5dec232db1adccfc2c9bf486c81e0ca2b3e0c9f10ce028893861061947d177dae6c5e5c2d8a240697b34cbffae4f2958a970e9e6e0594b4a1161e7fc4c0a1be5eaaa470f420e03f98f5799dc3ff3adf1db05cc44d7fd762fa66641b33e56ae8b43125a77f92e957ff01b2903ea779c757987cdcaa6bd014f7e67dfbb04a9d77072bf14fe446b5e156325d6379eb77152d17aa770e7471b0251c1f2984b5dddfcc9954c7203a71cce999141ca7bb1aa6fe6ef75f1f29ad4903088479c5ecac3c06b1627fbcf293323886328ff2837064ec10fbb6d2002dba31de69d2067fd6fb74baed2e40a1a119240c3ff19aba6a42d3777c53e30e01c3186e45e33355d5c9cb76560071d0beb79cc25370154e620749a64725820f66fd86dc238a95b64e17ba49fdef6214410b859c4a4fe074342a18316715547d7968b840df5ef4f9300144212157c7fd6a85dcdf011a52253d0740645e13713069f5b9459c1de39 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c9f25206d2f67ca438b6ca72aeecb3255aa2954f88c12f9052a55b5310af222c01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3875138067cead5193d7222f5bb6dc4f65cf3f9852f4763c568abef0544def4d5dffffffffffffffffbf312247533d481e255cc4142f371233ad8f79755669db7b9ba3ee21eef5528907c576db6b5fe3744a87919ac6d875c51b2be3819c60714b18d69b68bbcddd63e141b71a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cef1d637a8953a47a3e6223d1caf015766db628af9668888850fc0e1611ffe5084bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d072970b871abd74290c6ce3a91f6a946638c1aca4bae2ec8c86910e680d16f300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33ec2a1eb283d8ccd27cbdb4035df4ef05f8a3671da55b02270b7f7e065fc52e36ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c0bda99c27a39a3af1e23ec32a272eb7de79d20f803ae4894ffbc3bfc258f5af863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a029be47b0810858f0b56513bc22380501f53df73c065680a689fb2b5e37a719ba00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01180bb83dd8a5d8573d711aa1791ac004115e607048d9182e462d9bd02ea39e600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a48df8cb3d597d54ca6628ef4f2ea4d45611958fcd030e4d8bb05f9b27c9a611a803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2929d9c9b455e55ab3f2f41991213933ee7489530b3e655fff7bb140bf95348600f003000000000000971b40ef3fed1df16514123223de4f64e4535e56878ff6cc44da2a2041ada111e35be0b99ff1683e909f896847a33da59891896c9d9b36e007cf1313cb7d50c6369d1e62962430ccd065c5908057491032275e95f44294851568a042c64f5a3cb231514dae8aa5621ab2bb9ce82cd0f46d19e732a8e1653bc98cceefa68ba1897f5b9617b96b219ef241b70975be3098965e0b498430e37a834011efbb70557dc33481d063500f1b23bceb502bc4dc3171b78f2dfd5424cb3bc119799b10959d8493eed3000da382089a20361d2c46721f33cd14f62b056b390f329037ab4f0264c2f0c79de0c56af265e5e5fb3680e5b23a34819c6d14317a4a71cc441c57f4571b6738628764adc40f83e4308969ca53afe61fc31e6423c2153892a843205cb02c9ddb67aa58465971a7e2fa67473f3df55fe9769f73277d7cd30ab7ff6c50c64921c8ab39e29b0b80be74579bad95b43fd649f223cbae6a2734ac07131d80d142b90a6ab2730d1585ef229cf4896f199d317bacf9a70e4c2bf0f144336fb7935ad517c9904d235e03df59b4f2094ec3ecea3791eec1f20adb27eb6a713e88f738cace41e642828947744551631c3ab3adead9aae7effa64ae424b82dac61395ac47e86f0a554b46ce88f5ec4032f573a07dc938c90113fe75a0eb8d8a0afab326cfa60fd592066244e83b0f3466b1f79100559936a628968ec2307cf27005e263af473e0099a67456155b534af15124351a77b17797546836ef524980ec27420fa5aa04d20f6e7bd062d3f7e8e503b6f52ba12b391caeb554e310809c034a3f2b467ee9da7e9dda5332c2dd62fa35cc3c64cf72cd162394cdae30615c31f145c4837dda84ccb30a2de047c617d027efd8f244d0105d5db7a76dfe31c8a115733490268e191329245b875c206b7b6c6011cb11a85a4f1dd8d24c4d61de1ffe27d421c7e346a08f6a87147ae98e2557c40c851d372f7b8744ea21726dd4e04cb35b01637c03ca04563df9fabd0e8b58b4c963bc2d3cf2034ae08c146509cb1272840efb115f5a6978f64371f2a96263e0275f53f7a8cf43624a79caa874a94138a5b07723848a6c0c9e123d7a526d42f5deff41609740f38932a8e7260bbeb20a12edb8ef546c178a07db0bd5fa795c7de3dd71e5be26c5c79b75cf37e1d8b5061cdfde076f2790916b45e4835931069cbeee84788ab3d83d8031d0d94a89d69ddae88fb1f41ae88524dbe665c65711db04d5d04cf257ffc98bf5923a81d012579a24560c4baac01a5da4c9ff783d71b3af92e45df96f511e7f2594b8762c2962a07fc81b7170874db84ea94da6dc6b7c59d93f66f74a15c1ab9e94a5e186fde43167517444b47ca8754bced632756291845a2f0e5ef2df4230a7a433f98c60fbc19c2a0b7a82b955c9ae5a0a1a8842 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001b1f98a4fbe6e7b7fae0d313d3a26365c96a37ea2240746aedb9bc79c7b2251d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f8056a3f0bc0d0df4df3195a0e46e915940326b8dbc09cd84189cd67de42a00effffffffffffffffbf312247533d481e255cc4142c67af4ce691c88036b727f944b4217ffc264d78e7c2018a9717cc369a67cd93fd7d269b9dd4886dc4a73263591b81506f469110278b55bf00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c57ae6fe5d7eb1b7552b320fb954d513e7f4e820e0a95b023bd56f6a2de4a83574bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114ba816aae27a3d06289c3c126a74ce27c72212f6d4c02e52101600ed20f3ed4d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33cd60f4225cab6bc175ba6ccbf962e82b5422a8892f10783680a3095a8f2c18d6ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569e359d76d35c1719075847afb9a1fa83df55ab889c94b44c6fb1cee3e14d39b2b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a08e23531115cf5eabf79153d84e2b9db64b99bb4f4aba2d6c1bad9456d7f6f91e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b00e12f97852f542fd8a39fb03719e312b0b3369862a69c8337794f092224fbc9000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a435ff6a56af1a456e0e9666af152da8c910cf0398341b8124dd82961ec179600603c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e0619b58c68b2b8d43cdd350e9f0ff183ef17b6a5efaa10882ddcd406459d68c700f003000000000000b1c238f2f779769c3896d7a085975b73a8ed2a9ed84ea8f3193797261e11b9bf15ddd38fc371b43c83370d5c1ed04786a79defacc23b5cceca3bda550a81dce79a5e424fc8054b3f8a0658cb75dccfcb0c53d7cca9406934e0a0ad988923c82c88705883e80bddc110c22c537523bf7eaefa09edf8cf2509686ee7c22892951c1f7db4d0b147c4639ab7a7abdd4a1d91b429ed76d061befba1240237d304f4ed0e23ae620c65898620138f7af39949b7fe2d5e6587f0afa191b2e0f39641671ba4fa31006e06bcfd6931eeb4ae8f933fbd9464fdebdbf53ab2e2ec29117f6956ed2dc67fc52199f0a45f4dc77d45f07baa90b7a057cb0ca86b7f355940661cfc092b89e576decd66f1eb1966d86312b283ca5aad6114e331e2fbfa795ad3f458ab01ecb18ad42e0109b7547868f1024ab1c2abc9c29e8074ddf337bb6ae7a13e1e1664974ebfb51ded88fcde8c5e5ec282da08baf1a3f1174532d02a867098646d0f94b389c2c593f68caa3c383200f1257632ab7c5a14570b9fb11537a83d418549a1005118ea78f32bcf9137fa0654b7e62262cf9ad8046602a59ee9693b246af83b8aea20ac719ed7999a54294ea0b447b0ee7fd3ece1390fb4ea10cb02dd54e3c77296d09ed97fefb2162722d54fa39400d785f4143b866c3c4659bbb3fbb4baf85811b28f515b528ce5f8ea273642002d894b02f1d74f7412e8af5bfb25258889accd8685d3534bc991db16adef997346dc835165eff5cbaef76daac1ebae8a7e0aabdb996590229bb85bdf5d56e0c594a4a642741e6351e85f616e8d2cdd88c7e4ef92fe563e5a3957cb52231df4894101c5adb1fa0620740a4289efb0c76d95e17194fbd2fc3dd80885185f316f7fd806593704aa294ac77d31e9fe0d51b1647b4d5dda092946f24518b932688bef846bae0c7f1d0668d2dd46a4c07d1af8c78b405d4043e0ecc32bbd70b560df55535db045048f48fd3323d8a17543610362ea970ea4a63d7c70b6d10ba132f85b5fb2ce1f220c60d8cef80ee54a5c5452fd2fc8ea76ab459933cd5a5ed8596b52a834a6f9e736d93f5cc6c4c3fef177fac9536bdc102f4617f162e9d5f45bad26643bc091f92faaf854f0954b3d74e51fbb32f2aa7af8d51aaddbea7419682560d8e0f48ca6ac8773c5380d196d736cdfaed22eb84d5527b6ac989ff5b74cb350a98b2a3dd2a98fd9516be1cc158445aab8f14ed59fa720922d71c2b99b17719305ab48db59e59aea10f4ddb82ccef45b998dcc8073b7e56671d9e5b75155fde14a65808a9f398853deddc21bb3aa35e5df6c6384c31758fed34bbebefe3dc91d22bc05f93d8f074dd6a95110d6a96cfa8311f74f72bca561cc6bec300617b45f68f267f1c688d0aba576f8f7417f262ecba4b4b0003b2d0be4728e73a115 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009a9e5ddb8fe4d4e0f1d12b58ba17a8be6d40ec5f24bc99080d62a1c71d71a67301e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc385d1aaceafaed01a2ef6d24795e03dd91340cd19b3d26ef382b3c3edbf69377a6ffffffffffffffffbf312247533d481e255cc4145402fa57bfc331525451d54c698d611e67b75e6b86a5f551b2c09069c313a3c08a630d23d8f2b97925b6794340b58a662104d50f4595efa200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc0001740194ee6cf32bd75d66bbd3a407159b2aae7b2662785f0cdfb16445a704bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611dca12a72a0012a0d693532b8a8b3af7a33c0f2e352c11093450655d4595d16ea00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e331fec014d39c22335fb55eb5cf82f2ee7610eb2a31f8a1ebb6fe5a1985bb178d6ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569ed539dd2132efed36d510521bcd3b33328a0155696d239238e8d2a410bd2e459863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a00a8b26fada56d3b0da2ef937306ecc2052d7efb475074951bf90ae29ff92c6ba00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ee8394c56c61896faeae207f6964f4a897152bc78f0e6049e910e882ff7afa6400d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a485fc56e1e824112be72707fcd345445cdbdb372817a8b3a87ad36a9782bbcdcc03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54edfaa8848434b3f47c1f2cc75fea88e39458ddcda6cecacf0ac49bbbf0600a72f00f00300000000000087d11496ff4e869a393d08cad76b17bf1c32a194a7095bc59a3d3f64883c8f6103bac0cf15f84507ca1416948cb9952ab63aefc40c1d25ddc0a04ae436f0e5f8e989074720b2f28a860b2542943599bceef886402e6e0e2f38a7113bc5fbff07a2a0f333421abaf4f8a72a6a3b58fd5d05d112d44bbe068eb7a0608a8ce5ccfe62ebf1f2ec017177cf6e11d589f71655b89f65c27846f58437a199ad409ffd34aa0f632a8a2daf480efc7354247d0af93b1a2438f0520ae5cb7e7a9640ce136d8450ac3b86e8baf1788cb76cedfe9c91dcfebd6476e662cfab0bef8e7fe5c8d22a9bded1e230ee7ac0019c2926352dcca3cdd4b4959f4053f1208c9f309e2815b5fa6f3b043ef0edceaea034a49ebef3e23115d4a46a1da098dbd241462ae0c6b4a5571f1154b128d62fda4ceb293d6e638b7d0a83da1b8fd47bb2d6683e93ca6c03986b3bf88c886b01d2caedebc31882f82c409216a4db9e0ccbb8a5aeae9007f96f998beb66fc3f7ed2464eabe7e4aa333087aad9083e12bcc5554ff10936908f90e912bb1a6390a99d0f5cedf1834878cea114ae52f658042c6a7db7a2d07e15f222ea8c276ec737cbe15db02ddd9419cf16c0b739540c6b780deb7001758a43cf20c72547922cb632261a1fd50e839d5f9185d844525b6206c06aa120e980f38e69b2b6fd815b34297a14fdc2757f134eba48fbb045d00739f7786dd3ffabab768d345842cc0813e4572595692866cf04ab807348412d944de60cfd98ce5feaea18933e2ed6623fb4d00469a24e225347949996f5a687c0bebf2669efb51ce925b5b56c6c2c63e397282c7ffa0bcb4d74721b7454430ac7cb12ab36ce7244a2dd7264676474db09b6f6827c05074867cdc14a2062225532f5a508ef3cdca69a4460fe488a8fd14a04510e37a539872eed2f47918851bfc6e0a2609e362472503bb150f430b00675df9513408b477dc746dcc6bc638819079f1ba30d2cd0bb2cf4bd373e59150534e668a8bf50070f0e42af752f2d76863b76f098a861ce85b4fb09e20e38a8f3843ae760b47e2ade9e2f4882667d85e5b1e02f911dfa0ada08dc2a02daa06ccf8047ed18b4d4179ec2c45a917f4b72a3e19f856c958e96229966fc9822df06a251018348282630a2d44b34b06d8cb7f7871f3f5154cf22292f0eaf71a86ac0cb83c3f0b4bb39323ef81667bb8017cb15331cce9e39909bd1c7cc339dffc58bbf936bb5a714f85342111d1204bb9059ca7b654bdf5a02dc66ac7b5e4bd584ee9b6aee44ca53a3024b0d818ad575b910d70ccdb60a8ce2ac975dc940ab413cb6ac9c00569e1e3121bfb6ccc65a86c6ead911829903864389bf0e3d8ee42087ec9888beac44359d224376feea3966cf0181c5ebf7bd7978bd5418f7515a3ba42235eb7af7a9b60337 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000f1d27fc70e78b4ced8846e800b435aa3a951ba71e64a4eaaf302d34bb485a51101e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3838bb4c294f2c42b40b7207b97738debe79a9a600bff7e29b93afc71b73c2c448ffffffffffffffffbf312247533d481e255cc4146bd5e78e60391db0a8c4728ce5980b7e8d32fbeffdda4f0f7c71adb66d3ab27ac10cb129dee41f46118238c486e25a542959eb76a9e744ea00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c94424f5b818c65aee73dc36d4a49a18d86f6cdf0e0677980307d09c79eeb4e954bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086110663f0d79048328efb1e4cf565359927e18fd8d8ac7f3dc58a49b4b91abb8c3200d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3349291afdf40e2dcc7fb19cbeb272e7e719c03ba8347fc1c1492a923705bc4c52ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856969b33fa6ffccb2e633edb3b6812da7d6b776b7b9f43d4cf626a2b6438df9dbb6863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0a3b18f2ae7714cd9d40367de7e24e3cd3af311d0eaaa4addd8c9fbeb3bb8061f00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b07624781d9c02ba286262fe3c899dedf70bc85c2a22b0c56584cb7cbcb684d11b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a41b83ca2c871f620d2bdc2321090f2c346e03bea572e7a976b9b109f8a0541d6a03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eb7427f6b46c08403d2e6149a7ec20c8ec8905b553e807e0e3f21fed035c197b100f003000000000000a939e1ecbcd269eac5b64b96be6848d6729857973970d84e337d99a85ab531178889164ce77df72d8472829be6e865308d5965c9d0193d4f9210c765bf2f1e7acb7c1d3637e4db39567665cdf95153406d71be2b2109750eab70d628198e995fa8a0e2e6dcacb40ae6641b92e3b5bef886fe75d0b6ca440e25702b35b196075c7d072b945184912b9c2122b5f787c28b8436d4cf84f0e7eb68c4346fc483b61c7097961094c17b9f3f6bb5583cef9fd2de5b50f2455eb7422073b79727881c4e83e3acae541d9fde18072bfec5b67db4cdfcc80f73a4ab63093065e01fa40c4f9febfb0d47ba5087e996038975f0e404990598f8b11d3a02266caa279b289a4c6a83d18da632ffcf116c40c62771f143f17e1ccb0c9796387dcc163d8da12cb79663956c3f85859539435239489632f190f25d9d5375a83186d7e751f368324c02b24252bd112e0ce091aa113f7753aa8f8eec24fa3bca0bf8aa403a7eba8db0379db14e3f4817d5a13c83556fa6a12bfc0f39fe0ce20db2f10a4968f080f0d880dc42ffb169b4ad93c80bb84ff944eb3d1ada530426f11b8b875acb799ba5ae70d0fe6bd3d3e91e1ead5748b5bcd610b83f492f4e0c5e995935e72460a659af41e5981cc889cadac4b64954a19a8328530ea9169b75419d0164b5ff20b4d8b6a33b3aad533e9e7830c198fea00ad063f70238d685ba2ca2dd12dd56a8fd0e48d35a1f2355e7d4c0f7d9650a2b82a50d2aa9103d91f93f17b31404a7bebb3930705e7f95a62011b72904710572c4476f3c747a4668dba509f0a7ce86670f304fe2816d547786bf62588c5e8b1b34150d83d742180464b493d62e61fe5f3b4f3e8fa74004b355b5129d8f9cfa75f8fc0b28d43cc33adb570ff30b532559dbebce5f121130c269f7fe5ad2517fcad8c93a2f1c702c3acbc389f083af6cdd65091d25dc8477b348251c7f7a899ea639a900f59d632917a00d0d9052f6e73598798d226caed57e79e9502bbdf65641cb3a30c8ee1a42e8d775fabef2a8ac99f5f4b6402d0198c014e3b63e88403cd5b7ac629e564644a864c87b9fedccdb12de08976f412af267cf82d99306507708dd9e44e2c4850e2dc1aeac2d74247f192df69c7cae7e8791e14aa15c7e5b30a3366f70b21abcc1dc027ac4d36b72517c7e40f73e88fbabd0c6b73488f234bf422a774d4dc624dff637bece9c5816b790e35764b65604404a02af0fdd05cd89fcf8214e6a28bd33965711e7bb2421b96dc158cce1ac30175ca16a19616f783d6f1b1f67ecdf5e3a1febe5d93a70de7281793d38c2c998ab10edf277ce80de814a064b6d0a416c1a25fab750eddc0412c7a0e1e444e008f111c735980417baa211ce5809c969b984f4b916adf120e69418d2b64529061250f96f3057bec58dbf8fa27267 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000003f25f5004ff1f5c3edbdcbc55f305034d31ca2c2a5c162f1d2cdc51dc6d0510f01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d387457cd7557196aea7db8cd97c04736a8ca004a5fcbe4b2af9b6a11ee49c0bffffffffffffffffbf312247533d481e255cc414dbee9dfaa17719945a516fcd5a99cd5742a1ec7c85912eec2ed0a6e565046f0f7057475291191341931e0bea34b66c48904a06206297415900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce6f2839f3b29f968b72b234b1725ed611ccd3a5fa4da14c976c6cf91b03cbe3b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118079d6f6c1524f92ac641f538e4ce9d84112336efb95d34552cc29fa93d4826a00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33332fa14ab45e22b001fda4a9368f5ab1b113ff5e684f0e7dc51fb8ea43042461ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085693c3058e4ceaa4812b68232bd3afbdfebef816aa7a6b1f1851fca31c0a583e6d3863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0841e6c96fc8270dab60950d61bf8d671a397a8e2b2638358e8d8984d35a657d600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0398049d45ca933e16bdde053fde3297b86e296d0c10c338e77a2ef2ca58312b800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4b4e29890547593b9f2564a69f62e38eef1e73c816f07a3d58ac2d77f1e13d69e03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ed22be15d87a73d8e6d605e4be72f9ed087d917bebda1bbf67175ea1e94ca0abc00f00300000000000089395440229130d8807a241c340805f93ce3ad01b625e11261708d0e6e5a25a1bdf0d87a4318eca4dac0f76bb051a37fa793c0ed1d3f5f893d5d15d0684a31693ae27fd9d0998a6de782701d857a1cae35b75161825035beb4c118081c245d2d9434480d47415dda7a73dec93c0b70aa8612feb21ff87c80a8e302ef8d299ecb2da2c8d0bc27365c7b39dd9b88d2142985ae6188f40054793e0db231fb56d297c3766619b9406c946c7635fa755c220595d7c83e0acd9f64a125e0bebb0a4b3b8708d9fb7cdd249b984875674dace58e37bcddd1300047a530c372ddae5719de5b702f332a039d5569cc2848ff2f958f8785a7fd7e52c1e4325ef73be03f861f2e8662c325bd8e73588d0cc72e03a5a76d88901da83c0710b73196598d183fc0840036ed337bbf4b067ba1ed60ca0aeeeb853a4963465cac8264defe345c4c3ff28610560f57c2c44c29c87b33cce7418b0cd83485d0264129ed9ca9d972bb59fb4f9bd2f7b3af7fead870682be88d3cc72b7347edefd8a0ffa33376b31334cd8de3ca87f0e41787f595a91aa16dd62d6f255d7f217593e72a225f645aaeb811d77ecd99d10efd6e86588c8ac6ea0ffa81a0c2725776da7e333e1f1beb1f2fc1dba4f3c4d63ef8bc221605bc29e1b646e01be9b04a2b2f78e4946c8808fff083a180d1ff8f8457d0e9392c2d69c29770b158dc4df73dcb2ce26f995896818ea489b3a33da7e49bbac07cabd8733e8853f2ec51206c266dcdf4aae093f124f877b0654033091dc19ed4f15e907880e21de9de42dbd4b3efb6cf6138d0bc7443fef0d3ee415b8afbf374864881a9b2120ce51f367c97459f70428cb34da009e71ead02e8927ef478b8d121c3d2b3bbe3294c3b45368255f843d02fc97bb0ca5b9c8af7dad1300b86a58eb7ce19e7fd8c1de8f0656bd2ae4d961e5757d271d3ff4cdc3129b4bb217219f8822229f38d69511e07797ac38ee1fe37ebab163b5a81cb591a688b70048f5a9a03043203be7b26d93a305b515031b953ec2cea342527dd1e869001f574d4528dd297003570293400de34a333d1511be546a2a2f9ad339e0ff8fac30c0d0051411affd1157a4814c91628456c7ce152d5274edad0b40dbcc648ca1ed7af94c8fb994facf8680c42b7af955a6fdf32924b95b82ab7bb8be8f9d379c63f9b5f0c4a78c10c9303125ecd56e91d0efd379da74afb645627239b4ab8a36d8680e4796839692e371fdb70be130e6508e5518c0594966efac24ba5d45d19ed51039f05663892bbc9abaf43556931ee77e4c3ca73199195e9d8639ba5922c2e01a195637b5c01b01591fa38b62ff7d3df8e74f6f56f7e4dda2fa83e06739bb66a0a137b7e426b99785e5c2fc51d8f2544ff6fef6ff6b397c9e65531d6195d5a04cbdeab169da1975fcbd501 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005996a31a65d5eb654880695182f42a02741c04ce7516ccd5eb42b83affccb26c01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3873fcd31f60a95ed62927555219442c389eb97bc3b9cd55d2f0fe2b81783e1fe9ffffffffffffffffbf312247533d481e255cc4146e050287bf1162569a65e4c4da290b3a0caf09a273e541b71cee175404a206f0be7a1a8758bf5448001317e38c3ea29f725249babb09164200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb0ae611515f28f5a881a34b2577ce9ba5f4c8a75ef971d46dfb68a2914a4a4d94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116aacc00ff405a2d17d453995542a17d9b7af529d499b5ef505d9796fb10ca8ad00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3340f6111d56558aad70fdc2c4840f3e190c492cdccebfee141fe86fa8e3d4011bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569604e54e8af9e8b55ae3de2df1d027c5f50825e7e14dfc6f1005a4284ffdd4e56863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0640e28fe3f8f911a7466b0a8799b5ab7d7239e424fe4ab9cae3389987b8c523800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b052372c1482de7e7603b5d8e1d778fd65061a0f321a4e485ccce8f83fa5c1071300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4667c46cde1707d1b14e4fe39c1700b773270ef36465f4de38740e239442b272303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ef7d9a526630a54c8b254c90688092faa4aba4a5a8ef12206761813c5eae6033700f003000000000000a235b3accf061e71ccf04559ac612308548d869a8f295a2f8d276564d1af09392d35c5119adfc62f72295d318c5a325da1c3b414f912b0961d0ef73380fdc80249bda7e3254622d1b7a46e88a2eee7830a2002af2fabd7bca398c075f9f458ab8223d79fc102f41ffc780c13a7516495827f8281c60e375eb8e38f008fa8b8956e69a78605ae2f12383e7268116681d090c7126ec5df9bc94c8228d41e96c3404f8df62387d5d2df00c22ccf89027417091d04fa481705bad6ae960b20329143974b9874214df20c581ffd0449e60a32e2b9e2f6e7881a667051ac5708dc05ee7604dfcb6e9e88edd8b38f0aa8fcc51d8538eb05714bd2c5fd96b3ff3590aec3dedb607e03c4d0888f261db14f9747c2e96069b3148af8ab9a6132eceaac7b3895b6ce600ddc05d208e4b0665d5a6e9faec2a1a8bb8fd099d282e6da36042f0be03f38f8085020b54b18deedb67d858288c4c3c092fd827bafd1cf2fe2d262bbb17041f6f8d71fc20c1269558bbcd915c04ae58d87b68057572e3376e175ea3fb019c6fa805095b51d232df4bf45594ef05c3093abe8531c9c615f33a430a5f940ccc1d7f507a5d8dd1ce2a94a547c69a93f8e70a854be466d31f8aad1489e7dcc7c4d94112ba027f69175306b09a084fbada2347b0f23d1d593876998d664a394874720c69c316bcdb51ab44306e322731bd79a4cbf261392439c0eaed71ee1fb0650964f9015a61a1ee48b7b976f162ffeaeb174d865dae62a22d469d2201ebd9514ac492564c466bfb3f7de74053df2ba0ec53c3b41f99f172e571994d3b26f54005b2b31cb799c6d68376ee3fb156275459457d08cecc118bb41cb149c661786e06e8526222eb4be1b02631c23516a8a7369dd16cc06f44d6de5a2de63acc28cbee622c0022ab6a56130ba73a51cd70588b2733739593ce100236faf3adac207205745b559b72e0e57fd0f088c18388d8cda95d9b6e944d41d4a27ec39645cde458d8b095e8aa5933f3f3833bd3e614d8f01559d285de338dc118a23e5af6d9356fecbcbe043f0b4cfcc43262f07fc73538081f01f8da5374f7101ed692e665e8830078183bcc9493343c066b52acb521c5d93e7682f487da6481faad9eb10ad20d8bce5eca61499a9a03dd0520ff492a6d8470917d40012455f6807cfbdfb01ffcc3d1610ef97d9358c8d59e50b34ec05816bfe7c6bca397ca991d551c4e13454838945ff943b06a4168a3db9121655f6ce06785675a25fe5e12342adb1cb9c81a6d23d9fb727180010786cf3141b8f4a6ebcb8dc381a889e85eae9a4bf0bea45fafd0ea6c33b9e27f626745d19c167439590f434c3d36cd93dfa42eb7e7e6bcab03bd7d97c7c0464421448b606928ca48462842439c7a4e2b53af8dff15c5abc448760adea77de37fb1acd546d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000004b321d69403d6e871039261e1803eeaf4b23d7821164c6f5726f26e0c8e546e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc388e281f82f4d2dfd3ccca62d50843e936b8e7f19d4262067f0213f054e27058a0ffffffffffffffffbf312247533d481e255cc414002a4f6a789a8f834fdce2db78dd89f60396fcdb7c6a82e5d379bfab68a33da918714478f6eb57995be9115c8ca7388150d07d4f4cf2e16800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca612b29cc4480ba7fc37668b81d9f6adc71f9a2fc3471f2a9392ff123e9005104bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ac4e58942d08a9dc796e99882226fb15224c961b26d9f9c894dc12c473e49d8400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3375c03ba5176be57ccc6a0845c2eae443191f937c41c2ada61803cd287f2cd61fffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085699e1bbe7b87412604d18f1e8754ca77e662909eec6049349279090f191275488f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a02284f88d0d276240be744ba2d415c4d477267aae006bb849eaa7d87394c0a42000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0a80560e37180bf8ae3df678d793ae41af8164546124245a921de3bb5f5e5eeda00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a465f36e02a1b5105831fe47099f9438282fb33b86446868a2f15d779c5f263b3203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eed7673030276e62f39bb8877f4f57c5b23a5ee5df745756af7c1662f7ea5213800f0030000000000008e4ce683f310b473a344d49a03222422930fdd390558af0c194ccabe01b869b97347a614f037e74d67a2b4392a7f670bb50fdd2fb2f7313d65f0b9f6e25d902c2f77b50a2db72f4f116c4f49fe67749fd14abb149d4854f49bc6ae5e588ca78e86720ee0c9865cc657cbb90df412941422d0ef4cc5e6a3799f74e2b8b598b7c76267304c6391813d72dd30b7a6343238a975d90afd4a62a7aefd13143b2aed8d03eb93e5608d0cda5ce475e57b592bb385ae5157214d1a92c0b2dd45de1d9099b3ec379102e97702da1d463d141b970058dd412df1d2bf32144494814c21a93c65b9ab81b32d112b67806fdc6e201c4889fac1229d77f7816060982adee7bd2cfde15a6020256f90d4c4ddbcd558056b9c048de2495b4d16490f39c0cfeea00197f981581fe173959e18e602f6f7234df9f7a078970948b6205199dfdc6ab3ec9f4cd4d274477471223c77be1a3a83f1a40668130d5bf6b83e67d2b91ca0f8cbc515aef05d2bffb545fe0dcaba12a5f9b1ec8b1268a162a2f11796135c56f51595b6053b429197b9afcd093ca90e755bf98a071d0926329696803b223bf6392aa50ce8b9653a3a52bd010e35bfd576c6aec2016987263bc46966f475e3ecbc9a6a59a8bb61d9b736dee10b8d2ac9be6ec273b2a340983b71a588569e9dab821791f7868a76dc4fde5b33e4d9475ff014c5698176c22b240e272935e4f247df84e37db991d5fe8083a5a2d63da6f91231c2696796336bb0eee67c588937e7d10382d9198e0fd5655e6867cdda618c300da3de804ebbdda156fa4d764f8a2594a5ad2b9c3e0a9b5df86b5a2be0d07f440a5805dc40d6683091f6c13cf5bf01e754a6777801204ba27830ab194327c9a51f4166b1bef5a91f91569ced42445a0dd3755118856b2e762dd70fa431a7d9b955ce4df50f47731b9f6a9e6482664a1a973d609b91716a99c8b9cb2ab0b7e2da07e3d68ea1430820aa4331634e1c1476f0128001ee528dabe85d29bf1ef0b6815d49f25e87635f21545299d4c2e38e3bf47c5e46c74820ec4353cf533f2a8bd363c97061597cf8ecac472f197e0640c838445b2a8c04debe21dc7044d60bafc4003a09663bdd6aba5955741118ccae1753089dd7cdb0202bc5d5d25016d56b4812d2febae8595264ad34753105a93cdf83bd40ccc194ebb15962490d2ae1bcb157f016563047c64b6a33d0af8150574bdf0333026749e1012de51d37d6a4dc3b158562316054391d9e2b24c933b568a8cde560ead5c3fd14a236ba4f755957b00fcf539a645915df3c1ee9ab561ba4a6a08106e8b46cf74d08da844ed4d51a9644e86988da0ee00923632b9cf1704ae54f5931c7909075269007416b5a1cc62742e806be19aa8a0b81d26de8d9905ccab29f690a27d4fec13c408b45916348271b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000032be62a4d2d0d71454d0cd0a9f85e5d62c7d8b8f5b8b5c6b84519c17f3f58c4501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d2b253b7a5b5a6c6569286e3261e81900d0e324bcc6d9f6ffd71a31f3e78379dffffffffffffffffbf312247533d481e255cc414bf3b27f80033e9f66fd90e4cf4eae3c44363cde150936ff62d013951c8216a65d88c25563d375aba7541bbd9d79a37c6c4a44fd060a6655f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc374b057aeefa9a06479e54482a6736c5a8b6b04012b59cf562c18297a95d0bb4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861125cc6c51de33d50785470c60c4c409e3d6d7f01ce21f29df202034b71a92664b00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33369b584e7dd326f59a3a55292e38bfef2adce271262a0b5384d64c8a7389b727ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569de29fbb165468dc592d156b310134965fd192d2e56b9b51a98193b70d46d8912863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a07e2ebb942256e21aae65affbcc41f3a20126ae5638b80558680eac8dde6ff55200e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b096e3d2dea556e7d69aea294d6307653d258719025a130a2d872d8d5089321beb00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4768c3b531449132e6ef0f00385f2db8cb4434e4827672f140d19a7fd688dd6a203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e97ac51a4bf308b680e4415208dbd830bca0d92c05296bb651fe9fe39dafad02b00f003000000000000a6a1b22aa96aabb0e9d68c3c43f42e5c27c3e4935335827176a05b3368af17b9652b61d497b9ae5b5945155190ef64618fd65dd850653c756de97e150a92b715b2dd3f3f22a1f74fa85a1e02587b04b4819358be7b71cdda16d0cc523cc583b3ac6aae5e27e046b251a630d335a9d1a43a3079bfa84bd14645ec97d12d56f50a0713d69e9f3363b1c15b1d6831233428a5a970fe4a51ddd6b1d953ac8a20c15610f8901eac805561b370eb7bdaf99917ae9ca7640b97d52fde65fca236613866b236c9029d8fd617b4583def3bd2ee6648029e677be5936f2d48e3de6e106a0f1c865cfc2eabc12835dedf6070b6576fa4baaf4661d6768122f4db7ae3943fb4579ebaa420ab36e28fa4e8088457e30372a9eb7d5c0b42fb8f46563099f49fbbac6c5726ee27a90e063b69c3ea8fbec8ea8fbd38d3c4f346943d345683aacbec24584cb97418b3a2d2fe4dc159fb9043aa3440b5007de2912904bd03c298f992cec930cb4daedecd185500600a8c17bcc67bcf42d8bf55cefe34b5aa48820388855c7d24cb173b3d5d4469862d341332bb3d56adc73656306be1b7d5af472d81a21a73dcdc2c84e597dbea428b7ff0c299f172231897c2e95c6677829730c938bfc7d848832e4b711721a83f85053e65c8b52cefc537cc7bded90a951c97c9a490bd902c4b108ed6257d96ebd1fc7832377ba52bebba2b9e2490e24aa8b61578123af133cb59035cbfa31f9de3ed67d833e710bd2ec6936df8772bc623cd10147720236d2917e64e60d17027b7b4124b475bc0d6c7576c300b8edfc091d644b6abdaca2e87db241e766c800b994cd91c4a702612ad31e0f7caf3929db3a6d35fcccb74d0c369efafd3d57bdf5c6ee723acd954fa3aaa3f781e090f0915093897fa873e6a9c4e8f59b9ea32c79df0a76e2887b72d8488d0f200532db4d0135b24c8bcc072627f7418764ccd54c0ba510aa8b6d94df33511ab630084e81636caa4e88de42cd44c340ae722879ddfca4e607e5f816c2034ea4f1b40688514ab979e83e18cec29afcfb8bfe7d6c7c247470823e0eb91c3388f0a7c18961169a840d3443af9806b20d702516807e91e05235576b203f734a8df3cea3037c2a45994c9014379d56a5f5bb55bbc205b6078312a541f224ddb588fa733acfb60030dee201a81a3e9bb736a729959b94a6a1a86342983a77c45a3a533d041cf1de5be6a6b5069162489b1647e445e2cf637791401aadb44d1ee3f74fe6c78fb9808fd36ccbc15cfffde010f5583bda439a986082df451eeedbe1c150d92552ce79e496f3f13da5ad8e18d991f243e0c8f7e302c16e5e3bce6050e5abaedc19a7f9561fc27936357fbca0d5c7861cca0f99b73bc68bfe37088485e687cb3d71e7431066ec321ae668c3e8f1b5304073b5af81ce24b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004ed7ccf121d74b1cc551dd802ca1aa225bf364b9002f80f141bfae67516fff1b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc387e71fc2ae3d2241ceb7ec57764d168e4231bb0d22d2835ea7415c24bc45c0c92ffffffffffffffffbf312247533d481e255cc41494cb3e419397e1587bc490c87ee3b518fce0fa5d3e5214c6990e5faf704a346cf02801a6631e3966386ef48582f2c7c41fb53cbb7e0e0e5600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cab33e7f66a7e3da438ebc24cb7ea9001a2a1c3108cd42ef7a9d096044395ee904bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f1ed6218f11112daf3782005cdf3d4369d8799c98e8410c637886a134fc6ec4600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33adf38c7e83346d54c86e0f24ceede7980172764c38ea91fad10f34be6ab1973bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569d8bee897e5de63e9f8b9c3442a0349b8b0bd1586c83b3bc2d58b5e417c5f555a863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0a81170abbca6a21fddc279c84f960a8ec9e724ef9d042ad677b66fb08b835e6e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b004026f329fc89e12f819bf298215b1d7eac67cdaa761a000a60cfa76a43872e500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4feb28b53d6f7b7496db3ad91066403aa2e44841fee7e6a2554152ee90a71042f03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e99f9cf0e9d3be22a1f3c43e60f38b3056c4a3d56a26f638168642780f65045b400f003000000000000868dd2a76e4fa7044052c17b28d470923c337203e56c0aeb599492a244987a7fa1fa0d4b1cb4bb4b3275ff14082209deac72c39aec8ed7c306f9e303e5eb799631919364892b9d748ffa53feee20ba76224ab129350344ec67c0c8be39c8405c801de04bfa3ef570b4ce4eb685f8222e3cbab7fa39f5bff8322e3b6dec7d95f3f40bce38d2e8bbe8e385b08c42bfacdba0ee12186e4272544359167b39166c4bf1d0ea7a1b754001f9a49eed9c348da7331a2e269185347cf79141654b162a1ca91ea07fa95a97bdd16d895a4e9fe46b9ccdd4630e24b6e30c7221b21e62a744d835bf8e37e10bdf0d86f319fb87fdbfa353c6a45053e55598b4cd25163d0db5c34d552e8ef9f2d7ab6a9bb8318e13de790c0a61fee6b10c8b3aa88da9461410a2a34cda88bec2a0854dd3cd95ad59cfd860fb181f8b8cb31ed6c45c9b90bd255b02aa7022ccd361d512996b8baa94a18ba09e0f10d95c338cf1c53cac1eb109db3f88a4f608dbf5b218448acc163780c85a2a593a33bf2f9c604208ceffa741916e6f64236edef411deb11238af41ab66e06a9d36f0fdf476a2d6d0073cc31936661923cde79395e42b73405c0df7ed8c6ea89aa61806ed8c00c2c2ed5f5cd243e0494b5ab7999081a333ddf403187b64513a3af1699a43f25d0c6d4c7d7efbaf4c977ef56e7b02c3186d523309d9e0dd70b8163542a0090efb804aab914302f1ce0f7e86697b0569d95b5c641b960abb0770f7e9ca31cf1031afe90cd8dcfac72f455295ef97ab5d176e9e30561b44da258ae775795e53ef93c82cacb5aa998627477321b59c2311ed4d5e4e70e41ffc032834de5b7b17f90aa1e0488ed086e93d4504402303fe554448e79fa1e959e041b280cd0301c322dcb72318cd7c7e74034c51f904ebf587eaaec6114f8d6292f0c7e5205e533e04f01a5b2a3efb1a23be0cb55019094d34213225f2f1511a6603003fe693a62cafd26fecda68c2a5c7b3b240b37b7245ef338a087af66b490b6305d9e99333eccac73b6a3c2b709da22f32b8a76bd859283b4d74b9f8bd393a1b70c8f69433319c115b0562e378079bbebf3b59e94779fade9f62bd98fc0f5685702f1903a07394b4fbe3d9eb4e56f422809c14e81fa2ea4e520b8c8a5638de28074dffd00015d60ff6953fdeb77aa270fd75ffe8d834c8bdaa6dd9a046247f4bbfaeaf08c986eed2313dff16fefbb474efdbc59b4aaaedfc7182d545f74bc4b9f1e3a8fe47554a239ba2f22112442dba3b668dfc1271ecec00e8b93fc330f3ba66cfdf65cddc541a54f82df72f1495f93b081ad700fede7a63bfb88da150d50a044b98c7f23ded2a09d5c6445ae81a269d8f58afbd730c74dc46cdccbd44dae9414bbac5db03e1a427d3ef274948ede1baf0799069b5bd73d9563543e30e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000915373d173f7ad2e8796dbb6532b7316cd073737f85c57f818d89bb19ae26c2b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389aeae40baa6200c5ecdc41a2840089d4af05bbf0dfa54cf5a274bcef7ec5b562ffffffffffffffffbf312247533d481e255cc4148204324fe815e32105145068e5e1cd98f95edbacc0f0fb0ab91dadbcb3bc523665294ad70cec9dd3b00234f1e2575a9c60436cdff3ab3c0c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c578ec29f50b37851cb3e7c625789683500bbcc1fe8d267234a1d82b52c982ac04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861144dc976486ca07f22e5a950889c0b8510b49a212ece66dc7fbb38466e76ca58600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e337d269cceec426dcefab57f22fb5eef62a074085cfec0e458c4319dbfca560b43ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085698d0224d67eb03d9b3d8c3bfb773a8a46eae076179f4d2b7938d6b283ea568897863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0c56152d52b1054bcb8105a2ef00ec35d0c926c68b7ac5c9ce74b14c99c74e9de00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0bc41b46677df65a9d1932057c8409dd7e856ac42c8ec56aca91ad73843514e4200d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4a6eb13fa22dea0718b9baec79fbb3ce63c745b59cc1d1d523976c4552495530403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e58f1d3c378d3baec2a438acfbe4f4392e8dbafa6283071b3f1c10ecb3b2f8c8600f003000000000000b9ae62732bd5874e679bd7e41d28a7a38bf69859d3eedadc8254e93908211d4937091218610b3011ae166ac79efa607580e3aee20714f73d28a23df266c0d479532735a9febce4170bee1904313fd1b9df0a32f9b7fe57a2f652ef53bed125958d1c5c9d0c45fa4e473c77bb27a9df8ccb41bf56a1576223c2565a199d531b6a09c94b908304139d7e3fb8fa89ff66b5a06f8e004391f7d919ebe21de5cb3b05fd5d814bb3dd0eb8e280b33ebeeca58a2ba89be70e3d50cf7b23ee409c27dd18ac48383862f4ff54e88a1f66c207962a89463e772b6e9a4c3b7e2a445e263b64fe330365eb1183657f524ec4acd2582bb7e978a9d7b321d0610ea370c8f1225ebde8eae32c094d37761a612e2eb7e23b326d55be837df0ad4aacd7858194c47595795354b98c46e7605e965f182f30549dd5e48e4280b27a9c994aa16400cc2d70253b7e2d0dff5aaf9455e7e17074d8b05ee780d5f46811a188d97e03f5bc42c2b5389c58e2151de5291c8a692141d0fab52fab9ac90fe35ed3bda97a2c4cb1837efe01a66b1def487681aadb733b24c284259134c1661901b2fac4570c838937626935c30365267aa1ae443185bcf9a7fc42eea4308d3df295ae0f08842130fdb4ff233c2ed37a40b71ed3d8b1bcb97f5a6cccc775935670a02c7ac5c4c50eb0907f5a61c1a5645e92c084178929615581f0e658af09f02b6ddf079d26aa9c051f9fe9fa8506b23fd3778b269eb5ca081f873d85013806f2a2e29b574d7bc7de46db0d14a25741e4b2692693c258235628e4f54b47dcbb4b4b264794b5f379c21d196fa0aa642b06c68c2751398928dbc0803c204009cfab65a2ca727eee6b80e20ec4dc269416be3e2e08b8d720412dad6ef793b08c615e4e9476e5851d5c9f85aab95a4371b71ddcda84b0613b1de287787eae0ccae848f972ec7a4b28a26fe11e892c90df1db7b05dced6a7e04c9a59dc6be2aaccf1bdd654540cdb6bbf1bc4411930b43e2d8b77770ec80d8a6f40ace2cb794f018dffef4641d8145c18f121eea481e29e77eba580e36ddb5125579bb62928b641b8c8d1457bbc6c74fe429c4ddc1c1efa2489ab1a45f4b50247bcb775a9ff1f05ed79c4e44c1d4a93b9fe8db209ebe2a865e304deaef7259b4de881b190736ca75fe16744ac3293b5bbf4d87a10fff2612f846a2af2abd668718fea35f65f47f4c5b92378465f7b105b6032608065019c2f3e7a3ca354f98620f1294d4e0b13facf554ac37432ae9c82de730c6c0f44aa6dbe34beb0d4c2fd256bf9e63f97bae7b13ff4652cedd08da7131d4efa80e880fb51b7123794be5b05ceb49f94ded4494cc0679cd276bc6395cd0e9ff525508961a20796d8fd47de5f4d35ffd90baff23ce9882f6721d19306fa34bdaac50a83523d7ba765e44ad93d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e151a7c204314d5546e5390963a8d923dc8c524380f5ee58f13f93df9e24de3b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38682833502b092fbd7febc5116248d417d1b2e4b064befb359ef5741e76d23612ffffffffffffffffbf312247533d481e255cc41471623b1077e333d08d92c300778761150624dbc8b4e3582c1cd44a03f704ba89f8891ba8cf2dfcf32f726a79f575286a4cb402e5a6349edb00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cdf7ec4344f88814d96e136222a0363399296eb2fbf08b82f8a24109bc7d35d1c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fa36e71736dee3424a485334009aa590017a5cfc804fd3aa989d34ddb53a402300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e337bc3e6e22edc243a33c23070cbd5454ece88dabfaed05214d7079449d974803bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085694598ba011d14f9f293cbe6c417976c628deb74978aa8c6b231b310a8b2f62e48863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a011455877e6bef71880c5eebeb09ca2abe10a8da4f78ab87d4e8151330fd0659a00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b00104203d8b5a35076f1de889d544709f7db7d0939aa7c1569ad41058d490aaab00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4f313a3455848783885d296b6bd1165efbe385b917088ddd09fde7138af68aff303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2fb984d8df8ac3c236d580fea549df950369b4a214d39d621ddd737be8d268f200f003000000000000a61b82963ec7778c99169b7a4eafb293c691dde4fc32298be3f511dc89f4ccc4624d8c487a6e68271e81e3efbde869e98ad3a620137f4a6100a16dce03ef17cbbd087e7d2df53930020ba5bdc23b04401ca9a12f1eb5d52ceef80e0f3a26f8a586c34ebd718536012f9b6c8dde327d34d1c4697cdeafa2682376a66cef497d712fd45b4bcdf2d303d5fc171aadb5b85498174543d50924f700b5d719b6f5ea3dea2a92e763fc3663dde5ae031f3bc2d319ac1f7dcacde4d51fe62a3345536868814aa40e91b4e7ed8ca1440c242b2e528c90921b59388dc3614239345e19404f1621abe883b708220854082dafd9a4168b48df5ad03a237a5cecf820efdd232dacf8aa5c3f01c810f7bbbccc875e38b8b592db1c8c97ac37fceeb54c70f3f077a79c2d8216a4a56dbae258f0cecd9e9f0ea598ce711df269fdace90049b6757d7560ef52512dc33c0c8ec90ada608c33846148167ca02785856082695ff657d6c4126b807e66a55bed0050f588ed3cfd8e5f661de9b7cbab20416d1aa5ec860da9ecc64927f5c2c68159abf91d49f1ffb5778ab8cfedd1bc09ac8d1e51116a143f82d4ba9b4808b6f8e81a8dbe9e94488c9ad98530329a3b37e5630cb3ca856b8c2374680dd425b923277e55c5fe6dd96e0ffd71a13e0b507601c0d95817bb1bb54df69a5a1a13bb63f449bff064eec4c494623e74ef89153d2fd4ef598356883bf64087b58539babd0cf1d0e558aac150c25f23ab23d7cd9ab799923d38d8fd13f8a125f885a709c5a039b6c297ba057b6c66bb951c94b4a2565c9646b32005ed1a1296158cc495a1f54c93f06dc36ec50aea7602173915a37f0830825735e7bf8670b88047e8a8b21ff4edaec9066c56b6ce2eef8213c6d75065364ba038eab7fd0ac24ff324f656f6bc261a1a1335103f29010ce4cbbe0427eba948a43d7b4da35b0029b38ed068f10463a508a52fc8d994e8150ca3966e16f113bb8fbc6d631879b0db7dc21e8edb7288b73d4a2cba78a14a459529ce9a243614e1f7292b630344f0eb46da74115de37ea7acf119d3824fd484e53fe31fb53f1d8bc8e7c518e7ffd5e24406ee08455debccb9e4193f36c116cc3cbc44a340e3402813f6ff445c1763610a3f59184042241842820b1729a61648b8db71030ea9dc7d0752c348f1152484368795c59865ac278a9065d79499190c02e9c642d28132fd0f2c5347bbf9f56af98cbed98ae5c21af71356ea47c1e7f33b64b7d5feab3e5283bb051dbe350a7dd73e45bb4179f6b395d130412cf3f57844fdac3acbbcc640cf8e170e1726fe52d08b6d1ec2fbef77947d68ce2fc3602e036d0c68d3a1230e1991bc3b0f2699d5cfcb1d6dde78164605bf4199e32668ad0fd73decb05eb6e9357fe4c0817e5a9cdfcda039118edd0f3a3158 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007780dd3967ecfe9838442f184df1e4b11b46d986363e8dc806075b8ccf2d9e4201e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3812af60e99d584747af4f5bd7f70091be2d9133b68930f89cfd7d67b4829dd9dbffffffffffffffffbf312247533d481e255cc4141a98310ca2dd84efe71c638415ab200df44d466af1fce60aa64206218d55b5c7dab9b00f8b975ca423376b21a8a5052b515db62435aaada000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb235e38fe23d6b30b45ac457921a2c3110e86ddc617f78add19590f464fd7eef4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d42967ae0e15b7a47a132f2ece1a6341a4af0ffc62f2c428ab2ec2e011ba734d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3359da40f1cf4bc8e207ba03fd080f6ee479d5be794f09f5541d90894d7be8e44fffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856912258e02ebd1e24260dc6c03abf4380015f4da66b145e78cc0760b259acef3b2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0da190cad4725ea6b59a0793181ab6edccd33fff0f682e439c0ff7d015dbb00d600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b08148f09387df5e7881e871dc22f94dc8486d21e7e77f0cf25ac1bc902ab0ffd100d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a40c458b1abf897debab4087968e6a6792c43030a4f27124cd54790e44b5c55c6603c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee32d9fc618d3913ed50d75149bbfd136a2b50fd63af29f0545ac6bb2580301ac00f0030000000000009983e5921092facc620699ad24b2c728dbde12db6118abe3caf31129c3c9ef91270c2532716eb69acea60612f7db21e1abb59395d27aecfe59156228faeadea5137bdda269e0f4a2ce96c76c55cfca832f772f925fba264b1d62e90656161214a46e7bf63f11f2d429687d7b5bac0166557a95a0254924fb9e6d8a509e4e58da3a1a603ac5ee70fca2fe4a63ef445d7cad5a1752c8e1727468cc448328f76d3043d8e0c950ec609a607d06895244d1ecd5606c504392847f3055b0c3bf089b28aa07ce92a5ad70b8fee9a5834359e9b694765f8cf071f675a2bee883d2a22b681e542c78727842ec7f3f333fff0c04d092e6b87cef209d35e09c61e24aab9cc34c706ebafd7d9f214d871e54c6b72ae16cf3ea65dc60d05fe2013f35ccf7536a8082fcdc6f3837d337a98467315d49ab5c2f8fc25d039273a211614a88460a7074ee2424feeaf1e6782c87bc9a92ac95ae2aec9e64ed45324a2088a4d18727ac8bff2e868a39b673b9234fa27f337e3d353ecb0af7a7df57f89d94d0aa4eaa89b41829df3f307973bd19056600522feaa974d7691f9a348e8526c7cb47e1a32ae8862388570b7e711c03e5f3fa29491581d6588365025744251fb2cd88cbda516198baac7f164e55d632a01c72ef10c50e3fce038bc15109444e5d9984092f899463d15fcce2436c9f8d86e54939cdcf4e7b23387328ea133c7af33b699df3525d67bdc65a01bb6dd39d99f12a39e99d95c1655fb7af6986382093272f0f2c2a4bd3c2018088f846595b92240736f261573ca3a01af6f153b853f93306522cddf718b4232f3428c84dcccf63d4edea1e5d16b4f03484df2905598f30531be8415a83e4e92767304e968ba666a78f385a4c221ed5c59abaea8ec513acb0d8ec0607750603f5263f260d433fd2781a6059f3c8ef99e6dce696c72473635cc4b36b5bd896fd16e9d5d89f4fc312d7d0c131ceae3bb5abbffdd57165ef2a0eafb85fc741668bfc93eb0cd74970306cdc24214e960c7db0a435890259545e37e092e2483ad2affcb888000b184092a1758e4ac4ee21a48b4fb18c1aa0636fadc85ee0064a839a25c4e99b6caa6d394a911b35d888f4201bc2d3a92302aa59aebfc1d4ba9f3e803e9628c5af8ed153b4598554699bcd234be33c927131f264a0ffc5b0c24faa2dda9de63f32d8a062d21e880a984dd7cfb9a6473de894ba6fad3dc601a415133a99367247b38e3272afb1e4357be7dc4605d7f555897b75435d60102d4aac7882e03ecfdfd22b8ab149072b0ce543c474ad3fccaa9433397805be55b80fed0d5eeb26a0ce6736a1d0929df8628242f205be2dd0deeee858257e26be156622de5ef5c5d504a617e8c5a708385fb8b66e921e665fe3ac8a04cd2bd9281d1fc7799e5e2fb9b4a654d493b38aa805 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c4f29da869702af66f80e158f86d7ca11085d2ba18683db576f985e96887290e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d4e51ccb4a4c67775ad5e29d8e3dd5550ee4a6a5795d4547b18ed17104dd55afffffffffffffffffbf312247533d481e255cc4140f04caad4d7231c19e7b553c02d477e567c63ad7ff04f462b52e018d0d647394f8bc01f665ec40206590d10882313128deb8e64fb2dd2cc600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c9fdb9b3d97cc20c4dd60db63496b92bd680a848054c3c785bfedc23dff517d654bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d0164faa2b763522ff455b7f248ad2b24fe2e9f80997a054321a670e264881ef00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e332861363f4f7151aa4d36e2cdf4299cd68de6ff961dd5a543e4a850643e0b9585ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569905fedf51f679b1b14ef0c5f349179a5b9745cbe68d33b2a77e8e7175e5d6331863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0a4e4e3175cfc1ced06767561bdfa308f90aa59d7d80a784d8ccf93ae2dbbe9cf00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b042f82223f4351cfcd312d02a147739f444a9ff810c77e953adc151da672961b700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4c125212348c638a9a4a11c76f7861fdad9f503fe2eee7ef133c681a9ca2c681c03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e617bf9ab0cbdf5aa64774b9b38a35ee1508d60ba4cea8b6bacd97a640744d08100f0030000000000008834508c46c4ba88ef5860f3cdfaea0cfcfa4128f042567ca55f7214a152f50d0deabbe0c03758f8030b27242eb16f2985c648a94975d841b3b5f3669789bf1b2d7ca1b125d98bfb4d3003d7bdce3fde944231713c8f8387cf1de47fc33c8349a7dde1f4edc2791fc79fa3201a5549f4f22ede0a847343d1fb9a7164564a66c78f77678563006e5c38f901b74c529297a22c3646b61f71510f586a8b6ef30287d54388aa47ea9ec3b806bf05b4ce9e1221659a0d54ea2009e0da3cd0c64c08eaab5a43d0c5e3e90ae4cbcab72c5a9d82920de05e4e42c8fc888b751c529e9d3a81b6f8078521d5def1778869a27e1c618b89be5c838c00cabe66de5afa216574372187b50277d2cfd82684dee6432fe5b112b199e2bf1c18e4c12785054ef1d29998555af8aca60ebbdda1f981515fc7036aecd8c4bfc39486ddd0c1ffc1a11dd518406afba5c373624fef0e63d10790acc6c55cb37fc146ffb3a33db0b261fdbaafafc26e9382634d8aa39363325b1f37e23df2e746e804fed693ea841f5209b62b60d3812b90662fd2e17a0721f6c7080f89bac5383cafd683c0d05414368e4da6e4941659f4e2c5b325291fd22e6b955ac8ae286280d2a6654fc8e13eab311d80e94dc9f8af849453a22aa05407a9e845529963540b9f8159a1ec26d1aa83895a4d1fdf1af208a0a8f205391973fcfbf3cc59dd125e18e4157aebda80610979a2859f046d23b1373c177fca4fd71e71e0964e212a39c017cd513037db99746526098adc1caefc4c84ddb12cfd71557141c6db8ec229d2be3a7ff7fc4ce0c2d54a14dd6a9267655989019bedf4625b9c70500f449250d6eb8eede93cf61837308cbbd1de852c8a31cf9560fc83770335989e494a440f140654090cce8f2b86a7b8f5bf140168bad6b6b4fbcfe68c131152422f9a6431cfa551d800f28bffd92b5148db12904ed5d706cadd68683d6483cac357f394ca5a1c1032d09d37409e883dbfbc24f23515895eb698e9858a64714f135c00d441be328c3b6bd64482d0173aafdb246df9d937268e1f45518210010bdc905048b82c3da8d313c784250b8d922460a8206b72e1cd9a661d7af03d76e6e159e08bac17c5007a0c223d0238c401c47ce43eabcc4bb67db77147a3118e3ac0edd9dda6b909acf42427655e66c7b789f3aedf5ad0d370c29ebdb341567a1a2b26ce2a2c1bc8b90d3ca747347a5282e61df28d51a52337da48ec92df4688e4c6563870bfa886c568d8dde11cee8b572e52e9a9bf32989cecf5bfc24b04d94a819cebb202f3b803c8b9735e3543ee3549ad3e79164448311f5dfa16a01636c8b47ab4f3dfad4b8e866173fe4c2d9d554803df5a6304f6b9a12aaa42c55fe35d115c4d83cffd78207098e6aec67b81044ac4ec9440e54e26946dc4f9ea61 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008239244a8d61bf2f6a946cfe4e46ae816943c4840604e744b5c6a2f64aa3245501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389f81d9998037cf1952751599817692681b058121cef621013293ae119221798bffffffffffffffffbf312247533d481e255cc4141ea1ba9284c786adee10e0613db42f86b94e0d6c2d0812a82fc16c25bcc64b4ac10f2ebebae6aade74950b042616d03d956723743117452800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfb01b25cf2a5c00128299bd4d3273f60529e0d62926972b7582818da13f6c0124bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cb109bdb1b8ec343136978d5ad2f2eddc467cf0b09e5a7df0e16ee81b78da1d400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c45aecef8f28f4f437781a514dd60cfaf1fbe84d7570f700217285666b78df36ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691e2344e3a521a34f3e457988a1810cfa989cefd27a87ef50b68bad6a876412bb863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0192ce938327fc0c8fb0f3061df0da988b99931baa495f0112be635de46a8d8ad00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0795e944a744ba22bc60bf2cb9b459a1a3617ea4d8ced7e1a28c23d06f4d7aac300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a433e332bc10b2b7a5b1e3e1e81fe85cece6bbe937fd96b7e98e4b6b61bac0925703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ef51671e2dfbd72bf28efe3840cc9cf1c93009f038efd601f1ec1b1a59cfa792b00f003000000000000a265c0fb0d65245cf8430df0fe6e910f827f1ed74ea03ddc39b7ac838c03d5d746e19c3f7138c504f4db59b1ad0a19d7b33e7f0624f4a29fefc5a7d09060a4ec5c652ae8a7cff7e73103fb242d2f4631b2d743b2f09802cc0c68a5515552ffee8d21015614afd78211c17bb7be7605d59b62c70c53277da039cc5873779263fc487a0fd52b1c39cb6a3b42963da63a0b91b3eb5005206df249727a540c990bab350dadcddb100bd7ea47f94b8e28a3d21de57059f379629b4e2052e88b243d2b8ff31d5eb20db53b1d984aa091f0ee025b7dc36d6e04079f0af33599b18b31cea8e0766ab81a2837c1f2170ed155270aac5dee4cfe2a120bf5a4e956c7517ee3ca966885324c7f67edb244325f5de8d6c3e9deb452c8e90c2633c4df9d6c2f0395d80d488ba6070ee970ac758f8c0ad24dc2778f9e8103ed38ac016a37322ed3daa650ccbbf206f817df487dc19bd2c898615e10633c52ef622ae44cbcdd9857b296974ab10f09f652d98cf0cac0440d35eedb356edfed67e90268447073c88f818467efc02b511b6eafaac5c7ac9c28c8224fa3302455fb1bd1ebbcd143fe055791474c493de717de8933581dc49a46a99c2ac1d41d86e16c7ef0effb7aa1aa953886e1b611372f0630503123fc26c95592506882b7f021e2c9447af0d3801ca11ca4763ca5856667bdd0bb3106e4c6e87a34e4610acdd7dd85958908818abb1f7e9c66af4a3874829623bb386f83baa321e513d9788b550d2d0cc446bae197931ad3a1477fcb7fccb9d006b4d45e2609b89919f3ab3183c14570de82b26dfaf89ca0c9885bc31d0ec09a144ecc651243e81a19264a33b2af6718da95004c557e408ec42e5b2d2227b85a476ba36e08393a7b0fa86cc2fa10056bece52b7748bca2f9f47691b9e5f2a59e04e9ba7301fac27f27e99c9746a2751c6af52cfaffe53b18ccc1cbbbdea26ffa608cc80c1de789e18234c3042906d5ed6018099e9c8e148e380d15de7e6078ecffe76f09368b19ad784f6eb80d07ce14dd77cda643273ac97e469029b703e81f2e6946404bc5a7c03b64d7b16391002cc0d51fca0704e8f4d1fbe7a8f7cfcff40a1375d123e119d720170dd7b8f2461b113a53018f6a8e513c3457950fdc8168289b6717207d63295f24a7775a5fd6a4dc7d9ec9a59eb96e719bd02272451bc8d54d6fd501d6d4e889637d646244727df57d9aecdc18dceb10ae886dcc1e82df1f6c483854115303ed9f33a8acdd03866ebd74d6e5e93dac00219d421d098fd63f58130529265e9eeb7017b721830489b246dc23282a08bdadb8630f590c415cac41ae4028752df58a4bf13db436bc5d2dd40be70fb2a0ce4d45f1a49a4dc97bd01326355c0eb0a35d378963173a957f4aef2a3c228c5b5bd6d5d1c86739f826725061fa37 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000018af6fb4ef4d14fbd96811a5ac62ce92747df2a59ccbf0353332ffcb0926472a01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d8364fe9716627c19579a6ee437dda844f63db8f1c7c1ebc2e9ca73cdd071e56ffffffffffffffffbf312247533d481e255cc4145af8a0fe27d1b17be6b83da44224b64b7ca2f92c53639db3fce62959f9cc0cce060de74044de81c854fae43911971e2adadd658f7cf54dd500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca973b4e6b21a62599d721794c42904fe749404108818f3ae30d6016cbdb359644bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086112f11dfe6b071ceef77ea0634e979b8494ffd6f78b5e4e47d3a183149f750161b00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e330294d495c71b1425d1821c38d2dedfe4cd9926b03490137d292e0ef7384315e3ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856970cba0f92190db53e8de4da0c485536cf604d4cdefc7166bbef322ccf0678f95863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a00ed9d1f97113d41af2482048685a807fa645034120f2c9e8e210a2f2c71656e200e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b04ab86e789cabd45e878149fa5ef08dde62f84e3e4d5723319996a1cffb179f6100d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a43be11699ad3c5aa427603e39247e307ac1323e77fdcb527a94f77aa0c4af3e5903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e22fbde89dff4ccbce5ccb03fa725ce2d395a23d53434f8f6b04f0dc3c4d6c0c900f003000000000000abed2fa53957e508439a5fd715724801cfd85585026f286fcfa0c360f6f9ca60d0e6875e862b2d9485ae8e55389cecd9820928b210611ff1457a1f1277187e763709b50d0689d0fc33aec715b71b554737224979e79c08f8b3fb8da6a16aa40aaa12459373d62ff7b18d477efdadc34d5a890b9af027fc5c17573bb1fa0bbb7494318df6e835d9e9016e92335039240da2a3abe8babf3f5a5dd837fc812c4d575634322fc9a3461368cc885ca7fd801d2a908e207e2c8d485afe070935b150ca935bf818e41cb29a9f412f39a786e01d5ec705578f8be17d243834d8e5e6eddff0648565028918f1e3ac979e94302201a752c7ff66929c6744ec946a0d7091e06aac1ef39241c0c3cbc405e94d9ce11438371a389dbe4635ff1dc254509f548392c418e3c2ac735ede7f7e5a3834e175d922386371ca61fdc50904f8e4767a3ac9100708c00ffbed34e9ffd684ce605a90c17260bdace76a2f9b7c9f1f35108549bfb9a9ac52b6b77fb47399015fa742be17e70d617585ea268d6c75ac890b418583aac0054189a4c34e4eb89bbe5154734e66321347fd278ffae87961cc021cdded788154fb3f4d621713bf3a31fba6a99315fd9f0bb76639fdbfc424102fcc516c300f98dd4dffdd3dce76d8addfa1df05dbbfc42ef854a713d887184aaf3e98180e76754ad0d1d092795fcaf55663f167de73e1374761ff652f8239be33fa08b67a069f22db1f5df72fff1dd23c9ca0760d8f488a24b4cc17bda5bc46142315a86ec8cc9ba208db490ce583e75f4d559e119875f778020f31509ca7c77f87fe40e6a77267c3d03b60f0404bfb224e83be9d3a9b60c6591a7f197b0f6df15ea7de8d26de88c0d83447bcf331d544084a4b275daaea50e24ccec2aeffddfa6cdbd7be04913b0f83360758714aac47099e954b2e8e6065824f1790867a1fffb61e3820503f4fabfa0577c56d6dec275ade0b11b53e5c0ed21ff14c2c0774eec7beeebcd26e5090afb918be0992267a2c8a75e2259b145fd101b80188005c3928fe8a3d570b9870eceac65e0641930c049a8852b5568d025bfb0bc0c690d4e889aa7177db93bf076a28235b3a251e7a3f043a26e8a6d6856297f41f4ee1d5eff3aa47af182cd04a1df98799d5121dba10fb1b509ef76901e29f0f423b5526a59892eb6e57205be158d1cfeb52d0e581379e4a213d6325e15a12c6df0a058fdf15854f172020cc2f3f5c3458ecedb3450de48b83ce67bb79bf2aa23731d6aaf7903a6774924e3e22ff7a97cee33a7c3a2a52b8090e2c728c9f231af08d8a674768503695f883982efe9a4be9d890db9a2dd6d649166394c7848863bac8b6fb7f8d54af7f519faae4a70ad551c422d64723f3a1015b27136561151afe2e5288720bd834b773fcacfd7701309630d3c84f1d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001b510ed498c208fa58172d94c552306d628dff6345488357242f69e4e2b2aa0201e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3856190d7a29e2fb3b614c5a47ce83dff6ce78997a0d55944719e05813737dbc30ffffffffffffffffbf312247533d481e255cc4142e25143a6b0b8c9a212b0c3952a410e468bcfd903402e4cce1d246ac97b9b80707a6c4ea89ce5c7d06605c9533a4447fec7e23a058a2dfc400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c23022294f270120f0f196eb39dd5733878fb0b63a97811f736358c52f7f49f274bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861184291c4a6fcc7f911ec3f3505217b869569ab9b6c75f7a3a82f69b6fdf39e1b500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e336bf1f588ca9526dbd9d2ae0e2c776a0f235258989db56bf50ed62cb0e9f59f3dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569e870d627b07ce401ad36a49d8f399615f92e32b853defb230817bc8d13035e6e863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a07e66235cf84afd75db9c53eb1e5e4d6dda9805d3344c426d03f1524843ec3c8800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b083c4bc9c3684dfbeaaf02143f85522cbf1a90cae8f59a76bc935e114947abc1c00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a477765bb9b12c021f66ee88a21aa18f06163d79ad40d1fbafdba21d6e3a523b3403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2d07629a7a971169384b0f574894ee4e9e5cf01c3383fd828708bfd7c78c866800f003000000000000aa7ef74a6f0c668c2f314a4594f3d401be3445113eb803ebc331bb09fcc4d7c85484371546886190ace6b127bcf42409ae091b937ce54703c0b24f762a7da94280126625823f482d26c1fcf5db6a3c573e17f1da7c8b6cb1c7b5de0328f64d44b154075db8ffa516afaf208be5983e98e1ad1f05f555d02fe8a6f0af072844ff610b54743aedbc3e49de2adb88cca72ba8a3f0547f7c4dd615c7e99b92ddc3039b2bccaa705d0c65c62a902711a17fabbd7ceb69f844629c2317ac93b8c891e1a400cfd159f68bf3360875a06da05b5cd930eac37f62eda2ef33ef433509c78296ee76731adb82c6a6b83c9755e7c57c834ea001df00f0f3fd339e294e43515e78960c470d9af301c756852b7ec38cefa97b48e50b6c23170871974720a3732399a3a98ffae24555b93da78f4263699e590d770a1af4e6f97a29150032bc1084bf9594a0bdaa8fd9fb0effb13a82be00b59b50444afe42d7d76c1458a757adb289bdef2233749b19117848cd351c684d61df3faabbb0127c8cb10c45c6e36bf4a166bc6dd7d125cdc7a8615e4966e408e0beb4640bd27889e3bbceccdcd77681cc065f6dc6d836773d391c86166d24dea6784a8cf14d73020f3406821f1c97d966b83d905b11de6733971e9b842b746f7b609c48d0080a20fe3ebebdd4c7a0eb97c1d8977cda46c98db3e03422f4006bc43409d35cb694f26906d60c2011ed43d236c4b7ab3f1898db2de850e6e5097648449e2ebc20120cf22daa0d30177084d1a471e29a9977709b9d80ee04ee793400453538218e59da63d196fa2feb97b5f3a82f8ab5410f5be785f4a56bf4a95b51b9b8069cbec0b36809656323daac37c55a8898a8fcafc8c50191f05a90611967b727ca967ab847d81e5947c5854525f7259b45991acaa466e387d685fa420efb218cc8142b5cc364dfcde9862c2a82f25c47a982e274c980b78743641c5a4922e14e62ea3afb2cca06efe425fd88bd4c2e0771d74461dc759541dbaf00991683ed9cf0a295b28098f46c6722fb886e36363f1525191140e1fcf3f814a80d6a8c403c2095f5f04a1f56b1b7972e75472722b6827600a34d0780b324bca7a6220fdec83ed87c2caf6e7b264bd23e227982e377f84da57b711d6745b8f6ae110e2edc9defaac1059f74639c5359ce26857e26adbcc7cae052382ed9434778e33678b289e7e95d28b2c3605e96faa8e6e567586a84cd20d2fc8c253dcf7461fa4a12c756bd3a93ac0803cb8eef7e818aab7ddd0b9a2f14a8afe36b3cd37317d754d2b85819338818e325fb26dd7e16cd7e2e02f4960ff0904726930be1a800cd38a9c960e3b1c33576e7c09cd181be470aa205ec5c96eb737affd6e1268ae0a7357f3e3c9f0d014fa75d9169a3045750e6e244fcbe02758c0d1a178d4ff8aa3551 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000000d5a34d7380054b95bc6f028c4d7cfa46c93298de3b0e2ec15e6a425a0c5721701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38040c49564e792120c4af8428525c9760642725d548335ccd110a5bd7859e71bfffffffffffffffffbf312247533d481e255cc4147f356770f8019f9d928154dc380ff3992ac6ab1a230a95bf38ef2670fe4ab751ec2b2e3cbc0aa83aaaf28f4d376b0f5d9c516c4ef3c14cdf00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c2d3bf75760e18df3bc54f9d0c3c26e5e6a8587440f0c40981008bf1413a606804bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611363186a4d0be9842a645af0871168b0a2d383db4fc6a1ffc1ac90f926af2a21600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33b84df0d5a6d611073a7d227adb09741f45af8540cec5e39672a33d503455aed6ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085696edced5683e81424cfdb080178c01a014174a9e29c9770809cea8ad0b9b4e6bf863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0886bd650e509293e05ffb0e7137b7d31bd740073583b44eb4d2a53cda8fd941d00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0117446f538aa0145491e2b0bc0810794699df238ddec4573c1f4472ff58911da00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4dd05bd94a1462ba01ceb375781a8745b0dbf1518488da9dfe709a95153dce94303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ef1c588d529012240157c5d85f7754348e6364ecf98967640bd986a2e6e13e39b00f00300000000000093ba24c98a65e0306c0b71af1729b637570ff0718e83a239c714c2c45b18899201fd39e5e2fa5abb38a9e85086f55057b8769fd17d58f6cbfef3518ee9bdabe6cb7a9dd14c49ee9b76253d3435b4945d869ea47f80c7cc752a542ed104afb0bb81101b73e3cb004e38b94bcb0a64d94ef631510cf3ac40d040d951141c92dbc893ba9780a073d0f2f54135853fd327f484a721f79c7c8c70bd6aa11a4655e1979860e2a71dac74ceb348a7dd029e8d16c6f4ac9a62683d06ff696511b4e0aac3913d56c6a04bde7d0c369b769c2d94e1bde14134fdc34451c75efdf5115dc7a0e95c144935eb8baca1da67de0466fc5391fadc1a3ec97b9551985cf8042e31aa52e30a5d980d368172c379f9e71f9b2ec204e59cf006f76f785f85faf276afdf8e558d9c779c3e0ddb8fd7e0a530a56eca75d4f1dc3dec0d91ecebd0591ae4a68a5054bb77bf0181b48fc33422fa307fa0e5adc8388e6fae43cd2cd9a5edb0449935ecaa5843d2aac83050510974c1c93b391a20f2ede3371d728fe276297e2e896b5370d765555db76e6870a13916b679cb596c497de08337fd50b1be1e6a3ccbaf5d407257ae51c6219a9260c5e99489f09e3ab987d273ef55d0d09f80513a5e4d73796fbd62579763b310924e810894d329d52f5bb94498f26d5eaabc53ebb34f48ba2399577d9986073b85f344b752f0bac46247182435f6b7043afb872b82cf644bb9664ef103807507131811dcd63390c01eb892d0a4917b3f8d8a223e54e7b8cc707be17e1403e3f9b2dcb70bf0f26c88d7425d329806a5c0a7164fcd27e4d10ad3ccc3b844b3739398350a4f4ae1ddc862a1505bfb6cc7d72608b96fb2739aeaffc8da1e3681f4be0913d363207b1de5721bfaf3c8f860ddd85695507dcaf5fac6df3ab753d3b6f199f7fc4821defaed7df0d6d1821d86de5604bd8e1a3c36d10116a40dbcce222b09a3d51e486917b980b84a79122f8b74ec45524bb364a41f5be6e75ac24abd98be6b6529066a39846f19b8dae1d1e16569b084802f839a46a5be4e7dea80ca59e45ab608dcb959bb94ab8a0e41d1891af84e3c9dd3d136ed0eaba9d2fe828e784c60484af60a1c1234007f23e474329c855080f7888d3aa195f58ecd795a153326ff29289563fd38e59f256cf240486418d7117acf6335769dea684f813eaefa0f21111525e4edd98ad9ffa74d7217ddca51aa0fa6428031beeb80daa332d7b068837f10a056924cb7d3637aa663d478f7a0c8fb7db13e5e16109f0b5c51541f979283005369902af708dad7cdf4c2f59a6311db5a8b04ee4537d5c9220dd778a12bd1107288deeef12f887df763226c4753caa6a0920bbbf2252b8a45c00712ddf7d319c767b4f956db4a149b7a853521c7b924397f7b923c4b5bb04af96197bf261b04 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007efa805a89fdb4130a4b1e413f410e332e9b5e4761c3726b80e4c24bbf9df15301e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d6879d54c5d5ae3cd340d77e05a2f276bc5449cb1b31bf9044b6d6959257c297ffffffffffffffffbf312247533d481e255cc41423c473965ff4b91747fef8d18442d1e0c4eea61359b5821d640941afaadb08a485ba358fbab7583e62c10c058a49da4ae51607a828b1ba2b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4dd6f6b1e7805046564dc4c9d650b392b37bf34215731123950bb15d5794b1284bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cda1a1b323cdf898376579abd3fd3ab74f4576e73955731a2e8b575bbc1599aa00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33708d03e5ede1b1fa2d7c897b1d21d02100c7f33154e0eee8af223e5d6ab74d1dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856969fb0fb32f9b832e3e0cb93782da3a03ae7d58386b3f30ec990598f25d1d13a9863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a015323ff837715b636bada16caa54e929c05dda65af3ee7890cc74aae81f880e200e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b03fbf69a35d01540a998bc4e2e0e8947e44d6da88bec6e53a30cc9a3c166a236500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4febda0f33a23646a1d23a180e019d54af6d7ba0765ea96f112364923c54bf1eb03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e26ba4adf69b743898aed3a488c28dc2c14e0c18f4943b9d93ef6f5a4cb5e916800f0030000000000008791670f24824e977e5ea6bd3fb9cf7bf285a7105e58a1829eb7b2622ffe70ed0afe8a3d78470f60cbb9ae2d3d243ee8914ab75cef61bfcd53dd1dc7207c6f41606d797d6217d76cc59362fc3a3ef34ecc2f147054b6894e9b86294ef51312e294d477bc6ded1a6a2831204ac94d8936ca88c17ca228c7be1a64c11414bc8da06d9f7261fe6ebdfa95fabeaa963047ee987d7713c689cbace8a0fd31d36a75a0525940a359cec1e837925a4254c1c8e4952aecb453706a57fbfe68152fba3ff78690a7e012d0db71471cac4785b4b232df0711d5e45d5a834609ad241a4f0dc5dc2c7b6de2c2a808b8497f47f0a5f3c690e11abd6c43cb7f568e146550344866e24b7e022c38d331cd9d6d30066821a2b0627f44de308fc88ca88f7e31058c94a0330b6e515208c7454dc5a4d4b2b3f37e47049c8fc196c8db7bbab8e1a84fda1a04c7804e64fa1fb31e4a8f4372050ab93184e5d0eccccaf6001ec80386cadee0f1ce7636144dcc867eb35d24c2d36946bf013b6d5c0611012fb43cc7e9f310b870c8c763ee51766d262ffd517b448578a1d8262af4aba4299a744cd0b386f3892734a75cda6327736f2c3ae66e17628806da06951e0a84e1cbd05dd5202297e8f2f5e83f6c8d66e9af8ce1cac99d3dbbe5a6a470555ea6b15e526525c8ab058c0b5f65ddf909e61bd9594eb05b86453393f5ed8540a771635f8ded2933d6aad630980d236ce98bd5988684e0e202d8f7e01bfa267eef39781c24b59d876def7ab2288a0781c725f6eb6826c416795d6a49dc1ab92fcd5fec65d1ffda2839e886d44b047d99144505c9eee7f1a71f3820dcbf2f4baa0323f874477181282efad0be2bb10ba4caf15c6241ca38eaee4a91b7f4a4bd06c4431761a5adfeace746c9c6462894ad37bde53d70424619aa1d710e16b1cb4b3599a5d41fe6a118c3ed8d0ba3587ab0861a12097e8c3bff6f32a5746e4afb80c7e0aabe6ca3a0fa528b2725fc1bda128f7827fb9f86c4fdce6a2dfd84d54b9ac5dfcbb9e42c413ceaa8137f6dc0a01180a2c320ae4da9910c731f5d5c35f8b50e32ebfcd07861d4875417092e04db0c3fa069233ba5bd599326ae3b7f1254e08d5fd9f172d8114e923996f3ef30c608ba559b704026e07c362349da453b4b7519a674f830875c98d63ca481722713f6a6ba5c695fe469799409c3e21d94829e4afdb481cc03638d8a02508565f32bbc96dc36577cdf9c88004149552e23bbf55f3010ec8443469d93b8e5f201d7b5d428afb9a9c0f06ed2d8465c0f9c6eea417b5a853d0db4eaf893f5ea710a3a56af67b5ea21ae8d5f3f1b3c7d337b6a1aeb0ba64c8aed47de83fe768e87deb847597c41425f6a041f7b504c3288dfe3a3a381c4763e3e9e864b47f2e98fec43656e5f44f642d30373acef18 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000040bdee44b3d958eb5bd91daf8e08ccc618eb6ddce2518b2fcb63d4af9a0c2d4101e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38648e9f5e4309fc5e4850663c6b6956bc374a823c70f79c5cc93119cbd80c65a7ffffffffffffffffbf312247533d481e255cc4144197f94a778742795a7eb71b708a0bb2aa316f62bddfc39f94ec3ef01a2487e6ab15982d779cef4517b538884435a4c5e6d015a08cb7255f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c29de5ba4b292b4834392fe6f59ce1cef39a333b969f42f770187f91f48ebbf4d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f98f62e3a681e9200f146983fa61c378377f06a03093cac4bf2cfb21d944f5cd00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e339c5fbb2daa2b35523ddf1c741d551cee4a403d4d12f767c25f7e16719ae7b0a1ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569fc4a6885f6bd0936e23515ac1cbd72fe1004cdcca91f88987989201ed0646d5f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0255d83a85ffb3e608921ad071e9bf7d2bbda5e1c5d182fc67d155ba78158664100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0338f4dd49e484850d9433962fd0d6ef4298ae02ba8b2961d3306eb105c594f0800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a45aaea7facc965f2d1c87e88f0114e1039bd08e255981a6d8c1a98668377f649103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2c6d3ea995c3399b83db3dd8cdc669ed71db38395c743f00c82435cdf0ca4ae300f003000000000000a9f749cc52902d32ebe9471c627e70b529f154221ed1491e418062ee1653af513abc4881258b3d27ca27131542f360008d3a6f8790f1e52dffb1c749c5747add8e5e21911f3f358d069be68290117b140e6c0a9884a4bff17b9f6c0b14e9837cb053c754b9db75504c01507935b49e75582d054bbbef518af58d0cb992ce1b9267b7eefd20ea11ef81b4976c2dd0d1f5b3c3a8e99dc79d0c3ab0a0f79f0bfd33de9368c4f1fc14f5a966afeb34992c1702c5e3186e036a04054c5249889434b68f0ee7812e051d5bca9db530bca8c29990f4c6fbab853caa979a66cec51afb57ab0e4b261ae8fb35c09edac5ac4877a391a7b1f77c5096a5399b9c99602494f1e7aa6cbd102f435da653e26480edddea2fe31b96004ade9cf58f6409ff3c2f698f01e807ca990440cbbe5219a933cab53fc06b59c34070372f2446f3d56408a264b7af16db6fb00f969de3a6c4b3afd6b4a3ec63e67efbb613d23a7f2f5e7d7c92f489f3c0a60af1c743e8ee6854184c5608638f687ad4f96cda3057c560a185974f6a6f38e25cc5c7afc68a08246e38789b02c34ff5cf835e172394cc8afe55f2b4d76d932afbde24bc4619a94ba7f9a646279e47d38ed23ad7ff1a726c80901eb21f93f1367d85d83426939a814253d12ee8e6a54d3297a9c010754be9b96b861dd8470d9536d114add5c28056600dc3cb250cb7c02b3d82c3c7155c5ad7f890c47e90d32c1bec961c1ff90bc68e681ee2856ac65e43eb5b01ca343757a39f077c6bec06d2a959c92289c45aefd3327151256558ae1bfcd4903d57e35cdfb16ea85f3582ffee90eca7786e60615c44c15bc3ca6e172d0beee7d2a79582579f4fefad6d105c91a2af960bbe14ce83264532a941f9715f20ac316624bf5d4b47a30ae7b7c1abdaf5d6132b905505b464f4c9f601f69f8944da07b344e86808eb6c71b42c73b3abbabf4a671aa979625997bd02e55f99ff445be80c847f734f4d97d7ba0022915635338f6c52c665070bb179f53a23a344000160746f4134fb7bf2300846279e2bb6b70601f0a3307f3a7cb3f04810b8d3a59df2eaaff4f5656f8ef1b763a68738a7fd7cd60b0b87d16cf5d253793b9c3a4379ecc027a042a9a81f09912ee3cc031868fd5f857d1ef46400e6ffd2be07d1f74bec13f3ac808b2cdb95734ac6acc4c7cbe64a1cf75d1d0fe591a013e5aa3a4337dfcae6d787ec0a7c8b21d7d9d58a12341a8683177ee61ccf8997cd7b58870c454eb1ffe67a2896039f22ef0521bfcb7543d0b49f97c42387efa5ea8a3cfac7318fbec055ca617caaa95c808a87c6e39559cec7733f903833ffc2edca900d8dfb7d847ea124b3cbf59576113b2d0a24b10fcfd33e694b5f83d7afa9ba6a9c5cffb4c07bfea0cfed670dcfd371a90365e79d3f6b15921d58 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d75663bea76b1e7e1510ac9999c6c9d5f61dcf8bb421144285318976fe89304e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3894646b74e9847965be41c30e551c89d49a729492384cf8afd190f3c571abfa2cffffffffffffffffbf312247533d481e255cc414e1775b08190b66665d5fc4c30911db52f8d34621b148915a5707631d66bdf76184d3a8666bf5cbf1a625ca182bc4f433802cd06140e33aa300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c094f6a4557dc3674921a1c976eec678f55ce95562ff26c0f27878e51ad384e884bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f9736181d26b9ddeb0e0af146b230e46fe0cf1935bb4f6fcb0ac8950c8044ff200d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33eb550f59d801e75b3ac57e664fa077b4a8e7109b161b3f2e6544b48b67a71b07ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c8a42b61c5fb5bf547de78d61eee73ff5d2cae1b087b2789bbca00143163c439863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a01da1a3adce71daa3fdc932c57a3337a8b134ba66ed8155777b4d4293ed6ac85700e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0d9e14289bd992fd17ced6b285eede50b287a19db6da306b2c54b7c96731b5f8b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a46b1cef1ac3d36120138aa519b3541f6d0888acee4b6655f2893e5f780eb8395903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ea149e40a5873d6e6517c8ebdf012af6f01b1cc16e843c0b400d592d7d1a0b9cb00f00300000000000095c67ca18f28ae206c8aaf4808f3900abd0eeade2edffb4fa19f3ed0f7375248750a7a669b1f59b1c59fac2efed2b757a94055e179c178abf75dc997761b991a189b91c999798d17c8668c89ef75b8b00716db9789eef4cc1b17e732e286a1b582d664cd112755530039e00b7f9bcbf9c170bd5d029b58ed3cac078e0704f1467e9307039fdde7a9bd8a8babc15f2c24ae5c28a03baf7028c6842639d520f7dda08cbbb26c9b73dfcbc86d473be9feacff873a6f1827aaee38df47ebd5997e4eb2ccc6e56e8619786ebca724883d7241a9f717dc0192815ef388537bcbd33bb78d1d1dcf46d3bb461133f117806eba1f8355b9e4de2d15399088282ee49934663b50183d90224006edaf04abb36986e2e59dbc34b3480a07e8186660862bcad0a729082d9224291c40b9106d935314fb70adac401a43faca675324d8786315b91d66216983b5669d7f692c695fc54c88b913ba7aacfa2ded72c3c4877658858f404628e679f1f2a1864cd183c47c68d614b1d71e520989b691c0bc9afc34774b98d6d6740e2c48be9993e70f8e3ee0c4d75ac71dd396e639cba40b211087481b67861d191b3ed61780b53a05b92a5257b5c91a4c70da3e5ce62c5db0f74e70d6de4a5cd2b995d0c6db2f2cf95c70f1f37bf414f548f3dde60af1ccf081380baca371fe1dc9f41724b5085ff9002a7e3d6a327e26c275927d18fdcfb032e59811e8a46125e14bb2c464be62c9746a86729a7d58b192cea07b1785e84a780df9e69f65b5ca38efddee7df6aaf685049433ef2772a26bf9cf851871cd33460fb9e0e3aebbc1cdd60be3ce1d6eeca033594d7717fe4fbc791c08ac83ee58ef54df82edfc4789aac896bf48bc7245fab16b42e08a732d7940413c7b5fafd76447bcd786a974c8ac67977b9aa03e1488f9860f8a6e65250de01c6f4b1688784ceee80a45d1817396f17a7a441dbadef61f996d263e85e0b119b2bec5f87f9c6ab90b42f39f7954158e507f5a8691500a003552134776b813f0cfffab1e80dd0ad1cfa5f39ff1984b6169976e12bf8e53e03746291ec14282ffb025e34ceb7d8bbd69efa0c8462cf5c00da445c84f393b8c516bdba1137c027c2e5a5cff6cb048bb61c30c4e8c169bd9f3488af7449153b2312397469a885708755e851978039b48a21ebe568f2ab930fb3b7541e1b04f285339380995eee4571596f22a211860882bddc3d55a3d23d61e1a95cfd12639ca490ebbbe6c8927bd9c8a9bdf83f76fa80d6ceac28bc37668c6a1a4a5dd9fe1433118faed7a4afde85e72f8a68db24261fcf0cdee8c130cc29a01ba1d30f9fd7581328e13420f2ca653045992d4abf65f449093ea6b80dcb8d503e7cb2fdfdae2fb31511cd7a144b710241698422ea8fef22c0e2e9feaed4c3ff2242fdb73a0a0cb17 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001764abdd11b36f7540b14be124cd8b7730d214dcc8f197b75dcedc76008d593b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38c10908be9660362c96172cc4e9c60d5c2dcb23051baae164a0d3e9f2673d65c6ffffffffffffffffbf312247533d481e255cc41428a0a316b2cf5a0c69e7c17d827db68fa7f94bec807d23fa00d6ea226ff36afae42f1aefa39a24ccee3bedee5b607eaa7cf56368f6a10a0d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c240ee3d21e1541a3f59fd4d27e7545b07ff64bf5cd060de6dd5d333912b7744b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114ab4643f91c16cb35fdec228bdea403139706f44c63cd117837a2602cc76514700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33097ba2377b422c81f8781cde78ab2be079630acd1f77af638036e0466e9994c5ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085695de3b68723555ac47b78c207d90bbdad2a69c6f70607daaad74e0720114f5ab7863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a00a03336d59f37b6bd6aa673f9fbee3a69535442632effd803641aeffdbc3cab000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0190efa3f118197a03368f9c1ca6609501856fb9f4ef9b989b144e7f3033cb70900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4b96151ce5f9d15155096f6a1379dc9df63eb15fcd251861b8ef8db4335da1d2b03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee8118e8e565dd9f8047e8131f23edd5378c30289c950d64e41fdee634c57a49c00f003000000000000b6c94ab778525d6e9ebaa52324dc77f9bdc6ce33b0fce05d1ab17aa807020779858147f20772c389bbf915f4142b3694822b2234d0519c6415a15e0c4522543f4d1f1e6d0e8e2dbf4fbee7f92330a2c8d0ac5d659290816a16bb9bcf5f48899d87e124195b938c68edd64e305335c78a8eda9e6577ed446e001dc677d39aedb030620eba9ef4e3714de000b09fe28fb2aeabf914c57b8a7f92bb238df3613ba50621d4954b259ffa5a3f1671969f051ccf7653157c4fffbe3422a4510c2e50e5911b67b13305611a9fcc193f93e411ab93478edd2bd46b11883421396158d42ce53da3e53faea88b14cbe3f668b83ca89343f646e55a342516861808d39dc5af6d070ddc43ca11de73eea310ff0900d8a9af0fc11c1356488fb9cfa9f4d27da2920150240b1b0ac5fedc7317f5950806d709465edbe3fa68ded4d297dec4783b1cb61280d2383aecd7ed8d63d9857025a1f3c812431d905fd14861f6d0623d0a79f57104dab4c40d507e554f9f242526fa0a9cef1a3110c618a26855109f1981b42678b3ceab2c64d301432d6acef3f5f75d6a226af3a5cabcf34c329fa99431bb7e4adfae3839b694117b50305e0f02b105ae3073468beda191c1ddca07770be9c3fe4abc729fb0ddd1885c4ad1b5f8021e3584f292457515ad75f2e00ee0f0959c88afb01cee4c90eba6d97f7aa940a7f11b7d21c556aa0545e86049f92484cb900ed1431c97168ccbd050dbf639e3cb6b8453001151f93f35a33de4af0a0330326e8004a4867d11b622ed3f9f164d853d6bfe7997852d2e8b644d9f44c4e4b21fb820bd9a710be970ab3d7101826bcda683edcf2d8acca313f6895f57d47ed1d8471b13c95ae68e42ecabdd89c945e2d879c0e39e3f28540932311cd8511707b7cdf9d07cb7c69dc0340d6cf3c82a8c1978d3389500784aae81d3cafae4e73791dea9d1c32bfd5d8ee1ad1a861527ca5f0c8e73dfb874aa71dc56ace0cb5e51644e9451f1e124f5e5772380dd2d6bd1b0b00aff2b213f4b8405a0eef9d6788429808441f2ef3dcc3429620d65e40bd92c95197d43b63aa1d44f6fd9ae72b5f814a553766151eabbfed3b132c31148eef6ad036a892b642d9aecc3557fa7f3290bbd8767ae6c1a888f213fb6baa53cef164930743392c648a0f0c0ea6adab288563256c51e51f97904d84af20d5e07d01d81c870afec8953334759f6a3e0f0fa558d14d08a78e9c10c12604c676673ae517252d010bc8a36ee6fb7a761d1ee132adcf281662bab2e11cabf7dc8df2dce970ab05ba93d612f1e380fb81125711f30345f793edda8de5e9677f29b420d5f2cda1f0f0d7a078bd81e9d6065e79ab79ce8c13ed0e1c16ca759d3457ef85110ecb109c02de75aad7e8e4986a3e425a56ca642a6e70fa6c34b88849b432153 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000003f355820b6188b7ccffd6b6a21edb3768a3cccfd178386783973e23d5a6ecf4001e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc383a999bdb421a148ffee3fc9bfc80af683bc8fe825c1a00496709edc7fa549520ffffffffffffffffbf312247533d481e255cc4143594064d71ed7cc896247274363164af41d681c5fbb68d698beef2848f9302f7fe6e6181a6047f9e78fdbead19e4240783807c7deda167da00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0ba935e8d0c59956d8de6c4d4bc3f239c99eab19ae936192de8886d69f4d28a84bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a5fa3f39cfc2c245afe2a295ed415c846adcbeca77ee1f6981f1f1fb90bfc12e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33fbe9c7c137aa5db5123ca2882de19a50b529a1a69b8a439c4d8bf524a052f820ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569e774f9a1f74616e3f8a83e63b869c995942cbdefde0fb0a302d470e825195518863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0e875f79ecb15e2c4aa5ae1716c9a1f044d0c4ddf386b7590bc415f3c19746a4300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b076513622bbd98c96d5c313c57397eb4309d897e290a7a73814364c10530687c000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4386d0d19883c9395d653e392251d14eda4f771eea5c98412ad9774e88dbf071b03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee44c62dd17906ae1b5c34e6b933fd68690fcc8ec6237a70fc5cf184e27e5ec9c00f00300000000000086945607d07f0eb410dfa3ac9f684783bcd19440b6f53eafb57cd49eba5aebde3aee463b9a9eb6b9f3fb8c6d9debc21ea5bbbbf91e5666d888f2fcbd5ed2b4aeff9ab36fa980c8b1274b31de4096a42947701cdac49f720ada9e4419cab78db4a1897a003e57cd58a38055a13305a1d4fdad4b20517d21c185a8a4baf0a76656168b4bd12ed78e8b3b75977c41b054ba953ea1ab4af7a0209691f0fb4703df18a832aa02d36af9eef20f4f7da13114127b3a2fac0b5843c53f630cce3f893d59a4c0c36868d3d36a70b68d4cc7f72cd00c484629df9f1f9ca21017482d29ae39fe07cb8ebcc0742cbcb660a1acdd05758ad7b379a57973f90f52ad937c32f475d1545e93e6d93f9aa0106f1bc7332c92fe7a177aad7d38da261e2e8c0bcb38f6af252cffcce9a31f606917d3c414959a99c8a6b76aadb94cbaf857460a8721a70c371b4a0b09e569433f2d4df8ef5b978eb100151bcca04841e8506e50d51caa5b9acc8b280853bcf8037eecd248d296dafc28670c7bd3e171e4087d5a877f8cb13029305f0b6f8819e1eaf065c6127f2b5b3ad9101d66e082b130f901ac25efe987cc8473817bc13374cc7cf03b623b915be2a5d352f53c1d213882e42cd3b1063d683c774eab48d38c4c9093313f18be7fb438e8599c7ff2feb1131829e72792e6cfcc8dae6cdcdda914cd871192cf3c02d62768d67aac73f2df6a3b0b9ce7e4d853fe03761a27fb6b9abcdcbfc71c5c40fefaee4087f6f4a20da735463e84165964801b592691b70b572999441c538a5c8d5062d60b40b417b42e845dd71c8f0a3d1c7803132ef8f9b2ee9c7fa71e4a79863d3372231bb228162934eee275706587ff34cf7c6fddc78e230d70f1126dac88a1aff5032e068808d3f6f5ffccdc5b55170eb7d8399d1fc2c8d897426f0da776cd176db13d034f26ff9114544a5c01b8916569ef8b31dfa314c52f560e8187f85a2eba0bca3ff9c1f5d42c0bd348b138ee826ecd9cffc88592135bc85d4d29518af15c1f05da2d2190653031101d7016d49e35e71c67cdde8d482b454a6f478ff40d99ebe0f1f22b3e477d18afe2ca6e7e16b52d158561b19c89bc13003f96971b01cb1a458e8b42b086859c80cb9d5586813d3b83797ad716d5b7284d295e00ebbba0ea83fef11350936201d58e4fa2b816500be969886959b8e7cf6d781554c996fa54302d35559ac8d18d8f9b670c42067a3d8ba23c7b2acd119b03e87a93c126817929f6a29d2d7aeb286536e522fad61f388950825b10b65ec94ae5296c25bfc38bc3a555769950eabef0e945e1b3d189fe35b6aa13b0c6053a15f6ed045499f528053bcc404c3cc72d1b78dd8835bf45a9143f8d3b4eda44f52b949fb41271dd29c0581d970c919e9b1e954e84625a6f6ae7e527b072cf687429 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000777bf6bd5a0d753482329e62f96aa42c5fc96bf874ad6d1b54952fb21f48565901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38858003a03c0f6fcc7af42a3783e1d4072b50498e8b2e814bd1f33b8783401683ffffffffffffffffbf312247533d481e255cc414c38d94bdcb084b09400a64173e68ef57ad91190339134dc646e94d6e5d862dcb22bab9e2b23da7f92cb9797ae0bfaed916846214faf6af9e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c25e545e238d3a130cfd8dd41a6648805abf5c0a15cdaef87a86d1d5afcc1c0ce4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611bf13004174d690c8414ffc58bad0e0361bd3fd101ce7a18630ef13272d2bd5cc00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e335de287c026694644ffc1c2a0ca1105329157a6a646d9468601c27deda847902affffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856969a6cf1c1bea3415a5709c375f4ced152214783aefb6c819e62105378ad3cc92863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a03c6e262cf6d934f5219751ba6e619338c1b4386471e450423b871d8933653dee00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01753953ef44c43d35ee2f6d99785108e18b875b52df3e2b1b32903a323fecd7300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a450feccf26b526698d47c5d6bb64ff3ade6bef4c644b7f0c339159487b176f42a03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e0c8ed994c0b0b771b389cd3fd3ba81a1ec88d81a041cf213bc182260336cf85a00f003000000000000b7afad45750721b89d166a24134bea4102f4f618247493cc59d76e09b471dfab025b1ef4830956e8674e982b49d2baa6aac64a96c18bf8af626cda4bebdef5fc66135af0c58f7c3b3cb1452353f0132a90d76f0b8d047590139d381dcb4cc30ab9b8bdabbd6448dd9291f1b3c4f22adbcaa7ce79fae817b7bac16b975a5166e0c78b51aa99084de37dc3463088291409acb1f440cc80c53e80e1a0e62fe6d67c4bf6ef57c1d8b47dfdc755c3119760882b227fa918c7298d22e4d5e1c8a9d4438bb8a852331d58c8622d01ff9f70fd3199859c3be24a79c9bcec09fc47f7c98fb29e432cca69c97b8575aa3f6d2cebfb8629f21bcb5aa43ff8ce79a90a19eb501f75b20ef8a50ac9b7216fb5c45a473cfe602822af100e099df33c37a08e2a42a385b467d6de044e32ca1103d6f437a2494712b1038f86aced66985e0f6c09d71d460969f2abfdad232d950df738251f860eb5c10f44e245102ad692196f7645556c5e6e7e518578fc2d60bd58a27282a4591ef857a232fe86cdc119ebde64a699a337540f02aa6377bc3c8bb88149e21dfdd9ffe158b8148715232143d8442541d474ffa4541fc4a03ddb59ec4c7fa89574332315370f003e79915399d5a0c752d3ed017242eb51c9e530135172839bc48a4247e2cf3b2d5ef8dc9a173846c4a4a9f1e2315cbc45070fe3389401eac2b45d1cfcae0abdaf05925862d3cb37f48eca754651e08699b27aec6a906cec6b85a1da40a3f59df4e5a6e787ac4c143e64ef860c4f54c86bb21ff37fff875e31814c550cb27939ec14a495b81a42067d3469303d4d2cda5278a8aafd45cd800dc6fd201c8b1ce530be49624ef29bae7bfed677de3d311f21695aa4e30fefaf364410a658f60f292b9b7d3ac9d0a45c789d4c5c3e2a113dccbc8dc9c2daa1873fdf6277c5848a734bb3cc3ad77f9ffb60cde52642074ccec2bc56994f893d930eef24819a8bd232a1f26303fde2e2c2d5c50e8012068fd4f36728b66cfa3629237bd7142d6d80509fd19f61f281975d037c0c4b1d90dd1620501f05d017c82147194c7a2bd45e9dfb05fab27032aafc8b9b78b4aed52dfeb7ebe29bd3e889cc2e3f56ea26d2985a3346e61df38688b25ee78d13d95aadefe8097450053f806f61d42e251e36fe51658764f97753ee551a1c834d1b4a9a14b4d6da4233822ea75961fe9d74001c89b44ac869cb21fb04b292bc8f245a6adf31801410463e36f858ae01bb84667e6850f368b68e99984aca5624046785a25cf26f2e6975764cbf69760e9510b5006942646e55ffb4dad8c3d06662f26c1eb0c05106738574c67e3ed4ba7db12915cb403e0e494ab3d13be25296b301a941315204e2638e430eec640426fac02d5a8486c48289e9069916675f135535ba4cf214ada56ee44aab6d43 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009293825aed0aec26bd6a16f2fe7332508d8667bae4db9079e2cf9268481c6c6e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38873f46c64615f2bb3b9d3dbc7863e09c6a99a0d845dbfd3bc62e5261b9e409b2ffffffffffffffffbf312247533d481e255cc414d6193cc9815592cd99b35d258356829218c3d4812c35af9efe17fd265c6807d55fe5da39857b4074de002202a29ee781e9d6d6ffb2dd036000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb6ba16696eedaa9399a695adecc8fb6090308948d6f6635596b970d1073c60224bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b137d3eda190afa866e816a38131390c16cf478c0b7c217d73a224b153461db900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33d9f864b809b2b0293195b7051c1e5db6b1865b51607e830a28975c1100eb495effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569fd83ace2c34ba8cb09795a1be426c9c7d609ab907c9a2bb4a2028ae2956c68f2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a04bf3f153c64c94769c92581637fd32c2238e0d222a4c1a74dddd1aaa7b6c63e000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0b1ea8bc6f06574b5b3326522ea7b531955663a42321a5d0dc8583b4b4ef97d9900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a46b9429a6e456fe1a4bb4c0e10fbe154faf798614b3672d542d0360f2a43d983603c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e6464d41df2b5902163e50a0c54aae8156b03bacd0481b118cc5eae2e730a4cd500f003000000000000ae5bc9acaeeb6df98dd1854b19a92a2d313a336305584216f128bc099e1bf441b7860d2ae01f12509eed257e0807632bb618968e41748037cfd15968ec3e7c6c10d61469adc5c9ad764f138aa431852b4a84e1a5eb83f7abf95138b933812a828ad645a5173d850d646346e393356be9d299063744e66b3c2e20b8d4046c47ee1a9dea950e9701545b7147db10af641cb3316a375c7d88776eb2e7bf210d0376a1273ae350e36939677ab5f3cc97854cb42a51ef4926de03a3267b6fa81132749275a684b3e3bc9d75be5d09dddd9319f1a831ce7d57dbee46012d073d17d65b4e7caa86edac24abc245f04d15f86e9c8369162fd24dae00150dd895ceb0027db6123715ad09d3b6fe81a6840c73f6d0730bc666622ade93700559cf6c81b26ea7b9dbd20437a2c6cd7f2028cec471148d97b931e8600d9b6aaf424f0f8d7bd4524510b33aa0fb3443b94de822dd94a993f112c9e57e6cc5c7dc8c581aedaf7132b6387328a914caca1530300923a1c7cebd6716511c205beb5a8b718eb1db8db9cc076a2765ac0f300ad8a50caeaeed147168df8a7878003d226bb20de2b20c8bb5b8f6ddf35bcb93044d082259b24c867864d0131debf07315d1d2a2991a07c6f7790d2fad144604bce8c49fb400d855d25c6d5ab7ca34e3c6fef43de3402188f421cba2b6690b8391f12734b5423634193eea3eca3c8120496ecc3cb453cdb52252285a78b25ce9ec4c278fffa87780205ce45f626989c35af828e4e88f273660dece9aa7da636aad294ae086e032466f256968e8eb90c88425bb0604d0c638bd1ddb90a44c33abd2823c0f9f3c201b66f6cb81acc93395a1137d2c6ab1bfbd691aa7f2e44724a4a3d3c82802e66de4ea1184d18f7157955e918ba6f91bc9c0904c6417feae328a4b8883d5e6d63a5c56fd8be07a1edd40fd99475acd3dd1bfc8a391aee9ba1203bf9e4eacb1326f5dcbaee46bbac48fc42dd128f248b8b956348bae363d2d4c02745483717a1b0702f7bf83969e82bcc9cc458a4ec911450ac3905eeba263506818c273352ec22a6218e789322dd25f846bbed17ec100c07e9a86bc04acd178ddf3cac5b3b0a3204962f5fba6a95b8a594bf4e379e10b83c2e673c4b73edd5a33cff459f264094b3d6ed3a6b70af4b42dfa3a0b650965994ab30455cb95a08b68dd87edaed1e8664367271a412a0d23a3df1a8c0e353aa3d6bc0dd130bfbb6d92a8dfcb3723cc1bfd62397b515835445fa8cc65b93f52b1279c1e066b2ed10446f79240b485676e85884583577491d95fe53b801cb9b14160ad5f404dfa1e32d6e1dfec65c7604f1e2653d9afc4b95f295882df1ecaf0db0adf1e43b07440d1ce34bc306920122331504c70cafaaab7adddd291e37e4d064162d01ca486fdfe397e565b271d8822 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000545bcfa49b3aa8d21817f6415dccf4f000bb255026fa31b7820529257d914d3501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3809219a576f976dd5cd3ce01c85a35f6425c35fb982b945439641dff5cf41f713ffffffffffffffffbf312247533d481e255cc41425aef5eac65dfd958877f5e75e0054a4948746570146672988fae8c127d46dcc8202b3a5695078ea8ccd8683bf957a388aaed0b36d1ed32800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4ccab76c8682d05ed154e1a87a38480ebc9e6896d8acd0f9b7ad16d257b711804bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086112b221ca682e200572e88ee7068cfa33a1ac891a6d6751404de97363fa102013800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e331bd49bfcb922f2cebaad702f50ad50de06fdc5b80fa467f15a3ead4cd725b828ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569a4b712f9884792e7b23d3875a5dfda6797534b39d6ec9cfb24aab7fdbf0448a5863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0fbf2c9e9958b3fb38d60af32782157fcbee3b895dd3d08b6ddddb7b3609cf08300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0cdbd32e6370700d06b7b983bce35eb48a12b1b75f62d2cf0930f55a3a8a974e300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4fc14bb8002124f2b92142ea5a3c1201ec74737509d2333f1948afc2bf329881103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54efb881ef4473f31f28407aa0443d103e9d07a03cf53a4d31f6fb57dea843e9d0300f0030000000000008d8d840473694746d457b0863755f92a79aa2382496b97583a0b15bba8ba05a09ad21dcd1f1692076de88c56a677afc0a6df7039def9f062551c2788c97b242214d2a6139ecfbd53b2d9e8b5bed744c31e2b5b1a6895264786fce7488453cd9c8ccc709fd93d2e464bb80caab354053e2fc62962c8e08f41191a6e6e99bd7b7d0f5d5c490cf37988d66605e9e909d242a622e515067ee6821aafb828ce5d913f4bc4d6d0bdf83c4005535acde43e2a3ad92eb7fb7dee88f20d80e210584ffeb8b8211f93ff23de4201cbe5dd70d69dbe44b06bd800a8919df87399aa989b344666725de5c52cc09e52fbe71908db01c4b588389e5851a9a48aca7169a3932c4b86f1e629456601fd9382e1c333872bd24b42a92141f6d9b1ad3ea20434874e5395ae49b7462e09764d30f00f934254029b72210a38147b3dc04e9b69ed3f01150dfc04d6921e04d8adf238c3a2f1b9adaefcc66023c1e0b28f85c71199edbd9f752d5e5205ac7f4299472381015cfaa91dbd34e5f078b665e24ac77b1c701288abaa0005a7605ea34be789e1c8142b868979c433bbc6ed5967293a1600b523477d94011509e7ba5c942a88bf13882afe81f75e56cdd76247fe99fe433350664ff98c3f969533d51679edc954dd889f463f878f2db36dbb2ca2a1742f14a6ce89a301aa2a6019fd44246ade2d6137f97dd74064003b062db897638b9b54a42374e373c6961d90ff93a6fecbfd8dfff635fc3daabada69b67b817380f0ac76f32efff1e7cc8dc43827e9a4376f8ea9491aef27d2b43c1f25c3c96af01fd19b6ea31c3ad4f902fa6c95ab3441430c4ac708f8db30816bbee1a9a66e150a42768a714be18998b8d07b963d31c54e13e54e006e0ad8006ce9c5a51d571e4896e5264a5636b92f026ae3c90d26c0d90de3524021c5f91d2b930dc663d947bb67cebec14b35e0dd9ea98a48849ba4524314c6362b12718406adb5228253aacabf1f32e57e03c8c9c5f166fa1c9176097afa5814a8c8b6bd1d8c0279d46597b66d1a52f8a4f0491a25c56544753283413993d144577625ee2d342c749f9aa7f4f6c151385d0a93df22b9e661abdb48f86deb973daaf0d7a75a867bd91a005ac7e578effb675f0b05b65b288370b36106279df53a8ce8b9dcc4e6942a846b1f6363a3a5fa569ed8fa596e07b258ea5304931db52997935b21a4aa83a16c461feab0df654a1531fc8e00125752e9f19289e4cb8425b731e4572a36e29be453e4a796f4699ddf4c1a84f3ffabe7fc4bd80954cb4d631f248c5549f79d3b1f5f2c155280e269993d46d7f6e40f5ef06b641d791ef86ca922efca07868e21a6d944437c5a691498fe91b665747f01a03fac2029a392252634018b3d678178e6b1b2c3acfcd36af3ff30999b5a3acd0ef3d7c072f87d21 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000000bed6f8c9740e30c70ff327166805970171e31f6b7c1c279d0bc25450e1baf5b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc384dcbeb1ef4383e0f78abd217db9cc6ce665033f6c04dbe27fdb06be7e63ae5e1ffffffffffffffffbf312247533d481e255cc414741d8726de8bd9954ad581b16b6e492d98b068677780e8ec6699575e2c75d36f8da109434b5f76fa718118834468a07b29febcbaac11c5b000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608caa73ee65e46d897881a9874ee7423f7cb20c860880706c3023832f518db56d424bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116feb9e6d7c74d4aacf8cfd60d7775b7edbcd779581992b829b40ec0f53921e9400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33e6e9639873f7222699a7c3ad5ded57813100ebc5ce951442535f0fe814b0a49affffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856908906e483fa2d1725df3a7732f3727ee4d4217223ee8d0bd88e3e82a2281f9d2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0fb485886cecdda09fcf5fe09cf27617d1300f6afa26f036d6b2db181334bbe0e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0d3902d2e92a494e59008960316a1487478f21638c0155e9ff9e638d33270ab9f00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a474a03992ce2f4876beb86d220fe3b9317896b414e6cb548bbb3d20dfc75f1fcb03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ed647d4d6b30e919349ceb5dbf5dbe25247f7119fe82fd58bce1be80698f7c06000f003000000000000b6b38959bc36c2d2cfd56173430ce1f998e419adf8bfb0045f4929e9f53f7e5cb933115e925e41421a74984a08f8b84db2b6b6d9d98d091dd6a068424d27804ee4bf69fa71e16284a2b710701dc84ae4d6194276d0786e70b1e2e8cf62d30a658230e67c8c2de934727dfad0a2ddcc90c52719d3fd3513f013a60b8e66a6a7b94f5f84d3b4d2151e584b63838a7e56938948af5912067e9f13d06ddb61e6d940562f54746e7f49633487c462aaa1dd3271a1e6b7618238fb7d202eef9b1b78bdb5d5e478b39f362bfa66e47c0709ceeecf4bad46d3d0d52076f461f0398fc10c9e2032846ab0bc868c88a99b3f70f8c2a419b366f810ccecc51b5c6d6aa65566557b194e7b833560ce3825b5c9b6d3296a01199832e6a24ee8964a96d7219f2f896d854b686bb6b6b3c67d43e40561d41f2e8b5b2347c3e6436a8016c47109991690d105f302142e1e6d9e2f568e19ad8f749f431be194db3b92bfcb9819fb74743fa1096f2ba4e64c0774a1629d6c1e0f16e1e68e77e69f93ad72cc95ed5447a2fc8822b0df6da0333680cb6f7d4b2d9dc8aca04882767f678e1d5967f14a9eea4369700f9177185e251f054d6fe369af9ec44239d844ece4d03fde65382d53e86c0c019f63da74991f3e91d6bf00f3c68933bd7893a4d34b0e5738010e627294fa0df4f92e48a39ca1bceafd4ef96958fec5bdc89c91c9e2b22658892426341d4ba7aa1055a8f7164b2cc5f28b9a9925c601c51440d0e06dba0983d4fc45049da2d7f8e63f76ab29166cf2ca4273237dc5d51eeb3cb47778471dafb6a99befe00d3fa90ae5f096ab6ca7c1d7da12310d754b8dc59e4f65a6a377f477da0b1db6b4100fc84c6bcc53b10533123399624a82c11531cc7b44da1a2542b00f92acbfce31867fcac2a64dbd75f16129cd1d52eebbd4e5494f9b362e53e374306d81d049c5c68c0e50e891e4e1ca4a2e9908c6adf6a91a319a3857af8ce0de37140e6572857c0ddfdef472623dfa722f5e54b01e99ef6b6965249cae6e0eacc0ad90d6a9a29a0a35ee20d1e8d18c10187649b0ba76984a09e4f892fb0361d30ec53c31ff262311d3862a2d864131adca3d339dfb2a4b7feafb5aeacf0ea23a705bd8321e44a924258aa683f0c718081e376a9838f8bd15d91c326b1de9d777734a291d976e35956d84d8adfac9bf985a287175b4515fadee9317af52392f25d94e43a4f2fef8eead6b77f8ffd9c05ad2a801525489d1e2b90eb53ba712dec65d4bc6c0990378290325149f66027f7e0cff645c6e3b1074186c7e208541a4146893097fbeda5c55289dc13d3f6b33986d0600be577873d374b95dd9f94517b84c871af8791c2ac20e7421fac0cb0c802bb43b2249bdcc76dc7491191219b2b3cf0366971092550e4a6189c3c8a9a57bce2b3e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007b750de2b20ca958474889d0e91e5e53703c2f3f7dd11294d3da04e11fae9c7201e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc383c707fc4542e7265f03b5b04801096df59bbc3e308936ed1842b005892d6988bffffffffffffffffbf312247533d481e255cc414cbf74f2f807a9ab10b50a4c63a993f5c74005572f319a34eec7850bec2867429a12ee8e176ce2f25be6ff4eb5f332124e7f83d5f4f7e5dc600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5b82905acb4aa38521e153811d362a8318d91bd5e57c6b5d5bef68246fa332974bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114d2079e62642ef5d7f524dc97f1c871450f56283268a48ebad612624ac42ef2300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e338846c2168f12033dc04c61331c485747faad8dad439b2d1df669fbc32938aad5ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085694351416ab8e011053d7b067f9a9df747cca408bdeec3429edd70b96b1b022729863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a064e1ec0e38c558bfc70e40df44c1ffe0632b6dc8dec3d2371cb228f1a1fe2b3000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b09a6ccf0360395f8f3ef6160e56ebebb14953dc6c2091a5cf23292c55a11102ad00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a480a04fcebe99db43f73aa71211aed55ce1992ca3ccdaebf635d5ed05074063e703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e51af920316537db93a6c9582cbe826298a499b29b09b8de06d02ba4b8260190a00f003000000000000b186a5a4727949ba437b10c4f0f170af4130b500a40b679986a527ef55cd7f47fab507759237b7e131bb0919925858c48b2298b60f067885a2af2d5d37ba5c5cd779064ecc65b0f7edd9c5ec9446074a14bc1e822134d04d5d0aa183550d59808550974b7cf6bdd2a77fd41d4dbd5926c50b678e06ab87d0da60760ae9af6a9d3cf90af60da9205f197942796eab5c27b577c89dbd047a14ed7fcb64f85a106418f58806c09a6c7374726733895a00868fd28f726c9297ae5e54bdae40224ebcb6721e2186a54c66f3a149b4950c16a47c75c530d90fb5993be98950c469fdcb4700f7459c583d12d7c6bc666f0a5a28a930473eaa3d21141b64dfe855e01e4d11b7bca29c0e9a8130d578919df5ac5d640ffca6338fa4740183635f888f6cf18a9f1211535ba9badbf4676f7804d424a5e84e8eb3baf52fb27f930db2068e3a32f5b0a2802cb01155e63c67ee0bd4a880af6d82f249e0fef009b208c5b2eac1b22a8330d14f84531aa09e9493d42d887caadb7a7a0a228bb6ef8118946da073803558f9bc25f2912ececb281e683e71b6946f92e17cc36f09b91ba00d9a625b5964f68014bd40683d92776a1097d287a0af542ce3c55b13a86b0e3e80c35b038b3d20cd83ba8a0fa0b44cff0fc24539d714b3696696f00e19ee5bcdfd9dd4faa7d8ac51c2e0a9bccb92c2349059f45c269803291d87b48f5e46a5d0e70bcb650e23c20a7a3197601f486c235ae5890202fc599aba2538ae030aea42393bfd74d379ff5659be9d2772fa3c1424c88167165e727d8df475880e1d604fa27990091d4aed7daf95c8165beab067fafff00779af279b8c655c44d58f4bb841b1806a6a685a7f371bc433ccf64b2e799e7243e22ce98f06e2bdcc699f56884acb6ed1371472ae4f7daf9fadbdb01ed3baa50d7b495f1a0e5876ed52bbb7051f93782eefde90b552f1d97cb5436e497fd66a5752e9fb532a28b95ada00ba63601d00675aec107b20aee8cf38cb6f82faff352a39460f2e7431d35e8a94c3643ac50fe7653632cdec28c37ffccfc046352102192cf904d2f293e590c8b3b4e5680684b9101431af3de1d612ef7d4c79f9c5203e2b121060bad9894b12d82d5c684e560619894fcb95c108a2a98151b2c17f1428783327606ed414c67f511a656cb4d27d7daee37daadd81a4c4147196af0fc8246d2ce32aeb2a4f5b6527c5789504ed88fcb7065f6db63a18bb5b16a03771ef18f9e63861b8fca73010bc19d35987bcf60256ffc62b73916b8f2b8a7ee77c7d3dd7d4f8ae16ae85816f86735d58fa4b528e96af227eb24be922715f880864aa69beaf2621e2d61d1f6f5f160bed84ab4ae6b4891b0e36aa885376accbe191f72c02b59cdea46f1a1f0c4f4467e32286e5e9ec112575a24b19b6426811dbd0064e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000009a2581e011132844ca1f0b1070c7a0c0fbce2a032cf607489d5fd8b654d824601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc384e4cf8a8d6b400a8517bd0b03b47912ec6f0affea5b171b283ddd438ceb15ed0ffffffffffffffffbf312247533d481e255cc4145e228d500ff81f388520765c875d05d48622e32284f065f977fed74c7584f7917f195cb3cac730d489c04c38cd7efa2047957908bc5285d900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c25cc44f16d6704af93d061b6501d1a97c57608c6dd9489f531cdfb301a3468244bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861174b9090845f30468bc835a8cec493eada433d2975b02ed0461d262737b91f7a300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33d7348cf4ccbd9d6c332c3dd9ffab277b00a3a960eb72638a48662cb579c0613dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c233d338a48da0216dbb7129eecb0df71f79b1845f95b556b31a188210b76b6f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0417970f6183dfb77caa008c0825c56186dbc101987aa82b1ce80da56e5b960de00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b04feab436d595a7a3462c9edec0b46002e2bb0285650cc9929bb90ff29e1cacaf00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4aa1e519ecd7dd1e53305acfc1910e7a39c5e59a316a5caa6cc78de86b28241c703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ed8a8f4a0073d11fb6fb45df61d48f1dd4d507f3eaedff633fab125ae7f18e9c400f003000000000000b464dd2d294ff033c81d516e72353e96a04b3628d35739f4f3676aa7d354de7a7abd3ee1ad689f3c2611c5dc69e2d229ae3533c4ec2a1bbd66d6344b6f8870fc707ca1e041845d3ad4edfd33992c6222e63e30abf4af17f12d1d3016831b92a7a6539537dced2b2fc41f744759470ba1ce17425dc27cc609daf119a9ffafe5306bec596066fdc2d546e3f4af0fb34739a3530e49df09784be3da3f7e6c339d4a987b9b1e3ae2e9cf28a5f6f5c65c4c42cd3ffe8d0218ac21384d590b0cfc1d4db033d2ec0ed09d551097600b4c6d6d7f154339fb52d84ced228b114da71b5621fd7627e7cb281d04b3178c6735401465b4d613727b7f69481db13a0f1056801f11d4d0c30136e692da2ca051aea1d6876d4b927bd73af9796d071d76afa630a5a7273c4bbd2d2fd9b1e550082cb1e7ca53dfc89605975c922999d4e13224ddc0c1c3ddaea5f77df860f092d71476cee3a04523df8be50abdb5ccc864173cf5713508312f698a52bec64a693a9bc182e7098993de176927191740471b51ce725c986ab48c088905c53cd0d4c672a9386c115e21ef17b7d80e0ea07f24f568d2aca2c71d1fe637fdb47308f83ba3f63fc9ad9193aaea0b805622b00afd6234416b69380648cadfe621d09809620a04ba12372322b76466d0d8028aa7706cc7979291f9bf9cf0bcc079a87ec917533e54ef781310a8e66a3a8a2edbe8174eb992731f62d4c144ea5fa5ea6b7b2ebb01429dbb063620a71aeea6b884069bf3ec2da16bf313e9498a37e5132a75bd80aaf50a2860ca524a13ce28e7596ed74f97a8897cbd3afc932592255c7dd724d8f11f6b0944684b0d764d5b60e9dc8533a886a26a3933f5325b50775274338c6e5b26118bab03bf548cc3dce1f340b0fe6986f732be7885c013fc89e5b1cb88645e06100e79ef3c5fdb6bfc4fa2f3e28aa8ed6dc75de979315bc806a4d0d5ff6fc09e582b725700b78b1b8e22fdf1416cf74d712f9ef4594a0abafd14306f3c466e701888e67a0cfc190a4dafac82135d260d22f93ae3c56b00ff83513813a6dd28fa6cd76ace1427b001454d67fa7cc0b6cc067543fdd842100fe85da13065e21c6600001d5558e6fe37d3c6c3590dbd0389306d9b18b27b8b01caae7731170c01c26b21ea93b08790aa9c78449422b7d722ac2324a2c8e5b2e167063df8cd91d18201970551986264f883225a3e6185ddc121151a629c11c68af2f7aec26552e87f5558e9cfd35e533f6dd6a221530b71468493fee391522dc44eae8af4ee28659b6237d48965fd8a5f643c6b6fa008888be33c88a8d1e5819d362897f98f6daebb1045f477f46dba3f1f30c643126ecb00d8a594c6a29202ca596bc9c569a7218b671b02ada815449f06562f9bd1372f7c138a29624f2c6ade722634d2732fa65c00 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000eceeef74399a91c62525263afd3f8689981c4a4bf71efbedeaad144fb30ec61001e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38766d71302d6f561ccdf594169c2412a1d57ba38609d3633a0fca378b0f0994cbffffffffffffffffbf312247533d481e255cc414e184af613e56125ec647b3aa4bb6e8c3d8fb7b3d6e496b12d76e7f5cff2f7aec8603db4e2b47df3f6148be3d51c7aad59ecec616213e667f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c22a2b7e8bfd96c9bf95b18ea8161395cfad2372a0a2be235d3f31bca62eb44024bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611542a0384956145840235eef2c9e970439ae0841580d29a1ef945def9c2dfb06200d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3366d666059e2318a25b36824ce2ad9427c16a21d5b0ed1138f065a7de74ad2532ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085690bae763f2915819b1f9c182d42ff57425f0efe02a9b10611333d16c8003ce907863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0d91d401f8365264084ca1e60c216ec29843b224482971944f9068225b47f8a8300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b07a1f82af1a781b8940e687e5d3f7a4c491e497e14c369f260032759c8911802600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a45c327b793739d5ff182839bbd9116cc206a85c8151848b8d89dc1309b919170903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ebd2a11f626350820edc89a9295b93ed3cb6bf00a5e082b7eef34290aeeb4491d00f0030000000000008465d506890875341a6cecaaa4889044c92f67b6b3c67afbd19a977c754dc2138563655b7091726093d7bd8ad796ace9957a5870f9bf3e5065ca61c2b16f85e2deaa235792eaa33bf8a5766a5757a892eaf6ec872ab8ec2c14868bc642a5839286dae97cca220f548b151127c2345c79511713e495a0fa596aa6d598e4c7573b3a342819be7f8a4c8ee972add322c1f1a1b6ba80b8fc8bf7cbb6149e166f06a6ec3a0421089a7ee95ac96398580e107428666868bbe46279dd965485232caded957df065bad894a92e559eb684a9da51618932cb2348310a181032a0926ad1563f58e8c818fedec741fa5718dd26d90f80725db69181198699db2400792f197433b82683ef0a237d79c2919bfcb8a959883c9b4be18dfb61f34655e9ae212ca390472e95fe39aa86c5962b6cde70c394e2ac8e8a99855850d2b2eb86cb5d043e0fe3b207ef310b1cf09617159fef1e67ac3b42d63a0959303924507c1ff2f16aff8ade247f3be17b4e2c48671c184e4f3719765e86650e6d4cae1598d3282f178c418ba28ceac76c9a524876fa67c2be283bd0e9936e58e2cc501a20470531739ada2fbb509c8f3a2d01535a0897d89e8b04295986b106bd7d47a3f5928a0ad86ea071c8584b860ac8003a625f5bb9ce0060f567c48439e9357692fcb9fa27fab02d8582c0df8d296d2ae74faeec14340cceba1e2932e068b656d551973329865c94fb30a4130d596418efb068bc52da1e6a0320ee72295815fd8b60b38a8cd325bbd3da6e41b15273e0d35d1135c064760e90462b7628579edede4ca7f120cac44097492a5c4818c8e319a076c3a410d75e9430aac97e300b2a012c5cbeb6379f6c122a0e05d235676bec723c114c0286492c1ccb91cf11f6393e2f4306f66b850e32800b59b9d0fae49f9a3f0c0d229c9b9eaf82a03f49f6e4aeda220682116ee0a09501cef39fd4d0668c91aae830733873ab22ef85de1ac8de7ffa03f552e04836d2714b48ddbcf50ea2e31385242b67b659473dacb635d94ff83e34b44cfc90350b706c9ac85bd94615df9cc2184263e116572a0e404afe84a979c2ca96efff6da4e6930c45326ed2d29f8c870ec8cd924c8fd14a5a4353b0d883b762024e1031be249e18c0458b510c29bbe04b09d30b242d9d4f9116cc8a6dc55c500f664dde8198e700ff4fb2c2d8fca65d192b14dfd9716ca891dfcfadfae62e199fc9fc0c4cac2ab7f64c309f6e98e5af69f498c52ce79d75da252173584d4c0accc75bfdb75377c6e9730a85921e940d63599ce8f604e32364b41f1b6a1252da5c4697576186fab07a61b25491183e850bb060e9ce7f81e6b6d8b6b0b424de647a0cae5030e8fcac8536c945e9f055520d0c6f882c852145f83c6cd923fc9519ff08c87b9e31255ccd9f7e865b3c4a0a2b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000062d5f6845853e71040e237da6db721d5d3a389f15c8481423cad9d504d776d2e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f3797a065a2c91da05ee754d5720a4706ada44ae2a7b8dac1473363998709632ffffffffffffffffbf312247533d481e255cc414b022d577c7e7bdd57a39018f849cbf247cb7c7f15ee43d0ab79aa52110ff7f1c7be9ddf0a2b5ff2ead18f7865e84ae2c5fecbe8decbbeb8600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c99d03a10be5b5e012847899ad423eaf2ea035548527140e1d226bdc1a1d35c3a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113f8bfcded3f44b039016e49de8f4a9b5585f0ee0009f51a7a897e479e673b1da00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e336687cb5d49f600f74bd73dea47a21cc62a744331072499861d3495d5a068c73cffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856920185f24424f65a62fff7cd46417429702e2ddf49e7b2866cd2b809e76bb6390863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a083e66b2127a57368ce31977adda5f122e8209688058c3dabd44a839d4a583b4400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0e0530ffb9f930dcd680f49d441505de521f53a8bccd83ccec4d22fb8589a656800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a44b5a63a934ded0ffc5587ccbe6d3b3f82212602e35fa985e482d8373b898b8a203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e9ad9496c00e867ad14f56150a6e4a6dd473ec9d58f8ef969bcfcc918d97b674400f003000000000000865ec9ff77646d70b2db6da83f5c77e6da054357fcf9a6842b5c99af5cf36c7cdafc1314901112d58ddef609d1f30c5992ef272e0ba089f0d6d1dba179ee1cd0a3f3a8244d6eda82435d49203173a8c2a42f36acf8b9dfd537c9c998791709daa920d11b4d5419ded315a43c9f8caf123bd2b41ed13dbb3074f2c4d5c28248502b9a2717171353449914bd79b3f137a981697bfa2e89c1bd81e13d952da4f87ef2d8a40b56ea78c841c05560205a188e61e229a72c8d463db4b5d67b8ed8cd4aa2209fd1d374f7886e9be4dae28d99e91bc10a6db98deca31935c125f1ea6236c464f99472f3cce19b736dd855a352908aadc31c896ae3d087aa51d7d788692805dc236b910481bea10b5da187c758a1432ed95aafaccfe04bc0caa16841bced85a8557e1d699441bfc47991275985ec1f7b0e8e0b7fa5dfa7c9497bbee3083aed678cf4c09db8bab555a7235edec8e6aa54e1d1440e7820b6b32184518e80b8806779fa48a03989280802a414b607c6901051ec295d92fbafa3f5790715354594764fc290d19123f9e15e117a19af50a045b0206284410bb7a033fb9ae52aeceed1747574898e896d1a9b581cf06363971398b55823985f9c6c732e92c447877a4f3188c08caaf8c92cc31a63deaa24b394d150790a82dd5a0b634b63562c4bb0627e5d92772dff87cb15f20a48b261f24ba0b61f76e66f6cafd812807c73ed63ae51f58d72edd9e551806fe61f139d85ff41fc1899e1f824ef79bed432aa543a5e575359642b71d5a15eb78f0baa347526002a8d6c90069310ea97a9abd9bf6a31242c37e18cc755fcb82b18ef77057692f1875fc1229c080f360dd2d04d56b7a8bb6aafa9ea06ecb766c6e85fa74d2bec219e0e6bf7da1a6c4dbcb7fc664e87ed4071b483c29484bfc2a52c11c52ec2a962e77b72ed7d1b061135e45128d9916d9b98baddb5467b27b627970e6b3c66ebf9e036fe888a43eb8f5c255751e6656344ffd8e87b43c2d32be7a3ecdb6c3b5569c707fd4f5a2199598fbffee839c3e16ba813b5501dcc996b8af6d606093d01251689f7318640504c8c5c2a18e49094226bef218b2b21cbeee853715c0938d15b7290023b64cda45e9b757ef616c670f55e23c300b3c6c45af7dcb2007328e4e5b73d9cdbd86493de1fc77496ac703067b18958e0c3b9c6f61ed3f6165bb414e616f655ef02942e7b1792d3c8c51b1f7a8072787180e8ecc995da472d0c224edc0f72220ce9d1332654717c9699be923a4afa721cb43697f8c08c87e509c26dd8fc5032a975374c563281510b2d46f5f003ba6b2bad3d317faa1f46805356a0c0649b7e7f9ea94881fa013f2fe672ce57d356243b2988b6e339be87d1378432c3142657649e7f92d3af696d0bd179f80e36caca969d2391ad5c22f03a53 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000078cc35a9a65651d1a9eb5eec2ec933dcfb05f340a226fccba402e8ce28d9a52301e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38cb627cd1aa0b99b4389cb3806f40dd04a888f01126c37173ea2f4ef7914b9e65ffffffffffffffffbf312247533d481e255cc4142c359376f08f5698c01dc3f8ef48ca48e0406d8c1bd9f11df4f325b0920fd509d2bcaaa69a6fa9c239c56a55e4fd93ae1ae71a70bbd6dac900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cd6584eccf6cf9f481260e04365774b37c87cd2fcbe2f66433428902c4389d8384bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086117ccf69f279744bd26428b7437c1176bc69539ff7a5d68392458ba5e32100775500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e332a25f6115020f606f5a33e36847ccb8160032d843b933f573e1fd7685b537d5affffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569fb338a4279e642e1e44610ab948c5b6076040d0c78ceefe85372dc6df2413dda863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a04439ada4e2621b93c40dfc0b34b0cecf511521bc792cc880b1ecf40a0e56568800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01a01d0322d62ff44206ea4e51aaf032b72cd7b948311f4397d87ffe919612c5700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ec2b83bb48109b7b96755bdec7a7cf2733854942fed1abc3afe5faf2cfe44dbb03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e5d2e275497b611121237338f789ff80a3d58911465bf2d847e9422df1b27a3e600f0030000000000008ea621473c52eb755f9e68e98254ffbfd0c57cc5c55e59dab9210dd27433b111abb44592991b3c0af78577debdbc6ead829a20ffb701b94c55ceb8136d65c64965ddd7d4c79ee1419c40149cd83f9765ca1219c36193f731e10a679343f1d7ceb5e14186720b9bbd4005db24c502e95c3485c81f25066b8f6e289fa08eeccba69ebc897ca2edfdcda5d7ee0ded622dfda867d70e51c205dfd379fa29a7adfd03d0703182b5808a77ee5efe540f0667676856fe6210ad31464407c0a58b6e6f379193e9ea2f511556575d87adc787d9f3fa6d603b2d58642fa35065fa78104552fec670b4134aeaee22cacf322424a803ad5ef955d1910f31381c1d22194c62a978232d88c9df9fabcc7abc3847b10ed57f6ead79ef3a323395a8749f62996c7899821d10ee6df8c2ef3c2f08b5a22d6eda629d7195797e34af2afa4383723ecce44d053005dbc4e786009f185212a5b796c9658cb1c826dc3393dcaeddf2e5237ad9e978020e6fb8c64ebc91051cccda989a14c825d44526b0c8e77548d23790aad7553ba4fd13c63922a6ebb0fc82776f71860526e3be68ef7e2bca13a564f1d0028db237ee327bf61c6fdfc5937a3cb51b2ea8005c32fd0a121a7b2bc9ea7b4c799215e664143a3045670c539ec22b7803fd2ea6a55fe8e47ef406222b102ab6fca7d8ad11418015ad8d88dea6cef280674b5768eebd78cf30c060498af79e25fc80bfcfb15783063c1cb86942ace2614ef1079ef9883de238023cb59be20a6d37cef1d54c8e040a86e3781e1cb6447e9e9427b1451e8eb21266c6ed3bc91c2d26350ebf50e1f304715f11e009cd54917ad622b6f538e714e2aab132f68fd023a9226a331248df5f686ef3d86b823c93194249d909b55d4945d6391f2819ee58739a1273a1a5488955873bc7644a25bd8ba6140e0fd3363ff72ecba9a55367c77a9d0de278ec12d89bd9b9b037ac677959dfa6ed75ee624c94a0bded388b8edfc19d5898d8693fc163c29da765dc654e6ec2758b139cefe703f4ea4fd73a45342cce73c5331e3206488915bade4534225a69bd05138b2f6003c0e0d2818e84d334a451fb060498e5a8c9b6afc89906ddb47156ee19b657513cca450fbd611405dc376b8fa777dc88daa736a01ad91c83c62b8d2be2e3177aed12932a0c0e09fa87e22c46f1a2983dcd0a87e23f7613651c14b5de46670747e794f03f876dd0ef78806ddb6622b070a0dc88bd4e8b1ec987bb67000c1c2b106c067277e59f2ca8bcc0a097ee81fcca72aa9f125d375360cf18c8c515dc49bcdbb2064124bd4a5a7fcd461c1390f6c5ead5b1452d8e24be4ed0f8b345931f232778c998ab7afaf329fc267cd6172132a3d540606c8043defff07a2524bd73635fba14e98da1db99faaea21b538995feb9fe209bb0db31 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000df277999c5992b7d7fc5b336a348b67984da0ef3de5d564d3a11ed587004ff4301e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38c7743250a3a34f2b3610c2a5c5c90127ef9cf3dd16760be97bbaed12bf9a4dc3ffffffffffffffffbf312247533d481e255cc4143fe6020a5a99a3df3575c08c8d46bd8c12233547bb74d3f1927bff11407f8e8b825e572cf48e8dd2d5aac345b3c11ca001a30df1f5df2af600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cbe05e8a6f7d590995583cd28bc36125c40d22a55e07da6c9fa71a812993ff6604bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861110f46381f63061cdc71b802b38435123d607243a82757d4631c908125a0e284b00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33dd86b94dd60bc354e82e8ca2d9a0fd88453bb4ce700b9de60e1d2a6018fdbdc6ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085697a6d06fe47cfd7d2be2e4bdc278fac5ea0aa05ac102b106053738092bb3efac0863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0228c9f51764bf3d26a8125737182b6118eee8150bbb987480733ea605c37150e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0164fc4d77f0f97df58ba2a2ca160a2fb7794696fc1c3d70c0f4c05f1c1ebdeef00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4aca3afb735121bf94c7bc17dbee3e7d7e8044e4c4b513d0de086d66571e350b803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee6dfaed9e4d089e8ced20522151393726d04d2076425d01a173582baa523a12100f00300000000000089ffa656248bdbc3f8a36294948355962e2dc0888339c57dc945568a0f058352a46ba927fcc0c40cf571f86322801a83965de72a48ce217487ae8457f2b1eebc37c9013f716a55019482acebcce02580e07954bd750f8b6afabb94607743ee8bae94959d89fa42426b5d4ec2223cb9c9dedbb42fb384515751f530ade911b3a96942c814d3f830e7e3ef44592778a4009156ae16a6fb162544fdc8b40f5f3016526c20de1acb4dc5b5c0072499638c7b824c25566b402edfc8161b4e49d27630ad2950a46742e744b6431c74f990149998daf76d8e256b63173aa59187eacde681a5f18fe852e5d8339634827cf4027696ae8e654def44ec23506a848cd698fd4b9b78899ee5bbca0f280e84c77fe0f137df1b1657eaa26512abd9a6d4736c6d92f21faefec6a389c777a7913326890ab6f17ba1851c05e025665f94044dc5f8de4caabddda40a9839c203074526b54cb4a6fd7f66badae77e7ba339a311b9ad7a2e98ba396e6cec5510edf7b74e46d35e92ba139ac1dc7621d7521d96bb4103b5d759191a38ca31aeda3b349060b42f11c61ef2a907d857d5f77148dfd396678cd704950f09a68a47b727884681d83184a5b4f4d512f3840379254e3015e0ab88f07f92295df6de85c2fff365547de58dda4683d87d6253d6880169f8df2ba08396e6b2572fdade0eb69a7701afe14fc9712ed0c9461f27ef565daff12305360908ce1135018a8408915e8790c5f2e1c64dc5ed0a16935000bb30642c5863d5a34ecd8b9c412e1f7059625e1aad3c422bf308c1e4b1504d4f46147ee01b3a4672c00479c88f563b7db9ae9d9e155202f7159d5a336c90338a4aa4e320719b28899a3f646cb4e7552b5b766420046c30d67f97371149504aa6e2985c44874b9aa09c92ae7f8d76774a801a551e0dee50b0d91dacc1829cc33ead8b83282fe54b697e12ac8ec3a54167841949781f2a671bbb32cb5b1399c0febbb8e9ed39127365bf3d146e4cb50e37f4fb8538877159c8e9d494f510797c0412cd53d4559d01d47a3cf0d7db0f546dd6eadcbd3b4d5a2f17e728f53c1709a0cb0a0fea4aae108bec125ed3afaaa9dc1a1f53ef1617605916a95cdd30abd69bff015925853615264d3edcd3b2c70c65b152a1cb9aae54812803747e61b9db88662309e1b8fb383ea0c8ac3bf6611412940f360fcb8100f7a8a4bb3e580ef12834e671d78cca1e6e443b2976448b92b51cfd1cbcf86854b5ac9869c15e58e28a861e4c08d58ea01f17843da5af98c9898e24e64f90d6683f0a0de8be070e09085bfb2638f01344c18fbedd66428a30f295bb07005ee628fa7fe6963844dc194e0f757b1026b5bd0c41cdc785ee21f0d37a25a61216fa233829fa00473b196a63d0eef1ce174df15e1aeb7067eef8d466225ccf7a0f952a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005fc2f2496d3562e7c286e13a03514891706c63c65962dae1830ca494946c191701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38412f900ccf6d846b70724afdb2f3afa81ce48354cce8f63844af6a6da1cba7cfffffffffffffffffbf312247533d481e255cc414dc9f99bad32ce8861ed8f1f6cfb301ce7b8da26424744a5b7ad11826a263e5e4889f31d05dc224f0b9661bbc4114fc68381bd2d286ffae7e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf1f51e914b78892c23fdb7f72fd4e3e6b9f8d07aace0454412a7965eea11b6d94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d6780db60087aa11d334300c1b98163cacb965044875eed6ff0180b1bf120fc400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3341704ca57273c903702aaa9a41850ad974ad2e5d726f553a12911a585b195522ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856931ecac6cbf44d210735ec8c7576de05084503413f0b99fb744db4c2185da7850863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0dd6c7937d9b2c8cb46716704cc0a8d48b291f67776615e97e58873f524bc050100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b008a248cfbbb49e53bffaee6bda65941c34d870002d9f9a41bed7f88f3ac501f200d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4f03506aed2193ea1cd654ea44600f1357775bd50722e867631e564443f18596e03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e35bbbbd900961f79ae1fa9ce3351b812579a9ff17ef1b6ceee806aaa5a11b5b600f003000000000000b3b82e8e52a92969c5dc8b6b24ea14953fa74c43e7478b882424b6b07e173d409ae42fa2c570f18c7cf5b453c19fafbaab0af3fdb379fda3a01eb52f30aef9302f4b8d73b10d6d3da9d03b4130bef14615fff1b33998dd9c830390f02e0455baa8d8e3da15326a8be35cb22e9c9146ffba8dafc3f5bad1112ced71d78f86380db2ee06782c1a8a123b63996281eed8dd8455b02671fd6deb10fb987b1a4978b37468c3e555523fa4f4391833de236868924057ed0ecd649af5ef6c47eca41faeb8c565956752cd55fa23f0cbd2c1b69efb2e719e3ba837122319287739bead22f097a20da35720f0da7da329b599287ab5ec62fb5a98ea3d12746cb1534fd6ad1bb57b4d9c8271ea2b5b817fa2e5a4de46311eacd5697a2dd5a505ad5873d1138d54c7ed8ada37723e090591f3ac857e439ac0d6efc90564b02f965252cdd1d085d67b10b0ccc25eaf1eb907fd85874294b46890c487d661323e38a5a47bdb5ed82d53703f1efcc4018cd9fbcea75d91ea2122389de51af80ef762a16f4f66398173011e76b7bf586e91efbb213a29cb651c4f53b13704db6548162c455dcd20107ee3d6e60ece0801f9d2eb65e0be1fb0286f7cca25f72f357ee318ee49ba1708b5f773c48aa6f100fa6fed5cc31388efc4c422fc29a36448d7f07d2f952e2baf621099426a3d2e03ea3a589e56acd4d85c726e800071dc8238be524b21e8d60e09fb21c0a81b2ccbbbdede041ea5e9949a7c6604ba0b0637e9d8e70e2b9ae487885d8b54e2246de3fab7ec73e59236b2643227753bcce2097d560f6e4b6dae22250e3f2a27e75ae69cb454514b8d2fab919ed3577a7ec50d20ad934241390b58f8e579ed0b96630cb81363fab30437d97e298ce6910cbe08bae21caaa9e1b0a6334f19784d97c5e43b5fe00145a7167cb0b2b27e44bc0883a88a8b5fef57aecd3dbf7c754bcebe89cf6186aa4cdb0aff257316377b7179a788db4807546eec15e85f1b69869e5c108ec2033aa43260a2b6d6f8d2714e65a86744b17667aac0212603927a0bfa6b86b936167c9ff6195c7b68f90faf353e304d1a656149c299b86d9ead0aeb6477c95c6a1d5287190b3c7ced8e51bb5124013dbd79178b1bd37f0f7d12706880ed9ecc426adc041258f85e427b11c896d5bb9799653bec34db3b141a3e8b10c8840ce5e2dbf61b5c3acacd6f87e0eb77a65f9d88a8ecb9ff1f2c9c386b1f195102974a15185c8ccb4d8f9c102fbc9aa8bb50dde824743326e377c98d7f3268b3e75a226770ee069d5fb30e268015f0359a35a0b4488dc4c56ef2735934fa7afc5bdb4d4b6c7b202a40c27d11f8228c0bbc761689210b63fb966d500ce984f399d41449720c4596cd1c34e099a06c493e66fb0947da306adae1ebb266c323550b1458427ae358561a3e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a7f320e0957739638dba494335097471bd64f6751be50386c8c5b7ad66656d1401e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38ec91ca337039697d266c6fce1a552d16ccd665ab6f7f41c8a7cc3de15051b624ffffffffffffffffbf312247533d481e255cc41436d0afdb47038f0f09828e5e4938db40855bd8d4683f7369e21204b82d6244127eae0600a5fed25cdae57b877160f4d47e6fe524adfc3d7a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c50fa4733688cbfbd108c06a4bb83d90ea405ce0a594ff9b67d68fbcc43dade214bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861178c7b8f4ac4fac7793eea6c14b1eb3c7a9adf4470805d4d496ee4f7361fa07e300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33fac8ca7ebed46c6be85187981d64f425e1e4410d4e5c1551abc7149847884eaaffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c0406148ab31e6359eef9be9d9eb463b42868a7d6466555988154a8b3279508d863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a04746475ea90b4788e64d05d422ba2d4665472c1cb4d91efc0c2a3ea5eda49e7100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0afc2263a2db900d102263b654195572da24a579b4c73b4f4a2551a53df083eee00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4aba7a54cc6e05acb12039a54d0224d4ee8bb1232149f6293091d943f7407a54503c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e8c9d3740a7e141f5c24dcfb814db4fa254381e7e895096a460ce537eadf9c4d900f0030000000000008eac209bd29b3d4df43a4532e28eeba3e24590e82076e21e210c7645ce0e1c0b059d21cfd4ebdea299e55696c82ebcafaf49735b047bea2dd68b810c7e084a18ba86ca08f63a7ed7e1df41ad67c6893cdd3e1d74df4dcf8bc4d26658551af5cd82724bb3574edb852cc7e167e494dae3549657a7cfcfa04182c919c28c56a3d7ea9b2e22bf6f0a647498d11740aabcea8255815aca7a07963bd0a3b3d5ccf4809c57c761f80214410c91e5d11bbf4f166e56fcf9ed9e7ccb7dd125ccf1f2501d8faf84f66b3e7550a44e78670f84a3abc17a1c4224f9fa50e9ff154630990f9a774d88d3696fce8734e0280d474d5fd6a9cc274fa7e959f73fd00f2e32660a2dad2414bdbea5110201a087cea6dc044a99510b93436bebb1b280fe441a3f7b85a5961d8d6a676c4fb98800ccb4ad45432d84e55df83bbcf27617e240d6098d9a7d50d3230258d05bdd62448590c26e1b839b3827a63a4a7f4593ddb97dced46a1d34936042676ca01ddd2af3e817cd4d1c17ddbf407c6cd66f0cca67fdd77ddf8314569d10f821dec381007ecfc55b93cecf2a31bf600dbc5c511d4018813b9552212c86a88ac14817b6d8edea46e5b79369710eb1897193607d5a7d936a2a55c5f00520cb6ade14c217adacf4dd5c897b5d6793c927279960bcd258238ee5f6b4f3254c789e8b30fbdbe5f8ff7009a706a4e6bbbaf797eee5ec403cd134c1405e6a6102a93b3fe528641b1a04051a04c65e1adba91fe30d9f0ada52edce8a4174a2a5138d266e0515d01807872c3d3d6bd7321096c2587a2378a8c8400181e19b1a033f33a626d29b0635ffce266222fc0df8245e4f64d85f32465a4282ae386e1482293d60e0550a0192dc3b45334789cb2db49726bea86d14df622c4715b2b2010c5c3c65ccf97f493b3f9c39bd677f8ec9f9bedc72843acb319dbed5bac26d739deaab2299afffec0b593b36475a027ce8ec5675b105e592601696b151b2b2854d4b9ddf70b3b40614438fcfb83823083cd8eaff65070ffac672fc0d9f031c310c5f9171fcd1f737ec9615a2b931be8e2b36ae40f4b9a159c1b68f48ce19378df8dec6b14579e3f539b3a8e3fe2b1bfe3905d232871b7283a2e4c86b24bb0de067dc5b70ea12c46ef236d55e2900052ec4ceb4d9fb1ddc6f54b1544ffece9e28b7560db786838d888b47f5417f06ea8cf0645ce9e0a8a88c34c7fe34963cb6c87d4e80da58a176b058dd3cc4df0e5cf707b1a80c7675478fecb9c318bde88262e93e202ce17a5346a22d37d13e27684d59d283a0b820900872bcc02349e64d68420191648cd7117238c8e99ddd62060e640981bf88d58f4e8a340c4b3aec1e5a1e9d1688fbf91c91b6eb2225991b53507a326cfdd9f415018b6ac72f14ac989453987ccb354702d4393edffd172d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000056577105b96251c45afda4499caf5f809c2f606b4ddb3151ea49686a0c93f52d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f142c741b910da5102e12e9c2aac83a7958bf990e913bf4ef0a52ba347f09cbaffffffffffffffffbf312247533d481e255cc414167a0fa6bffa84d03157d1cadc1335b1c6ddfdf4529e032549de606e7383b15b1a338b0056f204612ce1a3db757193db732e145f16ebbfec00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c71da11c1227090a6b548ea3f16c4fe7a321e73db68677bdce005762c2b71c5b84bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d3c188483b95065568755c1f0748b664ff25475ff87ca8e19460f6aa2db026b300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33496e78fec7ee7457fd95a3e99ef9867d67407e584a6c60bc327df1c703314e98ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085692486e25f29a776985aef4de143ee18bf3bc34a45da9d27ecee77c75029e54341863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a005c0d394fcdd0df83a1c14f79504ed4ebc25ae0d8f4245b6b421554185009f9500e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0147bcb634f4927fb9aa66c8d06ed68ea51684bdfac8cd64d305ec63f8f63bf3500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a410b939679b4ae2a062eb258ca8d600c68b83b0bd90cb0ac524d98a5a9eb3e79803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e87a579d017a650c0535dd35592b913f9a097f05c48c7ecdc23a32109567404e800f00300000000000096641d81b71d84458d9e1b8abb78b90fa618cc82696f1eef32b1ed0b7e9c938eabab3e3d1a1ee262ededce79c46ef254906040945d6b73d2a9f70a30281ff8447f4205d95ceaf5459ea0bc7d0f118236fe46d070b6896c3e254606426878f4ff986c9535bb3b3a787539488c03b2bee8f8831a8770495d4fad534bfc4f3232e1b710f57912d97090b9e0df895fe4d181b4b9b98125225dd62dd3a8bf446a409a4903ba73899d16336ec3754fd320f062c6dc4737ba45db74fdc09165424b19a1a2985e788e74e0db5a2f81ca18228e3e8d5d1cfdb16842dac5cbc6842d42e24bd98b2ea467a8d6ddd46d80fc0606e5bea461ee3baa944a15078f92799f17a2c3ef3a52b7f9b58a039f62e54beab30855f80fedc886e267d5f4ef56dc85b0f06ea71dc44e4a05d5fd42629b4f1c065591f8baaefeac1a3ef011e44e2db46995eaddd823054e73e1658dca5bdc1f1c293090c054694e2288118ba0318cdb4ecfa62085171e41a03095251509dcce0ef3c2ee4efa63b7c0c5af82e069d00e468d079520e82dc2c8823a1dc83bd0ccf4a7bab4442f2e2c20467692959b6a8693f5c7c7eb448d9159e049012cda6a7774595c99470236a82b55d6247b01ce3c58bf75722da7915a0a5aea4c728b461f4c4460d134d4ce31c327b52b533c1d62a4404c8866fa9b661a3f4218da123c11a56e73f90ac5bf732e6afddfe83f3d5a4f863007b51b78bf1086963756b8c9de21ca51c880d18801a9f1caea813d231ff794ff38d9b7c3cad34a70c2c7f67447033938377c6c62bdaa0411f5659cad32a5e568a5f96fda64fc11840c2a705a1d2a1770daeb6c97bdca18547ce047eb6d0266745c600b0149f2921cfdff1c8465c174355658f341133b8b46666e2990f2d5b2daee41cf41088293e8af111664489897062f7cd6ca637123674688c6f0f4de59d256233bee893cf83b52c6a81db86c1c4722f7df2b6f6b326c9bd3441acca1de142fe3a1fb5add4d56bc12b7ddf2b6f01590f2be7120919dd63a6a6bdc461c94dd08715a1370df9fb7ab7b4e92bd509657eaa015dedf52317da4703efdd1a7f24ecfd689a58e60b697707cf75eb5cf7c4e488d7f77f6b5ba50847a16f8af11160fa8577cc1199f284ac315571f9b06aa51a1bfc5477fc458edc014ef2a9f92fad8a89c81f58c3d1a01c1dc294c4d052558177ec508da57d4d3dc64ae9ca9a3919a5356ce1b254f03954d8c33954e125f083dbea5c4a5ac9a101c9df10f27299812070b3d7ffbe75e5a9078d741c6eb1845d7ebbd207298056d5de2d8efdffb5c5d166ae7dcdf9524c7ae5e27f73955942b603eecc3c07301759065f0bb38d221572fe2666bee40d723d1ed340b401a712b331058540517ae64acc47f54eddd98b1f4a68a40f54b12ef64fc0831fe3c6c3e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b52eaa07fd2a963f79fee6ef9d212e137c7c29575bf651999723a905ff02d70f01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc381a473382fa50edf27d2633d38a8774aa4c240aa4dcf75fe7cfb3b511559448a6ffffffffffffffffbf312247533d481e255cc4140f61a4681c4bd8f6e21c5562c3e292b9a2f6682465a06e0e3799940270b153ee37a95c10a0e867877e6ef18ed347a4b094acd53d76f7986100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cdfe0fdb698fb660c905d16840a5fb2c83f598a85fa9575b650efed98a1f9aab74bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086115841bc609420ad545963e13e3ccafd9223a693908052b4734d4f0a01d7846e0f00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33a3cff0687a5ece322f952101e7badc0e4a623a7d418d5c2deab3b1b3f09d6664ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085695a028c133391ff0875eeb5bc5c59fa66a157498a97a13afa6a252a1c31abd3a2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0bab2402d41d538189fb190c77ab1fb303e4fb6eafb887deaefd300885bd4e7b000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0a855b80fe697702f79cfc916e8f4f5f9ab01bf2eaa85b96f340cb55e81885a9a00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a45d8ce0048995ccabaa42061a99226eae22a720126e2cb4e9de385ce35c5c12d403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee4fc46ddc85fec52688099a3cb49d4554936aee2c6f402ee1d505dded9c812b200f00300000000000094b7effdadca30e8bc56d6ef2c49ac54aa874a0430ca7cce764266210d0c267f4315b18f804e76147217a9c267f972a29882af63e6cfd68713c89eee588e9418b228277e76fd125786a4dd1119448d0d8dbb998b75d99922c743e68a1fd9fb9ba233afe406aed6d93e41745e584bfb9dd76295e4be3e84b2a28655578a3abf27c03ff8a3fa9b78d6ac4f517e07120073b93a39246066308560f98f8ade056e1024cb1679b8c89ee304a720ff0a799a59f99fd804a7aec6a4a90d2189cc083734aff029e1b5f9bb8cf949e4ab95cfb6a2764c1b609d8b3abb7047710ea885d7a030309d4d295720140f68d52ff194efa2ac9d6b1e608903f4c0122ebe23d83c909fa76f6302759c6b593a987fff0ec00d625b8dae7214289d736d3d52e8b3d4ea84d71a8a960c81877f3b2ccf9bc2ad6220c31ef0f96a750533cc5a4f02681aebb2a96e74ae06c62c91e961e102dfeaf1b840b09f3a0dd29ddb07ac7f9328eecdda00eda5ac0bf514ced3857882150ca05649092df1293afc03bd5b0f1f0b0a8ea2626fbc07d83495d5c64b1325d7b30d98b68a0e30b8e0b91d164a7da241614e44cd4ceae69cfba61c9b0a8b057e0bce8e880bf87a2f818d3b776fc2d6dfba4eb38ce6061e53984320b4d704eebff95d9b1ff6a037516d724783c7b7f1f772b58f2d855a36d59bd3d3955fa92218d1c5ccbfdf794e14395661e99ab20948c0a2bb20050412f35ac719ae51a5dad51d1e6a3e1dbe0a12e7353427327809dc1feb0ace030dfbe10082f5110827389ada184563fa7e039675692592d822a05d4d52e941389048eefc121c12526db39d8530251db0a636adab8116c152da207529f6d6ba64b3cf684101f4feddb8b0e45d33b1362dee4f271d79bd766feae0635bf4002079f912e14482f66cadbddc3d7f5910a9dcbc7405a46081ef0182fe83f51fe230a90118d109e340552d96936b5931da18e14f77b00d693bf5c07adb1a0c013ae9d9cbaa15cf6eb80797179addcf4df40b35148708a3aeae148e40ee13228866c61a5abbcfdba08af7312da4f3963beb6cc78813538e9020521ccef1b6541df96bd1542fa08314a8a7150b7e261d213d774b8f2d8952db93b71176123dc787b1c15dcf4be2aa9b0ab3acfae27e696a2031e430ab6dacf979748a376af158595705e1abd28108cbc0b458f0d94a5f609f5ffd03f74dda234932e7febe4e0e8c5cbd0ef3b8084fa95fe752f7c534b00bbf6f5bfa603454bebab0bfb912acea3a20b844e5c4fced0e1c49c4dc08c10a33b36eacd55cf880aa981d93b723d7a2eaafe2ff98b6106567c8803534642b800474af29fdfc312e077f2b0317b1aefdaa725b31ea29dc7e93323dd4cf2aa29f022711f6a5669cbb459c818f281648f317888b64cc2e0e72ba80ae4b39472d4a50 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000066f8594874e78605cd363fd20374d10cc42995a16fbdcf8f65171e2995e344c01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389b27b26f895cb550ebf26f9374faa6711253431845f7481a2401aa6c73dcbb8effffffffffffffffbf312247533d481e255cc4146f8cb1c8266bb587978ce16643af71dc786566c8293951ffde7e3f4325aca9b0ccac65d176a2c25c734bc9cb1147690eb4f01661a029cd8f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c1c39dabc0b5e12055c3e701415f7d9273d8670aa53d36c43fd72a4bd677cdb6f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861177dad83864a1b1c2f305a24bf443b7fb78f1dfb0230d48f43eb3e1a2a95368c100d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33e35429258419ff6d1136906229e52045e1793f4bd7547d763749069b7de4a6d1ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856975dc926a1c3ba0da034d9508998c03155c1da5351244d165635eba3c6e11cb1e863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0ae6154048a69eb4cfc75edd70e71d0f9e1a6a2004e2fb6afad9fbfdf4eea465600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b00431d2310c8af5edac659000cee9f17b52fbd80292c74351a5f1d7ace1912a9500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a436b2437bfc83c43b971fdf64266d06bcfde7bec016e0723437db30cade09450303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e83ca56e4b227d532cb17fd686bb02d76d555282220f782d818fd231678d75a0100f003000000000000a78525ee7b37070b8dfbc7c453ab9ce91e8c6a4a591be901ce6f89251ece4bb49a35e1888bc2b8b6e791f776729868fa8ce44694db723ecbf68a69754168be27bdbe44752550f151692c84db71cf8ea65416d3db0ba31266b4e096d61ef494c3a1d1a4157308abc6aa6a4541fa3ff3c1d0d2f0e1ef6d61fe030b39e9a1092f51d12c1cc5194fd4bb6235611465940355b30247bcdc7cf8d10c2a175edb351034fb09b06a239564d8fcd54e258bca1e47f47c9677a71bb1ef88eef82b7980e98ab7433917cbe799c2f34fb21fe4e664159421499026b9116621a57034e2a7b5f8f02e3230b78d8d1050e783c5bec153eaa321b23b81210a9b2df1b19fbe10dec706f5f5647001c38a9e3d78820be3f3b8c9231c774043322676a7019485f2483db9df5196b4b9cfea17713bb34fb761225742826d98c01b58061adeccc4dd38421a1ce11cbac838ac9e69c45999b70cd38c9ebe905706402c4dfeca8c4aee768e951b1c220b74fd02e36bf8eacd36bc92e5f0ebf89d0d273b31c78338839fe39f926a3ebf7d1f3e3752b5c0eba875b310c5ae78c6862e50e2019727d2bc3cd7fddf810648be733819f497cdc6c9e46e70ad4a35347f407335a9710675dd9ea472005e974b1c4155fe862bda9d9f64d263706eba2888405fa1a8137219f815cfe2a81613972a7532f53173afea448deb87bfae10a9ed4149c47b2bc3c01baa88fe5bbb72525b156ff0de0fa314f1d889aa4987e5f7a3462d68bce15687a776f5157bb5d502a318cb8eda934eabd84c506f95992b3f674e7dcb93d8068920ca63ce9840392df5ff81c8552b5cad637499639322052925688b94e70c11d97d4791528cafbe7fe6d0b2be13ca1910d821c666fbe63f764fd1426535a75a343e773cbfcb70e2b2122ef5535502d15b4da0d341dff1d6393b60d1592045fadab46c043bc35376468217a749a00c0233dc3cac42a61847e1e55d37e95120c59d6547a3b3665bea5574d0c00082e460b7f8dbd336faeab01daab97e3cfa439aff7c81b612b295c269d217a0ec4f9ad7ad1dead80266ae190b6b0f8c05d2e5114ec0fe6abfade9ff96f94250eec1bb84a9214fc35f954eb17681bd93a75d2089e4decf4ebbfe07038e1bf7702fcd6d883f9bf38a13f705bca66b9c13d347b5148189a273e1e100a7a2f11aa68ce526731b8856405600e5d61ddd8b6c6454c24014b0f2d7506a1a062fde43d334e61e1ebded0a0a53e7cb57ebd08001c4f914d743b839e94967d6c8be966727b1d44ddd6629a9632479997da2968f261b3fc536340376a33a671ab487d6c372aa67310c2570c7054bcde3e95756f36de630f1759dc69c3d6df100c037ca16b3c5ac2c2ff762ce2a147d6369406ca37470a2e37bd83e7cfe291f02c81bf0caae8dd05290f231644013 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009dc90323ca6549f88ad5271ad70e8fddc2bdd7e7ffb461c837f491d0d6d5205901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3834d7a6dc8ffba93a3339d81317d47bf05b4bfeac225a2ea332422559006f6618ffffffffffffffffbf312247533d481e255cc41402e131605bc31e5ce914cf1a3183a297f71990789b2a464ec36f9ea0cb0323a167b7dcb3dc4357934e5368dc50d7c167dc0c8eb6f1669c9800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc310424220176e3ac62d20303ac794bbbd185d1974f7ada6b5643284a16d0bdc4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611dcc0d3f727cc4ece0284cb98b744066d771489dc906be14d41ac644dbfba3e6000d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33d9a58e7e752c1101c37d12fdd10d0c786ce787b5bf2823727e1aacd82165db5cffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c29b9d05efe07780a35c193df2d0f52f74d4af3132465d2ef632bc519bf5a7da863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a03d021d677d7eccc0e033d8bb95956e58106a28101cab11c24c3adb64ad34bbc700e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01616027d6fcb69a8a2a7215b9148cfb828d60c9cdecd2c3b6321bb41e9ee91dc00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a419100b95c3844fceca2c03ac144761c88938b7e6eff88c081a7a7f37bf5275d403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54efd786d6d758ef5b183436794d1d6eb59c17e4773cc35cc86e2a255c8e074bc6400f003000000000000a81245fd41b222fc81870bf1fba682e77b9cd07e91be24b78f7799f38fff8eeb835dc42ddebb9bea830051a81797bc0cafe0ab7beb851b7ec3d61b4b6bba67a1ae7b6c924826838bbb3949c60c6b68d303e072f892846d6d918522f1a78d49498be720449f09ab39b38dcfb9534949b054b3c848b8d6c349a49677d28581aa8a6647bf2a339c4ecdcf7819ef9963664db4bf2687d8e27a247510135a8e71442f2bf67d600c96d2d1df4791a9d9e8e0841d2d7afb9d3db1b061cf7b169d55c58a99d02d85166b244f890d95910b089736e26886a10c63e6e7f90761f185792032aa443f88f2f3f99d3161c873a000a6dab3f16a7104dbb4ae5b80cf73e9ed51b3a1964e0cd2f01debb9023e8b90781468e0342be8e5b76afc62cfd8e46e3b50f7a3196f21c421af98b0dc0ec74371510b1e4b01f80e90aecebfd08c62ad47a74a4bf79746147a1e90508f36c14317f020a45298469e6aca35480b887f3c7a8b15ba446cfb29c1dcfdd42b4bb4066fa99f28aea8bed70ceaa00870e2892bff484885a4fbd278a251901a6f8288ab2cf43327178b1e9c8a7e083b9dcc9267dce9a461c4cc721594e7d81707a618add98ea280ac1f723ed15842036dbd2f96e694e8fbd35a87d300b550b55b41240f66cf9fd3751f27614deb887b052ba959cfbec48baea1ac309931fb1b808ca3cc3b39eb5953ef6c60c5ce78094f444f8d9572fba8d0015c0135cbe013c13b0f96f9c391e4dd8112afc21241663db502cafffd21fa779a69f313835572ba489325cf9b655d58fd846e9c3c5f3c5f66a982e69ab7494907adacf631832c29cddcbbe05453fcedbef7ba26f31ff3ed73e4e643151c2eea9ab158e05a5cd1420778ab40732a23ebf714a4ada8fee79f5989d890c9ab7dc6ff68984077841c78cc007a9b7f4374a6a3fcca535049231e33e75678a41e6169cfc7f6e449165855c2e1dc9b486469779f95a32610b354e705eb12c1d1d60dffe7205cd7b1f9726d57b55565a6157f9da6b7a94079cec9ea99ac81f8b68080e2893f80fe273baaa055b2fdd702684b21c0632055b64eb078925bf7af534198b2dcfd5b93c0b950fa1019d2a36f5fc228f5e2861921c17c0182611fa3b7bf0deb75694b81108fdf3d76407f8fa752c41d29aedd0407d2eb425f05f00ce3f3c77b0a4536a4898192cf7fed57fc52692374fff0d25074616285dfc7e1a789fa1b5eb6bfc4a4df8d441ce3ecd0a1ce36adfe851db09256db5cf83afbf25cb115f55f33cdc1768ddf6d3664d8f00bb74fd989fef9f534995099d75f023edf236588b2261424d5be1ce6d0f510c673b01b926ada4ba228289c6ff05a2e4bacc3a3ee880bdff77b9a79153cfa7dbab4de38a731052e1383cad3900c2790aff64cf5461d8908b3348f626155485efef7a859 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004bea49045f849be3794f64b6da6dfee93c0aed354f3b697b3a52ffc0d5fbc10901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38fd3c56cc7e139153532a16e120647d19836c5b73c88459afd08b94eccbae041fffffffffffffffffbf312247533d481e255cc4141868a394a5d45a456a2958ea85a8c56470820fb3b1c84f93674f7099434ce210983713b45a3a5e1bf3f68ae53e7054f8f0451d94b236c6a200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c2fc3d39be05744985f1f98b0849a63b99182413a6be8e6529e16054563c751b84bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861155b3f33f5678636a78438d00439bfa15964ce2d283e05bec78b515868f977c2600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c08faac5484ce203a60efeddbc549c7e31ef29a2bca38d5706c47ea74155e2edffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691422701657302eecaeefad1192b1707c5b8b6027f12fdde938b11e8a9333043a863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a038c377a50016bbef52b60475a3a0de925d971f2ed12247baa7afbd46d0ccae9100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0188dbb9f5865bad0dfa9075fa6b88a277f4ec994825050f4ddd4d49822c354ae00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4cd2fb0171d195c72f4287f9af9b2ac2cc1e7f7cdf8e678844529a7f36ceb0b9903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e75af9eff4f67d0c3a5519b956cc1f9edd97b26690b903223ad04578fa09a28ed00f003000000000000ac85631370e39ff74f38ec347a3e5dde13db4b306d294336f22f032b9e3074e592749d6e06fb8a40c8bf4d194e09060180094d9d35b5087bbe86d3d60570a08c82df3777ccc0ac1ab681a380a2575061e56ddda87055d2ecfc8022e44f99a578a13de65e37e0f4f08009518a8044b02b53645ea5753b8add834b6936ca9ef806b05c16841d3ef484919b3fbfd4678daba2cfd968fd072b2a467fbea345f6b15487d6207cfeef92e63b571c86f6cc4127314cb955191424834f00164a2b681751a099327e7f0defca8ee668ccab77cd4bbae09c0a3186a6e31f5942ae54a3c7fa4fb6fda6fa80ef615e3463bda0b122588e7a3e68022ad7c01a69694e40a6c9b48cdab15c53c254557a8dfefe5c1014b829b97bf79138e1ee6f4cba3a1f934a93907336bc6c229a8a5c7278073eb10210377eaa55a1ac8685d3f55a18ad8f748a3669dfa3f4c3503133bd3e717e84c471865f73856fd1504797b3bf07899c5b7ce652937d73be2d5029c8340436801b4f8e4e877ed8a332cd813dba7a4e6dc8c78c09757861819d77c9bbda397be5cd6733e0297c8429decc3df20d3de19f938340ebaaf08c2b01fe8b1f8c2e6bc3ee6f8c582c3af983a839dabefbc89c19097dfbef2e96a33f2e17074f184576f58cfe31db34bcc72db7ed99a8dc27afb05baa8a0e6c12b9588a13ca6faa3c88198a39f4a1529426682d90433d3d167b8164f652b856acf4f2cf863acf2083c98aae4fdf09eb2a6bd2238c842796b7334503b428282586f1eb438a44f0082e4eef1e2e7b433b2c6e1ff2af4876b1fa8f606e106dc85c90ef8ee790f232540d14d69f0caecd928fa28ada864eb1d4a269b18a9b93959aca8335e69c02445e94f398061561f081111176ee534a4efb2a547789b338aa2d998172363c068e30076b567972054a1c7bc452ae0e8170bd03446bbe9a3bd52accde6ef875fa502210affe7b24c146cf0b9820a6e8914865a50b917dcc7b274c640d7a79512f15a0f2c5905209b9a9bbe2f053657ad121088a318b79245ca32955578226f378838a3031fde233bbc125a071174c7574fc073865336258d434e40fa4e1edebd14b571bd90e7839979642665b91837d273a0bbc4af5fb82dad4fcc66b7ecba0257bde414f16e827eecb6efb4302a5511cfc6b30b1367f7f3c0927455958bcfc8acc50fd16415b71aa9a03863bdadd1b8cb611f5e5653e1857695f55c74cdd7aab85e194fba4756010b7665509ca46ffcef32ac260832142d20aecd9bc10fe28c167a75aa3612f2666e1d66eb135d0d4799af3f8ed88e21fcb7211ee06788ffad570a3e2a3aa482ab8defe500577d3f9a3a94cb118a7ee7d21fe0d22568fce4df4988c8f5c4fb33fd1faca07e0b7ba5e64a3c76f7e8d88ede036742656e8f6a1184ac8bea8f03870 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000811ffc9ac9ac22cdb83dc95fd47ae75edde97fcbb754fb546c8c73928d4fe02601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389b4940390860ddf1f8758a47f2e8017ffc688c70510dc8442248cc8acf0c59d0ffffffffffffffffbf312247533d481e255cc4147542b23c634ad0127ef3002c1484a92614453fda07345b4eb74cc87dd66d6dd0241ac7f420b2c1ccfac08131e1930d214306b0ab6dc2da5300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ccd80139fd01c9bc0f074f5f24d2cae06c95275df89c884ff55edc43f99aad6c64bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611655522f01090a26a4f53618e662c140f120063a29b13268e38d925c162492c1800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33dd522ca9d9fbde774a6a19dde92ffb2f77779220ece23cf492515569f6c44d31ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085695aa4d8089abc3faf2a3586eee91c82d7f9050fcf3f5ef413d903db0b0cb1a108863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a056ddeee9df56c01fc7b91af7956b8dbf108f2eb793ad29b95c57b5839e6d2dac00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b09b57eda0b75b405680096f5926a247619ac8cf462324384486662eb74cfb903000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a48b3bdcd06229eeeacee1720df6fca2ec9ea0b2703efbb386cab177d06b91b5b203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e49b6ee83b773d5b64626e636a643ad625ef41db0c1cee185d2532145510ae4ed00f003000000000000935dce516cf406185a8c5a1144908bf68768a627b6a21dae898a645a487f1cc32d599c897a13224cf5a5e06a06b66da4b02f9e3a834ce62b3f30a1c58e6190c77b6cc6ebbc5e67481f28f99e10b0fe78e8f07a4bf6fbea1f836c649818a5c713915e4641a2a7e54e9bb3791aba2fd194029ff71e6e5004b7915c7bf49a18a2848fd80785343852297381a77d3d512a44ae93ac16a16e2cbff2fc316d2a09906a84c1638fee976df09dc7ab93fc126bd642c8cbd60644ca3899e6cf5c85a12c0295a0c67769d47cddeb2f4116ba16e3f0b266d08e0e7183e59ec07fdfee969cb06a36877090e2f20753d7a4d59f24b51b8ede02c946e4ed7fcb82b49a9833a9e453e4e11112abe2dd7cfdda270163dd4fc5a17098d7d515859acddf20846e982080fd388e17a828ccd63797d1fce5d5fbf2e5c63a52c073808588390381b7d17550959e8b12f4c6330747f2f8dee2efcf83653f0fcf087da9b6b70ca52aa17e4afccd67b392d90ab66fbf5d2fc2459f4ada58774ab3f404c6147fff6d24eff156aa2eff7efdb4f6a156b71df513505c89938d91aa16f6a1f153eb884f98f322eec32155e807c123f289196ab0f2d1196fa69e78ccdd597bdff985fe5a33667b72b4626ada61f551c7465523912b21976729c525e5711d16354dd9dc06b6b4a1a4b0d56a4f9d441341ba9d2f2e6119ead688beea97b21f3bb9ae3aa6ba18827ac9bfbb5e65639b90dc07f29682f25262a75ac0cee93018fe08ba9d4e0a98acffddcf47777a2727e18d17d2395c544c1c63525691fb72020a33f037e105e8f4badff4d98b7d686aa461b45fbd68ec49ec2d7862d2361e615f4b5d9a130890bb7adcf69fad58dcaa81014126ea166123591a6bb74a2cfa5fb579220bd01d22fc4147d5408d9ed1dbccc06cbcd699a5e26508daf547de06b5ec9aa807a7bbdc8b1b4b9b91d2723814fcea7eda855d977a6e4f8c82afeae04f752fce5a78b346f93889414b5effe01b4baf5fda6431e959be17d461cb5d79f41d6009835696d67e080d50d76449bc1258716b3373087668906660768f6c8a2ef9e5fce6141207cab9ce59478db84d5f3bc7ee526a9aca48b358ca75277bb37d5289b691ca570874d5c82151415a0936736e061e8a1191cb335d10ef8dfecf011afbc89d4b4e1c6fd78508adc3467d08ec70bb321c658a44cd13a1e87c88da29c3485fa1e6f89baab0b43a388da36a7e67bb58d905e28f71906f1905f27088065e3fb38e32f853fe95628310dbd9a8a46d52f92083088833203a93c1d1742216ab796b51bc5fbef50dfe85bc54b10c497ca3a6edfd6a90db032bacb60d47cee1da7841c5371c643ffbd7f5781c9dae07e1bbdd7df7ab1c8e3c5dcd5f9e7d35dd7e648bdd6f40e961581f03b34532990c42fef602b5e60a607e0c -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000284ba16a65b3dc95f377e6fe161cd4ca964888a2ab053a8193100e3ead23d94e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38ec4e4527d6f5cc3054f6def894eb43f46ecdc47ccf0895b6424885f281bd468fffffffffffffffffbf312247533d481e255cc4143f139f18e971dd96f4851a3e843a76b8bfc2b2ffaa21ed7759942ca40645397e1e3bc6460352aed3fa49217111eab73d891fd3cd00f8507d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cbff7c9fb06012e93614f530decccda1b0bb8e0aca8621f8c4192f0b3653788c24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b7c4a2a949de92a36ee201dbfdc948336d0d5c0ebd428020fcc5423a42fa32ca00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c72fe139f7af32708fe1597d91836c8c4a3decf21cb63c3cb29446c91ae4dca7ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569ceedce2413a9d98afb7e0ef296b27d493fd171e1512be7eb7efc73565905a713863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a016238e9cdf307dc0740c22028bc3e706cef65b7eb033883d28dbc422ba02685400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b047c462bce4c9bdc3d48f0c0a522b352494cd52485cbca34da842f1a791dd170300d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a434fc95178b500bb5d3ac11e90f3ed23c6a9483ed7888eabc69df0c7e787d3fc403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e22ed80acac55fda22852a955d28319260dcf5bab43bf008ae8b1640644166bb700f003000000000000ae752342810a1cf470bf4000b9fe2530818ffa320dcb797e9cc729376bac18e0e327f9e9a49950dbea6fcdeb7a2ad0b8b1f737fd8eda264b2736dd0cf3d933a8a338796cd6acf0e8df4ec00a6e578052e301f22a1248f41367d1ece4ffd704fb8c12644c4d5197c8e5a80d43244685f4de4e6cfb580f1ba79d384e5e99af7420cdddf583021de139c0f1533aa0a0f548aa17b7cd02026789ffcd7de385aa949ecc41bb8f4d7da5b2bc3a0f7dcf54faa7a5a1a9ebfbf768a9f7499bffee60ab71b7b265bdb007d58840c66622e490d77e9f4ff07942d00c0e5f7f87787e9677f006d6a15bb3697af4577ee855244a262fadd88680fb9f72e01b8aae912eebf2f85bc75c7f0860fdc06b96503c589d4f207dba47c56b0be6f26d623699d2c4489eb4a48b0816de4675d315212183d0393e32ec30f58f5b1d67ebab5282e983e396e94466aa26bd86d62da1c9f4e03555119407bc889fd98f4de058a26c189869727f6227ed9f3510f6424b6dd519547c9505ff99f93445647e24529e6a15ab5658b5fba67c1f6c43d3f6df97ec7d6ef7b203e024f03d95e7de9c3a6327706cce5b917fb44ba9b99776bcdd110ff3f1aad0a9a82ecbe529de2c5a4ecc8f42e24fe5d84cd2a22d4ce127ae659127c56f6bf4f3edcc398a47246fe84d4d19f64bf735a5378b080dbe677022c2d6a882fd949170c3ddeacfaf512923c876b3630783653dc04152cbd5a6ea19bb97cff0fabd22faf9743c5a328f4aaaa3d88059b77e94f17a7ae21a6044a030f2f469a9722f12be594c227435c9d80cb51e1ea3f2c22cd848480fe0bf7bd14a5821c0ebe23c1fafa78dfea4f9063236bf64305ebab5aeedd3583d7d15d53a9b4e2aee2402006ca45cd6b13fff339453eb65d4edec037e03dee0ca7c2a9e0137b98aa048201e1b814fedf02f86ab706b0856ef27ae1d15840490c18448d994e697bf94dbd617121a13b216255ae5266587ac59d1d384056683406e90539b53c5c2e48f8ce10210d94581190eba23bdacc9569c864dbf831fe32194058fcd2c2347f125904e8900be39e75d72dbb32d618105cf9d53e80c44018d988184e75edc66a4bb05dd8f727b175a6464d140608b684db6a19370c18e171e4ce2645cf30750624f68f2a541a3a22e7a775cb40441cb082f6e23e9e33123f0a679b42d84f981f87e7bb4b10a66f3d2209cb549ab506794d44a208d1ffddcfc7c04799e4b5131d2eaabe1a443b864bedd98dbfd36ba0be4d2c3bab902e651cbc2f14ed8ac561091c1c4f3ff041276d1d5f8d6c142fce427d714eece919179a2aa77b489fb91253856b8b89b3309f6c0235824a5669d751332b18da536e05e4dce743a764b2b6938fae89d0203c7839e382b86c9fb92f7ba1a4b9749fd0130859aea8935853a78fa2ca9b94572 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000da9b102ce81b1d95f725d99fab770895cdbaa6e1e4eda22af91bf813467b994a01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38d308a9b2832c0505cc71b0305ae45f6345f369289d0437aa0b2a511213de4d99ffffffffffffffffbf312247533d481e255cc4144bb092a432c99130e90b15e417730273d8a7085d3556b2c8f0ae62a162060c055b28b95975a16254d2af9db20e6400efec7689591ee10ebb00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6b92a67dcfaac22c0deb51e5ec1a419e37ea1fb23eae334a6a9f5d2186d9e2584bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b5b056192a07de6f346d42cf667c5be304c89ed4f52594c084e36dbaa311f28300d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3324e4286db7c75c61a43ab8bad64bcebe42bf08e8692fce71bf480970ef08e003ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569f4a93eb8e174d4d5fb2a65458a6469daca1c110044767cd42df66853bbcc8633863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a02db6e84823c7f44cf573a862e2258fb34e4c965b3249a5b413310cea5416be0000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0cdf7646e6dc41d46a0e783c63c0794b248883b560a0ba522dcdbde193266f25800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ba0827ceb71e2d31aa45b779e27cad414c861c5854e725d3ac92363df6efa8e103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e2745913f7a07df8cd7d29f2da199ee7e458474145882e25653b78157b324882400f0030000000000008afb8312d2778ae3d797f1504949cf3a65fce2dd756b9c4c7ab9aa3acae59ad971e7907fef4cfefa292cf1e0717bc536894ce51e2f6f1cf6d80a7d0ea09239a54eb03f8d644ecdcb6b3f42339be324ffdaed5ee35d3909e1d6377edc8351f5a88d2df8aec915eb2b65dd9b5cdc101f9862772c8ac052a66a84874ae3f7c0c1991dac0d080c96624b21e9e86d1904809bac99d0c55377d6d8338f6239cd853fc54cdc15c32d1d76bc17ac2d56c151dc86ffc98b8d5d3966542a3e11866555ee50a2b9d7fe2245b1534cb3cf83ddec648bd5747ef02b58b72e64c32a4fad54a085c31917e175478682401b407c6bde03fd81cb0a3fedc2971a7fa4101fb9e160f838e611c3e49853a858c2ff93ba79c0564d63057130d7808e38ea0fc56d461ff786c4198237ae6ead7680b04e3cf71b57e983435607fd012e0530608344570d0792ff4e978f8382b3a74bb28f182b647c94da531900fd1dad9ab332ddae0e18c9b40504ce8f2cb716ee9daaac5c4d5817adf9955d24ddf0d17e8be474e8927383b11d5b3a4bf3481f3e3fc613834981deac1bc06f244244af10ef74d71cd5cef5dfe9a2c4fa7a4f30e76a7c0a72bee214a1d38015dd8b7a670673b51ad0f71862fb2b317eb2e797d68bfeb1b39adca47570d491d560e61a8eba8893db5ede4d64983af38e4463d679194fa1fa9b682e9f0822543395c9f91729fbe1cb19709079e33f470e4feb0e6ae6ce3c52501c44acb028e5f400f16b84261ad750b448ede862c753844ae1f881577b4c3d29c8553d00b3089efdf6c2c44f209d45a7cffe0da91ba520b1cfc3fce0376d022ea03a2768a7363146432184d7ef11883d0209dcbcfe1cdebea9c22da14b04c2944fd75d96b1061a999686b459b97827b5b0938e1db876eec7b92d5b088227e7920c8c4d162a7fa02fbb1a86a64fc8145bfce8a1e63ef26ed04aab236bd5eb1dca74485b826c8683af07426e336dbbe6b3a37daa9fcaa4353bf75e86fc2b8a07245dc843a63bb46ccaa31976d4766c8bc11c29b0739b0f08859d586f09fe842430951f3f979cd8be8f2b45ea21dd016ad655fddf623bc5f21577b25878c31bbc2fd6425cad31534c056df0590a6c9a87d513b675f49b2555231e6d3891892dc7a907d06d1f9ce34aa1a9257ccbab6b5a382d2687ab8ed75b4ec7a86d2cbb3afd40e844370645cdecb1355473683a2ed67e22956bcb507cbeb168db11cf987756e3ab0f707ca61a5ea1a1bcb9b5f43d38487dbfb9168eba6ed48c7fde4a45a8eddbda7863a91e2b6352506f4a0f4ac19e34605313d0a12446fa6a8cb5c0ca500457a09a7189d3aa474ce1aad1046e81cf83cbd257580b9814e302e78f55f0b07d4b6b095182fbe2de584e199174a6d39dc26dc925cc64c04700e06af1fefa874764130f41 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000053f4d7f4a2b2017e3872878982990ddbdcae26debe57fef130f42c9fbc5d5b4d01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38fb81765a750069fdb2ebba09d99388e88f3b579adaa6247956d583a928cee79affffffffffffffffbf312247533d481e255cc414f9bbf18c7a1ab2a612859c0ccf4e47893416cc6ea0c876b9f45fe0168de7ce424ee75812115604bdae1503644823153a0d475ac69693a43c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c8fd18341823788974d3ab53b796b5dbcc3516ea8b1f583b04e57a7841891cbcc4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861113b6e570c5489355d6c458df39dbed1a0335bec0f70037b5a4e71c354357494100d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3310be2ec7ec919c58b1d289b4475d508e94037015ae9555ac56be1793f91414b9ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569ab78730143307e739c7aab59e1e39473a9af198b05714ad13449ad22891e09cb863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a09f84c23ffa881453dda72030f304cf65a5a086377a69a9a91300ec9ffd04f25400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0af0ec2a04ae38cfaaee0f4e2bc4cbcf2845fd39db6185c2929ae51e71008096c00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4a3603466e15b8ab891cb60b6871d9f1856305b0804a0b725dd192b817b2f160403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e5554c42c005270d0ff5f62876b7863f83dace7bd0e03c74e819e89754b2bd35a00f003000000000000b38768f5a5b3f2d276fdb46de5c1f93a0d96f78c7a106ffaef98bbdd49169faeedca33e2acb2ea9f04e356ccd7cc241e81722a16b0cc88463334658742c47d12bb133d3b020264a365dc0a199113b804ad1ab7264b4af1792ec5c73898cd4950aac3aa9e3e2bec56d03bf3cc1d6088ac13af413fecbea6480e1885adaa933c7f443081e82b8a6bf0423ff53ee831ed2cac7127555d5b268eea8a973308dc51a46d39125e70ad91a2239c0629eaf9bdd8723a348a642f61d004b8ff17362d8577ab8dda1c450c5d2cc8e4c81243266e4aeec039a8a6b6a72a1cac5e0a9ab75aede60dd106e0d4cbc53761978398b77e40b5523ac4b80941559c7996f9256845ad4ef2f00f6c69229af6f656658722aeccfb367da290798f11d6c4db99d3367ac58870c7bf84c3e78d1a8b87d4dad68c9339b5716fb5a2b9b95ff133fd9eb93fa1dc382907c61d063c3e105b51eb073a7ea4ee335857eb902fd9944f873bde30390aa3f8d86c1e0a287c1ebff12cdf73acece67661eeb51581517a245b1bfc4b728711b6690e6c9cdec412984fff174f5943a9594c7bef309e0acce9d09d7740df23a8c7a084a44526d6cc29d11367fc26b52e9bb4e733624b94d167af8eb653fb28983202d7cc0fe4e8da9f34eef935bc4b8ee83b3a896e88e609c511cab424b1b561e1c656a3e0df56fcac6cae19f424df86908b48c97bc97052cb2808ac0af1f698fbaf0ba191d068cc5a4976f04ee8eb05f44e0c5470315f8a73ef16e05c684c2d77955936f8fb3b1ca607ebb26a5ab875960163aba8aa0890bf2d9277cc75678fd206b4b839cd0a4ab75cd4fb0339761d9b35014a097cd870287e1c1e2a85e878eb36488fd38ef318095a71f1174b691dc8dd939942659f7b87779dbc4b75b415882d717cc6c844b076a10850ee0cfec2b34de194fd3f95b1a0522f3b8deee3b1435bf2b3e7365bb91456ce7bb1693224850598a5c35687d29d729beee9ad8e1045db44b8374e813f2980c42c715e85d1b3b06723cb84c6e8b29fb56dca9cae437d5222887bb462e7e1531bef4e51dec705d32a9be4071185d76ccc166bc3760897f2ea0360aab7f42cb742733072d1ee4731e89bb66a0366ffdeea1a723568a38be1b49a792379b942c855cf454338f66bd65725d5781287b63214526dfa511a50125792ea0a0366ec995a19b62e17ff67d0ed7d537f8db6425d70c316103963dd03b57661001e5ff7c9a30a57178cd2a9c765ac3f406deea6a4a04cb69122fdd4b6e057f73532bb44513fa45912571a9d1ae8ddf94e7f2fce4e2619039496c695892d738fdefa6326744586bc4615d54881e710bbfb0fd40fe8e6acf3dbac0a98296d358f1334823a5e6a6bb74eefc67d8d042d4dfab3b3e4ea682933dfad36e85eca1365976ed5d0c202d5dc0f -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b44afc5bc1f2ff595207cfc783639d87ec5a92cc0c97eaf5a234730630ac160701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38785b83910eba406017f20cca917b6649aa0a31f72a724e4f8fb78993f9f0e0aaffffffffffffffffbf312247533d481e255cc414164d843aabbfeb9c45e6ac04888738af743dc8d91c7cadf3018f22f61ecfe0bc101c00ba273a642d5e7a7c16f68ad0ea41c5f74e175fb76900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c284947166d45f7a11efcd0d97fdf4a2e05396e6842f5203ff642476ce1ad423d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611aac0b551ea34cc674ea7a68427e96c6096e80962d7379e94368c8874de565e8800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e330441ea786336eebda455b2bfd71c213e59287ec471de79f35cfa055017b41534ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691fc8c7d633653c0528492ec15fbcb0516cccd140e35f2df3d433299063794f42863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0dc8b9564d13fb92df389fbf5a7361613b9192604a47a78a8f4c1527df5eb672300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b029580011f269ddffffa031d0b02ac4787b2e1cd63daed1b5e675339b0219232d00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4730a12cd8a7b4a4f78697df89ff3340cd81e689fcdcd2e4cfcc6422d5cebe41a03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e55cc8aa3a8eaace1ab422af6371bbdb5847160ea823a0b056086bd440daf056200f003000000000000ab0374ac358b584c68b7b307608d691fc4e566e0cf7295a9392054d2e873c220f96be47ce145cee602bdc6ec7d9308b0b24956a462a923c390acef37947cb55512a8dffccdfd7f306d3d160f9ea8e58fc75833e3a9ab0158a351536a89fa6ad189ad748853b469f79723a9df3c31a871a586fb03e29a04de16d4d5b60d2622f32f287eeda25a877b11c133cb0b8831d1875e0daf6b77e3985d4a7faabdbee21a4702bad29e09e670ca11abab5097affa3eb70823727370eb0c5f534702e3b1cd9250818e82b02c10505b2942cace4e3325fa23f5376c55fe842cb7ef1dd0da906bdc9e5f70bd189bfbb998809e5dd6c0acf7c36610e42db0811ee4e991214f2678dc53fa8349e7ec18f0c47657ecef50163eadf29a99d2c3eaa44ee4d40cd20881d39d1bea10b4fc2ff3bc11544fdb91af53f760665ea110cbe796f9964758561b5e46a6a3690bdaf8e52acd2b35490a988a5941dc3f203ef8cc256ea583ff43d26f55042a61fc9cf59973eda596bd6e5302b7082ee7fff01317849a1dcf1d42a3d892e9b40d086f5af76012095a6a5fa1e4c7a0764bee3fc2436ad2c1dc9266fad766c8b586353e1d65508652eb5ebda603016ecea5da42062892870a5ba60f230a3f50bd2704b202a634eaa825df2e02e1b2470e3c57ae351142dde19f59438fecaf8afd702a865fff2a07e955db4aa1999b7a929b4fe982c2cd4af0c9d85a71922aedfb02a0e4b977ee1d3fa42633f6689870cfa2681f53be43057025fd5df6756003bc36cef8ec9491a0177253721c2d050dc26153b5f0e3889a6b5c0e71df6d820f8f6f6ae67ba385d9570ac846e7475d2e2249cf9a159bff4445cc933ae16d92a3dc13fbdc262a9faecdac585e521758cd81d973dc88870ad56413984f0a425db3ab4786127e4368cf81835c2222302d73656b60dd65477386ae70fcaa6ebdff273d682a9f293d06284b17465741e48df61aef4eb526192a3cc6258be8dd6fee3b1bb49ac67c8fa81a256229724c897f5721067d3441b90f89cf8a8e82ffa106609e214372ed45341d5edf6058c65eee2c5d7e54f454d98049915c765669d8d7ed7fb18806fdc2c93b12f21859b8cb7adcb0e3a32d0ce11c0a615829fab5cd3bca307a0584b929039371368538529e4fb1e03805da9822cd5ce889cd65643ee3a56d871706961a1d4e2dc4ca3aca9e12bf2594894623ab02a3599b45f687bcbbd345a19ab4cdaa73c3cb4c6f4ba147798d1c7b134bd83732bef21d7626facf7327276c030a13097cf6826ec22ef9a491ef15a5870d111da42e8442787bbcf999044c45be330551e9ea9f900957ca634d4ed8c0c21a77d8acb8079ebd11f781342ae5e674d43dfc13c0dcb979499f7948f50ba0e431328feda4ad078ef46823c757dedf2b21ec77c4176384001e -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000884abc5883137c6f41bff9f4bb962765e85011af16e037e3a8c27301faecd95f01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f2765f575128b792d68cea647d59ba536fd5d38a1cbca378ab8060d8f82f7726ffffffffffffffffbf312247533d481e255cc414f562e00c97ac4bc1b7bf1858d6197ec453ff98e981ac3de77153cf6a3ee54e91f44ace13699cce47d9e95405f3fc80732517a22bfd3e860b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c93133cc7a7f2717d0a777ed77065a847827e090bfde6e881639718d90eb4589b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a95ae1214540cb80644f34c3c92e6d26cfca7d19a3c613ce6a98d5e14885de5d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e338e041cd2861f27765b9a6b3363056d51019242021fdcf6781bd48d4f4431a8b4ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569d1946eeca1fb427d4a7e133fc556cbde6b10a5e9285d95c307981ba3dbee48d0863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a047c714eda0f07b0fff045c772fbee110f6f23237bbda06ab803797069ea7525400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0c4caf0f0b7c8893ba88c4938e388ec215f067b570a3d8229ffb2b2662af3eb8a00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4c55b69e87c535c76078a6879db295ed1f190d05b376bcc98df701a796cd19a1b03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e95f26d68af9a0f49bd5769a09828eae6265ee8339aff1c1ca0ea6fce1acf1a0400f00300000000000098d070ff330d7c6f1b0a0e0ad7bc1ef1a4730834f3d27f0eab7854ce128eaec6cd5c6e23dd0515306eb9a74608ef07348d025b44cf50105a34748fc11e3cb2ce3b88222a1a7fa6441671ceeb421025bc6b029cf3fd9c20d6d6a7494ed693a57884d38b12e3fe12b4ec8391715b57d0902179a50d443fe0392cab17618f17925b1264ff03dba539087c7bde4b1ae738b7b6d7c4583d0cf7d4deae00668f039bedd434710ede61b6166dce9a50e6446b6b3c468e432638db4d46cc0fa75d9c9c5ab50669a7f1a6cc8a9360d5f1f8603d73cff4d572eb8ca4372d8256569f6cb7df063d7b209c1bd853b77e702459f4dfc5b7d4842e7e374dfcdb7c483a429cc72780f7fd591f1a173392c471b820a77ce49d12821a5fa3159cdf3a326b549486678748eed8dbd5a82405039088b7ec9e0ef3227507b30db270afff044fbe066b826200e5655d6cf85f74ce93d2dc404a3cb06926d5a5e9f83ae819b80388c18ab71dc6e84da4ca7b662695a41e40b77e01039e30aaefda04ba74e20ea6994bf73db4aa81d830ca95cfb5215453a2c143ec25593b73c3c81281692e7aa3014270027560a0961df1b449ebbfb42e13e07670a5f47a23861cd509f491a55cc296edcb985910a7074a3d654f36cbb1db77d0eb1f8e2edd723d9a4ed23d8a764c20ac2ab6464947f3e7cd4b638a9005397a38b02dde15eff506056bec7399cac9e00ff19708d2fb38b06888775acbc8b58159a0b88469daf84b5d7bfd66629febf60bf61e3e4302cc692121de053ac76244ec2d964189af9d24b87241468ec99f9810fb194ac1097148fd51a2e13517a3efb155bb3f94b982d1e155a9d31bf3eaddcbcef8d326048db7170af5e99bb194c0446a92d2e058ca502ab4b35f92e42240bc817c0d3ad9125bcaeac9e27c2d99405218e36e9a0c975cc3f826e0a744a4f3f82205c919041ae899a89441ed18595e5a1bab2700e837ceec6481b3d17743807d49460387efef9781e8b032c8759dcddb412754f4e3cc078ac109deaea55ff24c722f8ee9f9c5ab91b7866b785d48a5205c18b5f92ed17858d8a57bbb3a042ede2196de6e2352a9110ca02a5cba45f18c472de98358e64f61054f5b2b7b491883f347af1f02bff08ef0a20994d70c19686a3e08f7a1d903163a74158853d114698b5b1ebe8c33fe7f29bb37468a493b254e6d546ec4680f4e2fd1c35ceebca965db5b37c46ef054dc1216e27f09b2d1aa2d862b0f65fc5415918613d2c9502db62c6a4490db302eb1b25fdc944d02d25a52b5f2d6825f9925e395d80c0255482e8ebe9b6479754741ebe2212129e4cead406b26735fb75c7cd37acdad9c2a8f7fde2eed267634f390bf1714fdfbce3bf76bad140514b292a196f8317dab99bc4d6fbf31864500f33d3882142b8c9519b958 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a46174039266514ac0503c1f4f4b20ca218445b54dfd09b7b2803c66df3bb23701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc385553d567814e610e9a85a00832fbbcc83d9ea5545523f75fd2f03de02f9a7e90ffffffffffffffffbf312247533d481e255cc41434e7578d9fb01f6bac19b11ee255e4f95d1ebdbbaa1328aa3c95f6d0172c7b4558a2699e34e96000ae8902c050eda4268e3997dc9c2942c300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c8d5ae8955134f695154b7c5667c3762e3b568269df980961a26a0c95c3e568a24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f56139d47c12fdd535a63f7c175e774badec0c58e8868b393ad77f853ac1783e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33ebb1c997ea26504c7ca89d0d1bf0b86004b7c3c0a143eeb1df69a0d1850a4f3dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569dfc20c0b5ef1859b887faf88a1fcea4536d3b989d2945b3dbef64eaec76f9820863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a04ac5263e0447ba9ade38bc765dcf5d2b02a2431c764c020d897d8b785da2312c00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b051de08390ade241aad1d76b3d0c513193fcfdbbd0458394675632f3d61ee6dd000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4a06f2571d7073d03f5448a1e5386df3b39432be675859a3e09d34dfe8cdae96703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e7aac26511d1ea2e7f264497e7d2c814b5ee62a4a6b54e48787e68d5d1d3b961500f00300000000000091ecc97be24df873c7bde0cc9f213714a329e79f9f9756c5808c6a4681e94ff8fe7b5efe786cd3295a2611c4ef7ecf22b72a59555f4989ad797fb75388ab63637eceecdabb5e1a1323ba3abac34a4c5a1ca204f70f9d748e626ee0cf66efd27997a254ae156587eb71e4f4b319eb84d0c04050536dc0a8bc965d544b1a83ea1975a082cc0ca2c13ccdade39c6ba0ef1f874b8eb7419f8f892b2a19d9e60191570067c6581fb63197eb16c0bdae087da6e4207b46480599d517850e5b9f382d0eb58998f91f6ad66794809af96e7fa2c03bc6fd763ba5d735105b52b3c283fddee51d2a908ff7a6d7e8dffff67d16494f8c1a64f051cef16904bb99d9a2e2c609e9986728845c93fa59fd9c51c41696c25df8e9c4a8553e368d7979d3e3210ea990644257943eb4500c593a9140955c1143a7ec782a46c66a8bfc310fc8a6a13a893de76d74f2271f5cf21063f562ac8291cd67cba42e27045e6f2df51b976d1535ac65fd09d3c3f2370286405a27ae6869fa62e1d81d9856f5a6c0a05f7c8f418ee01ab0faa6ca21d51d4706d99813026e277527e67cba421f65180ea70b208b7d4da1ecaf01d27a4a29a97708150b358123b2b8b1a0cc1bf5de1367ec3b8f8165af1282bc9bba17c90aa845f6167d7135c5b06008664972e1b2b5331489487e80970cffefe3d829f6aafefff0bb7f0dd8ec7a6dff0c3d4595d0bfeb000bca67be17d1017641240360471db32827a5ffc2dc802ab856c4bce3d4102680978b0ce3327f8113a46e263ccfabbe24c8533b622640207908e7b61b3d0f4fec4511b301df14de71b66ca973f8d0a17097f84ed7f8523889f3340d267e94ed86bf25052f0c0e7d99850ac16894210c6a0b1b50f96707818571457076ae5dd0fe19d85a74c3c676c0d7a813e56d2b6502e2a00fc47e6d9b87636947e86ffcecf0ab3bc99cd5f43fd652e5f7387d01fee5110116d3cc471cdea083ead15744e568bdfd553ea9652ef5bad7d166108cebb3477e4632322cd45277ff456ad60adcae87a3b9abc27a7940ea962049480b871fb03b47166440ddb9ef3a873e398782d768c487d6832f313ea6274d50d1657a9ee2e12a3de334a09817a8eeb3639f819e53b698e711b8b47b2a8fdfb0cff7e75dcffe4212484a58b08b7193cfc2cfe6a1f91979ca86615997d0d46fb94972ff07a51d1e155f698c58828a7a3628a418ceaf9ae6eeebbd7687693c77a50f8e601c2777300c5382453b50e240f40faa29845a14383f3fc810addc06af655adbf49cb0ab670db8ff91dc743ecd7482d2f2ccf3bda50d6917e0b39f2c6132c0fb67bd8147216446aaf8cb348fc662e2afe8c8a1e1b94d95a44973fc1e1d06a7115dafb4c03268965f7094924eb3f97b8504e00d8f06f5fe8ad3a36c92bf74dd16d06a90630b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c714c4b4f860d34eba6f20299d4ccfa618c8d12d0d5f7d735a63393c7b564f6a01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38e7d19dd118e6bb98ae85ac2c054f2cad9221e95efd2f6b682ab51d6a7a1d82dfffffffffffffffffbf312247533d481e255cc41469b6a257d8f44dd012627d58aca619cb99476b0061825053cc76197994c97445e495eb7b9222c4ce83e9dbaf7bc028523bf8c8613a816e3900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c544cfd74efb18f32e47c6757fff970128f15005a3db8aecca47d0369c0555b2b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119d3cd15b618656a1f1b6a78e91f075bb995bccf059ed5faf5cf257dbdb989add00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3375a9096991db4e5610bfade44ee50c6951ea9424e8a952805c536002973f9954ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085694970182b5491b2fb25a3ac5ed81df76a8651cdfc196895768c77f2a43756a55c863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a053430f00b7954d327d35e1db7aff15ac43ebcc1e3bc4cc553466308e4830e32500e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01f8cd93e965e0888161973ca380947293a14dc9a9f05fb6264b6824ba5330bc700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a492cda2b3188b7ad0687dba507c931deca9c04a50ac8f81e1bf77b3fce096b31803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e411a8e679c9cc70b6326c5a653c49f60d11742ebc77818e7968484850f88489900f0030000000000008980f2ff560d83a36e649b5736f4f94daeb4e9e904b883d72ce180084ad08f150b4808bd4af77c69043342eab1d15ae38dd60c9f02f21c407d86a87a1d5425b48bb037ad7b97d0c11ba7ddba302f650fbbafc5fbf23c83362f20a4bc38271918b26c45af1bb506b400fc63def930d21279d2715ccd03ab61d037ee85ccf20c2c58315249603275f6457d97909038481dac0e334264a2b5d99eb60917e155f09ca73cf6923f54678bb88d71da00a983a67749a3b2b8532d34ab6190ad1a1cfc72b49a87042669833f34a58cd199eb6783c76b27a6a7c699655c9950bc0c4b0a926388f3f7c5ef4b20eb8f5ca2ee7d8cc184a6173511d93304f300be2c203926650ee50ab96676629f011f6fe5ba11d60a2059eb6be93b0ad0da939b1aee40a7e8b4530e4d2f6c367e5972f07e383e1d0bb1b0141a3128408c389dbb93ad74df1b991cb8d1cb40827d3a3709dd9655ef6a837ce587ca09070f67d07748d9cd4aa537238b391363d67199de0f1566f5a7e160b910f5bf5d2a50cb8f55b13d0502fe82201bf793cf35c2019b706d27d3f9c7b6a7e7ae6fbfc6950fa87b3aaa618c40cc8345c11dc6bd8f80bb16b8f920ac42adf691020b689d16859089072821c895ee280b42d7f683d3b9c971845d06615b35c8fadf4e58d260071cdaa48857528486e89286004e6d3c9e3c17191d27d05c4445e7a322c08dac8ce64d9e839fdf752e4afb5b29e56a45be19a1bf5be61b69c9dc46dae593174bd0cd1dc96e123a10592e502e2e8a8a1ee6f1b541f9e5de240953fffef73f5c8e7fae4fc519284369a4800d70e93c15666cd79fb8d22cda2c3c0593d1557029d02421372e915be34c5f88fee7087fc7105323c82a1772be6e8e2837a07ae64f535e4bbb50057b33b36cd63a10ab37d7dbd845696d24746d54367e1d2e1e5156a5861b4cadc002481f071efdc5f381c08a5d66173397e2af455d3cb1a03eaf5fff7e49f2a8f0d5049ddcd67f654d5ffaf0c7ea267a0a0223738b80ab0a382fb2ded183376244317e0a10b83f13c696cfd971f1fe8f0af27565427ce6f8d679ac1e5bc4134b2932abe72e25c32fc025e388101ab546e2b6b649eb43b8a8ed94c762bc069fe3b5f6d9f94381e9b84721b46f7787dd603adcb73f01781add43c08979eec04d324d88b63e28d804b91115b6da922327b867baa50e210584bb7a541c7f7c89df99399394defcbe9d1c3a1caf6a986f62e99d7166060b1680a4d9985abb30302fb59789f88b0a237d0541393bbd8afc65c2edfdd8200b9bee3a5c3b5c1d66bd61dff696cd32a4d24601344966345ab64e7ed96d7a3d2f47bae781b97dc1cf5c24667e88467703178ab17f83aeac7b69bc5f34243405984b16a47b0a35158ab832c058cd205772e8c3ac6aad6098903ac6b8bb7d8355 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000074e5e0a3cb64965d70fa6b1f8f7a58fbc815d602cbbfd23639ad5d1e5e75901b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38bc8741cc038eb8b60c991ed4fc2855d93851e0b1e6059a8ab68bc3f3a41ff3a4ffffffffffffffffbf312247533d481e255cc41421b70fcc4e396be897a3d3f37ef5d54ec29803312586bd4545f49b43a1d9a8894365ebe2c4001ac84fdd48b26342ffa57d7e826b7d8e54e400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c8668fe2fad81a5709995da9117ed1e778752e0aa4b7bef776d99d38190ba13524bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d9c7819e16af3bfc7ca8f541264038ea73217d934e4c3b4df6fc45ccc9feff5f00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3364e8557333d2063b7c3bee3a72bdb34578bb3eed5571ca8dc7ffb9d7750c6adbffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569a722e62d827975944a4abe8459c8d596a509bffcbfe607d65b32fdf4c85ae88d863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0f7ab4ad0cd7a8014b434a732d33bbe7212b3bead7395054261dc02630a58546600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ac9cc34c0f0ace8ba11309149b5cc5e87c7c37b4b0843ab4b5835b11abb6eb5800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ed3e14c9f539c653b6dcf2c1d15c9b919cf3eaaecc73c969cf0d4054f4788a0d03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54efddb223ac6919cfeefc8ebc26fc770e1de33fb96bded229ab47d095d8bf8e55600f003000000000000ac687fd229cc9892ec3d62144a1b164e343891aa27c0dbe3f7fe19a4d9459043d26b30670783dc15f2a75d5fcc1f667e8e7235aba8ec10e53549670bc1da808edf8fc96ffa9730044618837a667381a75e7637ff6658cf2b46c2e319bb63558b95eaff348ac51cfca86238e3765c485d9e9d7d701f1b0c17f768d922ce954e0be61e3eafc9e7aef2a898101a1da656ddada0e658359f13abf95761cae6f968aa2510e4b391a2ed0ea8a412c73f31ba4fb9bae0fa14f18073270c28706a6b2e08b6d1b784d86f67b05d795068faa976dc105e3cfba08a67c4b0e8e316f76a8cbad4a35e60ce650e4ad1f2755201342a28b542438bb8bb0f212721f484384110a28f7ee04f65d0c91986304a0eea1c7440506d71dc21d904c4b42d6ddaf902c14aa8685be0d3a730831d27ec119ed08b0e354676323d93fa9eaae6e7c3318e48e59c5dcb36ebba5e0e29cc5b366a93e159a1c57a0ef94b034b0164c73ad1a59eb080e2f163f9aa1fc2dca155e21554718b268dafc396ea71427df26a13f8074f6c879b947526812f769c83b0a9ae902ac8c232a3a9ca3424d5aa4bac2104d45a5cac9dc0aa51f2777458d0618a6315387589c4689b1579aa6f12fd165273c324a8f8a0ae36f71f01073d4f6b47bc747c90c736da69bc3899074ba1775c6b616be88cf9f83ae2f3dc43e8bce728d3427655e4bd32b37f91c26e2eac363ea87b3e2baa78a0da663bbfe28406f33b4dbf96f76b345630e4b5001458ed7735fb43a44f9e2423af553ac6f690091bd5eeb461173b5f1db7f01b8ea40eb48056c8e2a94aeb42dfa9a19435e458ba424623587a1189ef8e52974f0b26f4bb231dd0b2c816da349c810a4bb5b2aeb30fd3dc3c4d4bb0ebdd3fdbfab5e055014280f4c4001a0ee84a4cf102cedae7f6e3592d202e19ec0658dbd801be4c6053164200384a49ac67511b0cf380684995ee8bff7f0833cbcf937bbbf46d2fd503e0c13000d8db9b14ad0cee7416106409eecff428f123d80a452da4a4499cbb102de09b3fbbb3ed3c700c9e39f2510e96c05c834b83094a5e2f9d022a7015902a166cddb388375b241fb2b8c082eb5593543fadc1cf62ce17334023ea25f041c8dda3b238c6bebc3e633eeae547e78a6c6295d77a213b3b2444a87e9bbfd7011064a27a4ccfcb8c57a33de8565216ae75a95c9cbe4e593b740ab0e0c883ee434cbf4754d87e42db0673a2e8c4566e515db1c7d591ba1f8d61f2e483739a7a61fb43c3a24122f90d2bc22d4522f05204ea8745b870f57255a08d1de760acfa313de69d44cbde313e29b6eaba610846903ba17afd59504095f929b44c3475bdd01913fb061ab78309fc9e209fc11beb335b7fcb8e1e3632176c69a320f99eed62c81d60baa237c8f2d9973af10a721d73a3d5449ce93647 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000aeed9fe2f6cb44260ab5ef093d2ba3903f5ef6a71c62b70f1ab6dd590d98264701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3850d474427fbc77798ebf624a67f6ac516abdace97f4c447a3949bfbf9c46c5dcffffffffffffffffbf312247533d481e255cc41485512bca3029441103e04e60ff6e4d942f6c7d526a18f2341829d9e28aa538f7642460e7364628c74c9b23573d5cf1548bcd154af1c7484500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5995eedbb4d3b800da73ba17204d8bafbcbf290650b835e8510d076f421fe2e14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611af72e0ff325a54700417063c277716b1ef49508c689056d71637c4c0004ba9b900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33866b156d9028db62370a31a93aa4124769fd2239df650c233b340677099566bbffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856959024de24f67737166b4f8a39b8a6f3a03b357caa3e1b40c20a2e1e719821e5c863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a086b03ea968573f01ffa696cd37b20f344bf1d76c787ef1c2c3cbcc821b1af15700e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0bd98633d1f178f35c2342cccc3f2a85412818929c194cbdea694f6b9078d692000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4512d86f38db2d13b1e3238f01ddd00beffae38a4b8ca1c7d68ecb2591565cecf03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e6bc0ab7a5e7f02a4e65b59ac411d459e2e50eaea7c792af1eebcc03b800a83b000f003000000000000b76dd4ff4fb9a0a8c744dc5207d8e808c8bdbd59fad2488e9ca28a6a2c17eb1c281bcf54755b769446dd23827c8dc29fad4944d0252239e5c008514c080d427651c4cf9b04215dfa0a40756be76c7a7835c80c006d455ab09473ab991d158de8a578d75c0d89c26a41f6d6e7ab6dad52ddfe557326839f3e18088b6173a6108fc073017fdb6143c57986d509132addf0afc279389f49a9556ff60980744b4b7e400d734828c1b929968906822bd86f1b256365b898b1e64c88cbe223688fd7bd9598c152d1e90dab429cb2c44ebe1e737b1688fd2209cdac3278d1dacd7158dd96c28337e5d33132f3689146bf4e0e26b588aa111f259024813b6c68c747d4b4735d1c031a0766b16b1c8255ae12bc8ef0c9588fc3d44afa4a65871a998af715a3753057a80f6dfa0c52f1aeadf5b5c6ac6828a52dbba246cc0611d627147624211c2b8aae920ddb28b472cc991157a98572f35840aaba410c883449b86d7d8418972f0292d48686dbd68ae9bab1485f7d0894f764f982c1e468f7bc47ae747487953ad9a4ae9525b13239ed8de2a52d91cb45b00f541f839c4d1514b25f631579d35dd426463470b7c0bd8f1f96fce5b2578cf695b8c7b42c2df834d25a78f2162a5c0671b52f2b2ef958f552d2e5f9f8f985f202551792c5d1739b27374e0e9983fc338da9f3ec8c60f23512d7a585b92cbf60d80e3680dd8481cd20f3efeb82e224340052c2c2a8d993ead99b2aaf5e96bf1ef38dfbcc2f050e7414cc0852a0c954ffdc489bace2f8f48598099025d1e2a9e46a1e49d8d22c3b5af957a2022fdc8cb8475e6edfd4a464458baeb00bd37193a19f671e9a2b1b5e0bc79a3cb380f8e1ddc13220129c83a9e4ea89ff66e43f9e7d71a81ca967de245b0746767186c1c499f66062451c0f668dfd1b9828e09980d4eb9341ba180a69f26b3c9f69403953b9b08d1df58cc37bf01e3352286f97a6e8b96a0bdb7abb7273b4731af664a3cb0175b40c27fd717df5bd37753637f4b4a67d3648ecc8a478862ad54fc42cf07e722cb78416c81ee401cc9ed32bcc4ffa764d7974cbc089b2b118fc7145fd8857384a4dd4bf03e0ada3a80b1b7358035fdc6115a75c9afdaa58d604821e90d3fdc18ac3403c86b84117c76a891b2c901a2a4e9f5782fbca9e41d577e3d08cc99ce536a655a6bf70c2383ab3640914a696d2909f1c56f85adc1b4ff2c9cfee3dc5de1dd0217cbcbf8134c2bdf522d79ad7e7ac8058dd8022c6e99fadf4984b86b214eee68ef581e85fcae114820f53718e7628a34ecdc797aef4da81c82a1eda37495536d13677ade9c2c8e862545c48f037d2da9fc9913177279f9aa4b8953a1ae94e935059dbaebe87407c292f63d538478f6b8c0b9ada3cd0d37f618e2315e6310fe38ff128cce7a062e0d228 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000161464ded269f3e0d2ff8a755d029a74d81be8786c650b86f48c86bc0987026501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38e800f950a09b7e43db54dfe76d238b527da03293b5d11c080770a365380e5ab4ffffffffffffffffbf312247533d481e255cc414a4ab9513b90a5e16e49a4c9623605b5b47e2aae449f28a638621f19a4506f006fa0db923e5a0b5f7307aef52862273c45e26df8c29891e5500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c47a608cdfe9620cbb87e16a9d654134d7e4148220cfbd0bd95af1b7da03fec3e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611003fb7e9df4be5e5a69445f23494edb2fee87f250d177132d6524e74cdb7cf8e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e332955755b4744f30b37cb95dc2aec000c4d5751f13439a807b0f82a2af1fcf905ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085694713e14f2f284d56e94f1c6f064b994fb87e1b486d6e2aada97d0bebf3d7ae29863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0302bceb8621b0068a40939a7887bb00844f7a60300974e6e4e5dd9fe9b0766a400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0a1f4188919a398c5aaf56375a5cec6a20af70b7157de808755f84e83fd92d13600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a432f49ea65b5021ed2289504a0c7839f42af893448f4ac0644292d033ccdba45803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e185231ce8125e2316e32536a8538812aa30fad76d3e1f761d9a8f0a2e680bbd800f003000000000000913fa4b5921cf188be08c95ad5aaf8692fca99001b8fb5d3eacb426afcf53cf640f600529091d506d12a7bbb122577a5b12c7c5d1105328bca0209637818745d8345fcd7e6570b52ebb7a3baa6cd53a290a49b0f73c3c4483f4f2f4718520999883a3703b89d561529732d86b3a98794f39353b476701df6cc84242f56411022814f3655d33cd8e0540bad3a1bdc56b6b21ecb4a3307f9cde3b437cc10d35474941ecae8a9b22dd0d3e63a5bc1ccd2db2f9eb2592aabd195d53ebe02798b5e07863cb868088c5518dbe9b071d29f6606554f234d16382c2a631535726adc8228e90c984cac5ce483537fc8b3e36a7483b878a05862706a1c0ec4af6ea3dc49974a58c904db0a8e3b920dbdb3fbba2b99231f5a783d38452ad6d1cd02c9303929a4efb7dc62c84ea3b40acacb181f6aca6452916b2cd7fac417c1c84fdd7d6a0d8579b41db1a0436f88aa0c367784522cac0bb8fc64f98ffdd926cbce0a95e6e934a0a9c7667a4923c413ac6afb4833a4c224219eee1a5dad78ea4de3fe2ebd9ca5dbab2be86a68110be0b089e9d0da281666ddca8bb826779e994c59a63ea17d9fe88be12820b06d03912fc9699b52eaaa536d1194627bfac5b50ccdc0e8f84cba477f74ad423c521b833e0200e4e4e7d46d8a372876f91a62c5925f21f3541f8c9c489dc2f3fd33d7dd1be334fa2caeed469d5e0221f57d3b065b8ac1c90e4c8666e5f05410ef74759d046439deca313a0171d3d3c588426091a55753d0d43454d828a0b36abc5746f6ecec91df6c54e1c2d9a08cafffd6c2d0721f98e14317c0e4aee0557f29cbd1af539988f7bf4cb2584bc9dc4e0fa27d866525e2d2968db72a2e455bae94727c057d7c8e78166bc22282bbaed00cf45df4aac9f6fcb121a58ddaaaab74adfa01430fec8d0d091fc9f76f82073d11ce6d6fe090cc1136f468c32f75af27f86e7ba3a731b3ab5c1b1bfce444c349bd92a0c89f24667716e2b41cf648df44abd3da15f76cc659a72abd304cb4ade078278702eb6c272ef003013ea1d6c159887979e6150efdb36d6b26fbc0ac8d9285575bf01ec40d39abdd8ceaf773a0f73533cf699a4ae5d06148e464783bd26a332019551bc3bb3d5c9b955abc2106202fbdb68dc1eb5e79fc5597fc4ba592fb2c32a69a3e2f3f0fbfefa1b44f0356959b6f227ba2f633e5e71971bedd58bd35d9d29b289b76ee28dae2f86c0f8ab13c5250b56930b46939ee0116294918c88af13ddce36c373a1c8d16dfa1e2d869c6a4d3ce978d480482f031472c728b21d359bad22704f16868b04881b98a0e284830a94eb04dafccafef027f227dfa26326d80555c9674d64718418cf457b858efc0eb2a2f2fdac57551181c33033714b88968e47b57c8adb35ffa64d3e4709b4691613355925de26a5d30 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007f6a0464f2a53394877788118770da119240a08e83b97fc55aa68caa232d6d2e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38f9d575a6014036dd628585e6832bbfb1bbf9ccafc16da3fffdade35981fa428fffffffffffffffffbf312247533d481e255cc414b1f1c57027af4185adcb04354b65f3afbf3be5351cd4638469bb8750c8c94cc0a90a695f80101211a460fd7cc5f021b6ae4ac3c9d2973ced00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce6a844a55f4ecaf9d5d6a56dc6e77f2579ddca38b6d2eea2d26adb06424cee194bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119975e2474a8c4263ae50edd961167f83a92e6c5b02f55d0b49e10a116417e34b00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33011f2decc6a3be803af621fe353ad37cde987340a53f09da3a4d63a5abbb9a08ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856932a8a527b6503316965611baaf42bd48f27e1f10f2e43695f7a42b49ef5eef49863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a05d9d9b0fda4c47ff833018f346b60110a9ae60e1aae6238a38083504982210c800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0b9e624bdf2f9556e60255ab595331ad94d8ee1d5de126bcae7d98efe708f485700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4020f53ec20debfa94d6498f7204765fa798a85a01be1efdabfc51fffec64ff3903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e139bd3abd67f939233073b8b991e4cc53383ca37e20a084b957d60e45531a01300f003000000000000a52e2bdb3058d41831d0811f0bda1bb66b5ae5487093e1109471a2cf706d8c98a0bdf7163559f0e82c5211dc64d13949925e32d977264795ce02dbffecb0090f2f7c6479306a4cc0e2d8cb1a6ecae619e00f2afcea0f0e282ed342a9c457ff40a68dc13c42d7c41a701485ca4fe5aea7890068bac54d6b9f0f628caf9594f7280aa1d743abe4ad3170b0496071636a35a1ad9ef547912152fb393af9d70c78f2063965f02fce7c232dbd4df1b55a616c73203278f75e5daf991c8eb718e0f29eb2ae9c2439e1d40cf089b394287699e45962aecaa2d3e1a00fee9cff73a2d19ca55194d1f68fe985eac5b44a2cb69d8f916a9a544880f4d3bc00330a41c1ed6bceda2509e9f822edc27029fc1a7ca807ef383db3c4c86af9c0352902a1dc11b983bb297ac65c248c959b16a6c670f3e32771900c2b549ad658e4d964412d3d32d027916ef41302ee7e9bf0a3b46e72ca98075312fb81bd0c3d52ce12ea428b9ba71949949751336008abcb6c0faa0aab245bf8ff22031a232cb5ef29f49fcf74a3146b108cf545e09dd51b9e1c89daa37d8a8af2f3f14290a9a41b6a0f347cbf9c4c731cdd8255670a4044f6a36bcf288f5c95b653aea79fa8e4734259e28cfb6ec6f645f2aa249463331a575812aa8c568540a2f409198a6d7a58f9e1efb004b5cceab2946569a5be8f4c15666c6ef445996a0167fef7c4526cb21a04dce1c180d3781bf43d981c7ddfa189d86ca775a6ec895d5df1c03917761b14bf30d9ecdb3748bc81963e2f440911974732f72ab98272e20d472bd6d73109c1720e6e824b63b35ab8077cc9641da14a1582d20aa9dd51120438ee7cf6164e5225d98fb0e9c6a669f66e723121b6db71169c7e210c9f83e3820eb4a0d565b3c012d0c16be4f7511fed5001cfa1f819fe679f6c618e6345e65f8807dd1a2a1a7b3ec8771beb5238a7524975f0a70b68dc1329831c375a9fe72457fb01ffd6ec64cce591c04b5ac5f77d933afac178bd97efbfda393331e71f33a6ce0091cc239ed06c53d08f55a4d5ead9ab83367e1e9815675e738454ff17889ba536a8bb01168e15a93f915e8a5a726562fa4725a0edc1d9ca62699e814db4bf1f20520b65d013a0b6b8f2373f9e1c200d9c440a04c39428e7004a5724baec68616a4c2461c68e5d33e7e692749a172f39ba17b59bde3849d23886e9d28ffd59659425dd54e3d614f408e3d1d3a52ea3c555e39833a3d199ee324fc28bcecc906e19a23c08288e1b9dafdaf60650409b6b73a4d74b574a99a73690a34e3f9ca840dc3da1473b2944fb4c4794f136195f7f906ecdb7f0a4a5d33e4d931efccab7b9cbe56a6b7589cb04dd72267b073b867e81cc70673ddc890143603b3cf3c6386e0b347469065b661a6492447a9e442a42ecbdda833be965b25a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009617a31ccb8d6b96d44e1d1b846d8fa5c729b8e10e2c011d0081759e9b55410501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389f1adbe672b323745c3970a66a1653e1d94597e1d15c592b462187a030fb8341ffffffffffffffffbf312247533d481e255cc414f2da4d9dfd99afb8298d2b497df5fcfe3132d58294d820072224af1fde7210513f16006da8b90f416aef39dfa8735a9f8063cf552ae3494900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c33a3ba231953f1e69f45cab57859c9e9bd51bd8d61a0e42de04e0c57821165a74bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e5d99ae248136876fe43e356bdb5ae6767bc15521b5503a1d136796c8295283800d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33023bde539048249ee14a01a49ce0f616dc158083302895cad184d0daf8074604ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856993ab870ebccfe652be3f7d2a0ea9a10f7951917b7d78193c5b236b96cd46cd3b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0b20a44f6e9d35b1f0734ae1f004934d4142529104cb437e5978be60708276da000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0eedd3c17050c77452816f95402f9b3b69461a759faaf77c10cec93e5739d063800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a46a101869226caf8378c8d1cb04d89fcf4f63f38c6f9c1718eb0dae0bc9edb11903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e505c5dbe407116146cff4ea70a3adc8862d36dfb08bb76cee6ed73fcb952eb0900f003000000000000a246f0a7552d2cfc09bc789cccc6aa90a3a80f1542a71ca91cbee24200b4280d018c0b45e155e15fc6c3a0e58d45e1b6a6d18f94f174792fa3883f666d2af7df4583ea04b9a57bf61d44a5b56a4c8cbdee3cb4516c14377a9f7a37f1a5daca18b6be51d738c3cd79f22e875bca07dd27e6555fad615e9bed30c243e2849f4ae119d1886b66254fa768658bcfd3e0e0738e6004ae0b524e419cae58d6eb65eb0562c32b07cdea579eb4a1cb22e28afd4a366700c34151f46484a0974f064783be90506a0839b8e2081cb4e6c229b995206f81e5f83ba73b410d23b7fd692ecf760a29788e0ba52e3b5724d993d907c318a22f3e9152d96c53e93deb084acc4ffb300746392b5717f8e57fee324fab451c540493eb892fde42c3940147b866cd279451ce7d2247012e78b1849b549ab1d511a5f0bbb5d4798db5b4dab9aa25c4e2c9f3854568183dcb7e35d19a7efb709296edce18191fd2d926ef1564dcf280c68e93fa659b114c0fe2e85e8145042373eec5afecee19907d7c0b7ce8cb8db65596c07c1e6c7414a76b60431a415a547a5a68319c9c3aa540c2a905e13ababd48f9c5c5c4a5a57e2ea6a8a14e248fafba81a6d38a6da8d5c34ce1ed25665633691b052f32736e3a25a9aeb9c81c8fa80ece00ea6682108e53ba7bd77ae04dd64380cb8e75f0477b5cef4ecf73e1723e49d626514d3bf8211405ee7a540200549717ce70c02a3b6958955363bdf9bfc5b177be8a595b9b79e1e3869f866515e9c7d110907e1efaa3b3957a2b235e6df96fa6df6393ba84bf7ec35fdaa3ab69ac09e5c8dfa0a56bf434b80f5acc465b621e22afeb376a4c809eb52e6954bc9fbb27019678409bca9b5b07bb9f8fa289650a76bc40a5fd0228bae2b920533b09a9fe5bbb9c616dd876d25e2d5b5f171a380eeb5c37bc460a20986e6d031fd1fe294f4790d5c219cd53fea0dbb9f93288680af0681f5830050bcb30e10e787bcb4b8e48caf44f2b9c9fa01ded180b77a5365339a0d5216fc1d0bebdeeb9b6559e50ca3c9323705271d1a4c78ebd163b420a39593d56f89e9901c9ea28e32750610976af936b4a6751c3eadf49ab8426bd264d89d7e897e2d10c47a6f71d77f71ffe2edb690f9c30314f6313d14719e542d0738c43a4ac32fa9819bb131ca0728e6ff0953b89b062b294310b48cdf52a8c6a5b9330f3347eb4e1eef171ea8b465a3e8e30d24d7c6696c4da0d33d5170017077277e4b167bf84432f09f10765085dd1262c21df6a1e59e7153adcce4ad5626d1ccce4409e5a12c68c7ad4b5b53e05199b06ea5acdac9a747337e2086f9feed147e3194f15fe8f57188b17cf78bdf4ba9251e78bfc3d65c065adbfbd743fca7827df1f8ca6130d503c884e22c9bba9b25b66a4a9502a1b9706463f6319def5a64a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cb8a70c6cd53377ae2c2e3ca330e6fac826ff935400f20f5739046b08820e24501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3896a6f45dd7b098d2a52ca5a150e9c547052ea337a9ac7d362e52db2288d8ac69ffffffffffffffffbf312247533d481e255cc4148c11ffd216539f3058e6d0047ec40c38a80b6ef927f566e08e6fda412b75e7f7e64ee0ecfb43c2b2469133abc8521336cb75d44d9bd32adc00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfcd125aac8723ab8def87093d8477bffaf79fa10c97ea8157d8cc9c66a9dace94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cd55350ae0135727a3a02c43a2a88036bd905dd864beb5cf25e8c1b44e413a8d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e339d5edd50dd0bbb55283db06d8f740ab021498a26ef086b95e70a1d9bdfd3cf2bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569857b398a781599815ba95f4c3b1b97bf7c3688e8a42d1de645b6ed482c007158863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0e836dda51a413508444810ab45c0174b11fe6609ca6e4279e21b938d1a50435a00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ff175a988d1130f0b6c9c9d6e9505a5e4a77762bab43db6412201fb4db5991e900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a47b71c58dc69c00a71cbc88b22a66591a50936c4aebfee5e516aebe6a2bc2fb5103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec50857154747f5200974f7e3c8a083001d1cc94850225cf2aa3483888948ff2600f003000000000000a20806db676cf4868437b5a3b16b004d7e45a2b5b21556b31d1bce058bfe4eed4fcecb3ffdb90840473fa304bfb7aa2c808cec91026df87d0394f9bf28ebd82f72a2e99e20a21e137f089e684f8a99b2862a8876ffb0dff1c6e3cb34bd4fabfe87814afb683433c9e4882b00378684872f244cf3a6104ffd9b8e21a7d5e224a34cc9b36acf6cc25a9b761bb6a710f934a8d2cefec436fed861c98f89bc055a6fbac52a5458bae09d986a80622ab77aac0b8c14e26b38669a14515d2f4bcaa091a42e886e6d724e8cdbafad16401649d4b0453fb944b14b44bcd4995ed6d84174b37cb435260431f234f5fa3199a819ef8d6bdc96e687e709ea1937570844047f6e1498aa5290dd36d17d7801af833b9cad9d0a315647c18417cf65efb4a1d191b65c4d8dfb7f889bdc4f9e1e02d9c6c15042575f937520ca1cbdd08e6eabca36fb63a644f1bf7ca78d4804d91bef4b96a2d034c8bf37a3f22678c3ac3487401b0742b9b4f29a3fc405f00ef65da2242ca369677137ce457ea7b5f3d0065319b3b89d8c171d6a1c202a5547ba5634feedc7ee756c5affa613e7525bec0db8fb54b241f6cc8b718e7d2db96f00d65d6819b44672adc0435f17fdbc28cde7015e020ffb96e35bf599ed86dbf61c4333d5784dc55f11cee31f490f542fad2bc37f92a3e922c586198cada09d9fceadf6f3962fc414100f7f8c14902dac1a62e1d41ab283ac66aeb0ebf684710b703c82099ffa4a7b60298cfc9e117a4a8e9118589b5d51e3f3939e28160ab765076a1c0860e44217be3c3a61ef6a17058433824d1730a887f5c7e2b2196b4a9314d508f2459299a11ee239a44960f220355d5b372dfe83404e6391a88fcd0e73ee9c11b51913d605bcccf1c57798a50d629851f19280a5033e9c663f072cd796c044bd314650aa14db9162543d409191c805020cf5076efaa75a0607a48145d055c15afa092d77b67babd67e8e71d20d34759b634521782e9c6c02190ed9155e34c2eea40e4532f0840491f0245acf790b4e3073048de73a68025985af0745f7b768bbe65a2689cfffe6f5c664ad453677c86514740f6612d9d42878f2d4b53b2b71220e6cabdf5a650c253147e240abbc7487ea6a2f42f04a4910e47cdd997c6b8f92d51ef55077e537700de8b6de3ecc79c81cfda7b85548b6d4da5d8fbc7855866d140d604e09f272e85333ac89d3cf9578fba2d33ca693476a906f794db07cb4f5c340d4dd3d51b1e0b921c93f6fda6420a6ed1e42d931deb6db319b49da93f48869634028733add9a7c0b7286ecdcfb3a86ded45ba534fec9b2ae64705af824e3c63a6100301e85d0287259c0b98d234de7d012d609392ebac8e9963c4b93247faf1b7f1587d67709bc8c3f0e7b392a38fc4d3c04eb930ca573d675ee2e59c2c45043 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000eb41ed341c6c0266ba479c0c98cfc28f321588c2e6b9a5ac58fada88bbcb393e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38b3d840289978c60932d8222db0d49cf31587f973db5b92c3bfedfb81bb1dcd12ffffffffffffffffbf312247533d481e255cc4140ada5f65b16b56760183e6101442de63b1eb93ca854fff22285ac4e56288e901e6ff841e677c304f9b9163ab7a82997e38af03db855f198a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c74ef9b4c1258d070ebdaa6a411c89bf91984f47a6dfe71ee37a9eeafe496a5284bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113e98f3d38c3e692a49c460b54585e7bb2b00b471376e751f57f8d1961e2656a600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33ae05dd35e550c80e70088174c3c64a45089c06d0ce414a28bb435c7fa2d60116ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569482b4c9a6a9717fd0d63c7d9d36a2ef477ff89b84913687661f4ba5ea822415f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0d95c407bbd2dfad71cf974a66d24c60f8276637ee41eecb62d3d30ed6f91708d00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b08fab2203ca939060d0366b113877cbd7c9123e53aa0ab501c2c830b316ae9e3f00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a47caf9162c1b4604b96f72634bf596210612754474d961c3ccdb114a57486783803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e655a27721cfb6b170e79a3e6884630efada233eca1f34493d852be52ce52a0a700f003000000000000a43945ae88ac1466aba71da5de478344be4e9b565c45878b5ae707c87c55c9759e00b42c40675c92cb7deef97cafa2c785b3dbc9bd820108201e532e0948955a162a3d87aff1195cefdc72c8b0b1dfacc12f30542563c773b7a2ac00f9cdbb47a22bdc27a413f0fd3b94c72f7011ca16d03a766fd73075390eecb7162de7e01692cbfc33d787523d794a8a0dd6e77d8581034081cbf89cb194fe600bdf98201bc9c6a03416139306ac4833c41392d4faf93c027ae82fc7503bbaac501faf40bf89d803e91bbb1a251b1cddda77f764fff1249041e282fe70c2bd736957c836eb69652dc3148cf547f8b2f00ba6dbb621a0d4c5eb00629efca3cc4a7d55adc12c3c45d29c385c8503cd152c6f876e396c72fd0f604d633b800c859cbaacaec502afae88170e6386f94ac06edcba2f9776920d96f1496ae3798a07af9693a96e133ad89977451241c92cf597c266be1c4cae38552c263b6ee2cb2876f8705490a7e769d3d54efad96bfee3027ee826f0d966acb7437fc396b4e7c769a5e043ee75a9a74bf9b5e771c47e25fafb4426948da1217484b48abe8c3b9a6103624a9f0eb4efa8ab76ed5ada146680835226012fa223a16b8ce5f3954e2a8d5af10ee1f90b5c31a9cb27471c06facec0762f4923f2ea42cb58125b3adf96d5645574ab14af41fe19637cd0a7693a7e615579efdbdeafca68d4c8010a99448c6f65a5ed6719bb78cfc2e6c1e3846c902972fcce9cf0b7a609379c3601302784ab8074fc0c119522648482fc159481f01912554901d703fdafeb9e44c9b7d0e49dc5e8b08991b1659ec421073cf01363adc824cb577747f877990988f40120c87dbfdf821d675755bb15c0be2217fd6d5b8483ac07b29da548855c6dd696156ba21ea40a7d5afa3eee8badab72051a9a3b55b9db637b519f750ade0fb14b1745aae1ba2d544b97db32e40fefab084312282d36b750b7b2d83d1ea105b9d50e73f541c1f59016951e6196275cdf88857d2ec86fb85e06ebd10deff08943a97fcbaed55a0235100a1fbc66421365da9f891f28546f022511bca1c0902d63476105a41f8780b7539f62bd6145b1aff74f79b9d5cff0392f9b3616340cb645944d9fdf454a468d2035426fb81f3f54e4f07d1d037d9b2a4ef2047ed67cbb57ae0eeebc51a58327f5ebe252170d3638c13761c5794136376be0b84e5d2c332afe72438ad8f65722064aba61c81a52df06c9007f01544f73f88110499f27c6f2dc60631ad9926d7797dc73dde047ea692bf988551d5e366741902d1d8075173aa651ab844018093ce8b05eb2588367e43c9522a9f09a4a53f0c5775be124ced2f071625684c139c6904ace9f107292c66204bf68b8050a13ad67f31bf1794cafad0cc0eb67fabb9b8010774dd9ce6c68de0bf1ae5e75ad5b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000000b7262a80ffd77518bf1862d90a9eeae1fc626d0249f1c3c4c084e3ab56996901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc387d1b360f099ad8038d7dcf0ba7d5bad97a8ea21b42db13061b86d6c23d245819ffffffffffffffffbf312247533d481e255cc414f0dca50234bce73fdfd10e2b1c6a76b3e029bc6885e2d9751a60934a532f93c9296da4ca69267a8b5fbf41b667721487059d65116f5d893b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c391514a74f336cce616ab296071a7d7c0dadb6aa4661815f81671a4dc7e4205d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118eaf06ee57e8d3892e1631299ae7bb83f20d4a442daaf9af017968b47817d23900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e331cac5cd2f7bea7f199f8a1e3814f333543a4e55b064157d8161bbcd98653e16fffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569bee70d0a3979551627f4ab870b0e8b476af011a7513250a5dce8e16a22457960863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a08e606e0f4ed4d993d7917cb8815e5fbe65d3ef4ee61fc01f4eedaf9d22e11f0000e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ff96a1f751c5d04e0e4b73d6966e76426d046e224c5c110dc7f8201e83403bbb00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ca76d23e2ccef892bd6c5b09eb2ca91f91869b2a8a53274d9e45232d463ca46f03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e682a3b9f0cb9c1b897d4e6f165b8f53ff03bc79b821d276b1a9148228a15270200f003000000000000b4999f6ee6b74f053a25df474721d0559eaea1e8985fc750be2a2e2db166dc5ed82621e263d138c6c3f567d8bd77927d855a3dda886c1eb3689ef23355422afb96c7cdd814b70552f9645da63e23a9c546445ff962c3e1020018c75e55862426822f2f1ca329e10646773f9055eaa239d7fe09e3fbde1c58865e39c6a7e607ecf61cd5efc1e5c62ba32fbe166b9012e9b03b997df12d1821fd6fb3a073e51e1b1a16e347fdc37f93184613d6d7cc64e5d7578d597cb96c65b1bf4aef011d76bfb0fd53b8a9dde68f03ab97beec3243b68ff6b70aff85e4eeda107d9a50a487ce3e5291c5eba7cdd4c1b3e394337dc42e98bfb1afa321ba9b1f17e23bd988210d41eabb572bad4dd05fbb8428b4850a780bc0e843f12b5cd30d5385ed83ef3cbe871c85519b3fb8b657b909a352d8a1eaaef9d04d382179c6c0f93493e3f5e8c5e0b4df37a1bf423a58a031da570a27bab8851a434a16118abe6875c734c229c2aa29df79098524daa17dbf7afc7249bfc8efbf9b9f9565500a6cd823a640a9b8a584129e56d54328ae618a65f7b5f423850a26b7047f9a03398c6513f4ca18fe3fea56f34389da630e89c9cc082b613eb25cabb33435f88d366400b6157f7704914304746825accbf7e9b480404ba33594e034fed5baa15c7c3f9c1a615bbfcb8c555fdd5d35271ad8ee8f70313afcd23ecf6c3e971a2a930e4212f2f1ac96bbf6e287075273af370509f3a5300400ef36ceeb862e9cd346cc1f567067faf7108851493fa313588844bc70b215c9af126f32f1a6bef9a64f63704ae2bf48ada7b8b8f46d3b88d4d4b223fee4ed6dea51cba2cdd95e08c670a6245867a2e9ee3903bef32a017c501007da58459a04815bbef23febeefa7f646f411fb9182e5333556996ed9d56ebbc909cd69579acdd30fcdd4f2746e090a273df1431e173c0e2e4d99a3c5f63cc6b8abc1445a60efa713374ff0800500106043a84f53d541005e1cbe2e21f7a1c6fc13448ddef532b32b88c69356b385b8a26524ed972715b4df275b40940d507df3f749e6939ccf40a2c7612b104c971a1ab846ae9ed91d2010428c0743cb3e568f8442285013d2a62700629978f96977db3ed701350a567b63ef32aadd51a6c8654afc7351ee5bd0f161af1d96114c03fc3818d607ec0b437765abeba7c58d6f522ca058122986f183aa4bdf49fef3a70c96e8e8d72b71442636a675685577ba7c0801a21ec8dd71b6ffdcf21ef37b79b940ee2d8df2af36492df808c06403f0ee14dc25cd5acfe6f2658871dd6a1a597ba12ef43fe7e20e812011016a396ee422a6df55eee5db540aaaa9ddcfcc747d8528c4e702e149d737e679c4e3322a071d0b8b6dfa0567c5833f975cc41caea6a1f3ff5ac4e923ab30b40e14330e6e424eecc88ebc01f5e6b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000016e29a7303eace42d4b40aef5ef84e76f195ac83c6ca14d750688b7377846a6401e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3894412e3002c36f03d797e20f61ffefc6ca210991fb463cc9852eb26f73040a07ffffffffffffffffbf312247533d481e255cc4147b11a6584bde2a8d8e8eb7a004c3136600ed14f3e7647f31a254e37bd902630c55266c75159ccb68ff51f848939b8c5f4d01ca258751884300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6074c5d159bf37f2691fe6e1f9346428c050c4b5c634dbd0ea05b47272bd9a5c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861191c7f2be85512aa8c83eb891eb55ae8c15ea025de9547be0b22663f87bb3093200d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33da1568ea520557f90f7278e2b5ebffdd42553a5b3da4e3f42628d5beb06a61acffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569877add4620d76c39178f0b2e70aff781c6f7818208f94b235054a79becef90b2863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0a4b58cf6cf9dcee26f8256100bea10eeb5448993083b0a3b85975abc4288c7c500e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b08b68ea43d5bcfc83e230de1705fd8f4a9b52b432d609066ae68680e009082c1800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4f2946b290cbd2895bcdd814cee05d40bac41bd00600b60a5c07ce28af7da218403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e5d9e911ad4010d0fb8225896213b9afda9a3e28cb19e980b19d4d62fe3e23d0500f00300000000000086d2e69ae127e414e480b0a32661f508ebe9af492aa1a66778249f77745c5f831fb2b87dd5ee2386df736a6893cdb3fba4672ea8fa2c348798ba22a0485464eeb41d296e759fe5576d7cda0fbff69bcb973261bd305f24aca26b5848ab5806bfb63bd4c1d734078c711a682e558a793ca0955ed1fe88a1cd48acf6b6acc2764d6ea4a5f1ab82bee810d91791fd6fb474ad68c3099895702869ef583610fc6354041f98e944b3af882c03bdb6ace23e5427ee6140c8a78a12beb7a30411ee2b0eb9f3dd244d92ba93e70b6f944829429d2ee15bbebaad3a7c9525f07a9dc66797dfcb9a8b0c66e1d29ec0020f23c4e686a3ecd249daefb24bf1e1db2618d6225ad7bb26d27c14e98b3e0a45838d96ce2b0f6723ddab889ace936d3c1fbd87579ca44189c804d2f5f24ef7bc5b75254ee5d8e25ffe37ba9bbce7543a1b0582831ee492a84ad93504c9da4c9808d32a51f6b98425736cbccfb2d643cd53620479d2d28a26973caae946a4f649aaffa2b74eee9ae53d590a6303920a7ce49077356f8400350ecd9c8faf7d38a232f93f14cbee0dea0c59f769d910337c16d9e79f17d7e958a98cb5712d4407b2939ecf78ee86f737137d7a0f554bd7a794500b075156e98f7d8807c36278f1feada8170fbaee240e550b170007799006f4dd3572b4afed4a9a9944170cdcebc790a0ef7b99be585530b89d5a8e3f0b009cc6d2999757e3916a1e96b6be90bf98779f3205956d579d808730a0d280c6657a21fdffdc42617e653d58b3d7ed0bbe4d297a104769acd5d9b700221ecc8a39adeaa0f5e43feb5624563b85288cd05d034c5be35edb7818d8cd3c4d13fac00cc5244f46415731b3e43df2421895d039d5ff433315eb741be8e6aff3173567e5a94cfaf650c24bb7517cd7ada2ffed18676a134924427953504561e1e5c14ee0884450223a7e97e026527968524453d502fcd78d1a862dfc395199d1a03c1dd2c848d239921328cc683f1c68b6d2ecc7441ddd992213ce38b5f7148065767f78fa6dd66075bb5b1302945ea8268c2c9968330c3b5ff83eccb9abbb9ad9f7dd5c594571d5c7947e3f2fa8b416d2ce039ba95e8ced3bbd04eb62c44af330fd81c569137b5305caeb098f437fb5bc60dbf362fb7cb30fcea9fa2b9b7506a02cd96000a7085679ce5a275b0e3a2dbe4e81c86167715f71c1913b3270c5ec5590ce9263e5929422d0e61c3a926e01116d2360a366cb1b2e9ca5767bf829b09a83eb681fb82d67b72bf31d450a3b69fb539442ddbb31ac407129dc3f31f28fac2d23c002c39abe74b1678719522e84b46de940cdc9b5d956f3fc8e5ab45c6f5ee8bf9fe0dfeb479415a13fa0ec2131f7311bce2db660250ec7943fc34e5c9fc00acf1cb2031a493293366d81fcad392752a49c564a7bf82b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000572b67e5fca1755d5c3a357fcaba9966fbd27b7190add43147122dd3063bed6b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38b94781561631abb0a758302cfe71583c955a3c600bbb91e4b443b5dcdf5a729fffffffffffffffffbf312247533d481e255cc4145870c0fd597b275604aff1ae5a191c0c3c7146637fff0c4b95c6572761f55a37592868934dfaee5b204456f9d9d7680360ace5d32c30d60b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca1899bf4efb415197dac1d3f790a96415ae272f185f7536be2e09fa1dcd68ec54bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118bac9c6f8ecd764f6c13a7ffd72e26920b39875eb0aef90ce7913bd527551eca00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e333f4065fb7bd6a109b2ff77c14928658b3cacfec007569aada318061a1b74ed70ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c1fe0bce985eb65dcd68694f9cc531145207c129b2e297290e5610ac0d987514863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0915b17f6b6e26203047b26bf202ccc87a4673eaed244b17241f3d5b395119b1f00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ecfaa67a4f16d9c2d235845fded557938d1508b862f9b55efb7c23759c1e1bda00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a45711d0b5d4e13e4f32064cc6cf95eb960f25f00b90e146657123b3261ef4e11303c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e0aa5e34dcf47f96a3cababae4265103e9bc0e8e88b15f3a5dbf75c116765485900f003000000000000a95e3d33048368b24673c4c6129a2be4965a5a1711fe8c7ea59353708b363a797a0d3d8a342ef6ae5075ce874dc7384e9036c3c628b82e8847b7af45e9518531b8df307283d742d3c2ecc610d3608d1b2b063656fe390e3535aa8c8ba224dd17b8a6f2d1e4299a54490be9a74b35e0316a9e59addb12f2f612245b6727a6746279bf3e4f8ad24777651e94d9a0706f1eb8bb2af94984691d7f376b0ffeada0f21b5c11faf129f610a3a8f224429d2570a4c3bde36e7fcbeab2016e79e2d5dac1b6fea0a4ee6a737cc126352e49e7c8cfbee5cddbe696da429e9cc5e3120a61350015259393ab12559d4d3c288031bf94923072fe290c667d0f4a28d2aee02863faea3b290b427e806bb6d1309eb9a2597d5abd8f1c0d21fe443f0b0c11a82765896959f1e7b306fc5d70268e840f63196d22126aeaf6e667a659c94607c9219f9bdd329db0b5879fd3f39a14455b3c9eaf22ffe7ceccfd572fed95d4a15d6a198ac037eb1627732d58f0acee0ca972393366075607298ca0b164dc694b460459a2d37cf48e79e43b84d1784cd1ae01f84bc67b5893222ed77f959d6a1a2869b6067b1f1622ca059c8876aa9a22a21e8c93addd1169274a8a6d2693c7882bdc2079d0e1b81fdd19671d399824e4230680117ea25d8db7a26c573f3cd4a011fc2398acf3567f98716d471e2ada73f98594ecbc04d03f54ed4ced591df38e6a6fdd3ce1759ec0496c048dc360b5c745181533b56ce3b1c3a94610c3b1e05a5cfffa117db192f2477fb7c97ecdea8959e2159290ddd1ceed5121d7e614ed57cfcd08877492cb366001552b093203a5e82d14e02ff2d02d03651c89f25ca56736c65ef7f7ae3797616e728ed6f3a39be5c2042ce66e1c0f04733c116c1acf2162297c1d9c682c016932c13da1799b16c2fb68b735144d41f84f40d8a094f51e153b7ea3118b704b66744bbf09d925eaacdf1b6518aedc0cd0b81083d80d40b280587930bf20035c33968f1e76a0bc087ec6152a2b74cfaa182a1b47b7758ac308312959d9407aa88bd2a61035870555f6b254b612fa18e9e1e5afcfc9b477ba28a492a36a08efdf411f3b60aa39d946a5ea3782a8817f3aa6e55005ac43d3720892d537e92bdc807e8dba8b592fa567ff546d0caef12e09490712f48f0c10649bc0516cb5eaf6f2c7ce0e4e22a165ce4d2c319ae9fff5ded26e6083da81cd2ec140aeac302b8633cb287b651ee93a1692a137ff27ca89d48de866e2621840a780bb344ad7e6a6d3ff138c0cda3d3b2ea2073f0268a956d95bb969845e8bdea9b408944436268a40378934853412db0f8b90467594b601ead55afd2cef56381c6465032c4d161818b9c966aa3286851f862d73291c49b078fd2acb62b4554081eae9bcb59d91c4f2cd3aa54a3d93215a597f4b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000432102639517a1289d8945975216da09be8d8105e1ab99d4ea670f1373b6bd2601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38b886a6e19cdb2ce7c90024f30727cc940dbae89c3ccf2e91ecd06c70ce7d3370ffffffffffffffffbf312247533d481e255cc414f90a039644324ab61f7220d25bc215b7e1414b65b20de91c975abe21143e211971d0dc66aa48d12c04a12eac4f9d9ee4e9f092fee948af6400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ccc5beb7e1ea55e1dcf8404092430d7e27af7c3eb84dc0a624c14ce84aa14362e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086110e95d8a0612995025c002d5a9fc2fa02cfaecfe63f3602461a22030339e7e11900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33ffd40de299c56cd1ece36062f41f1f670f86a1778f455bceadc1183dac069a5effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569a251929e6bcc558f4c6a6bbb8fc6e094465df74eceeda778fa5637eef8c36834863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0f014451ea2f2be73306b486fc6d957ca1dec83359da435d1e6c054a2356e350a00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b045c3f7f41dae3b11a1fc885bd04a00a060e023b60ce397e3c3f8ed951b406bbb00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4611729842923a2dbd70525f95870eb77b4269496cc3ec5a51ff58f03a986329f03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54edb7ed84453dfc1c50c17f231a19d021b41d0f63468554bf9b96c44ca1d46851f00f003000000000000a3e32c7c5195bab6968b71a3b97dc13364e356789013e00815e0aad563634e6f713b49ba6834f96f87f7729e28b7d0cea5f3516481981edb20dde824bef9d53f801d9864ce6b2d93abec9f9fb917860abf319bed4b0b242839ecf5e2fc235fc0add0f0b55ce6586402e0783260007589cac397115b5d70e2488a77fc578a0d1363de500e378c02326a40fd8d16a045c3b547a68336dd0f8ae6d05c1f3a681d04e957b4e0b3505e38480e41f5ffed2744b8dd83b3ebfdeb055c980322d127521c918eb964c9d79bd556ef01d3ac5935c7aa7e64da9b64a1bcb22f8bbd8ff818c32ac0ff28b9b55e0ddd8f4c3d30909148830d7ef74ecb7ede6225c1f42d556bec71af5e82f8267f4394a217830033d6fb54dc51403fc93dc7e0018699c8e211719320503519f0da262d74eb2b10b8cbab901d3e4a98cd94947a300f8af15bcc70c3f46b9b896914dc54bf96d37895f339b4cc05acb81431f24ab6e3a7f965db77c92b59657178931f3a092b89abe3c7ea8f23a085ac8b901eb41cb2a40229032aa77bbb8c6482a36eddf648cbfb061823e37db69f177002cd3862a3e01138272ecffd31655debe51bd4d82b9d7f6db73ea782606a865f4ebcbfbab73e9b00d9ab869453fbd34e8e875c1d8a7a90ec4023997780801207c3db50b1cbba37a938448487ddcd1c83fb778d57c4f772ec4dc7b032a392f6f5d811c9cfd1eb244c45b91f5bc1f5d688a844e425bfcb407d95391c74c34e0519c262c28ed5149c58078fc0547c3fafc77b8df1ca134667439f097d362086b582fea218631c643afc7795dd7bc365f10a904006b423e2f0b4b83785b8b33ae5e9fc001ab5378eff768656be14a75d421d41fca94bbc9689ee8a10d06bb59413aa3f6a9c42dee1487e9855c24a579bd976a0598817fb80e2d6693e7fb9017f8204c4bdf3b87d0e69f0e8bbb1b5ce9d9a5a85c90399706e21327e4e2791f1302ca003134d2aad60d5bd792b88916e7f0e0ac9a37e02b5e5769a31302f3740f672c2b508bff5f5776eb05ce07cb6f523bb83c49b7c7b45fd8812046da51bf799c09c2c3be0f2e26e7a1e056b7533675c6b91c0ee4408c0a6fb431572cd5164593f3d99a97972ab0dfac4d161bf319517933cf8263e76412ebe8ab1249bf7fa77aafbcdeabfb278cbfb9b1c6576afe766312cdf434f08b1d547d63a146c604ad959fad2dbfd3bc1f3786fa1bde3b85e909a4acdf55316c3b6ce604d675bbb1435013db55e541a0a8fa796fbf28c9b690694099e032bef5da707e58f5b8e927662845da9bbe1e9cb9f11fa320cfc50c5f18db274303adca607db64576f36a216eb7762b443af7c74b5e67b5a73f1170fecf51a1832f86fd0b7667c1961039cd139502100a67410a29edf334a41024cf2121923fed824d1760abd080739 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000010b75edabd3c2033d78017578df85a601ca9b5cbeb3baaa58200f70d3224c30901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3850a1d3ea1d10f2b8e498eb6a42fb17d3c0f0d2e4cf95894ee7875ccb4d7c0cddffffffffffffffffbf312247533d481e255cc41460875c822475ff1fc3b4109f8de8a510e3820e85bc6b4e966a6747a9c59b460ff0e48ffc76bd331fa85942e212de737a059551e4a542e35f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c69a52b986420a862de55eed25bcc17ceff4a97f269ab18335228a94fcafc295c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ae2dd0bfa84fe77d1359a5be56394cd3a6a0b21fffcbfe30dbb7ed2002bc5cef00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3316c3260d9029d3ac66788194f24a0ecc7f12d472d8c873bd912caa601a4bf55bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085699202328243f886f245e0bcd7f491c2feb5c1449cf9ee134f5dd66b09fb6895a4863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0080efebb92daad87386ca66fc1137c3f2286c87575530bbb5afcb0fd093efe2900e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0acb9719732174ccfc7397f5c6def462c552644ab6397162845ed8b5e83d6825800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ca371b3f42b0208796d1705a1971dbcb14a0aac882a1d70a65fd2fe1f995e41503c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e035fd8b43b64719673889043a0890732654c861b5a9f6418dedea2bf46af1aea00f00300000000000095814d9410d9318b9cc3c2b96d74e0282c476ea72ec1d8a4f2f513ceb7971d6acefd80100e8e2952172c74091001d0e090218bdc4afe0139636fccd62bf6c4b48d60aa2b3871bb73f1f624d451528cfb67e2fbd1b2fd3cd8f1fa38a039b6fbbc81175c1efc814dfaa33ea69869eb02e0050dabaa5e8336fb6782ba0d7e1935baa1c7d10199b7c5a8d459475337d04378a2ecebc438cad7462b53a7cb2f764660d040deeb30d05f79ea57e7076d1ebde2b3836bce9b37a28eb0ac23a46ce5ac9d96f0cddf947d70649991a047871a5e7f73abbfcf600c3ff918b5189a410df5efcbd9ecc89db926e34a81cf04c2288f6eb3baeb956767f8f461c4279e19c2809e286424c3d41731c8a53d15c78dab39c090211c05518fb2f7ed02f3ad50ee634191d16ebbb4d623976d2f85de5ef30da0b8ae70586e7c2ab621cd21b3bee626178107e702b70176f9d33bb0e81c2fd5bb95109991d2563943cacc0bf9e44e8e350fbe027d107bb4a8052352c46fa6cabc178fe4ef000508651a67cd734b11db478cef708ded8ac9dd9cd97fe6277b4b9bb9114929b46072eb985b30cd6da8a1766124eccb93b2464486f2600f638023198817dded0fc9d6ab238fe54df60b13c605a945427a57b1d47f9a694f3bd8c51b30c2c0e43d508836c351da73d2d0104aa9630d5a3158e351f2ca12b7d06aa2e9f6f31fced6066d3e1d93d53f47a6193e9391a27284272123c2134290ff91ab3dc4415aa9496dc6ed8ef9df7d2e5dbc7a25b9c1b29f439e2abe2e8e48e98f8d0c94e109ae3906653f20a20e21789b710adee6551938c0b4615b491e6a774a7458b6b1e672af393c30927e4c16c77c07e5cbd56c32889cd1ea74df9f232d619a1517dfb5a746e7d50747eededdb71df2eb7a04469254208696fbcbda64a0647c4c920cfd157d038e377911aff543b9f11fb852ab6a2ef5ab687905d71904c30200a5f6e2f9d836c2cb2ae252f351cd95f9e6472e07122b77955354346feada7469d0b65e54c737937de70b04198ac73d5e015362ec9b8e7c4e7f4bda4f485bcc6d83fc088ab904e05275e14bae257be1bbb7210130fc65f2ebfbaed28651b6ef60dfec2c7e13c919c953b03cbe3c4dd1f0bf6b04f3a6d7994dca253811094e44197fa22061b8f0fb771ce87bf469fd56bf4ac4629e93b5c76f3a9536d668453e1076dea9852160f7c58b502364aebf5ff2ae75102649b1e8e8edf41f728953f5451cbd5ddd96be76c24415db7c933fdd8b3d5f9d9b53e74d4545822d9558876f030223c1b368585c6b81c20e41d99cf989f7ba6581ee3ff4ba385d803b783a5d5eeba64226c7848e99641e31ef8916cce70b7d3ffa2b208443d73f4184ceb4fc3b7eeb480ca868a6cebd6de6da600b3fcf593e8697d09ef272d40a44285676c30a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000071f11ff1664e9ec6bbfe5d9ad5ab072d48eebfdbe8d521be2d9b66716fc6166a01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38ee57f61fcaee74dd919053073048175a275dd3e307458011ddbb41a37aa430d6ffffffffffffffffbf312247533d481e255cc414d55a1c386b27d28649d63e00d4d9451fedf24edbaff2a597069466cb390150b037c923d35aff99462e182719f040b2094f7ae869c5b8fe9700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7b9fc848543253259df46d5f9a610f5751326771b2953b9ad79b5917f3ed20eb4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f943f558719b27616f6f42808b0adc8b80197eb4c4d9c8373973c3f917daac3f00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33468585455b2034a011f9e98cfb9e1d2bdbce270a69a5c5c733d92c7e5208c2dcffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569fe6320b1ac1b725ad2df5214c8559538849e6ca4888662b8a6a0fbbb2f26aed3863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0340627a2537eb8dd4c8ef4b8d80f79be4efdef5da3d1e4d260db585181a0462600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0d0b02070e5bf69880d0d68e6c66d60b867d375ed929f608891bfa43c398213e000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a43ac241a3a476e5adc23de351d49cdc7f009d4d1c85c0df9320334059d317d03103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e981eb339ba4578e6d65f0370e4ab72cf138ce2eb5e70271c4efd222eb3256abe00f003000000000000af2468398be195d15bc2561382cb9ec4e5252bb291d5c149759e3a8bfda0ee7f23a25995086d6a9ce5dce7396c9a0580b4cf8997d714c7555f1f0e6375fe1510ae67a8f363a33bdb15e7c6cf4d24a8dee5349318003b3050f2b7d0b94da3cc7a84f222a57668865215bad85f300c53dc0afa087f46d29b22b6699d570bf258c911dc5c0cea6d8f619c6afa19b329df95a831bcd6633f7d94623f435a57e5465cf30f21f9839c9f0bedaac7778d4fbd5f11908d793b42aab773e1e0c8323e9fada495dfe864298537adfda070f724fd71f1a9cdf2bded31fa82102a366a38d909cedf2257228b19dcb608dfd43dd4504da60ca55a70f138db726b9dfb66d77e7be59790107a9c3af88bb7e02882c168dece5bd7fcfa093e6de255e0819e427a898d4e4ab1e6216e5118003d862bc027a4130831bfb86fba6c21c43f1481586cb183318019f3e21dd68dc33ec1beecd69eb245f941b5b92e935051e45f3898d873eb157ff85543718d3f736da932bddf87b8e7b96863cd6449823a80b6646b662aac5da3edc3dcb7866bdb2e1a8d6b148fc24234017bb99ed2996a918759f67ffef55bd1aa3bb940f387a5a7a4048d26fbb02d5eee28c6b19f2f087da807bc1505866a53fd7b01787d5e47745133302e1cbc66845953b9964efb452d8d8f618bc399d40540fb4d7bea3a45026c020554fd7f9cd83694829a68c7532b6ebc2cb4340fa97b729167a8920f968ff4f00434e5fb629205b28e63d795e29fe0d62e41fd9bbf5ab1ac2385b7c9ce2eddbe75ba0fcf0f3a51fd3bc05c48c62811d08b8b646d85624430d4a9420c293e6391e5b54581ba1db7136f3e96005e85decee661ee4487745c88625b1167a4b8a0b176105c5bd9e623181e691519a2c1a0532e7dc2646d66cf130c5982412c3b7c61529a4de4463a4cc0010a785b80fa2028bca8369ff307bd9a81a384f376eb6466b23b3a6af8275ec98758147744ac3bc5c6ece9ce3c393a8c2814a7edc04a423eef1f255844c2e9fd61c310b83c10268ecdd355474655b52db1ac8fe4ddee8c8104d542474add99debd271367d91d9b345d70c9b1a0dfd77d5dc5e968f869fdab41734abf4a3bee3750c677d54a7594183057a353407b729e34a2be850df36b23ecad450606952249680abc7d68d6ad20bdbcda551ad4ea427c615fef9165767d276133633496ad1068bf72b6f6022cc0ba639b6813c06da370a5045040fed4846eac247c70a36d091a4f18ee5fa3c487dddc8a5f5a5597b1f8b819bc8c7af15794046c9378223b321e83b9e6a4361fea33741e3a4656118a5773461fd45f053e4cde3de9e805da9930667bbc538ce5fea0648065d23e175f19b27492c9906faa43c3369b5b3964bbdc047785a244f98ec1cfed0078631699a95e8fcff9ff152be6f921 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e53e70bcc13960fdbbca371011e3b2d15edb1fe5c92190539fe0fedb06dea81c01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38937a644f347e5a7c93c159f368d0f6ec4b5001171f138ea4e7336c322a2f8389ffffffffffffffffbf312247533d481e255cc41410ce3eb113875d331c6a01df909878a48b5d4bb3c4816cc53e32b2473160768291feced3d96254ab304050a0b6becd8fed392724b5eb742100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c05be3e8ef7aaca311947bfbe0a5bf3fa0638961e89a5501caf528aa5f99aa09d4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861123a84eda4ab668c5b7b343d0fad94f679bfcf76f3d04251a7f87ccb4c5c906bd00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3374fb30e7f57542bc459bfe6d7aa1459ed548e00d0ccc9194f8f5fd672d6b649dffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569721ad2667b5f20bef1dc4daa126a9adb09215924359dce3eb5c10b2370e9cb4b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0c9a94225df21fb7e9866ffc9bd75b14a80df9151f937f7b10583557bcc668d2100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0d2dfc46f0f997862b18a4df4fcb90a1e9a6eb5e713036c4c04ce1b4e867478cd00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a457bdb2b1cbd582dee713126c98eb1a14e3193b8e54ae079dab5b5277c39e718e03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ebaf29f78260e8f795af743d23f303e74cd9a1e97c50f6c8bd0bf222b2bc9455e00f003000000000000a6d00e9e63a295cd1b9548cc1aaf6277a018c624b212cef96320f92fbc61652b063c82488949e68eb72b6c2b02e9c6de89bd02a2c836ad24d3638fc36931c917bb5fcd787e65575cc575b20c46d0be1bdc9fe2bd4ef80e6e88ec9f44a0143da19500ef2e6dbcc2d6a183db9938aa70cdd6ae80d97b8c3c926246bfa8d99d412248abb64f1c3ae1cfb0b8f7351a4924b2acbeda07002a0369ac404a0cd23847efe23402606d4e8627f3649768e2d3853fd22e8f72f5123b71659a3a0eff80bfcfb9487196a77ad9449d363c8a4f56925b59cf68d419dd8e454ef71f4a226239cd366950bb2a5b8b9c899e447f49c55a05af6a8c7c101aeec901227ea69dc5fedfe50ebbfe4d5f5319892938a52cb01a3e260430adc803a57f22dcccc55aeba03fb64d13528d10207ec5f7baec5be55a9a1514cc88a4fc411cc7add5fef4d98796bb58b1af148843762c9b5e3cb5cbd63da88b83e3b691d67e608320c83f0abc5b7c7192b38a84c98b1c749b540c30c89c23b0946dcdfaa04a1ff54a5e68496bd39756e70189eacab0d2fa5f9a34838c7923b8442998958ec965e3f17db1c29061b76d966bafa566e36e3163eea6855272b0d7fcee48c9e27d89d4d81974acca7726aeb66961b7de757771392874911b59e86ef22c17761c2a02f3e4441f63f48ea3bf6bc47b33f9c3263da8e803bf5cc80c5981b9d81e9f2a61cbb05136eff54b896fa381371080f8460aeb5976687b7b23a4e1a2f500952b0826abd22ce9711b7f41642aaaad7d76390fedbe06c7df05e12bc308dfbc056523900d8cd2c45211de7e12d2466bb4674b4032693ddd10188c32d1a1b41000242b3bda134846e0fd8fc3a326225b365cb50eef80feba8b461c837fa51cc8ccd5b55427e730fce875b1a1d3d0442f99edeb6e9d326e4ac018e635eea661680b352cb4185f04edaa918594adbde89f5039d6988ab63ef84c272438de9866435817ab3a621b055ee288c37d832065d5f3b5009b3cd6c3732e719137fec96570d7d19d377899b6545c5b05121512337e4e551f22c070d6ae232448933ca1a18b2fd455dd66cc8d472fc0708a02c333622b7cff93da3d69a3f665d78918a7a6e5b49ad0efd00673adc852ae90b761e2e43a634e1ddd1004bce54bc3f09056c5c60b652e67a1ba4a322fccc9a0c8e1965d754744e4655a4586ff039cd3ea7019d67f5c7d047f060c3c602ac52a0578d677cbe172198e57deadbd17230b66f492d7c09ef8c0fdd2509d05e662375d2dbce6aabab1ad29380ae3ee52bc0f81f1230919d3c9562c3e3a08266df52ba3781a85d9dad7e55b70cf6bc62fd1e11a4d714f40906b7be0c0b5187fdc7df8e175708433d833d2b4b6482da817d25db1b0cfdaf903efd1f3a7eb7423330422338ed0d4bb43e3354fdd336b3a58 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001e40c61ce77ab6e9198025e961c9ab87d9d44628baeba6256e05fafb8aa9802f01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3802bbf2f1d265bfde45d1e50b9247a7a0b7461b56522cb17a19d2f3cc2e481bdbffffffffffffffffbf312247533d481e255cc4140b1d4a2e7108b09fe6be085a726e2bfc8bd2db2b85b626ff5bb831c476509f4437c10311c6c98aec816711652d1f554a6b49ea1d2e2520ab00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cbe0eddbef88e3788a0cc92f5a55968cf48fb0c8bf1d22f291780791e9100c7654bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119c7b4a81e9465148d81436d5d9c01cd43e447aee6ea724d8efb531231bebe4a700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e334f45564c5aef72487aa661a888224fd558364669f88d9919724fa0928da54e2cffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569027ec4996d118509d69848a4413a6c3c57b2a585bb7bee28e4a6002fd539ee5f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0be456bfc0adc65ea99aeae7affd9f95d4609835cf2faaeabc07a640f0868e75800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0465bb31798fcc8a2ef82fabc094d79753698145fd91eac1be3f2c1d7fcb6504600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4fed535f51486a7ec02865ab5849a84d4c676063fd08623bb3dafecb662ce221c03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eadf17a9afcc59fc3a0648264a7c9a64888ca263866bf015582c1604ab137698300f003000000000000a2260f64674ecb489fd44e304b5aeec674af9fc26f4d9b2629f0fcd78e089496e82708fee0e654104fdf3a5a1be61f99b6279c997c1963da75724f9cd45a5eecf980f8774761b9cdb9326f3ca15e1685a7475dfe0afe35aa79189319a8aed58c995003a9543c9fb0b07bc562d827ffc67197cdf364bd78d821c6cf95102dcd23158868720a55dca82b7ef8a0825801b399d5edd8229763637a27c4d47cd553c9a36558b41abc7e958572e1a011d55475ffccd6fe1dff48c309129db2d37174498124171859fffdc52fdd503a7286ef63207c02bfcc855639e7757592a547c5cd65dd5d7059ef3008da60ad9c764c0f0886a8aa63669db58658b86f229109cbcfc16b7033d9541df1fc73abb6b0e0043f3dd3c631f6c5c900f810472891d2afecb39d146f38dfcd3c63c1e0aef690513d4374e3cf07e1e340968387cd76a83b49c4724ac1a04726fbbc0b9ed76ce43f8eb1a53cd579b9d950e36875cc6a20c06c1d62a35466e757ea0a51fe8d7d8559bc74eacc1210997314f529a0ac8402df78a74ee9f37c8b5ac326dfcd7efca317bbc2d49927d991b8abc50184fd873733407f87cc4f465594fdabdc9a889b85124993ff58d37aae47066a5060517fd4cf64615887bb0918063aeae78ffed556eb63ac077b613f64cfd0675fe08428ffbbfa8b3f74ede3ccc939a3c9745cef39047e9539aaa9cec43c52910f680cb45125d64fe87c2dad652f7b41d7c0bd29bc75ea1b5ebb05da87b88775620ae558ae4f6bc8f51392d0ae29653c25fe3c5c1564285ec569e63dd6d7e4f08fd6e0c95d5696c3484fac455cff58bc879ae295d328357b53d93485603e11edb0ea3902f4e6f40ae57b6b3af2f979736f78c14f7eb9248d29fe0b541974325ac1cde3bb87cc0500d4371a710c5d14ebaa716a8603932d88c7f0ffa9543c83468a68c5fdb483ea31d1ac77ac44a72550a0e0e348129835e21211b7b443631a389e8c68f6205f9c09902fa7225adce5e9ba9b68e367016dd7e8e36e2f6ac822395303e8fbc4266908bb1afc3fb0e86b0f3223e58c8cdd252453d96dbfda12bbf49e159c53464dd4b21aec4d708686f3e9686b98c5354c1b2ad496f501a1823029bedc5760f47d976a9608dbda9d9516f56a4c22165e5e40ca4d1e0108c461681f459f76ac1f4af93f87bb1b7b3d85a5da8d80a015a46864faeb70420d1cd29ecd648d58b65a2ecf8f05a3cec6dc74fcc0e1eb43e022db650d63ee02c0e1e449454da8c87ab07b2809ae197e8833a44f56c676b143160645a8cab87d8e58ab38d9c6352503aca2314a0bcbd5b0481974bffa4d844aa90949e36ba19e74b924fe9b96e153a5df335203dfa24f115ec4ae3ff3fdc8018e725b69bbe7063da93ca60e99c85e4b622de2cbf1970a0b2026cb6327615ecd64794d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ace5a43a93903e85d78152308d27b7cc76414e7705bc8f4e163cbb9e0047ec6f01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc3842e82c66f2014cacd0f39a9fa8da0cd5ea6a8aa14d7358e135b27d05dd9620e8ffffffffffffffffbf312247533d481e255cc4141a70cf47e6dcccdfc4857abac06bbe5df54cb015cfa737d8c83e635a163d651022a730df43072113b2ab2ae3ec322b9dd8cb68e23a9ee17400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3efba1b5f80decff431638bd41ff89215e4fa014c16509a37874d3f6c61a1e544bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611146c4754002a132f0b21f5b806ccb691fa881a1d57d1c1a0729ecca85fa8131e00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e332e114dab18db28c6c63ecd764cdd4b41c6d41db5b7dfd7b9d9e32154bba88c11ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085696aaaa6554fc7254ee4788e59ce370c6ef7f1b885c0584d01f201ef8d7bb24899863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0f000aa4246e7dc85173fa9baf621562327b8e3a8ce95e7dcfec2c6d3799e026a00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b063ee15eebbed3db31fc4b4f5af9f6db17f3c255972523c2c85c4f9302ea3834f00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4e8e183e9e0beac1857e7f89f6885b0aad2c36bf379d73a7a818d8289d52432ce03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e5fc01013ab99bc5f79993844217df50f6e66823e6e33bb9a46fa8b2df3627a9600f003000000000000a81fc6df0c8d19a6311b026a806eb42e7e8aadbce861e90c54bc45a9307c7e0c90dbba649200adf5ad4e10f4f69cf99094d4ce9e9aae7e779c7fbd857b55ae69956505b71033b812a9876c579efbda0ee4e8c950ab85815915563359fe575b21809ba05460081852e631469fa82eeedbb0b8e0e43dc93dae1c572aab30ab4b416f6d67858ac6b2030615389549018c01b9f2d45e1333b51bb1c546af86e65bd73f21b4fff40074dab5a685d46ae40277a6fea0bab0987904204d617b5ad48a3b800764d336f45a39ab9f495e7a0e0a597ddc137b829ce24cd20b849841a7b16ca76b5099d99457c360a9141636390e4fb456b2b7e44d62e463b8065a932619da0d8b1f6d317f5fca02e7c853009b895757dda46752692719fe2969c8aecaba689159e3b00fd6f767d6c1f29052c1d9c8016c1558a985b21ff2912cb30b167a7bae850bb6983d3ef1a22ea58210c3edb9aa65a66a1d91d9c2cb21f8f55cfde50d9b0d14f4ab7839ef695f0516f1bfa5538db082ed7a686ac7fcfb405207ccf616ac5124029deecd8a08b10b36678794b39264823659ea94a5c4a97fa567e3c23912ba37784b1c7b509d61a821b3cce6d3870f9d606eb71bae04f89d9de9e84cc762f1ad94912a78d06a890527d1574e604fc9b27340fc4c2d3b9e924ebf8ae42b967c2817ee10d45b87c41bc3deab2d1732253dad56cd24ea86035b49a4e9823b56141be7fd79f3caee438781d14cb248571b02900d0172204c92b35c7476a622ad3b6f3fa542b16fd4f4b3777db45040de7386aafaf57fda1252c141fa9ef58894dd607828f4fc7c2595b887c3de2b3b158b9072b84948033c3370ee6044e448ee41487641f8a4f8ce90151672aaa20203f7c7476e8f3d8ff8f80bf41424aa76f6e859416d7920af383fe40ff209263f42a2f75fbb4b064ebbe40965d42b6f1da68d3a2fa32e2065cea2f3fa578465479cb5db6c2d291eaca315ae44f0363e869e57a5be45ff8a6cf7e7e843d7dabc052b206107d3f51ee7abec48ba7e845fbd099d2236e049a524b53220fb61bec11dba8e964f3b47762a65e94bbde26f6f64b36ed20028bd9acafe1b2ec85fab72630e0e78e2afa7f07e2b72c6c5cfa76da575fc99557f76eeff3b4833240c9f183618d8842f09b15eac078f764ed14195d1c6470a8cc6ad307db23c6ff3e984df05c17db38b078477bbfabe629ef567b1b028069f9564e4a7beb8c53b9552d23e3fabba3d94be1ce3034535dd51fef0285d5901392a54ee07c6137462b6956baf32dc80983f79e095ef56a7b1b503b77c1219696409b0a4741dcd97a183e57da563e8d2873bdde33a0b9c68e1508ef89affd7eb0df7b6256abfb14cb9dac0b2e06601c09c6c0ac3dbb43294c809929569fcbf338e077bef39da2b34d0d4d954ca27 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cceb9edea7eec0a50813bd791f317f063b0cf53b1e83eec6029b73f91d29a44701e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38382bba82fc0b40e7584d4347b290ceb2e4db7f9afa1f6c69364639b36789ebe6ffffffffffffffffbf312247533d481e255cc414c02591b60a2d945296992138a184449bc631b5f225b62ebe819a79dfc489a0f6894bb7b583279288ed151570d2a5ec29af0e6cb6370f5d0600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7a2f1e9c91629aeb0c610531dcd8eeafa0030f45c03519865feae240823cf69c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a9842a381a5fac176f597e7e3d45dfdc40caece8849a46f9788e7d9b3b93640400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33edee3332fa0719b4ae68a55227beed507aefd6834b2b67ace91c9266765eeb0effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085695e1c4e84e65aa84d3c42c3d24390085f82cad1ac809a4157d35c43dc3c038e66863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a08f229e424c2efbafc3a8df6bd47a75652cc4482acefab6947c7a64713da1ed9400e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ea7c366e7dcdb78931291ad432960e1b60ba838203bc46fb3ea5189cb60dd96e00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ae1f7c508f22294e0fd6a5b946ea82570ee3ae82d16e5a0a8a49091c3bdc588f03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e30063f5b831ba346599b16f1136fa270898a5ac16971ebaf27e5701aae98170900f003000000000000a5814c119b895a008bcea08b9f5035e585d181a1f3ac71abbf0cbdc9621873b5097746911f6f76ee09ad01bd04c91201a408dbc98ca7d3ec91a3d0d87f79cdd8d9705664de253a33436fc296707fd61e80bbdc0b303097fcf699c9c3e6fd4d41982b6acc6bc0dba737b3d00b34fe757daa3593d01bf299b3efc282fb4fc0727af76d2ee358f5ec285a11f664206f19a6a6ac93c65f1129c479f8f69b1606504868783293a36f83fe4e1100eef6e42cfe91ff5414fca5e5198032a7badedee5ed843fc1391b0a3fda7230857e9714b73f54b7fbf0354eadb7586d45a9b1e5bd50ea33a48ed0b80c5c4f57b97eda35da649583780695b99d653369ac460c6b1657924f4462f3a5caca7420bf7e49d380ec5f0405805f38475669f4c379f89bc19bb2c414cd0f8fedebace10549bf617d64b23bc9c0c4f00d7a6f8e4f813b336db4f015c18b5e39ee09cd54e7cc478ba744b91909e11fed116ce3107f67a7f38c097e1ca6eece7dd019e070da756135251adaeff3e02f1ec1a0d57352248ffa37dc8728f9205e4410562f33817f8979ff55cfbed266e4af360cb133af1f446e89c3aeeb643d9d7698f427c6ffd3c02c78138d680c93ea40b90401464cd6e90103aa28bccfdd319341a71b77d20425947fd0101d6cbc52e02b671ae3266a11ee0239a76d255254bcc9541d40617fed787b28d1cbcc78ba928d57ca5f6c4ca67688bf66412da4ed6bf68c612a0674d51036840adb937dab959c76fdc7657195531a2977cd6e5707c79737c965be67493c3258cd8202cebbba856ac3861bedf028c64757a7c1800c28a76d7262ab005f29e7237d0bb6ca500f189298240a32a410392823b99109cdadfa5cd96ec21f9028e66934b4ff35df8a2323947253075d98afa0fa5d0ec797de2347f56245abdfea0473c8186e254696aa4ec68ae8882d0f89991c5baffc05165e049a9c9203f4352c6f62326b814eed974a366e1a1c87bd19f29867ce25a51b8b1ebf3ef4adc52fec6f746f71f0f6ac2be1292fc44c4c993517261de96a3e7854ccb141db10b4af7b653bff8c5a53931c5414de509d0097c89d193d4b5123b731cbb5da7acb887a3e04a7660bacd0901f02ac13953e63f025cd257d224aeef708b1785c9dc1b03197295f48d96438454bb7c7dd3985212e0d3d8e55c8827e5579008cd61756805e4573235fc9d4e8538d2794d017db6db6d613e912e0290783cf4d9f31e91bfac95e568ef685a46e465d8173f30c703c10c4ecebcb9b8c6cb4275be9b08517d5f2d5034b2dabe817bf973d40f2eaac17acfcb2f00a1410a9fb40ffe527c8bad97b8f7363b941c4d288028b2aca286828517c07016f5076b7de416542b1f18fb8680233bd056f14b99996d9bf3131086d38753ff4d7cf0875db2c54b98539f509514357 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ff5be36ae6b4515f614b4246da494a92a3631256deee399af6b5bdd90431a24601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc382e1bafab5e0dfc086a86710470b6d46e3fb79432786987155840e9364d11f3d5ffffffffffffffffbf312247533d481e255cc41484568dfcbcf74bd40d284b640120a05a8bbcff83abc2217abe1e9bd2a323ed4fb265ca37523824a7e15228a2ab877d827690dbafe774c5f600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf455f07f13cc1a0ee084a809e3e87004a8122018589021c5b43dd176cb5b251e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086117d2aeb0613bcbf6ec40039c60b98ac6bdeb8df1625dc7ecca1bb0227f8a76f0600d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33ba3abc429d3e2f389924f36042fb0f5dec0fc245818a0a3d963929f1c1e58041ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569d557367d5fbe288bdc4fd0419543d2c4f8916ca814900886c470a948572ba1cb863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0826a585b0a49bc50cea79cc40b21c8f84d52c742d5e0b275a15561dd7531431e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b08d1c193921a5cd2d899b2981d003a0f8c70022d6802a0fad5ff4db934bb72ba900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a422aadc5ee2f84f45e0b09a2c2fc05009e60695122b363b47ab80e44e5a416aad03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ea065a75046ba7a3d8500683b81d747ed5dbd6a6f712a40379cf25f1f03b6449f00f0030000000000009723ee2d014dbac27b45e2715c2cde7e51de02da63a01fd0e9a84c9b532f240a2d87c754262f1487bc38a129dffa2a8fa9c57017635d5460375527a4da31ff3605722ded57c4c792afd85fa9fe2e5427700d8f56b66507ffadce0e9f1b8f0e2a97a4599251dd63209ca616dddfeef932e79e4220a5a3fa56fbaf3a8b42e23a230ed6677001d6479ee70a131aa4edff8da51e99ba4ae61115d9e9f43291508c22c592454b41369f7589d8667e29503121f4cf2e4b3913f4ed90baca0ed8366c718bce35f5ee133f2fefbfcbb7f380866138ae6dbe49b41262969c76337b5f3f16deffdad34224ec3b6b7c2807c44252ac8bedf0af16744bb820474baa7d895df78ba20a5bf1a5aef5759293778cc94eacff6e5ed57cbc810bc3e00b036b5a02b08d19cd62cee18d0ebe5377fa8665da9221545dcf888f3e6c29bec6c30d63058979b6935743430f4f3ddbbf11c269939086285dfc1f4f07dc25927337bb5901d5107cad8e5c107053587a26b5d1a86a5c3457d9cbd4a7bebedf1f07a62c67eedb86a71f5b8fd63b1256d04baf53b570536e27ab9a7de01d4206c2ed31d72b9499488b60ae9d542bed6cba1f698103c28c88dad3c94fe291a0909588752bae702a911c27c5403a09afff814db67cdcf05c51f57d9f555129b7edb6e78baf0286a3823fa54b30f62ce343913c37617ec8164b3175537d11370423c275bb1e2e639d2fa00c895d83f84da2387c341bd7bcb9c9023982e577300595fa49a3bcafb3d90eaeef115264b000f518675c5ff2dc6e59a39744710b24d8ff4b632099c657acb35638509c3d11ddb04cb30266a78929cab26c8eb196a2c7bbb4377aeb6299c109eee2aeaba15992f628bdab61afb01d9a1896d3d2152e5409154a37626a2c1f4f80d09476a6e19d2d94a97f72f1c32bb816a4bc7f8eba8f46e647a1d933286dd3db0a62f90563584e135c95c2d2257276384bfaa6328160c0e99ae765af21efb81ec83585ccb9f70e87be6f21f6821e6674c814e9dcbbead8d31f1ddfd1ec64b0193bfd73e895bf0f57ab83b55e7214b399582a6a16aa04281cce42321749e4082ccd843cb2af149ea9462541c32a115c191ff138eff269904b9a7646c68aa4421c8ad06c51267082d20d3e0320656e8502f815a9fc33eda27e218477ebecb1599716830422273a0b9a0ced83466168132174e400704f99ca8b6b67b8d8ce766b8a0a6077e6e890f1b4c020fc00b7406fac5970be86c2dbda2dbeadd1dcae554fad2d78387e49b5297c50a06007ec066bfb4f243ca1860d8bdfe023cadd8a20a98867aa6c1e03478bced4fca9b7ac6d8a9ab08b06d2b8beb4d7ae7331420585bfbc2ef33ca0655e057c97dce2d4ac300bd317be23ad36516c1d727ff56a0c255136007a3fe61ec9e78877df98477e3c -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000297e5cc71cfcba74e75a0e5155a6b8039c4c850440a69e50169022dff438143201e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc389efe56475fae87c6ee6a77dbe1ae701cbdee668685ab8ba0a072983bd56e0c27ffffffffffffffffbf312247533d481e255cc41467b6aa29870ff52ad14dee115f7bf473b0241c78f69106cf2c7223a36a43a3058a5fa20070c32ac63164dd928d66e681a0c08b2d80544e8800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c23ed72e0958033f4872410e417cbaca30299bbef43c697916167a76edbfb53604bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611621878c4efcea707b258fd8fce8d53963e26def8ed0e824c96ed30ea70d7333500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33710d3acbfe2617212b78c7e7d35f4ba169fee78eaf2c93d16a6f2453d24f972cffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691943f67153cff0188e11e6851da8920cfeea3cf6006110b92cb3fca01f43fc18863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0ced67276fae6386b4ffa59c226d4e0532de3a20ce03aa3f281db76b9170dcd9e00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b07485522e28b738bbb46e3f31e25afdd408d3e5434dbdaecbc2a566c20e34842d00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a438d28dbea12802ac21c8135a58dfcfe0db7f2eb270a9ba18fdf63a400620a60803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ec2504b582312315c695ff7a5795e7e8245d8f9230ec44cb67a4684c4ac55590900f0030000000000008e93a319d918115f3132a10f6a772ac2101e3ae74c9c6770abbe2cb338792b972ca527205a5e492509224b7cbf05a82c93d03c3c866a11ad057c6d36ce1a89a4b385a0bd9b94a0c89be6edf39b4e472fea8a93e852f24925d459dac93842b62cb1656fb5ac123e53de7a372e64985a4392a3bc14d879032bb14327b8fcf63f0d0078c90e4ec344de1f0ad2a7e25737fa97ce7aff6b08a4cf1bc15c982c6acff180b7ef503c0029a08d1e3302a2de4b1277fdd868884f791f704e334045ebfddab59fb7c603c07bb5a806c0fff09cf5b56276463c06c32c7254f5dcb72aaaaf9e3ff2bbc0322dee115aaa948963625caeb7dec5d831dbe872f842cd7f1007c81ea7a48b1e17b417ba9b17737a4ef3754a6a0b3a948fb90750cd8b5797e734f8aab5b331fb9d5e4e320860a1308281160a2c7fe9be5ef5bf7948018a97ab2a2236de02c1e3e4b22a48cd51945d68e4c1e0a06a1e15b81e53aa61352cfb5eb4f33ceb4fb1b401a7cb8631e1387231ed21a3066909e6e3d3f6b7888f60fd87f683a0a54670d31efe585e625ea330f27f9f0223c604be392cac215d5f2ba751c980eeba40719271b2a8fa69c7203baf2f3a0aa684e7ff84171bacc596947a5470ce868a2afdc6881a3eb5c1ac1538023b446d8403d78ef8cb72f3602f63ebc2a7acdba39ae4a6fd7920eda8b5f6fc3a31d24c6cc7bed8f91efa385c18401064da1ce7b6164b0fd0b2527279668de556313fda452225331fdb86bd4bd0f32b1f01a5e2e2a1cc779b475a07280a475bc7f2015e9c82cc9b645c924cd0847eac540c6b864ed4555385807f5663593a721e8e0d23113fe93348f1cedbe391ff587f31849c55734a1dc85afab7b933485b75e861019d6818b148963cc14423fd26c68baa4d22b394d5798138e853c55f760a5447499d209f89727e5a90dedd491677fa3777a4648654af7919348cf0808a9e255b3a31e4fca7fc839a63ebfb29a525f31d9df76334c0d93b541442525c991e0bf03fb3055b892fc8cb8af33bbd477d21462f11e34023f682381438ed948f2eb1db2105a92f466553a34e9e4f31737ded11ecc020ca4d9ef05f6267dc6dbc61e6aa3353825b3d5c5517976471b1a826b32dc6cb4ddd506010c19b9788337d3eb7b337130dc7a1a67512691ab171e0e7fdd8ca586087d6163880499df44ded1a945752c56653280d1070a574918dd5f5d8d01e640278c64beb5f56b3544cc4d7e6ac4ee3405d0c0f604752a4d6dd4c7d9ded3ee3ff277307ac29e77569fb57a6b4a835ff9a5e5f91d541eb0189408ad8ef80fe7395c58374b40c6eb8a52b206ab6340eb8757f7538bb9d702084c9b7c052e3f2f8ed3445f6e90999c24be7b0c845156720689f54af601388813e8e2633f5f8551b1110b94dd5f9393e4ef0e550d8da18 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000018394262f643644171a9e4b70351657b141cb3ba2e7db7c51843ebc6cd75a72b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38a4aeafcb2a5afb25136db36b4130fcc753c3c3a16539b11dad2aa9a2e6f14c3cffffffffffffffffbf312247533d481e255cc4146b7b85463a2ae57e3c0215d540445ebbdaf088be0ae9bbb1db5400e3612bb06135451c627a7e8d2b1ff40590ea1438d29a4d78d4e9e1890a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c540d3d6a495acd57b552a5d8eec2c5ab86ad65cab343564daacadf87564b19984bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114acca8c4d8d2f138a945c56947295665bddc2fcedc6608044ef67c7ec1697fa500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c564ac9918c160d96689040c20d0acb9452bb3b360f68bfd48c6d1c3e4c39004ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569375eeed1cbe9264c3cbb0bf775b34d296cb86ef90052bce825e5080660f90532863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a000ce8eddb38f5dce74681cef623ede3a5000860b07a13d1e502a7746ae3c4a2900e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b023ca2f6ff3fe61496226273d2493919c2d1586845be84bdb4fdd75a190a2a9d800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a432cd40e3a7eb4b2836b60dcb91dc72a5255ad72aa9516def435a7ef6e6bb5d3703c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e097c3a6ce1ce0b9bb0119e1d1eada0db749bdb37051af9989349d6c30072d18500f003000000000000a4dbf0e987f64ed7317fbc0019a7dfc84e53e211188e9bde099bc3eb01ce4056bf0d5dd6f569ebcc2a5298c487425f5faf837608ca416a345872a137f4a89d970572a868c4b6c0b6825739ecd5e7a8165e817d25eac6019863310934449fa1ac9283b3e4e93887f04214f442db1f806ea5cc75c926eb192cc85649b3a750848473cd0613b21599ae5c892b0bfc17ba508c4160f97273795b6990c0c958ea0c732b50f2cb0c770705da0016668338d75079ffa3e2e827bd401ed9e119e85651c586b001eca29349763050c9e4450c5123240f88320af92a28cf7052d8d193c1de5aec57c11948799883fc8db2dfaa1e06a5df95cceae356d539ead841476f2e6f54c9657a8144e8a4c04eccc040849eecc82f4deb0ab60236238aec04bcfa774a8c83b65c1c201807bda31eabfbf9e29491e42636dd4acece942b7ffe26f3d3f0ec579d7082a8deeee218744f915408aba0c26f76ae40753ad62350bffff56bc22a8a97e9a1060d7771214b5b4b63afb14a4a610e437b90eaa8eaf87ad7b6dc59af3c6c84c9b87531d7b5015a30cc336b0be6aa7cc62c37b94ee003a94a5ef641cabc6f6a81694f27d907b912e415fbbc8db1be28bce360d38e1c4ab0d75bb98ab64a85f97e78471dfacb75b3a66ef761b75bb28e8e88eb02707758eb1e9bdf70b7dfa229524ec000935bd0aadb013ef25d097cc6c45ca09dff13086e2b6a44bc0d7e05b5cf8dc43e5fd57517b091be2d17446b8240030f7336a38f093f7ef13df518c1f006758abe4d8ba6def4e6516eb03acd81eebd56e7fc3f6007fb982f9240a60f7e20ce24a7d40e4ba3f77bdb56565c7dce5b14317a72f3641bd4e57ee2d16618a0c52b690807e678765a0c74494bbb1235dec938dbfcf7914a7174e05008118ee38fa52a88a126e1a4aa3bdf3ba72a4987bd133b2fa4e5f32fe988f9ff60dc98a20cb691067bbba202c2bf746d8217143298bcc16dd0d022c1bf95cc6190072b2cceac0090e638fa4b12167627756a562973171d2824459fde9e4e0884700f38c8bb9588c88ef07ad50388916e9e8694c9f7bf10410da3089d783d1900d895c34fe5a7de27db56e32e3cae882f986cbbe9ae91fd0b105b10321c0a56a68a7339f3922f2b43f27764d09cc48e68341e3d8e30b33e095ae22040b181748ce7524066c5c13b7159ef925410347911ce5bfc9e8f4865e09d2dd3533c5162602815e9f963a36c8854352145bd376c13be7263f4ab2bb133af95acfbe860c1e4959ef96b63d05f9e676f074bfb8b3f3d49b1dd032b7d966421ddbe1baf9e723762cc8d62c8231334ea8d4dd151630f553f55f752c1c16945e9755e47d4dd9177ff9360cd72e9167a90cd869eea4a8f6369a0738c092932b0934aae6d2abeb1d9a704f8efbca900b492ec2fa3ab228361 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d3b344ee5ec1df2e3bcc48f92a936cda2b287bd2be2b2b1d0fb077098f15093a01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38261077c5afca64551c65c0aa9431c730b31a9a9fdd1f9c3ff50a52ddc2ea94e6ffffffffffffffffbf312247533d481e255cc414971915173835e623a45c9cdadab9c6cd939b3a2b73ef0414c43e54851f38d1132b0d7c060d0740652d620a74ea15d2738bb9535962a709fb00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce664da99f7b3cb70788fb66657f642c7c4077b255f7431b97cc7aefe7762568f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e9bb31ae99b159e3c0d5b6a61cb3116e22ba74619b522c370f6947771e262ce900d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3347ad17c2a346147363ede64155395de276d28be2b2dc3a45b86aadb8945ebfc0ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085691c33ed2e49203cbf98659ed46084fdf90e34e4bcf1554809bf60306bddf898c5863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0b81d2092fcc8c31ea80de9b6834dda0e634be67429d886df310071363a0c0f6500e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0b7b826ff7fbdfb848f1173b5515da387a832b7b339dc8d7172b25a5beba003a000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a467557e83f5874f66cd2af040b28cd86756c5e3566fa45d275c36f42288d25d2003c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eab94846baac61bcc6d794376b239d88324873d61b86bb17c1f3438d98e1ab80300f003000000000000a774313cbc1424bbee35a912bae229aeb96054f1042d6fa37a714162d1c42e73f52d6e1757832ab1587284d6eca042a9adf682d6b54865b074ba204891fe50051e1938341f38f9468da22a91c56bb7e4dd72a4e8608c54ca370a84e527057c18907078e9d11be60aa15ddb5e2df1fc7e92ae41b5628e27e0ccde03eb04ea54da58ef15946e195c7fbc7567867bdcb2bea16bd7375e86f9349fea9a24a5c10e9b0623616fd50ed4dd20789c5c6fa921c2f31999a26efda241e7aa72cf9b7154bbacc56ad00e006c8eff6e8c2a32eac941288624106194ccb28b5e11676756bdb11a410f43b567c49ff6189ebcc5035da9ae2955f9d60ec69e40fbd8e9e7e4102cf3417261cde5e98f024ce816b067edff4d9b0a9e189a3e853cbbe19d07dd0a54994cb0f0e3a5c043e180be3f3a83b2c12fe4c3842b027001919652ad2e90eb3d886ce40f70a5f680f6b93ecd1bfd9850b857cf60c04c13bdf611bf38afc73bbe45f295f980e5d9d8771de4274d03184d5711c7b601dd52456135387f5450959ea707b47c7d2f95a311eec6f133ab8cbfd4c6324744f4e5da8a5ea8654d75f4fd71a17ff8e9fe3cc32f878eaa9d84aaa7a5897aba258ddab4fdf4550f1e4a7bccbde4e9729a31819f7e622080277bd8259c411bf927368b1759ac63aea58ef570a1c0149cf2d640ef160f2ad39dde1914267adc4a761769037b24ba30a311cb572f1e6c5e366d1c36a28f7a5f895b21915e90777ce09bf44350212ab71e60c30f17058b305511445499667f16389c0d5932042e2b8012aa7454e5299e278c3045dba32187668f627918ecd3d7ea3a9f51b5d4f02d5928bda0c8bc1eb6905e4f3f29fcd6374964efaa7f36a5b3242fd75eacfcefad20c03b32bfe2bc3163081c153eaa47245a2c70445f43357c7a7ae44299d5bee4aa4c51f14c17c797fe81922b546325e1cd5a68533ccd96e6c4920e4fc5740011e7adf84c02cd6e362b56dfef7833ceb0723aeda9fb494d49acd280709184d2568565a1b3225dc5053708b13c638da096a4ff2bc36dd46cc80ce37a3a450d3b27496f3f1efadd984b9dc39031aaf2d8b6c513f01dded21197bd3532501707b75535d4cd05b9396e893948d22685d570bd1935466c7c4441de14a0ac2c18b120f1017dac4a991df6ba88faf442741c36e817efdb8193e325e3c352b864683c53d2d398b1dfc023c50c722e98a10377be135e440e6ec8b9ae6c913ddf4c9159c2b166ac116569b8681eea2b6b8c8ebe9dc637ed914d00765c0100b99f627208602527c80f7456ebff900f609d0b4d864d2ccf63afbf055f14310ff28855abd65d2842466b2c22bd2c451b12e6540a85a32e7b966efa0e09f4acfcbdc12e838459a32fc2bae162077d76d85fa908da2d5857e9d74fc7eedcb00d90a8bc20 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001e93a0d434263464155e850796dcb9a097509ea2b4dbad4139e38f8eb327aa1001e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38fd57b8b60ca2b54363003127614393663c28502962a3a69773b58ed9a7e1e2ddffffffffffffffffbf312247533d481e255cc4148ada480da3487a69c71f67dc0b55af1d5e1b7c8cd70b0f84af1fd6e234ab6c2355682cee065d744722426c54d8bfb6ad3f320afdcad00a1300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c673a95e6dc6df6f1b3ad45a837c100806d6711612622c334d156649fdac7bfeb4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861160bada8d70018fc8db1232956e52725e148d6c66fa4707c698ca9b79e373697100d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c53fe983c745f6cf7e0ce1c29c7d8978f37860627b21f386f8a38a1d4307642effffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085694400ced52ab7b38f7d41a1c8bd3775399ce14a5e8922efb5bafe4801945e2990863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0dfe0dd5fad4e1b3dc61739fe164aaf7cf985bc3f9016291b63ebb0767b4db85100e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b09e76fb1567e71f612649c43722682a6f4432a304dde4e5fece4635b63769866b00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a48a915252b8b5bfe3b71df688e497eec0a165f45a6dda0c264005e78dc3c4c89803c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eb177a471ed39ba62f102edb29c7e1258734c7abc34f9c6a2b65ff36b9efee0a700f0030000000000008605fcfda8db0db8ad658b105b28ff7408f4276dd9a809952691844239ff2691e70c8518ff883eff18e7619beb5462e18e0285e28cea3c83bc218859e9b077e0bef3ff6a16b53bae35142305fcc0ca26fdfad48f1088c2e2b04534cc4180231ca678bba03bafd9d7f4124f86fb2e97a635b37fe99e36098838dc804009315b99304841669759ab259ae49cb0d529402c889a7ceb6c933506ee01a8ec4515927886810688aea3a2c36ec15406d776df3eb44f8a1a803061b2982e78b5c578d13c82d2a1e3ff4108ba9372eccbd00cc2762f9365a53940f000ccfd3ff2f0ab8e9c1f5e233089c3480b4389f0f6e4aaababb7903da856f53c5274cbc9de3eb51aa01ed0cf846630f1db1a9b7184f0be0985102f039bab13f68f5da08919419d02338807fac13e59ea1a78940407b6f4d53d9502207387fca948b764b625ac22bd19798d7f157aba0b83580371a34a6826838c9a9f89d086674393ec6b9b64d8a90a8f8664a6f13eff3ed7b4f9555bce04e8749e34593d60e898a26e4354a3b1167592731a7e735bcc400ef666b5496902b8292a311d605c6d7686f0a6f961331cea5736ce9fe9fa5ff7347868a418288a59a72761c60dccf11c710dadb74f30c5f1325dd3ca5d846e63170b41fb5fbc10d6a663dbf061aebe58ce9c27d3385baed78bffb5b9b2ec6a49bda134bb7ce507045647c16dffa30776c267091b8db7a0c15ea7e27d1d601415da90cc177e2383b6788d0ebacddae1be454315b2c9b13f3244b1c1f51f7157006adba8b262a5840e63b5c31c7d3a2a783880c8a0dcc7d20d12b8dec63bfc82600b6e7bd6a0031166a0ae36cd8eb4de3bccd8a0e84a39917912d4385b418ebc645329063df48cd850106b88a7cf97921f2402f3e22bdd8e08b9e270b52d2f4b5e287427459fd9504aad9c75d7546f3abcd222dab2e98f0e2ce729d6720ebe22bf62588b85504ee20b2afac3d90213771d8025bc42a0a18d37d3f91eff5124efcc586c8748ecb0b60aa5fcf326059954c1c50364f145a22697b3da11836737e334bd274e8f0c629f243de7fc1a6a38731749de3d37b83c5b797d80d6f109188702ba564915968b276ab6bf7255228f7212f941037a7cfe6e8de3680234a9b1daf54b3930226886ef06a95208d45155774b8242df92458532da27ee954d509565b65a3ceeb4ebd56b45a8ba07a8996720e01666613fd6bb6b4bfd6beb40047e6ed8e61086e09fb9b806cb0cffac05a73827bc86a62a64b8ab64ff89e881c272125564950e6e9b7a1b04f5b36e5ebaa97e5475990b9b2473137fefef28c021ae1fef03be7ac1e65fc85067d965ae482d606584c7d642edd74264adc3e1fbbe12a99636b8a3f9de712836915adf409a27bad98a545127aee1a82855d845b0e93a2970160d534f80943048 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d3c90ab48629b496d1b4b19d7b6901a35ee3e8f0148c1e0f5aa91ff6927b422501e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38ed471d3ecf2a416e44daa34a165e3d8df36d34d6f56133678a576b557a47c9eaffffffffffffffffbf312247533d481e255cc414aa158f33c061e6c23a4eb1b0457f9df0292c54026da0e610166eef428f7bdeab65960c544dfb3a85d76e785240a1ff6d0d9b359a61593bb100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf058755dfb962baffa13e487e2066d9cdd2e73d30393cea686885fec234b286e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116f2b641ae2baec12c880f060a52f92275c2b7dc2b19baa9fcf0eb0901cb60e6500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33828429a1688ad59cf8afc095dfada0bc7a68ae87410aa6bbcd313eda962aaa60ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856991ec14f6d788b231c79fcaf70bad580bbde23a0f8b219222100ed1219a9c6d6a863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0deeac2844100831bd72078986ee717d29efbd32dbf7ae67775626cd4c64074b200e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b09af2bc1f663fec6365862a85918512f7c4f6237045e1bb8e4b9e45f4b340c73f00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a45bc5dd6d400d8781dcdfbd7336f1a34be99f0b940d3f2eac714f0d02aa9d5af103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eff67c19cce7de0823a43dfe681add7b4d91af49a4a51d6ac7a5e9604c7acd25700f003000000000000889d2af30c34889ccdbcd951fe9513c6401fe297b067a079934b4fb06a090a55f042f7ca864d84e4b3f7729194b3e608b7c6ccce669a53a2d1fcef8c459a583e21c06d8101bd88da99a8ceba6d75d3a4b8d8266012854e541f1d270baba4272fa02426f9b7dfcf15b7a1301414a3728c5d6ce1015e78a104ab623aeaaeb6bff0be9cbf8add4b3fe6d3acf240e7b27ad2a60d8f2f8f447b5ae0b87e5b229da5dafc82422a6a1d58d1bf83c6678ae1a432d6b6f21ecc08dc60af10aec2766859f0b06674febe0e411445bc1dabbc54b89568d4d7ae1b61487544c8cabcac64e8e4a498de321e3b46ed351874abf82cfa088ff1c8c11078c5f0f2589b58fe5b1b217ea2c5b09e5cdfd5b28fb6f5c80a4160d28cdc9ea2e11424cd8a5c90e296886da692fb6a613117cb5367ae107a84282eaf5df49c9767dc9d5b576e079dd718fe3494cf4388cb94215a28f4dc3cb36ff5a51662589a4552a5948765646f7ab151b328d8dbddc79cf739d7f2ae82d8d60dba04b23ceff26c302160e39809242276a6ac8f47901c32e30d73a0c89d356f2f6fdc84ebcbe5f1c0e5960b0ab485a81cac50d0620ff9d25872b1bd41a35d75ce80a229d654841d668846e3dfed70201c7d3a6f4cfd4a5d53dd050292bbbedd256b2cd784c4bf09e7b3c2adf4a5c439c2b790518e85d20bfb48246da7a66d1dac75f79fce8761462fc43129ff3f6bbf3db6589f95201e8f735b03c0dbfdd3de9c3abd4063d83542d07c1fbcc3174ab59756576f20568b59b952ffa29962409c31b596829e824194bea7482e35f5088d10c4e27ecff475966eebde1b03527a7f0f4f8f3f9e967fcb36234b7dba9b34b1a90d42ebe107443d4475bd06231e7ddc5825a0239277c3fa487a6bf42a1e327ab2d1c78cd20a447b8046f86b453f6fdf113bf5386b32a35bc42cf0342d1723659b5f2572cb6d950811928095e53717fb6cad1f8c44ff3ed24aa49f7323903011e7568f9d449f400212cd47cc93ee3cc801bef6a11345a06dac691cda461535fc35c87ddf3cf42897c949dd63609830f25ae868e7a95c5f9342b2b97faf7da91b325660089cb8cbe9bd836f8b413b7f2e6abc791da3bd020d508f3281c20fee30ca278535aac672724e3d23b6a80808d96cb7d4ee1c77ccb58c9233455e43d5ee0108c7fb2a4b2f84f94276e54fd0d7f211dc35f299bbba70454e16d51aeb32fd044533be63da3181c580c1022cab682e4a390b8bede724383291e9ffa5e29092bb4f3cda66220a2352d1f8feee7bfab0600376adff48d2da0a040c7346d2642d1d2c0a73ff0ae22e4ef8cc6666b79c403f9312b2377d87f10e6455c46f0c926e5f105284ea9d70c1ace5c5db28e8eadd5a7ca618af189d0217af63e4d6fa1039c64a7da51b21d2161edce2a3eacdc3844a -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b103690a090be3fbbd465f908fa2f8443b4a99e57c97b49e76d27eb10cdf593901e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38a6c077ce1984e98ae5e0a03812cad516a104dc22a0969ca332065a01d73facddffffffffffffffffbf312247533d481e255cc414b626955b93aaa7fd480b4e9398084345b1f4a2e2bf847795cc191e6a14e884c305e10c23ce78713b8c70f4dcdb755cc06896c331f46ced5600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c077dcea3015718023ca5feceb8779251798fe72c944ebc849aaca95cc42564724bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861115ed4863146d476a9d37bfea5a4b230dc9395c7bdb9c2b331ca7db32cc3c1ee500d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e337b0d75da1db137ff832991d71ad5e9f0a26e9f30a99739081563756eed7bdc69ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569c286165e2b8215ab6069102fdc8b343cc1c4d9b5248367ad3c41538e6a38aa6d863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0fabd5520d7afd8feea4ae6066a6f8233d2c7d0a149d325ecd1ed29c7a062e8ea00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b087ac9d5e984d4edc8728b16df87e614f6825932e16d7526004a7530873daf7e100d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a43b5c796ff0be5d611760801e014dcce7b47a9ff61f08ab64bff7562e029632bd03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e6360cd69191bd1d6b483b5354bfddd648e421f502a2b2e6310e12dc21cebdfe900f003000000000000b7552ea665f7069f5b8850a6e7d063fdb09bbf59b241417ff4e501172e8c3b4fbe86d19320e4fd5b2c0f1f1eb2fea372ab2566f078a4ccdb6e54d2535457a93ac17f81595664ed74f8076831a74ffd24e6f64e5ec258f8d144a985c752cc71ba823ef976f20d30dda1ed0e8adb9b1a83eb0c5f1c1f457fe956a56cc4d1f3b566a61f93f0582fb4ea5c1221f1b403ec6c88c8f4e9624e93dd7fb08259c8a2d0c177377ddbcd558caa25f5a72dc92fbaa1e71163204b07d968c44ed34f986bee00841db9f62f7a8feedfaca3a92ee6134b2ee1b228c4634203fbcd6eab4d700a619d203d391c2d3c3af88673606a5d067aa5cb5979cb7538449d7e5f9aaffade84a536c6c6ad13861dea5a7343e9f5fff26f5cd11eeda8bab8861371b4b61d4b40b7c521aa5a1b5a55624bfd9d1b0303bcdcf719ef17ec736234ea7f6dafc9e79d02a87bf272172d9ecaac16548825f69094f842161ce289041e74e0e7c626c269b4d5a56dbb4fa249ffb52e3d3c33131633f2b8facc609186d3e450e816e6c14081a977ce792ec687ce377b15d0aba5190d7706616fec9290c7eeb6ddff9226a8f3cfd8dcb6e5058532e12d1f7211b25b8c724b14c366c10947f3722d43ef12f668714f4a9b17cc7ebc5d3a657b702bc90b59cc2a151518bc7bc49c0624a861f8ab61f03264b0b2124da2d0f0207364117e557bc6af71988ba230a259e0d06df7eafe11eeb3c6508fefce6a1b8a3c45db14f0245dce186e31cf90b4c4d8de307038a94db90348810d187b2354272ce16b8f6e6c802dc35f9f5ad04d4fb79f8042b581ae99ad6df59a614d7d5a6b4d8d434f9e292dac3a42690699337204c3a50b3c535b192b8f22b8bf5a452d8487a54658c41d0c6c9668276762fc3c89c9229eecc0a95de40d4bde04f4387da752160346a82ec8bd6835f61b7bd1ffdaad6ba1f1114ed6c1fab7a9c516665c9da13d49f42ecf66fdfa517a240cbe4de7fe17bedd090bffafc86647ad4cc3fbce7d8523e5c3b158dea80236bfc43bd0ca960b7f8e4b5f45bd0f3d5350b282ee9310d73cdadd5081e8f8a36e662e1f2f4433064908e3caab2cc0d1022dc01a3764ecc86e337b187a4d4e1e64039bc6da2ba08d9c446a39f7797af64529acfc139e89be06dade1543cfaf272d95546feef98e48c026ced70e056e5cbf27b0b50eb806aa31cc8aefcb1c57cbc7f7936733feb4f933004cc3985595a47d953c9a2cde369a03ea361f619999e53c2a93ea76bd84f750614be4a932c8892a3d7cbc9b919fdf0ba55d90b92ed19b32cc5f6681517ff460488e56bef84e22a662eac79e28004e5180670b8f76b2c6e8e37e469be9d4f003358019526e43582a6355c9762f9ea40a0ac7f887b9d241835c42f72129bc091c7c782bac757aebb5c1fed4e7e86d7f33 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000014f04d5edb9f3ffe5f0957a4e007429c16683f3a1d223082c05cede964237a5401e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38fbda1ea6cb88ad1e68c8e4f618adea390d359e12373d5647a940be7a422ac626ffffffffffffffffbf312247533d481e255cc414c08c28c883d10d68189456a7c77c220bb9293f07a467d425e07eedc8100cdecedf5278a7b4e0a0a82b989684ee74719fae38df6d14b0d52100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7e41bb6613f30aaea55b0907dcbee0e0ec19c20424e6d45ddb08be8a4e8625734bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861149842ca8d2fb409e26425a145c4111b6b1022d2cdaf3bd81406dda49c40dec9d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3345e8562317e928fbab6b371691bdf80d45c41a816b5dab1c4a57208fed281e57ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569a76f6c8efba0f31104b408fd002e27e9c41f3990382a3b8fea87de82e121781e863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0544da3039fdc0cc2797987f13dffd206972245b0dc6852d5d32db21e66308dad00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b068fde02f013444066b051ffcb7cfadd785483248b02177632ea6bc4c2ee0045700d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4c619f5ff3367908e95a931de25fa9b8970b26959947756ef533937dfcdfbc94403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e4f4a2b249292aa3871172c644d4607927e51fd90ebba479f0902439e6f90c1b800f0030000000000008685d1e68a6da8d1b4bc29929e24808d0f4889a2ff83b5f7c6a1edba385a43f7e17d08c408c581579ef7bb8a6abed6ae96ccec525d6935a516e4c7954afbe3e6d77cf35456aa81abed8d0c5da295efb9ecaa5eef7364ef827c4384714286820a8fe5e5a4d734f11f1b11ae6cf1278fb24a9da9f421165e723e8e8e19d95a7a44d487d89680b6b66947b8b888315cb19899125ff521aea9f69eaddba81ca66cf5c595ebf54d0d76d8368a6ee6cad029be02c5018e168191d9b00ff4f2cba651579223c05306afabe0f8b1be5df61f8c030e5deee9e963267aec71559c76fc9ac20a0fe1933e1fe645998abdd321bbb0e9a1591ab1695a84c3d91cd2401fa060ef6736389ccefaf659df0dea46bfb930d15ac6bc48f58b1508192e8b154f50708388d33093f060f44ce7c0c385db0b733602f812f4d1050f7a157c9327cc10fdf1767810c80cffdf80b9f7434654120a2589cb77646a7e5bdc36163fd1c9cc1693c94150447b33ee5797268fe2baf5becb68f7732e9241b58a32a48b61ebf6b6df9658211ba9297b91533c6ad8d9d8ccee2b3ced7d866040255684f68ef81161b4102a15ff86206ed94c4cb3161e0b31808e6f08e3ad9f0040787087d6fe25c14293de4ab6552715853d79f63a2ffefc20f6d4846e1da9d634fe6bc5873ed3d09eb66fb952788abc1ade93d87dc82fd0b54035201f27d478a43b8ac285c5bd07564dabdf947cca9b406b2966f6f6e3ea97687106daacf0700588b99f5ff95550c5494904300fff1fae13079999beb941253f0bbff4e35d086db348f3f72a4ee3c6d64532e250541b24805e812dc4397239406968280f719ab1134127619acbd3d96f43965260b18fd2d3512ff0556ab03cc57cbfd4b22df3f9b09e4e9b9bb518e3ee443442f4bdc003f411e31c0e5fc54fe2c63286abeafce9e7a0175ad0f8de32b208e28d3ab3a311c242bcf2a61254001e5b00f6fd68cbe57842f8363a13d26965132582bcfc4e7543d5f47c9bafe63abba4ffe98eacfc987cd06d943e9ea692ed7c377c250f4f153103b4b69f0d4232d437d864d95f3390eeb19429b6ecbfddc332c40aaf74cd37850b6e5d2e0bb31cb09dfa71caba01883043b3cafb49a309e8bc41ac33470cfa1ea89d2733ac890cb9e663c285711d323d26807f73dca60ff99da227401143b303377d8f2ec26a37c2e93879b73e119ae5f8b29b5a209b5a9a415c7fa0b78b771634625a51adf24b3c9f07fc5f47aa9bd5ba26a9c73eb48e11f75bd507d66d57f18fa800304a652abfce4d18954aab311edd07b3105eb31f019741b65ba63b92d17383d1e878ca001f1198da13403cc25786bcd7f624251cce096f045a7a06ba1542504fae84185f8e2de1bb3375f1ca8dd92f4ed05637b51555e6774230ae8a7f3a6274af35ae4b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000618bb20d5f8fac31a8ee196c1ca29c20a564668cea3c388bd80e2dd2256fa45301e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38da78a6d14e8541fcc2c1a54f2382c081a8a674596ceee32b05c86bbfd7c7fb11ffffffffffffffffbf312247533d481e255cc414047bd04923b6d827946195448fe1f727a36d82791865b425741625c7c3cb73cd540c8ffe9566fde0754bbd2dad90f5f8c12626bca47d8e0900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c56bc1073a9a53f0229944696c6a5384806a6e8d44acf5d35ef937860467cbaf14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119b8f694c295a0018391309952aa55072fd475d1a3a5933deffa4b4b8d0c448d700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e337b364ffb7ee9ee626d804e8aa1ba34f271338ae7735d138efbf43d782cce58a9ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856924ead495af09a284d2546c09475fa744410b384c6324e01d6b8a1b54028abaa5863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0f39f7a5e878ec516c398d28130c40b574b2adb5124781072e0fe8beb1f30a25300e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0c867d25282a2b729c47b3a38a77595ec25be66e1fd37436f87eee7a90e64e05200d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4b669a4b19933fdd9d6b202eb6923741e150f7d6051c58892078c28a49bd690d903c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e713cf1d37c7beb050ac5d1eec753db33f763349db4ac2ffceae1d4b1a3dc113b00f003000000000000b2dfc040ea0cfc7c55fde11ca86174eb6ced024422f56a25919e6716d858902ab0c1e75eaae1eb6359165a1154abb695b05d996131379125519c3428e29eca41df58dd3c2c861745246e5c360bc55912687adab74fb617e3ed04cc35b86fb36083c7f5127a253a394261ddfdd3821b3da32807b533531136e00785fc5a48c763fc1ba10517c18b4b1ed7c833518f9bd7913782e311de35402648d42fd94aa9d9f81bbf7de5196029bdad2348cc7eaca3b361f5f873b23d7f37ae07fd0c379bf4b5ffbe72c06504cfefab079fce5cb5e4c4500230ba0f9e0911d947cdc2130312bce11c99dcbad6c9ebdcf560847efae68e594dd539bcafa28c56dcf59d4abb9a44a41e8681e743ed8a3d7f86410b6f06e2fab63f95360261d24f5e12d04a1d05ad9b87cca7ca6ea331a4275f20d551bc2bfe27582028b3ce29b875421a04e60755385e79c92a89658f08923e5916e69b8ce175aa5a3785b9713309d76358b491428bdc0ea626e566e7597be2a97eafad843e527350bce5146321af5a4d157c7ab14ab9aacffb8d01d2cd390632d860b3d38862912447c4898e99719c5b2e018f8f45b5744059bece0d052f45f603a37d815bd42cdc667597ccf43a8e30a2910bb680d8c0c362f68ec854704c1b856e6b864579730631950215b37e53ba9cddbd8c67f1fc70d99d7091b63fbc59423baf197e94f4b3ce90867645f096c8bcd8fc614912e9b47bd6364b2dcd5f755a13356264a92fd3306338597e809c1d16022b3a0c75b53abd2d49db4fa0550675d6168a66c0cc2237621b9e37ae1606ec2e7eb7f2df53ac4ccf5e010aa7f226ae205b20fbd73dd92cd139737397fc6e7c28b779eb5b74908f2828d49ace221966ba6ffa6520002dcdab779bb72e5746c3df617545b5c604fafaca867c0378832460085a8fa9e65dcea07839ea3e2966c1261048a9d91097d12ef014c0b546adb1c469bca4fe4e4be37591a89e450e10f0b4e3ccd7c6a223b047e82af311c7043f652f832a5faf7ea1f23ce696dc9ca705a6e3ce84699768765dccd87fb3e733d5a1292c911e80bf5b1b1720c872a25cfca65673f0e964bef137f2ff1f29ebf6bae27244c85ae99b8fb475e9aadab047ad3f0a6e60144e9e0e84a7234b129c15a2d346636e863c14ac94bca429678cc0dcb725d29cf60bafdb6bc48a817e0906ea700e5f29a595ef52740e2db016da195749d64c20b21fbd131cf36839ba72c061c32871f2afc1eedd0fa1c4f9dc0890340120ca31276a5d075b76b3076a65dfe36b6caf239f750d58436a12884feac901f835b9f9427cf42010cde837e844c26bbb20f12a3cb0eebd53d70138673f42a9a06c34f56eee0054c91ebd881ed8963eba1bbdb79d32d977572a28102b210eb3fec0ad98328b49eaaa9034f9457b00084c36 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ee0b623e998fe4489ae4e7330116df7e2dcf06ffe4aae639ee8a9610489c276b01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38fd5c14e43d78f72443850a45ed69a5623c512a346bcf09372b72da1e6077ceb0ffffffffffffffffbf312247533d481e255cc41467f34ce56562f3780bb8246f4bb5cb9e2f97a0ba36675b2ca607379e60ccc5d85a8a8796de530c0cab017f586ac3df55383937f188f403cc00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6f7d0ee725b9760332f279047a18d52207efbd38e7db204fa8c7c48ec6f25aa44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861109a4bf9fb13cf86e47f5d7adc298d39120bace026fc549c4b1592b30b360552700d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33442494f3f990368388c5f5783659fe1ad60bfdb8a424f097caca112e0fa266eeffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085692a0e43c78bb5771c21ae74ded0105b9ff18a707a5d35c4db2f1234d81e87bc4b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0d50f4c11ca7743f3a5abf16a22fa743c08a57874cc1103e3845eb38d19b3cb3800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0f569660e593e9c2058df2b647d1c5f1823cbff5680523dd41bcdd0c5c3b030c900d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4074383f83a3e86381db2c547c329ef50010fe7ff54ff62b9f207214f6383728103c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e9118edfa4877df599da3d2cfb49653687fa5c8fb30ce4dfb5db7dbc3c5fbc2aa00f003000000000000a2a4258657a2a268ecbd0bdd2691463331a9a048aff7ee2cdb9e11d01c144a4d404b72ef6c048ee54262721acce17808b38c288f183d0323c0c25bd688f397a84df54c564d96afa2942667f6e84c2d9c0bb6e41fbdabca0845c4b20e8bbd84ad8c16eeb1a3f0630e3a4aef386dafb96de4a59ae7ae72b3dc2922e7f81b35b8ee43fb7fe79a94836ab66fa7889483b356af35ea2a25a4342f60fc5a23ec1e3861636cd98e05df2ada7e1fa7379c0bebf1a1250c7a9a5bc245230b3f17a3c65d7e8cbc817686cc878bf2edc72ab0a19f1affdcf115b6efdd1678ac4b902e4cdd6e72ee74b8600e83614e2337b2e8f8928aa8bf6dfcca8c149398f063a3bd884c53ac442745bc07c546399d5cca88e3649043fdffe2b9b7d056624ea424627cf82287237cc7779be888ed2480ffd15aa1525eec30d80c1a9ea1084224f20949507a6a3bead4e135782724b1addb06d34373b15dda587da25e07f88b66ff716f6d46a4f1f9e4c6facbdb2ab94bfb9616254ec7f88d99fb942a5f3958c479244cee949156d0fcf5f080a9993360dc4559b4db4a5697a9b8dcf769dba32ce99a043d0872674dc200435b171cfbc65b60cede7b994fb313d6a4d8d396a5102b04bec33ee85e7bb0f3e815e1e132cf5798c9fc25db605b2bb5f8667ae28365ccc6363453b5a7f25022765c3ef9c7478213941859623a131d1dd2828f12146f93258683e48011e168fd83dd6a9afdce1d4fa5e92ffda7fb0e29e380f970730ba09346b9c872c73092c629e8a311e347b9b5e47c2e4020091f2342a68687a35a18e5eb8a206478e5c182bf9e0d16c2361c437c4a07f5136ef49bceef972e0c9748e1f74d3a610b594b7f87610c225e18e66e910f05bb9073384f082fe56f29725b5724951f57ac97ffd71a6aca578388070ebd182ffa014a677bb9d91ee5efa6f062b36815d8d920b054a4d62638350ad564b31f5287b11954db9896ddc92a6420be1ce78d57980ad9d54ac64cd403e2cd30eafb591d14225b26a060fea523995845761cddb42c7d16cdfc7728b82af3d2a0ac345d8c7c77c21b6af9db6fbb9521b7cda695d5aea18c79484d8684f714d5234258005289a091750449f4c2ab331819050343f9782bf50f3aa108adb936ab09a3a528a35b1ddc3f9bb9a452e5ecbf734e3c9b61bd5dcd0354ba5ffc6d24f843f81f4a947cd7b2c5ea240926c517edb174fbd7e230dbed0efd0261e1a8dd3fc608080ca27944232b557047dfc5cfff9025df73c9b81d9314aa915f89e7d9849bbe5027d76ce5047a89b4869e0d45dcf27108aca8f5826bb1a90e4071f3bbfce8f5e36a7945776ad804a3ae2dfe3c2c8e67e0606e98fdab1956af462282d0070c076b1a7ae76d79f9db88a6cca74790313f0206f976ea6319302acceb092e2c95e0501b -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ad2a0b822b7dfeece0b5c2766e54291ecc81a6102f5f6cab4442ae21294adc6201e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc381d1f42a7b257cfb5eb63097e6fdd766311a35387c6ae39694ac91bc9341e1c96ffffffffffffffffbf312247533d481e255cc414c17794623d27032cebb47d207f2a8f73fb87c8212df8dd85cf1a4c0820b76907eb46e6274c2e863c210e0b2594e5d0f7ef7693e3060c4bcd00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cd6141c3d161b517187d7502e738ca4ccdeb4c9a266b848404741069a6d9aadcf4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ca5203aa33c2cf0e46e1a2780a888988c1dd04864318f8ab06920232ba65435400d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33a1e8becaf545f09c3bf7f179db578533b1ea1b61b2c13a84291c32f7cc57f118ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856913385d72fed2e1b68f59514702894bcc3e927e7f9cf617494adac4769363748b863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0941041e6c96ddf486b125af497081589b224af722035e455f50f31456a1e093800e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01819d664d7a1604d8c21aa0066b50ec9b3ef000ddd22ce4b075eef4ba4c4c83500d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a47885a5e3ce2a0484e9e6dc343a97f102ce7782ae8aa231b5991197811b9cde5203c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e51ced5f103411afeb687b3579fb78bbb1c18c41373ee3aa92a02c42d392a8de500f00300000000000084d2df15fea7fc31f740227d68ef065ffe2f133ba48da17a67b043ef86f2b8fd91fccadad8c2f5955cdc4267400a239193e3c3a20b92e8e1e4bdbb70e10d99b480ab3d4be0ad4a47a6f0d552e55fbb75beda3204a5788806c1606f7c46004244ae6d640715feda3d362b7eecda371dc7dabe8447efc3f0f9794a5fb7790ba63c0934ff5f9c3d22b0386607f568e98f0a8ea7ee079ae098ce1ba819358c4e44ea35c4f03bc6e30629145c1e8e1e106739f6c6e552f30dc016703af56480b13fffa4f91658a0394ee14a3cddbb8b52cab1c30f59558fd77c4c13483e72f1d4adfd0ba3300ed9ff6482955104741e0066cfb81e3244a34eef22a12ae82c6babf3d52999de51723c394d31dc7bf0d098163861cd9430bea7cbba163ba4427fde3703a9a62e0c97e9aea33b79f5582d8d24ccb6158011dff63c6ff788c60d5c994c6364648a01c8b41d48e014464417bfdb01a9008b8aa788cbf83a2d652af693d9ca675c931d68fe57a5fa44ed7adcd7d0508def7a3c89fe21eafe4bc6a3a42f72ed8c40a2882e6b5f969cbfa6509e56f151a5cfe2820bc947f1cd29f6e6b5c3f44e7373ce929c1310bb7869aae28afb0230ad52e9e9b957db4f2b736e79652d9db961001d9b9bfb265bc6045151e99eb14a2ce37e06d02aaae3233f72536931e6e389fc356de254ad109fe113af8ac03d7c00d92c5caf669d8b3eca7ab69892b3363abb8489dfa7f4d4b7348972e26bfd5e608ead7825de4fa7b5f535ab19eec5b17eaedcb62e0b67d5bcdcc7abdc611d53709b9bef1f068d31e69aa53fe6b9ce9851feeb09f41a9c13d17e254bf4221d286af4352bf517e63ff9b0c825da386e0418e94e14c582738f8afffef2f551bd4ad6ce21ed56297652ad1ed312ebf52a663d607067d5d4a28b5ef03f7d03b1844f6bb3329b6f31328203573572f07d7caba6f0bdd6f2d99b47755891d2d1d2613baed25037bd527837d0056285492fff02b5aeec914254b63f34843e3432f3ac6b163f71598dc90f5ade418d31562508c5328c015e4eff9466f7e86c4e95654861a2ae3942c105a3f4903f950397c50140db06a6267c1561f1e2e4b73a59cb210b6e5ec18b3eb69f576e4d1ae2170df123305ca3d1fcccd68865c238e1e2766157bdea5deea654d000eba47c1ac7796d751d0b326a4db97b7451144fa604e87b6c42f829f8ba44203e4fc3af6b002b4737d94c757ccc989c5cdf78c5c2baa2a22676451962a92138e260d3de609d78f2fffad11b0a5f89a674f6f83bf661d6272581cbafc37d61ebe079834a0547de8d19a50d9d67280fc661c0ead32632870468548e2b49733758b6ab87977a746f971c2bbcd416e6f3b395b917c5d13dabb32806043b6c8f17269cb6f74e42889b30b6e99b6e2fe03aa12bbafd98537a7a5c25 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000002ee0c5f532b2eb37cfd1f1c3f28ebe149823f14c7241109f2cbc36d42ca7346e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc387948781e4b53f82eed85b0edd051a9cf62db3490e355c098b806f05720c5e44cffffffffffffffffbf312247533d481e255cc414c37fba77a7df776ff68422c83105cd4bd174778fb4c3cbb19a2fedff484d2774db49c2af90095b7adf19088576216839abb6cb8d5fe223ef00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c9c3d5bc3777b7a8b4c6fcba2b8a17dc64d7c5f72ce810b9f8df05b39afeb365e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611541df324c881171b145890dde6275906fdb76e663b9ad142c09240a6614946ef00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3336e68d4b1a95251e25f27ed76981a68676b6a3085d4762b31baf496055cb3f60ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856963627641c6d4250ae1542c73d404c56653c9d4149a3a93928f842daf28d2fd8f863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0c7bde2ca30d083349667fe5ad61912d86238e32fa612b9b5c7ea6be469bcd02600e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b008a9ef8c9e8f0c285ee784096eefbd72e23e4c6d226f91322808b780d3ecea2800d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a454d04b64c7ea68c3b65ac32ef017b787ac25fe26f8b6d6031f2b3624ff6cb85403c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eeaeb15d68df022fe1f738410ea1c1cdc64c9e3106be46afea9e5f173fe5ee59d00f003000000000000ae12b95c85bed5f5be05d0c89f8b57d2ec1932471850c29cbb4b78f1142ddd77f78236416b8519118445fe6d9b84a6aa963c84447501b60371361182a77c14fddfd13e603b385b894833d78a788e013b5fc24577dd1834227804d9b933f51b12aab3eb4f524878d5d93f2196bd0b6c1cd1a0f05e432536eb9fe6cb4171fdb8b04abe5c857b70252a12517e9e01c55d52a96ca85405daca9cfc88fe7c848f8440cc8ed892b883af369b35813c0e97f37f15376bb55413169016b5015c4b80bd85af7190e503e0fb2616dd042aff9129dbebae8965e0f06b3166a2c6129395aba9f87e4e1c9d1f46e58991eb674edb16468c6be2022b1baef5df77d68b9efa4e4ddbdbc27538fa267ade9fa9f0a6d1c695c71721bc221c4042ce0681eddf920c73af632c8973c87a39b0252a9cb3db2fd89968d9626a6724a955ddffaf260e8f917b5cfeb0c7fa89e02f24e09da5ebc09bb0f26e61c09fe659cbc337b02f59cb452eb227367abeeea5fba918e85418090bade58ed737bb8008b848a2b1418d39f0959368ee263a37ec64d62676c4598f41c5e8a12e3256968b5554053b80ca8a67b4b09853539c598c3434c8b14ab020a8b6a80fd656a8ec816101accea022acddb4bfd6a5e9d3d09f8be1d35e3adb2c021b979e773b4cdfa509f73cb7b704619e8984d0a13abe535ff0c042144da1af3b72060dd5eb9e0ab48ee021fbccc88930309a7b544f716b1584409b19c3bef61de0e5bdd874516cd1661a3db6040ca7c3ebd27c5354eb2c5cd37576e333f206516ca2769ba12369365119b996d91350cd4796555ff01e83310e10e47ba643776ad901a6871dff293f53f3b99b81846be4aa23682e73a649e6e2ec0f8e723855219b607ea10f655b64333a2632a443f863b247fee27e4963890005c8d678b2ff427c358705889776284018a8e37e5d347b34a5b22f9333c15c8aaea7f00ec1063ad0df25090f0ec28f3773af34abe86a80eb71fb1b4ac278967622974301868b175c3d95093bffe459e7a4b336dd8cb746cc44ea31db5b3616051357fecf20af18448c49a5cd9b79b2b3f58a5115b2697ee4253c4c39e1b7f63c1f0fcaa3bb5c57946170b7bfdba03e8a67040ebaf5a554bd7af78762425ec3848116b4f62eb12849156a890b552f6420317c13c41935d9d7417552884497c10c91cd06c4e8540cad6c39f314fe4e51d3c2361cd535b2a591a6080fb4488f2dba2937894ff18b5686587cfa6a43c829393fa7d0ebe275ce8ceef3b21bd0799802ce1a078bcff260c165c20123b91d51f9119cc624e80b46f3a58a78afcbb4f9ac2905c95707d758d580394fa136988ff02ef2af3c347009e4a92fc3fc2b99c48c324b896ffcf550268957c76efe94884476c1d54975adbf884c5c8ce53d4a941a0aea1826a12367 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000944f366e077832159652e9e698e3c1bf74d33f69fd5add0b9285373087181a1e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38b9abfb58d29af163818c13f09fc99baea7c0694c37d077da2fa6a59370cb8953ffffffffffffffffbf312247533d481e255cc4148d4669f098852ff2bd16ee337e0035663ab1fa2c24229807352df40bb0cac7f7db7e21a77f8aea9a8b9238fdd7bf2c93a4cde5f18f50dd0f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb960b6e47e3fc305f4f3f11fbd929f35df972cb7967395d3b1bbc7c48f480bc24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e09e74becba14473d95b9d406936a213eff647beb0afa92a79aeb8a4878bae2c00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e334b25630faadc0d464f97866d2ca2ccc471600096670e3d118273c1e04374664affffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d8808569bce04d91d12ab5e0f7743115dace74c2fbdcce820907e28d6d26c49205b7bd58863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0e1a498875afeab71964b8bde8225d4e6e43127cd8df3d5d9522ba77470836ae700e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0a0aad12c73b5b0058b0cb340406c231b0249065a4bcafda995f350893b0daebc00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a442ef6224a668eb9d0469570d6742657ee97141bb9f7320519e04d22b280d74ca03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e817049577a96937ddfbc74db50e87410f94ccdc4aa9776e4d57ea655e7e63b3100f003000000000000903714db640bc0c51dd28e92fde43e008db877ccf18c9c4dc733ea298407e1efd537f5bc19e7aa0c767d100e6dccfc0ca4b46fb0eb3cb44602aed2f637b591a068ccd0e1f18231de05a589d384ae04b93fd6add3e8c0ad66320a461413340a1aa687d155d7ca569c8e536f9e70e5849cb4438e5d0a1899cf88ba61f10c437ba46c454b1ee81dd270ddfde540dd16a8f280311aaf1a3309a8b826c26f22f359dd6c8abc6a3031c1447b4434f4a71d0232c825beeff0739a1d9d313b7e1216de05b4f2f44540acb2be2647a27a5181a1e6528890b7d87ac94540bd9808d220375a185d792e0dea4a172be0b0c87756ba26a9cefb975c8682caa317598ad8a64b6cdb90e1ba1d8dae183b80d9ff04a9bd660239c0e240f1162e0b0401664d385f608135ab69b4a6520d4e12120ef8648c334c4d19c0e31925573e6b9dc68175e5b241509e595de412cc8c4dcb69c57bfc8f83ffb951786f7a532fed8b6f68abc064b2739b1f2ed1e489a7e01c6f0854ba58be69d6d99a3211333217037bec543f1785fa8ab26928f902b8d2aa3c5481bca3cb653f7236140a98ebcbea2b4f6f4a6cea582cfea77a181041e198bf76987e2a89c4de4f59aa0f30b210b7e4fa048c7fe47c5d087ec16a437d3b6688f3bc4c36a6560299847f59a708077bae729aa29c8362a628a4f389abb27f19b32b6148e6bfeba5f3f75e92b2b4bb3744caac8d3b63bb32aae34a6c20aa5c1b6f2544c88bb772c831f389cb32e1dc29125bc1cbb10b97ac4df0c18518abf4e594a796da67c62856b81b7f46024b59a794aa058f4137851bc935f789f5827d0b1c727def59d9b6485da813ad39e00ca951a075cf68dac5a8d9803342c51785367b2524455a26cbf40545bbb5fedab9a34cc34c556c4333564a28e9c7fd4bdc9d916c476a48b3324afe4ddbe20c6c60221f12b788b66c02a374916c6117ff22ddddcd36c12467117f04638aa499b17014292410fcfb63b8256a2b9084e56c9fc097eed35f5ea1951380f8283c8449ad899cf9198addf2df72345cbc9469fbc2ef87f993101281528a4e5fd92300c3c12fe4c8f439d15480da5102e45a2933bcd9aebadd9604883e6caa639901958cea57f5cc1fc7ad29436f16034d2acfebe440414b2ac611f245e1dac7532fc7b92bdbeceeea94d0a6d5be75356ec7b0e5faec8f3446a209efd878730d0a09468e58ce95afd9974f2943c9efaa5f2e88f361a1f3b4814437c0f3375b98feaa5f694d2a89de8f657cdbd0412fbe05b1dc4f0324ffdde5653a0a01c5f554d4c36ca0bbdde09ca4eed6967064376ad279fc2198f054a68db4508888b851da1392fc5885556a9e1eb7bf56a5b5950a86bafc6f37a57b1f83fa6cc922fca09308fee508e5513d04697a770d52b001caf49d86f9c72b0bfa549d55 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000f401906de70235edbd46584c682b8a6bb539a0e9572652a2deefc3e2e18d1d2601e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38a40431b22e5bb8ab0431dc96a4a97839ab82269775338e55b2a7d4c831293271ffffffffffffffffbf312247533d481e255cc41400b6cae2bbbd93aa665665ef90c99f83798a5a557da07fc2c79df49c3d10133068962f7f95bada4e3515f4243de8b0ec1eb1130a13aff44e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cddcd976fe7f3b3328603da3d49a7423a3f1f65d8ac1bd1ce94cc20fc989d8dc24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118857438fce89427473f26001772c79eb2e52696b78ab1d418cefd0ebef62fe6a00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e3372b87a5cdd131d5327a8d60bcf9e373923f82ffb6ed644abd1590367670a6ab7ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856961387eb8cb6f1a87c2215fcb3d02a9287d45dd6ee5c8da4a7d783c95ce00c752863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a05ffee30b6e1a0a942641b827cfd7ada31fcd41d0430082ec00f647b736a1602d00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b04bd84af4c3447c7378dc8755914427083cc9a2e426c60e3561db0f4ed8cf97e000d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a44c412415cc409bacc86fb2ad3bed9169a7da1afab50a575e7fdcf562abe3ca1c03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54eb5cb9c8ce9ba3f97283c42bddc6e051d4851b489cbaa8c4aa3dc71790dc2291800f003000000000000a9f76d70576e1e916f84f428eab2c0ca9380889cb9b4a4d299ba8526e17376379d02131ede81c21e4f46f1ba8f71250c848dc5e1d0c7268666ccb68bde2c904dde05e8129cad8341d03478cd599741bb6ff25518a4a6e73708c6b6c6106e6a67a694c02436ed124e19165010de874fb8265de5d71cac8fa922cc88f28226bddcc580dfbe509a0763e7ad4c505847becbb4e62eabf8c5cb95e069e16ebeb9a6728ae0b75738414b308a45d58aab6e32d3b12bcf2ddc4c6f216352479b2de1d5d391d6170887f05e7650fec2f4b29d987cf4452227a46edf3ec84f30335e66aa92391fb883caaa7ae9f8b88feae0c187379280d4f7ee7a0665de153f53a5412c25af0bc766925557d942083138c486f8877f3c5d0b465073bbbeec7abecdcb25ae8f205dccbf607d7534c19a57f79cb124666c77b6bca756a2eea8283dc8ede049c6bbfaf6b16a4da459facfbe0a504348919f14360c9c59b0c474d02e94cf661fc24fa8b0c125869a8852ab09a38711b55162084383e76d1f27dd17c4f1eb565b893e1a0cfb226a8f1199cce5bee2c45fcd548cd72b4b2624d03f1f0fdf32fa1ac2f7d50a97c212566b7ba73252c4df668c60fc56a23b227399fc41ccf58d6be3ec7607c93a0f775d0f399acbdc895cce5afd629d4c78e7418614f4aa92e2d728a5b592c0afa69ced3ef6cd736a2c28a195d7c4707e01bf7b4279e7e91045812fc97dab38c8456789e8dd8fcac10189742b37bdb1f69beaf47d3fa201d5d505d00d07890924c4140f3d6507a2f46f033253c9b81d0c6f0555863280a4f5b6f04ad811a527491a009a996ea5c7295b385b1276085b8d55d4525938d91c2e30001e6418fa2913db2e29a1ba0c5f1d973605787b1e63ca2dfddbd799a8b34a5836ffe9de1c44c18fdd8f711ff560335177422d69c95d15faae12eaffc25b5b742207d975a7a0d6658fd981f1428ab9edb641963ffc7096c5300aefaa17ec044c9f956ea14fcdc531656c84ec5bbb2c320562bb73cdf87a691ec021560aed3b3ab34ba7f2040d8e3cba654aa68c17b3e0c443956df3a962271382ce5f1586b0aeda47829d3ae1ae2ed0456b13bb5368201c49648c2bc38665328cf44b5a5dfa3f2b547ef83192fc9d8a1185ca56edcdbaa9543a2ba55ca55cd6bc75beb86eb320cde500af119ef588e069894ab63e722e13049911e8f10216c74777412c904c165e69a3b8a0d113bfd6c791c3097a0761a056fad8a4d8c03d8d028df794f3a9424a12af74839811924440edea8bd6e1cec23ec2bee52d1908256c722b3548030daebf24837b7951c0b7f49fe52cd483735d19ffcb9d51bc95d6f8dc3a1738d0426d539c5c51e95e571ecfd8f09f230561f03fc28ae446bca9bcf37dfd4ced3689c5606313c647daaa7adf3e773633a760ab37 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000098a6d0ee85d83a697e6bfed2798954998da1ab20baec106bb7bb2cdad5fef10401e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38570577e2929e372da2b69b1c902a53873b21a9ca5cdc7f5117f7d669126bb509ffffffffffffffffbf312247533d481e255cc414d22093924a1db6be3cf7979ff095b475f2226ee7d9cf23742f116d47d7ce192e2db92f17f43fcc217cd3aa9e1b3eb04bf28cf469ced2a60c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca03b47008273c8a0550adba059338bac2d1fc0530b486dde327e98a7fdba248b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086110fe03be3adf893b46fbc2d8fe34a889c6e20297923312a3e8f7ab06dda08291d00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33a43a670ff25582aa6a2a0fbda4b859fc6897abd7a3b314a13e6dc4e04baf429bffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085693f890ae14aeb2a58c8bf2fd64cc4c8feadf120cff85f5f9c6e6d1415d259bda0863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0c81e9d00e8ef2defa43b31d51fa4d9e8eea5003daf6844377327e0fc71e0efcf00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b01d8f9005c64db766a9d456ba13945961f601b68043d272df34bfa621b8556e8600d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a421e6b22044471df4a3031a87ac409ebd3808ecda4aafa3a6aa66a3419acac39e03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54ee1a0792d4325f1165be14bce1393f348e1a2b173e7ad40044654ab26e48ed05700f003000000000000977cb3f86e2dc39806b992524d08341e861c37b95f576e1cd854989226b5fb9d1020afde53eec5c31fe066e0c09e77fdadebea4bd9ec7b4d4227e234c49b50695abd5f22585419c4c08499a42b43210db8a38b8bd487ee8072a2dfd912ff8836b59d59c1a449af4f23433625e53a433c05e2aa925d8b994cbc0092bb223ed93aab19b51d4be9e281f1e139bf097c494bafec1b188ed19fa902df902f211119e6b8a28f1e40114a061017010aa450284d4ae32c3ee4106a0dd10b7625f5a13f1ea41529fe689630d8ee1b65a4b73a6e6d7feee052097362220a9ed876efd90c6962beed649909473dec380d719d4b1f9c8fd8c6efccaa968dd9bc1afac66f809cc573ed7822c658873595462bc373e9d728711a4ab71aa0b1079af9027f3581b28030f279f2c3fbb1d154bae46dff2ff0ceea9629ab8ca6408c68747e43b50fb30c9c26697885c4d1a8cb69d2e6e852aba3825241e523e8b40b32f3bdf4aaa33819c81e08e53a403d13cc97e198b3eae52d476dc18c5f479bfdf5d425b16b568a87466b585a6c5e94de6865c9497899608f42790f1187bdcfbfed04e0451cc7c3c651947e7688312d9f8eaa08bd994ecea78adbd15c43be5e5632914f1e5c27b905130185d373cdce80a00d3c6175885ac5922944e0049ba817d6bf3b0b9d3a5589d1be590a1d38eaceb27522890710abe71e55054488d69023d2831104928f0749ce7db692264cea5db4a9a2b963f534d6c583919ab66fcc9afbfae0d1390304248c0cd0409d0c057a017e9c92bb0a6aa6dbbf3fe1095b04450332cba192ae252e320c2ed88cd5bd6129a659f807d3379e5a8e400849ab35be005967506d4e344717c7cc172e801e7f42ed730d4d2300fa70e36cc803d7ef957c21ad3843c6526bcf820c73516e61962bf7df9f6fd63e0a7d3c331679105f4bce86d32bf536094e24937fc367304fab83d371163df70620cb7c9ca60fa3ae7e408569cf90ddff5fc39a85756b9bbe5aacf480dd37e9539be06337ba9e7b21c7d1e36a8c0e4aea7e426d17e8ce9d4c3e42168e45ee4e345b11bb9977acd86947a27db85fa28c84a5fe3a1ca969d9069f43707734e3be6742ca1d0b983cdb08cb8b690b3898ecd30e6d01456c2ac7c72ede417b2919e21564e82aee5959acaff165294e325c46074cb03827ab105b1b073d17e94f740e0ec58b55d3ef8b9170fe5f8982afabc9c323d518de9f7461fe8c1df0abb293d1026bb370457ba4ff074b41240ed7b0b86215230abce949f5a75c4b815d8426d61b63f7a106e992b9a89cf1d9f7ed82ca64af5dac368fad085adaffe89deb6bbb5c6b85dc950534b9cd67444407958fe695adfc855257bc6796433efea1683a9c1215c19529dc036c4e84fe92b435763727c4aff8ca4fd1ffe416401a4f94b1621d -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008bfbb50484f89df143b09a152c0ec892483043e4d0aaad36704f6fbb6e07046e01e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38490d88bdaa98fa624c62b566b8448f258e260c6b784f9432bc4eaf681e46eb90ffffffffffffffffbf312247533d481e255cc4147dfd2800f177a58d9cf82fb2a94e70f696cbd0b041cd41a5e45f5b1e9c033c2de425e9435549b85c1d3584d296be44c1797e2f52c897e3c900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c18b34236be3e3712c3aa6f7625196470173b44b68f9aa507efe64426f6f3c8104bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114c76fe0b51d7ea18fcd9f463114cd789531cafc16678c31407ea3d83c7a46dce00d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33215174b092d37d6265d94fa2fcc254267d8689fbe34b5319d48b6d612429e631ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d880856912e93ed195472f891a966ae2c511fbfba0b0c92c40bf7ae71063111463138740863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a0c097c0717a32fde36b54361d703544ff4cdda1480042f26146c25139df7e379d00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b08b1bf7b34f82f37c3b49d304b6aecbbddb30608002a09d16065929192e5c745e00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a4ca70b22f41e8dff51481162ee531281e99f90fda73eab25c6cec6d90adc6831503c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e0ec587185b200de042ea441a8ec9fa896f8d571090906e2eb57c9f9fc861005400f003000000000000ad5a0381fdf9c8665d54772e3182282afea02d9f1ce34a40387c927d9c7c48e0913715a3344811e8d28d21d1f391eb19aac7770c00595121588f48ca05ac9ad9df04e269a40a0b4f2374ea85c6fa8482e6c2180a641c26f52d44dc513da27dceb2692bb9f56866fc1354fcb9247bc047a34f9c5a6b784ba1a5064506f785935ae37000fb64001a6a59509e754f5d3f9a8beb29db19572eb4bfc8babf8773232f3e01327b684368531cdd5a52d7b047fe7d5c9e6c1292cdfbfdfe0fb29699732096f85ff130b1e765a255c8ab71d4cd485a0dd4996fb4390d809552bfab2a40f07921ce576384ad5a18863ab3ba61f3a0aeb7b85e159bb1c040f8e7f32610aa6937248a425fc4028df03a22e7f9ef3f42f3bd255f298f9093b278788ca9eb800db124ed4a75cb3585669ec710847684f383f9c02b9156702b19fe17728ca82dce73b5472d96236d89326a9213ddd3952d9897497c2faa0059f92ad5da0c2f5e88e7fa179c9bc6c1007828db5f14fd2ab3901ac800312c7ca4dcbc26967b89ea2c8e83195ef01fa0fad51a8e1fb507f1875ac0f5a42c52d24f2820d99a8e4b35e73edd91ce1d2d3d89dbf8816c1934553e830b2c816c13f33b095e7ac33574ed79e4a21f868a5f1580b915b1ba2701f1af81962c5c8fc4b87ecaf7579522135adfa191370615d83c07fa95ef1d43c52d341be7823322b39f54db85ce357c54152007569502c70267de019c393bf79496eaa2f96a19c50fd0dd2d63fca5dd756b3a7ebd35282a7628a5b8b4de3c63b0784059198ac3e685235918e0b55cd550ba3b7cccdfa1766a5b2a801175e9ea19991de7283d70c08463cbc62f10a0f4b18da099f86baf016c0fc190604a3aeee8294ca7bf7f857643eb4bb1bc6c5cd1d9401e4d7b2b2e372f29207f54848ec70f1a3b64395bca4cc15f6462cf5a6bac39e55330906356550e59c37837272be362fa3865a33288ecc15e4bdaab859e131e36f40479d2aa59183374d14fa159ecbf3a3d6a6e0f2dbd2dc19f6662b84a0fa333a894b2501d0146346c4d59f45bff68a051fc792c597b766ffe03cd4b7b0ec73f43f09895b24588163ae0698f2ead5c99324b1e6497e19c0cd7f1c48fc086d983678d136029f5b1d8ae5e19ae7f80512b59724794a7d18ae04b97fcb5aead1db64b7d7148cbfdbdcca08256f2434031cd1cc0cee7c57c1a10931dd3702a9efc032f387dfa4d43869ad3d57e84b2064838039b65dd421f8dc5e327bb7b70c649b77a9b2066f582622792f632de5f88dfe4147d318e52df5acdc6d60956a7cbf28ec874c19f0e58f6eb43e5ae530e83ba546a804420c5824e012700d1fcaa0720ed058fe3595a5f677e61ac5317717b7d5150a3e305d4320ab7f136de98253d3cd2cd58c1885eaa64f35d2cd5e5ee08e9f736 -008e03000000000000b402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000705a664db9faf5ed818ab2009d1b82ebda4dffaf5b4ee85245b0f9a44ea6230801e831bb10456f0464325c9e0dfb73eee0303daa92318eec30f9457b6d868786072dbbaec8a2acb879b48d311f1264b1aafe6bf26ccc0bb250af7a2e19e8dcdc38909f6752c16e4b44e054622b7c9e76004ff9fb323ed63332ffafcf9d2e2da5adffffffffffffffffbf312247533d481e255cc4141603ddf6a22735b19b2ebb33b2f39acf13811b1ece278025630700b5e5b3dbf91b55131b41eb2b5ac9876a1b0725dc147921a75573e10e5700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb940bf9229a1b16084d6e3e93aeea8f2e74a81a70c84b8386dc13971981355494bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a405042986b7f75d0df9f6d8e96f83496c4ac4a2dbc3cf136c768155c312ce6000d0cbffcd557abfd92e674c11a65cf940dca2a0c93b349eee29026da60ac04470385f1dcd6e403e52a22e35cafa045dcd89f8a6d8df4058adcdd5b6e84b272e33c2946e6254bead0fb63c7176ed6fad2f7059df212b1caf00e4f2b6e966394c01ffffffffffffffffc0c0064e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d65ed2fcfe9ff7d499454f05ceef4815ce60003c987918ab09230f65d88085692321a17d225b271d4cee4efbaff8b10f7d04123ccd485eaab5309abe083fc794863ea20e92613b271800c810f8713ea3f3518c2fdc7e421a5cf4f225741736a00e6efcfa4dd88c275865a04eebe3fee69c3a97123de7f6ecc2f3f88d699094ec00e1f50500000000000000000000000000e1f505000000000100000000000000d6ab5669f0b0ac8d907f783cbb846b0c5337b7c1f3363d5e21705580f3ace8b0ae9d7ae977e9d7a40ec3f0bb94fbcd80f432573772b3bd2ec138c5098f07d7ef00d1d1320bca8eb4e429c0e4875c6393e776d954de0d1003e8eaa61112606002a409e1db184bee7f7b1a550ab5dfe47cd7639a759d8b240a6becc7ccd891cc972c03c609407fa588dfb77aa0a8d092073492bfc3c8269a2014b5ab1b7a7edef54e82765473ddb85e61d4bab22d4bb4d9e5993b9d9c2c77a099a8da65c88515819300f003000000000000b254d9f4b376e3b6686e66ed4245c68df11d6ffe88876f6603b030cb0ef0e77e2e544e41fe919743335c1de2d3db4c3b8c6f1b16b7e6df4479a129cb8699eee58d488d40c1607fca6016b85c222a4b06cb7828e1a141172dfede26789ac5ef1596544245dca5b72c97d379c65b41bbb2b2b2c13a3a44efe21e216e5482252c33d34356880ae030e66aa1785492761d1582fb9949c0602e25bb40ff327270d6cbcc66db59ddf883c283a079e26c40a8530b6891d25fe04fa7944447dcec13cbcfab01f13d87e9ca92f77edf2b7b83fdd8538a448f6d04d8ec86a5805bcaafea0a3ac1293d52d0d6545c03bb37245a0d31985ef215ff6d74b3c57361f1352ee986ec86392c25f214e64876135fe83ed860f405667e8a9959601dbd9089d86b7b8eb88737d166ca72572eca14f3f2c6a1d8527eabe90e0c8cfe9148d40e39d98dd453b4c2aa7853457902dd6427d389532d84e89e445bb1c89c30ef244333358a84ddbbd839efdcbe4745cbc830b0232fe86c65da58826501dcab6fc981f6643736adfb8596e6446171de40f8fb3c08e776a55391045c4b546f0c6549d7db10a09b9467cdd97af99ca6c20bc524d9c8feaead5173cf7f14184660ba24ceff5f83e9035667283630dc36effc40703fd408b34d475a69254dc084bc57d80d9dde4f0da4b3444bbe4d562c6adb3493347a288b457ae56b5235695d1dd1f484e20643778b408caa68fb0576fed7a931e484f6b09313dfcc7f3f72a3b2de8d7886cebc12a71b6026c9f144784898d0c647dbb33202628de3b0b41208765daad515b575edf6c4f55492caf7e2500287ce5e2809428d66d2e0c59083ede5867c7d717875c2338478a5a143906752c0fbbf8c84a65328778d81489af93aa10d512973c2f4b06b7935db5d729cd45756a6c641b2854969e98d94e5e21003a7cfea69f41c7fafb0090e62f244c50e53a83a863560313c786ddd0dcfc83820b2b3ec5034eab44d57134ef5d5ecdcd44af4733947a2bf47bc8de88ec864086f087079ce9d3652a0b8aab35c1224a15d239c04aa4dcd46034eee179b65cf690efba0c6d85964c76761030d84cd26bb86bdb7a6e8335f44018a7a27ac3dede250259ee7c8bb8fe48ffadb5446bea5a6461172077077f0542efb043f9af9b444021c1fa50136e9b1f0f02c72386e2b5a54728a99f654252c5126473b04869844197247b430aea39bde41f577fedbf7f25cdc3f15efae2c5f17041068b5e4e8cc6e8c9abc201aeb38c39fae117d5bfcbbc0bea2a694f371bf3d876d63b3989206ce9c2985b0703f2ffdfe1a84bc5602d33003a65be7ed32104e131b4f926b4f986ba7d9cd524db24ee4136abc967ba6a90132427133343e8a2faaecc59f73183c57995496cc1ae08d4f2a07b5bb68c5af444f4a6629a05de04b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000005bfb898474fdfbba494090bb456897f7ef4ed062cf25bb2b193d65bff9f1d1e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6504ed0a4888aa513ea729c646b32bdd5556b0fa3fea55673c9bf2710534f4e56affffffffffffffffc9fe544d78de9957b0a915dee8d19ec767f9e16bebc7fd0b118ae3e709d586d6129a1de785b9a1b418c71fed7333d5e44b698ed7c117a12ced7d33f59d0f66a1b3e137a9009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aeb8bfc5d1e77774941f456f2066478336363266f8ed9be4fd118fa52da08976ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17b924e151fc3caeea7f071f62b70e05a0c86e838f7cb710ab52c357b36e85080d019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1edc22946dc1dfdd5c088344100f7860e74e5699790c38427246f4288e8a1b36ffffffffffffffff52882685dd4c1de20eb96ae2268def9f8771e97aa4138ab7b76b07e2c305bfd3cec14911727110842ca75a92425aecd1245f0051beca5b6a79e3451e0dc96277d735346f00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2503c751e7348c601417e90961d702597370621d00d368fb92a8311db8aa65cbb966185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4921309c3c09d1df9996f48e8046eb924a44ba22a6b33372b2fb4140db2fa449600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5873ba23edd844f9734935991dcf48e080046d9adc086abdcbe8762f5e27f2ec9800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4e05b28f48cd83df48be5776356dea1ed269f81e4fc2af4075156084ab88455b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086112c60d97768367859f03a13296588fdb7298dce576ec0cfbd7db6530d7a92580700f003000000000000889a342b656ee4903b18c7b6688027992ab4d52235a78a93067c1d258ee85267806fa6ff8142cde344c6e1c0a8144ec8827dfc3d06fd4c314f2f256dfa142f65642610d4936481ef8016a8f5ac5215175375d1dbaf6a0e08d766e116fea55543b853dc93424b840531ea78f3b0300c990a074491be942f636a5350ab33cd3d619ef2d3aa45ad44830ee5fc5f032efe64935481a61413e9b5bce5520324ddf9cf46fef25df4caf47462ce4f197c9aedd8077b1f018a241edbc67c00b5601312b68db22e03f2c51142ead26153504a678282fa910995f3766f027e488b8ec40ca3092b0654f63875b50a7bcd106cf4e23f8c7d9d424e5adfe4e19f408e48703dd428ac3a184a67c8aedd4a46b653056830bf69ef6a4df8b2de32228be05d0db44e999c9614ed1792eaf6c27fb9a95796b878ca0331dd22273abf5816c834dbf1ade05fab8b31c4858819730b62d4c3c31c8dfc634565286488158cd5644fa9c2dc1857f867de0357994248bf073fb9fa4e9792ac785f40d6e5bce28bb72b97b9cfa25e43c2f81b3054352f84f02136f9548df8cef5a8dfa9476cbab4f281c6954e0a785f61de6f24fceb9ef3592e8f48429885f355e3da224f0b40f9570fa99bc38d86d7f0a35b4b518d51c46903d539a6783dd3c26ebedd92726ed6fb1d15aab682c3ad83f987253952ccba0b7a1b3edbc907047b0946190a5fd0e192580f0f7e89819f6f04931c52733e66b4bb707ff4ece5f550abc7a0a5cf5288d481ec919855c5e6fd08d39afc715f4739e43932286fd74ff5ac30825d39c11909c1bd27eaa5c2806355f3333c6d89d37535290a3c5d7d8780954b70605ffa16638e6cf9b90be9279065bd4c8af9647db04cec5848cc1dfe25f905f6ec4b8dfc75440b45d14cf99f4ccc7c667d11f88929775f8f1e72c681f3d65bfe19b1a781a49bba8390b6e139d606a70d0adcc651eeb5f5da51faff39d7490c9b469694cd887da1ac7df7bbf8172f47891c1db93bbd0d90244ccb57411b1a7c194598dc98e281562c5ec770b114d787242b1b16c277f200f671cabc51dc6e8def4ae4226f85e394af50a9f81b1b2593b205b589987d8b1412083f34c7c22b8b61c96bbc8e62488bf7a5bb077f012e72976621357d22d939a309ac7db240da4b9a206010f4bdb99f021c04ce06b33eb9847d663500a9ef9ee82c6657f120dc037d04676fb788f92c025b8dd45004aaf4847e5f4547acff4cc950a396688d29fe13d4e1ad776d27c196937e2d7fe4fb18f909def39f49e727c063aa945fa0bf70831b2ebea16ec2142f34a2c508b21dcaf11a0d3c694e47656151535f57239c52617dc4ee5bfde08d59f7e4d3822ff1156e134d0a7a78b990553c3bd5216a83d30ac9211707af43f23a8cb4dec5d1ee48a484c8891a75ba66b21e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a02543f14f555be04a88b0be306fed7afb8707fc9a89b23f5be95ae65b5a093501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6564c94c7d849b642be7dfc734714ddc0afd54a0d7d38cab8df22587dc3c8ab8daffffffffffffffffc9fe544d78de9957b0a915decf6eec079551a6ad295a2188c78f0800189261ef4b09d00aa35c1d727fe325f3e779272c19cd922d5105285c6487b317aae0964e678588f9009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714adcbf84cc752fdee7be7c542277695083c3f5331b747e9b0796c7e0ee2a16cc85d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c67cf58a96449e51caabd7150ebe37a2a2edc2cad55f6816b8925504b13c9bc7019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a378489cb50606f7de81650ac4de219c8e389ed92633746c4604019a0b37a4149ffffffffffffffff52882685dd4c1de20eb96ae2051c091363b5a2d7c6df320dc644afdba907ef9d6ce21461a7b9b9d7c1f7dbcecf24a598b67ff272c5192ade47060f251026e8276c5d228500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250eb33fa479669329ab34f4c1aa98fcc0bb4692751df26e93b88957205057b4da46185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4441cfde2f0827f5ebb781355dc6554dc7e8cf553b44c002ef83c4ff7f75528d500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58226bb6441a24961a0239c3f7eaaa4bdc9498b52a622b00a421a476427026b2a300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c297106c0c63b8e3cd168ffc9aa699bc65efa89ed5b770d26e51d8792653348704bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f915c475ccbe624cb70b911223aa2fba93111c70666350ddb07a6546032fd94e00f00300000000000097196dea8fe3ee417d487dafc6539c8038770ef917972cf2e2bcfc62679a39d17891ac3d4d89de84bac8cd6248d0975783f48921e6292ca5cd988f866d06784c11b72ac153360545d4b25de45d74950dad8fd181a202d7bf2aa72d884eab0d31b8dff6b8695e190b3f7d5f032a3447bf2050b2659b52b22ae0503ae9bdeace6593fc20a0b2ef8cbee1d7e103ce38fb378fd1570de7848e02008d5db88c887361e453982b496ad333200d78244c2d74d6c50b016fbffc97824580d4618dea028280247547016553cc2e8e2bec9f55de734c84a8f49088007a683f7a36339cce6b2aaa4e92726acf3e4e7d14c050a3c335b526ca08187505d779a8cd69003c6fbc5e4218b2148323965e41d0466404a78e6a849e9819ca5f8381412d811a348eb684dee73646f247d0eb362f0a779f4add96fde76f41c0b416fc0954bd4d1386d064cd41848b67863472029c1ee781d02da133008085e1360859606f648d4d593c6d08238017668ab1509f407cbe64ca27023ea2749efa21029b632ce649c0ba128ec848e9981399680f2c7ce7a8e46dc9b947e3275d415295a8b7f4a86dec5691613a64d199c0ca31de13ee52c503f6ee95993085ae6268804458ef67fa1f0ac12119bc515366612ab227f91bb133b4723219038d89d8cb0d6b7b5c060b226665a5326c7cea72cf09d75220b47d1dfb886969899f257f6a5de75bca51dbf9e31ac2909abd5f99f2b5395ef5c57a90372fa3259f4f27dbcd719b65912083e475e982fd5f97768c600a032eccad3998e152f47300a7e073711f36310148fc08de531db04e590a9fc713e1987bc3630c170b0915750757f75debefcf9a8b95e597b042a1ac7bbedbf1f604b18c14d9c21234c850310ef2e8d81ac644a1db023f31873327a66490e0a28ccaddbd890724471eebe321a2f8c9cb76bea3543bfbf561890fbb546938df9de02f052015aaac512a0b8e80a69321057a372aea7a25e72c2f9ce85b060e27e877aa79ca022058291ad746407fe2d24af1f9e4de63231f306825293e285e2b56f371aad9fdd244a85aa7aa546f647967efe1764a3b3d71bf5255cc6f2f25ebbba3a93efa8ed3351265c3cf08d12d83d11f240d8bb725275d0cf8f9c5613082cf02002ed1aa1b081f6f977631a9e3041d93e7506724282fd8bcaa75e07583348c932e63cce73e0e2047a982d23d32d962f52140056408286292391b3369f901260decfc48b7ed6a1b1aa3e5af0f4cab5f0c7b68ab5a1454e856109bea9d7c7c797bb7dd061d0544e065eba34711b533b0983e011e8e760f806e6fbafa761f56d09fa3226edf24a5d436cb37999f7a569fa89dae928361ece06366fcdd37eaa34851ff4a482a7759603501d548b78a60939f1d370d165e87e38263dcf2a9a3d9e56e858678f7add16a56 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000000e564b646d6f2958c45a17d7df37cebe785ea0c89f3aa04aa8494b4ec2df3c01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e651a9ba6f3a3a6b055bc258e57448113a99b2b4374fcdbc7205d5f5bc76b1bfa41ffffffffffffffffc9fe544d78de9957b0a915de3c8d72d2e6e120b15552914db8894db6771a243254718d66520bf4d6939efa3335dd37af87b465a74152faff9bff4511cb912b64483106cf009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714abf33471a3ac4b7cf1ec432b4c3ecb5f563e85928182b737a5b9f773dadd40a82d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173712d60a60603d8fe765e91fbda0627b4a2efd331f9e12e31613ba1df47254c0019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ae5fc38bab940b49a8669bedcf94af9d53a36ef56d31f4500340c99b561f12890ffffffffffffffff52882685dd4c1de20eb96ae21acda8f06f5491ce7c9a63ab0b8fbdb5b11de5025d8bd32570d7c6d57155f39dda3918af1f41a2344020c3e56b462e7f4c4d25a5834faa0f00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2501437b883d7a6d3201e94d738582448106df8ed3ec9d185876a38bc273f2534d26185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4058d7db4b42bd20ad416b4167a2c5b4cc4cccf8cde6d7d016b57105b257e05b300e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b589c5aab4422edb54f660c7fdb08ef7f69faf5ed880ef7cb3b84da910a181f9dec00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c95b5a71647a772194f8ef1e9906cb9317634bd81b20917a60995e0f95e47b0914bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611140811a1610e54b3228b5f92c4cd2ce32759334f82f382d4d7c09e5e7f7107dc00f0030000000000008d0534cf6e50916355ba8b684a36fb8ef599fc338d3e640e01005a2f19242e449a85452af8773aa73f3137989213d572b3a5fcbb151faadcfadc67c0d4951e6f2e2740b39215dd47f46b81ce82c50275ef007f96a3fbc99a62efdcd04c8040c9a192e4ac4d9749677abb48f020eb02868f7b505ee52605c88b975915dc6d37a16a5788c71f4486132bc2973c2c42ce3588bbd699b114fe0f1f75f7eec32040992b47d0ec10c96174cb0181e21f887f1f2ce3cea54e28d143c9c516d915773daf8c1ebcfc9fbdbefb567da6644b8e90fd286687f03a870d0753221257ec555098c73a7884fd3874ff46fe88c626cb49bd8d91b4ae2fbacbdc79c591f48bbf7ee4d37bece25d8f726be2492a1521d0721da80105fa470e7cbb57e279269e83ebb4b31bea8997e562e1b07f838e39830f86e681842d463421e207c107a4a0c85b00a16aadc66cbbc8b18e065168b3c18a78b6fe9f30cb3b7992015e9f6b951cdfd8108d7af2f9ff4f527164ac717aeef081244fa2dab9543fa25f8aa604a0c0223780b3f899c443eea2400d5064f6705b9a88f3060f66f8a64bfa9d13571e43f6da76b869175920a75bd55e81ada32cbe1ab044a462679306e6d257ad3246011e6ab585a945b170d94cf93b16ddad1b77f99b821f7950c388b235c5bad34652257cb107193fb7c5b2433adf21182127f40b93339cf3c4f3ede15c7e74ad0d0768abbe54bf0bec57cf3354fa6eedb939d492b0606ec3df98932125f209d93682284a007c139f6a425fc6f70775c45f77445a7841f486461005ba4d28862a5a7ecc741da8b0fa3caf4892c1c6c571aab1d56b1d52b3fdce6bbcff3b4e8f81d172fb30794ae882816e78f4962089da4e0aa206e2224b09ca7c35ebab271ba6654c5e7befdacf5435f53f977ad8630a617a16237e6c69dd89676da4a94c2f51b894805ad2a63721fb4c8cd92e17a646b3d668612039bcd32342c850b744345ee2f3ad17f9891ae2994bb18d7e3a31728577cc3374153ee814b41459ea9cb65d79159e66ec8aed1d28f1f2ed6df31616b0a58c3e6440a5681766d1701b90cac34cdf723f16e2a1a859e70be53a0ad0b320824638ab274d662a40914f3897206b9d353ac4a36547bfdc20ecb053e4e249a89c520d0af20643f05e6e351f125b0dce9eef0dc212da53fe855e57813da81f4c86214b04f88e1d3b33238709cdc6d81583369f61b4df3d574aa1aae04cfda46b99323450398010c1e81a371b2f5d3ed2c25cc0e04e75502004b1cfc79df156e10f1522134792bec376286a714543ac813065becb1809dc5dbaba1ba50acaa9ca00260749f5bf12b4d67b7296e07076818d0a071947d0d8ba069dfcdc5745edf20b2e6266a3a946a892479547159987a3d3e60c10f501016f676bdd6f9df063c39de03d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005b2f6ce60b7d167d311dcdc53b54c4e9c5c192815b5680df54683babebc7515b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65449cd7cdf991c2678cfeb2105d95b78057bc3e19ba8feb82051549cea4e69e1affffffffffffffffc9fe544d78de9957b0a915def1ec4d12b94a1ef5194c7e5a8be6574f212d6f8d5e150cd762ed404bc86b09b2f222079f9fdb253420d81c87c895c738b73521fd01109772009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a14aabdd008f2095e6507bbd57957df4605d4e7d5a21d30ce2f8aef74165d7754d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1752668d2963289c156ecbf8a8904dd8d2903b1bea7b982cdbd491840585099e3a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a08dc7a7b3fbef48954f12a99e899b449de430d24f71cc7c089122e3ce413bec6ffffffffffffffff52882685dd4c1de20eb96ae2a3b2037bd824f4b3a4a2860a73237a4470efff670c87bdc36b2e6d93cc34dbf521a79f1180ceeb72dd9a30bd0470feea6375117281760ebf00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250f441b6ce294dd76ba1336b684c42d80620caa55684d89cd630d590716c9532e66185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4da10886864dea4b7c97a1013e1c7bdb2d269a2449014ae1b32a4108feecdfa6200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58434b9e8f10a19d9f5bbce5a1819ee2a36753ecdb4dd0e672406a87f9fca3d96400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c06995af6eead023130a62381cd014eb6dc8a33973f1f4994d62862f17923b8e94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f2d64c38fa8d03b0b0017016e0fd1130c0a462fa2868c753513f1238554a389800f00300000000000094567f59ec6874d597f0b2232403df9762887f95fd4201b80fd69ea320067f0eb88b85390cc604d952fec41d03d14441b65d86eba8016e56788e1e8b567236933d19a4f7bb7c65824f24b8393cf7013947ec3be9a05060d7f58d64af6a9204a0879e887d116820de566f5d725d109c4f20e70793dd0d9b73c75350ad081ea261d9e5cfa5fa18e028e9a0cfc770e7ecd7b5c60a22b5a495a171f2326e86976dc423731924308b9a25455fcfde7a398ed78841cf8ea45290948abe5f01c821e8479758f1f1f5689357c2792d748ad11d1dc066ea2ccdecf19e4938fc47cded4a5331cf71c8155c4fd102ec78bfbe494be9ad376970e36d2844a0a3f57dc01901d037db1f9035c9cdab1afed321e030092c71631f8e3bc9a8de71a48783e34abd8bb19e2dc190542322863299dd9a66e02012776bcee6c3375aac180f9bdfb124d149fe657449d7d1d740f35c9cc949d50487a05f8b0d1794cec2cf799a4304cd293ee2dfd776f7c05dc5707c6de7f74fcd6c77346f0593d11f45a95aa1f0eb8c57b5c5db614fa96e8064ed27427a044bd1eb3e9f676085e676893bba0d80f1e39a1ddbc42a1344ae35db5de66f0bf80663a4823a75e81d7fc40f940d89cf126efd920bec38941c6d0eb68d647ab33f6791f71d19136bcddfab89c4162aea55633a8b096aedf412fe5978035d8283d0ac1b0fd796b146ae68d35e2993d9d8741a37c5d6ecdf9073d270473f8a88a8efa422edc1923b70bd67996e8d9f1cd348b6704340f05a030730365ee523178a3aec0bbf6a180339ae223110bc2bbab4ed7fe1974f4b2d89e098ca31a7f89c9415842286450ecac1dd5e272f72c06b8cea3290753a4725d3dca0ac7746fabbb07b165fed3e6924881624604271028e21306c481861c93550f13ba5c123a616bc81c2580a6609a98982125797d520b1d9e53ca0ef387b9e66e2918595c1560307cda618dc5daa6193883d276b82fe21705ccb801c09c92c930f244471fedca4b67ea95ada6b2b3ae38abcb8fd4ae8a73901b66cc35e2abd2256e636fe0b3387ad588550dd35bf59d2961dd196bd49699952e5ac38a944d7769c0d2a4d9da608ae41230da6811d732f80904b369faabff0cb6376fbf5c423c22bc5de75ad9da71eab2145e0736e612beb41bf46eaa9d6f859db4989c93e858e911cd0ff03cc76f1cdd522f30097c6798630d47a48a6fadbcf371044aa7ee9fd0c477898f8c97bb7cd8a55909d1e1f31d2fa1def194512d5b16989057aa79b7010e428bde7ff897cac9928dd9f33ae6218a12a0fed7fd7aff35fa9a871789667d3bf6d4ba5a09fc383474203dd321dfba104093ccf72f95d9ecc87c3330338d3a8e7259d4c61b376c1ea70fc212c7ee07768b8776a71ae4bdc5658f80d771cbbc6d76aafc7e686d6a36d37 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000093c7c309512705d8fa9b847a0982e23b4cd91ca0be2baa9cd0e72a259e1dcf4501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65752063a801c40d912915375e5dc450b69cb502f49495182c66819c4c624544d0ffffffffffffffffc9fe544d78de9957b0a915de4e980a462ee9dfc0a9bcaf4977c740aa4672997985fca577780aa21b61998e2c3a803398ef03287d0c5995a6ad10edc0445a184914d426d5009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a0b70ed91faeca3217e297bbf5759c1338fc13870ef5ad010096f796d4672fa15d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173d6f225d05c38b88fd12facdd34160c28f45deac7bb8cfb94581f4811213cb1e019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a4c81de6c06751252cc1fc4fa69647c7b566eec1a5b3faa8237e0d143db9b2428ffffffffffffffff52882685dd4c1de20eb96ae2443b4ef50811a975ce1d6e8977c1201984a8e057ba8c8e7ef75fd77b4e7f61aa4cfa0a348049d06c443934491ac0128263d369880b6a7f9000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250c1fec7484cdcd2fa8861591dd7db60845e55643871d9b92dbc1d50fb887e434c6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b462871c3ce6afb9410027b99f60031627316606ff12d89c604677a021adcda90c00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b587c7b98781bfca25964eee95dc6d372b023acd51add5c22538847f9b1c4483b8900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4a672cd7013a5991ed64372e721bf61e8b5a5e752cd78691b38e7bf2d6f04d0a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861132c74c6247cd19e97a0809e6ea41cc5ea92222506c5dbf2f79b1daaf6d20326400f003000000000000afbb83c5cc2220dd436afddd2e10455520e17022a2b96d8844164adddfcd69e11f9b558e8ab9716d316fab328026859188f21f3739f86ed46ebb75877031e25c942c90fb63758fababa14e6a2f8188844e64cd03b74688dc9078c2b3c6d2da7f829e2f88eb0e8bdb373c018d66f2d7d1c5f74bd293613ed0170d5d742aeba362aa8f7c3262217522dab5c9c8c4ba6208a17dd302b635ffb1bc78986b7f53481d27095d45cfb527d0151b995444ae2b0db82dddce7b080c2f099ebfc0f8f30fcc99a28e6956de3cc14368ff2ece5901758bef8ca6201687462278d4dd4bb64a6851bcd0aa752bd52df601f97bdbd12149aefbf97916c99b0eb5e54028fecbe63c3c4c2a06ad80b4c95788bdc10b223372b56135267bd0eb33f3ad5a95a734d100b3e7972c32aab151addd5de56b2519336e4c7b2110e5fd0fbbbfa718082e8c73abd32d05f81f1b5ee715d23e20d0234a973f6697c4684f65ebe249f8401a485c45ca3b838b5eeb83fb8fd9b1f9df3103b9deb01016d12a3a8ef182f17bac88b59473eb28d770299bcf810bfa3e61c11dc64c93dd2a5d1fa00aefaa08ca8ed80e95123dab9c372601aec92e253df87e0384058ca8a032b92e32bd95cec18d98c48901c68980cd1e3e178fd6afe1af8541d4987cf91fe245c759c9203175578ddd90142488395d849e38df1d75b2abb9a1976d35853e71f51ac4dd82e324eedf9b50bb754cbd188e4a2f37fe0c692bcd18ba1cf576674b1697d8341d74e0e82ca30fc5a352796e02c8087d62c3e38bc51655a5895ae1b7b8c0604f8d3d69bf33d20cd2427106b06d3175c29aa6b527221846447f28dc3c8d65b08d70245ab1ca590350a7d2f23cb5cce7a6bceac3b0ce650e8b16f762c572cacebdd53e971c318bdaa0d32150f72f05184f97d673397f4d32480bbc994f825ebba264ebc07d02c8f864070595058608af61419453037626653ba0a7c82880b25c640175440790c21b557ff685c983305eb089cbed83116ae61c11e9ea4ab7728b9e632a711a532602156bfa653dcbf3e4df420acfe1ad0f877c45bb974164534c6f620473189469e08fc235eb3d0e7c843b0c1879e3ae37d1937acf39719607b43eeadd3232c4888c3eda5b53630e0e744544c6f8b2d2239b0f65c6e5558e32bccadfc8df594df4196486c3c0fcd99d31f0d9ffc6e02c4f4499835906891aee159567ac9c8c0a2c1c27de36b69ecea13e305ab54f3b944ad3b20411cc3ab7b6545a084a2330b1f0b6fabb28d33b73419a463f18304b3130b197f18438a4443f82eebeaa9e2ae5482d942cedacc2024c30c5e0da1c63ab16fd9cee8f2c11a2423f41c9ed18a615182fff824472f989de91baf10794133a0fe04d17c43d834d6f6034cdb56dcabde0796ef64202f3d4baa9fb5244be1ba000 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000055fdeb7dcd573d34c454c43ba9f1464fd213b973b0ef922d7e5de71e8ba1d93e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65903202bb97e3a31595b35fa6c995a60a6401f7abfc5ea3bed9d7b879385e3b1cffffffffffffffffc9fe544d78de9957b0a915def48434575a7479dbc8ad942ab83075b3776998ed2cbcc3d47737c5e14f926bf94c9913b041abc3948eebcfe75681728bbeb22fa6121093b6009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ad3278d47bca832edbb85d4956dcfd942e2506220d163d7434c78f77844b5f314d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1758e8c7eadb01ca84cad9d2cecf77f98ebd79beb69fa9afb1d3de905da36cd5e1019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aca893345323be2d2d54cc748986d9a5799238454f13ba313a09d123904383ccaffffffffffffffff52882685dd4c1de20eb96ae2be39cbe467c982ebed02f5d13b538bc516d04fe078aaafd907f3f801873edfe073162b7b44ded4005863e832cfad788da159ccda0e8cdd7100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250dec5c5122f4e1c1fc85d325089e6281995bb7b247af33cbc0f2da75a2889aa2d6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b43cf64150bac7b2c13d6693411b2b109d51e086a96c2b0a41b071395dc7bba41400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58929bb74ba7acc4a23a0e7254455e44876afc375123ea017c19bccff5a973b49e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c286abee1c86b1547e12712e9185c778c612c2897aaf0df3a20e03ae55a8d77c74bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a52f95a250873bd62dc579b875177d30b9c25bbd00d26ce7a1b1a780fdcb548100f003000000000000a2bb400ad28a4af3d45bf54372cc05515258c4efad60819f1b7a00b107a907a753ca7c1ce977d86da66dd0c67015a2e2a6a3d1e226445b7e8ea946a6cfb08a4ae04bf7d7bc06d6c4fa4a6d86d05fa5558d9f264ab3c34aa3e30dc7102c1b294392901574e1074acb9cddb82c5726a6d1ab4695594d632d1573367dd8fbc67d5dcf3dba494b5b15720bc47b0672f21298a2f616f06552a159584b645ae939776ba1fff0488d01de232dbceec7df8b1aeba9cc5453093cbbfdb115513d37d09a1188e65d5847b7022d447ce9808dddd7a01e78923c34ef068853eeb8cec3e5965bd37200bc2956dc99b72013cfabb47bf78cd0cfe1b1c99604926253a93df8a58438d74ce29154091f97625998367f15bf625abb4faecebf710a580c330d2b0b93b5a94b75acb79e5f366c2a77ce9b934e7012cde9df2ee014492699ba11d7edddcadb5eda8dcd3a00029c906b0260346797595fb8b593f1093540171e32043563fb749b8a2f266ca5bff71503df4a69ccb3ad44a6c8d93d203ecf332618b240ebb7bc917b2a4a129f5f906e2eeebe14ed1d0765559101d6946015659a7a9b813763478933f957442acc10a6afa17abd41b465ab5385930a51d951325b7963654a83facfc51e7ccc7ee0aa61bdcf1ad255bbcf970e10a7f75a5e631f2658ec9be6b36e3782cb238cba9cbddbf9780313ab15721972b7d1d306452fa7d4e7b16bb3fccebbd47315beffd03425bd31369125bee2795410801cee6f64808ecce6199c72a985feafce29c0bb8e456ed4e6564899612c8995d7cc133e78a8f9ac1e96f35fcfae8a84fde9a8c2f13dab342ced1b1755394e61f0016d3567ff87dc4b8791e151c2f78438ebf5d0070d7f6afe004e54bf2f306d6b9dc3a05aa8325077f0d68c6a7165fe9b0e6dc2ed95507680a0511566d13b50466f4a1b2b08f7dde9301a18d9212eebbafedf1451a312edd9ed370330a76079b57e64c6db5f2c50c066e50edb8094eab1385283ad53dcc637d85b869202af321828c0e859767d56f42c66ed2f098fcb1ca9b35ecee0510f2499717555122b7b9afc905bf49e08569ca3a667a49568428135659ef8e5a8e16e4964fb9199830123b0e7ebc40b78609761112c7e03f100dd1d040803e56e22fa3d1ce2acec47837162c32b594c9e41e2d183068b8d7091b05ef1ba29c08c3f66770945bba7c07ed662aff236c42fc763da3dab50e5bd14168c5c81e5259308793352dd5a3391dd4e1f9ce6c2d3a934c531c7dc0797a26bca545633df61615dd56220e74ee8d7f1e928eb38d562af7f5597dd2c07b617c2fc30f16f29c21410309e1a9ee66c6bc69b99f17a4f5400646921b02f6a8d1c62c14b995098961ec26a691868c8ae26909ce142a4c558eda5ae6369dae433c73f72b4212fefdbbbbe53c812 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000052126d41fe4202322f89a7c868000fb785a1661a1680c1c8bb20fab616d1c15d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6507fef651ee3bc6ad7164ff69d6a003e63bd26c763c85990b0094443c29d99edcffffffffffffffffc9fe544d78de9957b0a915deed2b1ed7b4901a1bf62a0de4b074d09697e43430bcabacd9672243427da21de92fc39f3cb0723f3ac017a7dcdb526f0d225f20ace272c571009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aa131bf8714809ba94e8e9382805dcd5c505e66b3c15184ed3e57a3b219637ebed85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17e2b3da4386779290693df8e1eb1044f9cd3e3df7a7c5f3e32fb05552553331c7019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75adceb1af0be48cc45b6daec67efffd4d9bf40b0128395b69d0cf371fb881903a4ffffffffffffffff52882685dd4c1de20eb96ae2bd16fdc4771ff0ce9c89c32ee3e5b1554bf8d7dfc5ea5985ba3f3c28353c47090d1eb1024197289e07e7632e5b2e4d88fc91b70dd1a49d8a00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2504902f98c4e0f8e5e45265109e35f57df1e6d6bfd4fb0a80d2b7b05e9c48679376185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49e747bb9764a3f3766d5fa7dcfe6c99c2ea9b1a4b4b953bd18fa66c5c4f0b20600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58be4c1f66c6c2c7aafa059cc544f28497420b43ce72add0581819d7c4ed398d0a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0c5db5c44226be6ca2ad5b061fecf0635780d6ba2bb9ac108fd88648925283a74bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cd10af03250ffa857900baeb9b064d8a9305a9dae3ebd67d2cdfd34c9deebcaa00f003000000000000aed9268a83dd3b890edfaca90ef7493920ad717856658569d4642be0c52930d98569e579848cb5d9c5c4c09131ac5039af95411c53d44c15b4c708087e78a9bda275474db3d59f07f73966d3e244baa9ae8c7be456e42abefcb9eb1add07820e959e47b8c7977ea9d1b8f94a55e89874b6110652d7c5639d3559c757787ece6a2139b858d36dcf8fb9865a6a2fcc4a4da70754eaabbee8517d6c0754ad770753aefeca88de2eb0c65f51bd07d8188e30d000114bc7ecf9b778247465ca2654d1a1af1249cac4c222782f74826e40234816b96d9f5ff2459d494a63e3328d1d830bad3ef5a7ef364def8943b3d07b3051b7c7bfd198225ac0c46c8fea4021d640e8b83a25d99038d1ed280520225c48cce7a828ead6f3de2ae97f56962355e8399233d4e73aee3bbf8bce288d845f4cfd81f3f4d21b61521d4f7b38cd250edd6809ada6b7ec4336e8a322906f2cc6faaa8d472d58525e92c6a7174dad5ad1df309b8d6ebf8222f1c50f1e65056311b3e26c64f2dceec61f2c5ec7aac1112a7af199a54fe2593a411554f8810ff120a1167ee6be8139b868e5b050e6b2514df18f2081cba1b11d0ebcf21a321180acc6928f933c86b4573c24958cdaec51414d9aba487d97583f97e1ee267b4781a1ea5148777fc3937de9184b443251f640d61eb53e4e92361d01b7f55402dadd375b6b3989167af17b6f893587a4c3363cd7cdf9d4e15d6e0d0c4103f3fdb59e4af3c3ed916164a1232cbde92b1711fc1e02c2212827e5b3341d100820e194efe90b35315fed95fdd11d4d08584859674402d93b42a7f1f08872c84226ed73ac1efb3787a171003a5d76ff0eae5fb139d3ba767dd9d28d67ce0380cd45dfd8e2d4ea3a90d6328e546cb29914c8a1a84d670d92870f708cd86d1f94854df17699d8df5d3593b85fea6679285edc501dc13276dac1c806da977980ab2037cd7e7cfe0926c68b2cbec12c15920b543bad09843fcf18a7e4604f19486b4b3109b3a4acd155a7e079fc4b2028f38b4ba30e28b4d45c3bb2413090ee31cd28e371969746376f66910fbc64375fed29227cdba3807835c7e5088eea9418d9eb382c0ad35452286c3433cfaecdf32bb06770f9b72ba804fb0351bbe306386422ff673acbbd8013b90816a38fec5256687befa83f0b3998b6a4258109c9961978afbd5333564a2ada3470f6b88ee2956b426e18675699a421b648cef02ca7c6824d2ef831ea810983c2baf644ae328adcd07ed458ff269c5ecb5033c867d395420c0024ea0ae84bfdc2f030184340a8b5d2170e2a9169380371919ceafc78578e0df5e0add5c73a59dc63e6cc37611a1b836b4f9f6a9d3ccf1bb522be75d0f805986247aa1aee183a88c2c15f817f9127cbce3f837fb383df4085e585edac202fa6436c0bba7a0b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000047872dbad2709d9cf26fd8f7f3c7fd9ccbede759a33fd3cb5d8c04147dd42e0001e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e656bc263c2f9c2a7eea09de8671cb616f2789ec77be08ef7ef535d0a8d6a811a06ffffffffffffffffc9fe544d78de9957b0a915de8373c43c18f1724d5268e4229429f8fc7ea590928148a2898a30e1e5e154c4a2c4ed90eb46e4dacb5153ab9325c47ed8115f51ea5231d537009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ae3868ebbd58fb828a524a57c6e8f390aef30474e09f52b4d31322faf7325185fd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17edf8ecca8e3b87df560e5319d745f8af2daf5391069a802c76cdb940edc2e0e6019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a3ab82a5f8ccf57f3fdce0ec11ffa12f33b6f57a5b9915452d2f739819caeff8bffffffffffffffff52882685dd4c1de20eb96ae2d5b8074e2b6db8a1df5843020c77826d66c486efe5739861a7050f95ac6fa4da4e6755b96d0d24af2e11234c7075f609dd0349094d51629f00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250b9d8abeb909181f785d962d1fb52893d085a0034c67b95194d9c8970088e85ee6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b460fd732aa36613f0877ba79b4ec54b5a62953d4e71bbfe631420c3e8a882655d00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58068a59450fde826e1f5931b5a70c307101fd3078e3f3acfacf21103350ae1e6700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c25cac599b3058397fcf2b48ce9a50d068bda175f6450b304dbddfd60cb52daf14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113cb13a38f4ff019803663cfdf126ae71b61dc0e60a294326c81991743a9371cc00f0030000000000008e7ea7dbe4c275c4f21ee7a3cb5e04a493396414ae1b687b593df817f37f5f23acd39cf6a118492300335663f44923d18601fa4b93d83875bb87a92060dd2625cc76a41dca7a522b678bfcf59f560b07bb3e6a0a007b8aeae163b83acfd8d877b542e7069fbde912c46415ab4726324200ec03267fa3fe82e9b3830277aceacb2da07de91899c51aaacf7a71a21fb0caa5d893e40a658b4503632f051afaca37155513f3397d04e97d459aacef96c546f87dcff7e3b01f69e3acc54088c3294ab13977ffe0949e326cf22f4209886f6050a34a989908f0eb1b4483cc54861a7c05eb03b5609a21d719ed5a1b1ed89cea83db0ed524d4fd075515c17ae506fc039cb014d5745f7a372f2564cbb7c5cbd5315942fb7290469d4ba37da04374a284a6b57e9fc98e588d85e1fc703aee714d913592891c1f7c3dbdaba7b45019df7f540580849d0c7718036f20878e9d452a850eb9925afff412432a431e62b879cf347ff7f9e26f56dd4ec8e6d22fefc252399c63e4b668e1f959c1e67855e3b132b3105e442c4453db28b3536804d39a089462d80caf3e02097df3e2586dadac50f5a58d37acade66a74397fc00f8704f4ac21dacb2273ac2eefb407038946dd8337a8eda95b7faf242a8de51876f62f4bdbcdb059e4803f01fdf3decfbafaf03a8b33f469b1cf57184ba78a54fef1bba913309b03b2071ee145fb88e9ddaa66446c947e5a361c9cc28ad6960cc1eb6c6a4d5c4ba1b4ba606e5da3aca52e238be970a4e665f04452bcc78c85d69a3d576c68376f6bf8702d0055520f982fff509ae4fa8eebc45b6cf6d97853872bbb3e3e1837d55b3f5c62127d908f5cf4deb130278aeb693670e655b85728133ac6f30dcb5f3ac0b684f0c4cad74d31162ce7fdfaab0fe1200bcb8e475b026e29610c1f2675af50d95c45198f68eccd351cad05a15ab60af646177af3d64c9cd4f0403dfc466572c261913bb19abe194c157dc944455d48c69f54cd6f024e9b91f7a72167e044078b201efd946b88c9384a836966fa45dcc073794618db028863a2847170161fd89cd70de46e60d4e8fcadc5aa6a039f399268427c92805777ed1ec20ac2040f4fad6b62d9eca7f66d503b58727288c01b1aebfa3efc6cd1a55c93985966351000bc395db512029f05797088d5f13ad52700a87aece078917307cfa86b84f0e5b37162458c3d7d7d1b546d5969cce5eaf1fb802bcc03db506d605dde0cab724ee890f84ca4d09ffbc6f23ecbd8e5dc52d8cd32cddc742d4e97d62f5150d7c8f7cbccd23ab5d175b7fc8df4fa241e56f3750804cca38aba5a1809122917aaf7c12596e9d305804bccad49bbebc9f8ec351ea99e775f7484a081438d0b27ef0f6b8da51d5606f01b1c2e750e8b4a76f36f06e42387bee0f6743fa2b42b5d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008936aa4df03e3c14f7d829ab7ac8853f683e4f4d71287743822f087dd884e44e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658d45064f60f111f8a034ea385eaa98420e42acd4adfcf4803ae19159929e7aabffffffffffffffffc9fe544d78de9957b0a915de94cadb6a1f79e976afb43e5888689f773216a6fdbdbbd98c0e52b3d9ac5289406a610428162bf5117022da62a40f69a71209295cd0d43a98009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714af5603860f65a5a43313295af35875c88169f8109eb21d25867812e9738638a1ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17a6ea6064d5ca7aff78db351dead9837dd625f39eef30ff8ee26db29a3790f770019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a18776717ad1c9d32fc88e0aee0442b87c10f078d3859c21489827c31cad36500ffffffffffffffff52882685dd4c1de20eb96ae2bff7ae9b7564d6551d9e441c81b7e7223ed2c8bef780dc0c363678905ee5fdcbd1fdda7d70757183eb6992c837ed4bf3cdb803daabeaad4200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507e98a1fb50695cdeea6edab58e87fdd066d2f01e5c0822282f02b9d503fc21e36185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b42891957d53dc10657b478ecc7886dc6a747c22f2a28e2b64c4603bc9e9f46c3600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58da0d11d9cecd441b65e8d2be4f2ba2a422c39d25e0002c027b729ad4bdb9f0de00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce340f28f91fb493154db817c5ffb39d64f446643dfa24608cd8e6edcafd9ad6f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611287b660d93324935697019163e71c6681014073e260dc1dc03bed9dd4c5e11ee00f0030000000000008e2dfd452a4ff6264a598efe5428b56363278b1daaf9a9fb2bf47bf0d7a89e38025e2da20e4fdfa547f6d28fd21f77d7a267c9e4280dda9b0d434db4997fb54809a713420ed90dcebe2c29a32c512df9a60efa1f3a558fc6163cfe3bb57aca728d5f56bf24583848a6cee666a5267804d4b0c7fb1d71b417beb4e60dac798259059b7bb2f704c2c923eb08f7e3dcc2d386fac169527cbe2b467cad200be203837822aa463a5a2b36be338b5f586593946799eee51c920c7df1b03d23feeba94ca9b4eb26c5cb482fd512f1ef4c88256d515e676eb2084660fba3719e9b4e1580c2c46c32cf545ebd106c687899e81d98b91cc2bc0e2150c3943d7e5a54fb17db6e959f31bfba69446de6514c4dd054e0a32d9f8d0fd2934a44bdeca221c05eeda8e45fa90bf6a9aa79aca1b16db260eb098df0ef4e420e47939b8e9794bdabe2099c9c46774ad94892989ba3e79d12f2aea55cce49d2ca76d68ea9d63cdcf1c60691c1356c62c265450fde2368904ae2b8cb1ae29a61c724e1d211a99c0459d796d2d39f0ff0dde05bd05a393a41032bb014b0af3ff8b16432478ff24468cdebc9e61fc8abea7372266c395216d3d93eaa1d264b0c90f95ae4ed8a96f6cf8b95e113a0c1bd441cf84836248474635633c4b155a07320c9e851c87ee230d76fbe8c33d3801394fea4801af899cb3ebb86a735edca0dbb823419a19b336f60cdf189d6756e8093411460ca8647d9fde6ffedf72e4b90b458eb1f1be367d9b0ac524e54fa6d81247c78f565995b663d79177e3c885af0580e1902f6aeae9f771c7f09439ac3593c1b3e7bd1590b61dd1e4f2878982330481df3f484b9df369733819ed8089cd2093f82a60960ae4fe19c260362e2cdb142134595856f394357846c41b8ad203914a50932e9c9728b594e0d1959c27e830c0774553f9215d636ba4eea7a32091e370701ef5824a3a7e35544f6380616cddd4b14e7a80180cf6838904160ed27d7b53ed863037caadd5e6a121e666c3910d7620ea1e51a394a7c28ad7830e2d142492af3e6eaefe1fd07e22049ee6b2091c62fb9a3c9645b0de36a515cd2602bbdee88ea20cda2a8a310484f5946d10d4f6d1e8499ca24745a5c7305dfe9e256dfb9f1975fba2d2765769d7034c261e2d374382be52856f2326a24f7c8c9dc42d67257e2c72ebba7df96494a764725e9899012f941f533f4c27378aea8cf5f03b0097c19f2baf1f606a9f6234f6f05eb71fac526f0d8f66f627d3a3f71958bee72119c47c93feb31893caf009bfd2f9fe40360003e8b381b23d530dfa592d21ac15986ab757ec2b64a94106bf394628a7471eabf3c42ff54fe844ce90efd3787711d0b7d0ee96c321cbf733f2d34cffeb3f0cb6ceb0652474b8edc7c2c582df0fc181793f58be7b770545167 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000069e5b076ef8314399f0b9191f5cf192df2439a7362815a104194e9418554c75601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65db61852768654bcf139739fde266964a09a60a56b575cd7fe38b95984d33b028ffffffffffffffffc9fe544d78de9957b0a915de557220680aa5d3a6452969622c54aa1873060173dee6d9ae45ea872928fa67cc47be00c41f26f026c88fb862c58d85e14f331ba7e3d6f27d009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a71c9fd5fd6e8a0f7328b4977c386eaf49113a783689d21932ce46c20630e904ed85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1772e6221e3ec22a6f764ec0f31ed63c80254a56b8cce2b7728dfa66fd180b3f3a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a3775a26c45ba7fecda581c7d1133e6a5984cf6cc3448f27ad4e8f1aba3d85d07ffffffffffffffff52882685dd4c1de20eb96ae26be840f33d7b9a1d3524658133819e3aa5e095895feecd7c5c7be7d107b40c69998670af6308f8d426386d19ab723136e9604aa2cc30c46c00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2503b2fda5fa24f0d6f09ba37c68fbd00a6c4e8b6c0da2bdc55d2153e0e4d0343266185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b48ee58d308b507993225ac08cd3ee7455ab9c94dd67f353c37731c67bb3c11a9100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b589c20e6815bbebdbb6af52651518c412798600d6fc517e7849bf93e5a635c578e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c72d858a8b04041e458c9b2af17db84d7e5d6ca6f2e577c8695199ae7cabffddf4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861188687532752a2c85b4afc439b8e495e44db958aed6e2aa973ba890dc9c5f1a6d00f0030000000000008c86b3a30d329c2861517ef47ee6a04bbcf6c964ef8716db91a7b74480afad868aa62046d36b2c2860bb65c3f929967ba37e5a364b7263487435bddd41cb43f6d983d3765e44f3b01332844870164601b1247169a410ca6fcb25f3d9d054de19846567eb940292ec39ef8e704689cb73895782b6f3ac4c10e5e26577fd2ff9d38c180ca185343c025f6127555099fff7896565a54e181416d03e283f4a836d6cd609453e1383581477ec1c0528304074792c788b76a2fea99a0dc2add624c73f8d4c2f032ee8a32002d0876fd90c469936cb259f8922b25c98c3afc9537d42bd29410477514ef9287c9ae6a279d0eda3908c6d50e5ecad861988b9c47f9ef3ef5fdc607d2d2b0a621e39dd3683804f1f775db338a515a06d30f35b28639eaba188c573c789d16bba760d4a48640078a6923cc19605bd7efc639d381a262a69b9e8f12e950e0e882fe4f57545a70ef482a0db2cdd22cc076aa7096a1812ca533282b926c78952f0c310a862eaf10eaf0f145fafe140edcbfde207f89f861ff914a25b2a81c8eb64fd1a1271702280d93ac1b68726e2376e236d5d1ee12038db409d0560904fdd5234f7523c29cd790e46acf3280db3641619655e633ddd5a5c3221c5e58e8be504f53c6797860e8db86be9c7375bd9a33f06022e92dfd9dde03790a728fdc0b10651195a025109a629f29a346b445cad6daad3edfbf4e09afd80170cf0de46b49554aedaf07fa2d1702642554b586b0f65c22265c4e05781fc5134fa58e3a00aab3b131629f010e32405ccd925aacd6edc81ce6bae0506c749c84408d8bd040d91494712ee4c1de5831a2267aaa9eb87401524f65b87e2d8c1e6b45b36bb6f039a85252e18c452dcda3b156409fdfda897e5604a10498a549458e05584d0e678bd7b227fbe0c1620b86d4ab674723e94253f1f3cf4c4112d28ae5c68dbac051d187c73f0be102b03ab0a504a975ae81299c87becc03045ced16f93e2465c3a6b8186ae15ec871e41db192b44fb7fd45bb3476cded5de6b7cfeeadbc5ff2930663bc8c4e94d9a7c239629271fb6e2e8a8e8ff8f3fdd9796ace4c45aa67ba09841e2a228fc76a5da4c037128489d6ce8d8eeff0b603ebc06df7075541d1a797dad43f56eb418b24fbce03138b33bbf9c7e3f7e8ec2338ba14974c98d2cf3f4f1fd6c40c26e6735e40d3267881566d4ebde9892e18042dd8cde6fff328ede3de175ba1bcde9192e246149605fe2fb4d88b04623304d98efa950855398671c56c8bfbb44d2e06a126b262d50117aa996f866fc2c932eb7dec942cdd85be32fd2f5278927fc3d15f5623fa771558a4416367f3daec0d721217cac3416e5b8b57ebe29e05704c34a750b1c201bde0c975cc4873bfa6e801fdcb0dbe4740a57e3f5a582a7c6bae472f983fac756 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000020abb48a634800cc6c33d99c9b871433fc88233427d2a4027d6eec0c685d535101e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e653a0a3dc6b0d6d362d354c9c7759b9c83c0bed832c567012ff7930bd3353ba997ffffffffffffffffc9fe544d78de9957b0a915ded5170bed457ccb3b9b7cac601f0a74f9a6493054f086ae982f00f7a14abf20351e9aa787f7b085014bc25db5f295615813b37fd7cff9657c009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a9ef90e8d8855f9865425c80a3ed84bb43a5ab3d8137a6a89306515db20230c23d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1770798bcedfbd5d4e70e0bf2d04fc65cf50bd684722df743760a292d07236d519019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75adb29933b41e899766d5e81b73c06fc40406bcf11097f296576558bcfc9dbf8b8ffffffffffffffff52882685dd4c1de20eb96ae2c17268d94de170444d069f0c037f2fa25c692b55ca0f43ae9dca900ee09471ddc6b206e6edbcf8797d60225f2a1cb913572dc1d56e4246dc00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2503d33cee60f50a55bce0f4d4e16fff85fcc348e430de6ad917f8728bd72a348406185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4c84a5a923301c1fde95c75372b92f3d2a063ae64cac7793e1bd077e82d5b7c2100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5888a9a2b723391333bdf19feab709c2b935363abbb20e287bcad8df9a2d5f30d800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7c3f6691cfeaa2ad3ec6107cf7b53733b482be4facd9134f0bcb2a0ad60a90854bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611479176561c2318be336db5a1c8d46c46f4a58ce47a593bc9109db5fb4aa79a2800f00300000000000090d4ec2463fb16275d14879aea1a5556a269cb61b51b958b3769867906d4dfd7c475e367231a6c661c1c5a3ac9c50649b1f94a44ceb2e5414d2ea33abbba9fdf7bf50e0fcfbd78e2912e355827fa6b0bf5c1e6314d5be21cafe2a64f2a62f6709141c6980f22ab427763c815fc2985b6bf9da5b72f7ddcd47b7140fe90178038fda92fe284f038f9fd6a4bfc26eaa13ab3c3447dd694252d03db5377ec8b60ddf46d5cae908d8c3a0e2cf9c17b51100c64242d3e2bf0648e696c30f2513cc5b2b1cb14695451b71b19b512e1b0cd8a8a1143b46935472f38fa2b9f753f23b4cf36134c5a1328e4de44286364c5c7fc6792706504db564a2f0182c778cb86ad94dad5745eff3cb089696dcdb338c3a6f76bb34d7a313a6bd3d75e641467756c05b3db28a38c24639564a19fade5d55f02b0b8e40ff78df09ef1a8a4506b8dd8b8b4c28df88c256627162cbecb2a1ccb8ea39ce9cfc5daf7d870e6e8075eca8a8a1201f9f0d6335df54b01146f6cfdb0b1916426cd29347c26566e97d08d891719acfe65805af7803122b7cef1618ac4e9f69c4dc36ac3cbad1a80a0ab85a61af914aa89c42048bdd02f8dc44e36d435ccab602ac15fdea6e16615e93b40c5c80e66edeb40ef05da1088d6e95a15223787f8f4be57a19c704efe041f4429e8ca049727bb551d12bb951053bd6cd263fa377ac682f63f76c634d7aabd957392248ff46bd7026cc60ae9ffac75ed18e282f5f9262ccf4a5806547c12a3c92d06d2196046102055d4d33332dad16337f6ae3fefd899aba93b63f79d459cb336258e35c6262031196cf8af9b0a0cf623486062bfada3317276d475d4e918bb850a6cbbef78e080f0d13a7b283471e79f25de028b7e6a11687046c15aba723b64ad7bdee88fae014277a1b7f227ef82a40f6c4d98acca1f6ac1fcecc649be4d562f677379bc540895ec3dc810222ed07825e9647622f12890ce758b1aa7df076ea48fad5acbbd7723fccadb347918b507ff8a20e75b9cabe4e041df4f95009fa608e5105407c0e4ad81f305735d964efcb7cf512da01ad16cc4a1a820563b29bb34b662bf774fd550a1505a3955ecb177e8001e1158b1c0abbf0c000c57ec12bcc8c9f020a51f2e06e317a0935a02a13044d32faa46c728f138e2f8a01fe73093b7a3c187a6377d9b3773fb1c94667b8be2f447d355d5316fd9bd9ca37a1a672e7adf786949a868dbdc8565585071315953b710efda76ac0e91622e01d3ab1e287176eb4ecd8bbc4bd288cbc294122020b9ce4a0b962c2e68e5b0d2047c0cb500b636e5160d24cd7c16743ec481cfc9a3c98865e44990431e73fea6b4394b42dc114c2e317d5f472f3969fb7c78c292b5c66a4da90c62e5eba5f15a25338a05a6a594f7bfd2e66e1efa85126c408e9e1d9ed81e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cec660929904e227f6f859b8e28d96dcd0ea27c17a08257dc50782b1067bd45601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658a77e9bc442a029f5684e23645c343b915703052751046e20bf3634a8a946014ffffffffffffffffc9fe544d78de9957b0a915de5c9408b8350ddc725697d8fecd7c9088c7d9bdd7fa23e15bb3cd68fdc39cb760c6db12721e76962c068bd8808a8e6863e15e2d623dc3ad35009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a30d68baecf2a0a432d2f0bd02dc251c83367f070fda41efc11c6db7a9ee645c4d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f178a2677539409cbaccc94a56802a7b94ada1ac56e6726eadba6d74ad7372cdec6019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad447c14ba87f9c851fbecd269626f5147f15846db30d93da7986e0d9ed536d88ffffffffffffffff52882685dd4c1de20eb96ae24c77fc45fa26a1348d8fc9022075012e3a27844bf0064b32039e12ef7756f76000dc62a82d49eb183807d156e80ea15858fcb746fe16e17300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250a9851603a23bf3dd7542b8a916c12ba4ffdf71b651218e6ee852a31b6217f0926185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4d883f089762366d1b60090973dc6eed64fa1e99e2a203dce8b37223cd8d44b4900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58371cc39eedc3158bdf448c2e31c52e167c7f962cfb9df37dafa115f6a874b88800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca23a3b844c64a2c3d89952cf2fe22f6efb14e9beeaffb3c7fa7e7d28ddc2672c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e1b6924ef10888dba9002fcb4b1132028f9a6a8492ff776e37e2455f49990c2500f0030000000000008d2c066d177b15ae38a56869bbcd32a8020e73a2f491ac1d7c2a55a29b75bb3e4330c5373099dd7918c60e29fe775354b6a0419a9ca534a90f1c9094fd2a5ec74a72f33cbf9bf0a99931d23931cd81a822edae0fd560e0bbc68e885eb9a48f4995f7cba5eba382f00b2026fb270d740d5d3064f2701d7d62417ab8a06eb9d3bdd38de7ac7511c5e00069df9dd309910aab237859d7fa4352803b62d5a1e6d71ab3924521774411e6562129355485bea0465158f1c4c9557a2b8946bc5039bf7493806fc1053caeb4bae670df061cfed376b8ceaba71efd93426b010b668adf8c9f73eceba15127ffeff5d30060459adb818aa04395fb95a08d2d34f0d241c88178b4d81bb3704a00145376aa00cf64c059ca64bdeb1f350d86583808340d907b811ba4ec980b80310fe18203f3bfeb6bf8db58336bd0e8e69534b2b3caa4858eb45dbc8582b766675817e1c18dcc8dc2b9ee88b200c5bd22e38ef9f4971405fff22052cf9859f2ddb9186f1458b18582daac0f36ca9a3afd18bb6e46da79a15b9422c1c3caa99538b850e7d71866cfa6a0a9864f536bd1f0a2c53b0c02258193636ece1317bab6c2fcb346a1311d8407b76ae25156f3a96557f27abc0f80c83c12a5462d764068a0d09a2a84ea6223ec0d371e0c9d04f52dc7a582fe965790e5acbfde896d45d6598299bd986087096cf3d15540083b0ec7c7f83357b1fc4de7b131e83fb19394ba1a0563fa83d9c2196be6a5517d136960f601c8c238ad27acdcf1e0563bdeb70d489cdf19caa43751d5f82afc2ec2d117644ea29b633cc838d1f15ed2abaca2ebcb35cf10f36a77080858e361a858bd1ab4f1223a48f20b3d1f5b712c85ffd2c5f1332498bdb1766de25bd9e7ea965084542f698c76c1f2da7b211b34071741aac9872a5cb144952f2e98fcda403f997b26bff01900eef1113918e535e15635ac0940fdbdc4429b39e5bb471aaae99b4f9606013f92ea6f47c8118809370cd14c5a5b0945c3b724686b83fac2d0c2fc6fc22e339d3d46f5bde6577cbf770b4b7aeaf765476a1ba2411c577137ce6f5c1964eb701770e3389db7b5b77dfb4e2513341a815dbba13e38c2ebbec2dc577512582ee8a89dbd983a118951f992ebe5535bebfd05af303810741aea08157d1ef426aaef0f9cbe41d87724a543c018608147098948e8d75507ea7f83586a2a32420bbd3039c21ad60f0a4ba585762d072e4167966814d2734f5fa9f99cf3019508a43614d64eb1fb4ec16d3e7326d840ac2b46310d452fee554956637e09bc28e7c8df4c1420341e7b5f528cc7b576cad870e0ded8047c6c34061b7da5001f3316c0d486fb2d95915ceef4b6e4b2e1a582eddc9d50e2340844c220903694ee94600cecadae5f13a5ce504f26098756a74cd610ca0f93dbe034 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004c1d37643c6e0d1571b4e02c04a3b4f5e808d67c91a1ef5629859a29f5371d6b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65b0a63f2946460bd5d65245fde20945aac8338f201686b4c402e3ecb5d552ed50ffffffffffffffffc9fe544d78de9957b0a915de4c9cdddcedf69e86ffa968bd24330eacfe91990a7dc513e523b41ab8f620f35930919b8058d90577fc165c6a86d9f14149e8c5c9e30c960a009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714abc427eccf9e14ca55507330c9568a3bed391db8929ccebbcbdbcc02829dd2006d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17653724b89346c0a32f9699686f22fc0ee417d5c65dece956ca6b73be7bd79333019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a5801494e292ce144f791846cde67757896d55df92e4200a63c69cabe7b3f2306ffffffffffffffff52882685dd4c1de20eb96ae2f9b3c7dfdd792557ccdf823c304cfeb783690e3ecd49e722fc649a36a1f653f30937d17a839dd2b35c81bcb48d976c6e79d90189f881081a00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2509042141df1bcb09bab16d8b2ef2649105e45445d634993598593bc401b73aee76185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b446e232e418adec5e6188e43cfcee3c131d8073ee439ec5fa34b842585a1c9a6700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58351337acd9bd4173215613f6ac601c8f9a5361d026fb4d30dfa5c35d61535e3400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c82ce7e45f9a71e41939b81f3c0b17c34d48289f7d75b3808c7c49868443a5d3c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116b5a86fcab8d3811679e56d4be9ebcbc7e9426567bd9cc2f04d29455f8e1ae4100f003000000000000b22367c8a079df0adbbabb769b723fcf47cf1a039df6b065f901b3dc60c50d774d623862dc6fb5df1b1c14581e0a07adb0ac04ea9b4570d44c515693c8bf6a707e7b1d4211cae7b214a3a5b763b8b5ff897a0b48e7e4683d9a94f1208aca431e98005e74a301b4b61edb85f9da92a710948dad4734eeb29a4393b1fd981c608733c07c870dcaca00e6383fb8ecabfefab36d612520deb9a9c3a7fa12aa4894d6afe3102d15fa52c308d7ae546295ec91ef25efe5fc1d8e86e4bfd69ac820cc298d5678378a11b200a8df90cc406e2f01fe26794593da14096672e807c228b59da013563e3f265540b2022e9940169f9585a37190e562853e4c105417b08a75697025d5d0d42649ca7d965480244a76a5c0971b6582e158c4f53fc314c8383967b3c7df2d227c2529ac4fc2db6f133364db13382045f00915c04a720bd6a94fb7a50e87489159d4d56ef46660ca982e06b7af093dcc413158b4dfe82c5f116f004ce8fa9a93351188e99424ce498ddaa352a81a57841362d08231d016abbceea2b677144c77e57d5af8de63f9838573fe2a3df22d0fe74b6113b6c9e4a015e1731bb003ef22634b8de49e195d0d8ca866a465e151215da9069c44b4da9920cd3c4f994ec34294a0c25756739d77527a666718d9f8219d2333444705f3ca01096f8517136fff3dd6ee40a0dd98fb1f195e3a8058891bd3c34f13e04151e5282aa4607591d481806c1dc2b20edc5c01f24e03f213f0a3d126333fb5358e87bde2d64dbc939a041acc314d6d9024d61d466801059a7a2cdf95d006b66aebfd90d03f35e316a0a531a4cb9552030fff4c2070644b7c85fab286566bbde93a9c4c515e50ea22fec59693a1e254603f7f70070eff1fd7daeb25934a5a81fd36cdac1321372d704e577e173a86770b4dd72ec76ba29befb414c349efff70414392752778c395bf71a58923455d6a37386eaff639b1fb134137489500834b11e9d8763fddc2d57a9d9ee64e47cfcc3e524bf3a40003c197cbd8d6839a03bb8fcc6a2afdaad556b9244c1d9f01f9ed25f7e1f10b5556a20a6eb5f2e07f17c658ee0d4ab1b602288d98cb6c044d749f1d14aa58382008033247bda135141fe1950d0dee7c8528ab0416be9e37250788a65054c77f24291230bf290cc56961912aa83ab2db37aac157d2fcf3cf87218e71c23d183f0c0576e811230da6d630394a5c631f6926d3c6dd476917d310d7fbd13534a45700cf63c975a6edd7c4073a698313e78bb566d80bfa9bcc9a9a0dd63488925f6151bf56ea3f5b53d7b2c359082cbe50fac7be4cb56ef776f15b42175ea793e0335af89f15991a334f75733114689df06b4ea509c82f5cc84654da7eca5dfee06c0a963b01a364eebf964a1c4c6c7ac04fcf3d6cf31396dc9c0f8e51bc9e384f534e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000013c56b4cc379538908057d1be2b3b87d877af0c677bc56f00a54bfec58f9533d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e655ad908050210ef747e608eeece375045afa807fd3bb6d11d74cfa8e8c1be5e2effffffffffffffffc9fe544d78de9957b0a915de09ae8b7cfc2b68a6c9affb455689126dd3406594a9f4a476bce0811331896e0925464a84cfcec7ba3958ac44724c17511d65edf530a51b33009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a9c5c3b985efb275ef8afa386b150c35627e30d5b0996542a0da7ad73d3e77c65d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f170549f4eac2b95a073a8ca1c7dc3f32d4044e34cdb24a4499728b6f6674ca17e3019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a66d3be540f7510c9b0dd5b545da6d25f69a1c18e52caa1257294d6be308b026bffffffffffffffff52882685dd4c1de20eb96ae206b1c18ed80762bc71a51167b34fbf2378e4b64ac58157ccccb616f33a165bddc1de205b8fbbde58ebc73ae044dbc699201359778fd1db9600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2508550a5d5a4e7c31c9d1cf6b0f3c8b2f61b5157c1c894ef60101705df4c6dc0d76185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4e2c8fe7e2e8efdfea4a9676217d23c37c94e9edf2bd6d17cb839ba6e2a935e2200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58911ecf862d7bb5cafb4ccd9a6a33ce79995433f7a6ef09cdce20ff5babaeadda00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca488749040979470a6c52e4dd537d662e9d6e4470089c063239fd5dfdf62f7124bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611695570152d45f7a98d3ab7dce00ddf8be74242a8b5ae89db031e3228c5018ca600f003000000000000a76a10f35851ff8e55dc975b64f4cf6b83339e598b415377b260e47a39627501f39942e0ac4aadf00a45a79952f7317194d38bf305220db94a5618eb4f4d42f5e36163b7628e3f50f5feb472a94a06c2301488cd256975176527552692e3283499ad8ae453c6483afb75fb9dfe69d6e616719c00de3ecb23b4c665654e0d2803f7f37a7ce2833d713f635330d5203f8fb6476fd7e7d7bdc54624359a4bbe382c6ed3370e464589c9411096b8b82df7b566edac3af7ac30d1fbeef83fc88daf018bc09c3f6d4fe178f756c98bf1e1b2dd488d3e31348897930b63e0f280048e6112472d7506a54c905bee5afc83686b3f8c01125e54881908162489b83a64e24187e8d4d8a55f3d92a85723ea6fae4abe5e916142981fbc772e1634fff64cc847aeda6671c17703f76da41afeea04610c1a94849aaed925324099cc4762cf58205cd469f5a32e0a0139b8c69b3fc0495d84dc4d62064e4ef80aaf528665e2779b7db80ecfe282a03a5956eec3c525f68ad446bd0b9bed52e9260059a91433e4e1885e02dde480805b04d352a720362d216565b55ca99c12af2ec3d0934bbc09c610ce4109794e72703cc732387805b2f5b8bbf9c3f1793c291702f1b629254948bcb6fbbe2ef60a66f768ddca8671776cec66ea15f477c56c1d19084ee5d1d5ffa99daebb360ffea90b9a79a83fad6008caae75f9f1e627a5d1c45e332a8597f0cca665433d90b04a75bdbde3b97690c0992a6b3af69f1c68219e7ab10a10631db398d11569ab1440483ba44bce3b0d54235fa9b5aa6a151627eb49dea3637659c5d037a7c7102511f672bd953feb5b0bd584a45ed8b59bddf2d843dd4e2487c3a80b1a25104dbd94c32c28c85311cc3ca2e84ab5d55adde55a934675b3610625912a34d746abb5396aa69f29961ed55fc880f2fe2fcda8458cb1d7c52db19aacd748c028840baa71b86fb9e4e5d9091bd30ad9fd538a5861dabf8244c0c5b1591fbf4706d410c006b385bfa636eb172a1e68a0deeefec3cf4a6a252b80fb18f7142482cc897235c543cc636850cb830b4a39751b2b5bab1be62adf94b72f989af683d103fdc0ed08a24a965b098a5d0ebb50c06b63a1c36348932c224f59c26320225b56032df93e4bda8c57fde6106517098197a5a4844576e157d949d41d2d2dacb689cabc6074df100beef0326c6999e56c44c98bae6bc64db637cfb19ca7f86168002d49d3c1fa575f3e2c22b349927f8c7fd6b9f40d1ce689722ac117be546db55cf0ca1fb820bf4a9427cb073de80be41a712544a95d224f8b6023e538b9738cd55382812a738fcc6a9cfafa5bc91ef5b2cb09a16e3e4dee40d734d46f3e7e438e6486ef70d8281881144c436b9793eb61410edc91ede814742e04aa8e3b7431eecde9d428436a2658e839140a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000829a9c6baad64537c0f54ddd7d1eba7039ba19477c1d530d9f4805c8e733af4501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65fe0d19c323fd50221718a8f28c0bda83999c0f064a411c72d78630e2e4fc8e8dffffffffffffffffc9fe544d78de9957b0a915de7e44c62e3610a644ead6d5d52411b1655d7dc29e768c3152fd8998e76a563d5ace8d62237eae6db4663e7657ff87d35f7ac26454fdec6d24009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a6a53106b3d21a96d7118044df408b4e845bdc423762f570fdb7d50a166602a6ed85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17ae3aba58768d42a07cf9583cbd77132bca05a2c0a6ab17161549ea375af07fed019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a31113aec15481fa2296227277a186828a73a5166be8376baeed8009eb96e29abffffffffffffffff52882685dd4c1de20eb96ae2b1c13dd84987a79ffa1c6f5ff71f03844c6a8e65091edc650811f5c8931aa3c7299ff5dc38332403c1f3e171370af96de6b07c562c05c34000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250099a2c024a75d125eda223a818294f7941aed05d73c221805bc17a6ac4a089946185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4f41779f8acfcf6c00f11ff3472b3aba07f6ad7578f17ceba7930939b01cd0a8300e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58307182ef02f9521b8e0bc5789b2739a5c1f1d579a6c55fb384bb455fe573f6df00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf7c1983881f9d0cee8f40e7cdf1962788b31bf9911709dc53e3fb9a1f371ed144bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861126b5d8ef6692bf55b74f4c1a5cbdc5822c31cda463a70cb1b7b2037a8f3e9dd500f00300000000000094d8d416704af3186f3f8d4e5ab66763dfdaac0172627a417bc252dfec6d63c2ad94273f5ab2bf5757429077ddc84668b72e3d5c5dd7ed91a0e2aec178640a69b81bf3eec1977f96cfee581f6514ab67858fce4ed32e04e7390a3757d8fd6c438eedd774f1ffdd5040b0e093220fad78d0b4e10830b2b4d2ef6f4d7e1051e35252eaec53126893b0f126d67ed7eb6847ad4088a2ba54de767d972d85db3417b4cd64ed1e9e60c2497a39979d4642ff785af486b243d69e4316bb8ec9e86728a4a44bbdcc421d661c7b7b892cc3af7b064ae1b342c7f023dceeb10ad03b5bb36ad1cdf94b8939b055144245d7c6d5162ba0d57028e366f14d767c981e9d71a6843e66f0dfe979e91e8a3738eddfe94ba379aa35723d8d456786ea44bf6342adde80daa76eed2d321551e955c78552503ca53efaf655b9ace4c84eb10a0704897647c9d0f70f1b444cbc68e03f611be65388a79ad0224295753a9f503857cf8200d8ea5774ab075cb74f040f6abca8e921600be43d7411f935c63040775c14cf3c95afb9ce11cdafdce35e9c65001e34678ca10a8419ea62cef9e3c7a7c57283d947292849621680419816a48f34bf968cacae1cc3496ce25dc0306725e77b56dc319536da6fff7a7e31f9206b67c70ff29ead575e1d564de848d9219ba1e03a338c8b831a6e08df02c32e9d3c8aef7e88bbc65f641c4eef6c7e6f9ff131ed1a38ce17b7a699e041e17d7085e741274f9cbe2eba772fed1edf87b8d32280e7081a40ef2dcbc9d58f96c7395331eb3964662a61debe8132001195465ad06b33b6b462b8d3cd37ea4997f6cea7956ce0ef29ad2b9a78540b59fcd93ff5db827150ba6be487909f727836e155b023ddf7f60170ab123d3a5c7edf9f62cfe5ba3c0d7ee2b5e5482439632c52187232ec765a72cc1d620a72c62141e00b2df2ec83715f6e10191928f5054ec7713b737810a42b8f3ba57473fb1cdab5c699cbbb1d5f8d58093cb203a3b463c4da879832880a0f4a299f0c3fa6ee326b62880060a6077a475832d9c9039435d49111689fc36e30686f2a70c3a2ee17fac809e16acaf8446ae2a814e3d939f46ba6dbebca94ff6cd0dbd7ed6407cdb12fd6782876abadc83c7c58faafaf29015afe33c2be010a2b65f5461aa36ee9141937acf81faa78443cdf9be6b8199754372f9872f9c1393d4ce57eb934dcd15013efea69beed208028f690e95458b2bfab6bc1026092614d42187f6c4bd220480ed6bc43c055557898644687e4adb29285447fdb7dd5fc2119444f1b62e1b21e3986563c8da7de70e546367da5b3d9c5b17dafb7b3e9260d6a31fbfc296f7d9ec6181d5dbe85f4320f2fb454b5cb1fb2f5cf4e51371b835adff816612d9560301355b19b71d20e8c6c848f22107214ca712eab406bb25c68 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000058bf2bb415cf3a907f4a262e683cbf8c662a713af560da15387812118019b53d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65d21df5904028fbdf916ad8617aee8b9f686f19889acf011a3e86e8c3d151598effffffffffffffffc9fe544d78de9957b0a915dee8751ab5a573a0fab975514ad864010c8d99b458a34bf33dd2706ab4145dbad3bce819be95931151d0105367b4da0f4639341d4fa62331e5009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714acf3862a9bb8b5aff9fca3d1f9ee935768bdaab3b2cda6cf21458fdf5f7931838d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1778fa2485a7da8d041b354e0870deb5fa13254b41b9f0358ab6d0808e4305bc9a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a2be555683f883257eec59811a3c584cf6cda06eea553be9fd80243e094a0e76fffffffffffffffff52882685dd4c1de20eb96ae284b274431586c1dc9da12da5a229e1182f9894bf2acdd7ff64fdee1798a2de3a1c66b80503660c4829ffc1042e8a3e15b90989a275011ea000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250412a1ee13d143bed2aa736c37022c723cc5a8599f23f40362fc5fd6615e0a31d6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b45b9c423241ecdf7fe17fdf30736cf76db2466c1718df28f413a073fb7c058b9c00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58bf89a7be0aaf8563116b72abf258439e95f7fcc02c55fb0273f073f353cd810300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6605869a24b37f55099ef83afae489fc77052006ee79799bed3b4b87796f9fe24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f8518c51f07f230da7e289ec4d541095aac3fec5e887dfbc69989231c8cdd83100f00300000000000099805af45c70d9d6456ebad1c0aa2e53a9ec4afc3fdd83c465d9af81cb8adacd166681f2ecb3e877ed4039a697d32663a138a3192861861090269c67fe21095f5f76e58b322d6584eb6a6a4cb1071411244abaacecd50b0744972774508313e999ebbb419194c5f9895d8f18e5ce5ec33f90ca14f60ba7850e4de7795b4cd75b8a692dc41f7f41a1b5390206a560e8bbb8cba644f6a679af7377072e72db8ae0aa914b0d1e1c5b6e35fc247221b522ce58d40e7f8f66f7358aaf5d46627de06ead03f6354f35bea0ff9111b297cff56c0c40cd1b3f0aea080dbb79b74f470ac1555a5f97e9e7a9b305873d8b3e4c031d8c680a8b27f6b7b5769423f94c304a6b9ff3c82628c2dd88e9b5c65165c1b960e905dcd0da8336d074dc8e3b7252178ab2c97fc77cb4533288f937e91e361a744d35abb8b6e4929fe0bac35a0f08c5e6c7c842584a636a2c6feaddb8380d17e28405f21684f97b937e44e205d199990add6bc4cf0703ca91849dcd98565658f24af426d1efc89347ab790f0a7bf66e2c8f327ab8b8768a80b661fcff75aeba7fbcc6bc9055be3029a7c329c69c5bd8845675d178a078ba6da71f09d6dddd3e8dade5559e3f7327c9abc5b1e925f6442afe4235338b8ab843f900ae3917ed6bb5e597efb2deee865f941c2753c6d895668c418f5a992c57e339d10cd313883e23b00c3e315ab9fe9a76881f7c88bce1231f6ad1765d708188af62566df2cba2a556c5d6905660a72d34645dd5d3fefd08ba1068f40a1c933463087e8a2cc48d328282371271f18d6ce3e23a89a01c0321d87a6dec7b684d747e58c661380b8205fd02fc99821f9ed7c812dfa2f13c69d0ed059fdf7ffd5f3439bf0f632e8f4d4170fc45788dccb9bc3c05bf0e3adab1802f321a0f6a853f89191560e466ee0f0fdf19d3748f879a4d2f07f25efcf4c6827589c90b561e370f000e3d6e7848db6a2e0c9297649434a31042ee789e255322fe046ec600aa067de04d9a3f2df7e44c91f90cc5e6da40dcc9aea37596aad67020af196125bbdfece1d9a1f5b7686e07003f9bd4f3facfe1559772f86aaad94c9bd8a6138d244444734d87fda624533c6bb2da614fd9ac52bf5a689126343c2281fa4779c7aac25f4834d2a1dba706711d4bace8f8ef37bf3d02ef5aa14e84097d81535fdf26c87b03e7da105de3b5014ccef6fc40a4f58936b937a39f776bc8029853d95cd146fff2a3b88e1df22914e79a1e0a8b49adab217c80e85c07f6c0c04cc33cc2408b6fa5fa4b0da8331f59d4a0774235cde63f33ac1bc44d3d2603df42fec5ccbe602f1d690a51cb28d65d36a11a01f1666ee9c33aa7c1610e2367aa22c8895359c5cc00a5f2b4ef3cd039bcaa6fe3f0db9252431b6b0070ceb41e9519f3ff8da2b6c3c64142c03912f509 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007588b63dcfa23fc309e54e0bffcff99b08e5cac092ddb0547a7844a3b1bddd0901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e654536e1371ae83a18c3d825710349458079a9a23d8eff1f87034708c5fcca4328ffffffffffffffffc9fe544d78de9957b0a915def1ff1c28d4d4fd2a90bc8582de504b2be07ecad6191972f61936435b0465f0ab145114cb61b9d70bcedea27cd0c99425de577319e1ffa0a1009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aae8117c772cb5b524498f08d3025b1d503c05864be0c02a645189ccc5baf7ce5d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f174f2c1cab8c89df8e5263f1a76cab4c89da38639d42f8192c8586a019d8fb0951019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a92b815e0b9286ffa4d18e138a6e4c62e1050acdff963fc1b167655912b5c9c88ffffffffffffffff52882685dd4c1de20eb96ae29bf7a5292a69df9817f74cb0a757ac0afe9f0555ea62d1ad029f658b19fdf01d73d65fec25cab420ac4c371013038d176afd43d63b829bae00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250eb798e159f3c184377547a1b1969cd189484320fd7f7da83ea66bdd18526f4606185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b402c2cabfc19a488f515e9706f00928cc2cdd467d628292d3267aa509cfc2e19800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5893d3c4ce1020a74b3575ba673007671aeab41e2ac86f52b508a25e61ec7a8cbf00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c239b509cdec480e243e533c59c342c6876819f974030248b2e47928c1d5a8dc44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861185c1bbd81f89ff68e0a5f8c99e19a6ab9b4275dbd37b39978835810781e83bae00f0030000000000008b0b6d00e0f52752993a5600ba24ba9d35a51793bf3b6e65f403a8576fe3cb166aa59171defa10881032ea7c72b4fa11b0bb2cb4b7a63529b8d142aebc21381de546151e0c0b6629d68a38265145d140b4ef66f1ffa5e064665b1a1f2ad3f554b3714297a078ad2077d03007bf973cd7731c4b92158c649081d7110ae8a7a653cea35a156f3a658837216d5995cf492fb8e750473d4cd2f573d13659286935840a695e444a28200de156f96c75c4247e7e12f2bae6a625f0300badbebde472fc8d5f31d74b0d684ab5630ba9fa205be82f02a6ef49ca7c8ac880c28e8ab7cceb4c0f233e311fd9090f5bf99439216a3082bcc573de5c9529eca215fb493623146f2a842e7e04ad5d044617fe438506ca846319850df15166cea30da67a9a6f58a3b68a943fd43f3bce073c79436a789fc1888fe0c33f7fb921e40a09a79c0a8cf9eff9ab5e119c7d15af97de623e248ab698525633ee522082c2161c2b4d839b830387ce341c3dbb3f81a2851c345a30beef489edd00e7ebe07369dfad09e193a73405e9a22e9dfa133ae803d8df7142fed7d9856dd33adf570a0386d15496ead0679442557884491d492a3b6f9e82bd8762740d09b2fa15fd798022058790851cd5835f856166e4e23542e1c5398161e77ae7807ee97ef9e449013dbb02beb7a7356a6d74afad5f9a9babd08b8fe4adb790e1c7925a023442aeeee78a91dc8a40c311cec45cc7aa56f6eb9ccb8bf0ec6de18e59ad5576c492c92e0f4e7b0ab086d5202536f7fd871662ae16776ddb697693faf8b4b520585ff967c63b60402b2cd724e0f0c7b9a4c5c4fcaeb182495060dda3ac8c2af70924ff2065bfc470fec237003d634d02f7d76b9d9376bfc2061b5a46c45291bf0125f96565de2d954d8f0250b0bc7ab939d6c6dceef473b143133a039588663768de0d8f41855da2623bb77e6e43057563c46e41face4fe212dfbe9e8aeeece3b05ebeb3e96fca9513da005aade0f37415f878c7398e69b7514643e343272ea57bb7e4c439700c072f3c1609921ec8ffcc8a181da9b3770b4e2a3137b3d9c2e4e731e0750781f3bec833facea0764ac0a5bab9020461e48834196b531bd59f1b79ddaa285b3f072e69ebcf2893f91dcfa91d3c7fe3ca6f1e2b1c26c7f77aac81e5f094bb91a193d2c3ae6e1ef8c20593a60037005249bff870150e96ccbed55a3452e47fc876404effc6de34d13e7c2a7c36a6a71ee0f72e4f2234356873a4abedf4d84be48e5e3d9b2dd17ccfa0f3927b2493a00b6bca0425a39193c750e5b62cd95e636aa095c81f681ab26f6254af900a231dc1bb4a8236560acf520ff3de86f64e4d1e2c12a65a2db2917cc99c55ec39e607fad001612d5d56c330d7909af598019802a64c87bb903cd8c909b9aa75f4930792dc36af72 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e2026cb96d903f314364d42ae88bba9b3932bc9e9a56158b019b6cca2c2f9e4701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6582a2c1338dcec71f0609beb4b967faa803932097bb82e71d5fb46ac4dde25469ffffffffffffffffc9fe544d78de9957b0a915decc6c1091f7213a6c47f9b3a5ce90ce6975fc8d49196da504d882dbe1b1a3b626a1d507ed07b4bed340bfad5f7280dd0e9a86566ecdb09474009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a49efd610716422f0c97249dba9fc8d39b97b7715f9aa11794d9bba20bddc4484d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17a2c768f440d111c91771fad6e4b15ffb71227219b2afb2498da1b1e0a9c1918a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad15985875bf8899aa8bcb446e649408f3452989505532f29f239a703ee299722ffffffffffffffff52882685dd4c1de20eb96ae228460adfabae3339818cea09972763aa69b8c288238d83c9d193cd8b8d7c9361cc8bccb98ed68f9811e39847cbd120aa40d126d6908db02d00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250f04b4a1b4e1a56e979cdc1a4f26648def98151858559da6289fc3051bcf04d006185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b441b73b3c2a75034e7283b5970b58768ad25380702289541dec4bb4837b40d4aa00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b589d0d58953f6addd7bc023bf4e527d9cceb061b2cbaf4d7fc8c133af662030b5e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c481d72239be6e7d799636ac672504d7d022c38624afff2b70acd83bd4b9dde9f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861158f6819d8be0d4b5da69c01511bc3177114f7da14eb11f2629539a8bca0f0f1c00f003000000000000941d051f8212e18573426b8973a34b82c3b3d591df3127b41f2deac16c1e83d96c17e04958f6f346f56784f976e2038187268bd513156c03f5a642031000324fbd9767128e19a8ef26296f57243327e52d470edf22c5a8d918cdc947ac8b1cb5860e61db90044564d5d42ee5b5da853883c771b8970035f4f0075c64612d23810554f3cf1af5a55608663e5be985e766816b258c009a35130dd8592e14442df61f6cdab359cfe93f769ced59297369f5cd4ba5b62ce665fd389742018dbf58f4860eefe4d9d952763b0190cba72e92df4e8fbc71e2468373d4399199badb7d0c32294c64d7a0e9c0997bef1fd4d22f87a474b65a464740a24412d494bafde416ad8b047f2af39457099627349652739c79bfb6a68664a0292033d9758445aea19608d84a1dc7116bd4cc0ca249a5176fcf665c9df8a66a80387ffec366165a367c03b6084583a70f836af9687cbd17a7a6ca1e56d3fb8b0f9e76bf1496b779528d9541f388c30671fcce22ad3a06c123251c80665113373b305a80c5903f25aa86113c70c528813dec82a84ec3d0ca92ae9a61ae1aa372da1f94044dc2f837c9032b7e1450fdeb661ee0d39c71b574c29279602d693594096d49a462f7b1c364a5053c068f3d3e776d5ea49b31d8ab35d3c19f6dfa44a730257a50704da99cb490300d001953f4021341c3c0ef74837f1b41fe5c7b596c5ae5c4b99b11d4c50101986da572a28b1f31d504879b63fc8bbc3505f59d523bcef4cdb789316a9e833faec6dcee1603e0707186b4043af807f9a84d916010fa3bd7cb80e5d950841dbeb60b26682f6acce9ebff5415c5055c07ad208fc9807946023556f04b9324e6933b5c0fdf0a47a22e37201652374d0448e7a4bb4c5c761d58b9f35b9d94366a3c185c58cf5355a0453111f23c42a308c814fa0f6b8c25fc7c7ad02046c9dd4140657399cccf501dd5fee33aaad72d5902ddd8eb7f18a623e7db30195cc180bfcd4017ec5dd8cf3fdcf74c64c2028111fe581f2a92a4f6ef4bde9d17733af8cdf9bc06ec4132cdc1cbf2a01ee5ca491f82c5bc83ef7f3507b7b02e4e6cb258bb03779714d5a589a7d545117ded6ca3490bef09525864d032b77b774cf989faf3b31e58094e3df3a7a2c57a54331286688054c58bce49fd5fde9e1bc893481b9db1e35a7f8467921982fd74e73dcc98532d1742ee8702c9400a90dd7d5f5a75494a5f22361af26fae776685dfa674d569f9ffe0961e41e45fbeed02adbc2f571983b74a0cd74aa1335c1a8b6774054509eb196b4732b17ee75f60cbc721a856529d01dfc817cc1863dba051489f83c4431fddd81a29bbf15c585b5298c8c6c666125b04e2224da93084f741afb8cbe36b824b00269ba63ccb6e5e3fcba38af00d8dbc307b719479055de8f1bd0db01f4d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000002c4e36b9d6d2c081d6a6c1b24216e99851299855bfebfcb5ef26a0561373fa3001e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e656439b8fffcf91dcab0a86849b092121bd8c2be184146bedaa2e82fbc32774084ffffffffffffffffc9fe544d78de9957b0a915de3239cc30aeecb5bc8c33e3f2122acd673614bc62764bf211cac43765a898eedbc3ebe96ffe7766abd6ec20673a5ee181f2c3ef95bed09a3c009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ae79d2a0607c37bd773cc0febb28dc6c8c197748f5442f4968876ca855714a184d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f177a7286d7f8ab05231e70e26d3c7aa944617ba000ff8c3fc80d7a030836df1d19019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75acf9549e3544761fcc987c7bf1105ff038f19f1f3e526d4cd9829792b4a3c1602ffffffffffffffff52882685dd4c1de20eb96ae2fc4002eef21fb8d61afc56e72387601fe225b94ab57284d3e3df7446f0f18a74de72fa652e43fbb480caa615dd6fefb866d93d8ad56fbd1500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250fde45bf76ca1768e1815a1a8b2f82dc10fe94af276920f5ddd2421dbace11d8d6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49a762da2db8926205973b40b6c9db04f867f98aac9dba9e0dde268426948744b00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5805e2315a00a8722d0cf423f197d43b533d7f5a89a0326cacb9df8d804d953a2d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0a5d4defeaf10ecd9a3404b6a3aa08e682c195453a4cec9ec37d7dd54673696a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861174035b18331f6be6e4dc5071e05935200f963e70ef18659f256415ac50a905e400f003000000000000a18e3b0a75e3ff228186e7b087fdd4250048843adb3f4f5a5580e94ba22a497caaa2c4fbb1ecddfe96a63381f5a65e678e5e4886606c07a5f07fea8ad69b17860e8dfab134e36bd9d6dd9627defa5653d8808896f56dbe25decfff27cb8a58789239d3b9f33cbe3909b7829a44c18c53253c702f41e2791f1fae5b8824864b7c1c8b41acbd8a7ba64b3ff52a34f1b89dad3f28d6347bd119c64168f4abdaa7649b9e3b5a12fcb1376ed38bf689f9d95f102951f837292d265c0af40e1d426087a30a7b7c8a81d4cfccf6a7afa341a9755d7379cfba65af4f642da13769ecd4712078ce564cbb7efb0266039b7cb792e6b48e4cec76db492e54ebac0abaa9d0cf06580fc82b16f5c4ec9644fe60252c3794beef75811b2f5746c80de9f31f2ccd93b812fc2287675d5aa7baa47baadaae30068ab0aec48da00d623dee91d73cc2239835e222ef3575f63dc916e7b261a2ab99b59a9864a0ca1e3c9af9ec491b9d25c6ec1c0b0c07ac6fc9de1a926223020b067f4e3e36c896757c4fc971ba67f093e9dfb783405261bafdd7691880c62f643372cf5cd59418594cc240dc7fe641485b4e80e558dc60f3f7552b650fad938b1226d5647ce719d645356ae71a42c0e509d7ed4c6c8e1b65f721972135a10dc207aae1dd87c979a029849ccd4725348540de2c1866d51c146edadc3c7070cab7984eb87bc154d8a77861425aeb5a2277c4b388a2660f2a2100ef6eb21406c2766e6c6c0dcbb01580c8e6961316b865a8623e3ac0df38265f13c966cabebe4fde714ed776d5a5c14673eb15818daec0940cce2304c1ef2a74d1ce4c7d4afd589d7d34ba7f4dafe04cd2a9ff1242aa7375c9177d95dc4421f7b2922a575a043f44cc0b14bd2660c0af650e1859be870d391802ae82a9ed2f49d22e8f17094870a6b6e2c0931b5c7a55436933edd0c4be24bef90c3289e5e6b95a12d965f4765d4074c4d0c0fb5d30c474519482e188c9d55cdad4922db931b883e6373c4c900cc1548a2564dc3f91cadb44ddbd02ff12f6e1fee9651d235321ae9437d9744514d018235a3a7bd35a722cf7df7f98ccf394c368d0636c00270f4978751711b51d66d610992e2963cebeeb99cd3a93a9ff8f125c905b301bef2498e0a75b7fe70bb6eb68f6f0a20f4ce4c9c8ba2dbc75f9bbd302cc9a3d611287c531389fbd8d0359cf77125b4f7d909534a8030fcdb37969dc7d96369b75ea789eeb37dac3853d8fb603017e51ed8e6e5dbcbbd01f63f154c50e295c3c2efccc34e7950862c5149a741879249b15dda6265bbd12cf1f3e882e54ab51e22839f05368ecb0231d43144409e9b3bf674c69f5797fd85cd12a90d2fb9f9a38459afbc085243444f91c81ea8604502c33b410fc09b4a15d083665d8c96a0587f4731ed232736ebd375d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c9f25206d2f67ca438b6ca72aeecb3255aa2954f88c12f9052a55b5310af222c01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e34f1d8e364dcfd682cff87921bc348c4bf7adb896c2f2d8219628424a74bb20ffffffffffffffffc9fe544d78de9957b0a915de29c21d35d19dada3e137f589bc4c8ebbf130a616998248de412b4ba6bd0ec59c74f60fe2a413bdb142033b6a05a8adbf1097221851c58721009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a7dd7cfb55cfd98bc6180851055c97684fb3ef4d17998c812024556e2e5bc6dacd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c0e8d230e477c163695778070322e4759924143c224091c03887f3621abed401019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a6b4fe737e323ce9a2962a90febcee31ac5fe296566bea8348eccfffa8e3913e7ffffffffffffffff52882685dd4c1de20eb96ae2c16044e9d57329e2897019f1b920df8665d51f48b78f1b98284652521f966366b22829c0389824a6e9176d7e7f879380afd27b41786c58fe00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2502a83e82d02e15f2fd0266e79b7a47626884a1545598261eb7e76c551963cc9946185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4283d3274f3bda732c7e5e8528c72d495d2cf33b1dd220d86a61f01c8736e80b600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b584d1d451d036737edf441a377a1aeca4f204ef00c63119b0c559c07cc6335f8af00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce25cb1841a2243473ab6e7c7b689319665c80be6e24992b03a43cdf3869da4704bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116b8d217d9bfe7b65e0c238576799ea396f143114823fab5a3426ffdae9d71bed00f003000000000000abec35e84b6555fe020eefa691dd2aa53e09a156713c0dc397b24effb78b56e3ae0a8153b03013d73a380de767dce89d998fab7897a83d123d2fde59e119f19e1b10bc2f1b2cc06120ce849cb2317942234671ed494dae1358ecd1c8ca5359c7b49dcf1d4dfb268430f6b94782c100add62ae03bb2a01402ea9e26b3e62936eb04b12a03923661bb9d78bafa367133d8b9a7ccf2bd89c36058fe21792ab999b2283bd53f84dfeb05082c516e999c0768c0bfa4285130eac8daccb154fd443ae3b31271051c04bf1b880a0f513389f356e22802f8c2dfa939b71cf0ce91e44fb55100d370503db70e7ca1059ddb9f36438b58cce91aa3bcad23b4c3c124e3213b1e371d5c45fa3c0138d78d6924db4262c33a3236647f985ea93ac4f6885a553697ae2f8ee9a30f5364648d8cd34caa6455d3825060ccb32003a37821e3d0a936a6d20408be694523cd9f0c79ccaff4c78df3ed1b5ef1ab627f97cd377cdcdb9cd58ef48edf58a07a9ecfdef5d9e138afd1519aaf39438448bb5ed3bc0b4c92a7810e73a71e8ff7aafacdc87c36970ae3ebb86fd1070f09522c7ee82ca847391ea6dcfbad090fc4cecc8a54ea2022a6e78399709350a67a21ba8d574943d065165c9986a470d2de4a1afebb14835ac46e0b20257486fb01e6cfd00eeeef6ecbc3a0dd0a2f37af6f7e21e863bd24251c9fde57b6c5a4f6a70155923e69fb6ac6c95a9b172b39caa90e39d4bc528cfb918d7022ec09e0df5a6096d7cc557928a6086d5caa98334150d6ad221c77d364744d4888cb8c7017106c4a68622e812b3d919eccd0290b10b181581c865233c39f42d8e889e4681fb84750e2576ee26f94c0ca99c34d4dd07bdee8fc3081077ac7315c62a4a28d4d1e66cf38a105ef56725bb809126fe74cf188c42b24dc5332af3c3f0b5ac8963db3bcc05a28f24c38341ea22050266ef268453c79e8721251661723cf95c7aa46dde2d883eddb05e6a4256bb0985d3f1bab8951351e9950b826546a656999d1b71950b93e0e4ab64df2f382bdcec0017e3807d9776a63dd6c822c523dcd106eadcbcc61b80e55b8b41a175e872766e807b477d71441a62f4eb723782e80e2912db719cee97febf3fee999d2c66d7a02730536e7d99075e4c503201a6450e7b7f77c6193d14c5cb64ed3910c468940bd3e7367a29a22b9d7ed78066706f2bc36ebba77d32218b4def13943969122e87d41cccb65dac135ecd54d17b41b323ac486f5d359dab82897b8729a94eedb961626c550343c2f78f11bfc49427483d515ea3eea346ae84173370afa19be336738bbfdb75e49fd69b6f3e66257eeb54976adda5b83f83fd52864638af4961007ac037e499f94b905e819b346dc256e65474a0ea8dc4256f1e63c4fdf52e78d953b800f439522594f7cef3b1e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001b1f98a4fbe6e7b7fae0d313d3a26365c96a37ea2240746aedb9bc79c7b2251d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658d5c524883c9235b3d052cdfe223d27aa14470bd37e22db27573930e968c70c8ffffffffffffffffc9fe544d78de9957b0a915de772961dd5f40a7bab2f71ebb3d0e16990210e2e0f87c8142b782719b74fef8843e5849f705e01d985a53a7c71e437c7cfd88f79cb4150319009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ac641199df13f164c2a42a97773194394ab4003f725343df8ae7803b5f0280fa4d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17f102e3dcf34dd4c0675cb2c903fcbb5933ea96b0b830a1545a2812d88b32590e019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a77625a5b0e816b477e1dca29bc9959b1381ecf13353200c463df198108cfbd96ffffffffffffffff52882685dd4c1de20eb96ae22eff9dcaf2fed0e099b0a3ae1a020372d32595a599e9a3d8a10b971f152e198106ff8e906f6427818b62834496240f07c1f51ca19ed8c1e900593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2502adc89eea3d29dd856421263d79989e35d9b3b7b3a5f2ddbfbf466e3695331676185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b45ed7ed3ba2dbcbe82ab3a1e3f20ae6efe87867f60ce1801f556f3c0341d3d8aa00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b589866681c92787d83ba56e6e51d31351b1e808014f09b74f6212e057ee9e0306300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb73106eb0276f106fcbc3da34cdf071cfda892769702863a21194db0226252944bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113dd2219f81b0bf4d110962e09c17d287595c0e20a9bb2f0e8d3b152e99b63f5600f003000000000000a1ced8a911fab0e0c1ebbfb07a9567215dab0fca0e4594ecffd2cc801e0c14f978452fcbf266cd15638c6ac4e70f3fbaa2e649bd93e98a9f25a8decef2f5228f5ce20430e60e96d36e993971068627cec8cfa819d2a7757d3631dc23f816f1078dc678ac7f83e2a1134f92be1006efff0610c84c1421a160096b7d92a5d401409d22bfb61c60ca065561d01f7bb6afcf8732cffd22c31915d169dd69bf35b83c6f9b9148860ae3aed2dad2a370bb2cc6886da83df3f75e74a399ed7ad4323bb7a0790f70bae583c5474bae7a5d7884668a95ca9eef320d371f215fcf8edf5b1cd7b415a0bc9ac7607abdc75d5c5c160da6a9e8d4cfb844afa3861f275cb7c9058c47ad3563f0702eaa610e723406efd8a68740687d7fbccca9fd21aa01c7dddb8e0960d718e22f5dd767d8d63c46e7c231a76f3bf7d55701207a75e7a83fc7c91a3604fe6a961b2359374328f6b151b9aaba7e2666a6c5267208e4ac70eb19a91f8047da5ee86441bd58c16c4db71a05ba8b1ee6626f30cd72dd3c293b465fa88cd00ec04d487498ad1f33a01454cae134fad6653f2f30aa8672bdded2b06e52cba4f8df4df79c38829e184cf9fedcd1ac26a56b90aae5c2bb57821440839ca5f44ef44e6d38c953dab4b66da8e4266c49960aa3c6fdbdc1081d05a6c8951b0198a2c8630bad573267d2d7546c9ca5747bab42d2fcb119c9aa5b7da0886d49e575a7c5349577dbf5c1761c747710844544b83acb02ccc86f03019a611ced64d38153e957fd56d9e13fc7f725d969ad1eda7a0130bb06ffd6a0d568ef421ea38999bbf4d8899a5f2f08ae55fe59945765916f97631ee848695d08801bd7ca594e4c415901e2af09ccc82142c557417a4e116b9b0a770513dda51dbc7d9953592e893038f5b7a4dd1113bc31416df6b802e1708b5dba6fbcc6531b96f00856712e3d2bdd0fb3515a1a93a1c38025f8c46a1d064f19dae60ae37a16214012d736dd7a801c8fab8955b886b44d4d3e1e87667032887d756c0cf7800f79292034d29c4533967ddcc4c745d788b3621f8a6a23c9f51156c91a17e03226ad668ac5a8f1e95c578f5801f10aa0c336c000f0bb394c2fc3ce6092827a76a84cf4f67394f275dcaed2bfe3a207e0770e2f507379636a1ba79be2216dc855d9b37cf4bed94a703d54bffdbbfecafc8ff9b77fa1df6d87ad34ed17df22bd7597e57616401a851700262c046eeb557a756cea8f60d6418bf421679c13b97aa5708459c4ad3ccdeff4903dbe8ab360eadc83f65704231dfc2783fcfd828e50b16382a4c8189912f70beec86f3d6a842de4f0b02212fc4361eefd2a8c710b7dfe5bc6b666fc53d0053a63a43bfa0e80ae07adb7e6875437ee3f72956efbc5d9d94f74eaeab5176dc3d5462cf0e91cbe562c9728f9e8792f +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009a9e5ddb8fe4d4e0f1d12b58ba17a8be6d40ec5f24bc99080d62a1c71d71a67301e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658e40a2a6cf27db5d757faf3242d689f25357543b9875ee7ab3f1a32b8d624aadffffffffffffffffc9fe544d78de9957b0a915de13534aa452da3cbcbde3fe98d9f0a46dbf7cbd0cc3fe3a3ba9b18bb4f47de04fc088db3a81c73990bcae79da4ce31c3f25866f204d216cf9009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a1b24bc7da15149340938c51ebef8eddbb723378124aa213295c887dcacc56eabd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f174c83ad8b2f0251aa105f8e03337ee2f9e9e6441bd3fdb4c7c5897658a1d341f3019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ac268e93f1aee272cd5cbc92d0697615ebd7e5c7de792e6ea4754c494f2c9f56dffffffffffffffff52882685dd4c1de20eb96ae24a5787eb752e66f6b3503343eff4b17f32613b0c85ed7121f7786a50c7c26bf01e2c6e197ea4dcf60b188544f1490145680d7d0e97eeb60d00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2509a270f1df2c928fda05428235c6841a2c8b2fddf2fdc19dcda5840a41ac264576185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b48186a573095baaaa088049ba54c6d7656860d5be4763d5d78015340efcdacf6200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58423dd69d5b8481d73ad063bcbd56a9569c9ad3990947f9fb819002858079b8f000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c8b79b98718d606c390493a6ccf1d89b2cd5a85e15126142b20826ca26d96f1ab4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861146ff9752c4026fcb3a11afc5114aad56c0bf2bd4a266d3e02c5dc29f2a34c83800f003000000000000975e9eb2102629d41863a671b6c0341abb6a77057b4a0fe4f43b8ee1cc6b116d1d0599afab2fae35913d847cdea938e2b9aa59f329846d6d64e6c2432479738f4910f3f5fe69eba3f2005561cddcba69d2676ed150e134b3a96d39887c127afaa09c3edac33a75cbff06641d5d075404de856418128db493a9510fd67f827bde89b4731da00994798c4784369d98b417b699df3da17d7afd7b81266d341988b258b5a5eb0a8a3d8c6a3b9711ec20bae0470dfaa810854493ab6e1ddaaccb88c9a216c0528b007e23e111dacb5e4f35957a0ed5867c000dfdbf90e12eb22f055aa98a6a8840ed56e3481396b7a8909470a83a00f9ef9a83f06c262b57db1ca95015c24e912e347c39d74fbf7c9fd90f418ec97401d325ea14bdeca414a890f2528ed4914e5b705bd8fee648f8e0846b373af679e7a139b532af4858bc75857732c3a4a2c517c895800d97022e4b1d57f294070899c013295d8a3860551f7c7a49eaa0d07e732d5dd2feb343c2cde2c1875f16598fdf47733e52f563f911b2be4baf3c7334502eee8ea6d388edcb0a4f11c1f07e1cf2cc40c059020ad0e120d4cb6f8b2530732ca5c66bcccd33f925a9a0a7a60bea86e40d8582718b49a63f1cecc293e8eff6518786b747e698bc2e91b5f2127fa5740e226dc822b0067164caf5aa29c43c1c76f6d46625c5efce645f6998e84fc38c8f7431d6ea4db94afcdd6d551dbbb386d04a0bde420d3066f0953ac3092f78fc14bd32dc9d1ba6780c07c37f0f1f134d323afc768af63796ba8d000718bd1c9904fc4de4d5d0eb11c4aaad0e80da1f058ce53b8d1280dc76df6b235a8cc5e6b63c58263fe23bc8f9b8887873de3c0adb9139e45d1fca5b6ef7640c2c20948ec0d2c0f417785d82e7fba22f67cfc4a05d3bad0bb493f8a1399c013a09ce42286f8092ed71da64052639b26b50defecffcbcd092af487aa2ebb4e46b8d004c4345fd4a7d798e939aae60a1420527d9d5a1d5ff61b176c28c09c08251f9308a9afa49c2c2bac84349354c8560f50a1a7b30d1e0aaf45a290e8da35372ec44834732fe78300a8400787049b41fc70ea305f3e088855101efd7d4677247b03b1f6cbd55d47e1bae0f499b01c86cde92ff93060bcc680e84f0e2a42b861ca08f82cae90664fda133e2f9b2cac83aa1f8f4db6ab857592b570f5352ba6465ea00fe7669c57efd1163420a5bf291fcb487a76920761e2914da543f80b3f92e591df5dc285521c646d63a9d3d0d8fa47ae27413de939f2e3edf30477de3b2070b9a1e2f049f76f0344411f2bac1953c866bcca29f180e865c8ba0534f73c91f538dcf4f24422169701254f99a3d42333ade06a893c90c20857a9f52bd3af46573f871fa935cc8fd940433493f924282934ecbf835c3948e2b87f1328c71b854 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000f1d27fc70e78b4ced8846e800b435aa3a951ba71e64a4eaaf302d34bb485a51101e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e651d795aaa78b52ab5d1b6a55e62cf35d297e6a7b3cde1b3a989cc03ff92e626dfffffffffffffffffc9fe544d78de9957b0a915ded6f8223039e6ea2c7b809f45fddd8171daa370cf9d9e4b3a2ffaa108134962061d18e85b0dca5449c21931e15653a335a70f71c30018e99d009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a2a685f1445aa66e0cf4c139f8e08e8941d7311c5533dadd1dfb9fec3cdeb2c0bd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1709b83466026e7ddce8a79ab06bd709345a353c4cf92a821634fa0087445eda84019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1c3fedbba30d9786e94dae52f057ce5c03e5416c96e2d5c625b4e440dbeba018ffffffffffffffff52882685dd4c1de20eb96ae2e02cde59cea45755f70cb51154cea3a85ba4528ddd9e8bca70d1d539f88dc59ec887a90684efd07ffd079b3b7585eb59b3b431eb7fcd129200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2506d9ca8115a5f136ea95bcb276766966625eefa2cbfc01b07e2b79779145fe50b6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4bec4f578a8d3c7cb59e1835b664498af775c4cfe323c30d6423e41b7f497a7dd00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58c4dfceecf54afe7193e36cf36e4cc2f6fd5068de26be5edb9a7e8ff13ecaf43600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c2ed48c631f3292cc39f3c080d0ab96c4961f2f72b8df212314493bdf3c62ecb04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611951bdb3f4067d7437eb5603f172f8cc614fd3bafa84f14c0d267c78474589f5400f0030000000000008b319a98f9a5d385ace5fda0d2dfe9c0d6dc53252124b051f7e60c72157484fed09f786bf9eb84387133d44fe3acbc9d8b75bc7fb78d8e0bedaf0a4b13e9a797ea08bf49e01d6891a09ef991887923dd08937456f84b3cb91d6ab40966b288fcb9c2847b8eec404910e633b730060bfd335fd702aa5905ed3312bae1ad5d4f594451d221c8b86668f3afbe6f28ef80a794ea62fb13f0a1a5730e8723afb50ca474435f3000f8be3e9dead96d3c20c69ee16565804142ab4b03f715edd6dc1f39a358f71a3840b0cb059138f8fe485ee01eb8c97bf22182e3b920a8547280354268ee1d6799ee873b28ab523753c57d0fad3fc084bc05f5d1e71b02ad5adb8bdcc4251640b49f38e1df35539393a981f6e3fcb979a2d7074d61840c8af8559ea2ab07a556cdd7b5c759612437052a65d062d6e907d4d1c096311a1ce93b851245097ae288c558d6ad073572dd7c85ab9baae252ad36b60d8187404bff15149de057472ff41ee81dfb94f9c811d4f98884b12a39c55d02a22f54857971857b8e6ca69e151aa8bce78099f8f276999ae8eb6d266792b9417fcbcb4ef32a001783e0f3bb95932e10b07975906491f6b05e6da5553cf149bdfd6fb7bc9bafb6c7ad74f227e5ae9c0bf53b0feb09f5855e0612bce639ce5f96a01e0cd7a1d0e2ead4e98ccd7d6e9656750a4545fe37eeaa853183178708d7d67cee4f2ba944ccac005215983f76af1dd7583b35d371b2fda77797749771033e7de0b3018a346fba030096d9b277071ae7cdb26ba39997544d01adabf8f9255f8a8a3e3a5098f91f2c5ec45fe246c5a12f9799164a831e016c52775c15c6b1c52affeed8a7d61577e965384d2d10291fba0b3169f985a28d1e7222b87f0c8f048cb2f9117ef6f84404f84cfde1e2dd55a4f07c60ddd7eed62c32714215f6b2e29ae187c0af9e7e3ce3021ca8d6025e7905e2ff050efb397eb35234a9aab01c969878d387c6a099cddcefad60bec8490b842550edc744e5b3e26a3231e449c4b327debed556c085501ae5ad096607120066278976eb464a99ae0f7e1cab4824179770538ff94bd89a14373549639c7a146abbe263b6056a96ca388ebef750c8ad6bf6e99eee21573160679d61b37a4531bf8242b255f37efe4d1ddb75d8055a19ebaaebafa4d3bbb0c357d16772fb1f95c6498bad914032e817383af344d75ac49eab863fdbe50787d4be1a181ccdfc6b062c7f389e8b37c255383e67dee371e861a3c798ced0f820ef8ea2e794120b00ac8d574fb30fdf6a2a4060b49be46cb282f79b02b119790bb6ab799853668831b2afe288c47fa6bb1a65daf912adeaac5a13aada9d338e8203eaf0f09c2b4ca716194f7042b67e9b0c18a43d1caac926eb20723213cb8ba39fbd00b8981c7c0b8b8e9535c60bd6e5f130 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000003f25f5004ff1f5c3edbdcbc55f305034d31ca2c2a5c162f1d2cdc51dc6d0510f01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657f90609c1d8a833e327f67ad9d89cc52e956df5272f902830ffa0bc5dcaea36effffffffffffffffc9fe544d78de9957b0a915de71fab3225fd0825ad55707dd4e71442417d39600a4dc6f1de985cfa50aeda64f78097aa39cb22b64db6a6bcdc5d6efa961b918e329b5d0ab009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aeedf39746306495cba2408b3ba7fcdf210986c00e591490cde6f6305d54acc3bd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1719dc406d47426e86c34aeb540d809f04ce660c7d5c67a3fb0da9e05896c08f95019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa05eb37d592b5b8c9ff4d6f66f07155f1bfd7556a232a74d341fd69455a506c9ffffffffffffffff52882685dd4c1de20eb96ae2d88df14783fc9cbc8ba7a743aa126f0a5bdb0b7b96c844c5c8ffcc23724ae0754a4505fe015981b18b8a7552ac90e329d0b38aad7ba6c7bf00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2500a8edfdd6ea995f2b146cf8720a80b29923fe170849c4228bddb037bfcef662a6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b441fbe493ce0d5218caa190cee216424f0fcee2e7b877d21ebc13c25963788c3000e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5850f223162ea6d75ac21b9361d10e19b0c7dfbc32d313cd68d3ec434a0562844400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0c6ac7c817aa0f82790faa1a78247839b25ba9bb5fc2ed7b43d186a24ee62dbb4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086111dcfb19da8a3be2ede26e0679748adaa0eb9d77acb864c0ca7c6db0a1dd295ea00f00300000000000087cd89ed3794a2846f6a5f291273731c02576945fd9c439733606b83a25b4a2f433918c57a0c5d3a4c2923a30211b4c1b3a97d30b42cf8c38f653543f9905a4eb4146c8fce28257caf6cb3236b0f14ad26b9503b2c863d64d479f417cce496f9a4d40a9d2dd75ecd45b4e372e5b5642f850b6297b81f373bd2b6b444252dc2a93cae811f1547178ca0028f47311129adaec2754efb40a7e4ba4b4512c95e5716f85140fa487cb623393d588e353a414e066bc16e8e8ac7bd445817a004a9de73b30ec16fac58033dac86ce180b3bf94b9898b24c79c618c507d908f756cc6e46c453cdb4299dd5127a227a548be131068791d722b2d0fdf8918eee40807c708cefd151f7f0530491ab5204a79d983db7853f23e31d8a89fe6e428a535d274a289160907b5d876cea06c8f0fe787677850c212c25cffc4bc8dfb06c684fe6487f97250226d4c4b15f3026f9645094ba71a2f09e8746db6ec3d7e889547a79f560611aad53cbecca29ae3691f1845d97733801239f7e81a5a52da4a8dfec02ed46ae857486650e91f241565097edc8c7f06767b6727fb1b4ccf22809e172e9490c9fc7ba9792be2a1af66b68e01156117fa0de8719d7c470520d32647e4dbae505b7d26a2c896225c6a1559fa811cb13c61353b24b441575f8e917e8fd37197983b7c866d703696ee6e840be37513ddea225f7c8401391e5951c6cad6b51b0f20023fc94fc9f6cebef02e1f974c2a4c429ae672a6c714b12bc46582cdd24b13ff0a367790349bb3db09848af0e1a1ee955032abe01edfd5ac5cc8767ce8a54dfa330ccdd341e67b870bfb9a25287e8d03b4feb06764dd8faa57a65ac7a1e10dbb807b45c5d8f41eb966635d28754bd9e112c0a463597e79b4244e051fd3bfb062dac419fe83e189c3998fe5740790fa46c08a0b06d41d16ebc4257e4b3dc0b1d04c634d1b6d4d23925be89ea1f45cc79026f2132723a17f5257cac3b04e11552acd8ed9a1a720d8aeab7e18c43368a565fb89574ed8a525b6171f5c60225defd37cdef8cbccd2dc6dc78b5d83daca3af53122ba23f32bfcd759b81495f531cd58268f2a5fa956295b5a3c1ae41113377303eafb210e7785991b30ad273b94d1a83a92ef67b828e79acee5740838529a071fff7b4a5c5f33b7751c35fab8b43860f0f31f541b54f9862997f4aeb653c0b6d7dccd595bd83d3dd3ea42fad58a96f2b7ab3d05c1b6564d732a237a6977bfc287c02feb8367cf57eda8d2df9846b52f638e0e6bcb7f957ac921628e97bea0c5e668d1aaa6d633d29302ecfe05c3472fd4214cd7a7edbdf3f06d616a107e15e6efbc9c79e6423b4d5a4207c4da9c90b7ee1cb5847af7a7a322b410844ff9a450342cb01d6d915de6c69c4974fd9f541a1017de74701bcf000818285422bbbff1c +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005996a31a65d5eb654880695182f42a02741c04ce7516ccd5eb42b83affccb26c01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65c3add1499def2c53a680a3d79e1c5cb5f893cf4334fd760117db32366895a96affffffffffffffffc9fe544d78de9957b0a915de3090a666b8c3e90e6fb80278c2243c6dbdf31d55f738ffa9226af6e52fc876002434b4934885b2109f4df1baad01f1437c8f844e552197d1009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a396c68a78c10bad5439778ce155ea65d75d2265f9165ffd64414e7eda82b74f1d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17624168bad0bb900b63d7d6b25b8e00514ed1a098acf7ddda9b4c293578debbdf019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a17774be1ea79b72b67c86b967e80ef976a7a7c094a2fee05326352ab75894bb9ffffffffffffffff52882685dd4c1de20eb96ae222d9a65a53b9088da605f350a412d5de964374cb616cf29e875ff432e7fb95433658bafbec775eac823d918c0492a932de3709a0865d83e100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25083f69e3295b94589135cadabe313d8343aefbc018139994f5109f0fce87a96256185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49cb3843d11e59398a6d88f500370fa9175f5085ea6857cfca6063beccb0ca1a700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58238a1877b2427a49ae3bb711ed5c7cf89f1d345e1b6e17eb8058f167a08940b600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4b23fcd83a982fd177615256ea7aefdfeaa55ecb04041d1cd997241cb3de02e34bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861191a99c97045868928512126092ec9306955315ddda9936db0459ab11b47adddb00f003000000000000b871fc4f1f646782b80e49312cbb5d889fcff168d01a0a1c06567c8f436f63f1fbf3babb3200003c73151e12ba2f82f88f2aa6c778eefcb463b842a1a7dec373ef212cacaab2db18994920a9899a14b89eb00cfc40fa9d56388c97d9e003505eb206cd8729bb3ad71dd33cf40c4656c4c1d88f4ea72d6c285fc69846e3c9335f0bb6aefa46dfdc5c4a3f1c993216d366a4517e3a55eec4a2cbae9b74587a5fc5fb1c2aa265cfea314385ace28978599884e38e8b5436f2956cdb82524701363585acb6fbf544c3c8f23980d07a45906a30bf7a0cfb92155fd45b3c86d372e2b558478b52312a0435ad1804c27cc62431b1d094e3388e66f88b2b14f8fb701bcff4a3ce56ffd8abd1c3c14e312694ff32302411d2cb056fffe3644540e5fb1d839468899900cc8c0d91acdff6a1e989ce4d8af90990c369cbaeb5188ae210563254bc4504accbb92b9473102cccc9144bab30c80a2b2199cd2dd63850385b90f1d02f518bc732c869ddfcf33a0e9682cd1f20c0d2ae4564d4c9f7d8bdf72b3c7f842e9c9a1a78b24d5263175db20c1d17e3126476aa9843e3dff134ced1e55c0433eb20ded1e62181d4bd2f474dc8c746adbce7a4ef8800269a764ed397153d3ebc2289ef7842411753a09f7244ece7796b26daf6788612d34f6d43a09db7a259afb4091a33459da92c58f1e04df5ac93120f365110fc2e502c9e486d94e082ddb0df013ddcdc716cb00978ec60b65df755b60ffae5d1012b9e6d705ce82e0e18684a8b201baa2ba7b6d06511812d3f21cec56e7bda63d838c318b58278cde68d1215c478736658a5d7e3ab48955ce2033955b0d034f20c2b60f9af6f5039eb15434d67eaac4c40d427fd234137d993032b69deee6e8edfbf9d87fd3e0b2d6b18cdfe274fbedb29e69bd59e9e46bddc6c94de1f28843707e8d8b481f49e3c471cadf732c3f0fa22666cc3d2925a4e2a6b4c57c87e23518c7c5628bca34fbbd2dc095cdd0a5fe759cbe7160ef251c7bf58abad4bcf7883d1ceecd369b1585ea9236d5525f350ed0c54caf2770b3f21ff57ceebb6773217b1d5d1bf9e94a18a831878a63f51ff6b042c6f3efedd1a108f3b8ab70ecfdb3d1b3136c822e5837a4c4f83043c8ee7071a0a41da0001e56f713be5419db2c9e903c4fbca67af5e777f706dd825b26c346945a65ce26b59a2cb37e5af3ebf164c3f022fe42d56a106f77503b232636821837c1d2c14503cbbc62189595b011d2b035d680b442ad9b0c16b7d9b47e0f390ffbcb42d1dfaaaee8f5eced787d17a78269bcd885a1edba2195112fc74740df3322630e773cb35b8e36e6f33ba9c6f862d7bb1456a6ec2905c43d050f00640e8aed545af26c3477a3506bffde304d5dd79225d5d9f5f8ef3947e4947d4e0269912ccbcf7d00b16ca181f +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000004b321d69403d6e871039261e1803eeaf4b23d7821164c6f5726f26e0c8e546e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65a586f2fb32013ece10ee55adedb75d06e1ed5327021195b406abac328ac12900ffffffffffffffffc9fe544d78de9957b0a915de098f41cc1801e4f56adecfe7897e09f1a0a65ac35262060f0ba063806639c744aa179b147c5e66fe2f0bbc72ba012cc18bcba238da059a67009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714af93da9658142e4c83d7b89a0eb71c86df8ec443c1457ab425aaa2175bccb760dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f176afbbb10c3dedc2af016d759fb6e5ffbd085c69ce2fb68a5ab2253c5dd243e02019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75afd847633880a08bc8b975d3a3e0a64de1fe1ae2a810905e89bbba14790fe6eacffffffffffffffff52882685dd4c1de20eb96ae2ebebdbcac54d4994c101f565e95fe206fc4fe3600a53c985a37ed23fc10b1a4fd3560d22166a686f78992e162d961fb993ac0929693a927a00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507f9e634c43a36afac4bf3f5911e9dc484fa793c60b83979285287f49b07041116185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4809c9b73c9aedf1ce400f0887dab45296a1fd0d7e6b1d9f32e89737ceaea71b900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b586468cdfd4d41ec1e1db3152b013709058e9ea3fe62017ee2b6f27b737593be2c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca177456ddf8344e45e34c55b9254161a199c8c5568b04c9ec4c6c442c821d0424bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861173833b6349337649f55a6081e285106b6dd3edbb6f75c0bc573fcc7a5acf77f200f0030000000000008b10354e5af85be0c1d10ad8738b8373449894afcf2d139194f372fa6752ad18702a8521d1ba6c2d86e7ebac5a29b4a5a02c2e45319701e744ad9da58cf9904a423795f05dbdb1a051e23e66d219ea34d78754b2c57a224040d7a4f910e9ec52b4a0d1ef753d1f003d67a3019197cdb7d70067479403565f2c08d0d7c8c632eb2d6b7af8f88982c05536367710b55592b5ec52233f2da3a5eaddab1990f7daaa3927b7b955c9f6ef8660780a3c88f8fd701fe4a9cca346da7c7f747d6bfae43a8cf78867187fff137139f7d07feed06ab24607b55ac73da3104af523915a45e7bb8a32a8591110193d94a332fe0d43a7b28abfe906302d4436c3ea80162f569775b8efb6b8f80cf066897eddac2103a903987f0aaf665bcdbb90d6087b7201e8b3dfa5ce2311a6388d87fac230a73855847973a73aa800e58f8700b61d5236fd7406c552be267187197da18f83220cec949ee133a1376ef55b6dbc49c682994dea1e0cfdfe02693ec764196517210aced6500f091aa5d530a5b8d7304790d31ba39c21e3fe80785e631c8c9630e379b9485ee256b5539145342ae5a17db28e2daa2c6081f375fa3e12576fad8b5ce2998f61f1154acc10d7315cc2cdecb4ce99ae99365ee6d630d7cb5051831fb06cb9f339c7b89e59e559f60c294cdd46d5f6b1f13d2af7eb2c34e0321ba827fde6d12e8ac75c2ef1857e62c4beff5bad72e09afa29b5662b5f1ea67877cd98c370f6bddb19a0fc79ff055d262db8fc7d85e02483210a4315f9426b4fee818b3ad8201baa643e2dccd48d0768a4c3c03152c0260f3970e02b632d3a4464498cddbc502c53ba95d29fbc0414d64fe7d8c593597616a8cd22c7d6927a4b20474851e9232dc911c3de03a72ad36eade797d7d7138ae9ddfd171b0b3824ad36040bdfeb2a10c37b5e4ea431d11afc4c7fc2fa8d891e240cf3bf09c2b3ccef2ae0c351d54bd5df09274caf9cdd3ae8c8b935ef2fc7037f1a7036d809dabf7cd43c3b1790100eed1997e8c9e6c05c64db04d0a3564fddf77b2398cef796533427ec11f5103828bd4137534ff070611f187e78f69517d2e9ede164617de0f3ed0bdd016c322fdfd0130da01666da8ae5ed5d333a4a7d3c6b85d115af327d380990f143101c1eebf67d049ae2e7b5d9ad3360496fbaf5b6d4367345d7b3688b6a1bce3faf7359b83d1877b0237499eedb20dc6a75553dbda4e5bf441dd5f720a9e607a96d3063c6e8427717dac1bf7f62c0a825f8a8d268447bab824c6b5f42cb1c45294d5d33172ce8c982d03c5cccb75ebc0bd1fb608730b2fc409e9d1e104ef61084fa54185b5df234d5ca6bea9a302401e23e323c73e9d1159533581fc6c28966b6636d314eb3578a7d91ffc178316024d5c6066f681211745db20f3653ad49758946dc35 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000032be62a4d2d0d71454d0cd0a9f85e5d62c7d8b8f5b8b5c6b84519c17f3f58c4501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657d3b74f673aa8cd457658356bba3361b95fe447b7dd159c83bb08ba2066a73dfffffffffffffffffc9fe544d78de9957b0a915de1e3233f59cdb2491886ee974f00e5e7636195c8d81eb09b41368b0f1e8944c2777391cfc006534f59d3269b6f5becf276407e4ae162c5684009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714afbcbbc31797bc6aa4677aa28c96a1b6c0bcd5be2f01e5eaf314983f5fe34928bd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17824e5bfe8ca5bd0e052241a1ccb7586d8b2504059ecbbc56ba7bd6d1973efe3d019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a7a2265d720fe516b94aabfd7d278c7f35c826c83a5fcc2dee19f526715451bdbffffffffffffffff52882685dd4c1de20eb96ae21f30ac40a21d32c862d7db0356c388feb2ec2443a222ff0608414428f0e66494b3c7ddf29c779bffc259881602d16c991108aeb842c58e2d00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2505aa51433d610c620db1af19fc4256cc13dd53a3e08ec5d557687debff523d7666185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4bd6dc92e9b63b9b293d4de99c08a5bb18c736d7951803db746d0ce24296db65900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b41600860b1b921584e55112434bc9a5f09d905b4677b72a6c05b4bc49471e0e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf90244785c1f1c41a3b1742ef55659e531d969569b845e8d3bb9b020b41a9c064bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611bef3b52aab67963a83557e442b64dac3d513361a55a61cb8e38579de716da5d000f003000000000000928a99f1f5485f63f8e88bcb61fceba28209e6acdbaf95a989171e827fcebe81263c7513d1a67c0321e41c96738f6f49b18fbfe09b8f3843c913e1fcce2d14703c492691bd97f9bd3432209a10f03539e5d4a552f9412e1596203b3f4a23092582ae9682f148bbe7dd2687e45be2279312738a04460a9a76087c73370be7b4998c2bc82e74274cdf15e4794a16b92e1db40f96e567eab08506ec5b3ab3dd721bccacbc2788405e151a62bec21fb4a9e06761621df65b5512b4fa5d96d87f10df8387fbaf2b77b187253ca454b0307a24e75b14c8461068844ca625e1c5f55963ac3f4ac4bb90b7510d721d7dd72518b19441a6dc1ada92b7b38aeb33d1adaf9bb6b1627621caa5a94dbd5b19dca07487df765fe9b33e3065c0110835b7c73b47920675d7c148c1d8941c51b4f8c85e2a177ca5c5f01cf05077cfe78f1d3843d30638d8acfbd6e00a5bd3e5cbb74dfecaaa5e18f38dfbcbfafa94661c332f67936e55420ab736b98b6ed62d92285f34ca8975f99b88d942dd7e45afb41dbfb3318d46c8cfd810966f6c9656ff10d13c134a7f9011318ba0fd578d24e2d5384a8273151d906d34275ec72ad7cc88e29dc5b1e8a1d433622919458dcd287d5d82ea622c9bac269d7a6b59cb279de5f69e2e08f6bc701b890034acef84d10c18db6caf4c2ff823d9ea7bfe59433b47f55b60a074f7eb4e5c260f17c9ce781216ff96bacda56082df784469ce23faff7835bea14b66e03acf59798d03e4187901549619776a6dd7002897272074654eedcc311db3072b688e987d7670d23fab346ec0e9e42b4c2b9967a683bf7579e30e2d6d88aece7d6ec4b2a6808e31f6027c673ac5e6724316f867f941812bd728de9b2bb08e5b53cc35d56eddc7c82371949c0074562cbd77601499231b77cae9bfca408136afe364e59bc74563431e54490efe9d2f4d1ec10576ba4ecfb20090a0301cca6126fc6c592d60d4b3797152d127301ff16da4d18a878b8fa16ab66730af277d55938e1b8c2b853fc9fc60622d4147c4c939de3f36c19992de2f88634ca41143b05d37129a55aa6ff476bace6ab2999ac83766e983f794882fe533f39077113e6ca2ca798270b054b4cdf7462bc97b328e1d9242962efb5068a046c514331a8b0c38d03147290031cbfa0d8df9490e1bb1202e4d8a30b5314fa958ba6721358ad0403d6e7216435f84f0c1b249dff534960bf0b4095f4bccd987c91f95103a47a24b7452e96b27573bb8a4fbaf815950fa385c8fba6f929cdd69ac149f5d3f7c8588ed8db52a70b814d680cb232d37844967db26259ef446e8dca185685057cb0964389e604e6bcbcd9342a85a39074ca37a0575aae9a9ca52e1f94853d909c262f9418ac7429d36c858e81d5f6fedf6e23dc47a971681b42997ab7481ee4a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004ed7ccf121d74b1cc551dd802ca1aa225bf364b9002f80f141bfae67516fff1b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658d73f38a98c387353ff5c719237b35d97258cca22c1702ac76478115db3bafdaffffffffffffffffc9fe544d78de9957b0a915deb10d7a40e3b967cfdcc738a313c024f11536996320cbdb70ce36ec6de20ef52971395b3e569240af543b2fb51b1034ad6e21805277af9f12009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aacd633ca27c711221fc3de2d4070e6d2c4663884aa5db76f08c6c7ef3a48a5e0d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f177788809649849a8945e9c1ffd5647a3cf0a4ebbd64684f5118b01f9972b7fe1a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a6262f20f75f8b6da6801390f90ce2b1ec8a1be669b25ed929f15eb0032e1d357ffffffffffffffff52882685dd4c1de20eb96ae271357e93709486d4a69da81953fb6fe7887954df2239e0d328a9accca612368382953689b479a447c7ee4c6a8b69e57415269034c7b2e27d00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250ac1cc936a1eaa3f260f1da7efcc4766088d25220594b0d73dd341673f1e9ed626185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4d495801e48ecb59ed85e44451d04aae69c25a14947cfb77d85815f902ba37c3900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58d1420878974aa61b3debf4d551b1b846d518053a5b0a57a979c5dc7e7fcfba4a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c373df999010c123269cbfa914c9b28a0aa2c640098712fd58f84cd93dd99e7cf4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d3b26ee90a7a2ab97e689e59969392964af7e892707f10fd5989cf872572a66900f003000000000000a810d6b1cc7e159c6e5524460ba57a6fcf1a5dea3e0e9fc1d49abaa705a43de3d72fd87b914e7156c4505be41184f82f98a08c43325262401516119f400220bb92441e433f1bd72c3d3a98cb2feb5afe9200cae2961af1e1f61c60706c4aadb490817f69d2565d69809be1fa47fceef180cb854d350a43c98a386bb18dbb6a24108318a223f074daa526a583e33e271192bd3afb446dc4190ea6e99b061c90bbc8dff3ca075ed40319750cc099b34f11aec70b17de83d8e9eaa25b8d15e4957f92f9b451c984fcc35332a8a9a73cd7c737d8444c3ff52078f824d60a4d44d7e81d8185f03251419309a3e405eab0445d82400601b1d203233e800f3060eebd2b6a1602bfe1faa2b84e23e7316bcd40fa002e1bdf8d230232f3f18ef5f3e90567a445bd87841b82e62f9a09cf245881eae40a5aceb5d0ecd2cb2629d42fea503227fa3bc678b9d3158d953b98d0a7c27bab2c8c5195b9d3bff5f51378970a04a3916cbf0208e0a5edc807b619951b4f0c6f14feb30fa6b1c7d4bf15b990eaa64f954060edfd11ae7625749b4a2a65ee921576b447414e6d837b42c7909c3248b31c3eab3bcdad02284e7aff6a115f0780b2ca7bc019cfe1b62e18e11150791d2fc2517ee83d8deb5ae53dfc3a96136304b1588bc3b7ae83b4b8923cfded6a477a940c2f9492d78c2d3b96db8ae188fea033b8068ee78210b69f317c1788a192514af39f8b1ca64779c32a7697498a8f3498b79197535e36f054bd880a8a5987dad25c7cc33970eb56269d35cff13b0b6e607cc8e265b1fedf6932e168954afe2ec179056341fc5fd4f8ee4def3c7dd81de8a5e2ee42489e7bbeae9361872f2a3419cc5f3fad6af334f0f11ae43f6251056f24e39238c109cf30aa0ee88f424c5ffb530a812f2f00df0778135e2628a942dcc9453c9ca48d666ff331d432744ac2e0e4c9aa7c27c986790bb59b2d1fbd09eb69e09c65e677235251e17ea3b843b0a80c5a87583338c6cc0f6bd53098e55126d8ea08934b200948a92accfb932b2c2f390d89bc119a915ee29657fa37db4ed98f5ebd085c7787518776d0d525d51f77715f8a66e6f830d69feebd0a4ce312932751e240b737a8c071e335a15b82a78bbcfaf5ab6ba6b4b8032f412eaa3d082ec278b155609fcf2f465da7db71734320d7959816080f4414967507d60eb34ccf452588ee4723b4d631f5f294118c9f5b607598ee9eae55581cd0547a69873d3be50ec64067e522de85616cb3a443580c37a070a5aabb64bef9b2583e180d51f480bec4970db3922f294490d224735809701bb28ad0391fc65bb285304e8547cdaa7f3cb854055247eed64c2468a51a738f32961abaeffddfb2b9542ec7f82f61af28b718af77595ae92694848d51fdbb085ba2b23777dcc2cb09998935c136 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000915373d173f7ad2e8796dbb6532b7316cd073737f85c57f818d89bb19ae26c2b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65df8b21575a7d850b7803d277440648400261ce2c08207f56b5e3d08590926f28ffffffffffffffffc9fe544d78de9957b0a915de3d76261c31223b510140d987d7ba1a2d6730b9fa9f817d0abb47b0f52c9fcf64ccec196e5a5932919c92aa4e6905575b4214ec854d5e8000009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a068826a607afab9cba24a48275c139f7ea869476e3d3e35a1b1a03895d05da71d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17f00b447b58acac0b29c350427a05fab41c6979fe13fba1ddd26a22c1920ff0e8019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a188ebca2f22f4057e7b5c8b98be86289d52dbc4968be6b6ee31a46bce5e80e63ffffffffffffffff52882685dd4c1de20eb96ae292f8e46696413d8d90ad18b2e53375d880888b406b6a1c5c3e180d20064e2019afc3c7bdfdebe5c412139e71bd12532b522195d393a7427600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250e91883a6bf5df191be0195d62c7157293f47e42b416074c0ac9feb77e00b85d26185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4b44498aabbbbda079e0325c7f0886b7df24c8b6896a12a68c2467a1f08e6bd6400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f68fd0da1655fcf3cbf20b8fe695409fb0fe9252e4e514d155ea3083e28ede2b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf97ecd6ae0fb372eda9f51bf1d9db396f2f8a8bd625f30ea5357136ba24abe944bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861171b669decbf1fb3984b870d0af3c211b616e0594a12cbfbd795e3449b3e5153b00f0030000000000008bad3ad46ceb67ae91770ccecdf8358fd9f81c1878100bd31a49cb75c02a1ff6cdd6b69dd02701258e0fb134bab92639b123dd53e7ab51bd9d1cd3d7357b7c3e721d48d56aa8532430aefc9ec6aaf8034ceb50b3551a4defa58a16bfa32870ed8b09e3150996cfce02e2bf7c6810c719f321b3b1bf1b40c08e0bf207578066f8ebe575eeb374149ddaa21bb1bd5705a1b48784421826dd138646de567e0bcc74b7d5f96dd395d36e68470d0a12d22bf7b53717068b37ee54b01e694d9f467187b89f2dd2c31e76e81f16b465d1f172df6bf318da7f51784aa1df8368ecc1957144c7ecb42a55abce229a3cd4f51132f6a649f3e623b634c67e62925c3e29ed116605e33a280ba2af6271ea5e668d8a35db347fc5983876e7560a66cc33dffec4804574055bace3aab35427e8e0cf9cd589c0886c60ff434038559dced42cc0b39459d2c4810714a4167dca601c41b9d4901da8eedf77d4183c1cf84ad4aaf3aa38622d2eb92b365f6302302ee230e884e95cfa6ffd4e678889b9ce44bbf57b66922e15b2db774d42146dc8f1814bf9902b2aa2f92b66513464c96ab1e97233b99bd0c32083c8b00a424440f86b69e3f5b5336650d4a9b8de5c1a2ced3a7d9242dc9003f9207ea2578137fa1d8a3eb23200f029889c2ff501f5d4c44400ed462d8af22005d8b885cb8f97e668d812a8966f3bca15d5142365a9925a32d10440b538a674a358cfce1f4c45396d13906844e5de3e6dcb84671e4b25e57c4c979ce4fe6acdafe36fbe8c53716fc04ac7d066340f3e17d5c750e59cf8596ca8b2a46d3306718192cfc963533ffdb95bcb3a661d55b6e4aa54a0c4f2f44bda5eb0d34e40a4b8f3fd9ea8e931d4c3f9d262a43fdb5a6b6160f57b90f54b92568f04a4e5ba3b8bb6b127b2627ef1c7de18ae9630a0d6effa67cc03ee49fc177f083f961486f057ac2ad00fe879dcd118d5e6a21b3ab04152053b470836abab9721249df4b5dc06ba77632a49b2dad853571363599311513f6cabe8fb172bc12b33226b600a4fc9053bc1e0adea1fa9aaff71a25f8ef703f160ac0a288074c4dfe3133cef0a62b223579dc6a3428c0966775eeb60be1bbfc7e158ced0db4eb7d6c96cc510f0ed11f57c5512206475de748aad8b466b12fc475b10e1bd7588461facce0aa5b5d2fde38d8a06990918d4e9ed9bd402bb1b8d432b3626fedfa64d6ac47ef3f0f241583ec3ac7c69d6e984468237df57650b7a22ac9c98fd59f954f3a89f9d5ce2878e7f2f03da83f15d9161bc13411d07c2eb80135683538d96384abda2686c18ae3af58a7b1a9cd14430e0e011ae4ba47a4bfd9ce746f8b51cbd377efd8ba691d479226921c7832ac863db040d935e66b604680d09c1c5073104278bdd2b40008be9761e6e9de7d57dd5b721dafd16 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e151a7c204314d5546e5390963a8d923dc8c524380f5ee58f13f93df9e24de3b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6542134e2edbded6d2993354e1a3a3fac3cba2db5471fcb23d87bd3e6309253270ffffffffffffffffc9fe544d78de9957b0a915dee3e9186bdd9c6ef4c642033e5a0945fa19a9d3802852784160eb7d7a58c3f638cdc9813081a262d86e86ab419d27f6d90898faea31c407d0009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ab03b3a4f13d6e733c97da6133b3b5d0b09f3252b5a3fbd9e6f787c72c589c49dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f174ec63c0d35d49baf0556d4fbd43a26812802db6827f2b6cb112138f322678ca5019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a5eafcf8854164d2e36e4d7ec6acc401fdb82a2ea3bc514911d542ec621e8e60fffffffffffffffff52882685dd4c1de20eb96ae26d1a8fd0b3cbd45cc7efb73ae787f00fa6dbede3c32c68b7f51dc24005d30ce6fcbfd7c4a6402d053cf5773772ebcc984a1f8b9e8f4dfa9400593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250b66765bb47f23011af1ba2896c2d0a7107bf927bed9bd257e211875a2eba9c416185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40187b51f9990664339c328a0c32d431c6209d978ceef83eb9d173d8a673e659700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b583ea181059f42968aba2dbf0b92fb751110ed275a6b12ecb0bed7e5dee2aed53a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c25bd0f5bba7d98f028957f6ad3871b3b3d146ca30d5f429d16c32d4d4af6e5b44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861190ba09778446f38fc52591709c7172f60b1a921d45338142acc23c441ed54cb700f003000000000000b9fd4a47c4a6455fb40c361e4eb0edd98f2ba9dfb13dffa79bb7fed501b382c9786f6b8114c2dca84196ba0e9c8bb6e88feeeabb44bb9327de3372fd25f2e339b2b9af5f6c3e81601f5fb4954d343d525bdb1b9d93ecf1a497fea95acdf3be42a5de108fa9c340919f76a661f0d78e0925437920a478d83c34729b975673d5e75f4e9cddade014590ebfe79a42b08b19a8cc905139d709e67c294347963a647b38d216776a7e3e8b9a022060da2af4ea67c17a14956c72b16341717836224e329374d098c806c4e5a36254a2b8c77ca8f0dcf6ad88eaf5e433001de02027456c8571cd5764c044d70f9e405309cbf454b24ad02b14a4d1ddceed02c9b84980c404bf845d46b55190c77482f8bea9e4d649e0da26aaada59ab84877616e33fb66836e27f3295651cdabc4738418d030471e2bd38994bf632a10dbb9f17f023c4842a690917fbf028ea36cfacf13edf888ae47166c02f19e9c455e031269239fcfe0c115a6af5eebf87c72a363611a8bc4dc082bf689a5d4863945a619e8c4d9849361ae9656fe1b5d3c73fbf60cfb88d40d78befb30d9be527f088ea9319b4d897e3825f0e16b7d0d6e219baa75e0cfb9ac2f67a8224de40870827b908579aaf6587165423c3ab7c34a5696b6d85b4efe93239e84da388466aec33474223656a4a1a8f8dfbaf061955f6f6f23d486396a93237faa2a454225916ecf849a9f5bcd4cdb59ba6fcaaffce50c4bf70032d90b15d4581c385e569baff0f2e4c4e1ea5f1760263127d2b5dbca7b602f2e36c062e32cbc8d5309a264da8233f1542b6b3428904e00aa175d46cd4044af2087335df1d1063ddf290a57a3c01f8a5f6e15a5069de16e086179f4b5618dfafbf3f4283699d4b3f1cc6f6b7523a26720b4d687e620ca912217543ae9a60e4c6522da2ce300b8b5dbd0c866cf04234178cedfbd63b0e8a0b25e1fcade1cc7d1990e492d7d3519a338b5e114503f757b396eea1668d8761c8b82d03ff91324db42e97b6011634c2f7f9894ffcdd69479958055a63642b67634da1e86558507eb8351b93eea196cd8db3b25ba514e16a024040f907fb38305a81271267fd961c7d34abd1e3d31662fd0270cb613e4b874530b28cd88c7ff439c90587f272fbd73e4d95d0e16c1b5924056533e3c99f4cb16a588bc8d34f586f3b4c9d65dfc94353a03fe6971bcef3782137c5f9e318e1a11820133f9397379fc0b4fbbd3d03ba790c19c106130c12b39f20b82d44662ba1c4fe9907e2755ade96c90509e711e29997ebc6aeff56e706a271f85fd41443adf2ffbe87c662a1ee5ced7f8060e0ba5b994a5348bb6c7f86c41d5885dc03d52d3ae18ddddd1cfa38925a1d1d3f71fe88baf234fc86b1672c6fe6d93d60f62e45a1846ac37dae7f9507d21f331718cbf7d97cc57 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007780dd3967ecfe9838442f184df1e4b11b46d986363e8dc806075b8ccf2d9e4201e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e651e57ad83e922c1c535cf15981a30d1d5ec7490339c50215152eba206d10fd986ffffffffffffffffc9fe544d78de9957b0a915deb0829e55a77f91737e9ce49fbb95b9af5bfeb108f281b69d779fb17996e69b3f9444c27b8336e0d29b268c71316525d44477b4f91117b564009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a09e7a76fda7114f3e32addfea9a1347f42f2832548f90acb39604d6b68f92defd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17041a76351898c52d61f32b80c313924228ecfc6bf21dad5667028eec5beac185019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a68d988b3219921125f6a37d9bd6950f60a5fddbe2a90d82661a54574c3c59fd2ffffffffffffffff52882685dd4c1de20eb96ae204f3a4bab21e9fe3126de3768be3d037ebff422ca844b2417675f01c97d56157246ce06853cd9d7836529a687d3aebb69a37c796eb072ebd00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25034344aa0dd1d1ad4f70ad854f6a0fd8e54cca8cad572ff2daae5f0b6938658816185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b438419e79d5e8811125dbc0f937f81e77f7279d35596e3ee48a66634f721d78e000e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58ba1b3b86453add5989eed0ef8912010c570d971361f1b29fe566ac3573861f1900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfee19e82aa59402644aed914fdcc3b4e2b117f6ea0140a03103ece4d7fe20def4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113435cda318e45d99d395f2bbd19d676133899f1de4298bb52bc660306cec3e6300f0030000000000008d9abfa29007fa40d5ce0ce440d49589f160bce6e57a36b7753ec8d9583c5e83764da790b51eeaa1d38e120017941c1f861df217007dc64ae6ba263529b072d11ca08fa9be721a1b70b25bb638b35f90239e9a09f02834b1c9e469fb43d2cf3182f3895eb4eaa18d94d720b76584f3259a606e91c8ea5a67ad2bec4a5e55358b929f33de2f5c632e0620218b6222fc79b9ed28103019cafff806347d157049b0a6325b8061383827647fcba097e8db0633f071e05a5b98daa456947e76ed52ed913a0d6b461e73a64375dc2b7468bb563de66c6160ab971e8bcb7b7d6c7223e8d9ddca1cfe4dfbed0e8a17005fc0790e81a5a97b37f233c6a70e10293241e170b75805d7caddbbacaeee5d755abbb1722c75d3b8a94c143fef4029fbaeae67c1b7df15db2592a5c7096777f5070648160f051e3913822ff797e7ec274dd6d88a3c6f25165f446cbc46fcbdacce366f0082c06d5c5536e4900a8de3a380d6c3f6cfd729e84776a80597c3aa50b61541a33eb920e5c44035455b3cd0f0d5a4ecb9b91dad4825a895cc15821427eaa4f9a16aa5b00daefacb9d4af6a18d8038f10050658f66c7a360f59748fd4d0655a47db7e6593a2c622df5995ac372b3406be20a2da7c53e2cfebe61835980b3329f8e9ff12f0361382d13e1d6bf5dd58d2930a21187d761bf1c5f04edf0c97d7564d020d6bbe65058f58824e1eac24233707ea3f9a0a674e7008141479bf362cff568aa5d78386993953246fa3f2a5a3c5bc1f8f0dbfec227ae0221cd444e0de9d9202bfa9b24e414f8c11faa5d00c3b95caef5eda92f0615353ade0b1a0c82190b2a1e2b0d019dee8f40a48ebdbe75d3847b2237ce08dfb2df6c62cc8acc06765e5eeb235b8528fd4c6d949fbd04ad6dcc73e407f35992c7323d6920edb2b8ad2c3fd8c0d8a8ebab07c9c9224994b3ec76b227cc84f7e4cbde37077d4f8e994ac968231edb6aabea814937a343c8270d430e5184d8c93f291dc68c08b0a8303c284823f619f5b6ff59d4989ed242fe3698fb0c2a7d93314e3c69ae828587f7aa7a15aa9201b3b051bd633be3c7efe71967c4ced134420e6047731fed0aa39463b81faadc668863c643dc9278092c27e1bbfda9bdf9cae048a96af1437d3130d3f2692e668a54e4506bfeb2297e583ffbfae481bcff8d324ef665cc8fd1703206b166581b95c9fb1132fbac62987a46433dc61025944b2ae6787af2f4b9db13598534e48f35fc82236d7ba0d1bb0d9b9ccbf6546022599d3071c00adf4db79a9b9c26c0e34612b9bd8ef14dd9ac562508970deda9b70f1ff1a4919b741a617b587a209316867eca366bbeb49e8cc53bd448edc5d4db5a2cf50cc70787f69ce2a3ff6ddc5dae491eb57e416846dd242d5094bad1344e77bfb01ab8f9af4609b0c1f350 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c4f29da869702af66f80e158f86d7ca11085d2ba18683db576f985e96887290e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e653735d883858756dcc311a600a9893968c499bd4a6d23a4a17f4eb8416f25983effffffffffffffffc9fe544d78de9957b0a915de3a2b1321c82c3bae220666b86051be5760cb2473e5931beaa906dcf3dbae016a940dd19c610bc85fe6f51a110386ad03eebdb2feac6ae90c009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a651b45eaf1de8061ef909d95446c27ee323bf8832c34abf5096434e8d219f59ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17cfdbcc4278933a2bcdd4573e25ce5d770f29405ca9fa37aa3e84d604a3319269019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a652fca446d024461a0e13b1c5455f2726a0061151d1729451e8f9d205219f221ffffffffffffffff52882685dd4c1de20eb96ae219d5130952f8308f9dd5c6dcf4be8a4dbd7fc9cea47415017172b6306134a7539d6f03cf6610d179e7b6dc49624393e7008f8f34f039361c00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250c5bef2e3f1e1d02d5c62f2225ee0bfd9564fbd5caa4ccac7722df02d6ef89ab06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4531fc91e9273deaafe1ca370499b5ad569e954b95fdc8d2d3213a1a29181851a00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5828ff6f5ed2ecd9da551bded101114e8509630f1e031595446bbc4a5a69b9aa3200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c58fe37def52aeee9f093dce00cbe31e359d91c1de21e6c93acc2a5326d87775c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611eb7c0d5498ef5e7a2bfeae95f8d2b7cb9c1d355e2a1f47ac84c6344e9093950f00f003000000000000b1d5c75a502003baf91a745a88b0b7e22a61347c62bbe0ac9e4b7c8a7a6f971f4452668aaca6dd72a4e2f138ef8dfc4d84ca098a655a082943ddb7e6f665b0a8f567edc614a60371d1c51724cb31da52c2573ac0b43c27373c6fe1eed57779368e74cad1e975cf0ed1b5205366e4059cb194a2360e1acad9aac5aa04d301cabf222b87ad9d9fb3f13c28f9e917a6415bb60cdcefa37a3cb484cad0b9b9410fcbb80c1f689a714492b8e2095f3b608115202d821bd510124df548fe7d965f50d8996694b944da5bc761150de6bd40dc83c4a2fe052b466d40ff2fdbc2f6c3428754d172835e1abe628b3c05306d7e1e48a99e4823788892192671ca60dc4dfd8bdd6102e73a996bd20b062aba870fd9b3f6be980acbfff1181083121d188139998483de3cef63ec6324a18e01d224d0de6bfbaeb5685cf1c46ef4bde5d91efce78f2d957e02b81ded0019b726709744ee8c01cf0739f5420524cbb45ec2427b69160c239a304b17df4ad7ca73d979a6b0ba001825fd1f61a287dd5dc329f056b2b60655ce5cce2adf90158e1471b1d40ccb057742fa371874f50b6a743f140138bac79d932f47a7dea5b9bd681c52add3b6f3abc41d50ae6e04e7b71cec279a8948380022389b43d386f149981dca2636734042a2486ac55849d7acc8cf219f2291aa6306d718f70973231542216a8e4efb6ee4ae3545306418aa67eefac27a44515447490913413f7af344251f44040c64c51676e129477f640e6cc6b1fa2f36a353e981f53b32b893025d117b119d0fc5de9a07632724ed5e02b3ac09aff3f7f9201f1e400c7ed46aac82ae62eb7f5b060dab7e7f8d62e5565ec161e1900f3b4a5cce9826ef4a90806bea0fd06ca707256cb1c8f79dd3e23716d5cfdd69151c7e44f5c67d63d07ea63c21b2f1e3426e1ab90ea64960f644e19f4e66e38ebc1dc60e5e3f3082afbbf2ae69c2f6f82b0f163eeceac40da3862e5e2aaa55e6af56617fb8b0a77ccad563d791d7dff50d169c56233ab6315ca34dc5dde104b6558e5f47472798deab41a34ee479e87577148d3d2e83747c5c9b6912d4e0dd8c3112fa5f9204584ff451f0f1e2e6c51472200d84439265302cbb4c5f2a8aa01f000a6c2472c3a5efe6e1b947d85b6ed19f2a687c3614f148e5e761fb04dc078254edc9478cc0bb88db259efbb13b801f4f4a00cc1a5dbb78c6d3bd80f998e1e3932b43a2d4e790f90755cc67391aef13e04a461533e05a05d782c012fd6934d8ed131165e6ef6c186656707ed6ecfac7ac4facf527ced32f133c72a326630025499125a3899af6ebacc11f8b0a6992dc63154a8c89814bd6a4a129dd4608a8a595090beccff2f158a001582d70318f22120daf1c32d8e80eb69190e783e81d2f7ac7ea39d5cddda19bfac6b47618d924ef34 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008239244a8d61bf2f6a946cfe4e46ae816943c4840604e744b5c6a2f64aa3245501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e650ed5b2fc7754d9d79716373efb90c856d490bdae42b4fca842e0109da3bd95a2ffffffffffffffffc9fe544d78de9957b0a915dea8876b571ce32a14c46ff5ae99ec0c59996e3dc4283a6fe4ae7ae097e168379f19c119b65e318392bad0594eb01e661c2b58190a3cd7cd18009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a1b7412d63f3ec7d5542231ebbdce835eda0896d849b80ff4a324c9c741554595d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f177d77dcc786ab079798baabf9ac2a5c5c2ee3c250ff63622746e5a7afb136b645019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a4d6eb356a09e68234422f1fbdc2e9dce27e4b7fa65ab023507d0a684ee5ea1b6ffffffffffffffff52882685dd4c1de20eb96ae2f91ee077ea82ee4f039d634917d4ff7b4182de3d6bec1677f6ec60cf9b9374898d021f59515842f83332cfe68e43dbef82d68a767c4e497800593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25030088a8e72e0605e248ef59685f84d7263082eea1cd641370c8aac4c8c20cf636185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b429a9b6cae7094d68531d4773cee3a89b98d7f72abbe1f83f61238b0efa63012f00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5841c30b04f75b26be4fa8b9a3eec2a94c58dbd39292f04ff07e735a42b00cbde600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c852126a90e5e3dca9428749b00a31af88bd96e3d3cc2744af3b350cb093e0e534bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611186af4ccb17b6c7d6569aa2ff0bc15be119df56321f4b65b5351075fdfbbff2d00f00300000000000092d665d5e8fa0706b432eb600b438aaf76af4fe8cdfa6f14cb50e6a8df2c62bbf333eedf0230fad027fd3802cf89b98f824dc9458fdae32482a981c694ea06eb8ac4ee42be84abdedd9fe8038750bf7ce6213ba80eb490af8764f0f455fd0dde83817eaa4017e0a50a1d9e9f4babf311d8c189b36ad4afc3cecc8c613be3167f9606a3e91127d974709e0cb9ed28f15cacce5d591b14c5334bb0da1e20745c7c7e3fe4d051eafb5b567938ca86f9a5b4147a1a7058b8113235906447df3b5328b3c9ab372734268210155dfa7846d4c2a2f3ba9b49668c3328f601a4924f88474608c2d42b175c74d34755b1f4df57a0881cdad7e93af96b383c8d2ac9bbedcf183240f3f90f5062fb464bc6d695a468cc77894e0df775267ec37fae5ec8d117b5567639ff0f4bb89054166060903481c3c77e8711a15bec3ee43217d016aa4cd1f45f8f56d15c34b8f6088e32b3e58a83ca5c5e575feff017b3c66c6762fb165175d0ed30c1387385152fd092250cd5de37bd70c1bf22c404d9b1342df5e36687ed2d09218a35a826162912e9e45aa5c827be91f3e214cee6ea25346a408afd0246b4ee096fd668861ee1ca7234128fb0fb1d955ef648a7c44ddd9329e9c7ddf4eebe52628db743d0e7a36e1e1deec0fc8da3d4d2c4bdd108ce445119bc09cb82f068fcf51da3938b82c571e60d54702387ae91f658e91fe502238e687f8cc687c45af080ca422ae68076469a4199b5ad20afc8df77422e85f5f68c89a33c7519c92c31aab68187f69503473c2cc67091c245e75a702428ecbd91f5c542a2a36d2b710540d3e1642088cc2b45c0433c8ecc40d4cbb837cd981e4aae834576c7a2723617552a0f2d92d5e3ebd441d6681c7fa97cd189c35c11eff2cea6b507975d7b0f517eb13e997135deb2f22e591931e2420361a2a0ea5deafe1a3e69b398c9b3d9a52eeafe77d2cad599482ed965749b61bf5031dfcdafde7e57e4119d4d98a7db08b9e0e745af760a445a39810e0eb19aa79602c31e3209f1eba4c64d609dc59d5948adc3747eb1d78c21601b2bf5a3b563c86ed9f5b3e6818ea17f37d9267004bfdda757a2ecb4ca374e3557413bae5314d1c2a758ce5abc19cfe82c16e4f7d4c96cd335ef989fe20ae34a14345c5093d3d97c5b9d83332eade50122b34e4c795959d5a530e528da2d75a8a75d22fdc09b386ecdf0a5c32fb5b81b53176724173642c0acb249d8fdba2ae8024785090088826a941736cedd3b38801cd189d018ee83deb28a7d594ca8cc237b0e4212df15c76d2c5f08e9759634635301f43eec63a095812d993ecf3672f7886e9f227e9544d92d2f84d08265c86f25211b2a10872054dd6264f8bfa9cc369405b439c69bb91f45803a1f6c2402e96498e0d39abe6db2aa1aa2c8943067bdc060 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000018af6fb4ef4d14fbd96811a5ac62ce92747df2a59ccbf0353332ffcb0926472a01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6597c475cb97bbd0d91bca0cd6e006a126a033fed3f3b6d1b0d5cbbc19fa4f9126ffffffffffffffffc9fe544d78de9957b0a915debc05c6f784bf78b9ebcc0f6449afc182c5e0d55615abd92fdd838b81241c083c0d657696470bca15696ba9dde59f9493fe3b379f4f8225d2009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a967554b8055a9d34b6e53304f36947a137c4aabc5d8192678b69861cc265092dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17de8a98b8c027904245451d31f2e5c546b6cdedcfd11f2b11ca3312760bf9aae2019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ac5ac9019e8fe643057ad90909ec7e734d7b2b5c70a5f68a32046698f928fdd89ffffffffffffffff52882685dd4c1de20eb96ae293bad43fb6a65b12c19a405a10883210ca6fc8f84777f99d065b26a3aa782fe07f4883a3b08784de0d57167bb817214f1a83448b55465eb900593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25009283fcf31c5a3c780922bfc7bc22e108d6044b3bf1d0b860476410e05bf2b6e6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b42b03a6c93247fba037a3e5ceb4964f7a73f786a67188f42d42bbe122b601fee600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f5cc00da57999bd4d66d07215d4ee29347839151001fbe2a83ba6f5db85151d700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6663581a2849cdfbf6a18f5808f1e1279e7a1872c2f70610cd9326331110b7474bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861120d3ea51a0a6255ca448eeaf374987c00e6cc3bec69c77f57f273ada4b657e7300f00300000000000091ba6baeeda7c7969b57265cf94f4c56eb7943c732222d78f3d314ae708e21aa1a2b0aa927af64645994598b7783870f8ed49944115cc84828a6ea2146e6ee7468df34aa8f5b1eacf48ebae5dffae3e975b8af00bee9f8d04b97186d00ded273a175ab94d480ed0679c970232aaa00296a942347fc6433541c1581e6fe66bf0f0a402001640bbb3d86c37d5a788a0cf7acd0e98464fa45b1b7d1d3f76e34bbeab17a892ddd0feb51c03df34df3d594708370782ae490c2af6f76c3b8019557bb89538e0504ab7f7d7b965b03efa35a6b91df1d818a57637e7ed8f25187bb38ff34cf0f1dee2e9afc76210d1f76d084629323e30465b1ca8276e3f0eecea285c94687dee96e744095dc547dc4c66841765070ab91af37ec682e88559c35fdd9cd8da8273dd191c9a9d4126f5bc62bf04061102d7973b718535eeffc071dd296a9e938d5ec988d8f0cfe24efc1303dcb4894315d6b8ab935168b819cf1d9a86b3abba41878c3538c9e1b06771e98450c31e9818c523e08af2489d80fc49dc98999abf1142ba9cf07d419c93f60053ac7ef9318bf1fd84dc05dc1fd8aa2dc73ef308be4d9d204c15167d2b91b6f6b62229a8975af488687dcdee4e1e9ba5a269ebdd5a12735cf46136a0b2d8a8f82a45008cd62ea18d47bb45bc8eb17e760b7849cab9cdd4a3ba56a7724df5ca8d01b1e0e134acc3234705a5a3780cce0f7df7945ed5bcd62a8052534125823c4784bcf62a6c7f39331541ea33f7c8187e5155200590573d1a34b0aa07b9c674641af84609e6f8515164706fece49eacd2169593d4a436bedbc52d99fa08200d8187e4c4c3a9df54b951996baad49f2affe49bcbcf5a4dd41c4c0bc71309716ebce934f45f1dd1a74b6e784d5ba1ea345fbbed3688a3fa0a82961047a7e14e86803b85c4f6ec425f0f2e1c1a7330ef11ef59965002a6b34b0244437f04340d50300d35c3f6b575c1a50f3c0c6e0695d74eb7c24dfbb18f550684c9101a662639c670954681d503a9eeb34f79d3d439a0d94b9ed1b96f6d10c36559aa5abc066c978ed14603126e8fd0681dab56e889b87ec678113d3a5d036df39a654ef01cf790c9c6f3cb2bae4586a996f9ea3a5a0ba8d250427fa85bbd8e88c4a83806f1990838f4a08b679a2024a3333057b719b433215a650e9fd948a0e17fcaee5d956a1657d89612f58a0473dde1d364b5bd6138aac5d3fbb99ff4008a8df227c3cf55dccb7cf57b822f949d07d524da128395e0973812bb875de5ff5009a952b550c4f02591d68ce7f52cb2fb3a76eb0dbbcbf62878fe75a369e349c1a38f12477f7d902aadd49897e6f0dd14018458852804742c461acca4a11e08dbe93691c53dda4b0b9274a07ec3a209ae52aeb8dcdaafddef8420e2ec949ab2cc6d89e0ee49de9ff1e5650 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001b510ed498c208fa58172d94c552306d628dff6345488357242f69e4e2b2aa0201e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e659f8c8676069ff8f7aa5549f4e31b829cd57661fd983e011171f9da30fe25b116ffffffffffffffffc9fe544d78de9957b0a915de4cbf94370d2401711a40bd626a71379d77cbe0e3778e0af34d58150aa044e4151b2182c344fd9c80d84bff70fa87da0dcb214d0a85af0c68009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3e09c3186b226c1db0e16aff0903bb00135e2aefe7591c6d31c277cf526905add85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17a75af78f46ea10ba289665631ecec1424dd1c9b53048f30aa3eba0b67a28e928019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a8f849cc817608d4bcc130bb53b57869b232f494517520cef24555dd3da628736ffffffffffffffff52882685dd4c1de20eb96ae265dff53ccd4bbd3ebadfd1a1d50bcba7a856681ffc4ac5c71837fe76cb63d53562ba7b74744dfc5c70c35ea6dc70fc9d08a116b22f93f45000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250d9a0570c4a0e86a2883b25523b4500915d109f442f1ea01d675e6bbca46829b06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4d17735145eb6bf8d48959e7cd1ea4d8517633cb0208da7fd07a05033a4b4f63b00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b830b1c4b9448135922e7801576be22f28166c383f503af5e60883ddffd6859600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfbb7ab6d197b8484ab40254d601e18c22e3a1457ddbfee4defdd3018e64830274bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611c97195c59ae1ad011d61eb4f789942546361af8040cf679e8a6d13498184b44a00f00300000000000092fef6b6016843e4f04130f4904218afba5bc5a59a11b37a26ba4d85f8fc990ac079a1f3310184031c9b2e3e52ecb2d6a1543ab96b3a543ad5db67984721a1bfcc7f5df639ac507bca8a03438eb0486d4e2e9f23ad95068a50ef770f51d04076b55c614ad1747e52f2ed15be8e2260d1639390b29f4d7bea4ae05b99f794961ba0ffff1dae01542e2688d7c0fb47e3bfa82223b1f7369b74fb7207c77a18d08911f4d2a89307980b72ea963e2b4db61f074c92406207199b44fa2ffaddf3c16184fb01cd6251921491e31c4f3a2c80eae89d0fd144759766762128e2c6c259430e66e695793d5bac855b7329efc956ef93928d0e28f83a59423e164d11868b70ee8c1a5ad16cb5dad3168c6f0d053f78a8ecdb29c0956632d5eafa3db3e2151488921fb9d0f499991a046377cee678f010a52d973d36979a618af6b2a8c3714e4aa35cb0ae8ba9745f35ce1d8afd9a588cfd138ee30fe132349f7a14ab9e65779e0269413e12307a285f2644c042b424d77457a5ad9f6aa6eda6c59dd4fcbd08b05d9026626aa3a601425cb8b6a0a9ceb75fbd88012da819cd17061be553ce668fa06e0488a6e352d1c760fe454aa5f082200a8ff48081448d524849f30f07fb71d09f1ed6c864bc458dd0ed8761e51b20921512bcb6fcbf8fd25a65a42de2f895477a8df9d29ad2fdfda3c3d65f109957e512e89c7aa83100dd652927ba2c824456bbd2da3a22d7fb07f2bd1ad96263c14c02c188c645f178198df357506a0f521c017289b5a3ca863f19de99d2aa146faa1073568d6f25167e3c9959bc1e9352abca46e93288e808ee93394cbfd07130745ba198ef042a1250e705e05860670117cba34c2b4c7e29c30f18f8e7bd170eac86e8df09388dea128e9e3ef0ec92b7781a18546a0e87db6edeb60c3e9b25c18e34de4da33b343fce36bd7fa187eb104caae61b581be42438b1a430d31b62655989caa40821beff006814ae0b28d83640829c9e828451d9d02420507c8d24df6cfc21bac92c42430f1c5b891c2983a26e5fa6257d5cae45c9ddd9f8062e1ef3ce441b8dc840d703509e568987adfc5f1b4cc9f04108c44b40acb0f8a1312c9e8803c2f67706774a0192ec207f18839fefea85ddaaf4022336a8ba5f404726767f7908abda7eb060565cb0beca46bd05f4c1dee00f983a16b3dd330f0c1106c3dd0752b24869e58d6a61891e9671a998133e0a777ec9fb56b0e2b86741bf5335a45efd61ffaee8ef9ebbec081f6f66453746cecfb4125d89999bdbeaddd953feb7b113e7324c341dd9b13c33bbd6995779c047f9cc96dd85ebfdcaa4c1d538142202d60d1d235c09179626c2b8594dde8f53ba72e7347b899cb8c0dfe1785537b6571df025325caccc8b92940476537226e47b33809e8fd920e753bd150957 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000000d5a34d7380054b95bc6f028c4d7cfa46c93298de3b0e2ec15e6a425a0c5721701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65c3ff0b57ca307dcf8aee3757d4e517b1768342961493fa2346deb035c266e981ffffffffffffffffc9fe544d78de9957b0a915ded0b9e69aca5780e1ab92487ad67cca12dc599b29834c2bc3db2663737bed1ff6a73004e0d855dbd0d82862e350eb640d96881b464169a151009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ab2707d4cc6d05067c300aadae23d7d348b5948f4bfdfbfe721649a2b318e440ed85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17ce5b4b94cd644e6065732028abe56b3d384ed200f0f898be16f1b3148ef3b60a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a09e67777cc3bbcce02fe66ae603e2eef84514a23079e9dd49c0252d827069b55ffffffffffffffff52882685dd4c1de20eb96ae28c24257f59e13652d21f7a2a39c78d9b0b85199046ae1bfc8b642f8110db92887ddbf6f651ff54d8f6a8ae9ece8b22556da5cb250a90f9e600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250270942fbfdd91c8150b0197bf607af42d69e2f5fad9a03c9a8da0229f6398c526185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4c871be68c189f629cdd6eb4ba45eb9cd7146e2ab237c4deb70d00d00001f5d4700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58d2456fa71f145e68c651d8ba632ff02c73564c15f8efd686e8e4167a4ba1e15200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4913c49e119d64e391d5b47eddfe31f93dd560b18fec1153daa19c6c91f29d654bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ad579dd7c3235c4dd70a9303d5a078940f7b186029b7a9c639805da41a20ce4600f003000000000000a9a9db1139169fefbf9b846e2ce122d094f6a4633a5e091f19c088c222edc8a8582c9c62f85d257b399fb8145858b08288b0b278f350fd925183ee18929017907890bf431a9e50e22ce762c236a3cece8a252820bb8c93b2a0a6929e79680d72a4caa2d804f8a829a6c9a736bf11792ecd8c246ca25fc065222b0441e0b122c83fab56c47abccc58e5f97a4fdc2892c28a984d53d4f02858efe16a636d3cae7f082cc6d960364b2bed3e6e61bb1f7a2db0b02a99f594e4bd674e7fd61b6501ab85e9550d78b3fc52d2473c327ebda7d9ead130887dc7ace12c134eeaa2c19f04360d3e75812bb859ea0c75070280412eaebdb321459db6db7bffb9b6f841431d8b9ef749ee0be933414c221211fb785f48b526a71a4eb9acfaf1353d6917a01da55426670cbb82486d0b52d30e1b2c5674a7904757c9d16f6a70a81563a4c5142d6d12cfe7e0378c4a0525e510611e2cb309c25ec0efcff89d4a68fbd828194e310cdafdd7fe044d45f0a07a74150868f7eb102e43df3701e1bd8de22c8448c9976b364a45942f6df7ea4dde724d220f137abf4cd71d10722d4feda32499b445fca56346e9aaecbb842257f84739e81582fe448f822586ea59bb4c2be5a166e40bd1d37d7acb2bc9de3c646a2e2541608c8f80ade476c60ff91f2414d78b6ee58ed0b27d8e646992f2fdc326f600dda0e5bffe614770b2152587f2cc464cfbad30eb2175c2ff12b186f6b0e6679b734d4a0dfab646c57eeefda5c2376ae93249585b433d5e7c191feefc427a4b13c61fcacf3920c4d2c4fb4a260848e7a3a678596307ad05048a455472bcd2c8473531ec567f733395c8d4825f4d27b0a227ac453e2ec86a55cb7dad6d6a6c1189d444bc9bd75ab9d8acae2b559a5c3d9df7e55221549754576279bef59d53399b6032d9e2db156d90b87966249f55db517c2e4af14dc3245e4067c4efc2a7e670b82e0ab2288ded434f35a0cfd2d9e68b308d7cc0aeb238c98096054a317418262b4e2ba8b0e70f707cc94ba19d5c43d877f0fd6376850b17abb8e061c393026ae901819ffd3b69ebfbc3f53610b611afd069124d22736e9c439a32fe8185745538358290b903bfb50011a2d448c79df062b72ac730d80c49fc8cdd996a81a1ba4553e27016409c71f506ed801134b92d0a4f010586e0ba0d113a37c960f554b7af6d47da6244e5a43e10612399a83aae86c4961adc84736c0cdee1521426451cd8603e9d44ce6b0d8587c49a3f514cc9f0c3fa22c8fda9837fc0895fd4f1d6acdd244c79d5bdf4fd38d5102bfd69e686299d715b0286949070c9d5d88fbb18a36e14a673a99a577ad319d1d42a954184a9279b824dcb035ab0e7bcee3a08fe871e699bd228a1f3be086fa4b3e3e6827106ce86fc42a45d1b6da8ae446860e6f0802b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007efa805a89fdb4130a4b1e413f410e332e9b5e4761c3726b80e4c24bbf9df15301e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6576ac557c95147fb5dce2b4ced065e2143b9f56d72a68ce42d9ea9fd237e7a583ffffffffffffffffc9fe544d78de9957b0a915deb0488b684fc538c289d2a75b05bd4fded9968b5b1c7dd7e1ef9b13dfdbff1b8b10670a53aeb2592e505880ce0b0c4ee93472f1583f165b47009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a9c38b0a75dc35e04e38055dd3810828596fd0f36295c5baec490a3d71757f9cbd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c23ec361011b91bf43c6628a710981d68de759a0cdac690134879e7b1bcce6a7019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a5eb33a3c4fafa886668ada1d8daaf43b3e39d67d074defe37408f1d6eb8e9414ffffffffffffffff52882685dd4c1de20eb96ae26abe4e6e3cbfe6bc4488cd93a1e4c7096a24ef9e41cfba27971ce3bdd9c459620f68e52eea8889ad0d65d27307da1a6a646a877aa255fcde00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25066ad67ba31e3c9dde15c830382e222e7cf17df0499bb8b72b592ed11b61f22df6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4c4502ebdbe36f86a5b0e724981830c04d092b64fab3e57b73e9defb5c93d428900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f5375950f87c9426f1a5261e880ab4853d63413464450a69735416a41193fd8000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c1e6cb0b0b7fa7f24327ea273968c3846140b76f58cea866508efe818d1687ca64bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113f2c60211d7a518748b9e806ca36bbd89d996b4de7e23f5da301b1460c0ca4ba00f003000000000000b5cd73781c2a301ffc431eb3058b6c58fb914f723082b7b9dd539799ec1c794472b1bc9dfe89ffea4c2bcdfcb447988e92e8078094bb040e29ef3297c51ba594fb635e641569a25704d1f69759bb1ab7919a09eb19c95ec6460be10ab5dfeba8b11a1046318386bd0d4fca7eeca9ce6159c07985a6f08e8de44bfe57bc3535108cd6d9b8fd6aae98553f0d58818e2fdb910a2667fc01282d509dc94558388f0ec081efa971a3bda45c56fd6c0dd15f988cdea1cf7b31a8c4f36ef7db67cd3c3da6ff43c1042fed4746f3c5afc0ec3289e39ae821f2eba2241a15eb423bf95aa2706623df4b42b609caed4c5ca45d770392cefabb44df4f8379d6ea9f0a6927559a3ce9421951852d5da4474e8721ae0a68b8db94e3089ba06ae8c1b99b92fb72b605351ead3a6e265ceb67a06eeedb01757f1ec8d85258065a13ffc9ac1568335b1714b471180b53a6ace3123327e0de98a276f86f35a246817f33c1bbca590061a436b76acd6c258ba6a781024409bd0bab2ed9f7ce2a1cfa67ce632d95828e8b9063105aee9fa2c5404c5ff39ca240bd8cfa06c110212c34523cbbf41b8810346201498c99a40423568ff1c8dd93e5ad9c136f90743950532095cb634d1355ac95a9cb47a2c13af4d1daac66d5b76529cae82a2cf5262d7d7415e463921d188042f4b07689f8bd80ecc0b48a052c62c7ce4ffb31bb912e4b5b9ce8b48a85c573f87220272ae760dacf6e1900596efef802fef0c760ebff723883099f693dfa1555a19e9c4cc00278f46d8910d29762d3d8bbc9b12852678eb278a05b700f15912c2adddcb001fc4b210eb18e4033700ba58ffa93c147cd87e9f63d7091b40d40da40dea8701a42ed1a0c8e26a92c01a9f2c77b13cfad644f3bc3a817552d12375c1dd1ef6dcc69308adac215d2345f216501389d27f8a087d43fe53ba236a6c4b4d06e996cf32d6f786561d41d5827dbfbf0848f33fe971402ae4507ecf4753d7fbc2da716cfe17e2b90d5eb6b7103ce19daaf9df16bdef29ad3a06b466e01dab10f1aabcb90763f42c8771b62b32c4472dcec6348ca024b1a5eb6a8e6a5fb9588f143adfac9439b3a150710152a2d5e39f8f09db9f050740cef9de0ca2d3e659055067d5402420572cf33bac1416314472d54ab319511c0992841b861862e84a02e33a6ddc32b4e36215b2c34dc28c761311684ebc91a88c7a155134ae8ea6ec062bff6beba895df4201b7cd258458e66e26523cd88a122913dc611670bfe5dcc962fdd8f9b2ecf729f7c79621f0acc1891f253f61d569c2cead9d7fc115baf6c09b260bf9e93199151b4e8c02114fcc5fce152224c9b3db44441ac75e46b9d70388d142821d0d2ffd4294970e10c9865dd1f8a1ff657e90f992edc9bb210a06889151ad3f9bea02b9406fc3b1464 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000040bdee44b3d958eb5bd91daf8e08ccc618eb6ddce2518b2fcb63d4af9a0c2d4101e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6521cc75f3fd518820b5e15421ebd5ec3ce8d3985e775cc2eba63df6a9019b17d7ffffffffffffffffc9fe544d78de9957b0a915de4e3ed3f5a63b5a8ac43be543302f9f88dfea1124e89283d87f7a8259d2494404a28fd1331b7ab2c0bafc48ea30e33622e550e763fa26cb39009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a17d7e4bfd932c03cb5417ed7da943c6ab92f787d9245716db2e680cc3780369dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17333f20fdd5bd8a358c32fd17fb5faa4eacb2ed5c49bb1f10b715aacb5c8d9164019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75abf6f1dfa71466c3e0dcea62a5ddb54a8fbdef601ddd08fdb9e97ff2ebf270a5cffffffffffffffff52882685dd4c1de20eb96ae273d8c0fdeb1a14426f23917be198d5774bf7b311692e006dc43cf56c9b7e61f88b4813b3e80d10a0f32d521489909117fada091da32081d100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250ef4715ab224dd99069440b805ff660c220890a671e367ce98b84250264bcdde26185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a9def7543a471d3c3c2e259bd3591c5cd4ae9e1e68b8bbd7bc9f508d3e87df6c00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b580a08d5529a6ff797f3966f6efa0656ce364c42babd0c1fc55772242b59455d5300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c81f1b418992a299f9fe376ee46cd5191b7bd396a7ad79dbc59c9c82ff3548fd54bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086116c24c19928ad99792356fc9d3cf76b83a8748f3e93456c83e902433cd8b143ec00f0030000000000009841550e3ff94735a4c2039221053395fe0e71e4b058d33b056c2b9e2c3d738d390ac7af19514d9ddb1cc378419ac794a0d5ed239569fa200c988c983b2ab09c6e348c52b9a2a0c59e47837ae43b173d043b53c6c9c157a72dc3943193271670a2e207f85dc49dc7c2d7e2d5e0e8978bbc6aee78addd8461f2cd5694802025fcfe66b88708a5fb05329479f908e5ca328050b1acc23f8cead9c836d60ce4335d7fe6fb0bda2fd6ce502c131312f802c5e88b34ffc79eb455b14ba16e1fcf0df8934eb0158dd6d37699800359805f44b1fd94fa94fbceaf5312e5e2b52ca5129106c545cda1e0fee263ee7aedc12c301eacdd19932dd5991edae4dddc4627375e891edab38f731924ad5a4db9c0429e2db673178b58549cbea11e842c35f6dbc0a3b657b815cd24885169bb3e535b1bef8fd4e62304e3abb696ea94b881669a489e798a524819ff5faa67e92ccecd74c6861ae04f467fa5fd5fbc1c0c032d34f516d3cf5da4b5ddee8aa8220627876883cdafa7cef5576955248516e0e8013cd8b04fc456d5471dd97d228bbb6b3c301d91845b63749e615643a1b90cefbf1c642ce032191d17742fc0046145c8c5b2e1a78a42b0a8ee4bbd9b05b478e5049ce245cd7a4184038b0a5f91a6143bead9d69947262fedce7737be5b6260f4edb167a056c5a286da564f6af1a48271ed02e1745e092a31e192a4fe00ed890c978c80a42c9d3bf5aad13e9ddd769296c46857fa2273e7eef7fd878fbec4628e03e89c6607f1252b2cf11e880dd40b0fd06844fac1ac23fe0e387040f116af8837823b65df65903b267b41be3db45e0a32e0035d1c697a7e5da50a2474cfb3aea3e2405413a1f56a3add72a37b79257bcffc385f356cba7126145bfca0880d30965c621aafc00d182a564981b600224252c53871b57ae2754022a991810463319d66032a6d65cb709fa9f0eae8b893b2ad4b52102c8c942065521f560d7f143f35df4f698588749d7a7847a171e6922469624cbc12758836e104d6366cf4067442113fc80743562eead4acae3ace8974956d709820b1c31b362423d13639340704bf33d933240ad57266457a0cd6f42b33f44d177019c06fa98bab3bfacd76f018de3ddce3c7fa507cf8ec14c625f17098651f78d5a2ff0d1c32648c8adab65f7e66372a5c51852b322142f712b8bcc3a7af6fb26621dd1369668f2fcb6f0a82742d3e12589537653a4d88c09b1bca4b77222c3ac7ab18c074e90d43aee379f79ae92f2655141aa9d5434881a7128fd634ac2cd7f21ea60c7ab29509ff0e6d1502436683f00bd590dc548d559b1f673592bb25a3413a50969e23754155c883a89e5b04e74e808f79bd629dff224baa0302545a7bef9b1b8d41233ead8c9aedf3b3fda937b040bb8a8b0127432ccecec0c76c70 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d75663bea76b1e7e1510ac9999c6c9d5f61dcf8bb421144285318976fe89304e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e654d723379bddba0c05d6ee9b67cc53656dae1b74e1fdc12a21ea3ff2158e78771ffffffffffffffffc9fe544d78de9957b0a915deb0919cedac305ec5aa30a69b238c9939438a5ebdd387f0b6deea16c2504d5671091b2038e00071f31ec791bef5639e34aff2794203d82a99009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a38442fd59990db79558b16d6f9fb6718604267106d361b2e751d3709209937a6d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f175e8abf95e257f9e697eeeac38ca8fe9c180b05349aab23bd964b1ce146405c40019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aba6e997e6dc56929b2698efdea140c3fcc0ed4a4c5593339db06d202dd81980dffffffffffffffff52882685dd4c1de20eb96ae2c769319964783ae369671ebceaa138bae60eaafca110364c81e514cba35515934b9f5773a5650cc7c55eb56edcbe4f2f97004d8e53eba6a300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507cf244489e37b4b979b007587e9fe7ce619f32be637a6d42eaaf2e87394cb8ec6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b491f47de0331752a620624efc846389ae98092d59e7555d132e5c2265ae89120f00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b589061230845ff3d192195780f905e36f71c7c7d1645b28fa693c954e16887784200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6e7338240da07bac9d583fea1775b08c60aa0b764ff1b3e5cfe5ebcecfa5f80b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086117b3e476b1d3de55180fe8c82475b86bdfce92059ee253ec6f20ec947865e04ab00f00300000000000097b1c26b1f7eaef5c9a2ecc3ba4c48a539979425587c338b65d99aec7d043647c524b366380391f3aea92f2bc0e6da5a83ad91656f5827f8eca612edd5dc6b15684b19a2cba86bf9ae1268abeaf5406e35ae270d8a1722698c1ae87c1f1d209386cec43e36cc470e915b8c837d964da06919a466cb0ba286163341874c11bfaa5991468f905c6c005c0040a77e33e46896f1449dbfb7fc50e8aca787447f9254ce3edc1edfa76f5d9c467f8a60c6ff3653c3f12c38892633adbaf90258384d30a2e74f4ed2d803faf1e903ba63805272a465b7607df6507b80dcefbd77ebca17d09e34b4b6443cc65ee842f378496268b1edaa5abf1bcd14a82a89ae93df1feeb375f6bbb54afd8392e997549354ea0dafa579877a3bab72a6727f9846f295b495b3c5be792c072fa63eb93ee57490f72206c8701bf7badd0372d303c8c336ed5d659eaa8966e5290a3b162d4b291ecaab9e232575734636ee26cd591cc13a6f0dc94ce7172c591aef0486f43076e0533031dc70447f7912f4da4ed3689d75d1ab352bf3e918bcb91fcb33edcba383da8564e0d596cd349e83e0f450ac297dbcddaf8673c6515e8b948a9a2323ce406e92ba9244c6a264b45e26dc2a3c4fd386062f198052823447f7412ff66850c4d7de8b38ea0c81b777b7706fb3ee25ff56ad5779c246056237b348b97c9b883d8ef3430b0b25f335edb340728d64cab69539c799037f174e5103fc4304537fa7e2b2d7a88be1489e506e27c77747c1b9fafb1259bb1a262a41616fc579ca714b2e2e9873ecb22f3157081458936889c3db37ea6d83fb30e82c40b457761cf37c0f39f101a22099e71961bf98342ffa22fc5629621762c1a3d76908d9d1a96adf1e2f34fb6e7b3869832def0a314e118937944dc60818b166cad20da9419ad5551080fa552cf66b4e2a49326cee536f3bf6a4d19969de4c0ea3f570497a6da76572f2417762d1a2e2f33df5ffc5c183f2602b8d9ba2c737a738616810ac6edc4433b5e30f4f6123a65890e0b314b049e2aa3733fc4d0ac7b37b8bfa725d4a6c9a5ffd8450dfc4055c6085a4495c949edc280fcc49d95b4fcc9d68fa54dfcc92c1019a7a72f0b6760b25e4d222eca22aba366a836ae9b0c3ff69c487b0f961c9f242d9c93bf8ce17d4b00dee7ef19cf188758f37dafddf54523ff611e40f010c9e30c35a54451d3ab1c1d7dff452f277a0b5357f74f776cfaa937825f6236cedf35157628315b01bc381c003e40349e04a87b7d19012fff8b5d276c5e72f71308e2765fc103d0297e84f43e2473dc96a0b48b461b7aa763a37b2c7a110bda522856bfec7c89a3d9fb0d7b89681da45929ef56ff03300d66b1d75dcab254559d0e82b1e72cca26e72e247c001654867bfd75c66ef9d13a1c171a8ab3d3c9d55117543 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001764abdd11b36f7540b14be124cd8b7730d214dcc8f197b75dcedc76008d593b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e9cad5a20647dbc51ee389f4bcd9306214039500b760c7f4343091f71402afb9ffffffffffffffffc9fe544d78de9957b0a915de06464f5271170a17e4e1191f84efb2c9f7dac5155e546165793b771a94da6393e08c46d86005958c1c8153a27ae5dd8f83cf72e3578af7ff009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a50a0fe356ddd8143dcd0f7457eb91cfc89779712b639a4e69601b34d0cb8d904d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f178e767cfec47180f06db7f4b019cb8d0a1d69d0038201ba4cb836e53672bc963c019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad695003bf45736b160a5ba8205fcee9d7459d1dc0ebff9cb6a36493b12a5646bffffffffffffffff52882685dd4c1de20eb96ae23a6d6c5059009657e2f764873fa8bc31e6ba3cc176a370d255f72169a4746f3bc6642c00f898061b4422e6f6e271274d22223f8463cfcba000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25063845c4c40b14e7ac56c70a4404543e0915b1a2793482a3b8020773813a2fc586185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b43e51a97ea6d819dcbf85b1c54db79c8a0ff5b34e59ac0afb05c7ab3e42ff5d8f00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5803352d2df5023b46781d21fa402707f9bf607a54595dbb17d724a01a17725ca800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c46ad067d76486152d8ef9afc6bb81936b8f79d7d3a274c9a919100739373d9ed4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d275bf1ddc48bbc1004d92060265318e9049427209fea50a09cf3121e2d7d04700f0030000000000008efb097b42e544503a4811c7786b5a8afc11c27066d7a8b8d511440beb4b86ca3ede5d19bfeee52f30d6a5fc37972b2d8f9effe7888fb59fdad5678e52b3374b4388a35731031bb90c3ee6edfef64b78e2330e104197b7088717a4e204363bfa8a50640e5285b867b2d3e5d423e99e8804761dee4e814aad640397d1a77e6884f6f52ae2a74867d64b578628fbd7e7a892675a9adfdc0960e77c452e314f9cba94ba8b5b18325cae0504fe7744c3d277a74db38fb193b93b871d6c92aff5f764a2cf1290ba4724e4845e47db8428bea5eab8f27c02ca3e35ffb4c7d7359729d0e1bed13f7d83f500d5a642966ef0a569a7912fde73bead83616784568475b754680e61b61f64febb7190952c6ae68f9d52b5b93f3d9154c79772f371473d5b678fe3dd7cd3d504075b4988871d20c205640a54b4092aff0a1d6da0d85431e54e29723a2e9d144ae03ea120868daeff88842b2baf47d24c281cf9d399383e9684bb02c7c5fcc571e5c1ea2c7d004af8c05e315b83f6c34cace2a81eab97c20cc7b2a56748fdd3580d911926db90a7edc7c798bcd2398d9218ed85e165bb7d70c07f7a7c1591703d8f0d5f69594ff91c1995f49868ab386a5bce0469c12c35d0e45e85c2c31b69fa0ae2fe7e938662a05d9bf13ef4b171fefec57411ca374e4ffd8a42a59d8c5fb20c0ed71695b837ce7bca889527d3dc2bd5c170b322eba9855b62c6d27c88eae0d5997cc37f1bbd71f5316d3d33b2251b6c39f19130ef23ca29274983601c2ffaba6779acd6d471c3328429f63020c76cb7e6004c9db3f60a554274097a191446e96439dbb1eb7c7841e58eda4930c256f81afa7f36efbfc87ed4d8e92ed8ba1b8968a08a74a4ad0e2145d1ee30c8c6e8ef2fd7d959842fe1b1ccc7f06acb9c881c7a826e58c77bf92fb88a131d759694508eed53940d0938e0400cc35c4544cef0350ec7fd0bd9165cd30761760cd94540984aa1c9dddd2ef84ffee666af4930a206139bbb806ab64508d6b88ee55e664d6c1cd890792b20d52c1dc2c9b3ef76bf841c392e26af4516da21eba209df27c30d28113e0c3ba6224a441523b5de5637bc8d631cd6271c0d279358dfd8cf18f6d77666c68c3484b6548d6294699a4d6abcc6e84d26bcad04d36e1f0182a7bdb2fa47b36427bb1d12de715c4c1af8973305534e59d7c82832f635aedc8dbdc282c8ae002b40ab28394355f8a518eb1c5a4bb2d623aac23f08122a3dcc1192758df207573e1e082a95a8444019e6a72685e51c6bb278100d717585ec63b7431121c7162e18fe5bb3d48473601e9fd53d643102b417d273664eb0a6f499479f4649517c9b5cd0c5986db78d826f8741a0ab6ace2897fc436a3575c854c763cb2a118eed883a2c5ea29e206bde883f6a0f3fd15c1aa7ec001c10 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000003f355820b6188b7ccffd6b6a21edb3768a3cccfd178386783973e23d5a6ecf4001e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65b1bb5b437cc0c7bc771039140f36d13e4a135e886abe9fe2e6358851f5004913ffffffffffffffffc9fe544d78de9957b0a915deb506b1616f5fa2f7f797c5d0d6790ef7ac7597382c639dbdc16e1b208e1ffd883b53534b849bcd739cd1cc9e53bc5fc0a76f7445d6570ecc009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714acf9d5a58895d0100fb637d01f6e1f24c47d1dc6eaa33a40ece763a944e775a35d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f175e3296c12480971a5936a83e145face7cacebb9e652c2200451ee53dbdd0dfe9019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a655cdcd61f394f2c2f5d8d4ef199d32c0514bfbda784b974148a41413cde7841ffffffffffffffff52882685dd4c1de20eb96ae23a88babaaca12ec42a6bcc6453ee4f774b8847ee3adca0b82d7decbdcafbd145f943f7ce167f23a91a113b708b5c053ff81a9e54b99611fc00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250f9233831f2cf8a7cb1fc727c109fdd921879c514bd0997c393d9449670043c296185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40992d6914bfc8574aedf8e011e704701cdcadf3b570842e26f4b71a1ead58c5d00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b580df18d0c8b9f119112492e265cc65851976246d82df0920ab87b734e42865dee00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5fbde110c669c5f224e6e67cefb6233ef0322d460ba45cc4b7ad7deaa7b511e14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611732498a656cca69aa75db20398145285d6c6c6e4de105202605f1d13d284c18700f003000000000000a7a827360317afe0a54d28823e95fbd83966a7e5f20829c65c1705ccf3d53727885fe02af81bd23a54b58ebd5f1ad07a99b460f78539ad296e7b42c4dd90a6e60cd7416ecf19647a8db968f29547404a912a8c51eb04da027bf27a96fd9b561185d3027f2635ed5aa471a36f95dd63f3c85214f15911bb0656992d2bff6d938978aab8a5b9caac130d87f41feab5c903881d612c499446a213b518a53d1082978464e4b6d580fba72441fa26d8fabb08ee8ac914e89b84b6d8dd88036f647a4d93ec933547d0435b26c6c383328d72b0fcdec51ab1e1e6110d7b634cf262cf5c065773d7e5cc2ecb148cabe68e46c4ba87f5126bf99d60c39c08df4d4c868b078d9e845ef52d1c3905dd3b50ee40dcc8bd0c4dd8380ffd412a70e445f997f8dfaff71edd393dd78b1f5e949986be08fbb408be06ff8cc92ac08c643858b6a412f52af506e280f8c3c9c07ad37d05fa17a4002c215fe49546d6d31ae90955b620829aa69680be46f80ce683e66643c7834d8e2ba1ea7c236e1f123743846b3ac1a41230174f5cd71ed6cd82be1e686eb8d4cb722b0063d611330a0237b120061f49b19853eedcbd786b9b6b07b7be28b5a9b702f07dd2b97c6db3a427f8b2867d72d332a387609d71ab1214e3d7799deddfbf303678112c3108153189fd849ff682dcf4062c1001c4963587201e954a78c72cc72affebee1be115043a38c354f1f366a90982112853ebfe9f33e1aa57e7d5e251b26f20100aa0e0bbb47aba50c7e0abb5508ebbbb1aaead5708146cb95fadf9caa48170d0b7bc70aa7a0edd6e7ff17eec5b8d53930b479752c49cbd1d02e204f2a339efe60761537b3c29bd60d9c6f5f5877581ea8b418a593e37a41c4e44b44f49ef24bc7dd73e345c10791161ad9a3dbb3ea0c9d6ff8958b4569d411f2c6bf9be6fab9e4b389f44c7fc42e2b32b5dcacba2c02f42f5da55ba9ffe4b22dc041bdb0da0da22d4b5fa53aa9b5e5ac013f4818e82ed4cdc683ef8a68c40452be08bd861421ebbff08d738bed13839a05f1be9fb68e58ba884cffc54b2ec084ca0f1b0fa2cd9c2b254b9ee1b9e3509271f90f51aabe493c56664d12beb325f7e44df0f2b1010f22e0271902dc7f50da5b460ce7b976705e392bbf5b4e3340753e0d1aba8b0a34275927c55385a2e35deb32b0bbe3cb064a01f029e8d276c175ef132eae99fc4d9b8805acddfc40f052defaa8198dabaa964e05ccb2b34a50d22945151ee2cfe4e5ac0674a809ec22e55c68c67400a12eaabac82163c515d61db2800e8199178c1ac074405144c9291dae71fe0b0a48fff3f9f686ecb66dc3de0f7ff1ee8c11b2470717d62cd5d639db51cf8fb93d89d3e115dda1fadcda458775ce1a335538e231bea0b3906c7029320fbe1096086756a3519b2f6c5474642 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000777bf6bd5a0d753482329e62f96aa42c5fc96bf874ad6d1b54952fb21f48565901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65c85ca182e1f2aea40fbe82e59f396d070da79e20071eeab7654161b097762f0fffffffffffffffffc9fe544d78de9957b0a915de7eaab472be307bc176b294690d4b5dbd4f295202b28a94531fe2d593520a7f5568d6b722e0ff34ae017b3088c561ee123c1fcccc82e18ebd009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a62529a72f05d59fb600d01bb263241e15433a68fd06c8a4d9964db3e9cc12103d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17937ad32ef2450da62ba75b3474c1fbab6a72e81fb60454e44745b83dee4ff3ce019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ae21189f6c8246bbeab655556d96407ae92b28a7ccb4e5b9060afca8b6458fca9ffffffffffffffff52882685dd4c1de20eb96ae290a3987d8fbffcd8f489302f599187f0be8ee4fcf1c2b1cc78083043bfa92b38fc162265b42f9fa7385e201261c934a8132062425190f08f00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250601ed51d0e99ffa929b38b8a3b3e891cda1c1b2f42d255dd59b0b3edd18d0fd46185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4fe5707d227b11e65ce745e41288c16beca3369f3927aed7e46d8747adf73b55200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b583aa781acf51f4f4be9d993b8e88fdf08c34498e58183f8ada4d15edb69e0689600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c4009f320fc8ffab0901a344530e6133c07823e59b2a6c772eb65de047b0246554bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fd6b65ac60e4a271da92ec3f70a5116e2569c469cc8e8c23a2de4279dc2d12d200f003000000000000864571c291e73b22f4878afea22e55bad510756dced2463be6e12573e0403788110435abf53eeb3d8e32a66cd092a5988bbf871b788b14f5423e33cbce43f50d248631bb7b353bc39418dd5560708081f9bbf3442ef346d7b14f3e679f33416daef52a61f80f10ad62a93c3a0b373803adc510c90f807de25a92e20d37bf292e9f6da89a10d7b1101e69b07808d4f4388fc564df2b11fdf3d41bbd7cd974894e795aa69d2a1203014d5e280676dcbb1ed94a98656d4cc18b87bea9997cfbb9138d5a5e4ecbf23a6e36a3e1204b0e199da93c12e350bc77214e7055a74d76d97ac1566ab0171246e744165e146d3602d0b592631a7f14057ca67900047faceaa3ca5c5d6e524283370f90b11fe3b869b3f97292882bbe097fda098e61a63f0186b7ece48123be4ec50ad4077c6ef2829bae5e834537765ca7058d5f8068e1d0f81303f9bf42aa7857a9baf4f8a61cfb658505ec20494545624b4f7a2df149ee1f71ff476da6b1a113fef0edaf21cff545489dda1dfba45647c27da20a7144581c936b801d941788422e528cad4e139e3dbf5cc52c769df669f45d03faf92d5ca8d0780f91dacd867e28efe9c2094fe7e2912c35872a519af174a0bb7b6af4f2cdbca36a477751fc391a9a1f2e1667037ddaf9b44c336b1a7253ce24426df3010385fdf106eccea40301e545ad82ad28ad23eeabf420f5bd649614754a395c07fa31faa22491126277851eedfe0f83b1992db5622bc4ea82848ddd5b823f55ae19c20a58d6dd1c7ee360a81e493d983d09e8436904854d5753dd9cf3b5d69d9136be5031695b1961ccb22ee1866844246ceb4a7c62dbcd845051b9bbe3c3c5d6638a075a6023b4e0ddfa100d4f4e1e8d3d5acad4cd6a42f05655fed977e0e6a58fa32b952ba4face4be2abb46666031509e5a77d8e04cf4e174e94e561eb7611ae25b317ba15025f3e4cdd3d0d934e4c66c5b81e6d3216a52c31cc701966bdd6add014e3e3db3f0281808f50a85066294028491253beb4a8d2b75e8bdf34463dbf3bbfec3050b87b6549a0bed588408032ea2f90dc7da499ac8e81ebaf29c88bb5996834683595dcc7e44f43161859ea31977b6c2779d87bbce4344ecdcfda624e4adc9b0ee4c81558e988f06420f59a731decdb82db7be3a91ab6a3f2c7b344603953ff47b36794d4049d37d0ac5e9c606a5d56e8bb775c00028752f5c3a555369c45cc7a6333655085370afb3f4bbf6ae1e3eaa33502e995fb4fecc5d75f986da6c5b8c2028894cdc6ac4c094f19cb1e8d8b8a0edbd5f21b32a38facd3229d81e02ecf248a92fabf86102185a8bb143171426eda8a8df18762304b7ce1b132da26202dc294e08ad6a7b21dca4f9ff9457e4090d53618f3fb116a44b55059181ff95e8c4f37d39b485a81a4ddc2b7b669 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009293825aed0aec26bd6a16f2fe7332508d8667bae4db9079e2cf9268481c6c6e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65001c5bd2b47a5f1d51bfe0f997b6a5fd7616c1c0f99be3446682e45c07d21915ffffffffffffffffc9fe544d78de9957b0a915dea1e40165746b6ea6bcdbd5bf085d4dd31344604dc6b6d1e40460d9673d5a214d8b0b17c81b2db1cf453340826b909f89b02e4f5750936409009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714af84ddcf9eda35a886ff7980b76e5aa1e87b6cf7e76992ad0c65a3ba4edf3840ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17d9cc4b5dc8330306fb4d3e6d01d3576e41fa010e7907bdec1f1ba39c028af1f2019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a9421ed0db3dc52a2715488a0ad34d7b4a3c8d83fe6cdcd3db88478f3d2c635a6ffffffffffffffff52882685dd4c1de20eb96ae23bf52d96a91e82bf0735ade87eaa1522aab25760c7bcb19fb2c065af3f202335b249d7f9cff4b282d82358b1ffbc4d94b1fbf187c6e9cabc00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250672dc597cb63733e730020f2220f367601707180561640d54a00b9e25d63c5816185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b48fba0b937a005ecdcfb09cad68ed5188774eb02f18fbfff542e233400ad8ab1700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58ed23a5b80bd0f207f17357073f9d792abd5eb0536ccb61ecc0db21e52bb1b0c900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3497d8cc44d31bae3aa9b09a650e85eb20d29978bfe7cb8b17b81bc5d6f962914bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086111e05981125419fcc6b8baabc3b6e631aa9152811ecd6a1852075127cb5b4fd2a00f003000000000000a6b29b7ef91f0753df8f6073dfb03780dd2c10b4b0ccd7a7f478ae181ed848d7be71cdc11527729db5eea262b22c03fc8030efdafe203f2df61ee4ecdcacb52b691e049d952ab9a4cb1c8ad460c6f5092a4b50f0340ca4ded0ade895a61da345af70ca37d5baa1a39917bd3f413234c514b80f34e79eaae98365e0fbaef224f6f252de98af10d12cfdfa20873a51fd5aa2e64a36aea316630babe5907fbb0dd28fb8199307bf18a37270407125fc5c6f236ac4f8a41c7a93b837c5546c622db887a0950d7cbe99466df85dc2476adcff907fbc066efe974802613aa3b0a880766daf153bc33f0b510b65ed44a572d353b337255b4a24d2cf5f312849edaf166eff0876cfa83f914080be6b5b29fe4f9dfbd4ecb064855512b10a84f9fc9e43abad28308920f0284e5dd070818b96288a6973fda665665a1e347c8c5823065c2ba2b34a6ae7a7b09039f03eb2e7a02d069323780ea7a8d05d504f007a86043c47b357a18d8c1e5bf4c80ff0dc9aa44370c1e311b0ea716781eeb4fa6eadca754c8a2e550d8f8cfa3c8f5e013f3c5eac945ee9cf9745d64e9b9baf0d1145f65c3c3f99c080b81b59b4949b731ff3edbac08c3aa594a0f64fa37ad7078bd5e6e6b7434d7b53f346656ffafcd5c1a0979cc77ad92685994eabac8bb53ae7fd40e0adb72ca07ebefaf13a8bfbda7cce97198c023b767bdbc1c98cc2b4a220439201e5a2268cbb4432cdee3b849755844d461ae3c21edcd48f5b45e20d740a5debfab2e40383c48e6decfcb39d7b4c9fac4e571806a98c93c560cb3d148a04d2be5844ae13dffa4e7686052702b1c64c0a3c2c14e54f8a57c36e2974a9aca67ca54312a5ad512dd9b629c3adc4d32b9303f83247ed47fb0196b798fa80bceaf77b2af616945e061dbab2cac16289c2ba27152431d49aa260ab14ae21ff82ca39c1ae17aacb24a8b1adb775b4d4277c0e702816ad24d2178f869b001d3882ba6b8409cfac69bdc5a7c9e63771c429dac478ca3c873ccf66e5339606b0e739b171cba529c1bc51f99a7b8e2475ed7698d35c6929441587ff9020a48d6ac2a477ea911a9d87e88d3aaf8c8517f1788b9666382e63560a90846191984620bb2c0853179677d8c683810c585e9dee046755cba6327238400e536ee24b55bbf5f9c17e45d28cbbd24a8a6fae2bc99cd4518a000a553044d30431d8c0c41976e7cc44640a01031800dc78ad44ddc825a9987436ad465a5ef83a522a7cd2f84e63d1e6cf1600b228612fbffe4a7d6f3005b88ff4762253f3f712b8a00941c3b028fe6981356786a44f7fe6a6c9a57e73621c7457fa9750ea68b8b770836a094ac6f33091872b09a25854af1aa4fad80fd3ec19ecbc2a6e223e4cf66ef4b613e347ae4a05a3234d02d8ea6996e918a73f501263e495750b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000545bcfa49b3aa8d21817f6415dccf4f000bb255026fa31b7820529257d914d3501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e650ee4e5cb9f7c2934cd58abed88e58d44787dda96501413bdd64441222f076540ffffffffffffffffc9fe544d78de9957b0a915ded507017f53cf227a3da3e0a904d8e81912438ed89b4a7cedb0417bed939fcda9f00c9c3e11028430e667d11d184609f5a852e26532fbe806009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a553d1fc0def5a6a26951096c09e63aec80ae9f0f9e34d110685af83c38b0fd65d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17910d717943b7b4dff72e6593516859ae3f54cf7f800b62ffe9054cd73669db14019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1859a46cc478cfe7381776c2cf13db4ec2d312e7d395ff932b60d1609b3010a1ffffffffffffffff52882685dd4c1de20eb96ae21455f8b903fdf3263f934f4d60244489d291ec76070af729c2b19b68f7e3eeb3ea206af3706411722dd5cc31cfcc496b9b549c4b8117e88000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250ef67073f5c8f2806a58c2048f2bca39e6b366d110f3c7b7000aff6079a6d62806185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b469327dcf8bf5464c203c9436df93cc21703acb5d7a060f7f52f88883319b92cd00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58810738d22beadbe4af7cb2024804c1ac49fa290d19b35f645c4b05aff570606800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ceec1614c3e0332c82dd2d42a589f68deb8f5f46f7bf3a7f4d6ee91ace3887e124bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b2aed7fcaa6bafb557bb4c68548b42eb239659e3c6d33637ad98a3f57f841e4000f003000000000000859b403ff47626393abc15806de356e575552d3a12b9e2c8c3ae3d11907f159880554c0964f33aade4291bfc69aea257b99b7638a040e14a9e739d8501cce7f91b1f012c9be7df6dedfc98d9b7484f1f5c421c92bd2c38d6e1d57000fa1b37eeab883d5839f05c2979fba5ac40c49e6713214179206b0807eaf3e88b08539b84114f55ad347dd9137bc42da84efaface96e0bc4b3fbd4f3fce0efe36f00a22aa5a51f24b7b18cfb42849a070fa720d3ec6f26d5a6f32e3296b7f40df46b27f459580a3a136cdb8eb5adb110e5cdee9664eeeb380c9b1c44915c7dc0d1518e0ab5265b12f6210f44de6b4c4a6b4d3e631a40c8c02bc4c30574cdc61f1b48cc48c1d58009f4daa43cdb579a8569f32bac20858eb25bf2a85fd4eb48307d38f859c8e367ae6b57ae51ce2ba459c6793f1052b234676f32d26628ec65a4c355b22fe6512e3bb2047d007183615167637ca40a3bc37c3e756c7209a7c921441ff269fcd5f5d4b907204079e9fb24e2c9dde5e4ea16217f1d17e566c76d9adaebf8383aa64cb30ba05c904924dfde0207eb1cf4fdd6addb0c99c83959a382d9139494d65650a214b9d44464903c41fd54726afb5abb02b997ce7b5d1e58167bc96d777848bb0889a4fdbee17b143ec923a45a6e54f0f2e04657e917fa5b344f80c2059a1f06aa8696e84a51ed05f9361a1dc9ebfde6ed761673ca8f6c424e4f4728bc282f909476f5de25e9c420466ce77a4444bd5d896c158f02b50c9000adba837c7fd0b917e8caf10943abea9a9b4cbe15fb4d446fa916d49310cffb6e97033126149d78728667ada643346421981eb4646a30a39f5f45d89689f43a0281e73e18ea92725ed8f1363c19bde19caf8efbb1ddef8316ae7eb81aa4306977eb4a7455b3b585a54ac58334906e221934fdfa444deacf0b4f279e829a0b86bef29ace0bf043da3792af968b911ee428692ec237305375baae3d76c88b264c3ba713f9bb99a8bffcc624170eb2f567b9e384c721c5b00f01cd614f147dfb72089b5c9543ba9677b008c5aa5fd0c64ebca0201783628bd37997a4f91df48bc3a28fd60b48ada817aeeba5d24b2a95815f45e50a93d55732799b6c8fa5264901e8778a13afff1b43f716cf2243d7120b0687e25d4540d77719e06e4806197d91d4ad7074ac1382d523538af9c6b8f00ad5f31b9886f583ced16735df2aa6507d5a21bb294c8a2df0047babdb1aa6b45d3bcc1791318a57c5fab510e691f480b63356777ec2cddbd6e1a5945f390ce4f264654ffbf180daef90dc331a91edf3d9a93c937de9c4b1dcc08329335893a85f296aada0b5c7de71516e2de1c2390355a888ec30c1a30120dfd354a460da339b0c0b2f9740c3a075cfeb3bf2a687e8a3f1cc943352c7642d42750f8b21b709133ec19d17117 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000000bed6f8c9740e30c70ff327166805970171e31f6b7c1c279d0bc25450e1baf5b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65808eb8fc7cc7e92255710d98545d1ed7e3a8291c13423a7bc8b7023a0a7dc068ffffffffffffffffc9fe544d78de9957b0a915de3ef235c617ad4d57540783b3d56b34b4e514748da3ea2bffa533072ffbd45c4b4f4048070a3e5583bf6516102ce5c34334a791944217cebe009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ac68abed6ec305d6ebf682de35b004e705396c3ce13156d6eab560f7a9f1699e4d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f177949e10fb8006c16fc0f31cea484ea7795e1e8f445ea04c9607666455a1c6f1c019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a046a1a7e9ba9e715dce5b65fa03eecee4c642b6742c7b9e4ee2ab84c39a4bbb4ffffffffffffffff52882685dd4c1de20eb96ae2e0dc6ea2d47cf12812b1f6e9cde5fb75b877435bcb20a216dd112e5da86946881c1886c6ea3861fc2659f7e5526768e031fdbf070cbd37a200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2506716e0890228429d4e9582b1fc1da86299e8895e18562471d0010a9a53e7bca56185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4b10e8df2acd13e91de34cdfaa1f86477db05be5711a364f7323701892c11313000e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5875172eb4bd98eb23e4b83f255ee169ad4b04f621a77aeb81344be7508c3cb8d800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c72c6f97df109af30e0be4b45110a68813957f9b70bf900e4c3884817efa1d96c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118bc9e90bcf35c4edca40036b48bc2a03632751e88417314dacad0446ba5dbca800f003000000000000954911fbff4ed6e6e5c8183a1f4c41b4247b71aaa617c316527b0c6df6d39fb01bab7e2bee375821ccfe3681eaa43b47b9c8422e13739538e3e3c5c5e3ec57718b9cc1a052f11970ea8bc12fdab6987ab84029694cc0131bea0b55f6edafed42b2b537f218d9fb12bd2abbf4e08279f8ec895f9d59b1ce396f4ffe0909e123728ae59b12da485a6ee2226a9a0e921d4e880ec28af8b41c0cc8877b90fec0e84306601b36e251ab35beff88ac0a525fade7789a199aa41df34acd310a6dd3713c8257cbe3aff8564bda14e998ca97fa29aec0a636883845c0700b7d2c24dfe84c365ec9399564050492b7fc79baf9784cb86fe419de199f1d9fc7aa95938590110ebaa7b383d3645ca79f94018a758d50cdb47a25141a1deae75c821356db95f092628f224afa15c8faf28df8b06629423c10c0b7d148677e83ed5519711f12439f883d1ecf97b12584c43c8cadd8a623924549970dca22b25420d4f40cb0d99ac4a6f32388916f823481e3ad7d7680684bd2942129fcda7de118dd95d86b105f84614d9fb58de895c27bd52d22ebe537f9cccd62ed280f8cab91de36953c007655128cc70a7d8d4853a6d2af9359c2098b9bb3323c0e4f61c4312a21786cd9e51fb2f3e14278cdb73eba47260a6ab99977e1cff40ae1a186ca565f10cf49fe06b25bcb5ca01139a42a62f5f82c7cfc9e7eed90aac6df42f5cf115f72913fca5c9048cbdfc7536d605afa7b7cb292c0044a2456ced7f631457c16016fd6a5f614da9d5b26cbbc275b887b7de908b7bd2f14cac3a3c57b319c979d2514bd56e4eba85ac5609544c87df7d8a98cab8af647dc98ad84c369313203e9bbb128d12143ace765df6aec9c342d5a92b013c0a864797a868bda23f5cdb56d04905eaf14420e71a24d323a221f993f801b1fd314102470eb291bd1b739fa33270627f6b9afab1a8407a818a339680cb4d7612e5526686561540425a8312ac2e1c9231fe72148f72425ccfb6d1057a2bd79b447f127de2ab0e05be9634543ac9682bfa79e2bf49ada5d131651e91c4d77c1f0152012b7b82683347ab85ff5ce076463c9f84cc6b2fcb137e9978359ea8faf7b9d3d1b703e2f89e4207a5eab79f45148001a5ed5982be9ba2ce7b20c96483cc365c936989e24f357aee8cef7a7085319be2fc0251afb7dba9d565ff8017bd399058d55238cb5de72e1d3b6cf2cf098fe214d14d023f3734fce10b6090b8cac254c5723d5d4cc7b358cdd4b2cac4a3f2f34fd563f854aab4fe57bc3f02c8d076c682e0329b8268fc02eaf304d1c79ec8aae203b4e97e3657a937d9378eec8e30b6d8e31c2e641c35fdf8588ec1c784f27f37d6ddc00a8eec8ae8cd0a9056184157edb15340e188e95f685043d9bdffe023404e6251f54567b153816444d74a423cbeb27 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007b750de2b20ca958474889d0e91e5e53703c2f3f7dd11294d3da04e11fae9c7201e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6580d279517215914febc81fbb9f75cf73a45ec90340d3f52a98c0372c0562f096ffffffffffffffffc9fe544d78de9957b0a915de33c2ce0d7d5787493e54d84d5e11fd4f06e877325908196f156e82c2b4429921aa8fac1f5f4cd27c98bf6a64d65bcdf36183f6a1b6e1b0f3009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a7f34b321472199c2dede33f4d1792ed3a937d46e7cba404a33d47dc096669bd5d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17e8c812863709bdff2ade9b1bad75746fccae8a4aee1fd8087509903e8278299e019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1b2e1a7a02deba5c1bc579b12dac8837baa2c254b321e11a877b5396097b3fecffffffffffffffff52882685dd4c1de20eb96ae2391668fb7514071215e2d7d4b3c66614624f4c4941dc61b3ca7cd6c67702f69358315882e0e190157829457bd5daf14b8d0df04ac733a7d800593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25097efce3a7b9d590f71cbe9f0adec6ec527ee9ec24128e84a6f381750eab198d36185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b441afcd8e14e3109fea456c3aa86ce1d6465009663f1344cb4cc066d43dd7418500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b583fb074a2b578b04f68616c8c89b665baec268afcaadc9d310467a83b9c3bd2e300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca08e25fb0faf0748e32c73f40ff7a57bd8cf3a71547c9c6705abb9d4b77a6f164bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611568b2dd8c3f0d8b3bf80e807e1a6f51b34c1237688fdd6037d9bb1b29b88a06600f003000000000000a01d9796c55fc21bc20a3f8124d666b914e19d754e3795d25a5520f831fc84b113738873495b0ad6f583417c99912a4aabae4abd431da5efbe4ef873b0d91808fe5c70fa8546a1fcc51daa399764dfbc089e4b530d8576a9f88b1c7f123c6e35ab1fc004f5e0356d7d8fd9789d860c67231f33d060a2f2941642224c5d039ff507f75b6aeb7c01f001d2f4493e35aa36af91b8893ddfbdd79bd94017463ca4c5c5fa62c6f009be4d634cfc9e5c5ad4a2455c7913df71755a86260291b6c3d5c5913c61b505b12056630c8f8213cda6f86805f47ba0ffff2f3c720cdd7000c188c1b83d025d37e833c7e323f352e777ac94b626bddbeceba273c330c4ab81b19f6cfe20cf8cd6f3e843e72f4306729a0376b696dcee0d5bf1764fc493214b45cf91c7a25f09110a33b524dad66fddeba9a8dfd0fd96ddde9f8de8f1879beba2d553e977cb111ce286bbea27ec8a26d6fdaeca1be613ee3677fefa7fb1f00024d543baba8cd54077d1b104cd1f115f95f6069f4d68e34dcd4a6ab58b4133e1220fb88836c11b10b542e1475c9cd2e674f0f86627be660958553caec2c172b43be2edc7fea56f401008d89e1a0e4f1e317682844fa986bb247872ad7945dd7c3cf285b6db4b88e23fb04228b7d680d54c955b56a6b1307105e1788f55e23daca17189df37e5363312157216f37567c46ed6d949ab98816ec22c0989e0917dd61f23b406ed07ef8fa52da9543200b09b2ae20adb765a57383b1403a5f7be8da2fb0871d3d901427f8b83e9345e094a41f35c22957f93564c3264b1508c4730d4502db38eec990d9d5237dfa0d8b0b8b7f057e8a9c9d4fef5aa112ec0743817809345c4ce33aba8f71c3565daeba623fa5637106ad900bb25779397b5569cdae8f70431a15afd6a8ca7a1448d69c7ba6d63437f081300daeae8de4ab90da88b48dd85a83992dd63be1f5deb4ecac24eedc90ad8fcdc1de06daefd9b57ca8bde9e15c2178b6b1236b613f2ffa4eaabafb32f3312367845dc678f243685e4646b1d0f0d2c86eb169a13f44663d41539aed9f64c623fa19dcd50d6e8111deb8a720c2ba886209aab2de062245e113526ea30c20406cd1e6e291e0387f8a3830127dddbaa7ece2b291d18d3c17530f9aeafe76b46d651a3e007fd2b5269f5b904087cec54d573b1a61905fc27f91298d971e42c3574c3b413170612d0095469cf9e40221ae13263656032ef21be8096d5df783f48eb5221b2895726aac75f2be82f8b0033ff550522770a985362cba92283898f4e707bc31b3cd3660facd3140d627c54c5726a2795776029dc540d8dc3cbb6c60e2409c8638864e0ee6abeb7340e4e27bd6c6f1f4385fdb21a911fa81881bfb26ea67278fa97fc39e21d2d440a21d99bd43ee26787d5524566e136a56c1db39e00 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000009a2581e011132844ca1f0b1070c7a0c0fbce2a032cf607489d5fd8b654d824601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e656b22da4b1dad3f5793e21a1cf5ba0724691783738f4658b5953796219fb07190ffffffffffffffffc9fe544d78de9957b0a915de2bf769d2d276e3ee2cf801aaeb8a846e269bfcfa424cc9cb435759e6e02f4069b7b505d5dffd13a2ed6aeb1cd2ef1607c4dcad172181bb73009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714af76a8a33e05268da2b0bb21b20967e681f8e6446201f0c575e121d64d680ef86d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17ca84074d0ea221d7736916d76085a7eaa4869c390a68d095be609acd2f7cb1cf019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a5101d40379bed873c44db26cd42aae5f215070b7db2693ee2a51a50283a13180ffffffffffffffff52882685dd4c1de20eb96ae2c4e385154b79e41fbacc2261c66ebd1a38d6e1e44b595f7dae897b9051696817bae8d6452f229747fd0362829dc5414741c32749f9dd3df000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250293634b96de202170b3c5895bd2a510fa2f08ce8cf91598153943332c4650b466185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4e11c5637c1ad421b305a431e600f40411f12f10c49895361230dc733dd606db800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b585d800a4054e4df420484570180e3236ee286ddc5dece823671df03a8583cab6800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cacef056d21f401dad4461c93013192475159f23a98a074b3b3c08c24f48bf39f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861102c16ca7117098bfbfb584443139ee15b47c8ea42eccc88491664a2d9cd0331700f003000000000000a00618c23f00f794da2d5d103c7ec9aaf627f1804ccdd3ca674db377d78f2857d621b583ee73c9278425187aa2daf2bcb252affec307d8c5841ea162323b1a5a51ede3559a050a66f9407cd522482ccbaa54a876b48442828d87e20993ca8407a545144dd3575be57f7bbe3326d6f0befcbadf369088253af7baf2c3c8b6e98998940bc89eebeeca3ce47ac4577afaadaa03ced9ba82787f6848ddf1774aa688cc9c6e2c6b237420758e6fb55182fdd24b8a5c1228d1ba74dcb566355f7f88938df8859fe890cad3e4dfa60722cca8eeeb316de3ac092bc6c238bb3356071d0052c3dde6382401a0d5c67279bf7e7cfeb6ec7f1fa56e95d0b9804f247bee75e487e7b34df117cd1c943bb1868ca9a370d44122f27ba86ae481979faec3c28841b18da581cca325e01cb2c04771318c6b196eeeaef947a2d5f5b96993e693991f55393d1082e34a5d72d771d695efe89281040194c435a50c25202aa6d42ea24f54571303446be85efa0726b3c5687761cebb63157a07ed83097b7a35ffc41577a110f56eb71b67871d95cc4a756f49d82b36f6ffbe9058120168dda68012311c750357254d04b08afec13b113ed10fd885f74360c93a9af3eb18657c0e8231f6d33c5f22fca76914b0231e072ed9f053a6e77facc051398c18d5d7420e498e5c84c8d2916d730436e904e30429b20148450237137b148b631fc5a05aa398e3fe1f0a94780dd196f3763e4d067f7d1f909699419894f187a00d89e0497739d6290831371aa837978a4d4c8af2a340f260bb6b152f5b0535e3538ce81a46dd44db30d92dec9759b33a9e1087850c02013f46caa73d46b6fce4da41a9d9d673c480078560909279bdaecb933e5c9383df14d4e27340a364a3490dc43481eac98ade3cfed11da8936eb5ba0d0e1be54936282a2aebd1837577e51877ed3f08394c44efa28722798b78bae5242d76b04a720fef84356cf34738d038ff6d2cecdd659ed9f53081d73863364b2ec5472e0f17084ad1830fad971777a32303a538ce89ae1081d20f57a7ec878dc3b909e9c21d20bf06c32d824b4e3f8256796e900ca89059d00ffc44d576de905c8f0b675a4f049558508d0f3ac16818029cba5ccc4077aaef94926608f0bd8b712cfc72b5fb382042c1b75bc2237692dd89b2a02a151320cc5d7d07c418ced6aaf4e54dd3135ab005982d9aaaaf1b43b1423cfeded0c11353ab2e30eb3b25c45ec4e0139d2d0dbc7aa45807788f23cd72177de49b8795a377e0d9948c41eb2ef8540eaf5d6232fb2a192a0bf6f33c5ebdddb20460bc2643a38650029b526c7a4db2a39adda30468964cc2615c509f12eb19ba12f7bc4310df0b3fec7b90422c0fbc5f75b00d6ce535f8401e31762fee6c686ed57fd625bceb8d71f137796aa3b2afa3b6104924 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000eceeef74399a91c62525263afd3f8689981c4a4bf71efbedeaad144fb30ec61001e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e656015f9b44a378e9cac02afcdecd3ec7e9f696bcd33ccb567f19faf0e2b45e7acffffffffffffffffc9fe544d78de9957b0a915de5ed9f93b03d4fd008c1f569656b66f47ac498f31cc56d0f7507b8bac78e7420837b6747016cb0078ae3b42f1ace108badfe243cd1905c1cc009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ad204f190b70ae86349aa485dcbc103dcbf2993ec487a2561112436c9376b8823d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f171907cf46a25099a7618ed88f6f2910c41f441c08256e0eb304981a0255dd4673019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa3119211e97d4eafa8a517f04d35998b52a5edb9fbf42ecc9465dd55c37dfa4fffffffffffffffff52882685dd4c1de20eb96ae21d775a55de3ce5f5ff3ca244692cc2503341cd7e754f79cdf412a235bcbba9b8fdd6e0538014ed63e32a374503954c03ac28dc88ee5c92b900593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25049e7d0668f97e92b9965795897e0cbdea53ac8b2d501edec8a4d20f2d2b364636185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a093b4d2625455672b9a41fe27931e6f6302ccb474ac623d2b364f1c04938feb00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b581794f44c8b7d0f33354feba56d66e36afd9acdf43936bcd355a7e289b7ea574700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce59bee83cde35b78db3f76791e9d38eaf5ceafdb2eefa0a212eefa8852f5d5ce4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f8793729016195ae1212cdd7cee31f09536fac75b7f8a6afaf6aff0ea9d1fce700f00300000000000096f2174872f26a721b2c2d5cd25508a442ffde11a0e7345127dbbf12dcd1c33e52bf5675a3723180f5fd2eced76c540fb5cbea84580406a0e9befd1e1bbd9da402c1da0a3146fc90d1566e2ef09c8858c49addcf9a0f1118371b4f6e316bb237b84fe90bdfcc0c2f13c5b32082bdf5c41f71b502d090511a55cc37883bdf51ed002569b2e3532c863db418fb3610c8e889f699c8c3bd70b2893e1dd196852a63e731b29b378c8cedee60b9250f59b86ab9624cf7d77848ce35e64ee2fe58919f96ccd4bfe635ed9d20c8f1a6f68685f59c373f1f758f4554580f3d57edf7292bead0805f57e52c053e58aa467a5a93cd90d2508c7a7ef4875f0d84976ad4ccc21a6f7c6a73391a16c89f21ad088ba0f8b01b54461928a3bc367c6eac2f38e23087e3dcec3a8f14653ec28e6e38a2bdca4de5cc2ad088d2e7251b66a3ec32c8acc866bbd5885f5cf9db00e7a2be448acaa7a15d7eab6d941396c08aec1a4e0b87c2491b66043484ca292733e38008638c9fee74df841d485ed33548a46df85e698c4fb74c1197e1ab77c4b03c6fdafea86b7240f2c0cfaf9b1625b9e21ba2db3da9c96bba8eed4dbaf032e9befbf71e71ac5fd8b80d1416de233ba6a4926c432e3e4ae746255121546ffa3d9e8dfe911f34de5cacee8b7ae70c58ad70c3127d0ab7c65c613ae74ae16b82523f3cd28fb2d1e5f5f0c74794724db0d609290d70646ceae0f270ed76c7608c1ffaf0361b7c68c4649ae9ce648ddbbb440cf743f4fb2c1852f14cd620e58f387d5dea43e35492d3d391b6ad652a361362f50fc5bffc8247e78333af5b982b585a1101de80584110e7415c70e89028514b6cf2eee695a8ec518779722fd04c501bf2e64201002e679828e4c7104bd6c29c807d04811663a87961526f4bb044f077b7510e04160145066eb4234b83490a34107796a5e3f2ccfa6b8870eaccedbbfcccc9d34925f82cb08b578e9aa3105b12786c0a372492264bee9b53e8b1ef2cbe15aa10a55e2d8706891a1acdbdb352505f385f570fa8e36dcc228106b11cefa882058edb27d99cda1b388e76224da368e7efcf67f92a1409f75a4adc50762f7c9a4e0e3c02bd706c4e63a612cc752cd257f31faee53a352633e751f3b6caa9b57357e02514655b7b67809ecbb5770164543d41f5b619f48d636f03662c5a49a0281343dc026c1d9224ad3e0a1e45114a9dd9baec3c8c8b726f6a6258014173d15ef24e3827cd7cf55dea83f7d47cef0da6b9ec3183d7ad06266c5ef8a1f04dd3f3a26b1a3a7de56fbe3c61f2421f95c061f0cb471037e6fcdde46da55aa08e77321b822b2aaca58a786002252497c2a9fbd1739a001948478033a8754a1dbd23b507fad11715819fdd15beaa455d46dae71f77215a778f6aa29f850919b137e4fa3de90a2e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000062d5f6845853e71040e237da6db721d5d3a389f15c8481423cad9d504d776d2e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e658bf6be5e1de6960af721f9121c85fd677e97f7fd2068085b67da631188f86967ffffffffffffffffc9fe544d78de9957b0a915dedd2c21da2601dd93c4af95258eeaa8953029b41788e796d01ac2979c29a95cdda2a52743484be10486db5d845a97ea4cb6afb6c9e633b2a1009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a0dbd06d4ab578af2159f126e0cc703b3610d4a18d25914bdf35bfd3cfbbff487d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17a02f6590b0999a542f384a7bbe575658ab436de07280b5afe2aeca73eb417d5f019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a85080b746df6f2f245b47e3c31aeeb97000e1fb9772567ad8cd50c97709263aeffffffffffffffff52882685dd4c1de20eb96ae2acb67cb0a0aeba6e8a53caccc481e38e9b411923d2cc02d18d443a51169a6804b838f33b0d119568b0998cc746457d5706daf9a2ff4018a300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2500837b16a9277c263e828fb9fb0ba2f6857cae7f82f9c0917d555cd98ebb584d66185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b41e9ab77eee9d65099db404b8e31bbe428660b7a8ac2c945481442b96fb3fc8ea00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b582c4573100218648c27c55cd4041193c3d1b92425ddb31266290136c437e05b0800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c8799cec4d5a4a9aefcd04c15bd5ac7026df051df755c4810064a451dae4def4b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e793cce57aaf3d4bb10fe3077684bb9a1760b0f4d0bd808567188da226588ba800f003000000000000a155abb50f9ec61d8a03f60c618cf401143fb577f294d2ba2cc44dfd7f862f7fb65758dbd2b5c63bde04686ddf637613b68cde235d03f7637bee06e228418efc1e89dc30bdbc313cc6f1daed9d7980396d142508c9d10adf83619056a7f136bdac825dff040a5d432b192677a7755b5d4b4e68107f5d95ea5d9ab8b01680b1a026f1a7b52f269662288371432f8628d8b81a59dd2e223a951ac184a658062c8f596c0d9155a1fae0864a136b4030af0d047f73056871dc143adce79a6ab2cecbb3ebf77ba811e8062d5ca4106aedc916a79e01051d22e76c87dec6490987f7de40ad842cd282d3c9ccc8b393ffba8203b15d5a2e3dd3dd9bf800605367cc04b90052fd61ccc9fab78348d880a459762e5b37f30a738b21c39e81cdc258427c46a8cd57904577f2b064da4af0825e019c4fd5ea314da35e090cd1cc7a2bce0a3851cef88d3bf05489103316cf7c6f5a61adb3b7c94e684ec0e27c0df928d51672253d3017694701501598016b978d8e7af5618874ff5e1e11985d47f3d6f19c398b0de27281739e1b2a76f5be704c016a715d0325f9a8accc97f809e07eb9cbf04e5ca6afad778a5555f898a0911ad9768353eda8a486ff2bca1f858aa25a5696953f55cebd79750d1b33a4711773fa036939d610cdec75641d9f39ee85fd5b4081fedf10d5e5305f090a964dbe13c0abd7b047e69631be59f3285cf50760d6426edfee0e843dcd35a8d04be805d48fa7022c663d8ff62b30a9cdfb2fd42ca7bf10747918e3ecf818fbf645627d15994ea559f662be40e6a854d7bdcc99e283aaa94744a1fd781d218dce2a2c1fc33d3e882953a86170d2178ef646554d37cc950c5997d4b9937fffff69aaeae09ea9211fe4c8eac292332fe58bbf224b2bb180a27deb980eda55933df5ba9ee3efdd61d2aede1c7f317f81211684b69f403ad4532ef38de8a88bd13bf312cb797c6d3e18f401cabb8dab506974350b90ecd198d013838c882dedadeb4824d70cd9f85cde5b6072afc96dc7ce9375a0e83b466280bddaf102829a1b4e97de6d0b58932d1fcf7942a7398bab547727bcf0b61551dcfe701a33e7e93bef0e589a97df8605790951d8bfe5056d082c178cf9405cbc2b0ce2c06a5ad393135405ab75d15d46d4dbb761a941fb7a8cf074989c309ce087034c61d4608392eeaa5806f1242e5e313992ceca37bf83334bfa922b795576e0469d0cec8c3ff13026a45bfb18040591115bfa9a8c3dd9b4201da35bafbe1535614b568e340e7611d83f8363c1dc72c2b1bedcf79cfa3338126e2ae31ec0bc15d979cb7e2158f6c9cb019ba346b16e58cec8bd7ed4f6b87f87de9a8266dcafc17a49baf9383f452ba8b27f884d182178a6c2686038e97e4a3dec3792a097334c11ce4444f0dc28c0769d329b799419 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000078cc35a9a65651d1a9eb5eec2ec933dcfb05f340a226fccba402e8ce28d9a52301e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65f6bc0fdb1a74f8e198a0bce7d26190c6c9dce4e3109fe1c934148f1ea98b679cffffffffffffffffc9fe544d78de9957b0a915decc0bc26f8c6125990b50c68aec36e40e94ac4559099bc549cd5945cda398c42eb3b165496cce29d92567ca78c09a60494b61a24d90c602ea009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714add8f26e89860a3f27b3bde9912d18c91b5ea56ca3525ddfa7eeab1b9b916efe3d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17426f6c20bbf4df03e94769aacaf9f9e39c9d2325e0332562666e25f86933ebf1019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75afbf8dd35960188955b4fce368d31cfcdc615e14b49d8dee6cb4245cb1d47323bffffffffffffffff52882685dd4c1de20eb96ae251b1757e842fbe903c73ea60d4f98118b998dba15d4fc5bf751dc40f751d43c0bfb7119b89fa1ecea029c6dd22506ac52d2ba412400aefb500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250852c1d38f437dbe29ad78c3eb168141393d362f48062fcde0529c2d53b5b99aa6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49a482e69f263d4a33c519d0e2a03fb818ecaa7a02b22075ce93a8f1f9d460bb800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b580a5fb0276be7fb51a7d7f75c6df2544c86665207db4eab4afa8a6eddbf9974d400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ccc5e3c295f3d8f68be10dc7810da0537bcb78e280596ac4da84cd543fa8db5864bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611609b2686811eff32673333535ccf21acae88f29d33839468dda4d5acd78dc72a00f003000000000000b1f8ccfbf069cc2f96c6bd63ae14f86fa2e1578608b7772798d0b6ba8e0a6ac523af441be80055839f8cf2a3d4202ddaa044d2ed8f52243eefea6fef6c692fe9db4ec99cd12a3f5ce1d8ddae54bf4b5ec527884bad12e94cbafbba70ac378045b5cb411342c45dfba8c9fd3cdbf79ddc495c88c4e9ee9380ec26d03521c258fb770622a837e67004100b14a7e56bf17781cc8eb41749b95a81c2aeb4d1c8c25f4ec20b64aa2ef56f64c8ffa6d4d34921d3357aa0044df4bc2e894e39112dcfec8d0817f979123a833e32a2e496edf4159302e1825ee8ec68aca7529a008bda74a4f70d88e7b1d2de5e7e0421772667bdae657a6d98eb421c0cf57a9868804c6cacb8bc25f1b4c0dbfd18afabcd2d16eb8016ee4b12073b532e3b7f8c6a4c5d48a9e6eb1fae099ce0ef5cd8820f1dd9c17166327b3bb0c5968fac3548a91b8ff5ee74c2e73610a4f199dfef78062f8072b15c4e7bb410c8a9aeed83cde3184544d446d2eb3bbfd6b68bb8e6c71a1d53c609266f20f38c03d5a37893577362bbbab46b3cf18178dc016c31c102fe8439a541263ceff0d7059c267e3533184df3a80901db7810c68a69d611c221f72f3a0bae9abf29939035f97fbd6ed672c224d64bee75772f35c55cb7ed6547f18c5a93d6bf1f736e16d47f538e8d39776bd3a097288ec96509b81ce3bfae6c3f7056995f9309ce304277b6d72a8747a01169e20d9862dfbc282b5d6e30da03f2c1aa4c094a3aa45145b5a9556dd3dd5c5993c0f782fc1da540aa9158bd7c67ec3d785cab7531546bce44fc383b12ab31546d1d60b561aa3f7399716475af395f0e7b318e0e1c0632bcac00cf575cc4c9978fc141313e265ff8ad1e4f30c0dd2aef2c12f9c8d366b6c596ba8d20c9c72e5cffb999afb286e2e5688b6021576f54a6221f332c2346b882fa9ff5153a7c03f6e9bd35d55130ec0c639442a9c8c106f09c12741ea69326df5c9af28c4ddb54f724e3c1cd94a2701a385c4706016e76f9d22a5b52f534aff2d3bb101a72e131f7e3c611dc179a05b33cea71381e338be4c812e466b34758950f08b1162f2a9dc7c6ceaf25d2f44d6c472bf9926681593fbd5b8914593677801d0e52b11ea5e186740cc32d2aeb94e1f4c6759c038a26d5e001155f82738569e1f2776c59844f8c7f304da7ac6ba8fd6b7b632a5f77900d795ecfd9e4dde80735943972277c8a5e321a9bc6a11388f9c3d357590ba7bac4a7091d952c55781010fa81f74c6013a267b6bfb3c442c06defc16b5d045a089ce7595024df5510592d6fd6e0e9682698337eab4451880cf3784faa0ac8234d20ed2fb51d4f2a412d988145ce96768d5516effc41f94d1d19490a57fdf9c7d8e47050c40cb2126ccde720f33e94bfa5fc1a989129f70d312060fc221e6768d958b917 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000df277999c5992b7d7fc5b336a348b67984da0ef3de5d564d3a11ed587004ff4301e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e659119e8c253b0c3b9477820cafe4bdffb114c453cf2cf62e227d1cd69d967a4c6ffffffffffffffffc9fe544d78de9957b0a915dec4ced46a5dd25dbd53a3fe500838ab869fb5018f97ccd439f3b217d0bdba02fbf4b74ae66ee67b5912736c3aaa204d44fe417cdea17d15f4009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aed941bed7b3ac5a5271c1911b458cb6045d1a226a69a64813ae13319896e2701d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f175f49247dcba3f1583919d82f961c1f72d4d0cc119a65b47b39459e63a409c014019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1d4b6f43aa4757cfddc19451d7a0ef04bbad74f62a52a574d1b0b0b7f2a8e381ffffffffffffffff52882685dd4c1de20eb96ae20e2c9ffa890a01d3c7776f922d7d9df3ffa37b30f0fe29ae9250d8996a0c3e09376ac15debe6dcaf7e6506bfbae8f396d14b39dd447f023500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2502f7df65e388d3b1f153a6b6d24b4be993c1ae5380a4f0592f6922d0a47dbd6506185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4e96cbb0d4d506286b93d6801a807cb7d8794d7301f53754c0d9579c01845008700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58aec95f47f9dca6e02b68413211781c3e896b74fc2f9c99a8d695709797add63a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3758656887bc5ac20e7e0ad992527c61f087d7dc58eb8659fbf846fe5b9085114bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611aad3c4990e7e2d89a874a07ddb7f19357a2deb862973b1bc15a918b15965b86800f003000000000000a25feb52ea79e1a3e4f9081a69ff329d943752f88cbb4987f0fdf82965e53436ba962cdda6da1d4dbdd100f19735708c817e0a2a5c9690f28e61e7093e0ae20386fc25f6dd7759f23de9468211e45dc28de347a9cc287203126e80eaf829838497c928c540497052ae16c98a8e17ef3543caf83b806435f62704b3c6f6843dad4efae15b36dbf49003e548653b248d1ea8e009310557eb181f7fbea96570c6dfd45a6eba2ce808fd8d1b393a8876023d11bc94151db2e52fdd32e864543a5b88aca3a02e041e7e0f8fd45f2fff54d3502e018f00cfd0caf9c407e2cf8314e69bf1cb180b89ae936df0b67ec4d4d3a5b5b53a1372f39a0a8084dc8d1ce3f31080593706418ca579fa5fb8fb7aed1e1e41a71f212cf73f8d215d66460db3e5ccafa1c164973b99cde86d6ed6d38b12375f326bbd3cdd3163dc5932a5662006901de8757f1224b2d961f7c4f3f82ce3c8da889bd0db5930a3dec343d5a32b63b15cc1e53e29eeb189c5466dc9e10314053c90d8f69573f79db5c84cda169e99df3da0db0bb6e2c6aa7d2c2cc7769f94651651c55559af1e6dfff558713fd85163bcf3b2a29fce6250dc99562944860a99eea1daf030aca388c72345f20f00586d83d4f1ec5d25dfd24cf403d3fffb6ad9a1a5257bf196318ac76f230308684a169a91afad62e725ec0746701e65602aeed72ab45f63aa9a206f8c2634f654ae5e6565ee40bdf458a0931576817e85530c7464dc7332cfc5a1d02034f15198f99fa0520a859b6540d3fc39238df8fa95ce6e0381865a1bc4d3b21594ad9a3da71ad0667828f4615162324abe9f14520ff45f5f84b722556540395034685b5f566aeb0a4575aff3b28b9aa369c33042321703eaf052b715ed4f8058f7bbcbddd9092e0025fe370c61cd2cfc506740faa706090cbf2d70c0076027ca2a8de442222428309a7d54c2fbbed00ee6a854daf15a0794114220b74e7d01485b697e478f146592789a7a65dd6330df996b1bae61952d9f2f42ea9afc3307d0a6cb35fbe6608a76bcca7ff5b37ba0b1202eb7dff20d4907d0aa24aa0292fe51ae2b9356c399dbb5a4e8332cbc83d3d6d7c79fb6507b3bc08b500863c885b446421dfcf18fada6d8842ab374080445d2a2090c6d56fb669567476f8756a748e0a2d06a54d3b3b080f17f81c69e1927dfd41ed59c9b7c6aba46d3fb75effc34a49243e41a21159667b7e5c8e23b9f6f51af7adffc4d01358d2b8f33828aac7af940ab809a998f4b3be8f1ea97e5ddafb81be581919ed02e56cb528ffaa4305829c3783731ade929c3b2b7e86b5406499edca9c249f71715c602fb5556ac1debc4b55e6b728b0a622a7fd48abb4be3290d643a5f71f8f45f024048f876afe83c4737260f4584d6426af8abafe0fab12d96c3393972bef62b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000005fc2f2496d3562e7c286e13a03514891706c63c65962dae1830ca494946c191701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65581e5c51c7a541a6b8606add131aab278b02a4d919909ac26cbb5aa5319aa384ffffffffffffffffc9fe544d78de9957b0a915de7c401e1de48c3a6f377f45b2b0b7ddd983d16becc754709ee4c20bee891c226e38be2cff4f3762c456198f185ff833c992e189de1560a1c6009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ae221d61965029490f606368e0e306b614ddf1645a1ce1082942ea0fab764d4f3d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17a3bb8b4d1969c1ca46e8d8c8201f71fb3bb7bb7064f11aa314277003a58b9558019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a9eb5f6d889d2e176002314e94f4babad50de34f9b4ba513209bf5876d8e8ab2fffffffffffffffff52882685dd4c1de20eb96ae24d88c13493d491ea72e1ab14b3d26fc48c3331792c2b6218d881e7959d3958279b0c3ea6a411378a0be115930b4e6f05238a4255c30dfd3000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2501948f133890b5fe81a2537c03cb21792e74c0dedab8d7f376ad15a20252168a16185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4c9ebe9a158ee322dce8adbabddbe20462af60e1c0b0fe34c5259bf056610b59400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5877ee9d91da31889310e9b3986ac21a4fab4a1063ca2fc7c13459372bf8ce2a2000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c164424605c2154d5211f0d2127a09c0da67ea37e9f97e4b25f2b90740d4566894bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611a6d8466c9dece3ecda780ab4c1b568861fb34704204987466e75c5e36343c39a00f00300000000000093e2668c5d255591eeb6ccef07bafe177132d25440d74e8fb35790065f545150ed73b774fe27e719ace40e40a1128cf4ad2ee1f4b2ae6d2afd5c5b5994e7bace38e3c7486e26645891d5da74a7069f4a3e18237d8577b01fa4d25ce7cccc73bc853dfbcaf56df5380bbfa389362c6a29c4affcaa745e0ab3306dce6553322e7c2a4651447cfa8da9c2a8c8b579002e4390ce438b156e3f37e02f4354bce4b38613b18a87bc23f100be77ec169fe73da5c7c578587f7e809e53b9fb7ebeb4e05ca7648ad7c61cf343934ed38d21093a6b1aca951fc286943229be2f37f1991ea4c3c0dae7b38210a87195de9558058529aa5b8448294caa469f6a19b5899a08529767ab01cf4ca7339e0c1047a49fde5d4409abc3a2804d1fd7eebf4c40b1c3af8e7ffe62fa4a1ec508fd69ee33294156f456dae39b791c71ac246d2046d04b7fd725d76423bd0844ff72ca7fd6c74b858b8948adad1527223d80a39f53390a6b39891c5ad142554e68a432a2af46ae02a8489876616a4f5a407551bdc84408b4a825803467061b7afe7c995bff4291038bf5f987a1df36e87ac9de51ce69770d674d576800bd08bb7916a35db0b91cfd8ed550fbfc4e6bc26f185c3ffa94d1ea0f00639b3fd17319aaaf72369b7e45b303f20e8a5d3a2fc6b08171a88c2e5bfda7751490b16b36dea8d5feb02de551b3efba0dff3ad5cf1a9e4ee2464af94384639159d55cc09767e64b498ea1f41141dd1447919e8d5cac4c8a72e81a3a1830c611b6258a8b101e9432cf814d67cd233d87509fae07c4e4e77c4a9181c8f3876c4e47cf646efc134fccff5457a4c73d5feb136de626d74764b94193fbf07920e0976baf34822d689ffaebb8a159ef6ffaa23652c235b9073a6487eb8e1a0b914ac46682b557d4e349a0543f790eec58984014b14ee778bb789040092c170290ec23c6261d1f9ae365bafa9d8a10783afb8ca947311fe48f77fc272c533783e9bda4e61f0a830d73ac6fcd82f67ee85466e820e988e2b27fd2c519c39470a9ae750671cbb71bb6d1ce07f09cc547865ccf22a61cd7eeded58253c9bdd462ed18a9bda64fea6451aa57561fd620ee54057f22fa089bd4308fbef64f914527f7a2dba40a2c6a4c6690d3f118278f2ba35f5d3f9a71e3cd2c59d046021ca68bfbad3fb8d9676135b72e6d50e244fcae8029ab7e58c4fd5d2fe1624b982e0afc7f6319cabf8eb03f84c79be7c6e7f458295aba5f7336cf541732218e98ecd7eff405aeafd44a6b7a9bee6d55d07785ec84294b252d7b0a28408cc2a68355b7cbf8c935322abea409ee5d9d75186226f2e66c5833496b3c796eb370ba5ecc765114d1aff79b61c0549dbd4f343b966125aa7210b934627a50e798c7fbd29343bee202a3e7409548f48be4a4518c18a2173d4e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a7f320e0957739638dba494335097471bd64f6751be50386c8c5b7ad66656d1401e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e656a132a59f37d46778914155967df50ff3fbfb96dd4b8dee635038ba8c9a7ed91ffffffffffffffffc9fe544d78de9957b0a915de81b856dd3811ea4ec311be69e8df45ff9a0d0b2a85d90fb973f378882d83ceaead37e65c75b4deb3119639601009e59559a4c19137276d78009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a935a9523f30283b7ae4da18eacdcd6f8404d94990b8d6c7d61bf17fe34592605d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c2830dd6f4f7469047331846fe140eb75ad3099928464306e49dcdb793284fcd019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aacfbbb211342df2611d94a6b110a06d938eb51398c08d245989ff8c995d83c39ffffffffffffffff52882685dd4c1de20eb96ae286263fd7e28e0bcb86934775c02dd43ad2ddb49ebbe6a2fafce5f2742ddcd909fab91b4014758fc72bc264a0aa00d4695118126bcd59b6c400593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250436b11c809294f590e86c52d398e1ab780815264e4ae3b36887252805c47609d6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b44cce4744f75aa0b49e233fc3df06c3ee1068df32f31b4155dae8f82f395fe21a00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b585000b4d887249738c342781cba505df18e414a1074399a677bd3e178763608cf00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5c73965b0bf7a7a5f95358378eb0a60ed4dc9c1030d0fbdddff40abc02b62fc94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611467df5cf3dde34446c37fec259e541ac3af55e4555a7ad8763cd9c1bc3dfa1ef00f003000000000000a09e544b44d20925713ef1bb09fe5eaec80ba851c904f505593ce0f21c5b3af35baa679a2747a85bb1c5d2e94538acdbb20c28564e163e622ec12ba850f92d7013f6d0b469ab454d04993d9b499842a2316dc5d2d92c6c9f230310e02fcf22be8d9bf0550b2f496f97175d168d29231e12e83d72590722abbea2fd0fe9c669d0628ee40983b986a3097097cc3c8e4d85a23a1cdaf59b562c859145ff44a98762aa8cc31f7b5a1480fafa72b2accd0ef9ff2b7fd35907798887654effbc102946a8d6b46196508c607e95169448bb68929429b18142e1975c3986894ffcfe855888d0d317fce7dabf65cb8bdedac7b6df91bc5a1f7d5a9a1575cfe32d7eb5a1386685ca7d63b27ab62c522163eb6fb6472251a9fd4ab8965c0432d59bd79f61508196df0b081c81039a412a029e28c9f84621e80b3b14b5c08d8a1dc6773a032bc1cc1fe19d774ab8a3e1385810904cec947ab73cd9bd6ee636201c387b8c53aa7e81845d12d597f32d96741f404b863edd382cc031f6442e94d458fd44e862b1b7b9f6e5d1864fc133be430bc3f79fff377ee4cf748cc699f4c0641525b9ae741ce9551f58c54f34557634da5dbc5eb699db4a9a6d3ea04d396b655ab67ed9b10265544958eac4e52846122d81ef5d8009c70b01564660cf165a0782c0c9746788035960c0e1d8753d0a89d73d307a753c7090c713a1c6ec6471a55132e0e5cf6e222e0d1e9ad43e09eecf789029f42574c504db23a2380334346d5b9b18d5de2dd99a1df1d4f427e2002357c7ed08082e0d07aa47fd7c1ac1b21ec10557b8f04701788985049036878980ee273541534d7c0f61c9b19113dc8f8edda506d03eb06e06682891c45027972f0effdd506cef7407739dd29f91a97c5d60c1fe85e559a00a643713f72b7c202718c0625c2a9430967c904d6370414a954d6b4ea66eeb9d9685ee70b13be3ea72677632cd44936be42da000e79c20da18089cb1cfa0450bfed966bdd9ee8e6c16a8ecfcd31e38d209e75a58d46200ec908a238f5f4c6b6aabb19f52bec4b6ff28ef0e11b20685f05ffe1c29593dd0bbea9723bf39c9e7662e930b6244053ad410dac20b12408c45c9dfe10ce812f757e40a7dbc8aa694006c4998b9a2d0be0e65425e3a4a71c41cb80f83de95b32310cb20cd80b219a5ace55adf98b109a18ce486f6aa886990a712271799f3a6240e26468a3df95d98fd5e91529735140e5c7d0b6053fe287e476330dc9e7da6f84e50b523b901d7e0f832ad1a83640cf6665fdc4dc46039ae5ff3498a3892eeff0b613cc0aec56814ac14ee9d2d6680dbbb2c21d6c5d74cffd4084f64cd4ca6b7ce203cfbe181498da2f1084d498583258471e108eaf606b6911f57a1ca7a183f98ac73d86ddaffc2279eae7cf0cc5cd6b263176e161966 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000056577105b96251c45afda4499caf5f809c2f606b4ddb3151ea49686a0c93f52d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6516a9c06a72a5d09fd3c540204ddfee0562675fb4e93acade2a46f6ebc7d1b49affffffffffffffffc9fe544d78de9957b0a915dece59ebd56b19a792f05fab94992a75f6fc4f4f0de2c628ccdaea9deaf446f1143f0f839b5502da1f18cf49a879d6cdab92aeaccad3ee34c0009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aa776f9e46ef74a124edc0c22200a3e97ff6fdf5af336989add890940c706a719d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17849ee2e01ea2f4bf391c8346a247888e680fa70c436172949ce97e6868af8f41019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a0e0958af8d45de3da0d59bb6d4900130b672b24342a7437b13b8b116fb4977b9ffffffffffffffff52882685dd4c1de20eb96ae2484f7ae6ff21a45bdaf20269957e07412fdc2f10d15fe52290a7e90a1b27e60d400d303cc04b131508119a95d620bc70076e481cbd0e7b3100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250d603e1fd892fd55c98d9da223f9bed2a6e6a273d85a0356b89ed1b5cde5929656185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4254df28bb67505be84381edc3c5f1b0b1b02d5259d890c7b2b87c27202228cc300e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b588cd10adb9d2610ffc76acb7c364a3aea1d3378c8498505f359423d252b48d7d300b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfc18d907f6fec13d03c44c6ea16222c720b8dc6ace7687d65264fd08bd1c2fa84bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086117184f2f5123043a3e969bf91a1f6e7a1c4e962336787bf7744b288e7e9cccb6500f00300000000000093cda414c719881688e7143c105990251159af4aa7b385f8210d0a5443011819592cae9f9984abc21ffe7c6d32527616aa71f2104d656201aaf11dc8aed94fa3dc71f73007ee972a20f82765d8069c4c8e05bbb52cb1d677be3471cb2d037c0190ce8d784e1ed886e92a1b2ff2cd9d3838c7a229492011a7454ef62437b062937ca5f30d3f589fb985024534de80714b81361db93bc9aeffc949e9256895b6bcfdb91de904fd91fa27ad0ae17df67d78734a44ed979f978e4c911f1cb3a0004e8923fbae047fe4c6904dcf45a53cb4bd31b8ead37002b75459e148d7ceec4d55323a93d400e931918c1af74938377871b1c9c13fadbd418ff3d8cabbb294f0e9fb6d3b73b1523f2ed304b27bb40d3a1705db0fd4c893158c38b7e4d13d359a7db302d8c5cdcce510269a4f50d1dcdfff05abc6ebb4664e1bab6cf04683a619c252bd0509104b498d7fe657156f6ab0e39705a9f05152f5b0105683fefae250056ef82ae481fbd8274811a09641f9f01b3f98651312a4e75171305470105665c98a3f1472a2f160ba6fbcb0b94b6086672f9994347c9a3bf3b74cdfb19f441b96779989f30f7a50ab771c443f01a44232935fb8bc10c201c68a9eae495c8adb809a96622c208fdeffa7e06b67678c2e001ebfe748e68d3ed59eb231756ded291da0d2911d2e499f34f95c5a984f8b7b746d86ab4935f78d381015efefc38d62191f20b1d9c2e1b403819fad001e493e212d412cf0b24683ea59d1c4df322e9a2b1ef5004ab7f1e8c82b65c1c0ffd1c102bf9ea2b57993821bfe218a4e5ea2b83839bb300c8bf933e0ad63f73a6eb8c74515a6eb44b8b6d2262d95b232e1419b9b053b23f8759e48cf1cd70fe42d9b333c795827102c54c62319e5a71908b53c76ccee8decda4abe1b1dd9c309d56fe754750bae0281c3e5cc59523f998be7b5cc1cadafdbdcbc5cd5a4896c5fb830311e373d4dcb9d1d5549da3a454c5ec239e07765d9bac5d7223d26e04eacc1b72a4a35e6b1b1596fefd646aab44931d3d933d887ac893751659bb83768cc4e6a772629efb02113711be0e071bc795bfa1096079e19005800d6b9f57d07feb1330e72e68267c97ed1ee9371c95201fe95d4d9f68ac5922d98ae873e513896c4a10273d751ed67c76bd9ffbf46ab18404098ef618e78688412f9fbcd823718f9b7733b6f4b8e6238e290992a641b72234f9ed879e1df57154867d696a72b406a075250bef3e05e5083f9996481a241a6b50263445b117541179eed76d5bab7bf80913dadea72e3284fe73144076a766b93c595c37fd1642ae702774f2e615fd262c94bb6772f4edc2bc9acf2352eda5bf5921a30e6ec8740965d8b8060cc7bc9b99371f39944b97f65d4a35ca2315ca555cf764f18f5a486436f97cbf62d240e056144 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b52eaa07fd2a963f79fee6ef9d212e137c7c29575bf651999723a905ff02d70f01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657c4aef0850ef39e3822bde435f264c33bd80108b22981cbd1f5c472056be08a0ffffffffffffffffc9fe544d78de9957b0a915de32a80a86e486a3fbffe1b496c6fe1d9a6777085c67e968de97f17264fe8d26a372f85acf1f5f3e64913837db85d480503d5ce03477ca3ab2009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a6c08f150650bf0cf4892c73b4b29fa48146542e9a815afe4680aabb2f63eb0add85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17fd8b7e01665a26228f6535267c5a32e9d085365b472eb5b2087828577924c433019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a2834a9a4985fcd18e46a2cb9e8e473d592143bb22ffea543a522f278d20bc0c5ffffffffffffffff52882685dd4c1de20eb96ae212853b5ac5f59685e2cfdd9cd113d54ea719cc8ba2a7e53d2e9ab69bc23a8b4d2a0f627b3a65df087d142d7066674a01f13b72b316725c7000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2509a6c6201a6f197fc50d123ea190a020d895308f43bb69838fe0a6769e6b80a346185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4e586981e67a0f9e568df41762802386a89759431ce5a97824420ce13ed2f2e3700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58c18074a0d07c1ac71b9a755c167109cef90d59ad4360b03d50e228518ed3112500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca5e266bb826d958d93f691ec999a92a3019dabd02f62ed8b0a5721d81f11d3be4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e7c8de91fd33ccd088e06a286e17435bffb95a0a31b575afc2d851ecc4d9942f00f0030000000000008bfa83a3e388c338d6676743f89fa6beab3db250e0be96ab105aea90e158f71ee0d3aea980d91bae5cddf8f45c0984209741d88f0523199f40750d18bb544c5edc03e0f36e5e6142cfab809fe2a9684fcb31580285e4ea771dec20e1788a671aab17c5d1978cee7b5da32c4eb1c8a6dfbe76144229ff5756ced95154663cbf39ca57180c053cf74666302269a4c11cb49891d6db3a0be909fadc07c92e096b998b1dcc1decb7061410716fd3ab023fe07578b5435138865efc4dee76450b8fd4b3a6e57b3d35dc9643597f47af126500b4dcd99bc4466a345ed79d02d3310f3477fd991c09ab5ab19aed1a452bcfc5d98934b9c9f0f56611056260b251f683b5af0d9bc5d13d50fa60f16e09b266779a4d23b592e3d61839d0d0f233a1c4d8968d5e766a89a9dc93945175b64ac8ac477c6b32f54969d0b330de7816c2f2b28b38221e27c421178be8903ed85652df2da5f39bcd6a6840b43211dd522a0ff5e7d2d549d1ad1cacd0da7d8b37b6def20b20e19852814a5dbef9480a33d2ead68eb2960bcfb7b6146fd39e7bcfdca9419df82a72aa2aa90ef076edd228da1d7e805ceab2cf2999dd3f71903597adc644f889e1e1cb3cd8376a4a11040d8538a977924511847b57105a6aefa7278206009d498b5032dd2a8ec0b60038a25049b15d913ac88f95595e038ff561fd2dd46c3f5a755cbc62ec25b9a98e4b65ea8ef1b5c2223388098ff0edb29ef9b3b911a128f68a6b9557ac0371390c738ac453c253cef652b836711d84216773620a49cd6d0e007ad9dc081148b5dc3813783c2582209d675c9b3c06ddf353eb5fc6b13e52e4f0303300a970852b592acfd54e67b30cb7d0311cba8994c3dfe299de55f8288e1dadbd28f0583a28db605b8e0f9157750faa870eabc81c72042c50d64f391c62aa6bcec3c991c65e50375385dd6623abb499851593d258f2c51c9e8b76e22ca20b54278b9d7013093eef7dd84be308cb1a9642fc1c2e4ce0d0fe8bcfd93a71715e3845bf34f8f8a24e7249a44ae596bec30ccafe62e3f4f69d6e2c669191456babebf34592e242c182326db975311763aaafb17d197446126814fa972ae203a7e5e0e981b5b0120639004d3dc02b1a5d769eaf6a93dfc457acdb2ed9b5a5645c971b3891c5a725be36cd3af1fbc7470d072afaf8de776ceeaba9aa5bea3f71964c004ecc029ab02a6b7d1b0d50d6888086ed0fd0f9ed10007ff80ed7ad3e1d859ec32842871f6259ad865b02a76e6dc09caaca23f6eb7149c856e0395d26445c519f0b9d6c431d306d00212adcea407216884350c6c4479be9965a66183239131cd853c1ae7bf39123887d07fae88111e3146dc357f47baeee9b4c31bc302836d4de5dd9734d4d14c24fed091d5841d1d009c3f3c5fb3688ef5c1dfafced68 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000066f8594874e78605cd363fd20374d10cc42995a16fbdcf8f65171e2995e344c01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657781298bd0ca91607f3b66c73c682dff0364575d99a5597fad4dcd813dadaa5bffffffffffffffffc9fe544d78de9957b0a915de58346d50594df5db6cbb60f4c1beb0ceaecb483a9b055fccbacd22abcdcba5a6a9eb39dd034aaca247e21d371bd9162de9defe744ae977d1009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a2ce3ade6846d318605b6e64e962ea236c2e7b2e00119ba40cfc6b8b1ea13a6abd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c2813729ecfae0e490767b1e9bc3af6231c0b2ddc7985a4c99fd83cdca98c013019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aecf5768a02bbd4321dd84cef301e9c0fe9903d6e6dfe2c2602a70463427a24c0ffffffffffffffff52882685dd4c1de20eb96ae2946f1833b8f7abace3fae640fe8a2716077bf50dba52de18b050324b7449fe928fd1afd9bb330d4ad7e72f53676087936aff8e5800c49e5600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250b5cc507cd1aff6f975fb41b04f07be451fa9a7fc59c0a60972bae96797b673336185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b457a7ce006a80f1996395382a7d2b7a8ceebd4c9c1bb3ab6506e574992f24031e00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b585c788e58547f3ac1e3fd6ae773902d1e1284cdae29799ec63f23ce28a2834ac700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cd775d61c9e1fccc6f090a5c6173545526bf77257b6e6414512686dfa957176624bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118559a99f7d29b9dbd3ec40d5515fdc1886bf60e0ef2b5a75c5a3289095ce65ab00f003000000000000a60ab814aac02aa9091e422a987de934aa7d780fc7f1cadfd8e24fff2179d632b27670761ccbc67da097c6190e749ccda27d88b14d2123b7fc3e4e2b9876c89af3ea8357cd5aca1f3f65fae3708cdff77b968d20de96c5acfd7b2b11f3ec61d092e3b5b23043068ed626c3d082cd9c3195334b68a842ffecfea1b7a2cb33961cd66e135828c2212550294137ac89d79bab65d1262b02d13ee4ec5369fc21833a8189a37fe5345bde4a8ec6ab9a66a02f95ad54e5e25f00d50af4a937e2c95063b2ccfad0ec719a0f29b2c1ce834d2ab8399a772aafdc761d913f9c41fc02a394fe458ba80f4f16c6ff7c14320ec9a600a0dad0554e41d1978eb1027f8646f8ff2ea37dbf7d4d4735db7786f48e5c580dec33c77180dbbf19bd49275f45f28c6aabfa7dc7f98d260b6cb05662a9a1884cf4d3f0813b103d1a6acf20fdf9ecf3979b3ff4e6e7b47c2d80c10730cad71829912b1e66e1a1d6c2aad1cb9177168e60b06de57813daf767b28c0856cdaa1e6aa27d3e95c1acb74df31463297e9443ea94d0facbcc58c2391b2b814d95b3801a58378e9a078429ecaa8c2035177884906f3f13fb7f8c1441dc2837a649f2963cb8f6c43d85468d58e9aa5fd60088d058c69e11856b12ab1a63e69e7df44a8b4dffe6fdcca6d846ab6df5c7c658d55276a5201b6bf6c33b9db8ea8d1d88706472a3fd68731c88a7f47a276784b9d3f5090808d63f71fac048b638581ad8ee1943580e23796185096b0500ce140e565c550d09e7a6fd07417d76fccf905b6dfc1c05cf17831ebb336ffe7e2d5287b7e7a6363a1b6c953707eccb3fd603d23ec1265dcf4b403f9afa5a4ac8c0a126fdb7d1f86d5f2cc709ba96223483c22196b510587a649b78ab02c79317b5b6095d6cca1928622cac7e5980568ed114b995f4232f3527f3dff0a3764db83f9f9d644ce525d2f8d1cfbba80ea087ec0e7cc8b51cc8b4ed667f7002ca87ff3559440b598cd33e3e5e4784ab18e0745d62bacfcd4a17d0a4cc1eb01d55a803520f4bb158b32fc1185c8a10863b3d31d729970ac7534851a8742b7eca6e837ca4506749d9e20b42b8bd233bf568bd75bdcddf0cc434f279706c58bbb8873358173f4a55ff27cf01b0f7d13f0f741eb6890cfe38952e313851741abcc7a202226ded2476ffdd05d990460933e8d2c3ed70beb3e03b0bfd21d1fbc02ad0ef81303bf0498e694bd23539cd5c8210e4b2926b81076dba01e0be696ac2170b7d0f10dc9ee554edb888733c3016ee8b103dec5bd1ca1f40310173b2db71f99f4f6dc46092736639a3d90128734ba3783ab0af4f613bbfe85fb97242a6a361ec7d1e35b083ac506def8ae6612c919287f4b9613a2984681e32a04e25a653cbf70ec6293c89b5805b020c849aed6b5628dedc6ecb68993c220b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009dc90323ca6549f88ad5271ad70e8fddc2bdd7e7ffb461c837f491d0d6d5205901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65b40167e22775920810d9d081738483da9a47a1f0d6c44d5e3891d417ac10c031ffffffffffffffffc9fe544d78de9957b0a915de9e6bf1e1212ea6076ecbb491b792c43297014764b5ba300e6871026194b0bbf802365a78b436d5ae369ae527735e43e0fddd351f9883077e009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a47f697b9b6622f94880f2bf1b57a8be06a7ef34b51954ff8f8d156ad86a20238d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17f4d5717a5bd2c1bce1d119210ab2372e06927c41c69685dc1aed8d006e8eaba9019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ab02abd9dada623769a1252eda6d735706ef6b4282f78e3a692546bbf92906915ffffffffffffffff52882685dd4c1de20eb96ae2d8e8093c4b83c15d90dceb1591127b6894ba6cb288c65234d822cbca91ead55daae0d4d778ca233cd61d14fddde99145b6b2e5828e90882600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250a5220484f9e6708fff1a2eaa00bd6cdcffa492b5db10f53e5f1bae71efcdd4a06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a2a68e0ba4f8409afe5ea66a0ff6887293a0516379d888917bee83d3d9d16e2c00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b8e3522996322ba44493894999cc03fbdf5ff2ddc3952f94ee37b6d5240181ee00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c57ce1f49f55d45b8ab81b77423200e8d7cdd6fe01aa2ec0411ea44f85194514f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611809e05ff8d162c65c5f745a963989b01819992c6932b4d468972757d5b4ed62a00f0030000000000008e215621bc4020f58d9fc8bfd27c0390711b0d069443df5edca3a0ce250cb873b10d03eec62d7d8624377c0c2bcadc80a41cf342a32ba05542ad5913e792fe7fe4d9d082280a885568acc7976afba727d9cc9457432a0b184b36d2dbf690f51b86d71394deceb990b0a585f1cf0e6170e71a753619a5c5ee1ef2ae4f641c4120261280f3f4fb01ebeb4c4ae54bae4274a06d073a4155d54d4e98db62518ceaf9d385648c98c44e30422a8aa121c738e6401665e40550f63abdccefcb6f8228e6b5d04dc6c0c08414249e995dbdd70a8c897be7a8a3a20284962163c3c04d60c32d5b46e3ea2247a5b88b62bc6072dbf2b1372655fc445d34abdcf74362150ea7d37bf4f099e8e36a13a56d2c28460eb32feddcd2dcf49052a45fe30d90932857b03f83fd48d097e9c01cb039e26ed0131c3d694bc120f449dbe52808a3e15bbc2c8dab204c7f3aa77d827445f898dbbc81497dd9f4de44deaa2a25fc7002ff3e6a960905b7650289c817512b42ab376b3ed9742bd8e3897194c988a46d21b62580194f42a3de45d257ccc9012c1f2c04a12c3ef95b1492359c973177607c575ee065a47b949e400307d5900b2a4ef521aa8d574a89ffe42c80f9b979577a39e411e4c60404212909c251fcdd9ece09166a56c310f63e52f98f88c3ab3b1c7eff8dd72a6dd2a47ca336fb923254f349879a8fde891adb901d5d41c7614b96b4edf1f2d4d173b69ab511bae67e052850a2f22e54de6f318ab7f8a287205fb44e7001948ddf93abe3fa9c052022435505253a5eaf01a861223279c0f3010f03d003d90f41bee05b167ccb0c377734e9f54bf77d04e5d54f375e652eb32052cfd90608c7bf53a07acaa2a4e0fba1ccec2f15fb34cc6ea99c4634efb05dee882084e69349f0c94ef69ed15a84a5728f4a55406a793a0193ecc00700e913ad35b3fa5e53c9bb2c581449d32de231eba391ed68fc6e0dc65801d0d2c09402e5dff575af08a86a06063856f997de97c570b9fc17b3bc2aeaee72a99210b61c0937044403cb9c5385bdb6292cb30173cd6cfd7439890dc7852c4df5679402d470b80677b1009d84d21333dddc5ed2746f318a6a342365643692441f81bc34a0cdfd59323370e18fb97f077473347abde4444c91566361fbf0d8465c9575988634e1f33fb3684a12e2186ac86cb5b1537962afce2a8508cabd2f6eae055d87287f567ebf34ccc4e1b0dca9fe35167f1e0a5487776c0e8218cc288b6771062a69f0267b451ddd47c973b0ea12d6753ac2710223cb1e7b258c9a2e8fed0aeeaa4eec1414755da657206ac401538bf784c20a8d1d1a14342944933f2ba320b668bfa4729476c8124da2444e2c719fd2c205def23dac2d6d0341f87eb59a11a99d804ee8b3ea2768a19addd8fc58aa9898ea0b0dbe475b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000004bea49045f849be3794f64b6da6dfee93c0aed354f3b697b3a52ffc0d5fbc10901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6577ab046e042ce7ad132bc302dd4019003a9edebaa091223bc1acb045ad02298affffffffffffffffc9fe544d78de9957b0a915dea8794a4a660f4a6c4d25bebc9a5f6b86b4da92e866662b458237fbad0113035d011f5497327925a590e56047624d0a3bb5c33a5b3238edf6009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ad4e552a40c1453786b519e6d1b61f6b690b5ad844ac8db7c7e0d384530d3fdedd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f171a42c43539d1030cf07058b6dc4cbe6f88e9e279753e2967aed4f04dbf356537019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a5f4c054b09a15d9781ef2b0d1f0d1d124b1f0a5dd474075aa1d86d2f5b120201ffffffffffffffff52882685dd4c1de20eb96ae2f159053029fa49e79f21068fd4299be0bca201491b51df7303e2bb2e7bf95f15435504c9ef8fca7fcc06602504c6422f4a105365c6029d4300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250bcce1396372a21d9ca20ac91551f7aeebee0253258e360872e7ca67e1e6c1d1e6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b438bd4c5950dff7bd66eced1aefd6fa91b280948a088e278883e60b3f403c366400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f115dfffc1adc56391c0e135ec8970e5152ea5aacc05b58811062a52061c4eba00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7a6eb1d518b786db95ff1ae20f0d038cd18af1781f53f8d2348a385a2508253a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611380c46d6a4e479748b7c59d5d2f5c636899c65a3feac3bc63d2d9b2a69a9ad9600f00300000000000083a9c7a90bdb99aabf4dcd93bb5b4241fd2b2504ed80011c79120f92e770a171fbfe611264df200d201d7abae5175e8bb356532f569d1e61f8cf9110819387aede4ec5da50061f33bf67dde055bd0428fa9b072d583feb3326794776b34f0e13b3bfff88dbcbd13bbe55828d8425352bbbad33acddbdd4d4f8e181f5e80479d9b97db6be6a3465e993e69bcd96fae52ba907183f81feec08f054c28c88105e64e85f23760091815a3fd9610df64e93a9a5119f8b9f186d197a6e9706853b345c90f6645143932bcd16e685e4a2fa47ac1e8a5e823cced359b3a05052dfb3ebcf83f678898a94fa5623534c88dd57cc9b8e3bf7f585403d6fe15c6097eacd093ea624e85f2c5fc0ec5fe07bc151ad6832a6f012c345c1262af4cc4419a2ba20e5967fde423062b4d4220137e6f04395d8eead3ad8fa4f896831fd5454c189f5936bee934841f5f8b524ab3a2f3e9d5ac495f3626e73787bb75ae2dc5dda7c1b538ac75054c8e5948887bed4318188df1f7f2c8db1299528fe7ee8973dfc3bcc97a50c8c2c9320d545ed6c0ddd87857e5a20f66a2fe9cfa7031d1ab490c22c301a8d159f87db55d29f67b0860c5b8753a699dc035d08b04af9df0629626bab623c07c904c41f10c39e3aae7204a4b2f39f82344c4616e86877998901b7ea62531ab8393cf8508f0480d2af81aa479743e4668d5bc2532442b07dce4a0c5e490dc141325a7e505c09d385f751f37b5ba1678f6a6c029dd515dc35e9a39b9b59248438053467f964dffd8fbba25c26436f5d6662c75e5262d77161c0552f921fed6299cbbcf94397f092b5564026c0c40a07217085c2b5d81284cbcf78eb8671a4c69522bd1865cb8346e228f189614d3f6c0d7ce2e46964050a26e2ff547d73cd071d294a4ab95553791d62d673cb1f89596e327603e8a6d1042009cdde654426128f4b9a9c166d2ff900ec4e54c1fa3510d122b44c406a17c6562838243b5bb543d5a42051b4e9e61f40e986c5c0a80b3edfdde7353bf90c05d4578b24ecce95840ac1072b0c58c655f102ce1cf4a0f8593135c63e004c8ca687e7def7b1c015e2c4850bccd52e6a9b08294ae464ff33390888e0b5d6d94746a811b9483cc9fcfda59e9ee77c213630f79a6dd6fc01db1e9b87e75b6e8c60bbd002aedb06726d88f11b3d02ef6451377d2abd255def09506ab943ee805d0be59a2c31b266106381d7cb4ea30c7372c68063b7a9a34ef35171f43bc94fa4f2ea658cde30209a1590ae50a5cfcd045bc6223a9764d7051f1b5dda9e2afc3142d1259c9cf04e6e2da842c71966efa47e4d9fdde96609b49160c60eeb3bdadbf2f9fc8874f826afef66f7b7d83e0d3afdd3a2ecd74ca3399a3f78559c7576c980b234020c72ac251dc831c4f3b160aef63237fb625e5b608f21 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000811ffc9ac9ac22cdb83dc95fd47ae75edde97fcbb754fb546c8c73928d4fe02601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65faa902c57cc137ba920e0fd42882c80d2d8613d38c6d7998219755dcc446fcacffffffffffffffffc9fe544d78de9957b0a915deef99018b913c570882481143190f83d8eb2ae5936be65a517564949e737eeb0ad9ae0c3bb992cfdb75c3b36bd4e38c519767f7770d941f88009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a116484104d25a1b9a91417da8843c38d6a62cd473a4aa85158a3a33d561b7aa3d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1797f9aa9167fbb5a8ea593189b147e48de176ff58031a36f7cae29220c6be072d019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a51252c4a629bf26feb12173a8e53626630443e68eb75a8c16583bf6ca0e52d3fffffffffffffffff52882685dd4c1de20eb96ae282ea0b62cf40360d0464049cd51aa60ee293d2d0981b5b3ba757f2a178493767d50606fe0f331d337feeb84411fadb5901d42fa3f1ccb7ec00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250c41b66680066d1ec837c868b5291793c47567e774ea824ed892fd148353d3d116185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4801fc390deaa1ebbd22aa91c5e37dec36011c2b1ef81fb7399c5007fa6f6744800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58c331370c4f234c8ea0576601e4fe5124c8e798186863a5193f33d3f753e4656a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c5eb440c22aad73a4ac89c0ec35048ed93adc422e7b548793da89abf7941ca0e34bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fdde95459d4b50dbf2ad75ab042970ad35f541ec7c830b19e40980eea71e303100f003000000000000b4deac70a8f4e29792765ba5d84437a3886607ba762e3c012aa025a43cdca92ff7ef454f6a15ac24449e07384e8935918ce87f480390bef7d4e74f93abc189c6619261aee4677c0923e4fc5da50f33f6e0272d029d8951d576da9297bcf9db3fa617caaa26f0c05f4075541524c9362e6c7a6b4ad9b925c57adaffca60396604c139eda24ac333f7008591f1c341c6558cdb4e3d352da25f6c88ae26f03c995c7c8281bc40e56753ae7a62192ee7c83960ad23086f4c4167f2383a14e226f801a9f5253bd8690f9b7ab234bf73a804bec7a01c4eb94c4c8a962d5f24f2818df096c45d5c6afb3839294191b7f2bd4d7d8082cf8b6c1631596751daa346f9ca7243ded4bafcd2e4dd1d41b2764270b558eca8bd8550c2dfc6ee62cfbee4c956a581344b23cee4ef4a4fd61e9015e73f48d4b1a0314ce9a531ad784645ea03ea578024aaaa63cd08d593e338b62bfe7e8e94b72fbc402b4fad8e48e56af9a57f3b26c6a7fc0737d4d44563b005950886f983dcf23f987498a43fcca5e147f646bdac1e259a75a8c1a9058f47adf10ed40c2e094980eec6410eb2f90fccb2f44482dfee3f20b81b4a8e0f4da1f69e06cb1cae21bea482c6459c951dc833aa56249402edd90ddb91acdfa028bbb615f7c0c377da9b03fee4e535d83d76d5e2455b92aeadb1a6fa1f553ef7b0030142501e8424c5c294fe44dd41a62131e79979a18c50ea3c3d197221fc4bb7e426e8c749273cd2c1faed9afb0ee7236dfd891f34a528fdec01c38c1ccbf86fe30a2ef05903c5120fde9542f52958455d7a34a9d28212f90bfc066ec1c1223e69dd8f838073eb5ab736e134a95261af83cd48a685fed495534750602bab552d5aaa0969153a6f743d91eebe1681f1cf681eb257a7d6951bd6b46790247149fb354cab8f12575e2ffc18b5b33d676df718e1b46103e4170f6bebcd803cbc9750693b4701182737ef2186b30abe930aedc1c22413052a249c4521e684b0c1019497f10220920767eb6e0542f5b78993a71128ff41175523dfd68207cf0dabdf261400920a440bba9abe22c95692e533375e6b7930d4b5c4f480d9edce25d138b1067d7ad71603bbad3c9372c943fc47546d86eef04bc3ed0b58b2852a1c6d7ad16f14041bb9232006a1a50e8bab6e8525d87e2cc1ac71bd604a3d7dbd01edad78743d59197e051122f74e83a7043a446a61d251aebe646dca8559ee1cfbd96b84f5c6a4cb923187944a25a5dc125771f329171cbcaccf9fcf23cd1d805c47419a2c2ca1dc0d1b66ba4d6482ec3434e99b96eb89f292175906d444436e840073ecab10b6818b378dd8a78cc60bb867f3318528284fe33353f9d521014ed3cbabe3054f39080f722e3a63c1050cebd9f877f9d36e0cf6f7b3c80f4a47a63b4b25c98021ccb9f205 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000284ba16a65b3dc95f377e6fe161cd4ca964888a2ab053a8193100e3ead23d94e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65936a93d84ec0dd688b8c6b84aa9652ce2c013e604d1bfcb805bfc0854ae38326ffffffffffffffffc9fe544d78de9957b0a915de25600905d194033590e97fcc7f69bb3827a701cdb17ea996b34e4b8b72f8f82dcbac393092616bf31e49f42d877b18d669fb7a7d6d291e0c009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a928473ee99351740e85c025fb2242de9dd8831e78796928c022d4300d3e70722d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17061b0a0434d01ea7aa6290ec66e5b707862997dc3c3f7320f8429212a6b5c00c019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa1a11e2ae4f01466750204cb610a1b42cc53f750e4965efc036c62ec6a287f6affffffffffffffff52882685dd4c1de20eb96ae23a276493e93d0c60ab117fb769a1d84e606117d6f722dfff4ff273b74a111e32fcff9ab557882e235f323fe61a95a710fcbe1942cc7248fc00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250e38e1fef29320351e3ff4a0411a2f3ca18e0f021d7cf3945b1658600015987c76185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4e986a4663a9758bec8115e05b00ec7335ce8f0d6184948ac25af57add58b7a4800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58dad36eecc80a9ad9c68cec237bfafad8a7a1759ef567dd440523cc684e75a48c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c357617dcbe0e2fc928727ec22ebec65ed481131990328b3a95645f3f8dcb9d8a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b09be3fe89c40935cbe86e95d4cdb6f4dc06aed623d1d19e0958955bad7f666700f003000000000000b99fe865ba4bce5cb54cfa1987ca9bdf508bd4e36f5d8063e37eb9ec63c6acdb7008630a24519c32a53b1eaa4846c97da2a4768b64a9676e703252253535d8076fd9704e132e77410d1b6182224dd82115e602264ebded2389b11d84ed26c70e855714df8734638b292a605836c85684abf973e185f109e5356b20feb9d2fbc5bba82dc4df479e21391b0dd30bd67b3486ac8221cdc88dbb190077f66cdf0874009de48c492703e5202dcd3e7cdfcdd08a60f87724b5e508c39ae591baa8959dafd21178d284a0592e20d557fd313c3294f6ad82d58e69f0001530465f3e2a8b302c7c77f38a35f01548ec834473cd87b7d1f4da63bf8824f561e5e022fa56bfd14fd3ac6c0f1e0b043bf6e67af94ef348c1a5692f968c50e8c4aca1d133efc28e9b7a85210bd654089f2ef4aa3a0ebf819b94b1782873a7182c9b8dc1dcf0b4d84848d5888c1ecb3abdec72f7ccb995a217a4fde15bb59dff935d8d61f3ea4df42081aacdbef3534ffb9692ef0f4eee728f643fb0ced20f34157df9fa434abab0c1b509e01240907dc6002242180d119c42454de75b3e4c0614cee9fe507f8bcae8d2d27f062341be923aecda13664c8f3d1bb0730d3b35d9d00caf3dfcf622f770247790cd3696f07d5ef8b78148adf6822c6c2def2e38daddd4e719b53f3ba3f812cf0ee1f97221149e959f8970ea53cd9465fa6392dec77bef0fa244de536cce8e047d1ef59a8ae64acbfa17bafa71ee1e0d41c8acf27b6e7c2ea4801335bc74e2bb2e397ad0fd08d53c097732440ab71273483e36949425a074be285cec91d58ba9595f51bf44039a81ab9805057309e6a96ba6da9e683728aded3b36419ca92328680bf349f73e717339488f3f51a5fc3c82f0e35d123ba93779e43c21fcbff94b9313a655bc3cfe7a64a21a620437888144d53c51d293a2be623b2385dbcffae6a01b4593907328859dd41541bf6e2914cec0f7b789b3bbdb30cbb30805e9d4c37615f0039769d2d895db2f0fba8441024c66d098babd182e3924cbf0f453e4abe55264fe279a78112d4e46519fc2d81b48634b6609345e1b69d40ba750992eea961867b23e7a054dc0f4f05e01a58930321463d60fbab6063b3bb1b451a17516153ba525db0940e8f4c199589e367613cde55cc37998c6c03ba7a5a75545d9281b637237c63b662df777e51ef4310e565d8434339ecd0dc136eb19ebe3f34d2f23bee43da440e1abfa3f93266bc1f499b2b4728fbbb2a921e364c84f786681a37e7a3e47be6de9c4aa3b890693e4821adc13f321e54bef7547b0b0f610f98e62139a280e3eba81525a8a780ae54d59ce60101fd33b89222565e5f9f547315c83cc00c0535c4ae67a5148cc44799360e5a2362e2e67529a8c2dd8ec6265dd4fdd0416d02e7726ece53969ee23 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000da9b102ce81b1d95f725d99fab770895cdbaa6e1e4eda22af91bf813467b994a01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65d2e61c204771678783b1e2fcdf56fb0bc18d5dbff844a3242912f143ac7af51affffffffffffffffc9fe544d78de9957b0a915de5c815d1feb29dc3ca629aef586b775afef6cd31a2bb9fee5669a119233ec2f3d90009ae70705f3d8387cb23303418fbb148e5d83f0a436a6009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3ba375d90298fd7feddd90cef657a9a0dad9e5aa0f2d8050b7de20f72fbf8357d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17bcf98ba072ca0e90ee7e81fc5e023c9662a26c413088885804e4b5596539781b019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a29bd5c6a828182b24e4b5231abe55ca7621046e980bde6b04161696d3a623012ffffffffffffffff52882685dd4c1de20eb96ae28fdf1faff5fd51fb5fa169348f65a4d7780c425135bed0538152785e9091703a1bf4299fa39bf46410edd1a69e89a8cd98f9f84e42013f2c00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2508079d5e1d510e65d6f2af6dd6b8ca872b8438dc1901ca5177006257467dd279c6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4b7bb059ffed466d4b425aef5349b4fb133a92d0e9a61fd56ebdcd4ef4baa4f3900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5834fb6b0a9d2c1759eaf61462043c7d22c327aa8df7a24caa3080ead628b3ceca00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c758603b75ff10f7e6e05c0064cc4470dec30217a1a772463ede4d54350ce83e04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086117769bc23cbc30ea09d6bec9876210f1489a3ac08f4fd93adee93f93d88a4b55500f003000000000000ae7d328814096648148cb6a92327e5f3556237e764e47e701d83f208d5733864e19e932677111d631fa0d268144f42f98b01b919baa7c147a47b403bb0d232e793c2f707ae3ac0bcefb6d4a04ab5a2fefee1bf30967a68c157b028c7f346a90086c3b04d716ebbcdd6d4679cecf7a4e67cee7f2db51e8dd109d0a79c10e6317b9776ab34258220d1c7e63e1bea8721d2a9255f988d257886c73490c9be117391ff004109a57ebb1790ecd347de4793d7d6ee24061e4a31bd90609ededdd6a70ba29e9dabe14070062d52ec3c16d8a7a763e8445dd251123df827fb35318f931176f2ee627749497d1f151cc22e3a3f77a5d46f0f87d5e39997ce01b7070fd5fafdb924bc3824543ecb6f6b7378e8fb587dbe7bb455e2e5ce3776f89a8a740a8999b9e8ed04588bf9886ff7601047e0216280da3073e878f937cb2e7e8e19b931a7fc1d9ed3288865759193e1eee06cc8b6599ebf9389586f6714ea12b4e241eed925a53d6b84606907dbcb52b8818f7371e5964e0f186906989e3fa5b4cbd4d3a40430e6148c3383dc7b302693adbdddfc3dd46e3d474359f34fc6bf601ba5948c65e199a6f621eadcb80b3db93288b3b51aef73b92b11b420be7289a6fe62b8417c1a551d3cb603bfa1a6869b07ed6fae6161823a4916e7228ab73861625101b66776ce4d58457b438e2403832eb465ca13ccda76e91fbea95fe1567217617093b452b0d80bfe060302cbefa3e9ef0c82409d553da5e7cc907a5039151b576aaa270cb040ae3220506376650465d522a89d72b0bd25797071c0eed0b30042f68099766f9848820ae5751a2ba925a701a9d623a7ffb59d34c576dae3b90eba55d14a24c55004b7044f13750bf0f52b222f110adaaa93df9c9115ae06319a41708a734eac6bed68ea5b43a8cb650ab910da417c85cdc608c74546201484ff396adf00804bc943b86f130a415538665c165bb4201d60cfec8a535122623e759dc50f575ffd165b112ba4e847f8826de125705e927dc0188c7e0d9329b4f99ede91ff2406e3bc4309c5cda9daf1a07100240d06b8807925e06310126c1fb537af969a516659c030a2f49ea7a9de5cdf0d4bd6cdf134bf25a41d33a872c2ed0313e0f64dc11c7b6c05c1f445b209e840764f8b03008d53ca9e19445bcc34e096ae1b6bdf7174344c3ad2e9e02764c2673d53df4b688bc864e6fa72214c5d82b07a90f6ab9adfe118c1dc7984dfe10056531da87c6336ef3006f7e22c70a44be80083a95b41a202ccf9c76c4b853ba9d21c69102435335cee100068310d27ab202a680421a59ac0965957a6e205acf446956a408a6e7cfd23209e4a143fd9b70d27235b57ca540336a22353ed1a5a057f046646bab327a2f993a2bd01618077a6a94732c1e50415fe8d9b361594af2e38e563 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000053f4d7f4a2b2017e3872878982990ddbdcae26debe57fef130f42c9fbc5d5b4d01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65f6dad3f8429e96edbf2b0510b12c6149b003f893a7f58800604c398f1134f038ffffffffffffffffc9fe544d78de9957b0a915deac58a449a5e496a2439dfb2140ac5f585f1ffae27feded64617aff43952c169a6ccee732a38a8a535814d6f20db788c65053e6b2e328a69a009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3347dd023f2a4b7031a26989826d36b1af75d9e728a81a9466c0a248a1a63333d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1769cf447f5121c1728f335b54eb06ab98e72e55f1f46484a7affcd52c53d0e837019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a53bdee70879d3d2be5df570c10a3a4747f80f8c50466f8a7a4abcf956a40fa8bffffffffffffffff52882685dd4c1de20eb96ae23ca84501f3561a96ff0cf8b9c3abf49e95e1aab5f3a2c6e13e4743657a21f822dd28c98c7ab0ec7145c2b775ee5c94c24855a61cef11a3bf00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25089c7ad625819737f7f7dcdcd62491cb0da420a87b605d65288509eeb36a2b7156185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4fb6a34178c598968faea2928fed36807c701bf68e260f31a788e4a944895edf100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b582c8c2519e098dd4bae9321fdba311f511c363427713a3b8076b1cbead2540bea00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb0754308e335597f159386c929b0cee705803d2f132339e8cf7695920d26b5e24bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086111432fbeee15c622f84e2abf5025748171bdb5ea7299fa4af2bffee9f7c5bba4f00f0030000000000008d7639bbfcffaaa6a5d4625533bf2553d5a03129cb127b27b56bf4dbb8d7d4df1d155d07ed135061e041e25335efe3a3a862fe2e07fe6a451da7f48c7c31bb5e3f31a4f86b55628e966f1375066f4c512548d5633a889d8efea6fbc8f29cd0768bf2e3d142d30b456d428ecbe48666dcdca3264c2b03c8ac70207dc49c064a15ee4a203658c4c446fd5a44da8e955f5ea9ee87765baa52d0d5411aa0651122e647758dc3fd1238ae170a7cd6074dbb7c58ffd4e3765fcf83f91e9fe5841e2cc7b2d292b7f30d7b4ef07100bc7ff1812a2e96686d51b2636e3eb39e31072ab9db1b5f23c1ca65028b4b29217eeab1f4a4b89dc6c72f99a3d3abe46e72fb595ada3cf18add56ef8d3782eb0a85d8b2ae34a96fa6e063ff82441093e5ddb3351d9487015fb82919a045b1fa6b0922c118daefe31f7399158a06d33bb78a05bd56d5621b91da6af2b11330f80c10bcf3f4c483b44c24179bf0a3487166301c554a3b37cc1467efac5ec9a1ecae36da8e113c0cc7cdf59c27ed9c4e0f156c358e942f8fbdc1716e50fccc7617e1957ef09d4fc8cb106324ba211ff3d85337b509c624d38c73db2dfbfd34820ea26c4e425de1ae5e88e3669e5c3cf387e201128f08f380eaab8f2a7fc4be02a83c17d6bbd2545ddb50238f34d3afe7012cb5a272463ba022e8648b02ad4752564668fb53196ed6de05111945d037a8bf225143c83fafe3c1c001ef9fac6eefdada3c953a10b322ea9fbc995d6db71bb8ac32a2dbce0b9c7c51f27a586f88bdf26cd562cc831f3ff3b678a607dd3f0137aaa177068ae6d0ab3eaa1284041566b435a8d7e86b4ea2305fe851067226d8c2a977541bcdf1ea463e0201cd9c0b54e3771cea0a291b7a214cd8627883785fba8c0a7655789e34f9e0f0284df9670831b87cd939b2169426a9eaad39b739319fa2efbc8ad672bb5343ef3501420b270c0a0cf9229a04234042b40e4bbe74f78941875bdacf05ad7e8333a6c29cf97fb16d2a40ca2f01551e70dc6affff57e45d5db4bb57cfc258b015b566d229aa5fe457208c37d56a87fe87c13ca7093e70b1098063cf01a09b6bb141da98e35ef30a4fe14b55c724bd865c9fef4322ed2f4de7fb87a4a5e170ace5457855fceef9fa6fb2533a29477068ca53d5ed40a2b14b2e8bfa9a89227eddf79f2c7a6e41b9e98805204ff611972eacaeb38202871a9a3273f8f1654c86df77ae9228393aabb2417f6e51f72ff4a57aa9d5bd543533d42b145dc56f4444ca0e1ddbf326f87961a5ef5525c817ae7aefa65961505e18dd14a5b6b5588d21d34c90b2a24a7f9a4a5921cdb38b60044aa70935b36dcbbf3c1724b2078a002864fe7ff73b6fa1b91b2642f6c2341c8fe229b5f01f22526f2fc451505c1b0207be93ccf2e0b4228d42daa6a580f411 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b44afc5bc1f2ff595207cfc783639d87ec5a92cc0c97eaf5a234730630ac160701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6559a4bad630dc573503ae5f9b29a49ff48eea85059258e97d83327b5cd9e3f6b4ffffffffffffffffc9fe544d78de9957b0a915debc1ce2becb113a06d868034f18ecb9c56ca9b2cbfd437cf170bda7c018e01cab9230d367bd186a3d9150b50ad8b285a9a35d5151a92fad78009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714affec5f91c3866eb5dd1c206c1fa64a36ead70c763b1d6bc3bafe78416b9289a8d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1737e8720a3435306188623be447858017e753fee43771d00f01d0a7434bf28648019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75af1b0f4c66b324cbff1bde3b87a17d6d754b3bdd9d6792db2c46272bc7a55ab54ffffffffffffffff52882685dd4c1de20eb96ae27b8bbf432b40d5e7c0e588ad7995d460ff62adc9b486b64d12b8a67f4809e1616c0056888057bb1e67db52d7412b03b8a551ade11078e5e100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2503b39abaa691e1cca770c51084b31dab3d10b4274de0d6dc7e19692c72f30a3336185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b41ee03b1691fb7d306ac2f28381288c109d57d602c415deef4926b3c002990ce700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5852a59d78befa36e6133cc04706e57b8def0e9f692909d358f5adfaff9195a4d100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6750fe9376858409f81b9428d0cb2a1a17092c4393c42843dfdf75bfa4f33c324bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861190102889d083f21f6343aaa53802819c815e02e664487bcdc89780da8babc22e00f0030000000000008d554ce8452afa98457a5d9bb4768078d0b6f8adfc30303c653e735e1354fb316f0266ecd4b43329836e67078e1a519995b5b261182c30a290183b5ea3e52fceba6ecde8a649737c15eb0807fd45ad54113fd292fc3a20f9d375e37837882f848e4626a698637bb115c43eebef81c24e158a4a1549d866d708ecf5e7cb4d922b7fc635ecf58b95a8d566532a2c03bbd29290db609fe812e2d51adc684c72daedd61aa826c935eb930e8f2f79469a48c154e897cdb68973e8213dec187f7b26aaa76dc16c9ed05009dca013349a5ed7f102d28a626e14a739455bf2e265cc5b14cc08024d0fcc2c644c61999d62d9cef9b21c9070961b5b7ae4a540dceaab37164f4e3038105a2b0fe0f97a1ea97dbc527210d0ea8b88babc5d2e67708481259791d7637632b4e10f2eb835249641489a7b302ca7993651a8d521ba1bd1c4632b10500b9c26b066dfa679fd5ec3a30c16993f53988dcf42d1b65c0a19f3ec99b1b913923e0c9e09566cbd2667498ac87a2f889320143b0ea363e3300be838c829950c635bda6fccdc767c3fe5f614e855efd1dfee8b758a8c89855ea6ccc6e9bdf5d3e613d1d56840c385dc4daedd271c909a393433afcc4ae71cf706ebc6d416f687c951aacd267dd6731207aeb37968bf97a59ed0b478a28bcda913ccf5d4adb868d6c6f1dc1215e4ac3de8b4b671f03f5706c8cd0de5d712df3e1f568359f02b780413f8c4be0ef0dcbedf39ab13dcbafa64e3061081a91548de7ed260ddaf0ee85695aa449ca083a35f1be0677063e79e4f4a195dde2dfc81a198b523f0bcf9495a92d54e70750494381132dbfa4cde8935c65082a7e4001db9ead62f1e5c2f20e72a308eb68b036798a461f7d95b71df77c6e3d8b53d8e2838837c0d283ccdd9515fc05c251828f8cc33367bbe349fd313e06a1e4b7dff9a5352ff98ad9fc85f4356b80cb4309b6f74384fea513eb115f706cac2d0bcd6362a24fe18cd3369b9b905f7d2e3381d97f5319f0a5851d282b2a585f729ffdce807ac129aa106740ee9df200b81e39b6f920b15e8f25d1d26fa934ee6e29e9ceef344065417a0f75cd60d56da9c179e9c995577239f507b65b590008add33b789db278f784cf77d8dc50703b36ccc2a08642eb3967262c05ecbab2bde47499acbe742577b3a1dd6e0332d49b93d3f524cac92cf2b8b6541c89c210a7b77ff3f3bab2344d50120df8145220a37e73cb6f1a578291a8c287e8d5c25c5d633431b6ed9ec8483b64502d24846531b8eadf8865d2a575b9e12490f899280b354c6effd2ed8e71cba91e38b2f2f81c9948ebf6264d375f4c9624d311fb6572a191b53b99218bab176996aa2d289e5b4bc365bdea90df80fc82ac9ffc9503f377e65836967e5e341236bb16ea7436625a0068fef0f9d962e861c +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000884abc5883137c6f41bff9f4bb962765e85011af16e037e3a8c27301faecd95f01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65ebdff461618f69bd2f64a8f765c5a8f13019e09122e2ecd54bd596f5825ca54affffffffffffffffc9fe544d78de9957b0a915decf74174a458ecd0aba60c6f719475b50d9bd53f5eef7a52b0291658818eb200c9bad73ebee5779d74b55cce1a796dce6297fb8e9f3acb1bf009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a9c0a4e357377278b634db682130c24454f471c0f91347cd79404c8a21b40bdead85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f172f715d94a753448b7c0fd59671e02db9acc899f19928dee51ebf162403e91341019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a45b0a17778dc0072d609945eeb9edfe3bece17f54a208bb3424a20929e9cbab2ffffffffffffffff52882685dd4c1de20eb96ae253d37bab7026c8a1eeedd3b31fc550f57172102844ef4451211ba48b21af670926fdf0b255f83abcc4ecc4329d2076fcd3e4bf7d220c315000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2501c482b81c277c3ba45c3894b2682cc040a308e25d999b63b85b0616edd41f2996185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b499702f83bc7fe388afee011bb234e0057ecd09331f0dacad16a3f3716f1e135d00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b585e71034331ffd8f8b49e8ba452d8e61a9946dd785330d2bc53775da091811db000b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c438ea2a0b475b6a0b02c59fea88b4e491bbc1e9a49de1f9cc0bb14c87be0723c4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d955f96ebd4e0f7129a8e3f7f86ac10a9c8a129db402bfc8edfcace217a322af00f003000000000000a483e0863236c72406c2a067b3bfc672ba3890e1f8682d1b79608f5bd052a6fc46513dbee504dd56a60c4987d1a17fda84572522d3cccf79ee8f93078971a0abc340a8a3d015381e18660c52b177c3cdef9487b3815f8cd6aceb2171ab1e7326a00cf6f3147c812f3a1267bf3a6be19e3df924b6fd2baf6cbe33a15ece5da8f42d00e4375bcda101c865208dfb2ef89c90e73b8a2f501082168a01ef658a5bc201b47676b188aab1c1ebdce45fd250266e3b13111883f7bd93e200524d60095e986de3915d11ef2c7195a0effc83e34d4620dbd3ee79f50395e202269bcb2fedcb949b45c68fe6e13b76273ea8e62b0482bfba906f829cfceb5596240c974ef2fbe51d080ac50854b355a8184ee2b75b0c26e1bf378a9a291ae1e212238533c2978fe6e23edb697331ba43ebddd21008c11b7ef24e2c01870ad988f3f17dd9c88d40fc7676c84dabc41fe3788f17c7b0b7740ddd3af2ca6e9c9e229ba0c59e4b0f2b59a9ebcb42ef8df8161fc42b858af1392b20c8334784e8a6fd45837693ec87e33781b7ea02b84bf1572c893a90e1b8d33cdbaafa31adaf65d5fbd41f423d673da63366f340f4eb728cfe5f93d5d585c7b239f4d9650375b0b2a0db199b313e1eaba3aa5ac88343c9236ca1ede28a843489c275013bdfd93022f194f73dc4926b47f3128f5cee11749cfbce808f0341dd1ab5320317bb1b1a69ede31973867cf6a4e227e83e68c7c0b175cfd0860ec02dcffe1f51231b471e1a03854d7ee3db7a83dd4f16ef31d847a7e53b5e1a443086c82d595fe1863da53ec2f646dd43c29fd53b0b813484d35bb012a16d8b0088f26de970d4e2aab9744a5d4eebf2edf47171f0d6af17b2d35a3fa358babc472eada8bfa51a0c4037e0554956a2544430864100b13810c4b385be19e5aa00308d81487dd2d8393ef244a421927d445bad426b9acd080bc84adbc59ca85b9415de4ad2a2b2017cb98bae7917eb980442a9148822c39e8d4f63498a5100a482083b3a3a0440dac96909559f8f3ce1c877cc093fd1c82855f26ba95cd7385abd4c977ed2416a6f4859178b2171fe5996ad31e8e675420da3c51efe0d14543862453226b4c8ff6676c623b2f6feb995a95951201b2fe93a9a5b5b0735cfe38963563ff822f6709a5de90baeee35c40e5a1ad91a057e3ccd9ad787ba2da27204e4058dfb59e321d09672dc815eb12539d5470ec353c8fe48da8d6a604df109284c48864ecf3ca10327903221c0b86fbd0b9081acffe72d7a19093107d692b75c9b338435647c14fc5eab92cdb3c14cf290dba44179de76c5190f05af39f676adf46aaddeaa0d3fc2f4d681aa15e45035a1060c1cb7932f9e320ecb6e2a14cd70d46391d797226fe6d142d237f2813525966c41da564352950763d921a38fda6c9700 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000a46174039266514ac0503c1f4f4b20ca218445b54dfd09b7b2803c66df3bb23701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6594c92536365215918001f626bd4fdcf44b824f0fabf67f6394f6c0f397d88b49ffffffffffffffffc9fe544d78de9957b0a915deb58cde112f95a98bb169413a4e294f2ce56a9e216dde49c00389ea7fe8452981d14fca1c4cfdc5e744b6cd554b299a4932cd0e18017e4f96009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3c699808e54827c4face61cffc657b704785b3663d0e362c45f70130c24da619d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f176259596779350525c329fed90a0a80dbaf1a4da8b93d09f5b7d94620d07fec3a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a3d9e1359f0dcad64e0453cee46b0ebe9746693e1b75303e1af8a6c4f94c8e297ffffffffffffffff52882685dd4c1de20eb96ae283e10ab669935a010791bf21eb03145210ebfbbf36f7973e18ea2e171a3b4e6e20b0fa71a7f149c5a2b292e27844a6e37280b5b287fc00c500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250e121ce9f6cb4ce0fb2e40b5ff9bf54c41b9e59efae9733f065731143521449566185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b46947683525fb0dc3f10ce62faad364e2a774bde39be57993a451849be4cb031100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b582d04021b8d62cdd0a1250bbfa13d9aa372c5b34dc0fd22da786674a28d8ba81500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfff2484ad12a0bcd22e538b51d7e8600204b852df9bcfb56fdf8a804001bd18b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861141b7f7b9de5e1a38b20cf9e8b235f0c505b14b35ffd5df6d571749ecc5e4da0600f003000000000000a32ee44370d8081f041c36ee337c7d757c2a8b244266d8a57531c0dd45b113b484cd13edefdc1f70ffcd0be22719370da2767a5c357fc4d6507aa6fedf78fc3bb6e6648163831674f07357b768a1971fdaa040de4770b45b4dc0465e0aa312d79600a83d34543ecd7c760f13677036df41f4c8ab182a63b457961fb4338509a9b1399ab7690af30d2884fe2fb90a1e0fb1162f585361cb9fdb4cbdedb98b479f46891141ef8b03dcc53e52c95817a5dae1c41aa23a6155b3739f073a6fc45b91871b9bd6a146f40c265af0e1d5c1416c64dea2dbfed4563058fcaefbc417b95198a137034a1f2070d974652b70e97507ace18f9038a5a6cf77aa1b5713128769ddcf6f27c1cefae6ffef55d5afe387cf2b951b94d474db5aa696db55e46296d3ad8c6ad2f04e79cba47f3c122c855f78894d33f9b784073b6fca4d6f99a0254b217aa98242a8767d613998e857192b6380f2fa0f7c9a5b4dd53b6e48e34cc173cc76aaef1fbda2e13562c7a7f9710a9b50cabf48b4f7c473737655d92c58d9a48cde28c88ea3827bc24a5b5ecdd3081095dcc61c3bca93ac6fade63385e83256d75bd18a0475748f6e83e136eee13c8fb3e5aa71aacb71f0e2fe55ef3baca8fcfb84cea26dec286e2bb3901dfeb4157686ade2dffa1f6a0c725e4218aa7f8bc589a4faa82b38d74fff7878d7fd6b998893a860a737f9bb810c8c5a102136a7c023de54547aa644bf996526dec2dd663b0aa9bc4bb08b18f1c97092cccddcc884c3d5138a9fbe49daa4aa2ea92849022a4c4000fe3ef271a2d8146cb9b0c0ccc74a93bf3768e45a4dc53384885dcf966843b5ca7d3727864a75b2a7422c2dcde0ddf1e98132a08a5cfda4d166cce3e8000eb8f047e1a4502320388c744c4026bd222131b5d0ef400fbb55ea062df3a341aa91fbc716758116b50de8ab6e2582f77ab017b42a7904d9a1184048bbee63581c6c4b19c3413ae9799338ff984c2a021a6b5812cf21552b76b433e9d331185272d620c727b20789117b9030e924a2cbcaac384e0147ef3fe560f9500bdd145043d9e3ee03228f9b0061552f090b086e5bab6aafd9ef2e03449f7378635b941c920a2349653799ded5a058128acb965e1d03087feea456cbef474dd91d179f3ae688d877240d49c2e4eb6e06b7ce8bc40fcbe1bbbf49cbbaed312ce9b4a6ee246b119c16ca4a65366900fce58b04c5a40cf77b9f021942881865da73371449146d6a3d62bbb7825dc5f99c44c552ad9e9229de77099df26dd34a129aa760a03cc8a5aecb8e8e89c26da6cc7d33c199dc22ec829e59e56a91c96cf08226d0e76f2f2fe30aeeed7de292e835ae89c2549640124d8e5434d37e693d73b37eff8d3db49d6c351f819a484dab2e2af9c46c1755a03352d1c79b4796e8252eab96b42e +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000c714c4b4f860d34eba6f20299d4ccfa618c8d12d0d5f7d735a63393c7b564f6a01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657b505a5d1e30bc74246fc379ef3ab979c33b7c7ad16d03b0e11ca6f10c03d459ffffffffffffffffc9fe544d78de9957b0a915de601df6ba8978770b517ffdd88814685fd95f8c5678d6aa505b2555b981ef7290b79d7caf28decae4afefd9dbad5fd5cfa6d11e19da0564df009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714adc87c80a2988da124473909a8b37ac1c679d2329bc4b5107041aa7151fe37735d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f172acaeb72235950c09bfba3100d338111b5604ef746e71b55a63aba574d0a4239019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a59190754b091a186cee675620c0c16f6e1089aa22e1d247a22f8c155e81819d0ffffffffffffffff52882685dd4c1de20eb96ae2850633ef852e1c4bf51a7e3d34375a18bd30134b006610df152d68433ca0ecb1a2962852d4bf48532e7f1215be035c81b2f1e282365ac89600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250de6c51393b9b2e66a10c0b54edb7f18f43ed62e8b90ff31dbb5df32ee87e43de6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4dd2e1a184454f6151c1c6e3701a71e8c9daf43781232dfa44f705659cecc5d3100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58467e4e92c212c3d75d198aa863a932f6253e0314ff1e2b2a009acc0673f84ae600b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c51015df00e9719eed0ca85e848862752c5730a709ff3b36ebe77ef139e7ed3cd4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861168319f6131a077dc9444469dd70c2cc4f02cc30054423478ab8ad6985335f62c00f00300000000000089c7d6cd35361d052076c0d14ba2a7fa500df68e7064d251761b1fdbea5ab90a7f545624bc2dc306f50940f08889c0edaa7c7cfaf871392bdea5b92d125cf1a9c7ffeb76cc45c0338669d19b1cf9219f5ee08bec17a030d65bc8be4475719d43a933e76489a7c602fe5de44e909ab2b6a48de48da1e9255bb1bc5b6461cf2269a9ebe61bd44837fedaed8b672d2efa05900d3a8773edd1ccebe03161a57f7f0a262a8ee5347765f23a9452cc2ac1ff9c99cecd21404b6f5ce21f28857189513aa224807197fa0f045f8f9d699e33d0d6de8f24cea2289071d9fd228cd9f8286fd723555ac563fe16795fd73581efb06d832497ed960e9b5aa4863fb1ba5473a71d7956dc3c3925ad2dfa392eed72512a852505bb215f88cd394740fe3a9250918236edf1095d793a03c557552960089a0fd13654ba2e15cdb7c88131105510f7afae83d05d5ea5f703b7cff5a5c9db848530643e5a2cf05f2bb4ec7a9e26a0f9ed4a7bc4defd6374ba99a29e091d2d18e0c08de8c64d5a4dcf513c525c9f0554ade583cad81dd781d715105f9fd60a40927c62014a2cf1221ec5a1e170763c7e7758932adfd7aedfa5884fa99fa2828c8b31e869ecd499df47b6ec10152dcc9c204ff41287c1fb7c1a4c325663f62c8d126694ccec6ff0a22e59cf4992a6214cb8360268af9aeec920cba808b6eae4f540ac2b282a0dbe129943f9c8a3c114d771f1a15ea7cfe397bc18583f1907a7b5c4bdbe9b37ff066b1055b4a72f0ea46849a89e5a221343e4aef0b404088fb76069bfa9b731a14126b0266f7619d7964df398eb3bdb4d1561aa2a9b251b81334a2786d3e3636badd720a808ed171f12532c5f9c47e98b0ff8b75804bce7ac965014a477a017ddd85d0185435f325f99045b99d361387c21a7383db5491fad3c3d5a90fcd345cddc6ccbb7ec7bfbeb65a57ca33cc0d17e497810daa67412008f3e4c153e828edf62ceed72aa2e35d80fd270ce37e16ebe21155a48b62725c00a674ceec2e98df0507aac5bebc81af77cbef22f9ba0cc470db2b5a6a3d1e85cd651a231bc70b1ea6b2023162960c9653f2731dc1a410edc763d5752336d80b7c21115caaf537f3748159119e091974d1212bf6b8dcaadb512a46fc5fd43e7a366201370577cbca82e524947adae0b0a585a84236733536a2148bf61dcfeb198285d417918342ea561a10fafa295ad4120f0a4b430bf196cea45539ed1c95da9eb192718dade16696a913f77ae0a38ed538cb74b039bed54cd9f4d3d287e147c654e096764034f99edccb9b453f8fc971045c4e7945375d5f25652c5b7a95f328e26e4f1c13fbdc62d87a087d3895e3ecdb074cac01dd810f8f18cd1bf2727eba409a7c6803a06da516bdb54b321cfb73aeec9cf617684e377b8689c5ed35352a967 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000074e5e0a3cb64965d70fa6b1f8f7a58fbc815d602cbbfd23639ad5d1e5e75901b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6593a72e689b886b8ef747129e07029dcf0acc676058176937326c6ce892dac05effffffffffffffffc9fe544d78de9957b0a915de02a72bf90d9af62dffbd9b42c6e23eb29c5ba0f66006ef862130010305afdd91094db74277f2a05a94e30ad8d323a1cf581c70adaa0fdc02009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aabab43ddba16020f3b069c268a6e559a56d924956381ea942b958bbe506e25d8d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1732065f6ded2690574705141b370cfbbc12740fb34c4d0fa97443eed8c05eccc3019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a246863fd14d526cfcd5030afe76bab15ebfce3af94ac5b7b024c19c0fd0ded39ffffffffffffffff52882685dd4c1de20eb96ae23bb74dd39165509493ee463b23f457a1158d6d70414919061f17a2d457cd98a124c0efa264d0f444b54cc7da9c4b633a6552d54dc19dea7600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2508eefbbe502383a8167b59df03b92cfdfd33249f9d17e8c6c607708c42c4f8a616185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a9cc81d07a4dfc1b9fd7fafc60cd650fe9dd26f00390872a94553aae45be38e700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58ad2bdba8fdbebe04c5911f2ce5d7c8e9782f7c6f37dac3e02db816ef0494be8700b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c10b6b4d1bfd28a71095968c7406959d8400c1233608cc6bb25671c6fbc0f9fd44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861192ffe73ddadb0e1e39f0fc978c861661ab0a97816d4f456b8cfb5947c29a591100f003000000000000a35361e616298c3487d0301d01e28f9efadb6b86683263c15c016eb70029e9c2ed36ba65e6dca2a1a77a37209777d0a2acd8d023d3bbb9cb6e7371506f436308c95d5d6b23b4002a24165a407813a8bc71ee6b07f029e669166068e2e81d1d4492e7029755414794b66277c18e2497a87d93bdba215bb8f1e361ebfa40167cc8e14ed09ad7f6500b39c0eb3978501e768724656f41f71aa3844bd72a19252ed4e59ef062c8d994cb5c098a288ad59a13a4ecde2ba90b932aac6915c458b04c6384eab54975e5a94c59fd2fe38cb2d0c7b47e51e533e5d0a56c3ac435a8fbac5743b1407592db38eeb99cc00c510136dfac9e72849e5f9dd5a919e5587719a29eb7587bc7aa088391cb5eed3bc9e55479d3a1efe5eb1492475a95ce6191a0f351a0a516e352e4b03f621b648d3be5527125e072f413603e653889ff6f578a76e5e0d4630c520578afecbebde0de3409b3b85073d73b0dba826c83d0ff9abffc09cbeffd4daeba574d50b87008c6d150a0c7010631cef2179873f5dc58defb4aa198047871dfc7312209eb4bb8320a568a7b18b51ec44658f32e0cc4f402b39d3db0930db2ca4aac983a1bafc608b47e07ad98afb4ad5f49547581ced9b92b69ade4b71702c5bf41353d643b25d57f7789f028bfbbb32bdd85e34929fe6fe9363bb23f189bb9743dcd7cf2c8bbc1c8e2b6c1fb4ac7a9e696661080bcd6f7874668d6c4a761179c13a32649bec3cbafe39986f961fc8617e6f7fabe9433088a9d5bace0303cf06dfb5e9da8d52d90477f22219a501a2419a45a1993a81a7fd4bdff0f470b323eafba221ea73fbbc08ac31959976e8cb64c1c764169eb2a4b0c7d49d2ae07788f6b8d5750b1d984f74c6e5e01c7a8de0cbf297a20b7615382b7d8043fb3beb82dd4e2d4aec54cb4fe50183857ba8abb40b0317be72280bd2513415a2ad3c6419a1eaba83f501a2a4a89115454223e4903b7b3dad37236583bfc1cddcfeb8cba8e1580026c3e13612bdfb961c4931e0e239b7105f0e13b8a6350d258d0abdcf3059106b1cec40a228f8bbd0bd32320f1a2f0708605b88479db74b5df1a84131dc7107594a28956b41c2b2101e716c073b83b5c2fe9028de8642ff17c7e0271da5a947a009331c76df6ca41392198e889b5023e2eedf505c0327ba84a388ac3198b66a22207904abe2452042fb58c1a5f984e4486855da0847c43e5a7435377cd15ccb94aca286aeb5051cf19bfba54312806c62cb60ae25059a07088528fcfe2ff83290e1d65a72b83ce5f256a6daa5f347da8f491f2d061f0ea64ae27f2ab30d8e2c54d9c52d4aaa252975ccff6b9d206b11974522c8eddea0134b204761c30d854f9b24c40f179b632471ff89d0a529ce675a8a190adeecef06294e2ea4e41d1d795c2636d6d4bf3a9672d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000aeed9fe2f6cb44260ab5ef093d2ba3903f5ef6a71c62b70f1ab6dd590d98264701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6555d6f375eb6df9f0a1b005291cce9798706d4b84187d2764c059afa439eb54e7ffffffffffffffffc9fe544d78de9957b0a915de32b1e9a49a6e545ac94140d941af33bd621063b68c48f954631d8346f2312a59d3a65e04a6ac272e5173fa9c2534d1ee23c2dcdcaffe8c14009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a6d21f3aec10777fdd2c6c90a608f3d2a6a9f215a371fc83efc699ee346dd96d9d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17ff7c51ee86715436a59509bf90c110b861ce9f14544b00bd08672d8bf4316433019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ace666eb883720010d5316f9ea24e2bf789645bb2f4c63a1749dba083a54deda5ffffffffffffffff52882685dd4c1de20eb96ae299ccdc6cfb3548881a2ee3eeddfd8940e897dbc64b47a21eb22cad25c6f7ffda3239b7b6b5b8f1c8519d1bace8cf9d3e314f823038f47f4600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2503c345a3198f1b20b1990ae1634445e5650051ac90f4714c33822e9061446f9236185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4cd83e0233aa41512ead1e2efae40f09c709e57acb0c7d539a06fe1774a803eb900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b583e5d96b726f633b3ec320f2c716f6cf731d2855aa1b8134b3910ef15f2b430bc00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfe7871682759ad325fb81b93bf6ce6f80327c4f52a4653ccecedd8baffe21ff04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086119328da51a0245a68e289d40fded89170818016de474d8bb748c1e7b71d568e3000f0030000000000008877a531c8e6d7a10b71e5267c40d15b477f61b918b2e881dffed1a7aff74e32bfc7e954c8f1d493fe148dae5c59b60f88f86f2c910d867ae1e3d6e03656677e6382d57c81bb5e6ac1357825e1fb9e0f93cb1a4e52841068b7b79277769f9c74b22b71128cffa9a51f9ca78c6d3816bb7250fbead4f39e90cf1174edb1ddd72b133c89237d095102460de715ccece42e96fa3de17e2e0e7e32cf4f3d5dd50b9eb2e1bdc72153e0cc64d1442f89b40102866070bd921b761e01fa599ae82f3b1faca489c131ea8a6c2d6885795f2ea918e4ee1695765b3aa4d3bb64eb81d1931eed9795aba6c416826bc97fc4f9dac66791feba55edafc473539527d71202dbfa9ed8aa45b241b0a4b6d586d895faa1ac79383d12b7f7a7752880ecd0b60f535fa8a84a99fcbe24a0c54d19ff1a9aa050cb6f61559219efa0464403f08a13304ee61293cd63449d1c1214d1702b85a14aa809e9ad1c2e1d11ae6c2f5f6d2f830d2c2f7e4667f36a02813c10d4cc79912311d9c3675752dec8c92c94b17d9385ffa12ef138d99a77847fa5c0b14ce89406333e87dff10d692b93bd6db196c0c3e02ddaff74b54375ba0f1b4fd1ae59b98c823c5eae8835f110898c2dd1575291b51907fdd9f3bb504a2e79d09ed89cfdb7807ef06bcb175830882221a2e0c927b9a5d1375309c7ffec139656d5ee125f15aa3c9945261f54b7ec45be3771ba1bcfca4f64e76cdf3ca5d40231dcfe20a90036c757b621f11efa8dd3b6b4f7e3ffe27792e6c60f1d378c46c3b5a457067e362de6ee5502874cd0995d7b990553d66cd67fb8db4ed607b216bf7165d8af483498bc8f57193ac3d177862a0559732e1c4fe86ae7ad0606a5c2ea5566f37021697b07e8c06d7d7d33181f51042bd68b5e001799340816c95bc41ae824c6d9ea17f6d6b109414bc7bdccbf1c8b6d125f554898774fd12a1da2a9047fba2c4df142d1b7f37836b4342ef48c78b472109f7e63d60366c598d74db343d5bb0b10ac491fca6c7a56c68a1c68717fe96cdd3b49daf9f3fa17a9082fd8db794f4ade6917b459675b49809a8df5f84639f7b1e56a2a60009f76ea4bb4abd7b4699216412ad96f6096a68fcbfb979e00b753048812702f913b426c54775303affb5b7c3d7138030fc5651c98d39899e8d81f38536a1bad3c3174673dc2e91125c5bd592a72ea1d6a86b564a1bcb44dc063cd57919c44c8f80adaa17691696c3b04a3383f2208a28c184b869f961575922b9faa321a393a08d1879642e9ac971874228b2f065b8947b4aba3a7006ca665bfb0463e56803e1d710fa4c1af6b45147502e9a34ea52e503615dd37af493416005079a66d5ac4d9abf28d8118b13ef0acb96d753417229943a12cce619f2ae030b344af9cc229f2b12484070bdf76a49a4326634b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000161464ded269f3e0d2ff8a755d029a74d81be8786c650b86f48c86bc0987026501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65fa10ae484f2ccdff345d08a4bdf1e2dd4e937607ee1b6024446ed18c155cf54affffffffffffffffc9fe544d78de9957b0a915def6d9c1c064a3d7f38529cd38887b312b163999ba7838bb3c3ed44132aa314de85e4af1689e01a8e7313a7d26d40404a534c0cdb8bee2bf2b009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3969a0c36d8cca97272594655e8df42c5a27ef162ec5b3798904e9e80080abc6d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17287604161c4c2b7f1e93485cafeaaa58b18c73d5c73ac674cd17f79bc78c5442019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75adfe6016498f053f0e10aa93c7feb786dbd49819b774d689a556a1dfc21cbce53ffffffffffffffff52882685dd4c1de20eb96ae2e3fe0c58d2864237e3a8f130f15961258334e277cdac18e6b895b17402fa97e2bc90fe384235b8f1f4ac76dd5413337372a5bad366cb6cfa00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250c1390675c78a3f94c424a2078d1de4882d33b1f45517a71ccd2157fba7704a1d6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4b7bb421eaca50c81cac268cf5971dd0886fed2dd996e312a4e851a17d84308c100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f54bde33e4d29ff86e603007dca780cd4e950b865685d42b774d12be4094d9e500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce2ba14135a8389c694fa9fbba1fcac0bd46f379f73f6a6733c95159eb6dada6a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861176020e45d34b202966c25e10c357fbb567e1bd7d2db707aa0804f39e5748873500f003000000000000b32d044799a482047eb4131a7cda7f5cdeed212c9257a4f7752aa5d8bc6d7aa8cc662eebdc218f12bbd2a85c94f1ba12a7acdeb3d03d0fee15f7f13fdb02401f22ffefadba4610f2c1989dd7cd173a584c9a06e5c893488c16b95210f928e0c298259a4f06ec6eba083db75d4be14e3e84246b580bacf6ae04b06ced3ea586403092cca501a1267d3e821cc9b9747990a07e609fc83ce9f9cebf432007149b38c5b79cf67cd77ba4af9c1ab6bae80d6ca0059b1b82514e00d30a10c79cf199e48f040e0e7f0891f6a913c1dd3ba3407a1c887b1050793137c2779302c8ec61bdf4fdb567875c5a40f8e30c32df0a57d68501136a9da17700bc6d7bee5bcfd12cb2bd49158e4a4853767139e9ac88bf08e66169d9a15ee35cea941d2c3332535eb2a96fea471016f61c33e492e0a35fafba6d4ccfe875619c32403935758a0561e0a01cfba2d5621111a56d90cf2ce5d39787bf4a9391fa971874a3572089ce9f3cdbce05d948946a5d95e3d6ad36fc9174454c588443d2d0f8b387e208aa0c30aee503cb42002a0fb696210f5fd5e6d12138b629ddada3bf12d3139ab12ed359a83994d161ad44788fbb5ee8133895e4834a12756626f1b64b5088cf4bac2893209dc2f7e80177cb10621faa86e5673f26ce8d982a22f0893c84e4147b55b5ada6048f784593ec030222eb21020aa0a38e0040e94445f3639b9e9ce8c598c4becb16f34cca61a153cd4658bf5e3f1dcc4f8fc570665123f455729a69dd220984dac92071642942e33820acec23e59060e86fac61d53e18d9f1c87a8d5660c3abec117830ef8a7a4e4cb5930a804df059749b9d24a48042a577a93526e7244ba297e99bdf060f04005961b223429a2b1d3d833d5d2e47294015f02f2a33ae80a473876bdbc488cff10cdbfa288f78050acf5f08e7adcd0464b30d3c4d6f1216edf0d02097b9a3aba604a128994cb0f0232c0de5ca1f334caecb579c22fb5bb6f176b002646aa5e7a39138f937b555fc4eef0710e3996e5f9c681ab441e9e9d054e39bdedb4c7adfb62635a32e37866649e19ce1d56d1b881ff5a970e885db450ba4cbab5987390a4645a783d081a2f738924e42d570991934c14162a4d637369c4d98cfe0a3cee0b5cf1252483270f730374b8a709fcd4d2697cdd0e5ef9fa853b114a5539a41a21e14470a2fbf328b39570ebfd45d3895fe0c79788260fd0793613d03d27508362a3a3e9b48632bbd16c6d2ca58e7479d4b44584aa8fa964e8b1c09a6446448f791e69516095ef7581b7127e121a9d5e720da3c948f07052be0ccc45046f6cf3782c3935a9c3b8c1c133c9f6c501d5b7d6afe11eae46dd2632bcb93b682739fccdadf02f625a12d8d6fc731abbf9b86b1766be29a1808858d7a76834d7f2f1489af1e2f48dcacf5c128 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000007f6a0464f2a53394877788118770da119240a08e83b97fc55aa68caa232d6d2e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e650518b503cadfd662e2d8da4079f17d08f2b16273f0f19b4a1617b2dca3b5d266ffffffffffffffffc9fe544d78de9957b0a915de3fdd4bf33cb82bbc97097e3fb02a8159c2e42b7ca52898911a5829cad7b9404df4881902965c1cacbdfdf6c4aef09bb0fb0869cfda3ae8a8009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a1917f85330f9ffde1368072c8dd7a9a610c6ca3cab0965665f343ea91c79f421d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17201d52943f664a6b5b1504c771edac0d2edd918c73a5578fb084b882d66e8a91019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a9d4eeb2605f2eef50af1d910512cb01546357ec260125ff29a7d4bd300221781ffffffffffffffff52882685dd4c1de20eb96ae22e0cc0e3ef59fcff103f3db7edab8e3b987687a4247fba95dad6abea155bcc60990c488e710edae2123a0ab0a69877d5e852bbbf9d4f22aa00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250f4e3507827545c1ca231842d5447903d52f97990032d18a42fee9afd61f78f2a6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4bcd357dfd3d5889bec9204ed77259ca0926797b15d883cfe3a373dfb0b56830b00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58047dbc2ececd95b5eb4f75f91036278c2bfa5155c2bb840a76e74fe2ffe22e2200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c942cebe6c346e086ba43c1f95f2348ed65b4a2e308fa144b4872d826ce7b67d94bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611cfedb2b661ca5ef110a9617ea64cdfca41ab3715b6767e3dcd0510e70fc1a0e800f0030000000000008747efcf0118c459bd700f51426a5a7fa70bce3c0a7062c1dc09dfbeb360eaf5fac11084cf9c6d431784b87c6db16d288b4ef16063469bf29056cb58c8e7109863c0ba72b48f27c4fa9346558f4947260b2a586947db75620bcd05c00e36b4e9a85f3ec71964df5b2d50e6ee2b75fcadfbd2c221dcbaa78f655498e69ffe68dabd1c521787e40e51df3bb2acdf8615e59311de3fe5699fa8bf63fe9fc5c8ee56c3df8728891948e244d47991fd0b115ff7467daa7e6137ceab160fa84fab8955b69e0d8b332fe3ee0e698d75a17e38a90a9a5f22a94d2a8f22b30027ccb231cad6a49b62fa1774cbdcef6a2b3bd6e948a92eb8aa1b4bc16bc842abce2ee1c00a7464ab553298a6671f97563c870ef6100af6617a3f6f7252a4f17067afcc138085163ddb425cffcc40fedb0b880f5199bbd65ac524774c05d830a7d552b388846db2366fc38a033694472447a5dfcbec8fa1701ca452965f68a9fa8b0a47d56ca45ec8a135432d2b74ffae4b9aa77b5a6acb4dbc0abe32a3d4c62206848dfc18908bc65e58b69d4e418f2b2f1702512e349f2477b21ed3ad085104a8c7ffaee53a150f7a728528495966384a7614420ba10ad2009b5c19bd29caa6171e90455f582927f8fed4ca116de236e2d1f493a1758ade8c216f3c3ec8a7e0cdd8756e1faeb541097aa741666c988791b2cc8ada97212c467a3e1ad998b7c233f55810ea92fee89422be47c478ded383dadba1d957624bbb24b32b62b9173789c04a216c26317724c72a9cab08d5992efc4c0e3b4a97f06b6808490387d6be52925004719814d4a3d2f4f9ccc63d9bbd49a57e32500c285e235ff729420d2f8d288647e27aa3458654162952c6f2b5233d584c359e433484fb45d74af46bef0f17bcea5e1ddebf26e552ad4078078be89a3e4f5ef7404c021ffc6592434add63644f9b5c4a6d3e4b015ad241e73d8755e4222c6fe4d5cd55ea3fcd6fb5a3b7367d0d0db0e44ac19c8b48524c97ac89625ffd2a53fcc082d8eac8c4180060393ac84098338a222a1fe8d186d33a9570786008d23c6f4ba267d5a38e32e02485068a42ed5a2146a0f496acada60d9bb98d2fe5b228d54bafc80f7cdfc0d41582bfbfc8f6a6d0259d5c004f3d9285eb4fc094fad747aa0273191a8794b707d3bc0e020b4d6be66307e42790dd360f00030d5eb0c04b2db0c359b7e5d4e56d82ca50559453f7c5fd5a7ffb9eee821853ae67e83414685b149faf1c7d79a588d0fd9a9fb882aba85289b84a9c7eb073ef6defcad19e4459375591632748e5a9c608f701389640a977a1c89a7ec85ee28eb067797f88181e8b815e699e5f3e6d9cdf503197654b55d2e3d5bdc2ae19aea0990424890c036c233f8843a99d4e42a7ee2e6811e099a88efd5e3a56aed63728cb494a29494a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000009617a31ccb8d6b96d44e1d1b846d8fa5c729b8e10e2c011d0081759e9b55410501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e659e80567588d9cec8b70b6978d9d96a9df5994ac189f5b3b6a37a35dd9d08eee2ffffffffffffffffc9fe544d78de9957b0a915de4ab7dbe62847baa619815f65a7aff3381eeec7010683dd9c5b153a87d7ee5d2d2b523658aa666fd7d287729aa8f643e83f80ec8eb03416b3009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ad997188f5e90d9fbda47a9470a6e67c3516f4ceaf007bad9fa074ff4a98c5a80d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17bf1bed24be65bd4f1f4f41aff404b659c450a8e35db675e72c62b43b407d491e019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a458d26d8302e66bd035a07356a2938dd1da055a981c2000d5377cf64a08bb0c1ffffffffffffffff52882685dd4c1de20eb96ae25a45815823cb681117c877e97c08a69f47fde0c6c0f969c2396a8d086936de2e0be452651852768456ad6b00eb1345a1c541a27f76512dff00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250422bac7d268ea1b8cb44cb55e63edfb81779e22fb2c0d3a378524bb3404b1db16185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b422af56ecd095eeed7e53d3d919c0d073dd1593a2830379cac59cffde100ccb5800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58c22b7be4854dab45da5142167b8132893327f6e7d3f615f65b479f600356e68800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c58283150af90f7415ddd28f59934ab0ac934054b0aa0131a049fff37854700cc4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611699b29c41175ea52fbf2b923aa8c464e1b27b285cd5b2ee1cbcaeb0c961f19e300f003000000000000b53e9fa2c03377f13286f1335f277fa476e88dc93423dbf5dfe5d48db56b4838c90830e2c9fd5200e8bfa2b4de13a9e790dc3b67ae5294c22f409d0ccf0a97f55d55e97b57a47f8b20d54efe69798942d03d1d7eef899c1028c1c39a12dad851a34d6794435e5094e4d76190cb74b997082532df3a756536484f8b2e71d93b6ee1f29262756e1bafece2a0ede1918d3f9497b1c40468f44bb496b431d65895e80482da4aecaa0c7b86cdab0110e533fce76f3fc3969908db6fecd478fb69fa5ab5bb7ce9e766435407f5c29fd0342f6252562c14408d1d231639c25c1b170f4a6e8249f45a319517d08fcf6b9ef789cc8650985639d69b6c4b300e988430676743a4e1cc2758298a3f7bdebedeaa52159635d72d50228e5a86f962cadf03c5d38f67210e62dc6206d8204cbb4b7dee0372149561d4f1f01add73b5f1b9720bde3f7c6dae8485ac35d86a6a072df49401a0436bf5b7c62b213d88454d63a87970390d1b241d16d5ea8af109e131610b0bc77546e20fa9027f6aa207a1fce9dfa4b02a322cd28a7e8b2633db9204075c79fde268562936431200554f41ad8981fb29f0f9f955882eda47649d7986b709eab8d667ac06d9920755b170512a1a98852280c3e54bc1c5602a63c11a1899d90a8d312fa91f672900a4f9bbb2251ab7e3b7858c4535973f0729389fd3f1c2eea97a32db8820c6c3a1ce9da2a25e6095a6b7362126d9cf28f4f90a102a1576c47c36e6bfa3eb44e2126bea46036da8cbc478c0d8b00264ffe3077cae591ec045418e9bccf2d58a3a25306f59b8e6d5aac194a04aaedfb3f06ab898d6d57cab334875377fa114041273b1e7adebe399792fc865d1c6970679208aec6f19b821ef22d7a1c8c93243c5a8891a00ecd5857ce0b24bf7975557dfce0b461b80766acb6c7faaf20c54184c09a97dae94ead4a8948cf455b377c3c1c5949c0d999677460ae923692454732c50f7dd1c9762e899aea83854a73984585c4b7a1d7860fc5a60c4760901dff350a9f4f2310045893c096e0d54abeb37ab67ad69665ba04c860e2eb98d80314639c925da853058acef937fe659326e9247d20eae4d6cf9af65152c8e88a2fac7f704829fd8382a168a3a056dddbbe9fc6e5144dd653c8db4ea3baad313e519daf55de5f3d87168d4374b323ea420d613d1b36bdcc543a72cb04a96a88ba887f7c68e7d9a9888ce9e1e6713477b2f93553d538888d7ec2c80611bf45a855834cf3f5c33e000ced9ba2b20f9a5ee3ddef75f28bfe1a63af8cbaf1794d178af70b00329966dcc12961b0048a238d99810a9b917337d065a4dadaf4bc5a3b268563adc3f92d064a0766edea42ab1cf88b1ccd58c54d8cb4982e0ec28ed5a7a1c4c47e75a885a0d21f00355cc8d154e857fb790192d6faeb6c24fc34b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cb8a70c6cd53377ae2c2e3ca330e6fac826ff935400f20f5739046b08820e24501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657e02df83234faab59cffbc237543e938909e7c81f30cb94b3592f9d5da6e34b3ffffffffffffffffc9fe544d78de9957b0a915de4491715e7d529aa33d7641982e2ddfed3483cfec3d428d3ad17168b1e2b96b753e03543cec2621593cf3e373945a2d2ae0082ca3d4243003009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ab7a2483eb4d2f7fe69a9010fc2ea60f01bd406941d137cb59a9bffe842dd07b3d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1790838cc6fe4febf5f687f1115e90620dc17d4633ea0e51a831c88e198a177f17019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a66dd4023e6794508e9563a193ef18e76c133703ef2c813599660743ddf0c79c6ffffffffffffffff52882685dd4c1de20eb96ae24dc5c9c6baaf7a972fb6c5d19a24776c1613e217c171fab47a087b69741fb952affe3d6ff98f9e1162cfa802dfd2189d4e0598bd19d0f56500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250f3ffc4ac21ae1efd9d27fd06efddda7375fffb6fa38772188d55855f9db374436185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4f9fb9f48a55356f48ba9e153b150834594b309d2b2947b5896702f9e9ca4e0db00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58aac9c4036fe6f1a83618339bf0906204a5a063b2edca2742f54eadb7c46ca88f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c98ec058f7c24817a3d4abceb5d35462f0de5a9b1f79ce12eb073845de836ffd44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d30a08f39e0a24259878eda8769cfd722cd399f41ce451b717782e16d16a650a00f0030000000000008a7ecbe96167386800f455bd3ecad1644fb18f409dd7d0099aa11e70981bf5b60a899cbc270f9f03ca26de888486b1d485dd4b80e41430e12dfc67d0ee0b7289c0e6405094279563e64dd9b358e8c956a55b8f010e0e54ed52827f527b786c3d8a11e8f74c91c0215cdc77990cac29fdd047e43ea5a272bc4c0caa6a6f39b7ce996131becf4ef1fcbbe40e153adf704186756561cf2585c1de8769220160a356822e7d6c27577ddb5a43d0d22ae6fb581452095126c349afc0e850012f765965a26181f1686b4ba963951d03f395f98f162e3e7d8b6e983642ba3c85f79ea332173cef2ca756f25605dbc3a849f728788a504d4662a4178c3ead878878169911bc1ced561867586b6c936ab3bc0306e44b242a701a9100bea7e9cb1a480355b48e7fb05dc32da303dfff340f7768068dd2eb64f4282cdd079dc715a1de39bb76a71f484fcfd4635a8edcb5afc76fb736a97b6c3aac6fa52d6c3c3dc6dfa9c8b806d6db25812013644b1aff8e089193a0ab3d4e4e328892f1c04f80aba942f1eeaf3cd2fc2572a1fbfd694c52d484edd4132e191bab36483a5c03d5c172eb5f81cedbe71584057a28c226131c444b962ab9e839a091893481beb5dc9c658bbf6287457b08cb917eeb0971e2ffc33910039d31d01ece34db705ae2c2e9d68c9d18834a56ea4b9b505dd7c7d07f622db4fa1d0c922728be60390d4322e27c7f1f7a86ab12394a19ddb19dbe16de928b63b18f9001b7b856a1e22ca1e6d3bc8fdd8c5c576fc582eb3e9ff36d2eaf103b2f67547eca71544bf12ba3985b19c3a5948e0a975a36363766ec2fd41cef58c67467c9741565344f07b8fe91c5945cc251360da45e04afca6022624b46335554c2709b8be71d282273fac15d935dbd518fb56df7529818024e30db2c17bd0f988f24ac32029ee0d05a66ea800f5d299f3e36d40e673c026dd921dee72b0accb6d63892681f4a491225c852a3442bfe334464a179fcaa7c5774110a5f76ed653df36860150576b0f5807c4cc178100dedabeb228376af72864e8a226a22e526bb9e32bb214f507f8018fae44464d6c0dd87f6d480c09d573ec3d587645de579be16641b951b851ed440b087f229aaaebed9ed230a4f6749fee73eba748c034e70c4418c1d90a19c5afa5e6cfd0773f8a1a2276107b950f5f7661adfca9a92b02a0b31b9c912d7f305fdbf1f5ac25c5c06299bb98e37e6635b92bd2755ec4866964706e8ba843fd39fc5e2b6e04ee7cd8808c03f5a74bda1c1d4f6d0e4489e4937cc446efce3d99d29da4fd5bf3d163ce792aeb4a996dc83894a00b767b3c94f97e353cd2618a1425c9b995d9bb726d3b0538d07c9621cc4558b7e40181906c31b7a3727c8bfede9a504a77340157f46ae3cf25b9ad8205a9c85b4596ced4a2d3e3e5f +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000eb41ed341c6c0266ba479c0c98cfc28f321588c2e6b9a5ac58fada88bbcb393e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65818694e7aa7dad39aab5ac05900242e042238a1708ed8b462e41367e0b9b395fffffffffffffffffc9fe544d78de9957b0a915de3341676a4c71d83698b5af33632495ffab79851cc470d6851c29568446ffb985926c6770a02c151dafbb73bf16d1267cf7ebb1aa2008de07009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714acbdbdcd13bab5f5dd58c013a2b3c395379be5c61bb289a326507ea64e5b44268d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173f372f4f494ecb7757f60248dc7d6e04624f74e198de82834c7c97d549636d89019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ab1fc7c0f61b3974514b58a021eda6cffddabc02ff27f54d208e1ec3d4d22f388ffffffffffffffff52882685dd4c1de20eb96ae2a7a076708014409cc4a875c63527376fdd28d0d9e52140be853e0303f8968fc594f6ca9aa2315b07e2df4f4549a9625f80f05d175ae940e200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250c04693b4c453d3a34d88cda81146909f37eaf0a3fe456564b6a3dd72188992a76185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40526c920c0ac53567a8a13031ee71cf47923be1d2a3c09bfc693ba956f47127100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b588fcbd054fd58e52374b08fc38470d31fb465373f3a4cb9b1a83bcad6d02ffcee00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cfa37ff2c4be87ed17c49cf6d2aae6356c9e4b94af0f74ff3a30650d423d9973f4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086112e9d6a50f3aa5c583d7f26f498afa698e9fe2a14bdffcf503b91353b7387c7dd00f0030000000000008820c5dd761682da9281f1e87f396210994cfb7d1073154a0df1f2e111881d1b6e95e39ca33f4d4b5e7a61c7211a285d84398320d06ab9245a90905f643bda846e0b65802b2b81a3cddb0005883066e3a14e8a827dd2bb7db566ebb6da73a6f0872dc5258e365ecb08098f815ff4ae13cbd7c2aee34ecf91e4f74dc7285573850d394f3e91d7d0086b81094d28c119eda898cd59d7c0c5c6a5aa002d3c75b4f78a26320c095aee1bd0261f6598c2f58d74df17ae3202de9a0ee70d4bb588239aa4285d8bb3664e8f81cb20e7a71f79d51bcd4f1fc0486154e36ddba77e48d12090c279041c788f2bfed0822f6592bce2ad24ab5e7819ea376010068fb2988b862c938774e2272caf1169ff1d5b88e45792e01f3723f7da2d5b44d2ad4c4d573195e399b4816f1ece56ff641c75b598d6244d2b375513b46b6540306e2a8ee45e7368a6356b929939adefd02f1649017bb5b96218db0aea2a8a02c251175b07d36d345bfda926e54eda8a0d4e22b4e1e1d05fe207fea61e6a2236301565fa9739b4140e07d79c70d3cd6edece7c712cf223120861e95f3e0441a7ff7efc139fe970f88bf638c9c39470ed1073e638428cb5a7aefba25d513f45c108fc108e7c472141349769321b341587bfbdbcdffaad05eb360f960ce3ab92f5b788d74251a08a0985efddb63a41997e22be460147c26af6e22431bbb7dfe98f3ddfead677218fcabc0bd8263aeae37a1147dd463921eedeeed4efbc4f5e86613e27d36a8c290e08a20ecbbdf3a076e64c7d2284470a6437a3ef1e80b34fa10e216e8aeefc39c7141c0cd1ac5420dfbec95e13261f10c4734b098884f723b515fbccad1ce7f284a083527a9de6fbf016ed247d4a701a13c7ca04cf5676ebfc79ce374ff5aaaede9b8618199fdf8fff80c8a50572cb1aca74830bad4f8221ea2217fab41565afc09edd6e7d5fa3455bd7bb5afa922d3f4ee59772d35889e5d4e7228049e908655c329636ed28c8b39f3ebd440c928b542f4c6e35126b963850cceb5d77a14f4488cb202db38399f6e8d686548990bf1ce884bed13ddb0533a71f1c9a887dd1ee900a513e07c4950d40a47ff336ca3933c2ee374dbc150ac1703b96eff394c3ce1c02ac8278820f7e2191c9ef4b3020675b6ae4534aae87f313e2c27bd6bc2cb1055886a466757b8663701507cb44996fdfa0266f8e8db8f837a50d5b9f1fb3b8eed5f66e3d3e8b3df486deeb0358aa0b9204727382c584438c10b3dffb0f18118823df9c66eda703a13d495db412ca493ebdf98b97c078b4a75e18f4af8772559792b3f4a3f38edb352afe4cc366f5479e547222e2d82ae163feb94d63423aa1d126764d6563cfb2a40423f789c07b2fb78e6cd0b5102baf1c525815ba0b1e4af08344b01ded096a83badd637563e11d +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000000b7262a80ffd77518bf1862d90a9eeae1fc626d0249f1c3c4c084e3ab56996901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e655bdd98fa8ec7e4a05e8f609f969ba7cc5acac7acc67fdc0a394ad29f16305c54ffffffffffffffffc9fe544d78de9957b0a915de29c45b92cd32506ace63d7d11b40fc18e3961f64f79488bbab5a7ab27452cf4907e3f09def45a05a4f989f134910e6385b9230363bb91cfe009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a6c05fa705be192bc352955281dac31490af63f05098dc998c18d42f4b668179ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f170d3cfd7cbaeb1ef806d25caff06f4cbfa2a0caa48acbc1206a447b1bb0c4b19a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ab170d1f1b2f44760cbecc5c07463f64fb47f39180b3fefa1817d53d1299d640cffffffffffffffff52882685dd4c1de20eb96ae2fb438abd10c8dc4a01f53c97e97762da0b8f6abb620e83c961b7a1b28252a33f5d29fc9ded760d713ed325d44bbeae17127231d3fb20dd8f00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250e2fe89b913599dfc6923c325f43e4daae48dfbdbfe2e1222a0805f0577b13af06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b44d989243bb81675f830806b1ce1c766142c5b230f0e2dbdb0abf36d9cee8ef2a00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58baffce3b7c1959aed797dcd4207fbdc8643039afa0a15c0ba322777dfedf89d100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c19c1629f34bfea7ae88c9d9e210b727a45958ac9a4c2f85775c81bfa07a466254bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114db345fb8ea95a275d117aebe93a50cba00c9620b6f8048c1754769afbfdd5ea00f003000000000000822db3cc7b9b23630a0a029b397858813b45912d07262705092a47a9e840d22b4705060052e68fc4e9cdbbceba9469b98c493d2b85c2368d15e15349ad7ac9f43881c20d5e5af6ac3cceb57fcdf14ac3305915eae0bb1918260b8a26418964d3a7c8c7bc772d879a1373c57e53300b1ae3388bfb0024ae2e18301e2e0455ffbfb1d5be3267336e49639556c8c4733c45aab75a12f9fe17b92bfb612ec3a316d86e71723052e6dd0f6e579178ce9943c66ed6c68a382a5dfda489cf0d78e8f3a788cf5c1925daf219455c49523e7d4dad5c6ec6eed89ead3d75637713ac796ebce7bfe8e6429204c8151fc7719399f4a4ae92b7879f45e608e3b18285addd8a3a3f71118ef5863120aab6f85b60e6e1f177646bfbb9d67f6ff096b65a50cc50cf81024c4b296c6b438b11fe0ed0512cefd2f7096d366f4fc33169047ffa0355b1d231bcdb2c32091dd634bf0b8faa82aeb2311373939ae5f4afc7aa05bb2c6aa5f71f784c36511ab480a51dc0948445ea46c4fa8a108e64cb55e4c4b69bfaad7f88e2388aba529802b10b17afa10a36701fa738d1fd49d75467146990a7fedcae5e9aff146249889be1c3ce1910c3029784882f9ade022bf6b9fafcfb9774f6ef9f9db92a6f53b6a7f1732f8e309daf112adbdb32c081c649d290788591d204dfb62fc1f48693bf1126ade58d211cd2a4fb331b2cf31ad0b633e6b6e8057a0d8a620f39d39f3c2849e9312e1071e6a364df92d123de2a92f4e14edf0943ebf41e6432e88c22e058d7baa95f467517e1408f1277f23ed32f1589c010ddc7aa6070163b89aaa91a6b5212121c9fb99c4f4641143717efd17012e72c4c77ed8d40639a01fa06b4be6d841d2b141f2eb0a311a989af3adfcf60fa94eb8e3523e3d631bd2b8a3476be15af7ffc8ddba949705c430540c63f162cd20e3432367c4e59b80b82657f1aac100dcd038d89f4d2066e631dcde11c08a23907307f36dbddfc2b61c4057fff7edf928817a425528f0a6543aada7db9d4640c52ab3fe6dfc332906f04bdf7fc2689586c591ce56b60e75c5ff4ee5e0bae1ac09a727c005773adedc1b74aec46a5a7bb22de7a5ac7265027d14a7fd89a8c93e2757e5108bc0537681775015cbdb35f190db9fba4a4f6bd4b41df9883c06bc6ebeaa8d97db98c12e824b6ef56fb70e79fdc6b01aa73c7420e254c5881df23969927ed59470e28ca21d52e2b7d7bf413a55c65c5419a0c1e6f5eed42dbf8b0a96813c97861a287286ba332682b081b17745ef9bca694b8cd6d14bc7718fc68fb97bcb0600081a092fd2a235011424ff3939b72512355015c648ac151ca13109cdf5e735349f44d7e8f4e032b8af4a7a690aec029dccb3ea80aa5273d6a4d0056f25732d79d916a4b8e586d59b285e84d3ca36e1f306159e46a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000016e29a7303eace42d4b40aef5ef84e76f195ac83c6ca14d750688b7377846a6401e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65a1bdfd25ff5cfa7f8ab1997f563d68ca9ec00aff1db5c73b717428d700c69113ffffffffffffffffc9fe544d78de9957b0a915dee34bc55d913e6e5bb587711ebc7d3b411be35d353accc1acae9cabc8053fa1050071bacbf2af9701900200c01e18c74015f053af28c3beb4009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a7666e329180d0abedc4309459ec0b7051836c9c2a38b3d8419c7b5162ae77d15d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f174b52f15718807a6b555dc91d742e6c6146f4a6b1baabbbf9dc8017e0deef2671019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a24701f5ddc17956b543d665c524acd0d4d98d290e2b9cbb51fd48eb781a72862ffffffffffffffff52882685dd4c1de20eb96ae2fb42319180e9b8bccd00c6339087af5e74088fe5cc83b0ec67d15720a6f68eeaa6606831dbf68f5ce43ac417ca76ceefb1cc44e73a5ae52d00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2509626f2faa63ffe8e21b3c16920533a1d9dad359b118e204c3006833be89538056185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b44ed0461c4895bdf7c5247005b2bf50b3e17e9d7ca3d2324ff618f6e31c8b5ee500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58a82ba21d728769e287f0a5c7a1904857199266027c59cd2eb6e50b5f6c94205a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3effdfa7257ebdb70f592782f828e0ac1d2c1a0e9485ddc798fc686da13604184bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861161d5731db1812c1d5033dc9c39716caf9ba8a45d1e09b9705da399ff5135835100f003000000000000b47b1ef2277a2aeef7190b28e0dc3013f192f4312a09fdd2268dc0761cb54403d76f922ac9a9ea21af656850f28861ee93ff1c093353458274892755387651d4b77e3b62220bf675d3f6f8d76f67b0dde8e385d55ca1aebd8de03d2e0e9592d98027d3b21d29f75d2f5ecda1f673a3638f7f232c53b95634e29d06c7054fa27c2662fdb8ab728ca73ae968fb32e71cceae4715467776a4c6ceca69ed8142dbc567253583d6283bae5f6f9227350f0bacca686ad5fae32c9583a6a2c913f2f1ebb972720c04aec446f728b371d29b78cacaeb6b197124e2f690cc9ae7648259ad37a59e87fe54548885254ad540117295a78659410b528284773611f41ff68db2d02e4a352401a3eff31b0470a82e0557d6bb22250c89f14cb9ff7b0f1be05ef18bc8069abdd174aebf9e6d5aedfdc418c7796ec1cf6c078cd2d8f4fc8fc3c821b1cd858974df10e05dcf8c39c47b2a76a386bba74fbfa601238e4aff26e526ee27de5d0269d41382a465803515355a380a6f60c827f1ed12382e384fa2075638a0dc7759d911e1b72b54f126d8749ebf91226e273db36cdfc0e7845ff40d2bc1f21b26d12ef198fa8f619ad73f91fa1ea06dec3bdb938a4082f2487e7789d1060fcb6f48a28abfeaafb918c44330dfee2cc6a22ff6fbf76be53728657efd6094b124688513957eb0f3884d38defbb21934f02ec85d4b7d5f6644bc6e40692fdfb682c1d173f2803c09c3b7be9b2719565edb455505b2d64fe2b8fb61c8d09945f4d8c15982a28bd3f4ef3563a1d71e4d32d4e6d0751862c78f3331ef350044b3e76d2b85c1279adf8fa3a9b0f63d6a73a9455d4dd9db077bbf93aabeb40223e7bcc6e597e0f237e9c4d10d6c3a0b841785419b518a7defc84e3750940abfcea76d5031521b02b603af8ee0ff2e005235568cc11e4936a64a95bfc864909bb63f9cb08e99a67bb40831a08bc134a4196377f530e111969854290d35502374adafe964e64cab93965b9c4bfe7242ad0e2844e073379536fbcf539bd2a9c534a8de68f30b9ce4224653b6ab7fe8b4f8b252d5838abf55b3544d41789d7f71088614e5767f4c04e42e49a107a993948d6935a1390f73dbc11caf4414d6adeb320052d0efb8d4bd89bf0f264c6ae8dd3cc2102fd6c185aa217900c141d225ea62e9feb5361804ebda3e728beea1a3f990315842061d0e00377a8294d2d5aca19e41f016f5da2bebd68e0400514321db8dc52c57584f3e68bc6675b35dfdce07894333f8ef54753361de86d5827178fa8565097d30f6ef396beed4d006366747c3092400ed2b7763acddd5b3f20a60eea1d66db31872aee26ee6dd1cdf9e62e36df9a01fe2a5c66411d55674609f4b3a906f348968bf0cf9865b32d7412e83d3b54ad0894cc6187a150f586c9fe24bb8315026 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000572b67e5fca1755d5c3a357fcaba9966fbd27b7190add43147122dd3063bed6b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65264da3be7529d30c17de84db408aeaf830d35256dd9370f688bd5af3e42e815affffffffffffffffc9fe544d78de9957b0a915de2618c56133e1ebc89556a30af88dd40cee2861b3a23dfec0a5333e67de4842b7b92e1ebf1e0d5cb864ae7145aca91c54071665e9b0de0afa009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714af974cd1657693b805da43ffaa7dcbb471a295302040ed593695925ea19a27916d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17dd8857edc16ca76201beddd66ebb1026069d8e91cf4cf9c061d913c8db344e05019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ac9a2749392358897afd16fdc7fd8fd52e527939b6ed4704137163dacf4c53eebffffffffffffffff52882685dd4c1de20eb96ae26a7d117934492cab36f15a2da59f03326b235568b1d64e070aadcbd095bfddc643db8c880103fa3355ca5df3d4e90612bd1583781408c59800593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2500bfda6f8b9d15696d6f9422a3574469b09123e4f070a8106f075733acd12f7566185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b47f8776297af4f8c667ff77253934fce65fc2a586b8d156697632678b82d0f6dc00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58df8f01507ac382e8014e7a93151714dfe1a8d203b1fa44eabf2b37ae7d2cd06900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cec7f31d2e9b75e17d9242774d091f6a89dbddaba8d2e1fa0a772d63feecc23894bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611068e57c89c6af1413a637ba719928c44197ab00e19dcb0723ba5ea3769f99a6000f00300000000000082a548f650a4c83e2c7eca37f4554f440dbdf5484c5dda0f418fc626de9e89c47f6dfb26435a35e0edde5f3393aac09bb45f7da2c979a4b34bbd974c41f317e43e366b665b5b5c1b5fa62c8b509774b1702019d27126af207700d8c27c3e4177a7c1fffa0c70f6e6725df2fec5663b1b91e24e0ebca2e2189d18c101f4b08a30940a81804804f0096781ae66de4e683a92e76cf466130b0e487eb973c32bfd5ba5e6ee98689556d3b3609825c11678a08e78c069df7728d3c328dd73bda715a98d2900e8b2dcb46b7fe1c9690c92c7a2541f51fcce3c9511e1a7f6f26e8ea1c62e9d7e172f4178745aa097fcf2824592a3cf44732f3c6b4da9d6e79c7358ca7d1a5c8b8c0148420d55fcc93148ad47bd37582027322f0cc31f61c10c877211ea87e996ccf630bea8f401c79589a6594104467e8fbb07378dd4b80e2d3cca95f5c649957e0107307fd88e8071ee4a31deab094dfb68e0519be895bd085b0fefdf0718fcb05f6cde55c78353f1cb33bff320f569e0afa4e0a5c59ba1be085bc8e29265c91023b29466aa21cb672e06a0e808994fb47e6d5cbddd8800a7e28a0efee9ecb153bedbd3de7ab76dcdca9283d7b06286d61a36950cb3a076bbd67e4c1d2d576b48ec75063ef72ec4435ceb11ad7a530507a618a2bb35e91ccdaca513c38b38027267ce25f09391bf4364f5564058293ff57019eb21fa33300ab4b98516067b36effe4772170238447f80a78e415d30ae340997421559c6faae618a5eb93653266df85f68b177beb7eee21404477cd1682cf9effa70775fdfb755eaf3974d69ac105a6a373f82c1d23eb28a3924772e75fa35866fe964fe62a7d116cd6a18010aab5052cda76f809a8e697dea67fb4566dd9db491b5c2a5c02669caa820bc1b49ff78b4e064517aeb58b9b2e526a92f183bbd526ac874d8d0b5383d946129db0f6689b3e080dc15d29bd939096dcdb2911d9618b5fad6992ef16a321da935b7f1146a5a6f419dd394f2ff5e036a7845aae72ee63dc25d433c7d35aedcb146a6ec30a220bdbe776dcafdb56e9a1bf5a81e78e8fdb9c3c9e618ec4b0d8c0381302fcbba77920be4ebb03d4f6c3036781262855d4157b33909766faf278645e924be6cf90af3986901f5df14336160c454bba07c8295feeb85e7bfdf8984fe0065583bf6aef23a96dec06335d9590896f8c3c8e3d02d98aad27335987f89126358452075d40a4bd5ed1b283dec0d65f0ca3a9aa927890c3d969d1f0d1fa3781440ffdf83356ea2d8a164ca92d44705b734129d8bbdcfbc6f1e85d6fee2e2850e9eb3662d1be2f24db5a9ce340fc55fc6cdc8ff6b76ba2a21f99dc1682079c01613963923909c0b0a829abc52a542105a6e2a1452a66aebdbf98bd5f0b9388a756a8ef4c8c002da4588672476869217 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000432102639517a1289d8945975216da09be8d8105e1ab99d4ea670f1373b6bd2601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e662789ebbe2d4500a7da9fe19d857992a2d5f61eb705b9abe92fab80e67f386ffffffffffffffffc9fe544d78de9957b0a915de5507e4767603d7e2c28c37b58a52a758142a1ce3facdacd776bd1b0b694c385fb434e44d7367c8443d46dbb9a197efa04dc891b0776c07dd009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a1cd24f49735c5fbca5b49e91156c9ae6fa6fd34923af5b260f6eaf0748304aa0d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17406a6827562e6eeb6d98724da3579bd7415da0f809fc588693a732c1e4cbafa5019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ac6abe7a0a90c1879eec610b9459963281f35d0d3724ebe18fbd46944b10973b7ffffffffffffffff52882685dd4c1de20eb96ae25bdcba02c5a92141e49d472d1b34f0701843b55645a4cc0e3bd2b195cde46be4635400c3676214f3e7b082c166000ee8208763fa0b42619b00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250687dff6598683a92787ccb9425f388d3e46ec5656c03773bc1207f48872063cd6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49be7a2335485a5d7e2027c8f1c9b9bc8fb179b7dbc4900102ba56383725a6ab500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58eac25dda50c7af242137ce1374b3240fc3d06054f24adb14c7a1760572e37fb200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c48e1fb053fdd311387969eedb6282d6a64a8580f9d61ef0a8920a0814b61c1234bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d63eb7a0faec793e6f0686d66bfcbf076a25b70442129f3df2f8683cf7418b2b00f00300000000000091422076bac72492d214f3a0200bb76d91f8a98a7f0bd96aaa2467016620ef875c6b2a4e24af679786a871547843de328daf995b3807271f730bd0899cb42ce878a51522a00e3c3fc9c796f59c732ee1abf6f949f8aff0cdf58f43feec4417c6810cb74fe1a5b6bb318c71b62e56ccdb17a19a9ef25c6994c937c6871105320294e6aca93a0a99c2aa0c5e252856f4f4aa1ab652f06a48bd1bb4da7ef9f2c4e02c07414f85a47c136de3c22fb7f066df40e0eebd660610c19d12610f166c2ceaac84c31f13d65d4d62cd121e8c5ae90f58cf1a2e37517586dd1de17566dc6a40036ca1b52faeab95d597bb1ed25e9f51b02c5d61174f593f408148c9ad2016bc0fafb62eaf0ae2734d19e5e2362940b062c06e56ef53953b328e84733213e04687a0b46bae39cc53e860c35014215db88e72edc6f8bc383193516d80e57ea4cb1f816445960bb61f6e221ff2b2e5ceb08a8b966d1ed44279fae5393f05c620fda4bc21c540f05dfe21a4845f2580d0e4000bd8a9a68208e35eae72222caa5a57b9e9d762eb7e979e1e5da57198972d30ba2a84e03c5443f2b1aef9a589d847cfca316b57950e3633f474cb946960a0b096fcc2f1f84c0af38fd50546d9808fb94357aff326330ecb246b4dcf75d6690fad6396ba9020d6e7be6de0455167124ca657ed9208b4570c0492dcf1acd5e08e3072fcad3cb527c4658eb201c54e73c165c3bb3b8cb069b47e91f7512f6f5229daa6d5053a0fb5bc7b02ff85f3cdd5e6b4380e57d38aabc2cee21b170489e35e3450e6f1ecc9b239d273dcf4177b172b808038c10ab5a4f9542375082f12880764c352d9bdd1c947eaa8b32a1bb812073709ba464267fe989a8e80d8cde508066774aae5767124686d4973a586ab1ea228aa1bc6475a1b595152d7e34b257a2822ac0ce6da52c223d280566b608b2a6f4d5df3b554b82af89ff3d05dd8b4e540264e8dbbdc93d2e5d7f9e9c9a18f2a19d24662ab3c50857aece00ed23a1fcb2133956754828d8285da33aac861f390fdf23eadb1155a72f010bea3c3d9d3d55003ed780f6774b95939521c9c379af651bd2d9d946ff09d5272d0b4def5a2883fcfa506c00f2d07a3065ca1c17d35a742a94c7bd3270f0a1c87f10fc371bf0733184a7563b734a456ee47b7f58f395b2e3dee31a8d245ef5cecae3495e2e64e237710c29f51a8f50d3fff9bc4564950fcf9eb9daf1a63f512e2c9f585e3b16537b65177c6849dff18913c9a954aead681b7a18b5b941b3df47f8902688d541d1aae0c8a2d36f6323f8c025ce98239468cd7d793cb84e7a7e5ed566331a3cbb665d026d6b889a32b4dd3f697ac3059e3fcaeb6b2f61550c64604a868b77c92ba342026efb472fc03e159c26645026745ec756ed2fb493cee30f3b34c92db924c5c +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000010b75edabd3c2033d78017578df85a601ca9b5cbeb3baaa58200f70d3224c30901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65a5c4e43e62739be45c547506e13f732c271f46d08a51c189c11d4a7f7750e12fffffffffffffffffc9fe544d78de9957b0a915de333c2af5dfda0eec6bc5b5e41fae2298029a45951e1e6d348b1a1c5de45913b21b1bdcd1c431d5a41649b11149d20183c6c4c0d1c3358bc0009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a06b5a382d26236cdda89dd93cd6c0d29b66d22664a021bfc33ac28de78aaff53d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173d784a875d754ad2b40bece772df81f39cb84b2ee3279b61f95744fd95e8763c019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa578616fdfd67cf7e90906fdae00b4fc616599f63683433f6801cc258df2769affffffffffffffff52882685dd4c1de20eb96ae2fd92d6e0f57372e512ec2bdbc2166ea318d9625b16130a343d8113f0ad258e3febf989e76202e7b0b901016a9e413aba12ad9837de263cec00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25018f7c3dcfe4fd7d4141fb3ed2a3f4af78d30b2184a81d18b83c0351cc799c7516185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4bda8e6c66ef6c578302172d404bdb752207a1d6206feec981f336f4d6acd771200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b583e6a2b38a7841f3433c4ab7d03914f7cb1d07680f53f2cb61403e0754a27c95c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c3a059b79d1385197b1dd8fcca3d37ef7f0d5a65743fa2790131e12d3064179c74bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086114662ee234c0f9531482f9a47804cd6a5891a36ff00c5e37414366c69719ac0da00f003000000000000b1ec70f35685ecf757f3900e9f2af78b8aa7d9bb0e2616da030a2f92ead4b5dc8a8dc7497c084c689ad2cf81a5e71309b48bf41e2d4d36a1208fc041211d43247363c01562a369a93e4808a59c23e902d17911461a9c861ecf890866ddc620a4a0e087f032ede18d2aac169abfcb2e4ca3413ba28b7697fac71d1a4c609fec2b54cf2611ab2cb025689edea750a4e9f693955913e398b482ccd2f0b76b7ac0ab95ed11137c2daeb6bc9e86d20782b646a8f3083ea686b2913826ce22d766aa60b3f2dd58e101b8d95db6c6f7805ad12b839b08a26111285445c40372bfd83b1f95bdef6915d3d30dd1922833334267c4b89ce20dc096dafe52f97aa5cda9a8edb2d0e62712cd6e9ef8545ac72b36a9d41d5b7dc0b565243a4798048ad377aff3907fbfe790d1f8fbe7fa400b12ed904aacec850a2f581996897d26cd3ea93daed4214506a8a7b01e9e40fd7e7d31f56c90cd783e9f1d7da2e2acc910cf63880a06a8716d9fd239219550d1eba0e965319d4d74a9c7b31f9608a3bf40b7e032438f91034f3eb0ed63a747c2ee5d5a91b5f9d593d946b7b6c8cecac5b7064210ec06575d39780d6cb624f8c470943b83ac99846a572b4d7a6055c13a69df758d5329026824b283add5004581aa58a43d28820008e5538e0302340f70e8b5f2c944ab1791b22696c219f25b4ae3bd6904f9273733d2db05907a31dfc81a2606c3625de9b4433dae5b4daf4645e6b77ad496291797e7d233a9665e0d0f5a5455a22bd3dbc3b6d5127fb9a21156b80f7237141068c7df8b1607f08a107e0450db2b2b038711b60b663b5560ce95193b9c7d65de303408e9b7d4d7b2e68bda3504b1fc68680ef465e895a3fc4f82551fc31a15f0919920a050e85cfb39845f02ce7cc38160fdedaa3918aa7f14d5117769541f49ee4ad91f9d4a71d5a823bc81bb17880dcc4f3db495000f3db7c9d9caf13d6a524acd63bc7ec73d2acd4bac963ab159d9a91bb49232fb8ce8eb727f870dc638515647a17073d543ff20936b2c6edd8ae723ef688b0f1ed6aa81fe6a2c32d02a0a5c18be9e4d8b086e4d739f7eae44e5e8904b3554af00e8ac8e1c5c6ebf980c4f50103e42d1fc96e87aebd48f0f68b9f686480ac9153e6e61a0deb75d04a444411c275da388150aafcb8f572ef4eb6f7a8d7c717d69acaaeafdb2535983664fb7a4d731cc3a8fd2ed4e86c313b3a77de4c2b6004e522138be51551154f469716f857e979b0a1602ebf84ac16e3cbd0064aa55156ed7763dac3cc4260025b46ce89b870566db540bdf32ebb0d3cdb48a89fdecde792973be5c2acf8c6702b435c57209db7697ea9c5c49300857c1f84489fc01ef96904e2d885c6b6b3464441327c5ae98fed18a0e7acc0f1f1ef5f1743a73a28e18ba0e36741f5a41af64c918 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000071f11ff1664e9ec6bbfe5d9ad5ab072d48eebfdbe8d521be2d9b66716fc6166a01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e657588a7b61b3a7acf2b358c423a7005540ae33b4bba5772ff15aeb2dc9c9f49c5ffffffffffffffffc9fe544d78de9957b0a915dec458c02ac0519c0e96b30ee4a3f020cca177de545060bccde4029f1bd9e2cae47ab4341c1a40bfc1c5b2b286329137e0a6f67c3fee8fa915009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a107c8f48523278fe91cb4e90ce0e6ae2a1499acfaceda8e5dca17cae748a42a2d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f171a531bd0f44f0dad62c0330e456395ec0432b84e249aab15874d70d55fa04190019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a112e74f80c25e3f5087ae9a15a68d9a907aa697d1c2a4626edb21414eb9a1680ffffffffffffffff52882685dd4c1de20eb96ae26e152bfb48af628ea2fa77d6305f52b758d1926da283e108541b2ee5d9a8192491cbdde98f0a449c127dacbeb7689af05e0c25dad1c624f000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2505fe470df3b055e05aa2160bc15d0921194e31d111545570ca2666ae9ec8a61876185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b42ad49a430638d4b1a9a12ba1aaab0825d0967917acf7793b09da0b77dce4f54200e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58914aaf04817f8ce001823b0c4928aaad5745b583637a5855545f8d6d2d2426d900b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c57f1c861b03c494f12febd7772c0ce0e0c16617cba7be6e0bf67ae753f9f598b4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611d6dd82a785db3abe4a62fc3277e0371c7b519ac8ee1565382c1743735bea90c600f003000000000000abca7265ef717982ea90f1068d31f521225160107b8b604cb1e4250e32bc698e30b6f94a039086d3196a3969829f6f75a854c3d93203ad4d884510d7e2db0bdd2624672e0c84520a97874aba81af32ed75ddef4189fa4579b68ede1f100b98f2b18453bcaf823669d0092239b37d001833b5b4713415e926c2ba30e5df3f4ce964d7465d6524318a3e2416e7a698b8c8abec2395c997365adf2964d76873f9e7e7d9aba0b96b72b9be6e156a70630937770753712165ed32f51eaee1d1f1177081b12fcd3767a05c3e1049bf4c22baa21f38cace1758a203911a06ba8aa4ca9894b16689dfff98c29ddc890f9d353c1199595fb6b955967d7d5ce1768d67a60135ba847d5c15439fff2dbdb2908a001540cef765361080390338d94a9dbf7319ad8993f16a5c777281cbeb2c19b7f99019e19366fff0793343ce909fad4186ed9799b36ca5b63cec0b08e32fe8bfcedba7b8a93086f61f86f068b622e5036bc58caf77e60a1dacddbed28e7903ef653d63a88623eccbcc6e0cd886746d68bb3392c55c9ed93cd5e95b32131b344dfd519ab3b4e23412ef72b17964966a59eedd5e06ceb92d1abfe49bb492b13609270d9850fcda229790d5e7b9b2e882141ad92fd6eb5e3ae319e0d38f375e2977175a6fe599882e3d4890a5e951d514e31932b4221cf4f814ce963052827a61f0010269371cec24a7c226591795c34a0585c1081bb031d45c76f751c2c1b2284d4167713e4ca56baee7fbf13f920f4f94d778446db4a08ae0838e50104f19626ab226cda3ef430cbc9ae8321296e4f32c5eef751f600d80a4cef3fc755a2817469b5a61f9ca1f0c85e26b4b07cab17e10a6f3ab9cad79cc22f3caebc15ea4c60135548296b4e0c77ecdbe77b217ff582e6fc78c8f288949669a15c4a30405abea5841d0d752b1cae581f682f2a79266fa18d3f9617d2e67fa402c4ca5ecfab3510f416ad288c36e04e8ae710f7fc1c90d20d6b8efb7ba99e8c351dd4a9d3eb91e8224c232323c88ac67e1d7f354d96cab863a2f6e631e17c6583219f51bdb7f751c5d23f353346a3eaa90ead3fec8a01b7a6d4bb421c93d7075202cfdf020a6274b304d76fb98618e717dc266ec0d437a0692023095266745ef5521252de57a08fa413b35af1fb3db8b6183d936d831125fd66615b8ff7cf50f54c596e3c431e13070e7137c165af498e0f56dc096c42bf9015b89fd12bb62f27c3b607d01e93f340606cf657e202cc6df669dffebe68b34667d550e548dce558c513f47d42f1b904b48d3590bb02ac5ff5b336e3430e169e3ee0555e18e941fb5625100c48e77e254caad6beb022b24913c0134bee342f71302166ab579e095ef0c27fc3ccad0f66d31d000b961c49c1525558d5668cabf4e8ec55f24927a5f81ac0555aaf33dff69 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000e53e70bcc13960fdbbca371011e3b2d15edb1fe5c92190539fe0fedb06dea81c01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65a7d6f1b16e527d29fa790d786253b1c952da9cd736689aef44396f9bc5d5d8b0ffffffffffffffffc9fe544d78de9957b0a915de68cbe5485c0c8f3aba88872183fff8be8660c181a758e5dee494a20da8ea088e8bcbbf05a3ea09d48763ff58fdb715463d453af468e07cb6009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ad925defecc2b6a8e1d0b76a5bf7f125c56f6e4464f5b3134ac55dc5447715558d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1702c46b497675c1df9cd75cd5873f14e90cf8f0939e33b915f65b624443410a59019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad81d5589471184e78c29d51b17a7bdee8670c35fb600cd1f28621afe7da5c956ffffffffffffffff52882685dd4c1de20eb96ae2c09141576dd812555364bd5851e0de44f99f051367c46a75a85b5a73c8f429e649cef8962c214c70bb5d0cdff39237351611d55b50851ce100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250bdd18e8778e54cadc104c2a712c8d0c75bf2ea49aac775fe6f2ad7ffa17e7bd26185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4971b7f35abb7cc074277cb14ff45caa8146acf3f79e2e673f578b147fab0d8a600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b6c88c72ba88f09507a88da1ee13dcc4a92832df3954115dbe1233e77d5a359f00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cf246ad449bf1aa78dd27d2fbbfbf40741381322349da5163052fd1e962f43ed54bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611c428ded6c0b97d3be2336ec9e2515c03a545595942fa811366428223c70b3c4900f003000000000000a56948009aa07d731becdc00c334a3d1e785e9e43e464506596c951d745283e87b3efbccd74196cacbb5f9ff95bf5afba7ae7f87775c6d0a0ab170d7d3ef613b4b4f8f4d8a8bd3e6e7bbcabe28e3242436de94edb280298bf9590b0bd4d7456fa6aacb30f0513029cd50c9a2ffd1b5d61473f181c9199e1cc148238751bb0f1f450617cd3bdedaf1c56b3a8a46496d2e8cbd2611a7550d9b04446b8bd5803e37d5d9db41806fcb429804bc66f8c298e1776b866cb7fd89c6efe85922ec861dde8cb3c88ba418438f356eeea18e2648ea5ab842705ca65fee97be9cc9a662a45da522f75fbec6508dab247e6cee6768ed838f527d6ddb2e406dc89f20121150377c399871d2ade8b06701d4ea2fa1d2e3f11abfe1c568c1f2861637fd2099c9b2ac6c2587b74ef07a2fff57c4ea0bf3de7b15987cedd222e3dc474da3b8d2b8bf58b798dd694165a0d70364b23feed40ba4c220c1e21b49baca011960c7636e587077834d3c81022db96259f1d4ab300109c2fa6d6b5d78663c3cfd40af5fbe9e9268214e0143f519b35db511f9d84a8906192fdf8024e2fd4e296530fe2950c1ea50eeee626a3e22d5d33c9b9e49964d8a8dbd6237bc4e25b254d258abcba96d9bd258698e1698b9beecbfba87b3d7e92db132a51479e95758d9a7373aa66b8bad79e0ef8e9011c77b518e397e305be33022ae00499b823842fe6cb3ebed419c133869cc901bf8338def21bc22d8650419e10d918bcefb8066c71ba7e4ea0a7b19bbe852262597064c3c75afc446093910a3c191d5b0cef582c0e7ec00fb6efabec46ae1075c1ef7d18665175e55620b09983ee8f47d316831d769f9727e4a268d63042070fb96ae46cc75c730b7a42e2e69e8f4dd90c40cd35ff2ab805188389089d0f901dae33cfdbd42de0db5b519a7f69a7415d55929bb169389370569689b76a635b0d882c05d3826dbe238d7386db6aff5ad9f8012ea85fb04ab3a457b4015bff6d65ff9eb415c036b2aa52b31396ac927d95992189e39493d53d79dbb5bdfb093d34006f7ce8ec2222464f06bbdda952d9e057e766e018b307d9ea06e0ee2e353912baba437053cf97fe9e66d5edcb524b27e1d57dc28923b2307006a2b89b444f54186be5e0d71b0537e341b6e9e8de4d1b0d6ae4d97f00dbb48350fb1f2137b053870a7ef3949faa595fb586568da7455d69dc71d670beff4de780c602efd35f74929e9e6c36f1035c57232d359fc16b42407335fd2fc8588a264481007f4c5025188cc88769709de8e760942d89591e52d728f36e04b6eb00695fae8a8ea5c2ee5d6d33ad32e178718900b250d9e779818f0476a597c9752e46cc0620afcc56af37daf269c483bccf57a190f578f2dc7c1e94addd5aaa3de4ffd343a910eaede2ef86775c2c00e1cbadc2a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001e40c61ce77ab6e9198025e961c9ab87d9d44628baeba6256e05fafb8aa9802f01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e659646fd7025708b668431a4895a044ff06a59d8e30a7202fd67062b8d5c6ea9deffffffffffffffffc9fe544d78de9957b0a915deb27b4cbd41fbf1ce53e7a9c8de7b5e9dd41f30104442640b010023bde781c4241d871b56b99447d74258a75b7b75ec2eebe0fc649e1219b2009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a24fe57f8cbfc9c8726b9202b22ee53c15d843292c156cb04f4ca034e86afb4b9d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f177418815a32e54fc4dfd38126865eec766edb6094274203d6bf45429475e3cd46019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a62218f786df3f9f18de262d43daff9b364f8667c5f17d0bede1998a7882d090fffffffffffffffff52882685dd4c1de20eb96ae29ce07eaafef2eff5e802520f6ef408df09213e1d1df8f71c27b3b1a1404ae579b04296b9c991ff81fc3e47cf460311985b356b12a0aed6d300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250294f1b2918403a88b52a932faed38f1ac740be98d09913139f818115029513856185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b49924d0f1e744bccb5de49ea2b23fccdb2ff424d92bff06821d5a7d1feb7ec9a700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b587ea4d26bae5a59173d5938a31622d239ed99ab322ff686b7189f9509ca8cf78d00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c7f320d4f27623bf1b7f3aa9eb44814ca4394fe78dd62e508d7c18f3f1e00d33a4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086113c911133783099d057623708d0dabaa3c54f19ff240e2aa9443029cde85dbb4c00f003000000000000af70e7f35d2bd98d17ae375bb04563af92649591d557926f5e3a10314f9f6bba43ec2be39d144bd9d3bf288c5fd659e892d8255ef90fc589c91d46edc4adc444ff4a5f2f9a71bf2f8ac14fead720cc2471b856c84506af33dfa7f9cb661b2dbc9108aab6dfdcde545f0f18348165be83cc1f8f06be587bbb8d72baa551886f1f96536e3bf2ff1279a59ffcb19ca60bb3b67c642eb50033c903c89851041c6238ab6be2d8a4e90f9cbe4ebdac8a1a571169e854043e86af0c5d4c0a234e2c526bae70625a70b34e845c71f82793eba1fcb58d07552132639deeb1bab28aa75a050fbb5be443e500776ac566bbacdc17c38d2efc01fe7f1ea02d04e20bcfb09f8c568dcd58995c3d6d5be93929cc0fb49bcd3a8c4bbf25df863c896c4daf2ec94483b3238eb2d8bf45263375fa49358fe4bc3a3998d72ba515ccab7ed03d9d7b815ac619fa281c31592d8cee966e093c539335d7315c0bd68ed277c02feb10adf0d0484a2e15f46f413684bca291e7dcefeb2088926006f250a3189037298c0f7b8946b12e225c57075eebac1a12e80a6bb9103bf43a403ffa22801c8ad87a56cfc92d19d759e2f98d8c3bb68457da1e59a1eedc4e056f5c2d0dd074cf51e841f1add73e7dcefd6723630feba822723f0df30b12828095b0eb4762597dcc3dbf1988a50a0a1c21d22ab31eb1eb99e461489f394856da55eda9f6e8178dc540d909b7bed4ef5eaa32d120fde8717c87e4ec2b9e3999cfd07a58b6d4b8ee2b32d3c1aa22f50d9ab60930466b44cb11c70e610e7e3ec43931caa2afe929461e21dc30e472ef2f152a59f46d692c38d53d8c5b66e8e2298f717b720b9242a97b36e4fd249a0507cacd2ab9995f9be597dfb16acbe93b2b96f5c8dd8e99e616ba082b55a215a85bb3397e50c57d287a56f7f44e9abd8a7ee0ff26c2c28d7c64215c0e9c515029748505f2fa3b61727cb56cc33da85a83431aa3c487a5bcec3a0c7c9001defc90f20ebde23bc90d07b08aff901fce4c1fce50f91dc69e13fc875d66cc2281f3385f7fb7e783b8ff3c9688c4a71f9ccde449c9bdedf2c39e2152956c6ad2097cd1217aa50bd765e3851538d29d00297cea02da3723acc7ac78419c97b5be9854d593408e03cc39af56e41eb7165072038a928a129bb022d16c7aa589123b191883242e55f3c8c9f90fce18e574004fa3712f2a281e877083f1bbf094baac7bb8b4bcb4b27daa92a1233d903abb3f18968dff53d7b5a38e0bfd118d1c593bca5962d0740aca8e00383cd44d0bbf0d0e2c7fecc4166a55ba7e8517ba755add5b9f9f0ec1151f862ae319479c018a2bd1d47301adeaf4581ed29f9810d3dc0d3de0890724cf034f9f7e700790b1284f49b083d8625b0d9223e0f312a901450051c50466e07bfe2d7e74564429489b66 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ace5a43a93903e85d78152308d27b7cc76414e7705bc8f4e163cbb9e0047ec6f01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e6555f08f8611db9f5064024984ba141e64076f265938b0511623caa3d5932cc733ffffffffffffffffc9fe544d78de9957b0a915de7f199230fd2ae74fa755bce638e65d71a78313c33f6525f3ce3650d2d4b679c9bdc066c7cfa6f0d17cf6e5d9f3f0e0d3b9fbd18c88381611009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a3b345fbf355dbe23a3d2bad6615117ec956863ecd519a5beb67e41db21afd142d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1737e8427bd7aec701ecb622852a3ceab7e49ef4966e4b0c99dd592367f81e0467019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a55ab0310da83346eaf5fb9459925211e4ab76d0d3ae94f92332b3ee3d13256e0ffffffffffffffff52882685dd4c1de20eb96ae2e0c6c1992ce4aa9f36a7b9d2545a239c82c2f9a4d8683909d994bc9c8b75de773b812c62dee088360a22c5627dde05ee13cd3476c49df49900593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250b84d462429ef5fef690eff69870a3d868b863488d15b3c4c523c502a72871cd06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4be57b14e0f72933b21f9ebeec7e7798a3ebfae3776437bde03a9c502938f8d9800e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58fd1d5276d2c6b8670a336a344064d06d36eb936eb7ac55201d57ac2a73043a6b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca3e1fa690c93641729a47f05c9dc4b5de67d5c4d0e446483825b4873fab72f084bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b81ea31d4183d746d294ea34fa40b3de5ab7b4054828e9eada4ed91ff768b2f300f00300000000000083bd6b2797a594ea4744b26878aac76aed3ef4a6378e6f8c6408adb0c1bba2cc0b4e8e0a05756fa65cc7ce3e1ca016c9a9d4f1217979099c8c312872f3d75da41c2058985c1990542e732c164e58b63f77a41f10f1f37cd65e0d20bf5b35113ca043aaa152cd9235a41cdc68ef34c5ef626f4c8aff86ffde927cb17a06ce2c249776eaea0d40caa3eaf82ff1bab82632adc69115a488165ee6cdfee4bcbd54e6196f4f37f5631adf4920892f752c1a122c6d9b4270f229d4e33d91e492c79a04a86231b35b22e6f6ae54b42fbb8535915372b37eee6585a964fd13059b1ffd0c21b33ed50d57c97730f4daa5cc97765692053e8f7b134ee3c9cdb6b70ce49d61526a2f894846becf7161a4317e43efd89702882c5819560268b140f56562248a8091679aef7c6e712161b46979bb913a65b75461c51b6f2d6154d2aa4164417b830ac0f064331ae07c0b8a73fcb65dfb9235e78de4b61c7c9c67c71d45b5edd94568726ea9613b9781a61b56b681703456abe2eaeb6d1f84e687f496f2c486948973de7b5d386447a79a81b5f7ad854fa4888a38d49a33b702a06b773afdfaf12820dc267c54f9e7285f09ff74f7205fb743f148e5fae43b7dc4f92e263b41fb757f628238d84a057d4ce3169f3f0ada084f6ae7978353ea60e17bffc93d6569ae753c76cc1cb7356b84fb0a206544b3bb74438f2216565794f9171fab4adf9c97337d0131e1892be878f127f150a03a1b3dbd0915e509164cd4dd60462779a634829cb03b55396209a2a9347bedfe0976514c9fc41bc19921e3c843dfcd49b032379430eba240ad84c2ffc56cb4bb68f23b5b1802259b6a819fea4deca40dc4b6133e81d9c23399af8664a3c310940bd3c08bb73155e590c631c963de14bb554b0abf9a1bd7392bcfa0fc4775a29646e05b7159a253ea1c3cec4dc37d3371d239689d3b96829418f5ee607edda96d1a399eb7c5d13e6f00823620ffc8a5ab38b00443332bfbd566ee400aad21337b63c7411a53debd3ca4c82ab3fc4216e4766c07daa67badd9d1d7b477b53f81472aba8f667caa72695390545a5973b527029a52a2b02febdd5863316ae7864e203311dc4876d8e793ff2ba6e7d4fc94954d944dfb3090cb16fdae5df810b963bf5b67d8eed4c0e4445ef846253b4ed69f899ca2efe222e9b94c2b6b186b32dd6c33927f8b05d598ded964092c2af28a519bc315ec93a7a7b67c91e32015485d282a9eab92a19953a5e5feac12a8c27f69a05f9aed0161658d463bae291be82ef63ee9bdebc4468341e6fbc2ff4c7c79f7b86eee6a6a364113bb561fad5bfea9203c3f61cfbf4a04336078fbd5af46deead9ef05b168b230ce8aae5867f2d675b8593ab982bd74300e342b904549b14d9ffb26b1625ee355a12601e00888587c2406 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000cceb9edea7eec0a50813bd791f317f063b0cf53b1e83eec6029b73f91d29a44701e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65401aae09bc6974a3be1542e7176c3dffa38eccf73b726643957194f972162ba5ffffffffffffffffc9fe544d78de9957b0a915de840ccca0880ba85e47adffd235d54a087179167c8e4b1db642187ddaa16b3691cb5c4ccd6237b398c41ef9099b8b1f78cea380895c5e60fe009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a0933c444d95de083cdb7b87f24dba39206bdc949e77491dfe65d3e04586027c6d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f175758ffa262a6b60600246ce42552b61822743341eeabc51163f0bc3d2e47d087019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa63d3c863c47684785cdfdba09ff981da1ad57200f63a9de2b7bad70a57d2445ffffffffffffffff52882685dd4c1de20eb96ae2b0f98acbb7143e7880c3e163e0e036947aefc9c9f79ef597362de84500fb2a2f28c7a5d4fad4cb1e2c77039f27dbe7a1deacd04e8e5c1ac200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507b2655c89aa4d0dc8d24a2682a34e45dbfdff3fd52033feb4cd5ee66bece2a3e6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40dd2429aba4ff1794ec606f9c35fa2a2668911b1e51a215900fe0a55cf7a1a3100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f12f0ccc0d53c0c01a7228de06b48107f0bf7d72a5259895bca427de41a6a8a800b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c80d076f8e7eddb81a73e8750bb884586362218614e8db2203672041fc18b6a734bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861187a4914f8a474a596f21536beb4df9ad917da5d87e0affc48634a52c4b89739d00f003000000000000b2476ab2ca62491682ab2fbe5d2d3bb333df2296675201dbb460100f827a9f06ce5d4e2e83290e321eee1af7fb5874c18ee5468e520a9e2e995d3e4350145d1e0d042597a8c0765d94be691ee66bd75a9d5cb2b5acf0c01361bf57c571182398b2c711d854781166e48a66612d6d40e47b71e67d696f42a13a3d80859fac799839d5bb99d4db474e2f82b90f4d959d3d8d25ea7e5b9c575a84511d799da59d597c9ffe37c7c7993b17e90c975fe1e6ef53ded7bd219968db33ea4148d0c3cc56958eae5f598bd8fec90d56267b110e698c39fb68e90b67c5db033fed0e5a67f0bedbccb2ce5ac98283ec46129ab09c598d29efe31bce819f369c5e4f06aa8db11c8215a0a4716511f91af97431b1f9972fa8adfade5c1d1cd88d969cfe4c4ae499f6febe3442b3675b9a63e4eae0cdd90e611d494b55baf230223aefea7cb9363fcbe2782d8f2b09793960d6b681730bb6289d9e82e7ccf38d19f8423df855aaf628a1a21e8f3e759f176def001d035345f80bf8455e6621312177e49c04e4008f28de0b25f46b34c3a38f2d1f78b7897d3d96ad3425e186e818adb901f810f1be7adbe097274d2ce9788e052e3e3e54b65380eecfccde0886c2710e318cd5915832e88a43a3b0af42db6e1226a31a2232745f7bef6ba468c73d4048cebb7faab24d012deee6b3b2b718cc82ca383eac752c292407c63a671e3e4cefa81f1df0911ca1db1fb01b54a6214aafea939bd6f4bbe52f6fc697a78c10eda854f74b11ce87c0e288893028bd1ae85649badd220166c0c670a8ddf53aa544b81997b1339a859895ebe06018e0b92df32e0b4e44310fe89f6b5a2d876c307982fcdf5e236af8983babb645f0c803be8cddec8d432ffd2839acac4c4d4979cb3538daf463307b848218008acecdea37d1d680511efe17791ff81d773c75eb9fbda0956552eefdbc510b3b5bdbd7fc4549a010de190efe973246509a2324e507922bc541273130b1bab7eb9773c480475862b2853d1bf819c4d535fe0f86686e55ce34283a21d834a3903b9c23a5b854e2b9b7d1421fad20e96df9ebf8ae54467bc54bbf51deec7659c42b3dece06718735ece6104f4dc05b2373f1cf62be67190ccc10062e0455573e60d42bb07d587cd130e663063372da2d78a939bab3468cc5631d087e183ee799d6f6290b5713c0c698bfa66f91c828b40b31006e74b82f1d550e15f7cc0c36b8704b7b5523c68c56ec8596ce5f1c601c7dcf4b9e2d59cb42c0d6d852291e20ffac32b82195cac3b836f66293eef028fb14d4508aee6fbce7a7ad5518f7bcec9a952e5cfd2d3cb33aa048936ead91a5be106a4366d24b8801d474ae85bb36253be4eb1b09d5d442a0d03b353d7fc48cd9bdf8aeeca61219c5e97045dcc922bf1b01aa4ed296f0c0bdcb5b652 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ff5be36ae6b4515f614b4246da494a92a3631256deee399af6b5bdd90431a24601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e655512f5338a438fa6632b9d9ab15b27f3413032a1356b54fccde834263a780e84ffffffffffffffffc9fe544d78de9957b0a915dee02e166ae932462f98911db69187f86aec4753ccb280ce3a920427fb08865cadf5d9596ecccf84db219eab384a7ec32dfb93bfa045a8c2fe009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a601e39e89c83efa6a7754ed40da19bcee93c59153bd28be4657b0ffcb8f0e66dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f172b692cb1337fdfcb56d38aa74e2fe0df27f28280e840024a1bf3d2658943a590019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75afaead0146d914cadc52e20707990f69abf21bd99e533c5a5412e3e40522d1a44ffffffffffffffff52882685dd4c1de20eb96ae20b10a84f302493f4f41c5abaa91153c16aa958f24e65b9c7a29606674a72743aa0356fdbcac85f0de15ad3bc2e238b1357f1fc045084a09600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250916484e85473996f1e530fd1a9979e9d40bf7c3ef30c8101b1a9b16274b081576185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b450edc21acd62f398c193bcd03a1c3fe6cd4095e183d1588bef4325731b9c2b6500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5890bcc44a8900d5e2639bcab697d9324977ce16ecf1f3679847c331b29fe61d1b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c241f31738b21a1168a6b5d556e8600bed5e29f9ea8ec88aae9e755b0c9c552af4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118c1e0e938306907af50d0ce185b14ecc2dc464490ec0b37874b5af8c9a5db1e300f00300000000000083be9ef27ded920f520a52ed8041e30e378bb03ffc89b52ba611e6da9ecdcbf51deab2ff2df4ec730598e740de3e8797ac71fc31a02863e35df43f4554c927ac7d6ab45a6536de485afdba82e544dc4515d1f89e0ce75ab06a15ca0e07c4e19986adc012d2cc03a142a88656f6326bb5bf6eacd4c66864ac5460a52b6898d99856ea1b827deee34e2454c808045f8c2d8b114f7f166b94b5222fba9439135bdb9b5351c6ab2b04ecef8b12e108a6bf94758cf63293188089bb0b34949ad8e247b5557e3f1c02682e389702641c817d23c6ab2050a34c86ab0f467aea0ea8c61525d7fe78025690c85d848d14f88e77038bfa0a0338d7f12474388c69ef015611d3fc16370f2eb5eee7dedd18d1da496d874ed69078235f31f8899ca55eca1f4fa3b69795d39c8279fb144c6a371c3e205768a935983fd86a6aec68fedd0ed528b512315aa70cd5fbf346077d2f150ae2805cfbba6cf72d32fd979ed04f53810484be14a0eae771b1d919de38ccdc76fe0b6c764b596d1b8a2a62f4e8de238f4c9570c73eee14b5407b918c862846bb41cb3e3dcc7756459ed87146cdc2673533c3fab2e8093336478cac0bc483dba215b618467fa4c9806f1c135f2bf3c7e44bfff30507f4ab20585e395c14c999a32d7099eba190f64af369ee714192eac6b18f21850f377029bb91d546a8a6ef75560dc9247a921cc8150e1733b10f3f1f30785e058200d943b2a171ba59eb5afc9b90c3129d3895d7d09da50e06a318db1004ac1d839b95aa985ca4dfa8487eda409a08b667e078be8da6fc69bffc2617df7efd592397338156ad7dd01349203f0ccce9756219d21061471cce523b0d5cfe4624138e31a5e75502e136a86551fa1cbbf551d5cd348ca4f2b2ddc8fbf49f55b4bace99d6a52f3f14f86a95037afc29cc282ebb716f54121bdf8dba57fa8155ea55dfb95e685040a7fe7e95e75c5b044aca321c490db2cd1ce6075af65d519b50e07bf07f903e65794fc241e5f6ce5b7ddadf52c8486358b6c8cebf69fefeff0ba0c3b2f80765b2b27d4e11ae2feb3a15962e69dc74ba7c16e064dc990967d650424f760a92dc142ed4193bdd50270d3d2a1da78cf9e7005be50c264f5b3c40537719c6119698ef2a2130396a5b6c20a7d98fda375fa557b6ea66d1c4ad2c223f92c7b6b17cd636fea757a11828136a3859c9fe40cf8eadba682162eb33495e6ca31a93cdb3219069e3965431ffcd6225036e064ec900441d5dc720cf529de26da4a879ec38a633addc736a6eddf030c55cacdea68ec9d0889709dcca3255f20ba6c1ba624bfa80731bbdfa1e1de14dab837ca073887eff4b96aa400901fd71af241ec0105c160b314350bffae23664e6f321603d4bddc8fc3699abe84fa56898fa43817c9aa257a4eaaa1b6c7df020 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000297e5cc71cfcba74e75a0e5155a6b8039c4c850440a69e50169022dff438143201e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65dcd6c8087df335a2f93d1a2a64e278d89d50f45bbb0652f03678621c379ad73affffffffffffffffc9fe544d78de9957b0a915def4c445e7db263105a07b01af4d1bbc07a6538685d57e2d1f76c1775cc795a71d1bfa585fe6f3324954fe530b20cca70c304ac70a6923d65b009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a1ac59e7bc209ff88cbab4ee951e8c27ae285c3f48ded6d8c10ce75c3dcd3aea5d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f176a3a5e7ae7afc4181dbe9fadad23059abb824d4031912037e74e69e7e44aba32019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad1b75413a77a75e27d97fc10079dfcc3059049ee738605d171ed920dcdd6a6c5ffffffffffffffff52882685dd4c1de20eb96ae2bb66e71cfcf520dbb6f4fa61bc9f0c76fcf58a12a2b0abafe7aa1b90b56a3e2f11734ff1bcebd4614eacdf5a5a07078066a220ffd6c2f6a100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2502fa45f8f83a0657a6335b0b2c1f7bbf5520b13ed2cc9ee4e623c084a07271a1b6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b45bc6b3f62964dff02af28025a3a20cda28596c000c348167d158989942425e3b00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b585130d4f44e755558ea08e8f7cd69fd4946c6e4c140bbf0b41106a0fa36fe7dbe00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ca8365e7f8b9c063b3761cf106d838ec5572f67a215c688d0740a465fae51d3d44bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fedc3c6f7605f2d0fd61fae1008b74cac7d8472d5a516aa02172582742f4da6300f003000000000000b2f1cf851207b8ada862ed7723e161cce8415c64bc16e3afc1baec42ea1962b7c8fca4c052de3aedd1c8b2df4e8e0beab71ef16254e1447fdd3aa7c7808be69beaab5364803f8ef83d71a845d862eb6b14df84f6031ef1c44461a068cb4a5eafa81fcfc6da1043972a2e5ba05542306d7633bdafc11a977e884c9022bb5bde3ec4ba2e8da46d00cb595d3db48d2d558689afcd379d8a658ade3e834f4742fd3ade1aee6aa449368c0d35b931b7d826deb78b080c7b655dfe03fab48f7694c5ffb2b53b392b70fccc3b44d7edb7fc01ee4f23e67f24a8b7b78a4dad67b54ec9435e4a7d4777ea93317ba875e5b42aba18ad7c6385e0595dac3cae655efba7b7f731b82b104514317f35627452f481ddcafc340119d142c6b95dce45609169022dab6e57af19c5f63110f5d19a3c34fb87f64853f16dd006e1fccf8b2c083b89dbe32bb2f36ac6668f7de917505b4f168aa762eff39376721982c09927d61915601415c84a1353a1285ef07d1025faca473ebabbaa7a09b6785e0dfc108de23018b82a63424dc7a893d0f217f8a1d6b67431b876dd27cb564c8cc565b293dfd3649e5eea14a9e9d5f26a3871b4e37d0113b027bb20f3d8bcee5c5e9f7ae42a1e460b1a2f952ec774e4313a3f08fa01103696ef8be3f8d1d3d3b617459725ac549898271942fae579b57a8cdf82e3d5861364f73f9699ab9cb183ccf870ed24bf08f3d13ca2b244c6fc74e9a0a287fdf14a83f43b9d00b9fc66aa386579efbf5db0a0da53518b30bfffdbff845afc0e8c413e8adb670cd5c705228b6b94bd63e2bac41195084ad1fb2166997d270fe77c0a2ef44be64be6fb90c4cb026d056a63d9e9bead43a32e31f71036f2c73e6f7e40139cf23c002519833073d15e4b7d273ee197a3f5044f40e43b6881b4203f5626e30acc6e4124feabe27b80df1ae5b0b75362658c418e3c4c60eba5466d893b23cf1d9d9e8fe8bf50516ebeed0a05662eb0933a05d87624202bb2d4d9ac6dc658bd5b0b5fb2d91501d03da46113bfce58c9b1c75735b958cff71b4dd611dfd02634b105f22dcb33c2ee1b937252865a0a959cb82576571bedda0686d7cd90d2645e6a2709c1f89fb28c84179fd6915461fd7334d20ff349120a84c29caad9dd0b449a31879ccdfb43f1f6e36a0d5a7da3d3e821378af27e740e5113963f5647244b0d2fb73e76a79dc5dff78288a2f5bb1e74a35736e9e3ff0c95a0fb2144796a34036d06e5aa646884844c25b2096318dad3049756d0951959847394313b340acd178e0d85c82d3e62c5ac0f152fb61404010c7935e408a90b7ec5efda1c2336ce4ca7b4cefa39595f7bc429ba4bc63b64fa29a68cac21a95207be25b141ba1cdd3bc2ab77e640cd8391beeaa5661526edfd7051c66ed388616a6cfc37b04660 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000018394262f643644171a9e4b70351657b141cb3ba2e7db7c51843ebc6cd75a72b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e97db00b30506d3e58e002fbd382ffa27a995e2108d607074ea9b62dbe59bb51ffffffffffffffffc9fe544d78de9957b0a915de661ffc75f8ce6f81031a5d70863628a4cc96e8ecd85abfc47246b509cfec25e3f888a02079cc51732353adf18c584e40fc483708d1004c12009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a9cdda6fc91e1c95090f89155dff4ba5fedade4e894a3ffe160bb4ddb8c2a7973d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173efc0d6b5cf4c9173ed12f996e1d745f1e9c330094c4ed90ae421bfd9da182cd019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a4c584138d01e0214f852d0a0d1d208b07a859c0ea9e84ecf5a65aac5c2354269ffffffffffffffff52882685dd4c1de20eb96ae28bd95d11ca86f213c317e9b01e2b1f928dd1999435119921e65f8b9245d2a4bc59877afc880d6f5fb461aac2a84aba14526ea8a9d19ab3e500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2502c24aea53c82784c7dcf135c9274ca960f83e8860ffcf1d3578fa5b8381b6eec6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4552cf40e9a497382267b4baeabe2a791893cb6f7ae95f888d3dd10323034d40400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58ddfc9979178a7c6d0b71944eb3daeb173105466b1fa5ed5569097f1835dee9d100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce1f8e2dd931c45f4ff8325349177fa3d7e29700a8179b8df7ea9c66d6ea05f034bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611583c671ffc56e8ec75b767d2917e86f1ab6597701c545352560691a63aded08a00f0030000000000008bbd93b568a0f7497b64ddb266bfc5182aa1e2ba75c1adeacacc3062fc3fdc4dd1f0f91d94aabe08051e5f717c6cc98ea2a3708c87db8be67b79b14ff10484c9fd504623485dc668b34b79cd96e1e9dfdf011891edbc4f00b0531f24fee4b878b734af88ed426115f283553e0aeaeae92402ccab0fea9cdb63d7c26571cd4bfd03fbf32dfd5e240e480dac307a2019b4936c879cfa92eeb41ba2ce6688cbc28fd75a837e2689926d5db2f5697f1e47dcb09ce90f9d8ea34ac11228b3daa56a658f9d5a8928642b80c7c9512a37d7edd256b24bbb7cd797a0d34df000956bbded9b16a9ca400dfb3d016726ccf24d57c88611c452a22f74151b2252f827b2b231529a8ef816c9afaa909c4a57680e894b3d9571bf7525b640f71e595df68b92608952f9304e0718b48659d7f530e6bffa2040e68eb4d65e6b0402160ffa48cc68b7814ed0b0b869aa853fbb695856a2de997d821d5e3f88fbc3c028bc49814ca8ab7e5e869b660bda1537135ab232a14f581e3fd2da71b7369945b83ae38637008198718e42b5e26416b2a8aa2ba8376b44740fc031134f4791e14a33048f4745f14b4befcb6fb821b4792f683f5ecda08ee31d3c30c9872bef75ccf48a59bbf4d1eddbeed7c451ef9b701828814ce0990fec68bf46eb770ffe1b4539771b5d488eb6dc33d4caf98e291cd22701d46a1666e3867e69daf65c5460609a49efff6208e99c6529f4e170e7adc19de2ed34a6678411ca34f3f5b99b6a24794f9571defc188decc1b609734a6c066d3474365bc65b5e55cede31c49b1077e584ef07665ddc9468b003931472729be02c6c3008765280b80246272f76abc8e298d3ed2dcad9a31b4f9984d6a57dd0713bf3520d687515ba102ecdbc7e62648f8a987a8fc61166f7c27ffffc05a1fae5ecd5432984ce24a97fe981e30f088e24579a58432113ac6c278f764dc76954496792fb2cb0f9366941c6e00f3b500e5040de39247bd724864e30ccfe4fc6129b7a2ddd00cd9e80fe4e9d64c376b4360792d4aefd06220c585d5e5e7abdd5faaac6adde56a1d2747956e49725049df4c3848782116616255123e64c68dd93116811116d6c802c1bce885e08dc1f17b00c8909a0718312639f8ca0c5d07f0e332cbf689c15e62744ddcad9246e97b323ebdf11998ee4fcb1d16399e09dcee958270e33435ece27b6828c0003ac125569aeb14fe2c79737aa4bb11240cab1479d1e7c180c26a009a5d2507d853c8709fd869187b6211cccb91af2d3e8be84d833d1bbb56a32086102515c93405c0222d70f85645ffed40d7ccc884728360c1c82bbf7fb470b0920a996876a2b7d9f3170d3dc3dfa4669fef911f9cddad3d9e3ddb5e8fae223f2e32b59db965890b38e22eb0e3841313911c29ad9c1e8eeb8a7f8b895e59264 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d3b344ee5ec1df2e3bcc48f92a936cda2b287bd2be2b2b1d0fb077098f15093a01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e9b6b703a8970913c7702811a6d38f46670285a1a679feb9f42f9d618b576e4effffffffffffffffc9fe544d78de9957b0a915dea34a50c3a730ff60b8c327ed6740da1ce257a1434effc7da1e2c950a62f75f46c1efba9aff4b408d767b281d6035780b91f7775b15634f27009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a6503dccf500b88e105bedb0976b69867465ab98fb1c04dc5f3bf9b435da4cc08d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17fd86fa603a0eb573de11c92d65348b7c9fae8876bcf9f6fbdcf4892a18994a3a019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ad3c3608576e3483da271eaf0f9f9194a29389ececa83233bb186a5f586b8a5eeffffffffffffffff52882685dd4c1de20eb96ae2c5495c08d66982f3cfec44d34f2a44cd08ca36336b00a854f49f1b052ce6a05b4c4561f6819f89e1a6469d52c902506726f95b96832c07b500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25077f252788dd8de210323e6cb4aa8e4b20323e70ff88a383b5bc9a4db7d9f8ac76185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b44cf70376776a0e3ee75580abe855c9dd704695de6774bf23ee8adec507a757bb00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b72f77c840ee292d403346a52629b6f9ea6ea6150be117ca5b38c4f557961e9e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c6090ec08d908cdc99ba3bead7aa2efa74745509d801c235c1809a71611faeab64bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611852498b2e8009e3000b6960aab9f14fc49901fb37dbedafaa346c82d9ea5fe4400f00300000000000087f97e40d3197072a7644648fbc2c5c1a3b871db6e65006491877947ed87e48fd33e79089f10f33dd883ff946dbb5ff386b08be059eb93589b08300e3322b9b0a4721cb15ecf5c60eb32acc5e4cc957dd4692efbacd52cc5e5625b7ccc957b6bb3c3dd8e695375fec371da441bb3749db3221b581cae78fce784894d642d95e94407673f6e24e9e097edd40f12f45eaaab64f8430b546e2f6e06292ac2c7c3f761ea917bb20a694c0cdd370d86a08c604d98f9d8e111d94a42128168ab347f7f92a30c5bf90ba4ef847d540e2677f31001d61a310d3b227f570d776c033a7bf16b75b4871dcf24b3d9828e2ddc22a426a155544d8fd91b6bc241a681f10dc797144e90a94d501e9e2f4cff00ec95861a1f178d8f7ab1eb6a09bb5c3d535ab4c0b606c384fdf5ad909b512aeae8a973769be739331eeefea1bf0357869e84b1818a4f8bac53f474d34cdc57f5ef4d4824958178ce6dd69625f87b4343c3c779d6fd4c0611111a8ebc620d0a175f2bd3c37f8390e5a265477ef1ac85afbbd62844991050e9766ca66a8ad7948ed29fc2d0411552b1b50fdc6622ecc91f687b0c0b445e3167b4371287d98ab3cadd1605b1afb29a84d697cb4435a177970835dcc82a42b6d9f23a480bfd7a232d323dfa11ef099ad76354a02ae2e14f82fdb852aba7ffc5630cddaacc73f658421d3c74dba2a861f5620866caadea38aae9128a4dea1633389e3e0eaad60a2abb8c3be8202a79e4b3f7a194b9859bdd502bdda960c7a25a1f39e4033f21396da86b716a0091020c116ee1e65bfa826a38ffe76c44938223a4bdaecce7b61c26b7de67bf6786c4b2f56cf52694e9e176e3f57c77cb0944a75553f8bcfbc83b7af5c4d686153fe508b1a0c205cf06317336caccec8df895f135b508658f869ee5cca23be8316ef5d2de124295d16a62e6062eba3a693fca52b6657707e23dead5a5d620c5592acebda605b453aad4c683b7ebef8af66206104587ea3b665bf0cf9cb6135d15af2abcd85f6a5ca2f1ceab5702586563aec5d7b28c1d0ea368da2ed6c419e535b0d3f3ab0d7a0b6dca8aa3acfffec79484714861c96cb766018b06c7f52c724215779b1ebee212ae9b9a4fbf70d497fdd08a092a18fb20daa8be9231a69e1a189d203351c0c1e83d51b190bc4fd0d4a5abfd582284abbc8d048ef9cdc3f88b25623ab4c32b5f6ff0d01cb8d4e2f661ae0cddfc5437962f693f31c4f5e1e1db07c534f2feecd59f3fa25e1aeef470ee4d135754a7966b4b6aaead5af2b989cb2255163212ded15364ad7d2db68919691812683ae909031e1805dca9024b164425260a9d000baec0feef1e6ee28f6770e3e831528ba1df9dc66f4c25c56e6bf71fe79f4bd52bee74ae2890f127f42989ab5509f85fb1c18663d368646694d6ba21 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000001e93a0d434263464155e850796dcb9a097509ea2b4dbad4139e38f8eb327aa1001e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65340c8a2f074675c1a12c3a3aa31ca5d7f1e83caf48d37845f361760722acb5e5ffffffffffffffffc9fe544d78de9957b0a915de1cc73ae6cb55eba570ae9938809274f9f1d6341e5c64bb742d931b8d3f8466993b9920cee6a157d6f2dc551cd1bde4903a5366c8e12752e2009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a2772d2007a325fb37ed3f97ae21d61fe43a4649bf234305f9a63935336c071cad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17da924780646c3491f728780cdb61e50a365903e7edaa953247c18d4d639430b9019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75ab2bd6b1410240400be507f405a1b07f419c695fdb69b0b7c8afc1898e213ebe4ffffffffffffffff52882685dd4c1de20eb96ae2f902b96529060e3da96ab6aa5eb016e9eb2843afdbd39aa6ccf08e92f6369d9935b2e8466b6712d6ae67b99b0c4690070eaa71ccbf327c2c00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507c71f92a8fbe147e77a05177dee5534509a95417b0e9d6d079fa29273d049ecc6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40fbbf8335f3034bc77c0325862aeb5785eecb94890540ecce21742dad7f4b05700e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b581b5cf89ffb4e62cbb69c2b187054d53409499ee62cfcd621072a41f58c557eb400b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c0599d83cbf5d991db09452032f369b278d574b281d03638e385e39ac04f074ea4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f783e455caed54afce4c3fc3926ae5f2283ab7c91c283ff6b6a5f198d257abb700f00300000000000086d59e0e28b49b6dcec1d869d760d2cccd30631d7abcc04b71bf5f275b5e7ad64408d7d9467b3debe564fa10a9ee1dd39155b3bf2f7c0138df492cc57b42adffe6d10ed9ef662829551b28d3a028bdad8ba70017ebe6454372083b8d1276530b873b4e51a5a90cb38c012c000591ac2062db148ce3db094352522d8ef9f46698b0e8cacd1cfb3633097a5ab3d228232f832655aa79631bbf69e2b4fb7fc1997db295eff872e24cccbe2d3ac96c8c06d6e77ae29913cc683e557ea5ec3523ae1ead4cc519664a18e17002537ec75c1a445aa31a8d6b1cd9e72879bdaf96f8b82baf01664cade8c583b09645d80b698904919adc0d8a562ee609a7ea25f052e14b13e836f46d793dc2ae69b07974a9b3844ca28b3e0958efb81ae7ed47a498f93c8cb9ac5841bc2cadb49ef099aa358bfdc69b7c26de18e64a0b59ae9fa8c3ec542f25e626b25bbd4216086ed76e2ba14ab9ca0b9ea068f1a814044ada720fd752b095852b73a65b97bb126e529df53e33a2bf6aecb45d9995a952a06c450eccf5a58c52eb717ee2338199b4bcf5ddad748dd0b255297145eda389214201230b7e8f3b444a85224b26ebfb5e96495773b3af32cc34cb8982907d935db187def7502404951b201bc04198ecfe40dd64a568f0961bb2a18a22fe465d7b5174f31f5ab83f15be28920ed891bbb1787b0fee7630a5b9c94f2f061fb9776fed1517f852e1f29664499924974b4de2f7a47272cf27a2614d14bc28ef8a05afd310ef9d8c9ca7932e9549f467f38a0a2cd113352b1d828307017ec8c5be864d306dd8fedf418de99845564e19b025aa42060a571142f398fa07ec7cad4fdaa79c1e9d100b9152c365535dbb0717be2c8d095d1d1be4ebd665ed0c45388c426261015cfe06d69effc4bb25ec039b6364dffdb22e1395f74449403e0393174d064e529ca4cad808a6b3a14f547e23f3d07d3891ea486f2087cafcf7e3a0ae3a00b1757193dd5d5d18dc6c32bc9ac33b7d6be595524d6eb18523269bfeb7f75033b7393154f012ba6488ccd6426404519ffd639f715d7f5977bb7e2eb61526724e77fb481304c744b6de0678d578374197c688b00a55a20834d07137dd46e3b263f4c87c66cc63b153c4ce1a9170a530cc6289f2e5114051e491b3269a471982d7bdda31e876d5897f4de1ab4efbc0173e8c47850366d1c393e2149d45d661439b8d0d64498378a8fa0f65f37c4174d225c66fa1f1259b3a9c6fdca05086c0f483c175cccb454ee7288ca5574b24117bc0361265b041e68d263f0c583c61273de17426f3a7d79762ba37ad071a8b1f2bf79caca787370861ca66bd9cd798f9f981ada7f02c560c2d4d34691c4f478a09666327b14f5c07578bd24e91172a02183a5cb724ceede2a67c20d2b48438543127433192464b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000d3c90ab48629b496d1b4b19d7b6901a35ee3e8f0148c1e0f5aa91ff6927b422501e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65058bd730dfecf7db3559421d8e63c2af35b9e9e1b94e0847a43dae3d2dc019b9ffffffffffffffffc9fe544d78de9957b0a915de8940df81ec957286b23b6a651c1ea3f364a6a48b77522ebdb9c0c226090f6317be190ab26fa32285a59115be25e6cdab08ca74d67d6e5a76009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ab4a4c2a5f171058db100e66856b7e6a889bd976a009ee716e3b3a436d2080296d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f174719829c5e915dc31f842ac16212ce5293038ec19263dd976748c436bb0cde88019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a88ae7c1add0cfa3ca4348b0f9afc1fd2446f738ca98b38e63478905f338745aeffffffffffffffff52882685dd4c1de20eb96ae267dc59659efd352d2bf960e6821188f7db381d19ae99a29c2c42b0584c3afd7ea769e59f4c0e4432a44f20952171ad591e1b52623653204700593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25025fa935514bcc181373fb12cd929232222d4bcc8df6d02d49baa2b4dd64a33a46185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b445251a0b07eb8c8f8d430a64b64512887d27a3f5f23951a846b2ddae5891099400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5852854c9534f7271e4ac2ec7b85bbbb57bc28404eff811b7922e0d231bd7f6c3b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c2dadb7583803d961af572fb64afe73703990354869479919d47dc79c0e8c29c04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086118f19e7829408c63968ba581a6d230bdc9e1305d2c7a7b04fc415f6233e5c4a5000f0030000000000008bec90d41d973927b6843414bb010240a1b3e02c259c7e8e10c395c5e9de00aef40f5a4269320d8c23ac6f446c537175b51e7ea6f75ac9885e9813cead2c8bfcfeffdd10dec42dc2b20eb9da0791d9853d4f152d07ba5fb2c591bca550f6e2b18003d4bbba0cb08984bcb30ebcbc0bdda5bf6bc03ae7dbbb8901be91a3366d7b5e08831b4860d4f9c747e71851b6644498c68968495bd84d45690830c576d34df6df552393ed2b058fdd2210b878c69c418a18d8a47ea4293733223f2a06e73784ca9850b33276b6afb66c40fcfb92efe97efd7018280f992a314b0e7f2e1f4dc20c0202fe1d7244c42c392bde28d77d96b1ccd7aeb4e7831833a006bde56daba2b58ac09497ad05753331dd2ea7758650661e8375a4b8d878274b75ca98e36592c695c1011a597114ce3be2d53fbabe7e73d496eed01fe93022e4c526a68cda383cc7817b69fe0667ac07c937ebad609880a0e8481e2fe505b7e1fe025e28e7bf26cfa797f91cc936fcac6e3f3ca8d3a8099a45a2d6c825ca9ee36cf7830077ab375c9331051b59ea875f6853d3452f4d82a1f993eeb267d5f63f9b81cb2f66e85afb9dbce527634007b5fddf2f053488cdbad2be7daffc672913367c06020cef6a5ee7d43257c0a73984c3c13ef97c0f5b0dc820ea908f911fec310a2035828120e0f005a1c42c3834fbfa07638697ae1c83d2d00f231ac542f15270dbab5ba1b50c737668fb2cf2ca956f3acdf2230d95ed14d7e00a02d8a922f60f5eee1eb0759d644cea89e1570d70a3bce06c20b3d383378f9b087d00d968b9e835dab9c704ef44c45b7bd7d6692ec807a5e1119615bc94231416e97ca01eed59631648429be453597374d9aca88d5d101a4205ac5b271f3d48603dc919da766f5d946146d4e28564296096e7ccbbe9076580047841568b79bd98a7fe283890197b69f61b074222db292e4124e9333b682df46e036c8b3dd2cfdff2a474550f7fb87f2294e193267612847f3ddbd13b4e21ce58f89fd59b2c29ed029ff42bf0603f97916cabc71f2e36d30856c506e13fe46e472d4d9b7044fee203e3318c41c03a124c50aa89fa96b6cb4633abc2e1438dde13975f4cbbdfa7477ca8c8bcd8acdb28bfc848edaf0a8bb0b0aae184964457e75965506677e6940656d3a0d1ca85c377d3ea0a949b0bed7927a4dfe11bf3e92f3a86ede9dba23dccfe2cacf4bf27c38c2d95df94de9f71097bd2736c24fc5e2971216c56882f28ed37bbbb0ae246482b6ad189860228d3f89c2d0ac431279eaa224326eada564aa3024b546950d39fcdbd4a7768d26a9f38172ce83c36a6691b31566fe858c387f8bbed4e352f6ef61045b13c163233064135cc776f9d52643e5014bc50dfbae81e12d9be671377c8f20bfe863e9f316d319aa886f1de8cfa930a +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000b103690a090be3fbbd465f908fa2f8443b4a99e57c97b49e76d27eb10cdf593901e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65b7a98184f38cdc20516e46209c3c123c068e64d3abfa29db96e194a5f4cd24afffffffffffffffffc9fe544d78de9957b0a915dec008b29ffdd844b162b5eaf9c2704158ae4b7b0631ce92112ce651881924b3d71ca7fb4b4375a65c8652939ea07af193971e6ef4b6c131ec009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a027bbd0fdb6ad7a5bc20088346ed6cafd7e24bb4a16bb46c38421c5387e72e46d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173bfbc1b1548d1d4f4642170dde8ee7e4ef4bc07537e873640613b50996b49a05019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a82a7ba65f6996df321fb9260bc98864382b5f61965336acbb14fb5e6281cf25cffffffffffffffff52882685dd4c1de20eb96ae2393f7a5d0432b075da28ba293c0d22eb9820e837ec6c9b265817418f41eadf67c9161778f47e34bd5149dbacc2af43fe4be6c975cf851a2600593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250d7f7534c87578ead462c961e0990bd76d39a8179e65104566d30e66f7a75eb216185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4add4bb4bf90ce6c24742572b3a694a3f403d0de72b2059464c21f5bc4a85060400e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58e05f3d84bbfb0831736c488b435c6bc0bcbda02bcfa63b842e1a72aabf1acc0c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c252a300c543b90b8cc0f30fee2a08a0292af985bb20946285b0b50b373d09ee04bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a621086115162f24d5ef1bd4ba50685d403cd66d321ce1aec13e60b92771c20d2aee1618300f003000000000000b3b73a759ec8279a609e606b21168f9e26b35597ebf6669c8828aca9434b1d6c27587fc8e08410bc3386966eecdbaacaaffe19ffc7f29cdff19c34cbf86a6355d92fa0d5c8fdf93acb59f74d61c3e42ef0c86f58e859e85f18cbcd88bd2fc3d9ada3c92cadb039f35df2494ad83822eca5ae5330d6317dff2d930f74d8896280db0a68ae56e8d72077fff8857f4eba94859c08fd3a5dacde4b9a41623ad24947aae62b47152c137a2b9f1ccd995bcb7c7ab8cbb0a76425599afd1fe162fb5d309307bd492debc25e475aac39a5a2e07730c12c1f2cf25870dde822bf67d877f42af7c67ace5c3094bd979efece664da88cd1ace1fe17b6a4f2dc80098d4b01747947e9beef21357bfc57e8136a3330ba6e7de67eaa9b6fae5a6107165a90d4f18e2548ccd246721ebc16319f4d16e744b1ddf9346c9819334e5c75b68654cc785a3cefcc54961cc601ee75265c1e8e45876bf4410cca891b7d218bf637104454c24fdf827a594a89ecba20b5c87616c90547738126ce2052b64c2a3244c1cbac8e729d8ca0dd520adfe5fe857dd540d1ae1b3faf7bb0fa662f0a77b9b40564e7493398c0c8ddda10328652e1d074f0578a40fb87a1c3d5de400c6109d7ce956d7873985d624a8a747615ccdc453d79e2667d59105c5d58d11b4f6bff8fe22d0c8d6ce9409b7f67bef02433d70a70e10b67216e01aa374066ab76a4039a14bbfb13ebb39754ab8b9e9138f3f30944b5b6bf85b7157b6aa06b1f2b070cdf155f23d52bc800b6e23df0beb1b7f59eb10e3f610f4894a53587ddd06a1ca656d0ec8d7b7fb0241303398a67030ab518558b20806f4adea21e333bf88bdce1b29b8bae364bcc97cb2e082ff1aa86f60d3a4412de96bc8bb6160ca99b6d7f0162ad0a667403a89231ac00e1b67980a14eaadd64cd29398183c50e5bf4aa3472208e3f1499e877a610050b53e204189bcc2a6d2f90b5c4de3f1a1ac30311a21a13c8ca04a97fb55bb175f5617ce6dbb97667f331051609ff3a6775442a42baddf61aee0c7980cf12664416a1169e8e39062b7867ae98547c9496b950d48c20f9ea9cd1591f5d3f2e28392a0d0b361cc07a124c128cf9ad7aec8df739f4a6d3244beb740db1364eea75618359fc568197260ced5fd80e3b29ebb5f40578647df5a69c2cadb0446c000f9b3f84e89930b2b8dd1029852527544d2214dd92d79bfc43c802a4a8b8e84fc0b004b9767d82ff23d88607215b5f9821c5fb77a149c4ad75e15fa4bdd373dbdcadd57cf046a5fe2d307d6bca9fe3855942c80ba3e254d042a6f5966394e1b34d110b69f00b21b21253052eeeab240dff46c439a08dad9d52cf432b71b0edcdee17346e2800efc8022a00644ca05f839d4ce2f3af144008fd8ab8a4d5e6e8975b5c8eb2b9f5c21a64005219 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000014f04d5edb9f3ffe5f0957a4e007429c16683f3a1d223082c05cede964237a5401e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65236a8f8d8825a63a867de06d2635ba6d203427cf4fafc7c6683cef8439e4f914ffffffffffffffffc9fe544d78de9957b0a915de93791cd683aecffd3ea551bf442985a05995c0ca43666ac1e882eb67da6a7a513ed59e102a616d34488b5f51a4cc94e83c3b9b14199112a7009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a8abcb462f708fbd2ec320f7c9c0a1804bd7a36b896a37dac1a5f073278096b5dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f179d95df79d980775684e518f7cdab5059b64debd7803880b5ac5414196ecdcac2019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa978647ac8101306aeca2b2220ae4d26e63a111c013c80c7857bbb87b7cc133bffffffffffffffff52882685dd4c1de20eb96ae213629cda31ae8eb380892fb6632df7499f1fbbe368a80873a490c7980d4d646903cbad24ded803006ae942030c3833e51891cead68a2926200593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25097ac26d6a723b9af0cde0ba1775d87ca9bf164924f9ada8a1ee56850535dd55a6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b43727260810de526b25977bc43fad2fdc79a369590b355898bd40c973f263185100e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f3682b96a7e53a92a34ca4c621466eac9d18672404d2f89c46dc456c34d9726500b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc7a14882ca6cae85a984e43432669056ecb09e32e042bd75b0df4f88835709254bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861182ab96d338946c153f416616eead7d3aa2665c3757c5d514bfbaaa662ba3bb2000f00300000000000095686fd4821eb3115ffa7b3d01be240605cfd336345d01bd6b1eb3ee5823392d141549b1e221b84426781d0dce6936f195376f1d3e42ff8eb4789c2765ff26bc9c7252eca53c743be77afedf1eda1a251bed3071381eb5648ff9994bafaa6856af0c8e42799de0d1f6875b35956ee1679588e931b88b6a851c787ce1ebd3256e27156d7deb0a261d2ff5e4726f56920b8b7a5909c1a0e83a145ae74422cf1f01ca490c1ff054e939cfb80dea2591e5b1987d4d12640339b00f4664180b8c63f794b05bb42f26f9bac1de2a576fee1b4d3797282154c3585466037bdb0f7a6457d3fa442f56c27fdde5d684d90946befa936d3397ef5b59ad66ea128759c44b9730eecb3ad02299613a3c7e0dd6d04021902ef370d7701435524f95702c98d325a896cea2b27a46dddd15a83270df908d0585b9563a27ea6b06c3540de5af9f68eb83f42a6c867609c7c87a86d340f5488c8f8c35620bca9a54bb578f77a483bd839d9756533d9d739825b63b5ddc65331d250746034394a4429c79e4a3dbf613b589ceb79afd7f4bad547ae7b796624f23333c107c1674e386f93102bbe9ec749f61ade4b6e2d0195f1f505858fd963c94269f8aa5b41d3bbf6bde1afe858fc3650acecb1190e1f13d652a370560845e3d86ea1e2807b6b1a93ab61fb4475d00a956ea2d35dddc6a82575c291f79ab018ad17b0e3839387b203091d808685a52f30c4d7b41a9086a5d1115bc480c13b36df297a760e3c37f3eeff295a71aa56199e510747c06c1828b3393497ec3a441610f1850e2ffb3f97b0e803a00b1a8d3a32dcddae0f564c44b135688bcb9941a623dacc6e6bb306cdfa57c36e58cc862ee1bc52ffa6870b8187a939de60ce84c1f439314b8e0a8f80bed5c7628956bd60299b8f8a5564dd7639366fd2170fc047853d1a578f8af394226c6858b5c5a0bd7cc1f152645581348c648ccc46a5f6ee9a76fc61705af6bd3a13044d56713fb71ed21b709370cab9df10307c6755015e45c9c79e62bd0f920d08e0f0f51b629d5cb2989d486bd429e651a95045c87018d953726386c0078bf35003f97e40b9d057eaea286272bcd93fff4ca9746f7722a895fa91fdb63cfbfaef5c793903f636f906257bb629b1823f19f2ba158da0ef1ca69d40aca3ce5cc4cafb8fcbf4f97eff97b41095cabad43591de229844b2bd791543383770e9679172c540ba51ddb7739d5db0425e49e70a75ceeeb269735c261e1395192b3303fd38a64ef9c22f88991e6af1264179b1220f3ad29d91d48cfcabd4ae44656cd28188f4f1af2a1429a79f4e3930ddd40829c38a9f63f703e2ec788c57fd1a8b586778f534555c96bc91bd1a74012d1776825d4a1f23bb93fbddc6252f608aa2d41772cc3e5e4944af50a29b8264eb0206fa043c6c1b8086b +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000618bb20d5f8fac31a8ee196c1ca29c20a564668cea3c388bd80e2dd2256fa45301e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65f54c5c85ca7972130b8708aef851ce9735e1e68c109ac7cbf0e15cbce4c6b958ffffffffffffffffc9fe544d78de9957b0a915decb29d26c78f89d66218bc4a8fd39f2bacef14edd2bd921ab21d03f6b7d1287010ab8804896bd023c92ae15bade1649379d20da185b061fdd009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a541e49acab17e9e9e12b39bc0d6802739a7d5356b7cdbe5be1a347521f013096d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c2f32f6c574bc414d2ece8d3fb3726c007cd0dcd5abae71afd6f81300d99b544019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a80c846f4697a687136ebc7d913795965538ef084610bb269e8d0b98dba11e2f1ffffffffffffffff52882685dd4c1de20eb96ae2b08ba1e80b7585fa6b7403abff7ba8e66d80fa0e1fa54af325f33828ff5f4de01c01b1bc09fb8bf42767090b3ac51a34e5fe63b7137dd85e00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2505f086a60e210a6804c5a8ca352782c8f47c91126b08d502031373243572bf4c46185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4c531e9aa6a256df19c2e6c0e22314c7a98ccee439eaa676e2e492a8081d323d300e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58eb04e4539fd20ab7a9e64bb9c598abefc9a5f06bf1109198a3024aa24aa92e5e00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c1e9b284f5e6c1d6ac38cbc3cb04e07d4d10e0493f58ab931a37a3fa6c6e983884bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ff407f9ef48199ea1000e48c1c68ebe13a852a76df28fb215ed907aac6c6894800f0030000000000008ab5eb128e2f2336137711315d4898b771e99e52684b1b1d670eed316e6ffc12ac8d83756a614a65460739d8392e4923a5721ded60dcd1d10cac6b4be153fd2eb57b5bcd78ed0b192f15eb2c97ad8cfc4533a5a6e66244ce477ea43230bc604cb39ca9ba70300067a09709a4cc2a6d260e389f26d8f51683739083bcd5d559251d9f2184bc7d7cb5ace7400404cea23bb84e5c90937dc06ca13b472b5cf0c0a0e0e91b2ed75b3d1c45f924998584929c3b79cebd8f4148bbb7a8ab8db0519e0d8c4101deca54fbf3623aaedfcbc3c4e7ef29fdaa5211a984452cc244842d8d25e5f671e3872a37c6115f5e6803a8ac4b874bebb9c422c5621cb932b39d8ac27de45a8b9bcf9d686d1f57954c9b193d66c5172c09d8a4e2442211a2e56713a4aaa4493c4c29c7a66626eeef28efb659595be57b50b32d3b162d1bf7e7866abb8d616f6f55131dae44764793814b482919886ad906b7d83f948b0e0898f7afb7968c415cd98e2230125c9053f4add5a0350911a4c4c9990bae5a9138691679f885a9c37af92b52a768292d1031af1c985bdfc38d38b06a8741a563ad11c5613f31f95688d69de7db9fa2ef7ae0f8b46304a3551b7a2037f5c66517063e71d0729599175dac59857ecf7ab573dbbc95a781eb55855daf9443fd456dffcf0d096507ad8f2479e181a16c32245de134ac8da3fde000aef5c3af0f3d55d56ff09429c2bc2656ff34a1714cfc4ea06c42005176444c944130491a595c16c3a68e9e6e8cebcdd301fc868ec2821efa6db97aa64193edc912575f002db8a51d9326e8878d5028e363c4e480c50e1d8bd62e2d635664ab709dfdf69240eb1311cf8ed796a8e9f09229a40ed0312b56b510dc77a8632815b35354dd49db9e7680ec6a3d0d4af199b8278b2441b1640794f8221a001d540bd8849faa93f1d0319357e6e66ee027610452a949de2893da3f152fdb5f0874ca9241a4776cdbb3b1be43d54ea16830dff85c2d44498f834efa856e20065c7cc1cb7de0fb1b93dcc54aa1b9dd858e7aa4f72e470d1003e2d63c012cbbeb5cbba5f5034465b2ae75bdc425afc5b7f8c455ae0b0573455e6b02978b4c252d7264e1744116ed68c2b9bed06ca974dab4fd50db6463fd32980abd60aa47028f00bdb9e924019333595b507f1bc7f6c48149760bf2040719b9aef03a607a42fb3f5bda67e5cdc20043d6d958c92532ce09ff04ffd6fdd00d10002beff0b054c65ea4b3d37026e874bb71c31292039c9e9b97f3152fbd6502e2d0b297244222825314031ab26e48e00b5bac443ed1c3a7f0c7cc8cfdd2b23b7fdb7fb04d4ac1e36fe60245fb0410bf36e078c85630e894d2a3d43cb664a533b0f6cbad045846cb522d9cbab56a9cedf8197a3dcc68c83cfb88be1e78a53871b98370e3449c7b4e72 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ee0b623e998fe4489ae4e7330116df7e2dcf06ffe4aae639ee8a9610489c276b01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e652b8c5faab681735e5a181b2b2bcbebb2e35f9b7d727b12f13565b83109bfc83affffffffffffffffc9fe544d78de9957b0a915ded0214fdfe6082612d5f5c6c7af07d390305c870a3b3b8d4f5faa8a5cada7efb4c6d53058bad2883dec6649ad24d44ac16b5412b233f5cd08009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714ac23b1b6343e34813d99d98c4b7a84324de8e631a4153a535e22d3fc8bbae6853d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17f58c411e67e8156df962fb8c1ec99e893829114b49105b6ece37f7b422b2731c019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aef0e29b128def95b785d55acb88e67e111f5fa7b04917e8c94580723a2342837ffffffffffffffff52882685dd4c1de20eb96ae20918c2131c9a77e01d730e9b5ec457fd7482df0821108d1689ca16f28c36546d4dad61e9367d66e9ea9e872f25d705ceb3a9be927b37d53a00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250db6ad35cf0e73949b0fcc57bf2ff0ce92020fdb4a8f6d3d56cb5a0a2df7d74c06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b43dce09f8690b6ae5ba38d24c77c936dd6d5a03912ed76f7efa223c5f32469ab900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b581a2aeae45a3abfb963a649a71663364d935e98410786a1df0f93e83bf130f52a00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb6dec11790fbf37fbb5211e0c08cc1e4859fb857a1535851c25b9f40be1641d14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a6210861104480a02be7980ecb6b55b0d761c9a930c1e30a6f0eee8fe1b016a240d19cc0a00f00300000000000096ed74c34a3214d22f545326dadcedadc25f4da76843822a909cac4836ce980ea430becf3f0aac8f2b79f1b4227b0d14b176bf788f1b4feb5be92210a384db57c9d614d35ff70642ad98b1de53e27f7d25b5bc7cd5b136114513df3ccfe2a9838f2ace2c6206ebf11e89dcb3978e9d649b02c7f32c361f004eb39b4d240bd605590ee7fbea3d0494ab33b28e479591efadf2f2495e7b73926a0c7e4f5f780b950ea15283dfee3e2a72eff071a321314fbb17c019303bee8631d5f4a9c8a3a9b5b741c64ff25fe1bfafe9392beff9981b4d91d85781b67f1d04f17f3b75bbc0b9890703d94499a3b30679b283bc256d0e9431bbbc9606b9dd00950520d678dbe217045d6d2d93eaf4af6b6c398d5db8ea724ca940e3272c7ea73406b9113de683b77a84dda94cbbb9b91836294aa39c675596e0d4c85371bf9c3d38ef09df1b64dac9045cfdf6d0186164b64383f91cf0a4236a272626f2328afbe871ac46e153c9ecdf50d11d254b607545e7493e19400cdb97bedbbf5eaf17c3853a669fff61a2528e82f2ba295308f72a49ae67c64575a39f3a8c8e454089f1a04b9000c4e24abeb32f91eeb0db4f7df1c0a3d0901e974628086f2b11c68aa22448bc62fc8e7847f491997ef072642bb83292c0b3673012726eb510d98a5fa4cf624cc2b70bb38ef2f7772c83fb878cac835636ed1feb6cfd8e1f0a1835b9a53a66201af4eec2d63f46a621e0002b6f9283f03327f97704f3cca6174c8b16f64d70ee7dba2306b37cf48e8ae3dbf4d3194d2bc46b6359d473266b46a85db5756f394cfb4168378713ed074839096f446f185d11a052c92bea36ce06b17d7e7c457991c044c9f24e8187d16d92fef33a07961038a3397933ff68c54f91447497f174e7ecdb9e5273d25f18e111ce2578321e7b34c75c44e7a4b315636d454a557236eef0ef03eced7a624e60a321d6c4263a7f424a6dafb785e4aa6ce84b6174b1712d5b636b048f4e6706c2d8a038bab1e4ad513b4cbc3e332ebe01227a770fd1a29897938e46df8f0c74100e9b26cfa2d3fced9d23e69a1ce5f091c08b8ed7ad29ce3a69aa9d46b10879a703a1ab7051154ef06a208857fa1bc1a5eb39e2c5eb295dc76e108281a3547a65bba845b627db54fd1531328a7298b976e3e95ccb737e48d9ef2db2426dbeda6a690629e2691189b5a261e8475c6bbaec8547d95751b654df37c77a6c794c883f358471b5e6b943aab931e20ea7013bf182af275eca6792fe96fdb44f4a3409526880fb8a284676239c6474a0e2911cc9cb8585b955682fe04f7efae5ff278f02938b0daa3d09f42fac194f02420a707fd0d2ec49689729419b6405f889c1c30d7137e44fff0811d6cf5d250f96b53fd8da8a3c0054559e4c4000efa4e52884184f54e47b38b55c404f09 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000ad2a0b822b7dfeece0b5c2766e54291ecc81a6102f5f6cab4442ae21294adc6201e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e651645b5f2b14649cfa56bb85d6a4dcea0d62388274b60fc9774c75fd7cf8647cbffffffffffffffffc9fe544d78de9957b0a915de22fdfb5b713ec3ae01400021ea29c6983d3ffaff430a2a14aa71b47d2bd7106d9f039d11376ae1f25b4ab5835394c3cc8813f55fc449a0ca009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a0af84dcd40152242ff395e3e0ff21f4cbffe2f4fb302ddbadae74a37c66728efd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f173db806e16689194e6eb70557d769804f1394e3e5ef5e92657ab13441013644a4019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a845386849f16f3f0c1881c1d6a3667997338ee707d2b910291ba49cf439a791effffffffffffffff52882685dd4c1de20eb96ae2f1c56a8a94c977a8d759ec02eb064d6a0eaf00f7f2d5d6ee018cdb9007f4791f09f065c892dfcab9202a843bf93e6225350dbab6be68fe8000593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250594ed24ebd399d58ed133f36271470752afba4ff1bc8100a74b9774f19b1e6b06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a2a33320d2698ac65894f584cce5b3a7ea16a474a6b768a8d1ae75f82928e03e00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58b8d2433c20c90e08d4d23dc7c8d4ded10bedfc1e9008ad0064edb3cb4704fcdb00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cbc43e01ac0f4ba2558839553e742d16b3481f8ce7f9836e091db6bb42bdedacd4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fa91bad6171833273540a809ab9092602e42b01db581dd1bdf8fc4f7b326dc7100f00300000000000095eaadfa7ad948416fe4e8809068b0895260d533d3704b8582ad879f87af67f755d307a33be80a75f26f46a7ebd9e177830e70f44cb7ebcbde3d2ab378a13781458ff6899905bd507f5ffff62cb5785107bc2ed0c08442fb84d8cb1ffeb734d5b0c7fb0d4b07539c8a1d579e7baf9071d0fc4b02ae3766afb195f5fcd9f1ffa072de82eaabf1142e9e09812573ccd35d99f1d3d0751c023c83dc08895c4054b1827332f9063cfd70017cba228464ed485da47dbf847f8bc0ed7cf815f2b64c57964e54c164ece3845db16394de3e4f8af4f6f942f73fd654ac3dcda054feff7e07dc3476fda1bb062b0092edde541e0d8bd5e4a15dc917195964a5d250fdbed742a726866c1e382a808c9d05f09d84fe335c4fa8e3e591da5701a686cd2c9623b655cab602303bb763120399cffc21e3a103e64ebc0bdc44dbb9fc88cab9f026d2a7e4a833f47fef0fc195ef5d46583ea0fa1be4fca2a70dda71c72a3d3b34eb4b442e303a7b4ec11646811a0562cc6b25d620c610a93e7701c106cf5264099a86bbac72ade91e7bf21a76d47f870434d1e679a8075b3ecb9ff8eb3b34d285b886a62bc0da42d4c1b146c9b268fb1709938a5aedc1dc8b8372f56f3c9271290e6e90ba1f4acf4d4a9298fffec5ca595bb586c9b336fd848bb7a5b983b77c8470b68f9e2db983de8bbe206f827d05cfae2d1406831734ee8e9d5401110ea96324a23c8a9c4ffd317897083b1be78b99deb72e7c8a06ba7cf1b75fe8ad4853d5d5f3a2b108e562e14384d95e0872c1876e7cb1b5ad5dc825b65b552e144e5601c6e9004b9aafb65243a645c6f4186a5a23df3d1029edfdefa0ca745975ce80e1b38dae052508bb8dfc3742d86cb81e1955d264e2a7e715d340e2454a91300e79ebcf812dcba576ef2dd3e98ef5843faa3a6a84c5d840f837d9d74c4b5508c944435de9a93a9006990781d876a9eb2e304acb618f29c066d186377067c0df8db3153fcc9a725f89d1ddb8fe9e76c5aaee342cab789fdbe3dada77feac723483631dccf58ea71fa7a63126016e2441c0181e1c5feaa857c7c42e97edb4f2d0d8a8e07d3834ab7b34cc743e186279c219e003aa9bb9f45e34db23c2ce9282b13579bcf12b684c0cd079fb0e2ab6631af1a8454513b31748f927054a4ca04785d9a84b071ad3edd2314875b091b4a3e101b603d4ac3016ffdc7b90bb66337dc5b3a3cefa8137f51d28493f54728e366523312314392bc943ed919e8ca7d5e96cad70f3c7ed9d5d3b671df3312a1446b83aa20d3b2abc6a06b45d1ded2227f8e4b5151910983e85fa3676fcf555cf5ffb484434d310af4b1336c6037f578b67982539b568ba7d5f79c4d94262c6ea945bbc0370ed57e05c45b9a0e07c73679122cf93aad49a571589586666e5f59aeb62c46e22 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000002ee0c5f532b2eb37cfd1f1c3f28ebe149823f14c7241109f2cbc36d42ca7346e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65e18e3808feb6f8651a8bdbe7d4f680403883cbe2889056e113341cdbd6fe0c21ffffffffffffffffc9fe544d78de9957b0a915de2c3848b9c3c46bfd07cdabd44add633e565c078d58d3e524384f43c4915b823808091487ec487bf4a96823f0f79739ae30b40ad5e7ecf027009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a26a8fd058621a4f4f11d16e8b2832953994fc18eb443e320f030a6a83d73dbacd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17147aa271924b794bdb664975f8f7e384049179bad694277c145e9c595d4e0ecb019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a2fb5b880ae4670046a531f581df7a9a31394908900e2e0a76c88047087315ddeffffffffffffffff52882685dd4c1de20eb96ae206de4c48447d0cefe6c0318c387d13634db49ec6b1913bd2e8ca2f34cb6be851461cc371c9fbdc32b6935b7f34359fc5d5894f2acd61189400593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250e646d0d93bd216e75955e1b38f41773c0e02ea181a33bc0f92e039663a1fe4c06185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b40e697ebab5351c97bba10e33696492f3061cba4db3a8d9a9ae1defee6435302500e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b581e139aa5775437477ffa73647ee110f296badd84d56ea757ecef3553e4b18d1c00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608ce2b8dd6455f7052aba7bcf2014b2bdc2f00b797c3f2f66dbfa89e668295ef7134bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611ec2ec0847954e6443fde5ad9b00da6344a10cf7d282593f79aa4c0abe9c5aab900f003000000000000b0d0622bebd3db0f7063ca720fb970fc55d1984801bd9636c6b06719b627c50a81c08dfad1d57e27a4e3e5d8b645758d8a9fb161b8a2e1e78640b61979b8452ee19dcb08018309698df8e64be35060c332bc70d999cfd6a36e63ccee746698d1b555473420e1c998ad8c23b4013ef465b2395e9471a54dc02c38d11383d409faa66cc81133656bb4ed2df2bd2f79b2e183dc823ffe559bb6096bbc8e1f68b027c2c437e4458ee6b902e4c495a624616ce1ce1c3e8ea23d5c98f7ff990d3c246480388b3ca1e90155622d7bacaf31966f08c267501633286de1822d7f549864bbf0eb8a1b440126d4d1d3af883c1a6962b2902cec62d938b6a91308c85701d4b6b376abd79a186ba52685c4cf2cad9e19784c6f6e8c732d2441e77506c66d59d281198c31488671416c1c182a15c530385f8e429edb7b92559b127c2c62aeb6dd4b3fb0ad3658072e2508cb9c29bea63aa57bc6103f4c21ca03168b7a5f15c3d2be788176c058e6966d7b27aa3e924dd6d94c16327c17917e8fc14ee14ad178728cb1ee1f108cbbae01a1f56d5ad5e61f3e3aa93ab7fc1cb006bf7ee0135f0063626b7e6d2c2bca1b70d7425700a5ec758f4ca71cb095a23785572656efaf6ff65f4e01a66e3459ec14bab750ba7721b031feefe062c156d175702a357e99c6c8b30beda86d207d007af600db5f44cd4aedd7d6275328e04a2597e8511f142b418467bc334f8310d2d1ac25164279eac80885682a0915ecbe1a40558157a1ce34ab9c8e114c7a270808a1bda0d4fa24438f1c338479dad0f0f85ae6d48ab8fd6aebbf394f2553425aea4e986e8d0d93726e582a645780b584dbe38377c9a44118ef41362e332d8b49e2c95c5e9da1f108134beb24698909b09cda416d71cfccb9b0152a34ffe543729fcb3643e2b34d6029c12c34a24d9746fe68dcc72d6886254afe291cebd547c3b540ad5b921c6d58c83921f22a78ae0261cbd501acf298f1ac2532c7af5b547e7a7fbedd5b63185ea2d0779c4861417c41b1f59a420c46dee8f14a0ecb45db7c947ea14f2e07970ecfe2e154e709d4bc8f1809adf509ae2bb4f992d664a1b0d1b921fe0f98c6a249b94d62a06be1ab22779c82e960e66846a4b511c071c5b543fdb3140ebd77024194f253cf17a74bc42e309b6e0876f42eb07f8a237abe71ecc029f5ff2856de5b7c85ef4f4fdf22db15ee496f344267be826a863b2661ba1c71d6929422abf32571971f2a39eb672a342271e12df96b298a46ddac274028b6b3bd22a781e2ed0e1366b93346041ca002dd5d4da810286050c01f03af87ad6976a6fe75c244f754bdef4c9f18cdf61c36be6ff05d956523a186fd7d1f5e24d17c6615c6acda7945fd058fdcfe5561336cb5acf39f47f271b585d82b34c5859282261e53a7b85263 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000944f366e077832159652e9e698e3c1bf74d33f69fd5add0b9285373087181a1e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65076ec0bad9ab7ed2aa6ed4c50640ecea6d7d8c17ca403694aa514446b1988b80ffffffffffffffffc9fe544d78de9957b0a915de42d00c58529a8929e0bed7fb2163f45a8f6a18e9119f5061f7cb8d6f717d016a5524532e9b879435e84d8e092b0e25dcfbeb766019fb02eb009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714aa1ca754712237abc7337e19dfac12241e89144285d30e2f181967ad634a6c4e1d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17176b719e06a15115058cc91bea62965072ed6a2a510c98d5a08ff88f04e43b8f019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a841a1f8f9e7cc3871c3d802d277a6c42e1da2697c6bb1111e2fa53dd262111e1ffffffffffffffff52882685dd4c1de20eb96ae2cc058e35510009b368997af2bd95a452631b455e09562e4c04392c0d15e060e63fa311b602978c4f8e373213d1ac925cdb5837463982fa8100593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f2507bb9adf0f1a2236904ab55ef558a5b6cc60f10bb49983b475e892db9dd564c176185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4be0ccce0528a8f803e9436761ccdedfffb79f2ca3d2e936360decdcd7c51b2b600e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5892f2f960118fbbf99e2057f0bae91c89dfb7084746291493bedf6cf55ceaef7200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c095acda67213a37174fa42ba040d0230a0cc48e0d1db6cd5b14324081f808b5e4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611c897930461a98dd7363088f105dfec7e1b07b5d7df170d902f2bca00ba7de78900f003000000000000a715ab40dfb5939eaeee346bc6a08f4c6efc2bae8464851c151255faa418a0a8911d81ccd6766c49a0c127fca30156a180eb85f3dbd07ae94eba2bcd19ce5bd4109560394014fa234055f407d2989694f8c7f583d64db92062691559ea10f8cca9b1b6c016f346d7a8fbdcf45c5c6f70b06c3096afac73c637004b109d05c269a2a641012f4dc94d83ed5618e3a8a37d9723dced3669624f79174609638bdbd86dc06e844606a4fdcde81810f03a624bd7a5a76fba6060b844c196f26fdafe9286163802a30c56aadb45f3d7c7bf418e93b33b3e0bff1ea22777f7ec90e4f23c7fb0d159d7b07f923f652148b86e69b991aec97ec40638bbd413fbe95df4c5687b2df8aacb47409b96fb668440b390cf51229012190855b94ac482d7daf45e1cb0a22a1bf45d941dae4da167e05ed4bf908418496c1e48174ff7e34d01f4b9800385751d0978b8214653e31798b8ba47a7ea543621e6bf5ea471096d3c79ab2b10cb8bdc8c41b12962b1b66b72888676ff56e0d4ad8bb5325466077288777fc08bb943af528199d244511477ab1119468c146dee2c3029a0bc0ad69afff6f82d2a787ec1f9b70a4fecb6773ac40df48d9816052c662805bcadc1c84613e054be4cb84f042bf1b759acc37be12e83f93bc0ae2cc135006ec25eb68f83abda8280b0543ea20a7fdc1acd6a9f20087a7f1336d11af8843dd171886b782901f280d4a61e682e670aa136eb5afffed9c7b837830d0612722471f607390333dee699bc8651bf44d2b14b1c83edfe621ba53e17b222ddd4e2a15b78c3ac157c409b60dc034ea5af3accbf03ff53990c13297658a639c030d923ab33bcc9c6336e40c9d245a2bdb5cf5d3e1efba582a38e95f226f789e9b5570346c74ebb11dd609110c59787d70fa86a58ab134482d929ed1707288d634a6b95dc5c96d57d98f8400eb787079795fa7c5b0ca2faee76e5c6ec6442f37a50718cbba6c83e5b51048189b5e7821fe198e4ea1a3383ee1c7427862c51464e5674118c9e0337feb5d21ce03312215a82c229f590cd2286fdfaf6bd33c8451d07eea72fd97813383cbda03f3edbc116394828a504900e7ce3777f4270fac56f9f788e65c08cca2e44f0dfa374760216297251f9c3a1a1c42bdaa8273c5c70b4480d62ec4d6fc22b8456ac0ebe99ba8790d9184a0142f349b1e019c9682d1fc6fbb1ff0226741bcdbefb79d62d272864fd586510aa87835b92fad6ee59187350837dd5e2b768584558debac69ea297db7c71da773cf47942e725d452669ac74ef2272e6bebfc1635eae75ed46950bc908e36c795c3728a4650dd69ce243b357dd5c008083550b90e53613180a66151750d9b986415d4b239226602a46e27c1c3effdaada65432ca19ed7392a90c26bbf1f7d82f5040bbbacd5797d9b5c +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000f401906de70235edbd46584c682b8a6bb539a0e9572652a2deefc3e2e18d1d2601e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e652dcbd03ba84bc04fc90903d1e9db0b7f5812e39a51d169d30864535f3f2dd992ffffffffffffffffc9fe544d78de9957b0a915de8d69ffa1d96f8264b409ebee99b42536ddec3a3035b17a2080e766f515d1577e7dd6b1fd828dba665e35786aebd596e68f473c3ebb675423009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a98fe5be3e1475041e067bd454ef66877211ed0cc3c1f805eba8e7a8a0da37c35d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f175ea51cfea6b6819a0867132aaf618c381dde52331f635b4c0582a7202adf4a1d019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a47cced32041c98c6c26e7171527fae2b9bd59d4c33ac997ed265e4d9f52a3005ffffffffffffffff52882685dd4c1de20eb96ae2eb4e44afec8136ec2d51eaf428977233bca3a8debcb1a9022225314fb4f80b31bd99154fbe770f468857b9a72e2f503d41283a72e0ccae7b00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f25011389b908e174048acce5d53b7cab40970f48020da024e054fceafd393cea8f36185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4ecc19a95cf71b8a484035a26c142b73a8710871b75560f35fe783185f699eb6000e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5840de27789cddefa1fb852ec748a8ca76e326e847e28fb675fc8a75d90f19031100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cb96dbb132004a425368633c7415645944ee75f342c1a1fff7dc3840dd0dfcbce4bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611b7c7874d30595727f796e1eef340a899d480c114aa3e2783b73e6cf8a1d7c5d700f003000000000000981dead08fdbb45df1c21653ed76af9d7caa1ba802cc5db0e1f7b51f8b63db40ee02d7b873583891c509a3b72300a3d990689525e7dc09c2e0c5ef1798b390d54edf3da3c1c2a8a0337b2701103a678922e3dc5c26670b5d7157a50496047a788cb95dbc77d5ba333b84972b0e83d6e04a2f9535683908840a2cab80188bf9627e5907e9ab68a60af56988da24f8946aa07bdcd937d5cfc3d0fa962bdcc03d6f96f805753f00d4c205a643f4e02d82416d457b61ce0bf531a36b6d467422b67caa85be61732dc89f2c295a619861f273e8eb14ed8421a04575c33f51c946cd947b1d5c2585f6a4a7e443b87a8a32ab668b04aa71c599021fcab1066f904ac1ab1ec892c2974ba3eb6ea1e0f5241a3f98cb9821d45c649613553cc0dccdf07d96937ce25ed80fb5ad5bb1b0e96c8329656d32afd6002c180d87fe50191e2a384304dc324cc4afecf87bc2b5b25104cb02840c817bae4858152c851de80a9f42fa9dc894617766223515ed974c43d38159f07d1a7a2b9384c3062f51be9a11bd0dada8b53d244496de5ae27505366b4d3b8ef79ffa79e8c918ac2d6135b905cd4e4c1f08dc547be721b9b6dd2d8474ed37845068d70e675f1627ba40da572c15ae1961ba45bfd167f65dc93492d25d0da11c691f1a38b6acc5ea506759142043f3ae89a51bd875f02f022dabd685f67ba590c9e09004b867dabcf3d7ccf562d87ae040a03d6969ed2bb04b0c4a3d84c7704aa2f60df66973c2f11da24fce6a875f117fcea497b90b0c6b0451c268cd966855ac8228239b7db673413ff9ef009795793dcb5991bf9db1e8b6efb0e96e1b357f0d54ffe9efbf64d099d01ed0d8ce8e6ca4cb84672f9ec03ace4193ce510515f79bb0ce5019562e4473b0ff1a91dbe5f3c0e6f73b2e5087e575d1011ff34353421ef11d00f68b9532dd50a27457f4b44377a8250e2df97c660da18acd69f652eab6dc455fb773e7adf1a7a67c9c75396c42e12a5edebf46c362c7f31088d8731b6569aa8750fe850ecdf4aef8fc5563a20b24810b808df02ea9a79550c6171d81a078ec8cca799b05afe918dc52d0d96b9792df0994fb3e6e617120dd50b90dfc28a12103a5f8a8a3f414b7ec6c114a12f50360dd7930eff0bc6d2860e24411705c379a75a300157fc9b2ac0d543f312de62109c0307830a781055ca7715d40317efb666afc74b7e43d3d3c000ab4101fc0f345f4ea297835dd535522ba3c1ea469a9fecef9fa1cc29b3454267418f5ab1ec22755790866d5746854904f3e50fb2d46c4ef2eb801f8c1ade5e65d16466b130b114528a081661072a31ba2bb1d6795d260c80d5250b65b3d238c89fd416ee178d479b718887437c252bf3d1215ad20592e122e667372867812efb3fe7eb82d992834c35cee965c5f33fae00114 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e759010000000000000098a6d0ee85d83a697e6bfed2798954998da1ab20baec106bb7bb2cdad5fef10401e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e651eab049d93507413c0245069a1f1ab9000ef240bb1b7cf929792d756303f8eb8ffffffffffffffffc9fe544d78de9957b0a915de3775e5874a8db817895eeb3702fc6885437e19d4ca3f51a90cdf4e35ff8527a53439cf2121b0fc42c36e07bab77096f6ced2a5f357846fbd009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714afe141ad75161ed2443be2d3e1ce968f0063a2bdb8810f5815ec9f610e6c55a94d85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17ce22b938ded3d9fe9224202822254e29a3600f08115bebfb2f5302402dd0e798019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a1f85535b2209d2b86413e7f0d2e2ad27ac7825e0274aea63acecca03d453840effffffffffffffff52882685dd4c1de20eb96ae2205fbc711d312f706297dd2e13c53b6c9ba4a119801c1046d517c975068f9a32bb0e01af968bdead80a05b4e167f8781ec4f9bccf719636b00593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250d1c2b206a58a574b96cdc3d93449e9650a5e78ec75846ed37a5148db9bd6976f6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4d44bb2b9ab71da6e6ff6ebba8776fa13409a2427e20c11e78c953004462d4ac000e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b5835adbb5a7e7cc537604f94bc523366f4829b5b82eab306e36074f3e9b821d58b00b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608cc16542db1715eeb6137acd6f8cce238d0b1f78633b0f0d031fe3bbc6f4b015004bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611e00121408f187c6316a45ff8b31f4cb72f90187a57f2100971bf4b642fafdd0800f003000000000000afa0f2435ac6ac76cf78941dc4aa1d0cdc3414f67ba64f1bfd9aa4c653cc5e11bcfa3f9790b8794682d5db63fd8040159617f7b977061cf2fafee91a15a4e539f100f0fb51055e8e3d55472d825ec8e95f8cb887280f60d4a03e3ba1689fda4995af48784dbfeef67beb71502a0d88507c6c00805c419167351648aacf68e3459d9b80baf8499ddf7f3a2f7c64c17e00996190963693c9c568fe76cf20fb8c65041c30bf7d2930e20c95dcedf75e1b34ebf7da3a433cf6dafbbd0cc2b11571cb85f2f02b50b3022679b82700b4cfe32c1a416a013adc1b4707859f70055564968fdb7000bfaeba483fea1283b0d0b6a2b171dbd2887b23ac344c54c0b549f3171049dac50fb6f5210fa26a27d5233ac93222eec69fd45209d39d314471bac737b5e32b0de84313ef37b86a01802aaa9f3848f330523e990de6e268e9b1cfa31cd9490d13be109efda8967983ade33c0e92b487403bc2bbfdbfb506684929bcddacdd70bb3a5c889f56c882618242a0d2095d1d80fbf9233b6f3f3accd5988df7b091f39860b8e43b0544996f7dfbca4de51560ef0a1557acaec8575ed74d090f0fb9733fcca714f39cd5bf4db32d82a1a8db03e8460f6efc6bbdbc384ecc6f5a6188e695551f16b50a763a1693ac90199562f9eb35bf60376e04569a84aba4c48da2feed92f64e8e5caf209abf546852d1ab17de4f26443a19024faa39c96b550ee385646405396ac9869c6b3737e2af6610072d1553605569d92006f6188779ca932b15f9f3029b17ee3ee69c7ea366195ccfcd24e0925f86b68b0f0ca7d27072a8c077195157f864f7a17d90be18099135c4500dc3eaec33b150c5577d917cf80c86687c33149bf81d3475ad723f4c55fef89baf0496c51eaa8e4b72870772890daffda6927b060038591d2fa08d57bd0eddae3ed4ef7208d9b48d08ed55be66bfe428f15011e68ea255698463eb36cc019d4103048440b89fb609ee40b9edd194db94014f2fa9ed25e719db61024a8d8cf5c0ccaa57d92a0e691e40fe365689c795b9dbef08e3be08a05fd552b956c3646421725d7f282fabcfe3dd5c77eff59a3c6cac4c394ed5b9697f968e420c11c770595e3cb1565e96bf8fa20563f8099fba214d105a214909a23aefd1f93da49a54681d893c7cd85f0285e47c3141b0340997f44d62a4fac5f5d3df10da36a7bc56d852e34bd9cecaaa744dc428abe3f79f07f5e9a0f3fa3ee086beface1b4ca98b832c2ff806ace8d9feadcb934c56e91df714da046ac942674174a2b45397adc2e91121d83fc81d84a224e74755bca867a05295251ee5136e8c7f091f64fea1a288551f39fa5a1aea41dab3343fed1833ffd4135c51aa661d912947b55c521a3da6ab27650994f2e3c9aab9e012bd3d4e0ee283b41ba8faacd4bc435c06 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e75901000000000000008bfbb50484f89df143b09a152c0ec892483043e4d0aaad36704f6fbb6e07046e01e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65cad095cc7ce6738a3d380fb46684118a8d40eb16e2e174b5aff027f8f15bed3effffffffffffffffc9fe544d78de9957b0a915de36e394b1e0292cac4d02c92d82456df73d6259955276ad0bf2e4185a22f012cfa0804c8c5630c9fc3c47cff0ffdaec568f96013509f12aca009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a4d001a854f5f7f1b6266cff4d3de5aa398f66792bd6b635a1182b888be82b59dd85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f17c2f87acafd150bc3092784979716296986580bd37f7267fdc54277334ef3a4b0019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75aa310df9b3eef9d1e46a55b21e859cbaf792f20e0bfaea4751abfc42ff7dc129affffffffffffffff52882685dd4c1de20eb96ae293a58cc68e66760a2cfb8b67df022d2a933897b99c03abcaf8a24452aeba82061211325432c0db3d3fe14ac233748bb28525a0d9c73e166500593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250aec7f869215a675aa17ed425f0f70fc60e43e79d799795261b952a3204f06cf26185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b45cb80fcf74ff3814720e86162e0a085c57d00daa307ed2624e74572aae2d264d00e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b58f04e952a4b6ce62f4753b095fec4b9c3bf7f82d0e2acc5b574a885dbdfb7a01200b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c141f4935c47f462574dc9d4f07a36210dbc97158cb6133d0d24301198579f0834bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611fc706a5a96042e6f4af906da2032ec5856859c82491fa17798d42a368e23362500f003000000000000a786e2c59dbe8e24b655450c38fc5d4f02c4a9f8e972669be5fa82f0cf540a8a1e41eff81565f0d6b449a2f5f89424548a1f1d9239b3002f3e92417197106e93f226d81bf7e1dd592a5c2e2206b284b9486a6c0e6f80c5385c7e8d8ec0ed89c1990e15cc2ea4f335d35d1d313b7cca9382184587beb3a177aad68ed1151f009859012b6374143cfb78b5d56ff462957ab31f04e22238b0aaae96fda83c52abd6fe1761780d91c419c79a2d2c9210574abd682b5b218b1ab529904f50a054c43992a6c02d017b0713fd24faed20c5d4cc29ec0b0f85325bd1dc2e4a419acca6b6ad1e2ec212674d32b83b15c9195b94b3a44365006bf68131db44dceba065e670302fb7c6fa467197b7c6b02781c775e4ed72e9b8a74bb9b3686dff7da24a7e37ad2fb156e7994afdb87a4a66db5318ed160d5d24f5c1c65d2c6c2e5eea0a0edeb24239ebbdec644898f2cb385d404702981de8a867c4fbcdc46b1edc4dd4f02c5fb27d152570b0b46c9334d5eff5c4b92ab4b6fe1cc8bc97c2d3a1aae7eaa093b9eb56c9380be50a9308be489fdf94897d33d111948ad0abfb26a6750af233a6fc7c279aee68527240aa8e6a3538c2e2a952c09323befa20836272310c4183e06c62ecb76c59726063e232125c41ed633e594268e292a4ca3933e8987cd9f85eb63fb8574ae461bf5e6fc858196b0ef35bd6b4d8312ed22432f5af0d07f3ad18fabc5e5cd87b90d475b6e015c6f5e4cecc80cf0118c75f1ac95138077ecab7577b29f5f9ed8280af384c580f6b5d2d106c901fd5d38ac073e923fe6c5eb46b4c3b43cd883bd30a54a0df404c3b57186712452bb52b0594f80dd3751f2eef19951ff39fa67661651ff60ae6ba401a7436bc6d026b1d23f8c97e8db7a6a6a7b7fcf2652307006412acc1f4e91ff8e6c9200a2c4b348500739a2a4841e48a82c0e009455247b6ae17cabd28b64360d4420e412fcc1916dbbe3d127b62faa359760bc8272905347f5d6d98d9160047404870dbcffd367834e8f8c675f96ed1761ad5347262a2b050873471e6d7fead15b360f7dbe08e702682492cab33c9fa469cc1c89c91b6f8b7e28f9272eaa5a203c861b69d2d414b47bee5ff91e10201ea45f68bebfa12a2e2e37e9fefd1cd2b41de6fd8d68caa03b4c1653f8769bcf178c42a97699170801719e92df927bc20fd6b699f6ffda26b5fa11bb6b7efcfe5603cf7f91cff269514f19187b88db9e57e6a60d1a2f62fd8c8010b0690c78807a0c9760d0c0b8948019138fa57b1d9feb1461698f1c34710687dcb3923fede5b4d7e00528a11c34e1943c7f95a0f3421cb984f3537e7a384c8cc13127f90194b74928276853de7bc20fb9efe59d4de48104f0a234e9f4cbce2a165110dd7a638dba3537ef2929ebfb09d57bf030943957a0007 +008f03000000000000fab402000000000000be6d1ec1f421eb1631a86464ac8df41c11d3e298692a0b368468acc438d2e7590100000000000000705a664db9faf5ed818ab2009d1b82ebda4dffaf5b4ee85245b0f9a44ea6230801e1bbc5dd41cd84707a19a813a2353a399d7649725400e7bd3a18283bd1adda3174fde50a7dad671149b3b6272523fac2ddc76a5d43bdca1251e1bf5ff2278e65b2a40e501d0914e5cc1470df98484630332a4cf98884d7e96aa563d2bc40dbc5ffffffffffffffffc9fe544d78de9957b0a915de579330a672c0956b0c20811b2c9af4467c6f03dc5b3062189f42038d5aa75d4cc85929c95c681d001458699a03d2cd83cb8ca8de33dc8b01009d3dd5e17dbb7fa03b93470341977bb2e32c13a6a0c1f1d254a2fe5b8424714a4dfd399c0d6363d36072b331001074d1f02ca51446be41a5c3a588a0de9a726ad85dbd596fc0476c779f3e2e7b5e58b732cb71f9ca056a8828cf845885a22f1798b6e10c6ec18666b8fa562d06e3a7b4eb90dfb87919be92821a472bd75d7c88019cac79c4b400e3ac383960ba1a892201c03a0aee1a3c3953882e6e79b0ae405e84d3a24b66fafa0250acb6fb7b69f408de71d3ab70766ae1ed14900a551ac75a888da9ab40d21814cfc007d9bf3d5432896ce29e8dc632848c706e11a4a6c0abffffffffffffffff52882685dd4c1de20eb96ae21eaa385e0a0f7a8719ebe098b3e9d456ae8d45ce6216e173431eb603505909c846ee72c7c5d4e4bb37b9847b8f93775cf91240b4e28a2cf300593c527cd9ed46cb3f65887ad6c7391ed7f99eb3ae399205d535f4c36cb1f250a7057aa8f190c94e8f351f4e65c22807074682c3b3e401a89d805c92bfdf89ba6185254a600262555177ef42c4ede260249eb20e15f00fb94a1ee07ceb38b2b4a24a52e3b7b9b647a4df412a70b868ec3f6fc96f6c8d024fd1cd9e1023a84e9900e1f50500000000000000000000000000e1f505000000000100000000000000391d595ec6366e6f7dfd01198b00d0c1811c6c826066cf88733e4ddfa8933b588b1e0e79e260d554d2dfb3abfbeb87347c7a871833735775e96dc84433f5561100b96a3c7c1dbcb4d8cdd8ef13e50e84cf6480116311677676269d3e662cea608c1810b4f2cd3888145545dbe9e9c4d5747f0cf624cd0de47f44a08b674935b9b14bb2c20f5e388d50e610cbcb033301e0dec8c4da0c85b500d9cf228a62108611f040511b30b1d35dd03af3e3f7e6191044297c755453c0f6cf6fb56ac1352b6200f00300000000000082b42d23f3dc73b720fb667dfd257bc85de3c9032c11fcfbd0db0a6778bb2925b8bacbf3f80c1b563a25ace90166a7198caa472d6ad8956587308daade40b8bf82283b52099ceb72072dd419eb2aa99005fad26a42a8e7204d3d49d5593d92ffac9f4e932fad7f58e27b99194572ebf27b623781b2aa1da596ac4b3d8c150870a941ab3e0fa02818b8417e8dac71a0a8a250e9c40379eab2a80713290b63674e4a0ad767e67424190619fb84f810703082c26eee46a2bc96dec8cbccb4e7f1bea6629d659e3bb56cc1f9b98ff520bea045c549ea60dd7c9914ddbd9aa68f538d1b4a543b54beaf5558ea211ff1ea8563a155c9003cd4421ede72a6845901756b3943fd1c1ebda6c469c8136cfe76ecb48a8a54d15cb4ada706c69fe8980c3826b44abe8e344df65b12bf76ca78fe1474d625f27e38ed7a64456f79f498aa1ac02e08f7f56b072fbc669f2c6ab5c4a973ab467396142626b31ee71a57bc28499a225c965fd687fe921a251ef304a573c9218b384b9975139db78087486bdf6a6798b6887b3b284079ed4720a5dd80c86d2e047ac8fa423eb4c667b8eba177c105c12a0e7257a6cffa1ec61e8cc393a147853c1ec5d0ce814028f263d8cdd3983342949e175eae6989c615be46992c7ba3817f3e44c8307fd4e9ab97d8c8fe589aae215d97365d3f92cc6ea3771106087f445e58893ff95031d5ac6f35708b5d6cb625281d97f48ce7ed77b68d90955be7aa4844f994d1e036a2d22d2530b37e36844c716a440c63faa8e430d09b6d4f33f436adb35cb491eff6f649f4cffcdf174ac1e2f335bc37d0d45cba4646d701142138bd298743edce0053f549c3a0081e1ce0bb262777c3f5b41ab8a072b3ee64e1e37bc4c7fb1d6d2318da811f8e7d6fac95165fa639b5b3e72021058857261376c3cb707a0e7e97255742d8608e825014d42774077d6d5656460e0575ac8245fbd93955ff50404dc09e4bb0c237220c53e55de6f99c30fcbdfa62289fadce1aa1c3192c1d019d0a3dcc87643971caef49637f5ee0855d22b7e48d2313d22d203f306cfbc077569360ee7b3d325c47f3f6a7858305b07c36249ccb942b001e39f8ea82885467e7bd7316d0d0f9ab334dda342ccb15a6df51be9883789e2d935cd4e2590a62c1fcec21455647286787f6d679337a986500475fe05956ce27d75f722954ac2e59ea6f1533f222b790bd29dcb19ee24b95edc38588ebe6bcf503517ee5cf9148488d2f890739a6dadf65ba1fe0726a5bb5e0e614496bb46d2b3d5ad6402ad58ef3609ac8055e6a38c0b2f040b6fbe32db0addc689d10ed8ca1dc250de5d2e1b4cfbe6bd284014f1cafafb7de3eec145db1d2b69f0861309aefe071ba2726cabd11f8a3f583a99779c21d183fe8a75a7e8010b9b501562691b44473 diff --git a/rusk/src/bin/config/kadcast.rs b/rusk/src/bin/config/kadcast.rs index a95a58ee35..62d9cf09fc 100644 --- a/rusk/src/bin/config/kadcast.rs +++ b/rusk/src/bin/config/kadcast.rs @@ -33,4 +33,8 @@ impl KadcastConfig { self.0.kadcast_id = Some(network_id) }; } + + pub fn chain_id(&self) -> u8 { + self.0.kadcast_id.unwrap_or_default() + } } diff --git a/rusk/src/bin/main.rs b/rusk/src/bin/main.rs index b798d78306..9a913b7408 100644 --- a/rusk/src/bin/main.rs +++ b/rusk/src/bin/main.rs @@ -64,6 +64,7 @@ async fn main() -> Result<(), Box> { let rusk = Rusk::new( state_dir, + config.kadcast.chain_id(), config.chain.generation_timeout(), config.chain.gas_per_deploy_byte(), config.chain.block_gas_limit(), diff --git a/rusk/src/lib/error.rs b/rusk/src/lib/error.rs index bc93586601..8d4a205826 100644 --- a/rusk/src/lib/error.rs +++ b/rusk/src/lib/error.rs @@ -58,6 +58,8 @@ pub enum Error { CommitNotFound([u8; 32]), /// Invalid credits count InvalidCreditsCount(u64, usize), + /// Memo too large + MemoTooLarge(usize), } impl std::error::Error for Error {} @@ -106,6 +108,7 @@ impl From for Error { }) } ExecErr::Rkyv(e) => Self::Transaction(ExecErr::Rkyv(e)), + ExecErr::MemoTooLarge(size) => Self::MemoTooLarge(size), } } } @@ -191,6 +194,9 @@ impl fmt::Display for Error { height, credits ) } + Error::MemoTooLarge(size) => { + write!(f, "The memo size {size} is too large") + } } } } diff --git a/rusk/src/lib/http.rs b/rusk/src/lib/http.rs index 9c62064208..64eb6e4122 100644 --- a/rusk/src/lib/http.rs +++ b/rusk/src/lib/http.rs @@ -68,7 +68,9 @@ use rand::rngs::OsRng; use crate::http::event::FullOrStreamBody; use crate::VERSION; -pub use self::event::{ContractEvent, RuesEvent, RUES_LOCATION_PREFIX}; +pub use self::event::{ + ContractEvent, RuesDispatchEvent, RuesEvent, RUES_LOCATION_PREFIX, +}; use self::event::{MessageRequest, ResponseData, RuesEventUri, SessionId}; use self::stream::{Listener, Stream}; @@ -147,6 +149,24 @@ impl HandleRequest for DataSources { } Err(anyhow::anyhow!("unsupported target type")) } + + fn can_handle_rues(&self, event: &RuesDispatchEvent) -> bool { + self.sources.iter().any(|s| s.can_handle_rues(event)) + } + + async fn handle_rues( + &self, + event: &RuesDispatchEvent, + ) -> anyhow::Result { + info!("Received event at {}", event.uri); + event.check_rusk_version()?; + for h in &self.sources { + if h.can_handle_rues(event) { + return h.handle_rues(event).await; + } + } + Err(anyhow::anyhow!("unsupported location")) + } } #[derive(Clone)] @@ -426,7 +446,6 @@ where enum SubscriptionAction { Subscribe(RuesEventUri), Unsubscribe(RuesEventUri), - Dispatch { uri: RuesEventUri, body: Incoming }, } async fn handle_stream_rues( @@ -459,17 +478,8 @@ async fn handle_stream_rues( const DISPATCH_BUFFER_SIZE: usize = 16; let mut subscription_set = HashSet::new(); - let (dispatch_sender, dispatch_events) = - mpsc::channel(DISPATCH_BUFFER_SIZE); - // Join the two event receivers together, allowing for reusing the exact - // same code when handling them either of them. let mut events = BroadcastStream::new(events); - let mut dispatch_events = ReceiverStream::new(dispatch_events); - - let mut events = events - .map_err(Either::Left) - .merge(dispatch_events.map_err(Either::Right)); loop { tokio::select! { @@ -502,36 +512,23 @@ async fn handle_stream_rues( SubscriptionAction::Unsubscribe(subscription) => { subscription_set.remove(&subscription); }, - SubscriptionAction::Dispatch { - uri, - body - } => { - // TODO figure out if we should subscribe to the event we dispatch - task::spawn(handle_dispatch(uri, body, handler.clone(), dispatch_sender.clone())); - } } } Some(event) = events.next() => { let mut event = match event { Ok(event) => event, - Err(err) => match err { - Either::Left(_berr) => { - // If the event channel is closed, it means the - // server has stopped producing events, so we - // should inform the client and stop. - let _ = stream.close(Some(CloseFrame { - code: CloseCode::Away, - reason: Cow::from("Shutting down"), - })).await; - break; + Err(err) => { + // If the event channel is closed, it means the + // server has stopped producing events, so we + // should inform the client and stop. + let _ = stream.close(Some(CloseFrame { + code: CloseCode::Away, + reason: Cow::from("Shutting down"), + })).await; + break; - } - Either::Right(_eerr) => { - // TODO handle execution error - continue; - }, - }, + } }; // The event is subscribed to if it matches any of the subscriptions. @@ -648,6 +645,31 @@ async fn handle_request_rues( )); Ok(response.map(Into::into)) + } else if req.method() == Method::POST { + let event = RuesDispatchEvent::from_request(req).await?; + let is_binary = event.is_binary(); + let mut resp_headers = event.x_headers(); + let (responder, mut receiver) = mpsc::unbounded_channel(); + handle_execution_rues(handler, event, responder).await; + + let execution_response = receiver + .recv() + .await + .expect("An execution should always return a response"); + resp_headers.extend(execution_response.headers.clone()); + let mut resp = execution_response.into_http(is_binary)?; + + for (k, v) in resp_headers { + let k = HeaderName::from_str(&k)?; + let v = match v { + serde_json::Value::String(s) => HeaderValue::from_str(&s), + serde_json::Value::Null => HeaderValue::from_str(""), + _ => HeaderValue::from_str(&v.to_string()), + }?; + resp.headers_mut().append(k, v); + } + + Ok(resp) } else { let headers = req.headers(); @@ -684,10 +706,6 @@ async fn handle_request_rues( let action = match *req.method() { Method::GET => SubscriptionAction::Subscribe(uri), Method::DELETE => SubscriptionAction::Unsubscribe(uri), - Method::POST => SubscriptionAction::Dispatch { - uri, - body: req.into_body(), - }, _ => { return response( StatusCode::METHOD_NOT_ALLOWED, @@ -735,6 +753,20 @@ where .await; } + #[cfg(feature = "http-wasm")] + if path == "/static/drivers/wallet-core.wasm" { + let wallet_wasm = include_bytes!( + "../../../target/wasm32-unknown-unknown/release/wallet_core.wasm" + ); + let mut response = + Response::new(Full::from(wallet_wasm.to_vec()).into()); + response.headers_mut().append( + "Content-Type", + HeaderValue::from_static("application/wasm"), + ); + return Ok(response); + } + if hyper_tungstenite::is_upgrade_request(&req) { let target = req.uri().path().try_into()?; @@ -797,6 +829,35 @@ async fn handle_execution( let _ = responder.send(rsp); } +async fn handle_execution_rues( + sources: Arc, + event: RuesDispatchEvent, + responder: mpsc::UnboundedSender, +) where + H: HandleRequest, +{ + let mut rsp = sources + .handle_rues(&event) + .await + .map(|data| { + let (data, mut headers) = data.into_inner(); + headers.append(&mut event.x_headers()); + EventResponse { + data, + error: None, + headers, + } + }) + .unwrap_or_else(|e| EventResponse { + headers: event.x_headers(), + data: DataType::None, + error: Some(e.to_string()), + }); + + rsp.set_header(RUSK_VERSION_HEADER, serde_json::json!(*VERSION)); + let _ = responder.send(rsp); +} + #[async_trait] pub trait HandleRequest: Send + Sync + 'static { fn can_handle(&self, request: &MessageRequest) -> bool; @@ -804,6 +865,12 @@ pub trait HandleRequest: Send + Sync + 'static { &self, request: &MessageRequest, ) -> anyhow::Result; + + fn can_handle_rues(&self, request: &RuesDispatchEvent) -> bool; + async fn handle_rues( + &self, + request: &RuesDispatchEvent, + ) -> anyhow::Result; } #[cfg(test)] @@ -834,6 +901,16 @@ mod tests { true } + fn can_handle_rues(&self, request: &RuesDispatchEvent) -> bool { + false + } + async fn handle_rues( + &self, + request: &RuesDispatchEvent, + ) -> anyhow::Result { + unimplemented!() + } + async fn handle( &self, request: &MessageRequest, diff --git a/rusk/src/lib/http/chain.rs b/rusk/src/lib/http/chain.rs index 220fc3e0a6..8f038df49f 100644 --- a/rusk/src/lib/http/chain.rs +++ b/rusk/src/lib/http/chain.rs @@ -10,6 +10,7 @@ use std::collections::HashMap; use std::net::SocketAddr; use std::sync::Arc; +use execution_core::transfer::Transaction as ProtocolTransaction; use node::database::rocksdb::{Backend, DBTransaction}; use node::database::{Mempool, DB}; use node::network::Kadcast; @@ -22,7 +23,7 @@ use graphql::{DBContext, Query}; use async_graphql::{ EmptyMutation, EmptySubscription, Name, Schema, Variables, }; -use serde_json::json; +use serde_json::{json, Map, Value}; use super::*; use crate::node::RuskNode; @@ -30,10 +31,9 @@ use crate::{VERSION, VERSION_BUILD}; const GQL_VAR_PREFIX: &str = "rusk-gqlvar-"; -fn variables_from_request(request: &MessageRequest) -> Variables { +fn variables_from_headers(headers: &Map) -> Variables { let mut var = Variables::default(); - request - .headers + headers .iter() .filter_map(|(h, v)| { let h = h.to_lowercase(); @@ -47,17 +47,60 @@ fn variables_from_request(request: &MessageRequest) -> Variables { var } + #[async_trait] impl HandleRequest for RuskNode { fn can_handle(&self, request: &MessageRequest) -> bool { matches!(request.event.to_route(), (Target::Host(_), "Chain", _)) } + + fn can_handle_rues(&self, request: &RuesDispatchEvent) -> bool { + #[allow(clippy::match_like_matches_macro)] + match request.uri.inner() { + ("graphql", _, "query") => true, + ("transactions", _, "propagate") => true, + ("network", _, "peers") => true, + ("node", _, "info") => true, + ("blocks", _, "gas-price") => true, + _ => false, + } + } + async fn handle_rues( + &self, + request: &RuesDispatchEvent, + ) -> anyhow::Result { + match request.uri.inner() { + ("graphql", _, "query") => { + self.handle_gql(&request.data, &request.headers).await + } + ("transactions", _, "propagate") => { + self.propagate_tx(request.data.as_bytes()).await + } + ("network", _, "peers") => { + let amount = request.data.as_string().trim().parse()?; + self.alive_nodes(amount).await + } + ("node", _, "info") => self.get_info().await, + ("blocks", _, "gas-price") => { + let max_transactions = request + .data + .as_string() + .trim() + .parse::() + .unwrap_or(usize::MAX); + self.get_gas_price(max_transactions).await + } + _ => anyhow::bail!("Unsupported"), + } + } async fn handle( &self, request: &MessageRequest, ) -> anyhow::Result { match &request.event.to_route() { - (Target::Host(_), "Chain", "gql") => self.handle_gql(request).await, + (Target::Host(_), "Chain", "gql") => { + self.handle_gql(&request.event.data, &request.headers).await + } (Target::Host(_), "Chain", "propagate_tx") => { self.propagate_tx(request.event_data()).await } @@ -83,9 +126,10 @@ impl HandleRequest for RuskNode { impl RuskNode { async fn handle_gql( &self, - request: &MessageRequest, + data: &RequestData, + headers: &serde_json::Map, ) -> anyhow::Result { - let gql_query = request.event.data.as_string(); + let gql_query = data.as_string(); let schema = Schema::build(Query, EmptyMutation, EmptySubscription) .data(self.db()) @@ -95,7 +139,7 @@ impl RuskNode { return Ok(ResponseData::new(schema.sdl())); } - let variables = variables_from_request(request); + let variables = variables_from_headers(headers); let gql_query = async_graphql::Request::new(gql_query).variables(variables); @@ -110,10 +154,10 @@ impl RuskNode { } async fn propagate_tx(&self, tx: &[u8]) -> anyhow::Result { - let tx = execution_core::transfer::Transaction::from_slice(tx) + let tx: Transaction = ProtocolTransaction::from_slice(tx) .map_err(|e| anyhow::anyhow!("Invalid Data {e:?}"))? .into(); - let tx_message = Message::new_transaction(tx); + let tx_message = tx.into(); let network = self.network(); network.read().await.route_internal(tx_message); diff --git a/rusk/src/lib/http/event.rs b/rusk/src/lib/http/event.rs index dcfe557908..66e02e76d2 100644 --- a/rusk/src/lib/http/event.rs +++ b/rusk/src/lib/http/event.rs @@ -755,6 +755,14 @@ impl Display for RuesEventUri { } impl RuesEventUri { + pub fn inner(&self) -> (&str, Option<&String>, &str) { + ( + self.component.as_ref(), + self.entity.as_ref(), + self.topic.as_ref(), + ) + } + pub fn parse_from_path(path: &str) -> Option { if !path.starts_with(RUES_LOCATION_PREFIX) { return None; @@ -779,9 +787,9 @@ impl RuesEventUri { None => (segment, None), })?; - let component = component.to_string(); + let component = component.to_string().to_lowercase(); let entity = entity.map(ToString::to_string); - let topic = path_split.next()?.to_string(); + let topic = path_split.next()?.to_string().to_lowercase(); Some(Self { component, @@ -845,6 +853,104 @@ pub struct RuesEvent { pub data: DataType, } +/// A RUES Dispatch request event +#[derive(Debug)] +pub struct RuesDispatchEvent { + pub uri: RuesEventUri, + pub headers: serde_json::Map, + pub data: RequestData, +} + +impl RuesDispatchEvent { + pub fn x_headers(&self) -> serde_json::Map { + let mut h = self.headers.clone(); + h.retain(|k, _| k.to_lowercase().starts_with("x-")); + h + } + + pub fn header(&self, name: &str) -> Option<&serde_json::Value> { + self.headers + .iter() + .find_map(|(k, v)| k.eq_ignore_ascii_case(name).then_some(v)) + } + + pub fn check_rusk_version(&self) -> anyhow::Result<()> { + if let Some(v) = self.header(RUSK_VERSION_HEADER) { + let req = match v.as_str() { + Some(v) => VersionReq::from_str(v), + None => VersionReq::from_str(&v.to_string()), + }?; + + let current = Version::from_str(&crate::VERSION)?; + if !req.matches(¤t) { + return Err(anyhow::anyhow!( + "Mismatched rusk version: requested {req} - current {current}", + )); + } + } + Ok(()) + } + + pub fn is_binary(&self) -> bool { + self.headers + .get(CONTENT_TYPE) + .map(|h| h.to_string()) + .map(|v| v.eq_ignore_ascii_case(CONTENT_TYPE_BINARY)) + .unwrap_or_default() + } + pub async fn from_request(req: Request) -> anyhow::Result { + let (parts, body) = req.into_parts(); + + let uri = RuesEventUri::parse_from_path(parts.uri.path()) + .ok_or(anyhow::anyhow!("Invalid URL path"))?; + + let headers = parts + .headers + .iter() + .map(|(k, v)| { + let v = if v.is_empty() { + serde_json::Value::Null + } else { + serde_json::from_slice::(v.as_bytes()) + .unwrap_or(serde_json::Value::String( + v.to_str().unwrap().to_string(), + )) + }; + (k.to_string().to_lowercase(), v) + }) + .collect(); + + // HTTP REQUEST + let content_type = parts + .headers + .get(CONTENT_TYPE) + .and_then(|h| h.to_str().ok()) + .unwrap_or_default(); + + let bytes = body.collect().await?.to_bytes().to_vec(); + let data = match content_type { + CONTENT_TYPE_BINARY => bytes.into(), + _ => { + let text = String::from_utf8(bytes) + .map_err(|e| anyhow::anyhow!("Invalid utf8"))?; + if let Some(hex) = text.strip_prefix("0x") { + if let Ok(bytes) = hex::decode(hex) { + bytes.into() + } else { + text.into() + } + } else { + text.into() + } + } + }; + + let ret = RuesDispatchEvent { headers, data, uri }; + + Ok(ret) + } +} + impl RuesEvent { pub fn add_header, V: Into>( &mut self, diff --git a/rusk/src/lib/http/prover.rs b/rusk/src/lib/http/prover.rs index 936b624d74..a5791f0f24 100644 --- a/rusk/src/lib/http/prover.rs +++ b/rusk/src/lib/http/prover.rs @@ -16,6 +16,22 @@ impl HandleRequest for LocalProver { fn can_handle(&self, request: &MessageRequest) -> bool { matches!(request.event.to_route(), (_, "rusk", topic) | (_, "prover", topic) if topic.starts_with("prove_")) } + fn can_handle_rues(&self, request: &RuesDispatchEvent) -> bool { + matches!(request.uri.inner(), ("prover", _, "prove")) + } + async fn handle_rues( + &self, + request: &RuesDispatchEvent, + ) -> anyhow::Result { + let data = request.data.as_bytes(); + let response = match request.uri.inner() { + ("prover", _, "prove") => { + LocalProver::prove(data).map_err(|e| anyhow!(e))? + } + _ => anyhow::bail!("Unsupported"), + }; + Ok(ResponseData::new(response)) + } async fn handle( &self, diff --git a/rusk/src/lib/http/rusk.rs b/rusk/src/lib/http/rusk.rs index 665443816e..7c9a66edcc 100644 --- a/rusk/src/lib/http/rusk.rs +++ b/rusk/src/lib/http/rusk.rs @@ -14,6 +14,7 @@ use serde::Serialize; use std::sync::{mpsc, Arc}; use std::thread; use tokio::task; +use tungstenite::http::request; use execution_core::ContractId; @@ -29,6 +30,35 @@ impl HandleRequest for Rusk { (Target::Contract(_), ..) | (Target::Host(_), "rusk", _) ) } + fn can_handle_rues(&self, request: &RuesDispatchEvent) -> bool { + #[allow(clippy::match_like_matches_macro)] + match request.uri.inner() { + ("contracts", Some(_), _) => true, + ("transactions", _, "preverify") => true, + ("node", _, "provisioners") => true, + ("node", _, "crs") => true, + _ => false, + } + } + async fn handle_rues( + &self, + request: &RuesDispatchEvent, + ) -> anyhow::Result { + info!("received event {request:?}"); + match request.uri.inner() { + ("contracts", Some(contract_id), method) => { + let feeder = request.header(RUSK_FEEDER_HEADER).is_some(); + let data = request.data.as_bytes(); + self.handle_contract_query(contract_id, method, data, feeder) + } + ("transactions", _, "preverify") => { + self.handle_preverify(request.data.as_bytes()) + } + ("node", _, "provisioners") => self.get_provisioners(), + ("node", _, "crs") => self.get_crs(), + _ => Err(anyhow::anyhow!("Unsupported")), + } + } async fn handle( &self, @@ -37,7 +67,7 @@ impl HandleRequest for Rusk { match &request.event.to_route() { (Target::Contract(_), ..) => { let feeder = request.header(RUSK_FEEDER_HEADER).is_some(); - self.handle_contract_query(&request.event, feeder) + self.handle_contract_query_legacy(&request.event, feeder) } (Target::Host(_), "rusk", "preverify") => { self.handle_preverify(request.event_data()) @@ -52,41 +82,44 @@ impl HandleRequest for Rusk { } impl Rusk { - fn handle_contract_query( + fn handle_contract_query_legacy( &self, event: &Event, feeder: bool, ) -> anyhow::Result { let contract = event.target.inner(); + let topic = &event.topic; + let data = event.data.as_bytes(); + + self.handle_contract_query(contract, topic, data, feeder) + } + fn handle_contract_query( + &self, + contract: &str, + topic: &str, + data: &[u8], + feeder: bool, + ) -> anyhow::Result { let contract_bytes = hex::decode(contract)?; let contract_bytes = contract_bytes .try_into() .map_err(|_| anyhow::anyhow!("Invalid contract bytes"))?; - + let contract_id = ContractId::from_bytes(contract_bytes); + let fn_name = topic.to_string(); + let data = data.to_vec(); if feeder { let (sender, receiver) = mpsc::channel(); let rusk = self.clone(); - let topic = event.topic.clone(); - let arg = event.data.as_bytes().to_vec(); thread::spawn(move || { - rusk.feeder_query_raw( - ContractId::from_bytes(contract_bytes), - topic, - arg, - sender, - ); + rusk.feeder_query_raw(contract_id, fn_name, data, sender); }); Ok(ResponseData::new(receiver)) } else { let data = self - .query_raw( - ContractId::from_bytes(contract_bytes), - event.topic.clone(), - event.data.as_bytes(), - ) + .query_raw(contract_id, fn_name, data) .map_err(|e| anyhow::anyhow!("{e}"))?; Ok(ResponseData::new(data)) } diff --git a/rusk/src/lib/node.rs b/rusk/src/lib/node.rs index 4e33f6e8c4..df4daeba3d 100644 --- a/rusk/src/lib/node.rs +++ b/rusk/src/lib/node.rs @@ -42,6 +42,7 @@ pub struct Rusk { pub(crate) tip: Arc>, pub(crate) vm: Arc, dir: PathBuf, + pub(crate) chain_id: u8, pub(crate) generation_timeout: Option, pub(crate) gas_per_deploy_byte: Option, pub(crate) feeder_gas_limit: u64, @@ -234,17 +235,129 @@ const fn coinbase_value( ) } -/// This implements the emission schedule described in the economic paper. +/// The emission schedule works as follows: +/// - the emission follows a Bitcoin-like halving function +/// - a total 499_782_528 Dusk will be emitted over 36 years divided in 9 +/// periods of 4 years each +/// +/// Considering the target block rate of 10 seconds, we assume a production of +/// 8640 blocks per day, which corresponds to 12_614_400 blocks per period. + +// Target block production per day, assuming a block rate of 10 seconds +const BLOCKS_PER_DAY: u64 = 8640; +// Target block production per 4-year period +const BLOCKS_PER_PERIOD: u64 = BLOCKS_PER_DAY * 365 * 4; +// Block emission for each period, following the halving function +const BLOCK_EMISSIONS: [f64; 9] = + [19.86, 9.93, 4.96, 2.48, 1.24, 0.62, 0.31, 0.15, 0.07]; + +// Returns the block emission for a certain height pub const fn emission_amount(block_height: u64) -> Dusk { - match block_height { - 1..=12_500_000 => dusk(16.0), - 12_500_001..=18_750_000 => dusk(12.8), - 18_750_001..=25_000_000 => dusk(9.6), - 25_000_001..=31_250_000 => dusk(8.0), - 31_250_001..=37_500_000 => dusk(6.4), - 37_500_001..=43_750_000 => dusk(4.8), - 43_750_001..=50_000_000 => dusk(3.2), - 50_000_001..=62_500_000 => dusk(1.6), + if block_height == 0 { + return dusk(0.0); + } + + let period = (block_height - 1) / BLOCKS_PER_PERIOD; + match period { + 0..=8 => dusk(BLOCK_EMISSIONS[period as usize]), _ => dusk(0.0), } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_emission_amount() { + // Test genesis block + let genesis_emission = emission_amount(0); + assert_eq!( + genesis_emission, + dusk(0.0), + "For genesis block expected emission 0.0, but got {}", + genesis_emission + ); + + // Block range and expected emission for each period + let test_cases = vec![ + (1, 12_614_400, dusk(19.86)), // Period 1 + (12_614_401, 25_228_800, dusk(9.93)), // Period 2 + (25_228_801, 37_843_200, dusk(4.96)), // Period 3 + (37_843_201, 50_457_600, dusk(2.48)), // Period 4 + (50_457_601, 63_072_000, dusk(1.24)), // Period 5 + (63_072_001, 75_686_400, dusk(0.62)), // Period 6 + (75_686_401, 88_300_800, dusk(0.31)), // Period 7 + (88_300_801, 100_915_200, dusk(0.15)), // Period 8 + (100_915_201, 113_529_600, dusk(0.07)), // Period 9 + (113_529_601, u64::MAX, dusk(0.0)), // Beyond period 9 + ]; + + // Test emission periods + for (start_block, end_block, expected_emission) in test_cases { + // Test the first block in the range + let emission_start = emission_amount(start_block); + assert_eq!( + emission_start, expected_emission, + "For block height {} expected emission {}, but got {}", + start_block, expected_emission, emission_start + ); + + // Test the last block in the range + let emission_end = emission_amount(end_block); + assert_eq!( + emission_end, expected_emission, + "For block height {} expected emission {}, but got {}", + end_block, expected_emission, emission_end + ); + } + } + + const EXPECTED_PERIOD_EMISSIONS: [u64; 9] = [ + 250_521_984, // Period 1 + 125_260_992, // Period 2 + 62_567_424, // Period 3 + 31_283_712, // Period 4 + 15_641_856, // Period 5 + 7_820_928, // Period 6 + 3_910_464, // Period 7 + 1_892_160, // Period 8 + 883_008, // Period 9 + ]; + + #[test] + fn test_period_emissions() { + // Check each period emission corresponds to the expected value + for (i, &expected) in EXPECTED_PERIOD_EMISSIONS.iter().enumerate() { + let block_emission = BLOCK_EMISSIONS[i]; + let period_emission = + (block_emission * BLOCKS_PER_PERIOD as f64) as u64; + assert_eq!( + period_emission, + expected, + "Emission for period {} did not match: expected {}, got {}", + i + 1, + expected, + period_emission + ); + } + } + + #[test] + fn test_total_emission() { + // Expected total emission based on the schedule + let expected_total = 499_782_528u64; + + // Loop through each block emission and calculate the total emission + let mut total_emission = 0u64; + for &be in BLOCK_EMISSIONS.iter() { + total_emission += (be * BLOCKS_PER_PERIOD as f64) as u64; + } + + // Ensure the calculated total matches the expected total + assert_eq!( + total_emission, expected_total, + "Total emission did not match the expected value" + ); + } +} diff --git a/rusk/src/lib/node/rusk.rs b/rusk/src/lib/node/rusk.rs index 1dba4d2978..39e3095c1b 100644 --- a/rusk/src/lib/node/rusk.rs +++ b/rusk/src/lib/node/rusk.rs @@ -9,6 +9,7 @@ use std::sync::{mpsc, Arc, LazyLock}; use std::time::{Duration, Instant}; use std::{fs, io}; +use execution_core::transfer::PANIC_NONCE_NOT_READY; use parking_lot::RwLock; use sha3::{Digest, Sha3_256}; use tokio::task; @@ -25,7 +26,7 @@ use execution_core::{ signatures::bls::PublicKey as BlsPublicKey, stake::{StakeData, STAKE_CONTRACT}, transfer::{ - contract_exec::{ContractBytecode, ContractDeploy}, + data::{ContractBytecode, ContractDeploy}, moonlight::AccountData, Transaction as ProtocolTransaction, TRANSFER_CONTRACT, }, @@ -53,6 +54,7 @@ const DEFAULT_GAS_PER_DEPLOY_BYTE: u64 = 100; impl Rusk { pub fn new>( dir: P, + chain_id: u8, generation_timeout: Option, gas_per_deploy_byte: Option, block_gas_limit: u64, @@ -87,6 +89,7 @@ impl Rusk { tip, vm, dir: dir.into(), + chain_id, generation_timeout, gas_per_deploy_byte, feeder_gas_limit, @@ -178,6 +181,16 @@ impl Rusk { err, }); } + Err(PiecrustError::Panic(val)) + if val == PANIC_NONCE_NOT_READY => + { + // If the transaction panic due to a not yet valid nonce, + // we should not discard the transactions since it can be + // included in future. + + // TODO: Try to process the transaction as soon as the + // nonce is unlocked + } Err(e) => { info!("discard tx {tx_id} due to {e:?}"); // An unspendable transaction should be discarded @@ -347,6 +360,11 @@ impl Rusk { self.query(TRANSFER_CONTRACT, "account", pk) } + /// Returns an account's information. + pub fn chain_id(&self) -> Result { + self.query(TRANSFER_CONTRACT, "chain_id", &()) + } + /// Fetches the previous state data for stake changes in the contract. /// /// Communicates with the stake contract to obtain information about the @@ -396,7 +414,12 @@ impl Rusk { tip.current }); - let session = rusk_abi::new_session(&self.vm, commit, block_height)?; + let session = rusk_abi::new_session( + &self.vm, + commit, + self.chain_id, + block_height, + )?; Ok(session) } diff --git a/rusk/src/lib/node/vm.rs b/rusk/src/lib/node/vm.rs index ad85255941..f18e0ba807 100644 --- a/rusk/src/lib/node/vm.rs +++ b/rusk/src/lib/node/vm.rs @@ -97,6 +97,13 @@ impl VMExecution for Rusk { Ok((txs, verification_output)) } + fn move_to_commit(&self, commit: [u8; 32]) -> anyhow::Result<()> { + self.session(0, Some(commit)) + .map_err(|e| anyhow::anyhow!("Cannot open session {e}"))?; + self.set_current_commit(commit); + Ok(()) + } + fn finalize_state( &self, commit: [u8; 32], diff --git a/rusk/src/lib/test_utils.rs b/rusk/src/lib/test_utils.rs index 37e797afa1..bb025b57ba 100644 --- a/rusk/src/lib/test_utils.rs +++ b/rusk/src/lib/test_utils.rs @@ -20,13 +20,12 @@ use execution_core::{ signatures::bls::PublicKey as BlsPublicKey, stake::{StakeData, STAKE_CONTRACT}, transfer::{ - phoenix::{Note, TreeLeaf, ViewKey, NOTES_TREE_DEPTH}, + phoenix::{Note, NoteLeaf, NoteOpening, ViewKey}, TRANSFER_CONTRACT, }, BlsScalar, ContractId, }; use parking_lot::RwLockWriteGuard; -use poseidon_merkle::Opening as PoseidonOpening; use rusk_abi::VM; pub type StoredNote = (Note, u64); @@ -62,10 +61,7 @@ impl Rusk { } /// Returns the opening of the transfer tree at the given position. - pub fn tree_opening( - &self, - pos: u64, - ) -> Result>> { + pub fn tree_opening(&self, pos: u64) -> Result> { self.query(TRANSFER_CONTRACT, "opening", &pos) } @@ -111,7 +107,7 @@ impl Rusk { // expected output let stream = tokio_stream::iter(receiver.into_iter().filter_map(move |bytes| { - let leaf = rkyv::from_bytes::(&bytes) + let leaf = rkyv::from_bytes::(&bytes) .expect("The contract should always return valid leaves"); match &vk { Some(vk) => vk diff --git a/rusk/tests/common/state.rs b/rusk/tests/common/state.rs index ee97c9c8a6..153be2ae5f 100644 --- a/rusk/tests/common/state.rs +++ b/rusk/tests/common/state.rs @@ -29,6 +29,8 @@ use tracing::info; use crate::common::keys::STAKE_SK; +const CHAIN_ID: u8 = 0xFA; + // Creates a Rusk initial state in the given directory pub fn new_state>( dir: P, @@ -42,8 +44,9 @@ pub fn new_state>( let (sender, _) = broadcast::channel(10); - let rusk = Rusk::new(dir, None, None, block_gas_limit, u64::MAX, sender) - .expect("Instantiating rusk should succeed"); + let rusk = + Rusk::new(dir, CHAIN_ID, None, None, block_gas_limit, u64::MAX, sender) + .expect("Instantiating rusk should succeed"); assert_eq!( commit_id, diff --git a/rusk/tests/common/wallet.rs b/rusk/tests/common/wallet.rs index 7b164edf88..af5cf34dad 100644 --- a/rusk/tests/common/wallet.rs +++ b/rusk/tests/common/wallet.rs @@ -16,12 +16,11 @@ use execution_core::{ stake::StakeData, transfer::{ moonlight::AccountData, - phoenix::{Note, ViewKey, NOTES_TREE_DEPTH}, + phoenix::{Note, NoteOpening, ViewKey}, }, BlsScalar, }; use futures::StreamExt; -use poseidon_merkle::Opening as PoseidonOpening; use rusk::{Error, Result, Rusk}; use test_wallet::{self as wallet, Store}; use tracing::info; @@ -100,10 +99,7 @@ impl wallet::StateClient for TestStateClient { } /// Queries the node to find the opening for a specific note. - fn fetch_opening( - &self, - note: &Note, - ) -> Result, Self::Error> { + fn fetch_opening(&self, note: &Note) -> Result { self.rusk .tree_opening(*note.pos())? .ok_or(Error::OpeningPositionNotFound(*note.pos())) @@ -121,6 +117,11 @@ impl wallet::StateClient for TestStateClient { let account = self.rusk.account(pk)?; Ok(account) } + + fn fetch_chain_id(&self) -> Result { + let chain_id = self.rusk.chain_id()?; + Ok(chain_id) + } } #[derive(Default, Debug, Clone)] diff --git a/rusk/tests/rusk-state.rs b/rusk/tests/rusk-state.rs index 813ca14eb4..72e6eab0fd 100644 --- a/rusk/tests/rusk-state.rs +++ b/rusk/tests/rusk-state.rs @@ -15,8 +15,8 @@ use std::sync::{mpsc, Arc}; use execution_core::{ transfer::{ phoenix::{ - Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, - TreeLeaf, + Note, NoteLeaf, PublicKey as PhoenixPublicKey, + SecretKey as PhoenixSecretKey, }, TRANSFER_CONTRACT, }, @@ -35,6 +35,7 @@ use tracing::info; use crate::common::state::new_state; const BLOCK_HEIGHT: u64 = 1; +const CHAIN_ID: u8 = 0xFA; const BLOCK_GAS_LIMIT: u64 = 100_000_000_000; const INITIAL_BALANCE: u64 = 10_000_000_000; @@ -46,7 +47,7 @@ fn initial_state>(dir: P) -> Result { new_state(dir, &snapshot, BLOCK_GAS_LIMIT) } -fn leaves_from_height(rusk: &Rusk, height: u64) -> Result> { +fn leaves_from_height(rusk: &Rusk, height: u64) -> Result> { let (sender, receiver) = mpsc::channel(); rusk.leaves_from_height(height, sender)?; Ok(receiver @@ -83,7 +84,7 @@ where rusk.with_tip(|mut tip, vm| { let current_commit = tip.current; let mut session = - rusk_abi::new_session(vm, current_commit, BLOCK_HEIGHT) + rusk_abi::new_session(vm, current_commit, CHAIN_ID, BLOCK_HEIGHT) .expect("current commit should exist"); session diff --git a/rusk/tests/services/contract_deployment.rs b/rusk/tests/services/contract_deployment.rs index 1761dd6a54..0aa17d5751 100644 --- a/rusk/tests/services/contract_deployment.rs +++ b/rusk/tests/services/contract_deployment.rs @@ -9,7 +9,7 @@ use std::path::{Path, PathBuf}; use std::sync::{Arc, RwLock}; use execution_core::{ - transfer::contract_exec::{ContractBytecode, ContractDeploy, ContractExec}, + transfer::data::{ContractBytecode, ContractDeploy, TransactionData}, ContractId, }; use rand::prelude::*; @@ -44,6 +44,7 @@ const ALICE_CONTRACT_ID: ContractId = { }; const OWNER: [u8; 32] = [1; 32]; +const CHAIN_ID: u8 = 0xFA; const BOB_ECHO_VALUE: u64 = 775; const BOB_INIT_VALUE: u8 = 5; @@ -95,8 +96,9 @@ fn initial_state>(dir: P, deploy_bob: bool) -> Result { let (sender, _) = broadcast::channel(10); - let rusk = Rusk::new(dir, None, None, BLOCK_GAS_LIMIT, u64::MAX, sender) - .expect("Instantiating rusk should succeed"); + let rusk = + Rusk::new(dir, CHAIN_ID, None, None, BLOCK_GAS_LIMIT, u64::MAX, sender) + .expect("Instantiating rusk should succeed"); Ok(rusk) } @@ -126,7 +128,7 @@ fn make_and_execute_transaction_deploy( gas_limit, GAS_PRICE, 0u64, - ContractExec::Deploy(ContractDeploy { + TransactionData::Deploy(ContractDeploy { bytecode: ContractBytecode { hash, bytes: bytecode.as_ref().to_vec(), @@ -215,7 +217,7 @@ impl Fixture { let commit = self.rusk.state_root(); let vm = rusk_abi::new_vm(self.path.as_path()) .expect("VM creation should succeed"); - let mut session = rusk_abi::new_session(&vm, commit, 0) + let mut session = rusk_abi::new_session(&vm, commit, CHAIN_ID, 0) .expect("Session creation should succeed"); let result = session.call::<_, u64>( self.contract_id, @@ -233,7 +235,7 @@ impl Fixture { let commit = self.rusk.state_root(); let vm = rusk_abi::new_vm(self.path.as_path()) .expect("VM creation should succeed"); - let mut session = rusk_abi::new_session(&vm, commit, 0) + let mut session = rusk_abi::new_session(&vm, commit, CHAIN_ID, 0) .expect("Session creation should succeed"); let result = session.call::<_, u64>( self.contract_id, diff --git a/rusk/tests/services/gas_behavior.rs b/rusk/tests/services/gas_behavior.rs index 17d148c4c9..bbe50d8c02 100644 --- a/rusk/tests/services/gas_behavior.rs +++ b/rusk/tests/services/gas_behavior.rs @@ -9,7 +9,7 @@ use std::path::Path; use std::sync::{Arc, RwLock}; use execution_core::transfer::{ - contract_exec::{ContractCall, ContractExec}, + data::{ContractCall, TransactionData}, TRANSFER_CONTRACT, }; use rand::prelude::*; @@ -83,7 +83,7 @@ fn make_transactions( GAS_LIMIT_0, GAS_PRICE, DEPOSIT, - ContractExec::Call(contract_call.clone()), + TransactionData::Call(contract_call.clone()), ) .expect("Making the transaction should succeed"); diff --git a/rusk/tests/services/mod.rs b/rusk/tests/services/mod.rs index 960030ee79..4753a59b43 100644 --- a/rusk/tests/services/mod.rs +++ b/rusk/tests/services/mod.rs @@ -7,6 +7,7 @@ pub mod contract_deployment; pub mod gas_behavior; pub mod multi_transfer; +pub mod owner_calls; pub mod stake; pub mod transfer; pub mod unspendable; diff --git a/rusk/tests/services/owner_calls.rs b/rusk/tests/services/owner_calls.rs new file mode 100644 index 0000000000..d3a932bdc5 --- /dev/null +++ b/rusk/tests/services/owner_calls.rs @@ -0,0 +1,330 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) DUSK NETWORK. All rights reserved. + +use bytecheck::CheckBytes; +use dusk_bytes::Serializable; +use rand::rngs::StdRng; +use rand::SeedableRng; +use rkyv::validation::validators::DefaultValidator; +use rkyv::{Archive, Deserialize, Infallible, Serialize}; +use std::collections::HashMap; +use std::path::{Path, PathBuf}; +use std::sync::{Arc, RwLock}; + +use execution_core::{ + signatures::bls::{ + PublicKey as BlsPublicKey, SecretKey as BlsSecretKey, + Signature as BlsSignature, + }, + ContractId, +}; +use rusk::gen_id::gen_contract_id; +use rusk::{Error, Result, Rusk}; +use rusk_abi::{CallReceipt, ContractData, Session}; +use rusk_recovery_tools::state; +use tempfile::tempdir; +use test_wallet::{self as wallet, Wallet}; +use tokio::sync::broadcast; +use tracing::info; + +use crate::common::logger; +use crate::common::wallet::{TestStateClient, TestStore}; + +const BLOCK_GAS_LIMIT: u64 = 1_000_000_000_000; +const POINT_LIMIT: u64 = 0x10000000; + +const NON_BLS_OWNER: [u8; 32] = [1; 32]; + +const BOB_INIT_VALUE: u8 = 5; + +const GUARDED_METHOD: &str = "owner_reset"; + +const CHAIN_ID: u8 = 0xFA; + +fn initial_state>( + dir: P, + owner: impl AsRef<[u8]>, +) -> Result { + let dir = dir.as_ref(); + + let snapshot = + toml::from_str(include_str!("../config/contract_deployment.toml")) + .expect("Cannot deserialize config"); + + let (_vm, _commit_id) = state::deploy(dir, &snapshot, |session| { + let bob_bytecode = include_bytes!( + "../../../target/dusk/wasm32-unknown-unknown/release/bob.wasm" + ); + + session + .deploy( + bob_bytecode, + ContractData::builder() + .owner(owner.as_ref()) + .constructor_arg(&BOB_INIT_VALUE) + .contract_id(gen_contract_id(&bob_bytecode, 0u64, owner)), + POINT_LIMIT, + ) + .expect("Deploying the bob contract should succeed"); + }) + .expect("Deploying initial state should succeed"); + + let (sender, _) = broadcast::channel(10); + + let rusk = + Rusk::new(dir, CHAIN_ID, None, None, BLOCK_GAS_LIMIT, u64::MAX, sender) + .expect("Instantiating rusk should succeed"); + Ok(rusk) +} + +#[allow(dead_code)] +struct Fixture { + pub rusk: Rusk, + pub wallet: Wallet, + pub bob_bytecode: Vec, + pub contract_id: ContractId, + pub path: PathBuf, + pub session: Option, +} + +impl Fixture { + fn build(owner: impl AsRef<[u8]>) -> Self { + let tmp = + tempdir().expect("Should be able to create temporary directory"); + let rusk = initial_state(&tmp, owner.as_ref()) + .expect("Initializing should succeed"); + + let cache = Arc::new(RwLock::new(HashMap::new())); + + let wallet = wallet::Wallet::new( + TestStore, + TestStateClient { + rusk: rusk.clone(), + cache, + }, + ); + + let original_root = rusk.state_root(); + + info!("Original Root: {:?}", hex::encode(original_root)); + + let bob_bytecode = include_bytes!( + "../../../target/dusk/wasm32-unknown-unknown/release/bob.wasm" + ) + .to_vec(); + let contract_id = gen_contract_id(&bob_bytecode, 0u64, owner.as_ref()); + + let path = tmp.into_path(); + Self { + rusk, + wallet, + bob_bytecode, + contract_id, + path, + session: None, + } + } + + pub fn assert_bob_contract_is_deployed(&self) { + const BOB_ECHO_VALUE: u64 = 775; + let commit = self.rusk.state_root(); + let vm = rusk_abi::new_vm(self.path.as_path()) + .expect("VM creation should succeed"); + let mut session = rusk_abi::new_session(&vm, commit, CHAIN_ID, 0) + .expect("Session creation should succeed"); + let result = session.call::<_, u64>( + self.contract_id, + "echo", + &BOB_ECHO_VALUE, + u64::MAX, + ); + assert_eq!( + result.expect("Echo call should succeed").data, + BOB_ECHO_VALUE + ); + let result = + session.call::<_, u8>(self.contract_id, "value", &(), u64::MAX); + assert_eq!( + result.expect("Value call should succeed").data, + BOB_INIT_VALUE + ); + } + + pub fn set_session(&mut self) { + let commit = self.rusk.state_root(); + let vm = rusk_abi::new_vm(self.path.as_path()) + .expect("VM creation should succeed"); + self.session = Some( + rusk_abi::new_session(&vm, commit, CHAIN_ID, 0) + .expect("Session creation should succeed"), + ); + } + + pub fn query_contract( + &mut self, + method: impl AsRef, + ) -> Result, Error> + where + R: Archive, + R::Archived: Deserialize + + for<'b> CheckBytes>, + { + assert!(self.session.is_some()); + self.session + .as_mut() + .unwrap() + .call::<_, R>(self.contract_id, method.as_ref(), &(), u64::MAX) + .map_err(Error::Vm) + } +} + +// this struct needs to be rkyv-serialization compatible between +// the contract caller and the contract, i.e., it doesn't need to be +// identical but it needs to rkyv-serialize to an identical slice of bytes +#[derive(Debug, Clone, Archive, Serialize, Deserialize)] +#[archive_attr(derive(CheckBytes))] +pub struct OwnerMessage { + pub contract_id: ContractId, + pub args: u8, + pub fname: String, + pub nonce: u64, +} + +// performs a call to a method which may verify that it is called by the owner +fn make_owner_only_call( + contract_id: ContractId, + args: u8, + fname: impl AsRef, + nonce: u64, + owner_sk: &BlsSecretKey, + session: &mut Session, +) -> Result, Error> +where + R: Archive, + R::Archived: + Deserialize + for<'b> CheckBytes>, +{ + let msg = OwnerMessage { + contract_id, + args, + fname: fname.as_ref().to_string(), + nonce, + }; + let msg_bytes = rkyv::to_bytes::<_, 4096>(&msg) + .expect("Message should serialize correctly") + .to_vec(); + let sig: BlsSignature = owner_sk.sign(&msg_bytes); + let args = (sig, msg.clone()); + session + .call::<(BlsSignature, OwnerMessage), R>( + contract_id, + fname.as_ref(), + &args, + u64::MAX, + ) + .map_err(Error::Vm) +} + +#[tokio::test(flavor = "multi_thread")] +pub async fn non_bls_owner_guarded_call() -> Result<(), Error> { + logger(); + const VALUE: u8 = 244; + let rng = &mut StdRng::seed_from_u64(0xcafe); + let sk = BlsSecretKey::random(rng); + let mut f = Fixture::build(NON_BLS_OWNER); + f.assert_bob_contract_is_deployed(); + f.set_session(); + + let r = make_owner_only_call::<()>( + f.contract_id, + VALUE, + GUARDED_METHOD, + 0, + &sk, + f.session.as_mut().unwrap(), + ); + assert!(r.is_err()); + Ok(()) +} + +/// owner is a BLS public key, method called is guarded +#[tokio::test(flavor = "multi_thread")] +pub async fn bls_owner_guarded_call() -> Result<(), Error> { + logger(); + const VALUE1: u8 = 244; + const VALUE2: u8 = 233; + let rng = &mut StdRng::seed_from_u64(0xcafe); + let sk = BlsSecretKey::random(rng); + let pk = BlsPublicKey::from(&sk); + let owner = pk.to_bytes(); + + let mut f = Fixture::build(&owner); + f.assert_bob_contract_is_deployed(); + f.set_session(); + + let nonce = f.query_contract::("nonce")?.data; + + make_owner_only_call::<()>( + f.contract_id, + VALUE1, + GUARDED_METHOD, + nonce, + &sk, + f.session.as_mut().unwrap(), + )?; + let value = f.query_contract::("value")?; + assert_eq!(VALUE1, value.data); + + // make sure the next call will fail if we do not increase the nonce + let r = make_owner_only_call::<()>( + f.contract_id, + VALUE2, + GUARDED_METHOD, + nonce, + &sk, + f.session.as_mut().unwrap(), + ); + assert!(r.is_err()); + + // next call should work if we increase the nonce + make_owner_only_call::<()>( + f.contract_id, + VALUE2, + GUARDED_METHOD, + nonce + 1, + &sk, + f.session.as_mut().unwrap(), + )?; + let value = f.query_contract::("value")?; + assert_eq!(VALUE2, value.data); + + // call should fail if method name is incorrect + let r = make_owner_only_call::<()>( + f.contract_id, + VALUE2, + "incorrect", + nonce + 2, + &sk, + f.session.as_mut().unwrap(), + ); + assert!(r.is_err()); + + // call should fail if contract id is incorrect + let mut contract_id_bytes = f.contract_id.to_bytes(); + contract_id_bytes[0] ^= 0xff; + let incorrect_contract_id = ContractId::from_bytes(contract_id_bytes); + let r = make_owner_only_call::<()>( + incorrect_contract_id, + VALUE2, + GUARDED_METHOD, + nonce + 2, + &sk, + f.session.as_mut().unwrap(), + ); + assert!(r.is_err()); + + Ok(()) +} diff --git a/rusk/tests/services/stake.rs b/rusk/tests/services/stake.rs index 5033db1407..603a5b5a5a 100644 --- a/rusk/tests/services/stake.rs +++ b/rusk/tests/services/stake.rs @@ -12,7 +12,7 @@ use execution_core::{ dusk, signatures::bls::PublicKey as BlsPublicKey, stake::{StakeAmount, STAKE_CONTRACT}, - transfer::contract_exec::ContractCall, + transfer::data::ContractCall, }; use rand::prelude::*; @@ -298,12 +298,14 @@ pub async fn slash() -> Result<()> { .expect("balance to exists"); let to_slash = wallet.account_public_key(0).unwrap(); let stake = wallet.get_stake(0).unwrap(); + let initial_stake_value = dusk(20.0); assert_eq!(stake.reward, dusk(3.0)); assert_eq!( stake.amount, Some(StakeAmount { - value: dusk(20.0), - eligibility: 0 + value: initial_stake_value, + eligibility: 0, + locked: 0 }) ); @@ -334,7 +336,8 @@ pub async fn slash() -> Result<()> { prev.amount, Some(StakeAmount { value: dusk(20.0), - eligibility: 0 + eligibility: 0, + locked: 0 }) ); @@ -342,25 +345,17 @@ pub async fn slash() -> Result<()> { let slashed_amount = prev_stake / 10; let after_slash = wallet.get_stake(0).unwrap(); - assert_eq!(after_slash.reward, dusk(5.0)); - assert_eq!(after_slash.reward, prev.reward + slashed_amount); + assert_eq!(after_slash.reward, dusk(3.0)); assert_eq!( after_slash.amount, Some(StakeAmount { value: prev_stake - slashed_amount, - eligibility: 4320 - }) - ); - assert_eq!( - after_slash.amount, - Some(StakeAmount { - value: dusk(18.0), - eligibility: 4320 + eligibility: 4320, + locked: dusk(2.0) }) ); let new_balance = rusk.contract_balance(STAKE_CONTRACT).unwrap(); - assert_eq!(new_balance, contract_balance - slashed_amount); - let contract_balance = new_balance; + assert_eq!(new_balance, contract_balance); generator_procedure( &rusk, @@ -375,40 +370,42 @@ pub async fn slash() -> Result<()> { let last_changes = rusk.last_provisioners_change(None).unwrap(); let (_, prev) = last_changes.first().expect("Something changed").clone(); let prev = prev.expect("to have something"); - assert_eq!(prev.reward, dusk(5.0)); + assert_eq!(prev.reward, dusk(3.0)); assert_eq!( prev.amount, Some(StakeAmount { value: dusk(18.0), - eligibility: 4320 + eligibility: 4320, + locked: dusk(2.0) }) ); let prev_stake = prev.amount.unwrap().value; + let prev_locked = prev.amount.unwrap().locked; // 20% slash let slashed_amount = prev_stake / 10 * 2; let after_slash = wallet.get_stake(0).unwrap(); - assert_eq!(after_slash.reward, dusk(8.6)); - assert_eq!(after_slash.reward, prev.reward + slashed_amount); + assert_eq!(after_slash.reward, dusk(3.0)); assert_eq!( after_slash.amount, Some(StakeAmount { value: prev_stake - slashed_amount, - eligibility: 6480 + eligibility: 6480, + locked: prev_locked + slashed_amount }) ); assert_eq!( after_slash.amount, Some(StakeAmount { value: dusk(14.4), - eligibility: 6480 + eligibility: 6480, + locked: dusk(20.0) - dusk(14.4) }) ); let new_balance = rusk.contract_balance(STAKE_CONTRACT).unwrap(); - assert_eq!(new_balance, contract_balance - slashed_amount); - let contract_balance = new_balance; + assert_eq!(new_balance, contract_balance); generator_procedure( &rusk, @@ -423,29 +420,33 @@ pub async fn slash() -> Result<()> { let last_changes = rusk.last_provisioners_change(None).unwrap(); let (_, prev) = last_changes.first().expect("Something changed").clone(); let prev = prev.expect("to have something"); - assert_eq!(prev.reward, dusk(8.6)); + assert_eq!(prev.reward, dusk(3.0)); assert_eq!( prev.amount, Some(StakeAmount { value: dusk(14.4), - eligibility: 6480 + eligibility: 6480, + locked: dusk(20.0) - dusk(14.4) }) ); let prev_stake = prev.amount.unwrap().value; + let prev_locked = prev.amount.unwrap().locked; // 30% slash let slashed_amount = prev_stake / 10 * 3; let after_slash = wallet.get_stake(0).unwrap(); - assert_eq!(after_slash.reward, dusk(12.92)); + + assert_eq!(after_slash.reward, dusk(3.0)); assert_eq!( after_slash.amount, Some(StakeAmount { value: dusk(10.08), - eligibility: 17280 + eligibility: 17280, + locked: prev_locked + slashed_amount }) ); let new_balance = rusk.contract_balance(STAKE_CONTRACT).unwrap(); - assert_eq!(new_balance, contract_balance - slashed_amount); + assert_eq!(new_balance, contract_balance); generator_procedure( &rusk, @@ -461,12 +462,13 @@ pub async fn slash() -> Result<()> { let last_changes = rusk.last_provisioners_change(None).unwrap(); let (_, prev) = last_changes.first().expect("Something changed").clone(); let prev = prev.expect("to have something"); - assert_eq!(prev.reward, dusk(8.6)); + assert_eq!(prev.reward, dusk(3.0)); assert_eq!( prev.amount, Some(StakeAmount { value: dusk(14.4), - eligibility: 6480 + eligibility: 6480, + locked: dusk(20.0) - dusk(14.4) }) ); diff --git a/rusk/tests/services/unspendable.rs b/rusk/tests/services/unspendable.rs index 490d64e528..85dd513f2e 100644 --- a/rusk/tests/services/unspendable.rs +++ b/rusk/tests/services/unspendable.rs @@ -9,7 +9,7 @@ use std::path::Path; use std::sync::{Arc, RwLock}; use execution_core::transfer::{ - contract_exec::{ContractCall, ContractExec}, + data::{ContractCall, TransactionData}, TRANSFER_CONTRACT, }; use rand::prelude::*; @@ -95,7 +95,7 @@ fn make_transactions( GAS_LIMIT_0, GAS_PRICE, DEPOSIT, - ContractExec::Call(contract_call.clone()), + TransactionData::Call(contract_call.clone()), ) .expect("Making the transaction should succeed"); @@ -109,7 +109,7 @@ fn make_transactions( GAS_LIMIT_1, GAS_PRICE, DEPOSIT, - ContractExec::Call(contract_call.clone()), + TransactionData::Call(contract_call.clone()), ) .expect("Making the transaction should succeed"); diff --git a/test-wallet/Cargo.toml b/test-wallet/Cargo.toml index f45395fd24..9bc9688c02 100644 --- a/test-wallet/Cargo.toml +++ b/test-wallet/Cargo.toml @@ -8,7 +8,6 @@ license = "MPL-2.0" [dependencies] rand_core = "^0.6" dusk-bytes = "^0.1" -poseidon-merkle = { version = "0.7", features = ["rkyv-impl"] } rkyv = { version = "0.7", default-features = false } ff = { version = "0.13", default-features = false } zeroize = { version = "1", default-features = false, features = ["derive"] } diff --git a/test-wallet/src/imp.rs b/test-wallet/src/imp.rs index 6297bce503..34d917ec13 100644 --- a/test-wallet/src/imp.rs +++ b/test-wallet/src/imp.rs @@ -12,7 +12,6 @@ use alloc::string::FromUtf8Error; use alloc::vec::Vec; use dusk_bytes::Error as BytesError; -use poseidon_merkle::Opening; use rand_core::{CryptoRng, Error as RngError, RngCore}; use rkyv::ser::serializers::{ AllocScratchError, CompositeSerializerError, SharedSerializeMapError, @@ -24,11 +23,11 @@ use execution_core::{ signatures::bls::{PublicKey as BlsPublicKey, SecretKey as BlsSecretKey}, stake::StakeData, transfer::{ - contract_exec::ContractExec, + data::TransactionData, moonlight::{AccountData, Transaction as MoonlightTransaction}, phoenix::{ - Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, - ViewKey as PhoenixViewKey, NOTES_TREE_DEPTH, + Note, NoteLeaf, NoteOpening, PublicKey as PhoenixPublicKey, + SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, }, Transaction, }, @@ -225,31 +224,31 @@ where fn unspent_notes_and_nullifiers( &self, sk: &PhoenixSecretKey, - ) -> Result, Error> { + ) -> Result, Error> { let vk = PhoenixViewKey::from(sk); - let notes: Vec = self - .state - .fetch_notes(&vk) - .map_err(Error::from_state_err)? - .into_iter() - .map(|(note, _bh)| note) - .collect(); + let note_leaves = + self.state.fetch_notes(&vk).map_err(Error::from_state_err)?; - let nullifiers: Vec<_> = - notes.iter().map(|n| n.gen_nullifier(sk)).collect(); + let nullifiers: Vec<_> = note_leaves + .iter() + .map(|(note, _bh)| note.gen_nullifier(sk)) + .collect(); let existing_nullifiers = self .state .fetch_existing_nullifiers(&nullifiers) .map_err(Error::from_state_err)?; - let unspent_notes_and_nullifiers = notes + let unspent_notes_and_nullifiers = note_leaves .into_iter() .zip(nullifiers.into_iter()) .filter(|(_note, nullifier)| { !existing_nullifiers.contains(nullifier) }) + .map(|((note, block_height), nullifier)| { + (NoteLeaf { note, block_height }, nullifier) + }) .collect(); Ok(unspent_notes_and_nullifiers) @@ -272,12 +271,13 @@ where Vec::with_capacity(unspent_notes_nullifiers.len()); let mut accumulated_value = 0; - for (note, nullifier) in unspent_notes_nullifiers { - let val = note + for (note_leaf, nullifier) in unspent_notes_nullifiers { + let val = note_leaf + .note .value(Some(&sender_vk)) .map_err(|_| ExecutionError::PhoenixOwnership)?; accumulated_value += val; - notes_values_nullifiers.push((note, val, nullifier)); + notes_values_nullifiers.push((note_leaf.note, val, nullifier)); } if accumulated_value < transaction_cost { @@ -301,10 +301,7 @@ where &self, sender_sk: &PhoenixSecretKey, transaction_cost: u64, - ) -> Result< - Vec<(Note, Opening<(), NOTES_TREE_DEPTH>, BlsScalar)>, - Error, - > { + ) -> Result, Error> { let notes_and_nullifiers = self.input_notes_nullifiers(sender_sk, transaction_cost)?; @@ -328,7 +325,7 @@ where &self, sender_sk: &PhoenixSecretKey, transaction_cost: u64, - ) -> Result)>, Error> { + ) -> Result, Error> { let notes_and_nullifiers = self.input_notes_nullifiers(sender_sk, transaction_cost)?; @@ -354,7 +351,7 @@ where gas_limit: u64, gas_price: u64, deposit: u64, - exec: impl Into, + data: impl Into, ) -> Result> { let mut sender_sk = self.phoenix_secret_key(sender_index)?; let receiver_pk = self.phoenix_public_key(sender_index)?; @@ -370,6 +367,9 @@ where let transfer_value = 0; let obfuscated_transaction = false; + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; + let tx = phoenix_transaction::( rng, &sender_sk, @@ -382,7 +382,8 @@ where deposit, gas_limit, gas_price, - Some(exec), + chain_id, + Some(data), )?; sender_sk.zeroize(); @@ -414,7 +415,10 @@ where let obfuscated_transaction = true; let deposit = 0; - let exec: Option = None; + let data: Option = None; + + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; let tx = phoenix_transaction::( rng, @@ -428,7 +432,8 @@ where deposit, gas_limit, gas_price, - exec, + chain_id, + data, )?; sender_sk.zeroize(); @@ -465,6 +470,9 @@ where .map_err(Error::from_state_err)? .nonce; + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; + let tx = phoenix_stake::( rng, &phoenix_sender_sk, @@ -473,6 +481,7 @@ where root, gas_limit, gas_price, + chain_id, stake_value, current_nonce, )?; @@ -517,6 +526,9 @@ where })? .value; + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; + let tx = phoenix_unstake::( rng, &phoenix_sender_sk, @@ -526,6 +538,7 @@ where staked_amount, gas_limit, gas_price, + chain_id, )?; stake_sk.zeroize(); @@ -562,6 +575,9 @@ where .map_err(Error::from_state_err)? .reward; + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; + let tx = phoenix_stake_reward::( rng, &phoenix_sender_sk, @@ -571,6 +587,7 @@ where stake_reward, gas_limit, gas_price, + chain_id, )?; stake_sk.zeroize(); @@ -589,7 +606,7 @@ where gas_price: u64, ) -> Result> { let deposit = 0; - let exec: Option = None; + let data: Option = None; self.moonlight_transaction( from_index, @@ -598,7 +615,7 @@ where deposit, gas_limit, gas_price, - exec, + data, ) } @@ -612,7 +629,7 @@ where deposit: u64, gas_limit: u64, gas_price: u64, - exec: Option>, + data: Option>, ) -> Result> { let mut seed = self.store.get_seed().map_err(Error::from_store_err)?; let mut from_sk = derive_bls_sk(&seed, from_index); @@ -631,10 +648,13 @@ where } let nonce = account.nonce + 1; + let chain_id = + self.state.fetch_chain_id().map_err(Error::from_state_err)?; + let tx = MoonlightTransaction::new( &from_sk, to_account, value, deposit, gas_limit, gas_price, nonce, - exec, - ); + chain_id, data, + )?; seed.zeroize(); from_sk.zeroize(); @@ -651,12 +671,12 @@ where let mut phoenix_sk = derive_phoenix_sk(&seed, sk_index); let phoenix_vk = PhoenixViewKey::from(&phoenix_sk); - let unspent_notes: Vec = self + let unspent_notes: Vec = self .unspent_notes_and_nullifiers(&phoenix_sk)? .into_iter() - .map(|(note, _nullifier)| note) + .map(|(note_leaf, _nul)| note_leaf) .collect(); - let balance = phoenix_balance(&phoenix_vk, unspent_notes); + let balance = phoenix_balance(&phoenix_vk, unspent_notes.iter()); seed.zeroize(); phoenix_sk.zeroize(); diff --git a/test-wallet/src/lib.rs b/test-wallet/src/lib.rs index 32d4fbe7bd..a5b9aebdcb 100644 --- a/test-wallet/src/lib.rs +++ b/test-wallet/src/lib.rs @@ -15,7 +15,6 @@ extern crate alloc; mod imp; use alloc::vec::Vec; -use poseidon_merkle::Opening as PoseidonOpening; use zeroize::Zeroize; use execution_core::{ @@ -24,8 +23,8 @@ use execution_core::{ transfer::{ moonlight::AccountData, phoenix::{ - Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, - ViewKey as PhoenixViewKey, NOTES_TREE_DEPTH, + Note, NoteOpening, PublicKey as PhoenixPublicKey, + SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, }, }, BlsScalar, @@ -104,9 +103,6 @@ pub trait Store { } } -/// Tuple containing Note and block height -pub type EnrichedNote = (Note, u64); - /// Types that are clients of the state API. pub trait StateClient { /// Error returned by the node client. @@ -116,7 +112,7 @@ pub trait StateClient { fn fetch_notes( &self, vk: &PhoenixViewKey, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; /// Fetch the current root of the state. fn fetch_root(&self) -> Result; @@ -129,10 +125,7 @@ pub trait StateClient { ) -> Result, Self::Error>; /// Queries the node to find the opening for a specific note. - fn fetch_opening( - &self, - note: &Note, - ) -> Result, Self::Error>; + fn fetch_opening(&self, note: &Note) -> Result; /// Queries the node for the stake of a key. If the key has no stake, a /// `Default` stake info should be returned. @@ -143,4 +136,7 @@ pub trait StateClient { &self, pk: &BlsPublicKey, ) -> Result; + + /// Queries for the chain ID. + fn fetch_chain_id(&self) -> Result; } diff --git a/wallet-core/.cargo/config.toml b/wallet-core/.cargo/config.toml new file mode 100644 index 0000000000..14c5995198 --- /dev/null +++ b/wallet-core/.cargo/config.toml @@ -0,0 +1,15 @@ +# Temporary fix to avoid Makefile just for wasm, until we figure out how to +# run `cargo test` for the host machine with the default target `wasm32` +# +# See: +[alias] +wasm = "build --release --target wasm32-unknown-unknown -Z build-std=core,alloc,panic_abort -Z build-std-features=panic_immediate_abort" +wasm-debug = "build --release --target wasm32-unknown-unknown -Z build-std=core,alloc,panic_abort" + +[profile.release] +codegen-units = 1 +opt-level = "z" +lto = true +debug = false +panic = "abort" +overflow-checks = true diff --git a/wallet-core/Cargo.toml b/wallet-core/Cargo.toml index 9007a178ef..2404d9932e 100644 --- a/wallet-core/Cargo.toml +++ b/wallet-core/Cargo.toml @@ -3,6 +3,9 @@ name = "wallet-core" version = "0.1.0" edition = "2021" +[lib] +crate-type = ["cdylib", "rlib"] + [dependencies] dusk-bytes = "0.1" bytecheck = { version = "0.6", default-features = false } @@ -14,6 +17,9 @@ ff = { version = "0.13", default-features = false } poseidon-merkle = { version = "0.7", features = ["rkyv-impl"] } execution-core = { version = "0.1", path = "../execution-core/" } +[target.'cfg(target_family = "wasm")'.dependencies] +dlmalloc = { version = "0.2", features = ["global"] } + [dev-dependencies] rand = "0.8" diff --git a/wallet-core/Makefile b/wallet-core/Makefile index fffa5c6726..8cdc89385d 100644 --- a/wallet-core/Makefile +++ b/wallet-core/Makefile @@ -1,5 +1,3 @@ -TARGET_DIR:="../../target/dusk" - all: ## Build the ABI cargo build @@ -11,13 +9,7 @@ test: wasm: ## Build the WASM files - @RUSTFLAGS="$(RUSTFLAGS) --remap-path-prefix $(HOME)= -C link-args=-zstack-size=65536" \ - CARGO_TARGET_DIR=$(TARGET_DIR) \ - cargo +dusk build \ - --release \ - --color=always \ - -Z build-std=core,alloc \ - --target wasm64-unknown-unknown + @cargo wasm clippy: ## Run clippy @cargo clippy --release -- -D warnings diff --git a/wallet-core/src/ffi.rs b/wallet-core/src/ffi.rs new file mode 100644 index 0000000000..f6e4a24147 --- /dev/null +++ b/wallet-core/src/ffi.rs @@ -0,0 +1,75 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) DUSK NETWORK. All rights reserved. + +use crate::keys::{derive_bls_pk, derive_phoenix_pk, RNG_SEED}; +use core::ptr; +use dusk_bytes::Serializable; +use execution_core::{ + signatures::bls::PublicKey as BlsPublicKey, + transfer::phoenix::PublicKey as PhoenixPublicKey, +}; + +use alloc::alloc::{alloc, dealloc, Layout}; + +/// The alignment of the memory allocated by the FFI. +/// +/// This is 1 because we're not allocating any complex data structures, and +/// just interacting with the memory directly. +const ALIGNMENT: usize = 1; + +/// Allocates a buffer of `len` bytes on the WASM memory. +#[no_mangle] +pub fn malloc(len: u32) -> u32 { + unsafe { + let layout = Layout::from_size_align_unchecked(len as usize, ALIGNMENT); + let ptr = alloc(layout); + ptr as _ + } +} + +/// Frees a previously allocated buffer on the WASM memory. +#[no_mangle] +pub fn free(ptr: u32, len: u32) { + unsafe { + let layout = Layout::from_size_align_unchecked(len as usize, ALIGNMENT); + dealloc(ptr as _, layout); + } +} + +#[no_mangle] +pub unsafe extern "C" fn generate_profile( + seed: &[u8; RNG_SEED], + index: u8, + profile: *mut [u8; PhoenixPublicKey::SIZE + BlsPublicKey::SIZE], +) -> u8 { + let ppk = derive_phoenix_pk(seed, index).to_bytes(); + let bpk = derive_bls_pk(seed, index).to_bytes(); + + ptr::copy_nonoverlapping( + &ppk[0], + &mut (*profile)[0], + PhoenixPublicKey::SIZE, + ); + + ptr::copy_nonoverlapping( + &bpk[0], + &mut (*profile)[PhoenixPublicKey::SIZE], + BlsPublicKey::SIZE, + ); + + 0 +} + +// Currently we're not handling panic message in the WASM module; in the future +// we might want to enable it for `debug` releases. +mod panic_handling { + use core::panic::PanicInfo; + + #[panic_handler] + fn panic(_info: &PanicInfo) -> ! { + loop {} + } +} diff --git a/wallet-core/src/input.rs b/wallet-core/src/input.rs new file mode 100644 index 0000000000..00fb51ed13 --- /dev/null +++ b/wallet-core/src/input.rs @@ -0,0 +1,128 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) DUSK NETWORK. All rights reserved. + +//! Helper functions for working with notes. + +use alloc::vec::Vec; + +use super::{alloc, Note}; + +use execution_core::BlsScalar; + +/// The maximum amount of input notes that can be spend in one +/// phoenix-transaction +pub const MAX_INPUT_NOTES: usize = 4; + +/// Pick the notes to be used in a transaction from a vector of notes. +/// +/// The resulting array is only 4 notes long, the argument of this function can +/// be arbitary amount of notes. +/// +/// # Errors +/// +/// If the target sum is greater than the sum of the notes then an error is +/// returned. If the notes vector is empty then an error is returned. +/// +/// See `InputNotesError` type for possible errors +/// this function can yield. +#[must_use] +pub fn try_input_notes( + nodes: Vec<(Note, u64, BlsScalar)>, + target_sum: u64, +) -> Vec<(Note, BlsScalar)> { + if nodes.is_empty() { + return Vec::new(); + } + + let mut i = 0; + let mut sum = 0; + while sum < target_sum && i < nodes.len() { + sum = sum.saturating_add(nodes[i].1); + i += 1; + } + + if sum < target_sum { + return Vec::new(); + } + + pick_notes(target_sum, nodes) +} + +/// Pick the notes to be used in a transaction from a vector of notes. +/// +/// The notes are picked in a way to maximize the number of notes used, +/// while minimizing the value employed. To do this we sort the notes in +/// ascending value order, and go through each combination in a +/// lexicographic order until we find the first combination whose sum is +/// larger or equal to the given value. If such a slice is not found, an +/// empty vector is returned. +/// +/// Note: it is presupposed that the input notes contain enough balance to +/// cover the given `value`. +fn pick_notes( + value: u64, + notes_and_values: Vec<(Note, u64, BlsScalar)>, +) -> Vec<(Note, BlsScalar)> { + let mut notes_and_values = notes_and_values; + let len = notes_and_values.len(); + + if len <= MAX_INPUT_NOTES { + return notes_and_values + .into_iter() + .map(|(note, _, b)| (note, b)) + .collect(); + } + + notes_and_values.sort_by(|(_, aval, _), (_, bval, _)| aval.cmp(bval)); + pick_lexicographic(notes_and_values.len(), |indices| { + indices + .iter() + .map(|index| notes_and_values[*index].1) + .sum::() + >= value + }) + .map(|index| notes_and_values[index].clone()) + .map(|(n, _, b)| (n, b)) + .to_vec() +} + +fn pick_lexicographic bool>( + max_len: usize, + is_valid: F, +) -> [usize; MAX_INPUT_NOTES] { + let mut indices = [0; MAX_INPUT_NOTES]; + indices + .iter_mut() + .enumerate() + .for_each(|(i, index)| *index = i); + + loop { + if is_valid(&indices) { + return indices; + } + + let mut i = MAX_INPUT_NOTES - 1; + + while indices[i] == i + max_len - MAX_INPUT_NOTES { + if i > 0 { + i -= 1; + } else { + break; + } + } + + indices[i] += 1; + for j in i + 1..MAX_INPUT_NOTES { + indices[j] = indices[j - 1] + 1; + } + + if indices[MAX_INPUT_NOTES - 1] == max_len { + break; + } + } + + [0; MAX_INPUT_NOTES] +} diff --git a/wallet-core/src/keys.rs b/wallet-core/src/keys.rs index 357e08dc49..1ce4714952 100644 --- a/wallet-core/src/keys.rs +++ b/wallet-core/src/keys.rs @@ -14,14 +14,18 @@ use sha2::{Digest, Sha256}; use zeroize::Zeroize; use execution_core::{ - signatures::bls::SecretKey as BlsSecretKey, + signatures::bls::{PublicKey as BlsPublicKey, SecretKey as BlsSecretKey}, transfer::phoenix::{ PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, }, }; -use crate::RNG_SEED; +/// The seed bytes buffer which is used at multiple places +pub type Seed = [u8; RNG_SEED]; + +/// Length of the seed of the generated rng. +pub const RNG_SEED: usize = 64; /// Generates a [`BlsSecretKey`] from a seed and index. /// @@ -34,6 +38,18 @@ pub fn derive_bls_sk(seed: &[u8; RNG_SEED], index: u8) -> BlsSecretKey { BlsSecretKey::random(&mut rng_with_index(seed, index, b"SK")) } +/// Generates a [`BlsPublicKey`] from a seed and index. +/// +/// The randomness is generated using [`rng_with_index`]. +#[must_use] +pub fn derive_bls_pk(seed: &[u8; RNG_SEED], index: u8) -> BlsPublicKey { + let mut sk = derive_bls_sk(seed, index); + let pk = BlsPublicKey::from(&sk); + sk.zeroize(); + + pk +} + /// Generates a [`PhoenixSecretKey`] from a seed and index. /// /// The randomness is generated using [`rng_with_index`]. diff --git a/wallet-core/src/lib.rs b/wallet-core/src/lib.rs index 98e64c467b..610e6db1db 100644 --- a/wallet-core/src/lib.rs +++ b/wallet-core/src/lib.rs @@ -10,18 +10,24 @@ #![deny(missing_docs)] #![deny(rustdoc::broken_intra_doc_links)] #![deny(clippy::pedantic)] +#[cfg(target_family = "wasm")] +#[global_allocator] +static ALLOC: dlmalloc::GlobalDlmalloc = dlmalloc::GlobalDlmalloc; extern crate alloc; +#[cfg(target_family = "wasm")] +mod ffi; + +pub mod input; pub mod keys; pub mod transaction; -/// Length of the seed of the generated rng. -pub const RNG_SEED: usize = 64; - -// The maximum amount of input notes that can be spend in one -// phoenix-transaction -const MAX_INPUT_NOTES: usize = 4; +pub mod prelude { + //! Re-export of the most commonly used types and traits. + pub use crate::keys; + pub use crate::{input::MAX_INPUT_NOTES, keys::RNG_SEED}; +} use alloc::collections::btree_map::BTreeMap; use alloc::vec::Vec; @@ -30,25 +36,26 @@ use dusk_bytes::{DeserializableSlice, Serializable, Write}; use execution_core::{ transfer::phoenix::{ - Note, SecretKey as PhoenixSecretKey, ViewKey as PhoenixViewKey, + Note, NoteLeaf, SecretKey as PhoenixSecretKey, + ViewKey as PhoenixViewKey, }, BlsScalar, }; -/// Filter all notes that are owned by the given keys, mapped to their -/// nullifiers. +/// Filter all notes and their block height that are owned by the given keys, +/// mapped to their nullifiers. pub fn map_owned( keys: impl AsRef<[PhoenixSecretKey]>, - notes: impl AsRef<[Note]>, -) -> BTreeMap { + notes: impl AsRef<[NoteLeaf]>, +) -> BTreeMap { notes .as_ref() .iter() - .fold(BTreeMap::new(), |mut notes_map, note| { + .fold(BTreeMap::new(), |mut notes_map, note_leaf| { for sk in keys.as_ref() { - if sk.owns(note.stealth_address()) { - let nullifier = note.gen_nullifier(sk); - notes_map.insert(nullifier, note.clone()); + if sk.owns(note_leaf.note.stealth_address()) { + let nullifier = note_leaf.note.gen_nullifier(sk); + notes_map.insert(nullifier, note_leaf.clone()); } } notes_map @@ -57,20 +64,22 @@ pub fn map_owned( /// Calculate the sum for all the given [`Note`]s that belong to the given /// [`PhoenixViewKey`]. -pub fn phoenix_balance( +pub fn phoenix_balance( phoenix_vk: &PhoenixViewKey, - unspent_notes: impl AsRef<[Note]>, -) -> BalanceInfo { - let mut values: Vec = Vec::new(); - let unspent_notes = unspent_notes.as_ref(); - for note in unspent_notes { - values.push(note.value(Some(phoenix_vk)).unwrap_or_default()); - } + notes: impl Iterator, +) -> BalanceInfo +where + T: AsRef, +{ + let mut values: Vec = notes + .filter_map(|note| note.as_ref().value(Some(phoenix_vk)).ok()) + .collect(); values.sort_by(|a, b| b.cmp(a)); - let spendable = values.iter().take(MAX_INPUT_NOTES).sum(); - let value = spendable + values.iter().skip(MAX_INPUT_NOTES).sum::(); + let spendable = values.iter().take(input::MAX_INPUT_NOTES).sum(); + let value = + spendable + values.iter().skip(input::MAX_INPUT_NOTES).sum::(); BalanceInfo { value, spendable } } diff --git a/wallet-core/src/transaction.rs b/wallet-core/src/transaction.rs index bc21c64aae..8f2427a775 100644 --- a/wallet-core/src/transaction.rs +++ b/wallet-core/src/transaction.rs @@ -11,18 +11,16 @@ use alloc::vec::Vec; use rand::{CryptoRng, RngCore}; use ff::Field; -use poseidon_merkle::Opening; use zeroize::Zeroize; use execution_core::{ signatures::bls::SecretKey as BlsSecretKey, stake::{Stake, Withdraw as StakeWithdraw, STAKE_CONTRACT}, transfer::{ - contract_exec::{ContractCall, ContractExec}, + data::{ContractCall, TransactionData}, phoenix::{ - Note, Prove, PublicKey as PhoenixPublicKey, + Note, NoteOpening, Prove, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, Transaction as PhoenixTransaction, - NOTES_TREE_DEPTH, }, withdraw::{Withdraw, WithdrawReceiver, WithdrawReplayToken}, Transaction, @@ -54,14 +52,15 @@ pub fn phoenix( sender_sk: &PhoenixSecretKey, change_pk: &PhoenixPublicKey, receiver_pk: &PhoenixPublicKey, - inputs: Vec<(Note, Opening<(), NOTES_TREE_DEPTH>)>, + inputs: Vec<(Note, NoteOpening)>, root: BlsScalar, transfer_value: u64, obfuscated_transaction: bool, deposit: u64, gas_limit: u64, gas_price: u64, - exec: Option>, + chain_id: u8, + data: Option>, ) -> Result { Ok(PhoenixTransaction::new::( rng, @@ -75,7 +74,8 @@ pub fn phoenix( deposit, gas_limit, gas_price, - exec, + chain_id, + data, )? .into()) } @@ -95,10 +95,11 @@ pub fn phoenix_stake( rng: &mut R, phoenix_sender_sk: &PhoenixSecretKey, stake_sk: &BlsSecretKey, - inputs: Vec<(Note, Opening<(), NOTES_TREE_DEPTH>)>, + inputs: Vec<(Note, NoteOpening)>, root: BlsScalar, gas_limit: u64, gas_price: u64, + chain_id: u8, stake_value: u64, current_nonce: u64, ) -> Result { @@ -109,7 +110,7 @@ pub fn phoenix_stake( let obfuscated_transaction = false; let deposit = stake_value; - let stake = Stake::new(stake_sk, stake_value, current_nonce + 1); + let stake = Stake::new(stake_sk, stake_value, current_nonce + 1, chain_id); let contract_call = ContractCall::new(STAKE_CONTRACT, "stake", &stake)?; @@ -125,6 +126,7 @@ pub fn phoenix_stake( deposit, gas_limit, gas_price, + chain_id, Some(contract_call), ) } @@ -145,11 +147,12 @@ pub fn phoenix_stake_reward( rng: &mut R, phoenix_sender_sk: &PhoenixSecretKey, stake_sk: &BlsSecretKey, - inputs: Vec<(Note, Opening<(), NOTES_TREE_DEPTH>, BlsScalar)>, + inputs: Vec<(Note, NoteOpening, BlsScalar)>, root: BlsScalar, reward_amount: u64, gas_limit: u64, gas_price: u64, + chain_id: u8, ) -> Result { let receiver_pk = PhoenixPublicKey::from(phoenix_sender_sk); let change_pk = receiver_pk; @@ -190,6 +193,7 @@ pub fn phoenix_stake_reward( deposit, gas_limit, gas_price, + chain_id, Some(contract_call), ) } @@ -209,11 +213,12 @@ pub fn phoenix_unstake( rng: &mut R, phoenix_sender_sk: &PhoenixSecretKey, stake_sk: &BlsSecretKey, - inputs: Vec<(Note, Opening<(), NOTES_TREE_DEPTH>, BlsScalar)>, + inputs: Vec<(Note, NoteOpening, BlsScalar)>, root: BlsScalar, unstake_value: u64, gas_limit: u64, gas_price: u64, + chain_id: u8, ) -> Result { let receiver_pk = PhoenixPublicKey::from(phoenix_sender_sk); let change_pk = receiver_pk; @@ -254,6 +259,7 @@ pub fn phoenix_unstake( deposit, gas_limit, gas_price, + chain_id, Some(contract_call), ) } diff --git a/wallet-core/tests/notes.rs b/wallet-core/tests/notes.rs index c9ecfce44f..c7cff81fa5 100644 --- a/wallet-core/tests/notes.rs +++ b/wallet-core/tests/notes.rs @@ -5,20 +5,49 @@ // Copyright (c) DUSK NETWORK. All rights reserved. use ff::Field; -use rand::rngs::StdRng; -use rand::SeedableRng; +use rand::{rngs::StdRng, CryptoRng, RngCore, SeedableRng}; use execution_core::{ transfer::phoenix::{ - Note, PublicKey as PhoenixPublicKey, SecretKey as PhoenixSecretKey, + Note, NoteLeaf, PublicKey as PhoenixPublicKey, + SecretKey as PhoenixSecretKey, }, - JubJubScalar, + BlsScalar, JubJubScalar, }; use wallet_core::{ - keys::derive_multiple_phoenix_sk, map_owned, phoenix_balance, BalanceInfo, + input::try_input_notes, keys::derive_multiple_phoenix_sk, map_owned, + phoenix_balance, BalanceInfo, }; +/// Generate a note, useful for testing purposes +pub fn gen_note( + rng: &mut T, + obfuscated_note: bool, + owner_pk: &PhoenixPublicKey, + value: u64, +) -> Note { + let sender_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); + + let value_blinder = JubJubScalar::random(&mut *rng); + let sender_blinder = [ + JubJubScalar::random(&mut *rng), + JubJubScalar::random(&mut *rng), + ]; + if obfuscated_note { + Note::obfuscated( + rng, + &sender_pk, + owner_pk, + value, + value_blinder, + sender_blinder, + ) + } else { + Note::transparent(rng, &sender_pk, owner_pk, value, sender_blinder) + } +} + #[test] fn test_map_owned() { // Assuming this set of notes where the number used as suffix is the @@ -44,7 +73,7 @@ fn test_map_owned() { PhoenixPublicKey::from(&PhoenixSecretKey::random(&mut rng)); let value = 42; - let notes = vec![ + let note_leaves: Vec = vec![ gen_note(&mut rng, true, &owner_1_pks[0], value), // owner 1 gen_note(&mut rng, true, &owner_1_pks[1], value), // owner 1 gen_note(&mut rng, true, &owner_2_pks[0], value), // owner 2 @@ -53,28 +82,36 @@ fn test_map_owned() { gen_note(&mut rng, true, &owner_3_pk, value), // owner 3 ]; + let note_leaves: Vec = note_leaves + .into_iter() + .map(|note| NoteLeaf { + note, + block_height: 0, + }) + .collect(); + // notes with idx 0, 1 and 4 are owned by owner_1 - let notes_by_1 = map_owned(&owner_1_sks, ¬es); + let notes_by_1 = map_owned(&owner_1_sks, ¬e_leaves); assert_eq!(notes_by_1.len(), 3); - let note = ¬es[0]; + let note = ¬e_leaves[0].note; let nullifier = note.gen_nullifier(&owner_1_sks[0]); - assert_eq!(¬es_by_1[&nullifier], note); - let note = ¬es[1]; + assert_eq!(¬es_by_1[&nullifier].note, note); + let note = ¬e_leaves[1].note; let nullifier = note.gen_nullifier(&owner_1_sks[1]); - assert_eq!(¬es_by_1[&nullifier], note); - let note = ¬es[4]; + assert_eq!(¬es_by_1[&nullifier].note, note); + let note = ¬e_leaves[4].note; let nullifier = note.gen_nullifier(&owner_1_sks[2]); - assert_eq!(¬es_by_1[&nullifier], note); + assert_eq!(¬es_by_1[&nullifier].note, note); // notes with idx 2 and 3 are owned by owner_2 - let notes_by_2 = map_owned(&owner_2_sks, ¬es); + let notes_by_2 = map_owned(&owner_2_sks, ¬e_leaves); assert_eq!(notes_by_2.len(), 2); - let note = ¬es[2]; + let note = ¬e_leaves[2].note; let nullifier = note.gen_nullifier(&owner_2_sks[0]); - assert_eq!(¬es_by_2[&nullifier], note); - let note = ¬es[3]; + assert_eq!(¬es_by_2[&nullifier].note, note); + let note = ¬e_leaves[3].note; let nullifier = note.gen_nullifier(&owner_2_sks[1]); - assert_eq!(¬es_by_2[&nullifier], note); + assert_eq!(¬es_by_2[&nullifier].note, note); } #[test] @@ -90,7 +127,7 @@ fn test_balance() { for value in 0..=10 { // we want to test with a mix of transparent and obfuscated notes so we // make every 10th note transparent - let obfuscated_note = if value % 10 == 0 { false } else { true }; + let obfuscated_note = value % 10 != 0; notes.push(gen_note(&mut rng, obfuscated_note, &owner_pk, value)); @@ -114,35 +151,73 @@ fn test_balance() { spendable: 34, }; + let notes: Vec = notes + .into_iter() + .map(|note| NoteLeaf { + note, + block_height: 0, + }) + .collect(); + assert_eq!( - phoenix_balance(&(&owner_sk).into(), notes), + phoenix_balance(&(&owner_sk).into(), notes.iter()), expected_balance ); } -fn gen_note( - rng: &mut StdRng, - obfuscated_note: bool, - owner_pk: &PhoenixPublicKey, - value: u64, -) -> Note { - let sender_pk = PhoenixPublicKey::from(&PhoenixSecretKey::random(rng)); +#[test] +fn knapsack_works() { + use rand::SeedableRng; - let value_blinder = JubJubScalar::random(&mut *rng); - let sender_blinder = [ - JubJubScalar::random(&mut *rng), - JubJubScalar::random(&mut *rng), - ]; - if obfuscated_note { - Note::obfuscated( - rng, - &sender_pk, - &owner_pk, - value, - value_blinder, - sender_blinder, - ) - } else { - Note::transparent(rng, &sender_pk, &owner_pk, value, sender_blinder) - } + let mut rng = rand_chacha::ChaCha12Rng::seed_from_u64(0xbeef); + + // sanity check + assert_eq!(try_input_notes(vec![], 70), Vec::new(),); + + let sk = PhoenixSecretKey::random(&mut rng); + let pk = PhoenixPublicKey::from(&sk); + + // basic check + let note = gen_note(&mut rng, true, &pk, 100); + let n = note.gen_nullifier(&sk); + let available = vec![(note, 100, n)]; + let inputs_notes: Vec<(Note, BlsScalar)> = available + .clone() + .into_iter() + .map(|(a, _, b)| (a, b)) + .collect(); + let input = try_input_notes(available, 70); + assert_eq!(input, inputs_notes); + + // out of balance basic check + let note = gen_note(&mut rng, true, &pk, 100); + let available = vec![(note, 100, n)]; + assert_eq!(try_input_notes(available, 101), Vec::new()); + + // multiple inputs check + // note: this test is checking a naive, simple order-based output + + let note1 = gen_note(&mut rng, true, &pk, 100); + let note2 = gen_note(&mut rng, true, &pk, 500); + let note3 = gen_note(&mut rng, true, &pk, 300); + + let available = vec![(note1, 100, n), (note2, 500, n), (note3, 300, n)]; + + let result: Vec<(Note, BlsScalar)> = available + .clone() + .into_iter() + .map(|(a, _, b)| (a, b)) + .collect(); + + assert_eq!(try_input_notes(available.clone(), 600), result); + + let note1 = gen_note(&mut rng, true, &pk, 100); + let note2 = gen_note(&mut rng, true, &pk, 500); + let note3 = gen_note(&mut rng, true, &pk, 300); + + let n = note1.gen_nullifier(&sk); + + let available = vec![(note1, 100, n), (note2, 500, n), (note3, 300, n)]; + + assert_eq!(try_input_notes(available, 901), Vec::new()); } diff --git a/web-wallet/.eslintignore b/web-wallet/.eslintignore index 38972655fa..da81b5c351 100644 --- a/web-wallet/.eslintignore +++ b/web-wallet/.eslintignore @@ -4,10 +4,11 @@ node_modules /.svelte-kit /package .env -.env.* +.env.\* !.env.example # Ignore files for PNPM, NPM and YARN + pnpm-lock.yaml package-lock.json yarn.lock diff --git a/web-wallet/CHANGELOG.md b/web-wallet/CHANGELOG.md index 6481471c8a..bf490f79cc 100644 --- a/web-wallet/CHANGELOG.md +++ b/web-wallet/CHANGELOG.md @@ -9,15 +9,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Add option to sync from a custom block height on Wallet Restoration [#1568] +- Show current block height on Wallet Creation [#1561] - Added gas settings validation on Unstake / Widthdraw Rewards flows [#2000] +- Added allocation (shield/unshield) page and UI [#2196] +- Added token migration contract bindings [#2014] ### Changed +- Newly created Wallet does not sync from genesis [#1567] - Update font-display to swap for custom fonts to improve performance [#2026] - Update anchor colors to ensure better accessibility [#1765] - Update Transactions list design [#1922] - Update Buttons to match the design system [#1606] - Update `Stepper` component to new design [#2071] +- Update dashboard to use routes instead of `Tabs` for navigation pattern [#2075] +- Update dashboard by splitting the transfer operations into send and receive operations [#2175] ### Fixed @@ -225,7 +232,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1545]: https://github.com/dusk-network/rusk/issues/1545 [#1547]: https://github.com/dusk-network/rusk/issues/1547 [#1552]: https://github.com/dusk-network/rusk/issues/1552 +[#1561]: https://github.com/dusk-network/rusk/issues/1561 [#1565]: https://github.com/dusk-network/rusk/issues/1565 +[#1568]: https://github.com/dusk-network/rusk/issues/1568 +[#1567]: https://github.com/dusk-network/rusk/issues/1567 [#1576]: https://github.com/dusk-network/rusk/issues/1576 [#1591]: https://github.com/dusk-network/rusk/issues/1591 [#1598]: https://github.com/dusk-network/rusk/issues/1598 @@ -236,7 +246,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#2026]: https://github.com/dusk-network/rusk/issues/2026 [#2000]: https://github.com/dusk-network/rusk/issues/2000 [#2071]: https://github.com/dusk-network/rusk/issues/2071 +[#2071]: https://github.com/dusk-network/rusk/issues/2075 [#2118]: https://github.com/dusk-network/rusk/issues/2118 +[#2118]: https://github.com/dusk-network/rusk/issues/2175 +[#2196]: https://github.com/dusk-network/rusk/issues/2196 +[#2014]: https://github.com/dusk-network/rusk/issues/2014 diff --git a/web-wallet/README.md b/web-wallet/README.md index ec583725a2..0f2f8f88bc 100644 --- a/web-wallet/README.md +++ b/web-wallet/README.md @@ -33,6 +33,8 @@ N.B. the current `0.1.2` version of the library has no option to pick the networ ``` # can be empty string, must start with a slash otherwise, must not end with a slash VITE_BASE_PATH="" +VITE_CONTRACT_ALLOCATE_DISABLED=true +VITE_CONTRACT_MIGRATE_DISABLED=true VITE_CONTRACT_STAKE_DISABLED=false VITE_CONTRACT_TRANSFER_DISABLED=false VITE_CURRENT_NODE=${VITE_LOCAL_NODE} @@ -44,6 +46,7 @@ VITE_GAS_PRICE_DEFAULT=1 VITE_GAS_PRICE_LOWER=1 VITE_LOCAL_NODE="https://localhost:5173/rusk/" VITE_MAINNET_NODE="" +VITE_MIGRATE_CONTRACT="" VITE_MINIMUM_ALLOWED_STAKE=1000 VITE_RKYV_TREE_LEAF_SIZE=632 VITE_STAKE_CONTRACT="0200000000000000000000000000000000000000000000000000000000000000" @@ -51,7 +54,6 @@ VITE_TESTNET_NODE="https://nodes.dusk.network/" VITE_TESTNET_PROVER_NODE="https://provers.dusk.network/" VITE_TRANSFER_CONTRACT="0100000000000000000000000000000000000000000000000000000000000000" VITE_GET_QUOTE_API_ENDPOINT="https://api.dusk.network/v1/quote" -VITE_MOONLIGHT_DISABLED=true ``` To run a local node different steps are needed, so please read the [related section](#running-a-local-rusk-node). diff --git a/web-wallet/__mocks__/Wallet.js b/web-wallet/__mocks__/Wallet.js index f465ef3a98..5dd33981e6 100644 --- a/web-wallet/__mocks__/Wallet.js +++ b/web-wallet/__mocks__/Wallet.js @@ -1,13 +1,13 @@ class Wallet { - constructor(seed, gasLimit = 2900000000, gasPrice = 1) { - this.gasLimit = gasLimit; - this.gasPrice = gasPrice; + constructor(seed) { this.seed = seed; this.wasm = {}; } - gasLimit; - gasPrice; + static get networkBlockHeight() { + return Promise.resolve(0); + } + seed; wasm; diff --git a/web-wallet/package-lock.json b/web-wallet/package-lock.json index b1791d9954..c5186cbbfc 100644 --- a/web-wallet/package-lock.json +++ b/web-wallet/package-lock.json @@ -9,7 +9,7 @@ "version": "0.5.0", "license": "MPL-2.0", "dependencies": { - "@dusk-network/dusk-wallet-js": "0.4.2", + "@dusk-network/dusk-wallet-js": "0.5.3", "@floating-ui/dom": "1.6.5", "@mdi/js": "7.4.47", "@wagmi/connectors": "5.1.6", @@ -2223,12 +2223,12 @@ } }, "node_modules/@dusk-network/dusk-wallet-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@dusk-network/dusk-wallet-js/-/dusk-wallet-js-0.4.2.tgz", - "integrity": "sha512-9Jy/Amm4oKkPvjw9/xo7/RRwm9U6fRobkFArVcPXwN5sL2uz6/UPd7b6w4X5bBTrdEyCZHNBwtslmwAHrwV6dA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@dusk-network/dusk-wallet-js/-/dusk-wallet-js-0.5.3.tgz", + "integrity": "sha512-HXjAewHCYL6zg65V0QaUY/xC9kkQhUs5mu+d+/3ljsRfz4mXu1fGY7pb46Kbd7lbfd7LFyBguLaQeF4ZexXfKQ==", "license": "MPL", "dependencies": { - "dexie": "3.2.4", + "dexie": "3.2.7", "fake-indexeddb": "5.0.1" } }, @@ -9880,9 +9880,9 @@ "license": "MIT" }, "node_modules/dexie": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz", - "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.7.tgz", + "integrity": "sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w==", "license": "Apache-2.0", "engines": { "node": ">=6.0" diff --git a/web-wallet/package.json b/web-wallet/package.json index 677807431a..f363750a79 100644 --- a/web-wallet/package.json +++ b/web-wallet/package.json @@ -35,7 +35,7 @@ "type": "module", "version": "0.5.0", "dependencies": { - "@dusk-network/dusk-wallet-js": "0.4.2", + "@dusk-network/dusk-wallet-js": "0.5.3", "@floating-ui/dom": "1.6.5", "@mdi/js": "7.4.47", "@wagmi/connectors": "5.1.6", diff --git a/web-wallet/src/__mocks__/mockedOperationsStore.js b/web-wallet/src/__mocks__/mockedOperationsStore.js new file mode 100644 index 0000000000..a28d7e379c --- /dev/null +++ b/web-wallet/src/__mocks__/mockedOperationsStore.js @@ -0,0 +1,5 @@ +import { mockReadableStore } from "$lib/dusk/test-helpers"; + +const content = { currentOperation: "something" }; + +export default mockReadableStore(content); diff --git a/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js b/web-wallet/src/__mocks__/mockedWalletStore.js similarity index 65% rename from web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js rename to web-wallet/src/__mocks__/mockedWalletStore.js index 3d2c378327..53d16880ae 100644 --- a/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js +++ b/web-wallet/src/__mocks__/mockedWalletStore.js @@ -9,9 +9,10 @@ const content = { addresses, balance, currentAddress, - error: null, initialized: true, - isSyncing: false, + syncStatus: { current: 0, error: null, isInProgress: false, last: 0 }, }; -export default mockReadableStore(content); +const mockedWalletStore = mockReadableStore(content); + +export default mockedWalletStore; diff --git a/web-wallet/src/lib/components/Allocate/Allocate.svelte b/web-wallet/src/lib/components/Allocate/Allocate.svelte new file mode 100644 index 0000000000..53af14e372 --- /dev/null +++ b/web-wallet/src/lib/components/Allocate/Allocate.svelte @@ -0,0 +1,413 @@ + + + + +
+ + +
+

+ Edit the value to change the allocation of your Dusk between your + shielded or public account. +

+ +
+
Shielded
+ +
+ + {middleEllipsis( + shieldedAddress, + calculateAdaptiveCharCount(screenWidth, 320, 640, 5, 20) + )} +
+ +
+ { + unshieldedAmount = +( + shieldedBalance + + unshieldedBalance - + shieldedAmount + ).toFixed(9); + }} + /> + +
+ +
+ +
Unshielded
+ +
+ + {middleEllipsis( + unshieldedAddress, + calculateAdaptiveCharCount(screenWidth, 320, 640, 5, 20) + )} +
+ +
+ { + shieldedAmount = +( + unshieldedBalance + + shieldedBalance - + unshieldedAmount + ).toFixed(9); + }} + /> + +
+
+ + { + isGasValid = areValidGasSettings( + event.detail.price, + event.detail.limit + ); + + if (isGasValid) { + gasPrice = event.detail.price; + gasLimit = event.detail.limit; + } + }} + /> +
+
+ +
+ +
+
+ + Amount: +
+
+ + {isFromUnshielded + ? `${formatter(luxToDusk(duskToLux(unshieldedBalance) - duskToLux(unshieldedAmount)))} DUSK` + : `${formatter(luxToDusk(duskToLux(shieldedBalance) - duskToLux(shieldedAmount)))} DUSK`} + + +
+
+
+
+ + From +
+
+ + {isFromUnshielded ? unshieldedAddress : shieldedAddress} + +
+
+
+
+ + To +
+
+ + {isFromShielded ? unshieldedAddress : shieldedAddress} + +
+
+ +
+
+ + + + {#if hash} + + {/if} + + + +
+
+ + diff --git a/web-wallet/src/lib/components/ApproveMigration/ApproveMigration.svelte b/web-wallet/src/lib/components/ApproveMigration/ApproveMigration.svelte new file mode 100644 index 0000000000..7413e52bd9 --- /dev/null +++ b/web-wallet/src/lib/components/ApproveMigration/ApproveMigration.svelte @@ -0,0 +1,142 @@ + + + + +
+ {#if !isLoading && !error && !data} +
+

DUSK token migration requires two transactions:

+
    +
  1. + Approve: Authorize the migration contract to spend your DUSK tokens. +
  2. +
  3. Migrate: Transfer your DUSK tokens to the migration contract.
  4. +
+

+ Both steps must be completed for a successful migration.

Warning: Make sure your wallet has enough funds to pay for the gas. +

+
+ {:else if isLoading} +
+ + Approval in progress +
+ {:else if error} +
+ + An error occured during approval +
+ {/if} + +
+ + diff --git a/web-wallet/src/lib/components/Balance/Balance.svelte b/web-wallet/src/lib/components/Balance/Balance.svelte index bfc78777dc..d3da664847 100644 --- a/web-wallet/src/lib/components/Balance/Balance.svelte +++ b/web-wallet/src/lib/components/Balance/Balance.svelte @@ -1,8 +1,7 @@ + +
+ +
diff --git a/web-wallet/src/lib/components/ExecuteMigration/ExecuteMigration.svelte b/web-wallet/src/lib/components/ExecuteMigration/ExecuteMigration.svelte new file mode 100644 index 0000000000..e36f0f834e --- /dev/null +++ b/web-wallet/src/lib/components/ExecuteMigration/ExecuteMigration.svelte @@ -0,0 +1,121 @@ + + + + +
+ {#if !isLoading && !data && !error} +
+ + Migration Approved +
+ {:else if error} +
+ + Action has been rejected on the connected wallet. +
+ {:else if isLoading && !migrationHash} +
+ + Migration in progress +
+ {/if} + {#if migrationHash && chain?.blockExplorers} +
+ + Migration has been submitted +
+
+ Migration takes some minutes to complete. Your transaction is being + executed and you can check it here. +
+ {/if} + {#if (isLoading || !data || error) && !migrationHash} +
+ + diff --git a/web-wallet/src/lib/components/GasFee/GasFee.svelte b/web-wallet/src/lib/components/GasFee/GasFee.svelte index 205cb44020..020b3f8fdf 100644 --- a/web-wallet/src/lib/components/GasFee/GasFee.svelte +++ b/web-wallet/src/lib/components/GasFee/GasFee.svelte @@ -7,9 +7,9 @@
- Max Gas Fee: + Fee:
- {fee} +
max {fee}
span:first-of-type { + font-weight: initial; + } } } diff --git a/web-wallet/src/lib/components/Receive/Receive.svelte b/web-wallet/src/lib/components/Receive/Receive.svelte index 49ed0b4c96..0952d546db 100644 --- a/web-wallet/src/lib/components/Receive/Receive.svelte +++ b/web-wallet/src/lib/components/Receive/Receive.svelte @@ -1,9 +1,9 @@ @@ -37,12 +35,10 @@
{#if !hideBackButton} - +
+`; + +exports[`CopyField > renders the CopyField component with the copy button disabled 1`] = ` +
+ + + + +
+`; diff --git a/web-wallet/src/lib/components/__tests__/__snapshots__/GasFee.spec.js.snap b/web-wallet/src/lib/components/__tests__/__snapshots__/GasFee.spec.js.snap index 3e98c31e82..6f8d22f8ed 100644 --- a/web-wallet/src/lib/components/__tests__/__snapshots__/GasFee.spec.js.snap +++ b/web-wallet/src/lib/components/__tests__/__snapshots__/GasFee.spec.js.snap @@ -2,20 +2,30 @@ exports[`GasFee > renders the GasFee component 1`] = `
- Max Gas Fee: + Fee:
- - 0.020000000 - + + max + + + + 0.020000000 + +
renders the GasSettings component closed 1`] = ` class="gas-settings__edit svelte-1daay07" >
- Max Gas Fee: + Fee:
- - 0.020000000 - + + max + + + + 0.020000000 + +
renders the GasSettings component opened 1`] = ` class="gas-settings__edit svelte-1daay07" >
- Max Gas Fee: + Fee:
- - 0.020000000 - + + max + + + + 0.020000000 + +
Amount step > should render the Send component Amount step 1`] = class="gas-settings__edit svelte-1daay07" >
- Max Gas Fee: + Fee:
- - 0.020000000 - + + max + + + + 0.020000000 + +
Amount step > should render the Send component Amount step 1`] =
- + +
@@ -248,128 +265,51 @@ bind:value={amount} required type="number" - min={minAmount} - max={maxSpendable} - step="0.000000001" + min={Number(formatUnits(minAmount, ercDecimals))} + max={Number(formatUnits(connectedWalletBalance, ercDecimals))} + step={Number(formatUnits(minAmount, ercDecimals))} placeholder="Amount" + disabled={isInputDisabled} />
{/if} - {#if isConnected && !isAmountValid && typeof amount === "number"} -
Not enough balance
- {/if} - {#if isConnected && isAmountValid && isMigrationInitialized} -
-
-

- - Est. Time - - {estimatedTime} -

-

- - Total Gas Fee - - {gasFee} -

-
- - - { - isMigrationBeingApproved = true; - }, - disabled: isMigrationBeingApproved, - icon: null, - label: "APPROVE MIGRATION", - variant: "primary", +
+ + + {#if migrationStep === 0} + { + isInputDisabled = true; }} - > - {#if !isMigrationBeingApproved} -
-

DUSK token migration requires two transactions:

-
    -
  1. - Approve: Authorize the migration contract to spend your DUSK - tokens. -
  2. -
  3. - Migrate: Transfer your DUSK tokens to the migration contract. -
  4. -
-

- Both steps must be completed for a successful migration.

Warning: Make sure your wallet has enough funds to pay - for the gas. -

-
- {:else} -
- - Approval in progress -
- {/if} - - {}, - icon: null, - label: "EXECUTE MIGRATION", - variant: "primary", + on:errorApproval={() => { + isInputDisabled = false; }} - > -
- - Migration Approved -
-
- -
- - Migration in progress -
-
- Migration takes some minutes to complete. Your transaction is - being executed and you can check it here. -
-
- + {amount} + chainContract={tokens[network][selectedChain].contract} + migrationContract={tokens[network][selectedChain].migrationContract} + /> + {:else} + + {/if}
{/if} {#if !isConnected}
`; diff --git a/web-wallet/src/routes/(welcome)/setup/restore/__tests__/page.spec.js b/web-wallet/src/routes/(welcome)/setup/restore/__tests__/page.spec.js index da9104b981..d86d8c0ec6 100644 --- a/web-wallet/src/routes/(welcome)/setup/restore/__tests__/page.spec.js +++ b/web-wallet/src/routes/(welcome)/setup/restore/__tests__/page.spec.js @@ -152,7 +152,13 @@ describe("Restore", async () => { await fireEvent.click(getByRole("button", { name: "Next" })); expect(loginInfoStorage.get()).toBeNull(); - // Restore Wallet step + // Block Height Step + await fireEvent.click(getByRole("button", { name: "Next" })); + + // Syncing Step + await fireEvent.click(getByRole("button", { name: "Next" })); + + // All Done Step await fireEvent.click(getByRole("button", { name: "Next" })); await vi.waitUntil(() => gotoSpy.mock.calls.length > 0); @@ -161,7 +167,7 @@ describe("Restore", async () => { expect(getWalletSpy).toHaveBeenCalledTimes(1); expect(getWalletSpy).toHaveBeenCalledWith(seed); expect(clearAndInitSpy).toHaveBeenCalledTimes(1); - expect(clearAndInitSpy).toHaveBeenCalledWith(expect.any(Wallet)); + expect(clearAndInitSpy).toHaveBeenCalledWith(expect.any(Wallet), 0); expect(gotoSpy).toHaveBeenCalledTimes(1); expect(gotoSpy).toHaveBeenCalledWith("/dashboard"); }); @@ -197,15 +203,22 @@ describe("Restore", async () => { expect(loginInfoStorage.get()).not.toBeNull(); }); - // Restore Wallet step + // Block Height step await fireEvent.click(getByRole("button", { name: "Next" })); + + // Network Sync step + await fireEvent.click(getByRole("button", { name: "Next" })); + + // All Done step + await fireEvent.click(getByRole("button", { name: "Next" })); + await vi.waitUntil(() => gotoSpy.mock.calls.length > 0); expect(settingsResetSpy).toHaveBeenCalledTimes(1); expect(getWalletSpy).toHaveBeenCalledTimes(1); expect(getWalletSpy).toHaveBeenCalledWith(seed); expect(clearAndInitSpy).toHaveBeenCalledTimes(1); - expect(clearAndInitSpy).toHaveBeenCalledWith(expect.any(Wallet)); + expect(clearAndInitSpy).toHaveBeenCalledWith(expect.any(Wallet), 0); expect(gotoSpy).toHaveBeenCalledTimes(1); expect(gotoSpy).toHaveBeenCalledWith("/dashboard"); }); diff --git a/web-wallet/src/routes/components-showcase/+page.svelte b/web-wallet/src/routes/components-showcase/+page.svelte index bdb4f14a11..8744751738 100644 --- a/web-wallet/src/routes/components-showcase/+page.svelte +++ b/web-wallet/src/routes/components-showcase/+page.svelte @@ -8,6 +8,7 @@ import Buttons from "./Buttons.svelte"; import Cards from "./Cards.svelte"; import Checkboxes from "./Checkboxes.svelte"; + import CopyField from "./CopyField.svelte"; import DashboardNavs from "./DashboardNavs.svelte"; import ExclusiveChoices from "./ExclusiveChoices.svelte"; import MigrateContract from "./MigrateContract.svelte"; @@ -30,6 +31,7 @@ Buttons: Buttons, Cards: Cards, Checkboxes: Checkboxes, + "Copy Field": CopyField, "Dashboard Navs": DashboardNavs, "Exclusive Choices": ExclusiveChoices, "Migrate Contract": MigrateContract, diff --git a/web-wallet/src/routes/components-showcase/Balances.svelte b/web-wallet/src/routes/components-showcase/Balances.svelte index 306a77e1be..320e712e52 100644 --- a/web-wallet/src/routes/components-showcase/Balances.svelte +++ b/web-wallet/src/routes/components-showcase/Balances.svelte @@ -1,5 +1,8 @@
@@ -8,6 +11,15 @@ fiatPrice={10} locale="en" tokenCurrency="DUSK" - tokens={2000000} + tokens={balance} + /> + +
diff --git a/web-wallet/src/routes/components-showcase/CopyField.svelte b/web-wallet/src/routes/components-showcase/CopyField.svelte new file mode 100644 index 0000000000..d1de2d2701 --- /dev/null +++ b/web-wallet/src/routes/components-showcase/CopyField.svelte @@ -0,0 +1,19 @@ + + +
+ + + +
diff --git a/web-wallet/src/style/app-components/horizontal-rules.css b/web-wallet/src/style/app-components/horizontal-rules.css index 4d516c47f2..8c803e6383 100644 --- a/web-wallet/src/style/app-components/horizontal-rules.css +++ b/web-wallet/src/style/app-components/horizontal-rules.css @@ -1,5 +1,20 @@ hr { + text-align: center; + overflow: visible; border: none; border-top: 1px solid var(--divider-color-primary); width: 100%; + height: 1px; + padding: 0; +} + +hr.glyph:after { + display: inline-block; + position: relative; + top: -1.1em; + font-size: 1em; + border: solid thin var(--divider-border-color); + border-radius: 2em; + padding: 0.5em 1.25em; + background-color: var(--divider-background-color); } diff --git a/web-wallet/src/style/dusk-components/balance.css b/web-wallet/src/style/dusk-components/balance.css index 68a8c5ae19..80f0081f4b 100644 --- a/web-wallet/src/style/dusk-components/balance.css +++ b/web-wallet/src/style/dusk-components/balance.css @@ -1,6 +1,7 @@ .dusk-balance { display: flex; flex-direction: column; + text-align: center; } .dusk-balance__header > h2 { @@ -13,6 +14,7 @@ display: flex; align-items: center; gap: 0.5em; + justify-content: center; } .dusk-balance__dusk > strong { @@ -28,14 +30,14 @@ line-height: 150%; letter-spacing: -0.01em; visibility: hidden; + color: var(--muted-color); } .dusk-balance__fiat--visible > strong { visibility: unset; } -.dusk-icon.dusk-balance__icon { - width: 1.3125em; - height: 1.3125em; - flex-shrink: 0; +.dusk-balance__usage { + padding: 0.62em 0.75em; + margin-top: 0.62em; } diff --git a/web-wallet/src/style/dusk/language.css b/web-wallet/src/style/dusk/language.css index b26b9e0452..3e2115e67f 100644 --- a/web-wallet/src/style/dusk/language.css +++ b/web-wallet/src/style/dusk/language.css @@ -15,6 +15,7 @@ --success-color: var(--success-500); --success-color-variant-dark: var(--success-700); --warning-color: var(--warning); + --muted-color: var(--granite-grey); --on-background-color: var(--smokey-black); --on-primary-color: var(--light-grey); @@ -87,9 +88,9 @@ /* Progress bars */ - --progress-bar-height: 0.3125em; + --progress-bar-height: 0.6125em; --progress-bg-color: var(--primary-color); - --progress-filler-color: var(--success-color); + --progress-filler-color: var(--secondary-color); /* Steppers */ @@ -109,9 +110,15 @@ --checkbox-control-border-color: var(--smokey-black); --checkbox-control-checked-bg-color: var(--smokey-black); + /* Fieldset */ + --fieldset-background-color: var(--light-grey); + --fieldset-border-radius: 1.5em; + /* Dividers */ - --divider-color-primary: var(--taupe-grey); + --divider-color-primary: var(--smokey-black); + --divider-background-color: var(--light-gray); + --divider-border-color: var(--smokey-black); /* Home animation */ @@ -152,6 +159,16 @@ --checkbox-control-border-color: var(--light-grey); --checkbox-control-checked-bg-color: var(--light-grey); + /* Fieldset */ + + --fieldset-background-color: var(--smokey-black); + + /* Dividers */ + + --divider-color-primary: var(--magnolia); + --divider-background-color: var(--smokey-black); + --divider-border-color: var(--magnolia); + /* Home animation */ --home-grid-color: var(--smokey-black); diff --git a/web-wallet/src/style/main.css b/web-wallet/src/style/main.css index 3e99a04f9c..345fc9def8 100644 --- a/web-wallet/src/style/main.css +++ b/web-wallet/src/style/main.css @@ -92,6 +92,10 @@ svg { fill: currentColor; } +fieldset { + border: none; +} + #outer-container { background-color: var(--background-color); width: 60%; diff --git a/web-wallet/vite-setup.js b/web-wallet/vite-setup.js index 12341f1091..30bb82df0d 100644 --- a/web-wallet/vite-setup.js +++ b/web-wallet/vite-setup.js @@ -13,8 +13,24 @@ import "vitest-canvas-mock"; import { IntersectionObserver } from "./src/lib/dusk/mocks"; import Wallet from "./__mocks__/Wallet.js"; +// Mocking wallet connection modules +vi.mock("@wagmi/core"); +vi.mock("@web3modal/wagmi"); + +// Removing the console logging created by the walletConnect library after each test file +Object.defineProperty(window, "litIssuedWarnings", { + value: new Set([ + "Lit is in dev mode. Not recommended for production! See https://lit.dev/msg/dev-mode for more information.", + "Multiple versions of Lit loaded. Loading multiple versions is not recommended. See https://lit.dev/msg/multiple-versions for more information.", + ]), + writable: false, +}); + // Mocking the Wallet -vi.doMock("@dusk-network/dusk-wallet-js", () => ({ Wallet })); +vi.doMock("@dusk-network/dusk-wallet-js", async (importOriginal) => ({ + ...(await importOriginal()), + Wallet, +})); /* * Mocking deprecated `atob` and `btoa` functions in Node. diff --git a/web-wallet/vite.config.js b/web-wallet/vite.config.js index 64861c573a..f2f1b8c61b 100644 --- a/web-wallet/vite.config.js +++ b/web-wallet/vite.config.js @@ -48,6 +48,8 @@ export default defineConfig(({ mode }) => { TESTNET_NODE: env.VITE_TESTNET_NODE, TESTNET_PROVER_NODE: env.VITE_TESTNET_PROVER_NODE, TRANSFER_CONTRACT: env.VITE_TRANSFER_CONTRACT, + VITE_CONTRACT_ALLOCATE_DISABLED: env.VITE_CONTRACT_ALLOCATE_DISABLED, + VITE_CONTRACT_MIGRATE_DISABLED: env.VITE_CONTRACT_MIGRATE_DISABLED, VITE_CONTRACT_STAKE_DISABLED: env.VITE_CONTRACT_STAKE_DISABLED, VITE_CONTRACT_TRANSFER_DISABLED: env.VITE_CONTRACT_TRANSFER_DISABLED, VITE_GAS_LIMIT_DEFAULT: env.VITE_GAS_LIMIT_DEFAULT, @@ -58,8 +60,6 @@ export default defineConfig(({ mode }) => { VITE_GAS_PRICE_UPPER: env.VITE_GAS_PRICE_UPPER, VITE_GET_QUOTE_API_ENDPOINT: env.VITE_GET_QUOTE_API_ENDPOINT, VITE_MINIMUM_ALLOWED_STAKE: env.VITE_MINIMUM_ALLOWED_STAKE, - VITE_STAKING_ENABLED: env.VITE_STAKING_ENABLED, - VITE_TRANSFER_ENABLED: env.VITE_TRANSFER_ENABLED, }, }, plugins: @@ -98,6 +98,8 @@ export default defineConfig(({ mode }) => { "0200000000000000000000000000000000000000000000000000000000000000", TRANSFER_CONTRACT: "0100000000000000000000000000000000000000000000000000000000000000", + VITE_CONTRACT_ALLOCATE_DISABLED: "false", + VITE_CONTRACT_MIGRATE_DISABLED: "false", VITE_CONTRACT_STAKE_DISABLED: "false", VITE_CONTRACT_TRANSFER_DISABLED: "false", VITE_GAS_LIMIT_DEFAULT: "20000000",