From 50190a3c3f74566ee0602c9454a476491d15b4b3 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Sun, 18 Aug 2024 22:34:58 +0200 Subject: [PATCH 01/15] Introduce Nu7 --- zebra-chain/Cargo.toml | 3 ++- zebra-chain/src/block/commitment.rs | 4 ++-- zebra-chain/src/history_tree.rs | 4 ++-- zebra-chain/src/parameters/network.rs | 2 ++ zebra-chain/src/parameters/network/testnet.rs | 9 +++++++- .../src/parameters/network/tests/vectors.rs | 5 ++-- zebra-chain/src/parameters/network_upgrade.rs | 23 ++++++++++++++++--- zebra-chain/src/primitives/zcash_history.rs | 3 ++- zebra-chain/src/transaction/arbitrary.rs | 2 +- 9 files changed, 42 insertions(+), 13 deletions(-) diff --git a/zebra-chain/Cargo.toml b/zebra-chain/Cargo.toml index badeb6b699f..10c5ed926cd 100644 --- a/zebra-chain/Cargo.toml +++ b/zebra-chain/Cargo.toml @@ -179,4 +179,5 @@ harness = false [lints.rust] # TODO: Remove this once it's no longer needed for NU6. -unexpected_cfgs = { level = "warn", check-cfg = ['cfg(zcash_unstable, values("nu6"))'] } +# FIXME: TODO: What about NU7? +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(zcash_unstable, values("nu6", "nu7"))'] } diff --git a/zebra-chain/src/block/commitment.rs b/zebra-chain/src/block/commitment.rs index 2cb09e75b22..ec4ef7d2616 100644 --- a/zebra-chain/src/block/commitment.rs +++ b/zebra-chain/src/block/commitment.rs @@ -125,7 +125,7 @@ impl Commitment { // NetworkUpgrade::current() returns the latest network upgrade that's activated at the provided height, so // on Regtest for heights above height 0, it could return NU6, and it's possible for the current network upgrade // to be NU6 (or Canopy, or any network upgrade above Heartwood) at the Heartwood activation height. - (Canopy | Nu5 | Nu6, activation_height) + (Canopy | Nu5 | Nu6 | Nu7, activation_height) if height == activation_height && Some(height) == Heartwood.activation_height(network) => { @@ -136,7 +136,7 @@ impl Commitment { } } (Heartwood | Canopy, _) => Ok(ChainHistoryRoot(ChainHistoryMmrRootHash(bytes))), - (Nu5 | Nu6, _) => Ok(ChainHistoryBlockTxAuthCommitment( + (Nu5 | Nu6 | Nu7, _) => Ok(ChainHistoryBlockTxAuthCommitment( ChainHistoryBlockTxAuthCommitmentHash(bytes), )), } diff --git a/zebra-chain/src/history_tree.rs b/zebra-chain/src/history_tree.rs index 91fa3a17628..613bf0616d7 100644 --- a/zebra-chain/src/history_tree.rs +++ b/zebra-chain/src/history_tree.rs @@ -102,7 +102,7 @@ impl NonEmptyHistoryTree { )?; InnerHistoryTree::PreOrchard(tree) } - NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => { + NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => { let tree = Tree::::new_from_cache( network, network_upgrade, @@ -156,7 +156,7 @@ impl NonEmptyHistoryTree { )?; (InnerHistoryTree::PreOrchard(tree), entry) } - NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => { + NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => { let (tree, entry) = Tree::::new_from_block( network, block, diff --git a/zebra-chain/src/parameters/network.rs b/zebra-chain/src/parameters/network.rs index 8cec6c16c1e..6b793b4f634 100644 --- a/zebra-chain/src/parameters/network.rs +++ b/zebra-chain/src/parameters/network.rs @@ -136,10 +136,12 @@ impl Network { pub fn new_regtest( nu5_activation_height: Option, nu6_activation_height: Option, + nu7_activation_height: Option, ) -> Self { Self::new_configured_testnet(testnet::Parameters::new_regtest( nu5_activation_height, nu6_activation_height, + nu7_activation_height, )) } diff --git a/zebra-chain/src/parameters/network/testnet.rs b/zebra-chain/src/parameters/network/testnet.rs index 80cb8419c77..53ae14711c1 100644 --- a/zebra-chain/src/parameters/network/testnet.rs +++ b/zebra-chain/src/parameters/network/testnet.rs @@ -194,6 +194,9 @@ pub struct ConfiguredActivationHeights { /// Activation height for `NU6` network upgrade. #[serde(rename = "NU6")] pub nu6: Option, + /// Activation height for `NU7` network upgrade. + #[serde(rename = "NU7")] + pub nu7: Option, } /// Builder for the [`Parameters`] struct. @@ -314,6 +317,7 @@ impl ParametersBuilder { canopy, nu5, nu6, + nu7, }: ConfiguredActivationHeights, ) -> Self { use NetworkUpgrade::*; @@ -332,6 +336,7 @@ impl ParametersBuilder { .chain(canopy.into_iter().map(|h| (h, Canopy))) .chain(nu5.into_iter().map(|h| (h, Nu5))) .chain(nu6.into_iter().map(|h| (h, Nu6))) + .chain(nu7.into_iter().map(|h| (h, Nu7))) .map(|(h, nu)| (h.try_into().expect("activation height must be valid"), nu)) .collect(); @@ -519,6 +524,7 @@ impl Parameters { pub fn new_regtest( nu5_activation_height: Option, nu6_activation_height: Option, + nu7_activation_height: Option, ) -> Self { #[cfg(any(test, feature = "proptest-impl"))] let nu5_activation_height = nu5_activation_height.or(Some(100)); @@ -538,6 +544,7 @@ impl Parameters { canopy: Some(1), nu5: nu5_activation_height, nu6: nu6_activation_height, + nu7: nu7_activation_height, ..Default::default() }) .finish() @@ -568,7 +575,7 @@ impl Parameters { post_nu6_funding_streams, target_difficulty_limit, disable_pow, - } = Self::new_regtest(None, None); + } = Self::new_regtest(None, None, None); self.network_name == network_name && self.genesis_hash == genesis_hash diff --git a/zebra-chain/src/parameters/network/tests/vectors.rs b/zebra-chain/src/parameters/network/tests/vectors.rs index c839a26c116..4683a908d2b 100644 --- a/zebra-chain/src/parameters/network/tests/vectors.rs +++ b/zebra-chain/src/parameters/network/tests/vectors.rs @@ -109,6 +109,7 @@ fn activates_network_upgrades_correctly() { let expected_activation_height = 1; let network = testnet::Parameters::build() .with_activation_heights(ConfiguredActivationHeights { + // FIXME: nu7? nu6: Some(expected_activation_height), ..Default::default() }) @@ -147,7 +148,7 @@ fn activates_network_upgrades_correctly() { (Network::Mainnet, MAINNET_ACTIVATION_HEIGHTS), (Network::new_default_testnet(), TESTNET_ACTIVATION_HEIGHTS), ( - Network::new_regtest(None, None), + Network::new_regtest(None, None, None), expected_default_regtest_activation_heights, ), ] { @@ -198,7 +199,7 @@ fn check_configured_network_name() { "Mainnet should be displayed as 'Mainnet'" ); assert_eq!( - Network::new_regtest(None, None).to_string(), + Network::new_regtest(None, None, None).to_string(), "Regtest", "Regtest should be displayed as 'Regtest'" ); diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index 121a5bdcf13..74669a9b0fe 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -15,7 +15,7 @@ use hex::{FromHex, ToHex}; use proptest_derive::Arbitrary; /// A list of network upgrades in the order that they must be activated. -pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 9] = [ +pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 10] = [ Genesis, BeforeOverwinter, Overwinter, @@ -25,6 +25,7 @@ pub const NETWORK_UPGRADES_IN_ORDER: [NetworkUpgrade; 9] = [ Canopy, Nu5, Nu6, + Nu7, ]; /// A Zcash network upgrade. @@ -60,6 +61,8 @@ pub enum NetworkUpgrade { Nu5, /// The Zcash protocol after the NU6 upgrade. Nu6, + /// The Zcash protocol after the NU7 upgrade. + Nu7, } impl fmt::Display for NetworkUpgrade { @@ -90,6 +93,8 @@ pub(super) const MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(1_687_104), Nu5), // TODO: Add NU6 // (block::Height(2_726_400), Nu6), + // FIXME: TODO: Add NU7 with a correct value + // (block::Height(2_726_401), Nu7), ]; /// Fake mainnet network upgrade activation heights, used in tests. @@ -104,6 +109,7 @@ const FAKE_MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[ (block::Height(30), Canopy), (block::Height(35), Nu5), (block::Height(40), Nu6), + (block::Height(45), Nu7), ]; /// Testnet network upgrade activation heights. @@ -127,6 +133,8 @@ pub(super) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(1_842_420), Nu5), // TODO: Add NU6 // (block::Height(2_942_000), Nu6), + // FIXME: TODO: Add NU7 with a correct value + // (block::Height(2_942_001), Nu7), ]; /// Fake testnet network upgrade activation heights, used in tests. @@ -141,6 +149,7 @@ const FAKE_TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[ (block::Height(30), Canopy), (block::Height(35), Nu5), (block::Height(40), Nu6), + (block::Height(45), Nu7), ]; /// The Consensus Branch Id, used to bind transactions and blocks to a @@ -217,6 +226,8 @@ pub(crate) const CONSENSUS_BRANCH_IDS: &[(NetworkUpgrade, ConsensusBranchId)] = (Canopy, ConsensusBranchId(0xe9ff75a6)), (Nu5, ConsensusBranchId(0xc2d6d0b4)), (Nu6, ConsensusBranchId(0xc8e71055)), + // FIXME: use a proper value below + (Nu7, ConsensusBranchId(0xc8e71056)), ]; /// The target block spacing before Blossom. @@ -333,7 +344,8 @@ impl NetworkUpgrade { Heartwood => Some(Canopy), Canopy => Some(Nu5), Nu5 => Some(Nu6), - Nu6 => None, + Nu6 => Some(Nu7), + Nu7 => None, } } @@ -410,7 +422,9 @@ impl NetworkUpgrade { pub fn target_spacing(&self) -> Duration { let spacing_seconds = match self { Genesis | BeforeOverwinter | Overwinter | Sapling => PRE_BLOSSOM_POW_TARGET_SPACING, - Blossom | Heartwood | Canopy | Nu5 | Nu6 => POST_BLOSSOM_POW_TARGET_SPACING.into(), + Blossom | Heartwood | Canopy | Nu5 | Nu6 | Nu7 => { + POST_BLOSSOM_POW_TARGET_SPACING.into() + } }; Duration::seconds(spacing_seconds) @@ -533,6 +547,9 @@ impl From for NetworkUpgrade { zcash_protocol::consensus::NetworkUpgrade::Nu5 => Self::Nu5, #[cfg(zcash_unstable = "nu6")] zcash_protocol::consensus::NetworkUpgrade::Nu6 => Self::Nu6, + // FIXME: do we need the following cfg check? + #[cfg(zcash_unstable = "nu7")] + zcash_protocol::consensus::NetworkUpgrade::Nu7 => Self::Nu7, } } } diff --git a/zebra-chain/src/primitives/zcash_history.rs b/zebra-chain/src/primitives/zcash_history.rs index e8ca97d63f8..4b52c85d8e8 100644 --- a/zebra-chain/src/primitives/zcash_history.rs +++ b/zebra-chain/src/primitives/zcash_history.rs @@ -276,7 +276,8 @@ impl Version for zcash_history::V1 { NetworkUpgrade::Heartwood | NetworkUpgrade::Canopy | NetworkUpgrade::Nu5 - | NetworkUpgrade::Nu6 => zcash_history::NodeData { + | NetworkUpgrade::Nu6 + | NetworkUpgrade::Nu7 => zcash_history::NodeData { consensus_branch_id: branch_id.into(), subtree_commitment: block_hash, start_time: time, diff --git a/zebra-chain/src/transaction/arbitrary.rs b/zebra-chain/src/transaction/arbitrary.rs index cf4aa7a9552..0541bd7acd3 100644 --- a/zebra-chain/src/transaction/arbitrary.rs +++ b/zebra-chain/src/transaction/arbitrary.rs @@ -778,7 +778,7 @@ impl Arbitrary for Transaction { NetworkUpgrade::Blossom | NetworkUpgrade::Heartwood | NetworkUpgrade::Canopy => { Self::v4_strategy(ledger_state) } - NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => prop_oneof![ + NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => prop_oneof![ Self::v4_strategy(ledger_state.clone()), Self::v5_strategy(ledger_state) ] From 2d3845dc7230e4e81c5c2ffa42093dfbbf919acb Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 19 Aug 2024 07:51:31 +0200 Subject: [PATCH 02/15] Introduce Nu7 fo other crates of Zebra --- zebra-consensus/src/transaction.rs | 5 +++-- zebra-consensus/src/transaction/tests/prop.rs | 3 ++- zebra-network/src/config.rs | 17 +++++++++++------ zebra-network/src/protocol/external/types.rs | 3 +++ .../types/get_block_template/proposal.rs | 2 +- zebrad/tests/common/configs/v1.9.0.toml | 2 ++ 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/zebra-consensus/src/transaction.rs b/zebra-consensus/src/transaction.rs index 1c303003615..192f1413332 100644 --- a/zebra-consensus/src/transaction.rs +++ b/zebra-consensus/src/transaction.rs @@ -678,7 +678,8 @@ where | NetworkUpgrade::Heartwood | NetworkUpgrade::Canopy | NetworkUpgrade::Nu5 - | NetworkUpgrade::Nu6 => Ok(()), + | NetworkUpgrade::Nu6 + | NetworkUpgrade::Nu7 => Ok(()), // Does not support V4 transactions NetworkUpgrade::Genesis @@ -766,7 +767,7 @@ where // // Note: Here we verify the transaction version number of the above rule, the group // id is checked in zebra-chain crate, in the transaction serialize. - NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => Ok(()), + NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => Ok(()), // Does not support V5 transactions NetworkUpgrade::Genesis diff --git a/zebra-consensus/src/transaction/tests/prop.rs b/zebra-consensus/src/transaction/tests/prop.rs index f45b4731de0..3f57bbb74bf 100644 --- a/zebra-consensus/src/transaction/tests/prop.rs +++ b/zebra-consensus/src/transaction/tests/prop.rs @@ -344,7 +344,8 @@ fn sanitize_transaction_version( BeforeOverwinter => 2, Overwinter => 3, Sapling | Blossom | Heartwood | Canopy => 4, - Nu5 | Nu6 => 5, + // FIXME: Use 6 for Nu7 + Nu5 | Nu6 | Nu7 => 5, } }; diff --git a/zebra-network/src/config.rs b/zebra-network/src/config.rs index 00f4f8b4460..236608b11cc 100644 --- a/zebra-network/src/config.rs +++ b/zebra-network/src/config.rs @@ -722,12 +722,17 @@ impl<'de> Deserialize<'de> for Config { (NetworkKind::Mainnet, _) => Network::Mainnet, (NetworkKind::Testnet, None) => Network::new_default_testnet(), (NetworkKind::Regtest, testnet_parameters) => { - let (nu5_activation_height, nu6_activation_height) = testnet_parameters - .and_then(|params| params.activation_heights) - .map(|ConfiguredActivationHeights { nu5, nu6, .. }| (nu5, nu6)) - .unwrap_or_default(); - - Network::new_regtest(nu5_activation_height, nu6_activation_height) + let (nu5_activation_height, nu6_activation_height, nu7_activation_height) = + testnet_parameters + .and_then(|params| params.activation_heights) + .map(|ConfiguredActivationHeights { nu5, nu6, nu7, .. }| (nu5, nu6, nu7)) + .unwrap_or_default(); + + Network::new_regtest( + nu5_activation_height, + nu6_activation_height, + nu7_activation_height, + ) } ( NetworkKind::Testnet, diff --git a/zebra-network/src/protocol/external/types.rs b/zebra-network/src/protocol/external/types.rs index 7ac76d7670f..1c8c2fd3b2f 100644 --- a/zebra-network/src/protocol/external/types.rs +++ b/zebra-network/src/protocol/external/types.rs @@ -95,6 +95,9 @@ impl Version { (Mainnet, Nu5) => 170_100, (Testnet(params), Nu6) if params.is_default_testnet() => 170_050, (Mainnet, Nu6) => 170_100, + // FIXME: use proper values for Nu7 + (Testnet(params), Nu7) if params.is_default_testnet() => 170_051, + (Mainnet, Nu7) => 170_101, // It should be fine to reject peers with earlier network protocol versions on custom testnets for now. (Testnet(_params), _) => CURRENT_NETWORK_PROTOCOL_VERSION.0, diff --git a/zebra-rpc/src/methods/get_block_template_rpcs/types/get_block_template/proposal.rs b/zebra-rpc/src/methods/get_block_template_rpcs/types/get_block_template/proposal.rs index fc0805b533d..373ba2d7c20 100644 --- a/zebra-rpc/src/methods/get_block_template_rpcs/types/get_block_template/proposal.rs +++ b/zebra-rpc/src/methods/get_block_template_rpcs/types/get_block_template/proposal.rs @@ -217,7 +217,7 @@ pub fn proposal_block_from_template( | NetworkUpgrade::Blossom | NetworkUpgrade::Heartwood => panic!("pre-Canopy block templates not supported"), NetworkUpgrade::Canopy => chain_history_root.bytes_in_serialized_order().into(), - NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 => { + NetworkUpgrade::Nu5 | NetworkUpgrade::Nu6 | NetworkUpgrade::Nu7 => { block_commitments_hash.bytes_in_serialized_order().into() } }; diff --git a/zebrad/tests/common/configs/v1.9.0.toml b/zebrad/tests/common/configs/v1.9.0.toml index 11bcf62107a..93291298f98 100644 --- a/zebrad/tests/common/configs/v1.9.0.toml +++ b/zebrad/tests/common/configs/v1.9.0.toml @@ -73,6 +73,8 @@ Heartwood = 903_800 Canopy = 1_028_500 NU5 = 1_842_420 NU6 = 2_000_000 +# FIXME: Use a proper value for NU7. +NU7 = 2_000_001 [network.testnet_parameters.pre_nu6_funding_streams.height_range] start = 0 From d8964e714e6527ba6632b0b6451eab934baa8040 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 17 Oct 2024 11:05:59 +0200 Subject: [PATCH 03/15] Fix of new_regtest call (as it additionally needs Nu7 arg now) --- zebrad/tests/common/regtest.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zebrad/tests/common/regtest.rs b/zebrad/tests/common/regtest.rs index bf1cba697de..f7b571e5a09 100644 --- a/zebrad/tests/common/regtest.rs +++ b/zebrad/tests/common/regtest.rs @@ -43,7 +43,7 @@ pub(crate) async fn submit_blocks_test() -> Result<()> { let _init_guard = zebra_test::init(); info!("starting regtest submit_blocks test"); - let network = Network::new_regtest(None, None); + let network = Network::new_regtest(None, None, None); let mut config = os_assigned_rpc_port_config(false, &network)?; config.mempool.debug_enable_at_height = Some(0); From e8abddd11e856fe0d972b1bbf2c93949e2040e34 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 17 Oct 2024 13:15:21 +0200 Subject: [PATCH 04/15] Fix of new_regtest call (as it additionally needs Nu7 arg now) (2) --- zebra-consensus/src/checkpoint/list/tests.rs | 2 +- zebrad/tests/acceptance.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zebra-consensus/src/checkpoint/list/tests.rs b/zebra-consensus/src/checkpoint/list/tests.rs index 5a2fe803f3d..698eaf36082 100644 --- a/zebra-consensus/src/checkpoint/list/tests.rs +++ b/zebra-consensus/src/checkpoint/list/tests.rs @@ -237,7 +237,7 @@ fn checkpoint_list_load_hard_coded() -> Result<(), BoxError> { let _ = Mainnet.checkpoint_list(); let _ = Network::new_default_testnet().checkpoint_list(); - let _ = Network::new_regtest(None, None).checkpoint_list(); + let _ = Network::new_regtest(None, None, None).checkpoint_list(); Ok(()) } diff --git a/zebrad/tests/acceptance.rs b/zebrad/tests/acceptance.rs index cd3572ce3f2..c71cede4c3b 100644 --- a/zebrad/tests/acceptance.rs +++ b/zebrad/tests/acceptance.rs @@ -2907,7 +2907,7 @@ async fn fully_synced_rpc_z_getsubtreesbyindex_snapshot_test() -> Result<()> { async fn validate_regtest_genesis_block() { let _init_guard = zebra_test::init(); - let network = Network::new_regtest(None, None); + let network = Network::new_regtest(None, None, None); let state = zebra_state::init_test(&network); let ( block_verifier_router, @@ -2982,7 +2982,7 @@ async fn trusted_chain_sync_handles_forks_correctly() -> Result<()> { use zebra_state::{ReadResponse, Response}; let _init_guard = zebra_test::init(); - let mut config = os_assigned_rpc_port_config(false, &Network::new_regtest(None, None))?; + let mut config = os_assigned_rpc_port_config(false, &Network::new_regtest(None, None, None))?; config.state.ephemeral = false; let network = config.network.network.clone(); From 23d9e7754ae959f5f6d8174ad0f3d7bce927545d Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 17 Oct 2024 14:46:17 +0200 Subject: [PATCH 05/15] Set Nu7 as a network update for testnet in zebra-chain network tests --- zebra-chain/src/parameters/network/tests/vectors.rs | 3 +-- zebra-chain/src/parameters/network_upgrade.rs | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/zebra-chain/src/parameters/network/tests/vectors.rs b/zebra-chain/src/parameters/network/tests/vectors.rs index ca341184b8c..6c1426e4e0e 100644 --- a/zebra-chain/src/parameters/network/tests/vectors.rs +++ b/zebra-chain/src/parameters/network/tests/vectors.rs @@ -109,8 +109,7 @@ fn activates_network_upgrades_correctly() { let expected_activation_height = 1; let network = testnet::Parameters::build() .with_activation_heights(ConfiguredActivationHeights { - // FIXME: nu7? - nu6: Some(expected_activation_height), + nu7: Some(expected_activation_height), ..Default::default() }) .to_network(); diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index 845bbec981e..4ca8c6a8777 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -133,8 +133,8 @@ pub(super) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(1_028_500), Canopy), (block::Height(1_842_420), Nu5), (block::Height(2_976_000), Nu6), - // FIXME: TODO: Add NU7 with a correct value - // (block::Height(2_942_001), Nu7), + // FIXME: TODO: Set a correct value for NU7 + (block::Height(2_942_001), Nu7), ]; /// Fake testnet network upgrade activation heights, used in tests. From e0adb4ca39ea389589a729c1fc294b6658b7fd79 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 17 Oct 2024 15:14:51 +0200 Subject: [PATCH 06/15] Fix serde names for NU7 --- zebra-chain/src/parameters/network_upgrade.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index 4ca8c6a8777..325f2558b17 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -63,6 +63,7 @@ pub enum NetworkUpgrade { #[serde(rename = "NU6")] Nu6, /// The Zcash protocol after the NU7 upgrade. + #[serde(rename = "NU7")] Nu7, } From 0daf0ce05a5a9bdef648860862b35b0c001350e8 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Thu, 17 Oct 2024 15:19:20 +0200 Subject: [PATCH 07/15] Update test snapshot in zebra-rpc to use NU7 --- .../tests/snapshots/get_blockchain_info@testnet_10.snap | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap index 3bea6c01509..9d7ea3f5176 100644 --- a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap +++ b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap @@ -1,5 +1,6 @@ --- source: zebra-rpc/src/methods/tests/snapshot.rs +assertion_line: 562 expression: info --- { @@ -69,6 +70,11 @@ expression: info "name": "NU6", "activationheight": 2976000, "status": "pending" + }, + "c8e71056": { + "name": "NU7", + "activationheight": 2942001, + "status": "pending" } }, "consensus": { From 3cce4894d078252d1ec7d1a600d3e1297bc5b1a8 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:23:31 +0100 Subject: [PATCH 08/15] Refactor orchard_zsa modules to use IssueBundle serialization functions from librustzcash/zcash_primitives instead of reimplementing them --- zebra-chain/src/orchard_zsa.rs | 2 - zebra-chain/src/orchard_zsa/burn.rs | 20 ++- zebra-chain/src/orchard_zsa/common.rs | 23 --- zebra-chain/src/orchard_zsa/issuance.rs | 208 ++---------------------- 4 files changed, 28 insertions(+), 225 deletions(-) delete mode 100644 zebra-chain/src/orchard_zsa/common.rs diff --git a/zebra-chain/src/orchard_zsa.rs b/zebra-chain/src/orchard_zsa.rs index be3e29ec0e4..1fc878dbc34 100644 --- a/zebra-chain/src/orchard_zsa.rs +++ b/zebra-chain/src/orchard_zsa.rs @@ -4,8 +4,6 @@ #[cfg(any(test, feature = "proptest-impl"))] pub(crate) mod arbitrary; -mod common; - mod burn; mod issuance; diff --git a/zebra-chain/src/orchard_zsa/burn.rs b/zebra-chain/src/orchard_zsa/burn.rs index 812728b9380..0e0c007709b 100644 --- a/zebra-chain/src/orchard_zsa/burn.rs +++ b/zebra-chain/src/orchard_zsa/burn.rs @@ -5,12 +5,28 @@ use std::io; use crate::{ amount::Amount, block::MAX_BLOCK_BYTES, - serialization::{SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize}, + serialization::{ + ReadZcashExt, SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize, + }, }; use orchard::{note::AssetBase, value::NoteValue}; -use super::common::ASSET_BASE_SIZE; +// The size of the serialized AssetBase in bytes (used for TrustedPreallocate impls) +pub(super) const ASSET_BASE_SIZE: u64 = 32; + +impl ZcashSerialize for AssetBase { + fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { + writer.write_all(&self.to_bytes()) + } +} + +impl ZcashDeserialize for AssetBase { + fn zcash_deserialize(mut reader: R) -> Result { + Option::from(AssetBase::from_bytes(&reader.read_32_bytes()?)) + .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa AssetBase!")) + } +} // Sizes of the serialized values for types in bytes (used for TrustedPreallocate impls) const AMOUNT_SIZE: u64 = 8; diff --git a/zebra-chain/src/orchard_zsa/common.rs b/zebra-chain/src/orchard_zsa/common.rs deleted file mode 100644 index deb3969ced7..00000000000 --- a/zebra-chain/src/orchard_zsa/common.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Serialization implementation for selected types from the 'orchard_zsa' crate used in this module. - -use std::io; - -use crate::serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize}; - -use orchard::note::AssetBase; - -// The size of the serialized AssetBase in bytes (used for TrustedPreallocate impls) -pub(super) const ASSET_BASE_SIZE: u64 = 32; - -impl ZcashSerialize for AssetBase { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(&self.to_bytes()) - } -} - -impl ZcashDeserialize for AssetBase { - fn zcash_deserialize(mut reader: R) -> Result { - Option::from(AssetBase::from_bytes(&reader.read_32_bytes()?)) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa AssetBase!")) - } -} diff --git a/zebra-chain/src/orchard_zsa/issuance.rs b/zebra-chain/src/orchard_zsa/issuance.rs index 9f7b4e9faaf..d45f10253cd 100644 --- a/zebra-chain/src/orchard_zsa/issuance.rs +++ b/zebra-chain/src/orchard_zsa/issuance.rs @@ -2,36 +2,25 @@ use std::{fmt::Debug, io}; -use nonempty::NonEmpty; - -// FIXME: needed for "as_bool" only - consider to implement as_bool locally -use bitvec::macros::internal::funty::Fundamental; - -use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; - use halo2::pasta::pallas; // For pallas::Base::from_repr only use group::ff::PrimeField; +use zcash_primitives::transaction::components::issuance::{read_v6_bundle, write_v6_bundle}; + use orchard::{ issuance::{IssueAction, IssueBundle, Signed}, - keys::IssuanceValidatingKey, - note::{ExtractedNoteCommitment, RandomSeed, Rho}, - primitives::redpallas::{SigType, Signature, SpendAuth}, - value::NoteValue, - Address, Note, + note::ExtractedNoteCommitment, + Note, }; use crate::{ block::MAX_BLOCK_BYTES, - serialization::{ - zcash_serialize_bytes, zcash_serialize_empty_list, ReadZcashExt, SerializationError, - TrustedPreallocate, ZcashDeserialize, ZcashDeserializeInto, ZcashSerialize, - }, + serialization::{SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize}, }; -use super::common::ASSET_BASE_SIZE; +use super::burn::ASSET_BASE_SIZE; /// Wrapper for `IssueBundle` used in the context of Transaction V6. This allows the implementation of /// a Serde serializer for unit tests within this crate. @@ -70,126 +59,6 @@ const RANDOM_SEED_SIZE: u64 = 32; const NOTE_SIZE: u64 = ADDRESS_SIZE + NOTE_VALUE_SIZE + ASSET_BASE_SIZE + NULLIFIER_SIZE + RANDOM_SEED_SIZE; -// FIXME: duplicates ZcashSerialize for reddsa::Signature in transaction/serialize.rs -// (as Signature from oechard_zsa is formally a different type) -impl ZcashSerialize for Signature { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(&<[u8; 64]>::from(self))?; - Ok(()) - } -} - -// FIXME: duplicates ZcashDeserialize for reddsa::Signature in transaction/serialize.rs -// (as Signature from oechard_zsa is formally a different type) -impl ZcashDeserialize for Signature { - fn zcash_deserialize(mut reader: R) -> Result { - Ok(reader.read_64_bytes()?.into()) - } -} - -impl ZcashDeserialize for Signed { - fn zcash_deserialize(mut reader: R) -> Result { - let signature = Signature::::zcash_deserialize(&mut reader)?; - Ok(Signed::from_data((&signature).into())) - } -} - -impl ZcashSerialize for IssuanceValidatingKey { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(&self.to_bytes()) - } -} - -impl ZcashDeserialize for IssuanceValidatingKey { - fn zcash_deserialize(mut reader: R) -> Result { - IssuanceValidatingKey::from_bytes(&reader.read_32_bytes()?) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa IssuanceValidatingKey!")) - } -} - -impl ZcashSerialize for Address { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(&self.to_raw_address_bytes()) - } -} - -impl ZcashDeserialize for Address { - fn zcash_deserialize(mut reader: R) -> Result { - let mut bytes = [0u8; ADDRESS_SIZE as usize]; - reader.read_exact(&mut bytes)?; - Option::from(Address::from_raw_address_bytes(&bytes)) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Address!")) - } -} - -impl ZcashSerialize for Rho { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(&self.to_bytes()) - } -} - -impl ZcashDeserialize for Rho { - fn zcash_deserialize(mut reader: R) -> Result { - Option::from(Rho::from_bytes(&reader.read_32_bytes()?)) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Rho!")) - } -} - -impl ZcashSerialize for RandomSeed { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_all(self.as_bytes()) - } -} - -// RandomSeed::zcash_deserialize can't be implemented and used as it requires Nullifier parameter. -// That's why we need to have this function. -fn zcash_deserialize_random_seed( - mut reader: R, - rho: &Rho, -) -> Result { - Option::from(RandomSeed::from_bytes(reader.read_32_bytes()?, rho)) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa RandomSeed!")) -} - -impl ZcashSerialize for NoteValue { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - // FIXME: use Amount serializer/deserializer? - writer.write_u64::(self.inner())?; - Ok(()) - } -} - -impl ZcashDeserialize for NoteValue { - fn zcash_deserialize(mut reader: R) -> Result { - Ok(NoteValue::from_raw(reader.read_u64::()?)) - } -} - -impl ZcashSerialize for Note { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - self.recipient().zcash_serialize(&mut writer)?; - self.value().zcash_serialize(&mut writer)?; - self.asset().zcash_serialize(&mut writer)?; - self.rho().zcash_serialize(&mut writer)?; - self.rseed().zcash_serialize(&mut writer)?; - - Ok(()) - } -} - -impl ZcashDeserialize for Note { - fn zcash_deserialize(mut reader: R) -> Result { - let recipient = (&mut reader).zcash_deserialize_into()?; - let value = (&mut reader).zcash_deserialize_into()?; - let asset = (&mut reader).zcash_deserialize_into()?; - let rho = (&mut reader).zcash_deserialize_into()?; - let rseed = zcash_deserialize_random_seed(&mut reader, &rho)?; - - Option::from(Note::from_parts(recipient, value, asset, rho, rseed)) - .ok_or_else(|| SerializationError::Parse("Invalid orchard_zsa Note components!")) - } -} - impl TrustedPreallocate for Note { fn max_allocation() -> u64 { // FIXME: is this a correct calculation way? @@ -199,24 +68,6 @@ impl TrustedPreallocate for Note { } } -impl ZcashSerialize for IssueAction { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - writer.write_u8(self.is_finalized().as_u8())?; - self.notes().to_vec().zcash_serialize(&mut writer)?; - zcash_serialize_bytes(&self.asset_desc().to_vec(), &mut writer)?; - Ok(()) - } -} - -impl ZcashDeserialize for IssueAction { - fn zcash_deserialize(mut reader: R) -> Result { - let finalize = reader.read_u8()?.as_bool(); - let notes = (&mut reader).zcash_deserialize_into()?; - let asset_descr = (&mut reader).zcash_deserialize_into()?; - Ok(IssueAction::from_parts(asset_descr, notes, finalize)) - } -} - impl TrustedPreallocate for IssueAction { fn max_allocation() -> u64 { // FIXME: impl correct calculation @@ -224,56 +75,17 @@ impl TrustedPreallocate for IssueAction { } } -impl ZcashSerialize for IssueBundle { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - // FIXME: try to avoid transforming to Vec (consider implementation of ZcashSerialize for IntoIter generic, - // or use AtLeastOne). - // This is how does it work in librustzcash: - // Vector::write_nonempty(&mut writer, bundle.actions(), |w, action| write_action(action, w))?; - let actions: Vec<_> = self.actions().clone().into(); - - actions.zcash_serialize(&mut writer)?; - self.ik().zcash_serialize(&mut writer)?; - writer.write_all(&<[u8; 64]>::from(self.authorization().signature()))?; - Ok(()) - } -} - impl ZcashSerialize for Option { - fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { - match self { - None => { - // Denoted as `&Option` in the spec (ZIP 230). - zcash_serialize_empty_list(writer)?; - } - Some(issue_data) => { - issue_data.0.zcash_serialize(&mut writer)?; - } - } - Ok(()) + fn zcash_serialize(&self, writer: W) -> Result<(), io::Error> { + write_v6_bundle(self.as_ref().map(|issue_data| &issue_data.0), writer) } } // FIXME: We can't split IssueData out of Option deserialization, // because the counts are read along with the arrays. impl ZcashDeserialize for Option { - fn zcash_deserialize(mut reader: R) -> Result { - let actions: Vec<_> = (&mut reader).zcash_deserialize_into()?; - - if actions.is_empty() { - Ok(None) - } else { - let ik = (&mut reader).zcash_deserialize_into()?; - let authorization = (&mut reader).zcash_deserialize_into()?; - - Ok(Some(IssueData(IssueBundle::from_parts( - ik, - NonEmpty::from_vec(actions).ok_or_else(|| { - SerializationError::Parse("Invalid orchard_zsa IssueData - no actions!") - })?, - authorization, - )))) - } + fn zcash_deserialize(reader: R) -> Result { + Ok(read_v6_bundle(reader)?.map(IssueData)) } } From ce6c5c36ff6d799a449d8f4ac27e4482a8182ee7 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:27:27 +0100 Subject: [PATCH 09/15] Fix the orchard::ShieldedData serialization/deserialization functions to use the correct order of the asset burn field in V6 transaction as it's defined in ZIP 230 --- zebra-chain/src/transaction/serialize.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index 42743881bd5..b3ed12ebd7d 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -376,13 +376,13 @@ impl ZcashSerialize for orchard::ShieldedData { // Denoted as `vSpendAuthSigsOrchard` in the spec. zcash_serialize_external_count(&sigs, &mut writer)?; - // Denoted as `bindingSigOrchard` in the spec. - self.binding_sig.zcash_serialize(&mut writer)?; - #[cfg(feature = "tx-v6")] // Denoted as `vAssetBurn` in the spec (ZIP 230). self.burn.zcash_serialize(&mut writer)?; + // Denoted as `bindingSigOrchard` in the spec. + self.binding_sig.zcash_serialize(&mut writer)?; + Ok(()) } } @@ -434,6 +434,10 @@ impl ZcashDeserialize for Option> let sigs: Vec> = zcash_deserialize_external_count(actions.len(), &mut reader)?; + // TODO: FIXME: add a proper comment + #[cfg(feature = "tx-v6")] + let burn = (&mut reader).zcash_deserialize_into()?; + // Denoted as `bindingSigOrchard` in the spec. let binding_sig: Signature = (&mut reader).zcash_deserialize_into()?; @@ -448,10 +452,6 @@ impl ZcashDeserialize for Option> let actions: AtLeastOne> = authorized_actions.try_into()?; - // TODO: FIXME: add a proper comment - #[cfg(feature = "tx-v6")] - let burn = (&mut reader).zcash_deserialize_into()?; - Ok(Some(orchard::ShieldedData:: { flags, value_balance, From 22349e59c4905fb14d4974f8b4d57396b4925f34 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:28:36 +0100 Subject: [PATCH 10/15] Add ENABLE_ZSA flag to Flags for the orchard ShieldedData --- zebra-chain/src/orchard/shielded_data.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zebra-chain/src/orchard/shielded_data.rs b/zebra-chain/src/orchard/shielded_data.rs index baf98da8c42..844c1ff3994 100644 --- a/zebra-chain/src/orchard/shielded_data.rs +++ b/zebra-chain/src/orchard/shielded_data.rs @@ -313,6 +313,9 @@ bitflags! { const ENABLE_SPENDS = 0b00000001; /// Enable creating new non-zero valued Orchard notes. const ENABLE_OUTPUTS = 0b00000010; + /// Enable ZSA transaction (otherwise all notes within actions must use native asset). + // FIXME: Should we use this flag explicitly anywhere in Zebra? + const ENABLE_ZSA = 0b00000100; } } From 46f81bcf4713902a38b5e497bf88fc7637a6ece3 Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:30:12 +0100 Subject: [PATCH 11/15] Fix TX_V6_VERSION_GROUP_ID constant value to adjust it with the value used in librustzcash --- zebra-chain/src/parameters/transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zebra-chain/src/parameters/transaction.rs b/zebra-chain/src/parameters/transaction.rs index d7391bdf184..bfb3c8ca7c7 100644 --- a/zebra-chain/src/parameters/transaction.rs +++ b/zebra-chain/src/parameters/transaction.rs @@ -18,4 +18,4 @@ pub const TX_V5_VERSION_GROUP_ID: u32 = 0x26A7_270A; /// group ID. // FIXME: use a proper value! #[cfg(feature = "tx-v6")] -pub const TX_V6_VERSION_GROUP_ID: u32 = 0x26A7_270B; +pub const TX_V6_VERSION_GROUP_ID: u32 = 0x124A_69F8; From 408c15531ee57192e64aed79039b212bda8a419a Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:32:03 +0100 Subject: [PATCH 12/15] Add a value for Nu7 to CONSENSUS_BRANCH_IDS (a placeholder values for now - the same as used in librustzcash to make it possible to run tests) --- zebra-chain/src/parameters/network_upgrade.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index aad1d19e2a5..1eade62208c 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -227,7 +227,7 @@ pub(crate) const CONSENSUS_BRANCH_IDS: &[(NetworkUpgrade, ConsensusBranchId)] = (Nu5, ConsensusBranchId(0xc2d6d0b4)), (Nu6, ConsensusBranchId(0xc8e71055)), // FIXME: use a proper value below - (Nu7, ConsensusBranchId(0xc8e71056)), + (Nu7, ConsensusBranchId(0x77777777)), ]; /// The target block spacing before Blossom. From c6a3dd48d21cfb9cb7c8a681308ccb60e0d1f11e Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:34:43 +0100 Subject: [PATCH 13/15] Add a test vector with an issuance block to orchard_zsa module, also add issuance_block test function there (now it simply deserialized issuance block from the test vector to check if deserialization functions work properly) --- zebra-chain/src/orchard_zsa.rs | 3 + zebra-chain/src/orchard_zsa/tests.rs | 2 + zebra-chain/src/orchard_zsa/tests/issuance.rs | 9 + zebra-chain/src/orchard_zsa/tests/vectors.rs | 3 + .../src/orchard_zsa/tests/vectors/blocks.rs | 703 ++++++++++++++++++ 5 files changed, 720 insertions(+) create mode 100644 zebra-chain/src/orchard_zsa/tests.rs create mode 100644 zebra-chain/src/orchard_zsa/tests/issuance.rs create mode 100644 zebra-chain/src/orchard_zsa/tests/vectors.rs create mode 100644 zebra-chain/src/orchard_zsa/tests/vectors/blocks.rs diff --git a/zebra-chain/src/orchard_zsa.rs b/zebra-chain/src/orchard_zsa.rs index 1fc878dbc34..91445ebf949 100644 --- a/zebra-chain/src/orchard_zsa.rs +++ b/zebra-chain/src/orchard_zsa.rs @@ -4,6 +4,9 @@ #[cfg(any(test, feature = "proptest-impl"))] pub(crate) mod arbitrary; +#[cfg(test)] +mod tests; + mod burn; mod issuance; diff --git a/zebra-chain/src/orchard_zsa/tests.rs b/zebra-chain/src/orchard_zsa/tests.rs new file mode 100644 index 00000000000..a9301a7461e --- /dev/null +++ b/zebra-chain/src/orchard_zsa/tests.rs @@ -0,0 +1,2 @@ +mod issuance; +mod vectors; diff --git a/zebra-chain/src/orchard_zsa/tests/issuance.rs b/zebra-chain/src/orchard_zsa/tests/issuance.rs new file mode 100644 index 00000000000..902af757adf --- /dev/null +++ b/zebra-chain/src/orchard_zsa/tests/issuance.rs @@ -0,0 +1,9 @@ +use crate::{block::Block, serialization::ZcashDeserialize}; + +use super::vectors::BLOCKS; + +#[test] +fn issuance_block() { + let issuance_block = + Block::zcash_deserialize(BLOCKS[0].as_ref()).expect("issuance block should deserialize"); +} diff --git a/zebra-chain/src/orchard_zsa/tests/vectors.rs b/zebra-chain/src/orchard_zsa/tests/vectors.rs new file mode 100644 index 00000000000..d5664e50b19 --- /dev/null +++ b/zebra-chain/src/orchard_zsa/tests/vectors.rs @@ -0,0 +1,3 @@ +mod blocks; + +pub(crate) use blocks::BLOCKS; diff --git a/zebra-chain/src/orchard_zsa/tests/vectors/blocks.rs b/zebra-chain/src/orchard_zsa/tests/vectors/blocks.rs new file mode 100644 index 00000000000..222f1e3c201 --- /dev/null +++ b/zebra-chain/src/orchard_zsa/tests/vectors/blocks.rs @@ -0,0 +1,703 @@ +pub(crate) const BLOCKS: [&[u8]; 1] = [&[ + 0x04, 0x00, 0x00, 0x00, 0x27, 0xe3, 0x01, 0x34, 0xd6, 0x20, 0xe9, 0xfe, 0x61, 0xf7, 0x19, 0x93, + 0xb2, 0xc2, 0x72, 0x75, 0x6a, 0xce, 0xec, 0xdc, 0xbf, 0xd3, 0xe5, 0x43, 0xf7, 0x30, 0xbc, 0x65, + 0x83, 0x20, 0xba, 0xb6, 0x3e, 0x7e, 0x72, 0xc9, 0x1b, 0x5e, 0x23, 0x02, 0x56, 0x76, 0xf9, 0x0e, + 0xd8, 0x11, 0x9f, 0x02, 0x77, 0x8a, 0xa0, 0x8d, 0x1a, 0x56, 0x79, 0x47, 0x66, 0x88, 0xbf, 0x6e, + 0x8e, 0x5a, 0x4f, 0x57, 0x00, 0x23, 0xde, 0x3e, 0xf1, 0x3a, 0x05, 0xe5, 0x9d, 0x2e, 0x94, 0x76, + 0x6a, 0x3c, 0x7a, 0x94, 0x88, 0x5d, 0x72, 0x57, 0x04, 0x56, 0x3c, 0x74, 0xd1, 0x7a, 0xbd, 0xf7, + 0x53, 0x53, 0xdb, 0x1a, 0xf2, 0xfa, 0x49, 0x4d, 0x3f, 0xa6, 0x0c, 0x20, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xfd, 0x40, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x80, 0x85, 0x20, 0x2f, 0x89, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x51, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x40, 0xbe, 0x40, 0x25, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, + 0x14, 0x75, 0xdd, 0x6d, 0x7f, 0x4b, 0xef, 0x95, 0xaa, 0x1f, 0xf1, 0xa7, 0x11, 0xe5, 0xbf, 0xd8, + 0x53, 0xb4, 0xc6, 0xaa, 0xf8, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x80, 0xf8, 0x69, + 0x4a, 0x12, 0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x64, 0x40, 0xa8, 0x86, 0x5d, 0x61, 0x39, 0xb3, 0x39, 0x62, 0x94, 0xee, 0x42, + 0xc5, 0xa6, 0x0b, 0x63, 0x57, 0xca, 0x65, 0x8b, 0xa6, 0x76, 0xf2, 0xd6, 0xda, 0x8e, 0x00, 0xcf, + 0x60, 0xe8, 0x33, 0xa4, 0x55, 0xec, 0x7c, 0x99, 0x0f, 0xda, 0xd2, 0x46, 0xc0, 0x5b, 0x4a, 0x8f, + 0xe5, 0x2c, 0x6a, 0xb7, 0x00, 0xca, 0x49, 0xb4, 0xda, 0x80, 0xd3, 0x3d, 0x4d, 0x83, 0x7a, 0xd1, + 0x3a, 0x21, 0x3f, 0xfe, 0x71, 0xf5, 0x04, 0xd3, 0xaf, 0xeb, 0x10, 0x9d, 0xc2, 0x0d, 0xbd, 0x3a, + 0x9b, 0x2d, 0xf7, 0x7c, 0xd3, 0x2c, 0x7e, 0x7b, 0xeb, 0xb7, 0xaf, 0x60, 0xe4, 0xd3, 0x41, 0x96, + 0xe7, 0x2c, 0x0a, 0xf8, 0x99, 0x89, 0xbd, 0x70, 0x79, 0x54, 0x3b, 0xc7, 0x66, 0x29, 0x91, 0x31, + 0x97, 0xa6, 0x53, 0xfe, 0x24, 0x70, 0xf9, 0xf2, 0x41, 0x81, 0xac, 0x79, 0x60, 0x43, 0x79, 0xed, + 0x42, 0xba, 0x25, 0xdd, 0xf0, 0x05, 0xe8, 0xff, 0x14, 0x9e, 0xe8, 0x34, 0x91, 0x5d, 0xc6, 0x9d, + 0x6a, 0x2f, 0xc5, 0x70, 0x55, 0x65, 0x01, 0xf3, 0x74, 0x6f, 0xe7, 0x37, 0x4a, 0x8f, 0x5d, 0x4d, + 0xb6, 0x4e, 0x3b, 0xab, 0xc5, 0xc9, 0xa2, 0x86, 0x28, 0x0e, 0xa6, 0x2d, 0xc0, 0xc4, 0x12, 0x74, + 0xe9, 0x39, 0x34, 0xa6, 0xd8, 0xbc, 0x24, 0xdf, 0x5a, 0x2b, 0x2d, 0xd3, 0xae, 0x62, 0x2f, 0x37, + 0x38, 0xcb, 0x41, 0x26, 0xa5, 0xae, 0xed, 0x94, 0x84, 0x51, 0xc2, 0xe7, 0xff, 0xbe, 0x27, 0x7b, + 0x37, 0x94, 0xc0, 0xb5, 0x17, 0x08, 0x0a, 0x00, 0xd4, 0x69, 0x74, 0x8f, 0x4e, 0x2c, 0xeb, 0x06, + 0x2f, 0x1d, 0x61, 0xdc, 0x70, 0xab, 0x97, 0xc9, 0xbd, 0x02, 0x68, 0xf0, 0xe1, 0x5e, 0xcb, 0x76, + 0x25, 0x2c, 0x2c, 0xd2, 0xf1, 0x8a, 0x03, 0xb3, 0x2f, 0x0b, 0x40, 0xa2, 0x56, 0xc4, 0x3a, 0xd0, + 0xf7, 0xc4, 0xef, 0x98, 0x52, 0x87, 0x54, 0x5b, 0x8e, 0xf8, 0xb3, 0x6e, 0x3d, 0x9e, 0xd6, 0x05, + 0xb9, 0x49, 0x54, 0x1b, 0xe0, 0xbc, 0xe7, 0x52, 0x71, 0x6c, 0x70, 0xdb, 0x0c, 0xf2, 0x06, 0x9e, + 0x80, 0x90, 0xde, 0x83, 0x0e, 0x8c, 0xee, 0xa3, 0x36, 0x99, 0xf0, 0xa8, 0x29, 0x58, 0x9e, 0xa8, + 0x4c, 0x90, 0x0d, 0x66, 0x06, 0xf9, 0x95, 0x21, 0x65, 0xa4, 0x90, 0x58, 0x9f, 0x61, 0x66, 0x25, + 0x8b, 0x7b, 0x13, 0xa1, 0x6b, 0x9c, 0xf4, 0x80, 0xfb, 0x34, 0xd1, 0x0f, 0x52, 0x2d, 0xbd, 0x2a, + 0xcd, 0x16, 0x7b, 0x7d, 0xd0, 0x6c, 0x4d, 0x2d, 0xbb, 0x51, 0x90, 0x7d, 0x4d, 0x38, 0xbe, 0x06, + 0x95, 0x18, 0xd4, 0x31, 0x6d, 0xa4, 0x67, 0xca, 0xe5, 0x35, 0x51, 0xaa, 0xb4, 0x33, 0x46, 0x67, + 0xc0, 0xa5, 0xb7, 0x07, 0x63, 0x64, 0xe8, 0x42, 0x8e, 0x81, 0xf4, 0xc4, 0xcb, 0xde, 0x44, 0xe8, + 0xf1, 0x80, 0xca, 0x7a, 0x70, 0x33, 0x64, 0xaa, 0x4d, 0x50, 0xaf, 0xf3, 0x24, 0x27, 0xc4, 0x23, + 0xfb, 0xf8, 0x47, 0x61, 0x83, 0x5c, 0x31, 0xeb, 0x69, 0x73, 0x64, 0x4c, 0xe3, 0x8e, 0x24, 0x40, + 0xd9, 0xe0, 0x46, 0x17, 0xbc, 0x0b, 0xa0, 0xcd, 0x8d, 0x14, 0x96, 0x57, 0x21, 0x71, 0x97, 0x9c, + 0xa7, 0x5b, 0x28, 0xb7, 0x5b, 0x71, 0xd2, 0x7b, 0x77, 0x83, 0x09, 0x3a, 0xc4, 0x9c, 0x37, 0x38, + 0xfb, 0xdf, 0xe1, 0xf9, 0xc7, 0x29, 0xe0, 0x50, 0xbb, 0xfd, 0x7b, 0xa1, 0x53, 0xe5, 0x3b, 0x85, + 0x61, 0x21, 0x66, 0xf0, 0xa2, 0xb7, 0x65, 0x77, 0xd4, 0x5f, 0x0f, 0xf8, 0x5f, 0x4c, 0x6a, 0x90, + 0x03, 0xc1, 0x2f, 0x8c, 0x95, 0xa4, 0x36, 0x88, 0x51, 0x43, 0xd9, 0xa8, 0x78, 0x7f, 0x36, 0xb2, + 0x27, 0x2f, 0x2c, 0xd0, 0x21, 0xdc, 0x6a, 0x3f, 0x34, 0xdf, 0xac, 0x94, 0xf2, 0x8f, 0x13, 0x2e, + 0x3d, 0x2a, 0x4a, 0xf0, 0xdc, 0xa4, 0x1c, 0xc8, 0x59, 0x7e, 0xa0, 0x88, 0x7c, 0x02, 0x06, 0xf1, + 0xbe, 0x5a, 0xae, 0xc4, 0xf7, 0x72, 0x46, 0x97, 0xd9, 0x4b, 0x47, 0x9f, 0x9b, 0x93, 0x93, 0x71, + 0x8d, 0x80, 0xf7, 0xaf, 0xc7, 0xf9, 0xc9, 0x84, 0xd5, 0x9e, 0x87, 0x0f, 0x64, 0x33, 0x1f, 0xd6, + 0xf5, 0x90, 0x2d, 0x3a, 0xc3, 0x59, 0xf5, 0x25, 0xe6, 0xa5, 0xda, 0xf4, 0x21, 0x24, 0x9d, 0xdb, + 0x69, 0x86, 0x93, 0xec, 0x7d, 0x9b, 0xfd, 0x71, 0x19, 0xab, 0x05, 0xb6, 0xfd, 0x5c, 0x6b, 0x17, + 0x7e, 0xe5, 0xc4, 0x10, 0x38, 0xd7, 0x9b, 0x84, 0x94, 0x0d, 0xf1, 0xf5, 0xe6, 0x79, 0x84, 0x3c, + 0x04, 0x84, 0x2c, 0x6a, 0x62, 0xcf, 0xd6, 0x2f, 0xd0, 0x1b, 0xcc, 0xc2, 0xc8, 0x2a, 0x67, 0x34, + 0x52, 0xae, 0x88, 0x48, 0x47, 0x5f, 0x61, 0x4d, 0xba, 0x6c, 0x53, 0xf1, 0x8b, 0x12, 0x54, 0xcc, + 0xf0, 0x77, 0x89, 0x72, 0x98, 0x97, 0xed, 0x2e, 0xfa, 0xef, 0x0b, 0x54, 0x69, 0x02, 0x69, 0x15, + 0xa6, 0x5f, 0x11, 0xed, 0x04, 0x58, 0x02, 0x46, 0xc4, 0xdc, 0x9c, 0xb6, 0xe1, 0xc8, 0xd8, 0xdc, + 0xa3, 0x99, 0xea, 0x17, 0x96, 0x74, 0x7b, 0x5f, 0xeb, 0x00, 0x02, 0x91, 0x04, 0x9e, 0xf4, 0xff, + 0x6d, 0x0b, 0x29, 0x82, 0x37, 0x1a, 0x4c, 0xa0, 0x71, 0x71, 0x20, 0xaf, 0xe4, 0x3b, 0x6e, 0x26, + 0xb1, 0x89, 0x56, 0xb3, 0xb6, 0x44, 0x2d, 0x2b, 0xb4, 0x6f, 0x22, 0xe4, 0x5d, 0xd8, 0x7d, 0x25, + 0x60, 0xe7, 0xf4, 0xab, 0x87, 0x0b, 0x97, 0x0a, 0xd4, 0x82, 0x48, 0x93, 0x0f, 0x1d, 0xcc, 0xc7, + 0x69, 0xee, 0xc7, 0xcf, 0x5d, 0x9b, 0xbe, 0x9f, 0x23, 0x4b, 0x06, 0x49, 0x88, 0xf5, 0xbd, 0xb5, + 0xc3, 0xed, 0x46, 0x2a, 0x17, 0xc8, 0x5c, 0x4e, 0xa4, 0x56, 0xf3, 0x62, 0x28, 0xe7, 0xd1, 0x66, + 0x15, 0x1c, 0xeb, 0x62, 0xc1, 0x64, 0xee, 0xb6, 0x98, 0x7a, 0x9e, 0x40, 0xaa, 0xa2, 0x7d, 0xca, + 0xb6, 0xf3, 0x82, 0x6d, 0x65, 0xfb, 0x82, 0x57, 0xd2, 0x64, 0xc8, 0xb8, 0x15, 0x1b, 0x68, 0x94, + 0x90, 0x7a, 0xd5, 0xd7, 0xe6, 0x42, 0x99, 0x6f, 0x46, 0xc8, 0x3d, 0x9e, 0x5d, 0x85, 0x00, 0x7b, + 0xed, 0x53, 0xde, 0x27, 0xa4, 0x66, 0x3f, 0xa3, 0xc2, 0xf8, 0x89, 0x69, 0x8a, 0xac, 0xcc, 0x15, + 0x5e, 0xdd, 0x63, 0xda, 0xe3, 0x5a, 0x1f, 0xe9, 0x81, 0x60, 0x20, 0x60, 0xc1, 0xf9, 0xbb, 0x71, + 0x87, 0x77, 0x79, 0xe0, 0x90, 0x3d, 0xef, 0x49, 0xa9, 0xf7, 0x66, 0x70, 0x6f, 0x80, 0x88, 0xbe, + 0x89, 0x73, 0x99, 0x3e, 0xb1, 0xf9, 0xd6, 0xe7, 0xb1, 0x9f, 0x3e, 0xfe, 0x39, 0xed, 0x36, 0x18, + 0xee, 0xc3, 0x41, 0xbb, 0x69, 0x9a, 0x8b, 0xb1, 0x13, 0x2d, 0xd5, 0xab, 0xb7, 0xb6, 0x3b, 0xed, + 0xdf, 0x5b, 0x08, 0xde, 0x7d, 0xe5, 0x5d, 0xfa, 0x32, 0x91, 0x78, 0x03, 0x87, 0x77, 0x85, 0xc2, + 0x92, 0x66, 0x51, 0x83, 0xdb, 0xa8, 0x3f, 0xce, 0x17, 0xaa, 0xf5, 0xbb, 0x1e, 0x5c, 0x5f, 0x2e, + 0xb6, 0x6c, 0x6d, 0x1a, 0x98, 0x84, 0xe4, 0x69, 0x44, 0x9a, 0xf5, 0x6e, 0xd8, 0xd4, 0xc9, 0xd3, + 0x42, 0x18, 0xca, 0x80, 0x1c, 0x71, 0x8c, 0x62, 0x79, 0x59, 0xd9, 0x3b, 0xf3, 0xba, 0x90, 0x6b, + 0x36, 0x2a, 0x7c, 0xf8, 0xd3, 0xf4, 0xaa, 0xd9, 0x17, 0x59, 0xb1, 0xe6, 0x5a, 0x50, 0xcb, 0x0b, + 0x6b, 0x19, 0x0c, 0xe0, 0x5e, 0x67, 0x09, 0x42, 0x53, 0x71, 0x8b, 0xc2, 0x4e, 0x46, 0xc3, 0xff, + 0xf1, 0x45, 0x2b, 0x81, 0x52, 0x3b, 0xb4, 0x59, 0x20, 0xdc, 0x24, 0xea, 0xa5, 0xe7, 0xfc, 0x19, + 0xc2, 0xeb, 0x8c, 0x91, 0x99, 0x0a, 0x87, 0x43, 0xa7, 0x4c, 0x3e, 0x5a, 0xd7, 0x71, 0x5e, 0x3f, + 0x7c, 0xd0, 0x2f, 0x1a, 0xc0, 0xac, 0x73, 0xcf, 0xfc, 0x0a, 0x85, 0xe8, 0xd6, 0xb1, 0xa2, 0xe0, + 0x2e, 0x7a, 0xa8, 0x68, 0x68, 0x0a, 0x7d, 0x73, 0xd0, 0xc7, 0x6a, 0x3e, 0x7b, 0x6b, 0x6a, 0x28, + 0x59, 0x7a, 0x29, 0x85, 0x84, 0x04, 0xbb, 0x7c, 0x5b, 0x8f, 0x68, 0x6f, 0xb7, 0x3e, 0xbf, 0xca, + 0x97, 0x62, 0x7a, 0x73, 0xf3, 0xe3, 0x23, 0x39, 0xa6, 0xb1, 0x71, 0xd0, 0x4e, 0xb5, 0x7a, 0x29, + 0x51, 0xc9, 0x40, 0x45, 0x2f, 0x25, 0x58, 0x0c, 0x71, 0x61, 0x9c, 0x73, 0x99, 0xc8, 0xab, 0xee, + 0x67, 0x0d, 0x97, 0xd3, 0xdc, 0xa0, 0x90, 0x3b, 0xc2, 0x91, 0x07, 0x1f, 0xf0, 0xe9, 0x97, 0xa9, + 0xb5, 0x46, 0xdc, 0x63, 0xfc, 0xa3, 0x24, 0x1f, 0xeb, 0xa8, 0x85, 0x66, 0x9a, 0xaf, 0x0f, 0x37, + 0xe0, 0x8e, 0x01, 0x32, 0x35, 0xdb, 0xbe, 0xa3, 0xbe, 0xf6, 0x2f, 0x1a, 0xd8, 0x1e, 0xc6, 0x40, + 0xb9, 0x69, 0xea, 0x02, 0x95, 0x14, 0x9b, 0xe9, 0x7d, 0x0c, 0xb7, 0x55, 0xf8, 0x87, 0xd9, 0x76, + 0x3e, 0x15, 0xae, 0x83, 0xba, 0xe7, 0x60, 0xc4, 0x0d, 0x32, 0x8a, 0x46, 0x9a, 0x56, 0xdc, 0xc1, + 0x62, 0x9e, 0x76, 0xf6, 0x34, 0xfb, 0xb9, 0xca, 0x32, 0xaa, 0xdd, 0x2b, 0x4e, 0xd2, 0xbc, 0x1a, + 0xe4, 0x5d, 0x8c, 0x79, 0xb1, 0x84, 0xd3, 0xfc, 0xd5, 0x40, 0xa9, 0x00, 0x97, 0x18, 0x39, 0xf7, + 0x78, 0xa7, 0xfd, 0x60, 0xb4, 0xfa, 0x3f, 0x8b, 0x74, 0x23, 0xb6, 0x90, 0x07, 0x32, 0xea, 0xde, + 0x4d, 0xe9, 0xbf, 0xe3, 0x78, 0x0a, 0xe0, 0x86, 0x21, 0x02, 0x2d, 0x45, 0xe0, 0x74, 0x20, 0xb7, + 0x63, 0x17, 0x2f, 0x09, 0xd3, 0xbe, 0x24, 0x6e, 0xef, 0x62, 0x06, 0x35, 0x1d, 0x0d, 0xe0, 0xb8, + 0xc4, 0xff, 0xc5, 0x3e, 0x4a, 0xf3, 0x04, 0x2b, 0x4f, 0xea, 0xf6, 0xfd, 0x8d, 0x28, 0x5e, 0xdc, + 0xe8, 0x1d, 0x39, 0x20, 0x43, 0x89, 0x5c, 0x37, 0x50, 0x38, 0x92, 0x00, 0x69, 0x46, 0xc8, 0x55, + 0x16, 0x70, 0x90, 0x73, 0x9e, 0xd8, 0x08, 0xdb, 0x3a, 0xcf, 0x5c, 0xc8, 0xdb, 0x2b, 0xae, 0x8e, + 0x7c, 0x51, 0xa9, 0x0c, 0x54, 0xc8, 0x15, 0x21, 0x26, 0x29, 0x92, 0x25, 0x19, 0xa8, 0x31, 0x7c, + 0x7d, 0x41, 0x32, 0x69, 0xe4, 0xfd, 0xf0, 0x0f, 0x12, 0x2e, 0x35, 0x0d, 0x22, 0x04, 0xf5, 0x7e, + 0x5c, 0xa7, 0x2e, 0xe1, 0xda, 0x11, 0xd2, 0xbf, 0x98, 0xe1, 0x33, 0xf7, 0x3c, 0xb2, 0x4a, 0x1c, + 0x01, 0x3e, 0xf7, 0xcc, 0x14, 0x2a, 0x51, 0xe6, 0x4f, 0x43, 0xba, 0xd4, 0xad, 0xb7, 0x8c, 0x5c, + 0x4a, 0x44, 0x03, 0x7f, 0x80, 0x0f, 0xe5, 0x58, 0x35, 0x44, 0x11, 0x13, 0x63, 0xd6, 0x62, 0x48, + 0x15, 0xa9, 0xb9, 0xdf, 0xf9, 0xc1, 0x70, 0x80, 0xdf, 0x76, 0xda, 0x93, 0x50, 0xc3, 0x17, 0x5b, + 0xb7, 0xdd, 0xfa, 0x14, 0x5a, 0xfa, 0x2f, 0xd6, 0x4b, 0x54, 0xd8, 0x41, 0xab, 0x82, 0xc9, 0x12, + 0xd8, 0x65, 0x71, 0x99, 0xff, 0x07, 0x3b, 0x46, 0x84, 0xeb, 0x89, 0x04, 0x10, 0x6d, 0x5c, 0x1e, + 0xe4, 0xcb, 0x13, 0xcd, 0x37, 0x3b, 0xde, 0x78, 0xfc, 0x48, 0xbd, 0xb2, 0x85, 0x89, 0x45, 0x72, + 0x96, 0x2a, 0x7d, 0x69, 0x1a, 0x59, 0x6d, 0x03, 0x30, 0xb9, 0xce, 0x98, 0xb3, 0xc2, 0x23, 0xb4, + 0x86, 0x2a, 0x1e, 0x76, 0x49, 0xc0, 0x7b, 0xd6, 0x3c, 0x54, 0x76, 0x22, 0x1c, 0x8e, 0x86, 0x56, + 0xeb, 0xa3, 0x00, 0x73, 0x3c, 0xeb, 0x64, 0xa1, 0xd7, 0x4a, 0xeb, 0x4d, 0x98, 0x49, 0xcf, 0x93, + 0x72, 0xec, 0x35, 0x33, 0x8b, 0x97, 0xf4, 0xd0, 0xb7, 0x80, 0xf8, 0xc4, 0x85, 0x27, 0x1f, 0x5e, + 0x3c, 0xe9, 0x83, 0x3d, 0xbc, 0x99, 0x96, 0x3d, 0x63, 0xaa, 0x99, 0x7c, 0x83, 0x07, 0x55, 0x78, + 0x94, 0x7f, 0xa4, 0x48, 0x77, 0x38, 0xa3, 0xb8, 0xb7, 0x02, 0xee, 0x82, 0xac, 0x27, 0x1e, 0xb4, + 0x2a, 0xa9, 0x27, 0x98, 0xcf, 0x58, 0x80, 0xa6, 0x58, 0x15, 0xce, 0x17, 0x87, 0xb4, 0xff, 0xaf, + 0x22, 0xa8, 0xf3, 0x83, 0xf6, 0xd9, 0x04, 0xb3, 0xbb, 0xf1, 0x1a, 0xa7, 0x00, 0x5c, 0x64, 0xfb, + 0x99, 0x6f, 0x54, 0xda, 0x29, 0x1e, 0x4f, 0xae, 0x22, 0x24, 0xce, 0xc8, 0x77, 0xc8, 0x7e, 0xe6, + 0xfd, 0xce, 0x07, 0x7d, 0x0d, 0x93, 0xde, 0x13, 0xd3, 0x08, 0xdb, 0xc1, 0xd5, 0xbb, 0x5a, 0x69, + 0x34, 0xa5, 0x90, 0x44, 0x5b, 0xd2, 0x50, 0x4c, 0x03, 0xb4, 0x35, 0x33, 0x4d, 0x63, 0xdb, 0xfb, + 0xe7, 0xed, 0x07, 0x91, 0x1f, 0x7e, 0xa5, 0x68, 0xa0, 0xe7, 0x80, 0x65, 0xf8, 0x79, 0xc7, 0xca, + 0x80, 0x27, 0x41, 0x59, 0xa3, 0x38, 0xc3, 0xae, 0xa5, 0x8c, 0x1d, 0x00, 0xb5, 0xbc, 0x6d, 0x16, + 0xdf, 0x8e, 0x36, 0xa6, 0x24, 0x8e, 0x1d, 0xca, 0x0c, 0x13, 0xed, 0x3d, 0xe1, 0x68, 0xc9, 0x0b, + 0x8b, 0xd4, 0x17, 0xf2, 0xb3, 0xec, 0x78, 0xa0, 0x7d, 0x35, 0x71, 0xe4, 0x24, 0xd1, 0xe5, 0xc1, + 0x13, 0x2c, 0x7e, 0xab, 0x86, 0x19, 0xfe, 0xbe, 0x22, 0xcf, 0xb7, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xae, 0x29, 0x35, 0xf1, 0xdf, 0xd8, 0xa2, 0x4a, 0xed, 0x7c, 0x70, 0xdf, + 0x7d, 0xe3, 0xa6, 0x68, 0xeb, 0x7a, 0x49, 0xb1, 0x31, 0x98, 0x80, 0xdd, 0xe2, 0xbb, 0xd9, 0x03, + 0x1a, 0xe5, 0xd8, 0x2f, 0xfd, 0xe0, 0x1c, 0x85, 0xa0, 0x45, 0xcc, 0x0e, 0xf3, 0x67, 0x88, 0xe9, + 0x1e, 0xdf, 0x18, 0xe6, 0x3a, 0x44, 0x94, 0x53, 0x74, 0x09, 0x4e, 0x08, 0x3c, 0x33, 0xd3, 0x07, + 0xd1, 0x72, 0xaf, 0x7f, 0x82, 0xec, 0x14, 0x05, 0x87, 0x12, 0x50, 0xc0, 0xc4, 0x4f, 0x7c, 0x67, + 0xdf, 0xd2, 0xe2, 0xc7, 0x38, 0x0d, 0x7c, 0x30, 0xf6, 0x80, 0x39, 0xe2, 0x7d, 0x77, 0xb4, 0x42, + 0xcb, 0x01, 0x63, 0xca, 0x95, 0x32, 0xa4, 0x18, 0x2c, 0x2b, 0xef, 0xa0, 0x26, 0x88, 0xc6, 0x01, + 0x97, 0x10, 0xba, 0xba, 0x3d, 0x80, 0xf2, 0xb8, 0x94, 0xfd, 0x91, 0x75, 0xf2, 0x2c, 0x7f, 0xf6, + 0xdf, 0x41, 0x2c, 0x8c, 0x41, 0xde, 0xb3, 0x94, 0xb9, 0x89, 0xc2, 0x27, 0xf5, 0xc2, 0x03, 0x32, + 0xb7, 0xa0, 0x30, 0x36, 0x98, 0x23, 0xc6, 0xac, 0x19, 0xee, 0xa1, 0xe6, 0xe2, 0x68, 0xee, 0xaa, + 0x70, 0x0c, 0x81, 0xe8, 0x87, 0x31, 0xbf, 0x74, 0xaa, 0xd7, 0x37, 0xab, 0xf9, 0x15, 0x8c, 0x3e, + 0xfc, 0x59, 0x16, 0x20, 0x4e, 0xe3, 0xd4, 0x5e, 0x57, 0x28, 0xcf, 0x42, 0x7f, 0x1a, 0x86, 0x9d, + 0x1c, 0x5d, 0x4a, 0xf1, 0x7a, 0x17, 0x9e, 0xd1, 0x6f, 0xfd, 0xcd, 0xb4, 0xe9, 0x05, 0xdb, 0x8e, + 0x10, 0x99, 0x25, 0x41, 0x2c, 0xa6, 0xf6, 0x65, 0xd3, 0x4f, 0x3c, 0x3d, 0xc9, 0x2c, 0xf5, 0x40, + 0xea, 0x6d, 0x7a, 0x07, 0xdf, 0x9c, 0x3b, 0x3f, 0xe7, 0x45, 0xd8, 0xcf, 0x95, 0x33, 0x57, 0x39, + 0x37, 0x61, 0x36, 0x7c, 0xf7, 0xee, 0xb5, 0xc0, 0x75, 0x0b, 0xe3, 0x08, 0x02, 0xfe, 0x8f, 0x52, + 0x14, 0xa4, 0x1f, 0x99, 0xbe, 0x8d, 0xb8, 0x1f, 0x35, 0xf1, 0x96, 0x61, 0x31, 0x19, 0x20, 0xd8, + 0x1c, 0xdb, 0x99, 0x9f, 0x34, 0x68, 0xf0, 0x16, 0x05, 0x5d, 0x33, 0xbc, 0x8e, 0xa9, 0x50, 0xda, + 0x3f, 0x07, 0xc0, 0xf1, 0x02, 0x61, 0x88, 0xe2, 0x8b, 0x50, 0xc9, 0xad, 0x30, 0xab, 0x00, 0x05, + 0xea, 0x60, 0x4c, 0xcf, 0x86, 0xb0, 0x32, 0x40, 0x1a, 0x6b, 0x84, 0xf9, 0xee, 0xee, 0x1c, 0x82, + 0xf6, 0xbc, 0xd3, 0x88, 0x7c, 0xb9, 0x87, 0x88, 0x8c, 0x1e, 0xc2, 0x55, 0x37, 0xc6, 0x60, 0xdc, + 0xf8, 0x1d, 0xbc, 0x80, 0x06, 0x33, 0x33, 0x61, 0x99, 0xce, 0x7c, 0x41, 0xea, 0xf2, 0xc8, 0x92, + 0x0c, 0xd3, 0xd6, 0xf4, 0x1b, 0xa7, 0x8d, 0x97, 0xb9, 0x84, 0x51, 0x65, 0x6e, 0xcb, 0x7a, 0x73, + 0x97, 0x0a, 0xfd, 0xaa, 0x36, 0xb9, 0xb1, 0x5e, 0x8d, 0xe1, 0xcf, 0x85, 0x2c, 0x5c, 0x41, 0xee, + 0x6c, 0xbc, 0x0e, 0x76, 0x80, 0x5a, 0xa9, 0x3c, 0x3f, 0xa9, 0x33, 0xc4, 0x3d, 0x12, 0x5d, 0x0b, + 0x00, 0x68, 0x7d, 0x15, 0x30, 0x37, 0xe2, 0x4d, 0x4f, 0x49, 0x30, 0x0c, 0x93, 0x2c, 0x18, 0xdd, + 0x1f, 0x92, 0xab, 0xef, 0x0a, 0x2c, 0x12, 0x4c, 0x4e, 0x99, 0xee, 0xcb, 0x95, 0x68, 0xf1, 0xf8, + 0x88, 0x8c, 0xe1, 0x16, 0x2d, 0x08, 0x6a, 0x5a, 0xb1, 0x87, 0xb4, 0x9f, 0x6b, 0x16, 0xb6, 0x69, + 0xb0, 0x40, 0xbc, 0x9c, 0x54, 0x61, 0xa2, 0x65, 0x97, 0x29, 0xa0, 0xfa, 0x12, 0x7b, 0xc5, 0xdb, + 0xcf, 0x6a, 0x54, 0xfc, 0xc8, 0x93, 0xd0, 0xdf, 0x06, 0x7a, 0xd7, 0x44, 0x0c, 0x80, 0x35, 0xe1, + 0xcf, 0x18, 0xc5, 0xb4, 0x19, 0xf3, 0x9c, 0x97, 0x3b, 0x1a, 0x91, 0xbd, 0x54, 0x0c, 0x37, 0x6b, + 0x14, 0x1d, 0xfe, 0x5c, 0xea, 0xb4, 0x3c, 0x71, 0x16, 0x21, 0x1e, 0xa0, 0x14, 0x13, 0x8d, 0xaf, + 0xbd, 0x24, 0xb2, 0x9a, 0xf4, 0x82, 0xab, 0x03, 0xb7, 0x77, 0x00, 0x6f, 0x99, 0x6f, 0xa4, 0x89, + 0xe7, 0x6f, 0xf9, 0xc2, 0x30, 0x3c, 0x1f, 0xe4, 0x69, 0x27, 0x53, 0x40, 0x16, 0xf1, 0x9e, 0xae, + 0xe7, 0xd1, 0xaf, 0x02, 0xf7, 0xb1, 0x13, 0x1a, 0x3e, 0x16, 0x1b, 0x2d, 0x18, 0xfd, 0xbf, 0xb8, + 0x61, 0xeb, 0xf7, 0x8d, 0xe8, 0x5b, 0xa0, 0xee, 0x0e, 0x56, 0xe6, 0xe1, 0x5c, 0x4a, 0x09, 0x51, + 0x41, 0xfa, 0x0c, 0xa8, 0xfc, 0x1a, 0x8d, 0x00, 0x14, 0x4d, 0x82, 0x85, 0x9e, 0x62, 0x7b, 0x70, + 0x06, 0x0b, 0x6a, 0xd7, 0xb1, 0x82, 0x46, 0x49, 0xcf, 0x3b, 0x76, 0x57, 0xd0, 0x27, 0x44, 0xac, + 0xb8, 0xb3, 0x74, 0x6b, 0x3a, 0x1c, 0x2b, 0xdb, 0x5c, 0x9a, 0x57, 0x1c, 0x79, 0xee, 0x80, 0x1d, + 0x6a, 0x8d, 0xbb, 0xfd, 0xc1, 0x70, 0x4e, 0x9b, 0xa0, 0xd3, 0x29, 0x3e, 0xe1, 0x61, 0xe5, 0xe9, + 0x69, 0x59, 0xf6, 0x3f, 0x55, 0x5e, 0x0f, 0x8a, 0x4a, 0x99, 0x95, 0xa4, 0x97, 0x71, 0xd0, 0x72, + 0x36, 0xb4, 0x20, 0x0a, 0xce, 0x69, 0xab, 0xdc, 0xf9, 0xa4, 0x66, 0xd3, 0x0e, 0x81, 0xca, 0x93, + 0xa9, 0xb9, 0xd1, 0x92, 0x41, 0xa3, 0x09, 0x57, 0xcb, 0x05, 0x28, 0xaf, 0xea, 0x86, 0xe1, 0xf1, + 0x9c, 0x7d, 0x38, 0x58, 0x97, 0x6d, 0x50, 0xa6, 0xef, 0xf6, 0xbf, 0x8b, 0x29, 0x8d, 0xbb, 0x86, + 0x48, 0x52, 0x58, 0x8f, 0x88, 0x55, 0x8a, 0x05, 0x40, 0xa0, 0x7c, 0x72, 0xb6, 0xdd, 0xa9, 0x48, + 0x77, 0xdc, 0xee, 0xbc, 0xd3, 0x6f, 0x95, 0x9f, 0x51, 0xa8, 0x5d, 0x7a, 0x61, 0x06, 0x6a, 0x78, + 0x1c, 0xb9, 0xcf, 0xa9, 0xf7, 0x88, 0x81, 0x97, 0x53, 0x5f, 0x62, 0x58, 0xb2, 0x8d, 0x71, 0xce, + 0xf4, 0x05, 0x16, 0x8b, 0x4a, 0xa3, 0xdd, 0x35, 0xfa, 0xdd, 0xd9, 0x95, 0xde, 0xb5, 0x26, 0x0d, + 0xf8, 0x73, 0x26, 0xb6, 0x5c, 0x09, 0x2b, 0x49, 0xac, 0x66, 0x91, 0x33, 0x5f, 0x44, 0xbe, 0x13, + 0xd1, 0x64, 0x44, 0xe4, 0x86, 0x4a, 0xdd, 0xde, 0x2e, 0x2c, 0xe1, 0x89, 0x32, 0x66, 0x14, 0x2e, + 0x75, 0x74, 0xe6, 0x47, 0xf9, 0x74, 0x11, 0xe3, 0x00, 0x3f, 0x13, 0x07, 0xbc, 0x09, 0x88, 0x4b, + 0x51, 0xf6, 0x91, 0xb7, 0x45, 0xaf, 0xaf, 0x69, 0x7b, 0x4f, 0x77, 0x7d, 0x2e, 0xc7, 0x5c, 0x2c, + 0x4f, 0xae, 0x5a, 0x80, 0x6a, 0xef, 0xba, 0x3e, 0x2c, 0x93, 0x63, 0x3a, 0xe4, 0xce, 0x75, 0xe1, + 0xce, 0x38, 0xf7, 0x84, 0xe1, 0xfa, 0x6f, 0x3e, 0x20, 0x17, 0x3a, 0xe7, 0x99, 0x24, 0xc1, 0x2f, + 0x98, 0x32, 0xe4, 0xca, 0x89, 0x80, 0x9c, 0x68, 0x50, 0xb1, 0x56, 0x7e, 0x5f, 0x51, 0x2c, 0x79, + 0x05, 0x16, 0x10, 0xf0, 0x7e, 0x8b, 0x09, 0xaa, 0xb1, 0xf5, 0xcf, 0xb9, 0x18, 0x14, 0x5e, 0xfd, + 0xc0, 0x08, 0xbd, 0x65, 0x1f, 0x7c, 0x1b, 0x2e, 0x0b, 0x7e, 0xc8, 0xbb, 0x32, 0x71, 0x83, 0x2c, + 0x67, 0x82, 0x32, 0xfb, 0xcb, 0x22, 0xe0, 0xff, 0x9b, 0xc1, 0x0a, 0x54, 0xe7, 0xdb, 0x86, 0x23, + 0x00, 0x04, 0x08, 0x06, 0xd1, 0x5a, 0x8f, 0xc9, 0xe3, 0x3a, 0x9b, 0x51, 0xeb, 0xfd, 0xb2, 0xf3, + 0x27, 0x45, 0xa1, 0xeb, 0xdc, 0xd0, 0xf9, 0xa7, 0x70, 0x23, 0xec, 0xc4, 0x29, 0xf1, 0xce, 0x52, + 0x89, 0xa2, 0xcb, 0xa0, 0x45, 0x6d, 0xa5, 0xa7, 0x73, 0xf4, 0xd7, 0x4c, 0x48, 0xd9, 0x15, 0xb9, + 0xe9, 0x87, 0x84, 0x30, 0xfe, 0x0d, 0xf6, 0x45, 0x88, 0xa4, 0x29, 0x26, 0x5d, 0xde, 0xc9, 0x0f, + 0xea, 0x4c, 0xb3, 0xe1, 0x48, 0x9f, 0x03, 0x99, 0x8f, 0xb6, 0x78, 0xa1, 0xaa, 0x7a, 0xa3, 0x99, + 0xb9, 0x0c, 0xcf, 0x22, 0xc5, 0x6e, 0x51, 0x82, 0xcb, 0x14, 0xbd, 0x5e, 0x03, 0xc1, 0xe1, 0xc2, + 0xec, 0x68, 0x09, 0xb0, 0x20, 0x06, 0xa9, 0x1c, 0x64, 0xdc, 0x8d, 0xac, 0x8c, 0xbb, 0x1c, 0xb7, + 0x6b, 0x80, 0x58, 0x92, 0x85, 0xe4, 0x2c, 0x98, 0xfa, 0x44, 0xd9, 0xe0, 0xfd, 0x67, 0xb4, 0xa1, + 0xfc, 0x02, 0xfd, 0x82, 0x0c, 0xac, 0xa3, 0x6f, 0x20, 0x54, 0x5e, 0x22, 0xfe, 0xb1, 0x2d, 0xad, + 0x46, 0x72, 0x5d, 0x78, 0xea, 0xb3, 0xd4, 0x65, 0xa5, 0xd2, 0x85, 0xa2, 0xe9, 0xb2, 0xbc, 0xf6, + 0xdf, 0x32, 0xa3, 0x2a, 0x91, 0x26, 0x1b, 0x18, 0x05, 0x23, 0x19, 0xb5, 0x1e, 0x3c, 0x6a, 0x29, + 0x7d, 0xc3, 0x6e, 0x52, 0xc7, 0xf2, 0x50, 0x29, 0x67, 0xfb, 0xeb, 0x0a, 0xd0, 0xdb, 0xf7, 0x0c, + 0x8a, 0x25, 0x70, 0xb8, 0xf7, 0x15, 0x88, 0xfb, 0x28, 0x91, 0xef, 0xf0, 0xa2, 0x3c, 0x28, 0xdd, + 0x2f, 0x4f, 0xd0, 0xf6, 0x26, 0xa4, 0xdb, 0x65, 0x3b, 0x39, 0x61, 0x43, 0xc6, 0xf8, 0x68, 0xd6, + 0x55, 0xe2, 0xd5, 0x85, 0x03, 0x9c, 0x89, 0x1a, 0x11, 0xff, 0xf1, 0x37, 0x76, 0x8d, 0x05, 0xf7, + 0x5c, 0x27, 0xb8, 0xd3, 0x79, 0xad, 0x02, 0xca, 0xb0, 0x52, 0xec, 0x67, 0x89, 0xfb, 0xb1, 0x28, + 0x72, 0xae, 0x32, 0x2f, 0xde, 0x58, 0x2c, 0x8e, 0x6d, 0x87, 0xb3, 0x3f, 0xb8, 0x44, 0x7e, 0x81, + 0x76, 0x29, 0x4b, 0xe9, 0xdf, 0x99, 0xc7, 0x43, 0xde, 0xb2, 0xe3, 0xf9, 0xf9, 0x1c, 0x8a, 0x3b, + 0x58, 0x88, 0xf6, 0x0e, 0x1e, 0x7f, 0x9f, 0x49, 0xb0, 0x49, 0xba, 0xdb, 0x6d, 0x59, 0xdf, 0x42, + 0x8e, 0xa4, 0x13, 0x80, 0xb5, 0x01, 0x90, 0xd9, 0x6f, 0xf7, 0x2e, 0xba, 0x28, 0x7c, 0xa5, 0x5f, + 0x32, 0x43, 0x99, 0x64, 0xa9, 0xa5, 0x9b, 0xa8, 0xc0, 0x99, 0x03, 0x08, 0x02, 0x10, 0xde, 0xa1, + 0x75, 0xc9, 0x72, 0xa7, 0x66, 0x7a, 0x66, 0xca, 0xb9, 0x36, 0xd0, 0x98, 0xaf, 0xdf, 0x2d, 0xc3, + 0xac, 0x5c, 0xda, 0x1c, 0x66, 0xea, 0xb7, 0x3e, 0x89, 0x32, 0x54, 0xb3, 0x57, 0xa5, 0x4f, 0x9a, + 0xda, 0x6b, 0x11, 0x21, 0x79, 0x15, 0x7e, 0xb1, 0x92, 0x64, 0x07, 0xe8, 0x8f, 0x40, 0x19, 0xbf, + 0x7b, 0x34, 0x1d, 0xd5, 0xbb, 0x0e, 0xbc, 0xd3, 0xd9, 0x88, 0x59, 0xe1, 0xd2, 0xe2, 0x8a, 0x25, + 0xd8, 0x6c, 0x34, 0x8c, 0xab, 0xca, 0x24, 0x51, 0xbf, 0xcd, 0x7d, 0x1a, 0x88, 0x0e, 0x41, 0x0f, + 0xcf, 0x10, 0x62, 0x40, 0xf1, 0xef, 0x38, 0xf9, 0x14, 0x52, 0x9a, 0x6f, 0xd3, 0xf9, 0x6b, 0x98, + 0x4f, 0x19, 0x6c, 0x07, 0xec, 0xcf, 0x36, 0x53, 0x77, 0x58, 0x23, 0x56, 0x08, 0x65, 0xdb, 0x24, + 0x1c, 0xd2, 0xdb, 0x62, 0x5f, 0xdc, 0x1c, 0x01, 0x49, 0xf6, 0x8c, 0x21, 0x6f, 0x71, 0x22, 0x5f, + 0x02, 0xb5, 0x00, 0x49, 0x28, 0x11, 0xc1, 0x3c, 0xba, 0x69, 0xdc, 0x7f, 0xcb, 0xc7, 0xa8, 0x8d, + 0xf5, 0xee, 0xe4, 0x4b, 0x53, 0x8d, 0x01, 0xa3, 0xd1, 0x82, 0x88, 0x28, 0x03, 0x42, 0xed, 0x20, + 0x4b, 0xca, 0xb0, 0x3a, 0x4e, 0x05, 0xee, 0x42, 0xc1, 0xd8, 0xd6, 0x2c, 0x64, 0xd6, 0x83, 0x03, + 0xc1, 0x21, 0x75, 0xd4, 0xce, 0x5d, 0x83, 0x9b, 0x74, 0x88, 0x51, 0x14, 0x9c, 0x5e, 0x73, 0xe5, + 0xaf, 0x1e, 0x12, 0xae, 0xb9, 0xc3, 0x2d, 0xd7, 0x09, 0xf8, 0x4b, 0x2e, 0x14, 0xcf, 0x94, 0x17, + 0xf6, 0xc8, 0x28, 0xbf, 0x6b, 0xd9, 0x33, 0x4c, 0x4c, 0xab, 0x2e, 0xa4, 0x3a, 0xe7, 0x6b, 0x3d, + 0xe0, 0xc4, 0x35, 0xc1, 0xb3, 0x7f, 0x9e, 0xcc, 0x65, 0xeb, 0xed, 0xd8, 0x15, 0x27, 0x11, 0x66, + 0x20, 0x68, 0xaa, 0xf3, 0xa0, 0xf3, 0xa8, 0x6f, 0x51, 0x63, 0x42, 0xcf, 0xba, 0x10, 0x4f, 0x04, + 0xdf, 0x64, 0x87, 0x88, 0xda, 0x49, 0x3e, 0xbf, 0xa2, 0x21, 0xd6, 0x31, 0xac, 0x9f, 0xf2, 0xf8, + 0xd1, 0x5c, 0xf8, 0x89, 0x72, 0x0c, 0x9e, 0x24, 0x30, 0xc1, 0x9f, 0xd9, 0x36, 0xae, 0xcc, 0xcc, + 0xbb, 0x09, 0xf2, 0xc3, 0x5c, 0xf9, 0x33, 0x87, 0x58, 0xb5, 0x47, 0x69, 0x26, 0x23, 0x57, 0x98, + 0xa4, 0x62, 0xa9, 0x0d, 0x70, 0xa7, 0x2d, 0xce, 0x6f, 0x55, 0x05, 0x8f, 0x8b, 0x51, 0x5b, 0x18, + 0xcd, 0x65, 0x9b, 0x47, 0xb6, 0xee, 0xd4, 0xfd, 0x72, 0x28, 0xa0, 0x94, 0xa2, 0xd7, 0xd2, 0xef, + 0x5a, 0xae, 0xc1, 0xf3, 0x6b, 0x5c, 0xa4, 0x54, 0xdb, 0x48, 0xec, 0xfd, 0xe1, 0xe9, 0x5e, 0x8c, + 0x62, 0x4c, 0xf7, 0x7a, 0x50, 0x62, 0xeb, 0xdf, 0x54, 0x6a, 0x49, 0x6f, 0xdb, 0x5a, 0x02, 0x96, + 0xf9, 0x1d, 0x57, 0x8e, 0xa1, 0x61, 0xaa, 0xc7, 0xc7, 0xa8, 0x1b, 0xf5, 0x33, 0x3d, 0x65, 0x12, + 0x45, 0x54, 0xfc, 0x9d, 0x40, 0x17, 0x7c, 0xff, 0xf4, 0x2e, 0x0b, 0xbd, 0x56, 0x80, 0x5c, 0x83, + 0x7f, 0xe6, 0x20, 0x3f, 0x6e, 0x91, 0xa2, 0x2c, 0x58, 0x33, 0x69, 0xbc, 0x15, 0x10, 0xdc, 0x2d, + 0xa3, 0xd6, 0x06, 0xa9, 0xce, 0xa7, 0xec, 0xa8, 0x28, 0x14, 0xbe, 0xbe, 0x80, 0x82, 0x8f, 0x1d, + 0x4c, 0x24, 0x40, 0x26, 0x68, 0xdd, 0xa9, 0xaa, 0x4c, 0xd6, 0x87, 0x7e, 0x46, 0x7a, 0xaa, 0x43, + 0x56, 0x2e, 0xd9, 0x24, 0xda, 0x6f, 0xdd, 0x21, 0x10, 0x39, 0x48, 0xd5, 0x08, 0xec, 0x5d, 0x1f, + 0xe4, 0xdb, 0x64, 0xa1, 0x99, 0x8b, 0x11, 0x60, 0x2f, 0x4b, 0x44, 0x84, 0xd2, 0x69, 0x52, 0xfd, + 0xee, 0xe9, 0x5b, 0xb0, 0xa8, 0xc5, 0x07, 0x77, 0x15, 0xfe, 0x58, 0xf5, 0x62, 0xfb, 0x60, 0x4c, + 0x43, 0xe0, 0x17, 0x54, 0x42, 0x9f, 0x07, 0x7c, 0x2d, 0xc0, 0xa2, 0x6a, 0x3e, 0x13, 0x0b, 0x78, + 0x5c, 0x62, 0x98, 0x7f, 0x55, 0xe2, 0xc7, 0xb2, 0x58, 0xe1, 0x9d, 0x53, 0xb5, 0xd9, 0xaf, 0x0c, + 0x11, 0x70, 0x85, 0xca, 0x21, 0x87, 0x1a, 0x39, 0x5e, 0x67, 0xd4, 0x51, 0x75, 0x2e, 0xa8, 0xea, + 0x0d, 0x30, 0xc0, 0x93, 0x60, 0x18, 0x7f, 0xdf, 0x4a, 0x41, 0xa0, 0x80, 0x1c, 0xed, 0x5c, 0xaa, + 0x84, 0x4f, 0x2d, 0xec, 0x8c, 0xad, 0x24, 0xa1, 0x4b, 0xa9, 0x52, 0x27, 0x8e, 0x70, 0xf6, 0xff, + 0xc0, 0xb4, 0x13, 0x39, 0x75, 0xd4, 0xfc, 0x9a, 0xbf, 0xff, 0x53, 0x3f, 0x44, 0x19, 0xd9, 0xa5, + 0x28, 0x18, 0x5c, 0x38, 0xfb, 0x4c, 0x3e, 0x5b, 0x40, 0xf2, 0xf4, 0xc2, 0x2c, 0x95, 0xdb, 0xd2, + 0xe5, 0x5f, 0x87, 0x56, 0x63, 0x28, 0xda, 0x07, 0xa9, 0x90, 0x83, 0x94, 0xdb, 0x56, 0x2c, 0xa3, + 0xd0, 0xc4, 0x52, 0x6d, 0x1f, 0xfa, 0x35, 0x4f, 0xba, 0xcf, 0x12, 0xf4, 0xf0, 0x46, 0xb5, 0x1e, + 0x67, 0xba, 0x10, 0xc9, 0xc3, 0x0a, 0x30, 0xed, 0xcd, 0xc4, 0x3a, 0x87, 0x08, 0x2c, 0xd9, 0x21, + 0x5f, 0x68, 0x0f, 0xf8, 0x2f, 0x6f, 0x2a, 0x27, 0x47, 0x79, 0x16, 0x52, 0x7a, 0xfd, 0x9d, 0x65, + 0xec, 0x53, 0x90, 0xaf, 0xf0, 0x45, 0x24, 0x08, 0x5a, 0x9f, 0xfd, 0xec, 0xd9, 0x9a, 0x4c, 0x0a, + 0xd4, 0x09, 0x58, 0xdd, 0x29, 0xe4, 0x1a, 0x8e, 0xe9, 0xa3, 0x60, 0x85, 0xd8, 0xd5, 0x9c, 0xb7, + 0x33, 0x2c, 0x3a, 0xfe, 0xd7, 0x09, 0x5a, 0x7a, 0x19, 0x3b, 0x67, 0xc2, 0xc9, 0xf1, 0x41, 0xa4, + 0xc6, 0x7f, 0x1e, 0x7d, 0x6a, 0x75, 0x24, 0xce, 0xef, 0x30, 0xdc, 0x74, 0x8f, 0x2d, 0x8c, 0xf0, + 0x5d, 0x2d, 0x4b, 0x0d, 0x0d, 0x1a, 0xda, 0x8b, 0xdb, 0xc9, 0xac, 0xeb, 0x51, 0x5e, 0xaa, 0xde, + 0x05, 0x3c, 0x8c, 0x87, 0x09, 0x08, 0x2d, 0xd2, 0xca, 0xe6, 0x66, 0x97, 0x70, 0x38, 0x0e, 0x28, + 0x53, 0x4b, 0x59, 0x85, 0x6a, 0x59, 0xe2, 0xd2, 0x6f, 0x87, 0x4f, 0x4b, 0xf5, 0xe1, 0x4d, 0xc9, + 0x23, 0xdd, 0xfe, 0x77, 0x44, 0x92, 0x3f, 0xf6, 0x78, 0x93, 0x18, 0x38, 0x02, 0x24, 0x22, 0x89, + 0xb7, 0x59, 0x84, 0x7d, 0xe4, 0xf7, 0x67, 0xaa, 0xb8, 0xd4, 0x03, 0x92, 0x97, 0xfd, 0xaa, 0xb0, + 0x5d, 0xee, 0x1a, 0x48, 0xb1, 0xfb, 0x1c, 0x9d, 0xaf, 0x64, 0xc3, 0xd6, 0x3e, 0xb7, 0x62, 0xf5, + 0xdb, 0xea, 0x61, 0x1d, 0xde, 0xc6, 0xee, 0x6e, 0x90, 0xfd, 0x0b, 0x74, 0xd2, 0xc2, 0xf7, 0x35, + 0x98, 0x78, 0x74, 0x3e, 0xb4, 0xac, 0x29, 0x4f, 0xcd, 0x95, 0x6f, 0x0a, 0x6b, 0x20, 0xee, 0xd6, + 0xd8, 0x6b, 0x34, 0x51, 0xc0, 0x6f, 0x52, 0x9c, 0x4d, 0xac, 0x9a, 0x11, 0xb8, 0xb8, 0x29, 0x37, + 0x8a, 0x1b, 0x8f, 0x0c, 0x3a, 0x7a, 0x24, 0xfa, 0xc9, 0x5b, 0xef, 0x94, 0x9d, 0x36, 0xf9, 0x1a, + 0x5b, 0x97, 0xab, 0x0d, 0x3e, 0xc4, 0x7c, 0x9a, 0x83, 0xb7, 0x36, 0x1b, 0x2c, 0x93, 0xd2, 0x66, + 0x6e, 0x6f, 0x32, 0x11, 0x2f, 0x21, 0x19, 0x96, 0x3d, 0x7c, 0x5f, 0x2e, 0x6c, 0x05, 0x34, 0x95, + 0x7c, 0x1b, 0x9b, 0x33, 0xa4, 0xb2, 0x6d, 0x5f, 0xda, 0x45, 0x69, 0x0e, 0x5c, 0x1e, 0x5e, 0xa9, + 0x1a, 0x31, 0xc8, 0x23, 0x78, 0x98, 0x34, 0x4b, 0xe9, 0x37, 0xd5, 0x87, 0x46, 0xec, 0x9b, 0x20, + 0x50, 0x35, 0xb9, 0x95, 0xe5, 0x06, 0x50, 0xa6, 0xe1, 0xdd, 0x19, 0xf5, 0xc6, 0x96, 0xec, 0xb3, + 0x08, 0x1c, 0x25, 0xad, 0x3b, 0xfc, 0x11, 0x6c, 0x9a, 0x7d, 0xd8, 0x31, 0x03, 0x24, 0xb5, 0xcb, + 0x90, 0xed, 0xfc, 0x98, 0xb1, 0x46, 0xec, 0xd0, 0xa9, 0x3c, 0x1f, 0x66, 0xb5, 0xba, 0x5e, 0xf2, + 0x5a, 0xd5, 0xf3, 0xdf, 0x54, 0xe7, 0x11, 0x89, 0xdc, 0xf0, 0xea, 0x09, 0x5d, 0x7a, 0x7a, 0xf6, + 0x5f, 0x5d, 0x69, 0xc0, 0xbc, 0xf3, 0x73, 0x73, 0x9a, 0xd5, 0x78, 0x40, 0xe3, 0x54, 0x31, 0x45, + 0xd1, 0xc0, 0x2f, 0x93, 0xbc, 0x1e, 0x2f, 0x39, 0x4e, 0xb4, 0xf0, 0x3e, 0x57, 0x7a, 0x64, 0x8d, + 0x98, 0x66, 0x5d, 0x83, 0x5a, 0x6f, 0x8b, 0x5f, 0xf2, 0x7e, 0xd1, 0xc9, 0xcc, 0xbb, 0xf7, 0xaa, + 0x95, 0x2e, 0x7a, 0x7d, 0x8d, 0xec, 0x37, 0x7a, 0xb5, 0xbc, 0x8d, 0x62, 0xd2, 0x32, 0x1e, 0xd7, + 0x8b, 0x15, 0x06, 0x75, 0xde, 0x81, 0xab, 0xb0, 0xd4, 0x59, 0xa2, 0x25, 0x34, 0xca, 0x6d, 0xce, + 0x3f, 0xa3, 0xae, 0xe6, 0x09, 0xb3, 0x33, 0xe1, 0x25, 0x56, 0x77, 0x30, 0x8b, 0xf7, 0x30, 0x0f, + 0x74, 0x72, 0x36, 0x8c, 0x4b, 0x5d, 0x94, 0xbc, 0x4f, 0x5e, 0x1d, 0x8a, 0x75, 0xec, 0xd4, 0x21, + 0x21, 0xa9, 0x54, 0x9c, 0xc8, 0x37, 0x28, 0x06, 0xae, 0x5c, 0x72, 0x3b, 0xa0, 0x80, 0x0d, 0x17, + 0xbb, 0x22, 0xe8, 0xf7, 0xa9, 0x31, 0x7d, 0x2c, 0x13, 0x74, 0xbc, 0xa0, 0x09, 0xba, 0x5b, 0x05, + 0xa4, 0xf9, 0xab, 0xb5, 0xd5, 0xd7, 0x11, 0x3f, 0xa3, 0xb4, 0x89, 0x79, 0x1c, 0x4a, 0xd8, 0xfb, + 0xc6, 0x54, 0x41, 0xaf, 0x32, 0xc9, 0x71, 0xaa, 0x5a, 0xb1, 0xb5, 0xe0, 0xa0, 0x73, 0x45, 0x18, + 0x73, 0x17, 0xd2, 0xcb, 0xb8, 0x70, 0x30, 0xbb, 0xce, 0x25, 0xad, 0x9e, 0x8d, 0xf3, 0x0d, 0xec, + 0x26, 0x3f, 0x2c, 0x16, 0x49, 0x45, 0x68, 0xbe, 0x04, 0x3e, 0x67, 0x1a, 0xa6, 0x7e, 0xe9, 0x44, + 0x63, 0x43, 0x91, 0x92, 0x25, 0x84, 0x04, 0xe6, 0xa8, 0xb7, 0xf2, 0x70, 0x86, 0xba, 0x2e, 0x34, + 0x4c, 0x0f, 0x45, 0xac, 0x39, 0x8d, 0x0c, 0x59, 0x60, 0x08, 0xb2, 0x07, 0x79, 0xfd, 0xd0, 0x60, + 0xad, 0x0d, 0x53, 0xa6, 0x9b, 0x02, 0x22, 0xf2, 0xbc, 0xb4, 0xbd, 0x9e, 0x8a, 0xe8, 0x3b, 0xa7, + 0x76, 0x21, 0x8e, 0x59, 0x5f, 0x08, 0xb6, 0xf9, 0x4f, 0x18, 0x09, 0x8b, 0x8a, 0x94, 0x59, 0x93, + 0xa3, 0x23, 0xf1, 0xdb, 0x62, 0x88, 0x30, 0xe5, 0xea, 0xf1, 0x79, 0x3a, 0xf4, 0x3a, 0x57, 0xee, + 0xab, 0xa0, 0x82, 0x39, 0x44, 0xd9, 0x13, 0xb9, 0x32, 0xb4, 0x97, 0xb9, 0xa9, 0xb3, 0x23, 0x81, + 0x61, 0xed, 0x96, 0x51, 0xd9, 0xc5, 0x1c, 0x1b, 0xe7, 0x2a, 0x18, 0x83, 0xdb, 0xf5, 0xf2, 0x93, + 0x98, 0xd8, 0x79, 0xc3, 0x38, 0x6d, 0x86, 0x83, 0x9a, 0x80, 0x0d, 0x21, 0x5e, 0xbd, 0x7c, 0x7a, + 0x32, 0xd0, 0x75, 0xea, 0xe4, 0x95, 0x01, 0xcc, 0xa3, 0x2c, 0x74, 0x97, 0x1a, 0x25, 0xc7, 0x1a, + 0x38, 0xe6, 0x92, 0x8b, 0x89, 0xff, 0x56, 0xcd, 0x8d, 0x9f, 0xa0, 0x18, 0x9b, 0x00, 0xc4, 0x58, + 0x38, 0x49, 0x6a, 0x87, 0x59, 0xcc, 0x3b, 0xde, 0xb1, 0x6a, 0x86, 0x12, 0x74, 0x03, 0xd7, 0x04, + 0xc4, 0x63, 0xab, 0x1f, 0x5f, 0xf8, 0x4b, 0xba, 0x1d, 0x27, 0x06, 0xba, 0x68, 0xee, 0xe2, 0xd3, + 0x59, 0xb1, 0xc1, 0x7b, 0x97, 0x4e, 0x36, 0x9e, 0x13, 0x62, 0x9a, 0xad, 0x75, 0xe5, 0x44, 0xaa, + 0x9c, 0x5e, 0xdd, 0x05, 0x24, 0x6f, 0x44, 0x54, 0xc2, 0x5a, 0xfd, 0x4e, 0x97, 0x49, 0xfc, 0xf8, + 0xe9, 0x87, 0x42, 0x7d, 0xc5, 0xd6, 0x36, 0x21, 0x20, 0x6c, 0x2c, 0x32, 0xf9, 0xca, 0x49, 0x2f, + 0x7c, 0x3c, 0x24, 0x39, 0xd6, 0x91, 0xd3, 0x69, 0xf1, 0x8b, 0x91, 0x54, 0xfd, 0xa0, 0x7a, 0x01, + 0x52, 0x4a, 0xee, 0xf7, 0xea, 0xac, 0x19, 0xe8, 0x26, 0x8c, 0x5b, 0x23, 0xd3, 0xa3, 0xa6, 0x44, + 0xdf, 0x9c, 0x90, 0xd8, 0x09, 0x68, 0xda, 0x44, 0x50, 0x2c, 0x55, 0x44, 0xd5, 0xc2, 0x7d, 0xab, + 0xb0, 0x44, 0x81, 0xe5, 0xd9, 0x89, 0x0b, 0x08, 0x7e, 0xe0, 0x15, 0x0f, 0xef, 0x80, 0xd9, 0x46, + 0xef, 0x0d, 0x58, 0x9b, 0xa2, 0x5f, 0x74, 0xb4, 0x5c, 0x66, 0x84, 0x5b, 0x5d, 0x5e, 0x08, 0xd1, + 0xfc, 0x8e, 0x7b, 0xb4, 0x51, 0x59, 0x17, 0xb3, 0x32, 0xdb, 0x86, 0x6a, 0x7a, 0x11, 0x74, 0x78, + 0xda, 0x6b, 0x50, 0x10, 0x16, 0x04, 0x48, 0x1f, 0xc8, 0x24, 0x9f, 0x77, 0xb7, 0x39, 0x0f, 0xd4, + 0xde, 0x34, 0x50, 0x3a, 0xb7, 0x2d, 0x0e, 0x6e, 0x9e, 0x15, 0x9a, 0x8e, 0x90, 0x1e, 0x93, 0xbf, + 0x6b, 0xb8, 0xeb, 0x10, 0x52, 0xe4, 0x0d, 0x7f, 0x05, 0x0e, 0x5d, 0x87, 0x25, 0x8f, 0xbc, 0x7f, + 0x25, 0xfa, 0xce, 0x37, 0x03, 0xac, 0x15, 0xfa, 0x46, 0x3d, 0xd5, 0x48, 0xfb, 0xf2, 0x63, 0x7b, + 0xda, 0x6f, 0x37, 0xdb, 0xbe, 0xc0, 0xad, 0xac, 0xb3, 0x36, 0xe4, 0xe6, 0x15, 0xd7, 0xd4, 0xc8, + 0x4e, 0xe0, 0x74, 0x3d, 0xe7, 0x31, 0x05, 0xf3, 0x42, 0x79, 0x12, 0x91, 0x56, 0x8e, 0xf7, 0xd1, + 0x60, 0xd4, 0x7d, 0x28, 0x53, 0x5b, 0xe9, 0x16, 0x25, 0x17, 0x32, 0x6c, 0x3a, 0x80, 0xc8, 0x23, + 0xe3, 0x54, 0xef, 0xc4, 0xfe, 0xd7, 0x21, 0xa1, 0xc1, 0x01, 0xfc, 0xad, 0x4e, 0x3d, 0x14, 0xb5, + 0xd4, 0x08, 0x9d, 0xdd, 0x98, 0x6c, 0xd6, 0x26, 0x4d, 0xad, 0x83, 0x50, 0x45, 0x82, 0x0e, 0x8d, + 0x1e, 0x4c, 0x7a, 0xea, 0x65, 0xb2, 0x1c, 0x75, 0x2d, 0xe3, 0x57, 0xd2, 0x26, 0x56, 0x8c, 0x46, + 0xb7, 0x83, 0x61, 0x4b, 0x1d, 0xe0, 0x42, 0xa1, 0x3f, 0x9d, 0xe5, 0x37, 0xdd, 0xfa, 0x21, 0xd8, + 0x45, 0x2a, 0xa5, 0xc8, 0x4f, 0x8a, 0x38, 0x0c, 0xc0, 0x7f, 0x43, 0xac, 0xfa, 0xaf, 0x8b, 0x84, + 0xdf, 0x70, 0xc3, 0xf7, 0x1b, 0xff, 0x1c, 0x82, 0x66, 0xdb, 0x04, 0x27, 0xa8, 0x60, 0x38, 0xd9, + 0x6a, 0x76, 0xbc, 0xd2, 0xac, 0xa7, 0x2c, 0xa7, 0x25, 0xde, 0xe2, 0xff, 0xc0, 0x30, 0xbb, 0x45, + 0x3c, 0x11, 0xea, 0x3b, 0x33, 0xfb, 0x40, 0x71, 0xbe, 0xfe, 0xa6, 0x0b, 0xb9, 0xac, 0xff, 0xa9, + 0xe4, 0xc6, 0x5d, 0x9a, 0x9b, 0xea, 0x10, 0x53, 0x95, 0xa3, 0x4f, 0x9b, 0xc7, 0x8c, 0x4c, 0x5e, + 0x92, 0x95, 0xc1, 0x52, 0xd2, 0xe1, 0x45, 0x4a, 0x53, 0x14, 0xc1, 0xed, 0x1f, 0xba, 0x8a, 0x47, + 0xc3, 0x64, 0x1e, 0x7b, 0xf6, 0x61, 0x39, 0xb8, 0x1c, 0x83, 0x59, 0x2d, 0x1e, 0xf6, 0xb4, 0x81, + 0x32, 0xee, 0xe0, 0x97, 0xd2, 0x25, 0xdb, 0xa6, 0x44, 0xf0, 0xe9, 0x73, 0xa1, 0xb5, 0xfc, 0x1b, + 0x04, 0xe5, 0x5d, 0x35, 0x3c, 0xe3, 0x1b, 0x4a, 0x30, 0x02, 0x29, 0x00, 0xe9, 0xda, 0xc5, 0x74, + 0x6f, 0x7e, 0xb4, 0xa1, 0x4f, 0xbb, 0xfe, 0x8b, 0x36, 0x74, 0x2a, 0x4e, 0xee, 0xc6, 0x85, 0x38, + 0x05, 0x74, 0xfe, 0x5c, 0xf2, 0xca, 0x39, 0xdd, 0xab, 0xca, 0xa4, 0x30, 0xf9, 0xee, 0xf1, 0x3b, + 0xdd, 0x2c, 0xe0, 0x64, 0x73, 0x88, 0x9e, 0x80, 0x0f, 0xbf, 0xf8, 0x5e, 0x1a, 0x8b, 0x05, 0xea, + 0x9a, 0x9a, 0xae, 0x82, 0xeb, 0x6d, 0x04, 0xbf, 0xa8, 0x25, 0xdf, 0x54, 0x17, 0x92, 0x3d, 0x52, + 0x4e, 0x3c, 0x93, 0xc6, 0x5a, 0xd8, 0x50, 0xf8, 0x57, 0x42, 0xf2, 0x02, 0x9e, 0xbb, 0xf6, 0x44, + 0xd7, 0x0d, 0x59, 0xdf, 0x77, 0x3b, 0x23, 0x54, 0x7b, 0xa7, 0x67, 0x75, 0xf3, 0xe5, 0x75, 0x3e, + 0x9d, 0xdc, 0xe0, 0xdc, 0x75, 0xb8, 0x93, 0xf0, 0xd2, 0x5b, 0x03, 0x9c, 0x56, 0x4d, 0x22, 0xd9, + 0xfd, 0x42, 0xb2, 0xcf, 0xc9, 0xb4, 0x3f, 0xe5, 0x32, 0x01, 0x75, 0x54, 0xa4, 0xdf, 0xa3, 0x43, + 0xcd, 0x77, 0x25, 0x87, 0xb9, 0x74, 0x07, 0x71, 0xe8, 0xa6, 0x82, 0x82, 0x14, 0x16, 0x94, 0x45, + 0x6a, 0xb1, 0x42, 0xfe, 0x7b, 0xbf, 0x08, 0xa2, 0x1d, 0x42, 0xc2, 0x79, 0x6e, 0xec, 0x50, 0x71, + 0x57, 0xa5, 0x81, 0xbf, 0xe4, 0x52, 0x68, 0xf1, 0xd4, 0xc9, 0xdb, 0x34, 0x2d, 0x9e, 0xda, 0x2f, + 0x29, 0xda, 0x43, 0x6a, 0xc6, 0x13, 0x09, 0x9e, 0xf1, 0xfb, 0xe1, 0x6b, 0x9b, 0x48, 0x5d, 0x8e, + 0xcb, 0xc0, 0xb3, 0x0f, 0x48, 0x67, 0x8e, 0x53, 0xd7, 0x51, 0x8e, 0xf4, 0x44, 0x1d, 0xcf, 0xc4, + 0x03, 0x0d, 0x64, 0x68, 0xb9, 0x62, 0x2b, 0x0b, 0x31, 0xf1, 0xc8, 0x22, 0xce, 0xbe, 0xc5, 0xa6, + 0x06, 0x4f, 0x43, 0x9a, 0x1b, 0xa5, 0xfc, 0xa6, 0xac, 0xe4, 0x94, 0x5e, 0x4b, 0x80, 0x65, 0xfe, + 0xb4, 0xeb, 0xd4, 0x4d, 0x0e, 0x66, 0x01, 0x1d, 0x2b, 0x31, 0x7d, 0xfc, 0x3a, 0xb2, 0x63, 0x45, + 0x5b, 0x3a, 0x64, 0xd1, 0xc8, 0x25, 0x1a, 0xa6, 0x6c, 0x96, 0xa5, 0x9c, 0x20, 0xfc, 0xf8, 0x8a, + 0x0d, 0x5b, 0x83, 0x19, 0xd4, 0xde, 0x01, 0xc3, 0x22, 0x06, 0x6c, 0x0b, 0x0a, 0x17, 0x9c, 0x77, + 0x1f, 0xc0, 0x53, 0x07, 0xc7, 0x6f, 0xe3, 0xdf, 0x61, 0x6e, 0x21, 0x0e, 0x8f, 0x26, 0x3b, 0x89, + 0x3b, 0x7b, 0x11, 0x7a, 0xf2, 0x88, 0x29, 0x98, 0xff, 0xec, 0x4b, 0x95, 0xee, 0x8b, 0xc7, 0xde, + 0x60, 0x0a, 0x49, 0x0e, 0x4f, 0xa3, 0x91, 0xa9, 0xfc, 0x97, 0x4a, 0x34, 0xe8, 0x00, 0x8f, 0x38, + 0xa6, 0x91, 0xe5, 0xde, 0xfe, 0x2d, 0x20, 0xde, 0xd8, 0x9b, 0x6a, 0x97, 0x14, 0x3a, 0xaf, 0x2f, + 0x47, 0x8a, 0x66, 0x22, 0x03, 0x68, 0x4b, 0x9b, 0xe4, 0xbd, 0x98, 0x2e, 0x5f, 0x21, 0x63, 0x5a, + 0x9a, 0x70, 0x27, 0x41, 0x46, 0x51, 0x27, 0xbb, 0xa1, 0xb6, 0xd5, 0x2d, 0xdf, 0x09, 0x64, 0xd5, + 0xdb, 0x0c, 0x2f, 0x4c, 0x00, 0x55, 0x45, 0xd1, 0x12, 0xd7, 0xdb, 0x81, 0x09, 0x40, 0x59, 0xba, + 0x93, 0xe8, 0xfc, 0x0c, 0x1a, 0x9e, 0x00, 0xd9, 0xf7, 0xc5, 0x68, 0x23, 0x16, 0x10, 0x51, 0xba, + 0xb0, 0x0c, 0x67, 0x56, 0x6d, 0xd4, 0x81, 0x88, 0xa1, 0x6f, 0xcc, 0x9c, 0x54, 0x3b, 0x5a, 0xc0, + 0x27, 0x90, 0xaa, 0xf1, 0x10, 0xf7, 0x28, 0x56, 0xec, 0x49, 0x05, 0x41, 0x88, 0x24, 0x9a, 0x8b, + 0x62, 0x5f, 0xe1, 0x9c, 0xa6, 0xd7, 0x23, 0x08, 0x80, 0xf5, 0x85, 0x4d, 0xce, 0xa4, 0xf5, 0x11, + 0xc0, 0x4b, 0xd3, 0x64, 0xe4, 0x2e, 0x08, 0x3b, 0xea, 0x33, 0x46, 0xaf, 0x92, 0xec, 0x61, 0xc8, + 0x14, 0xee, 0x6f, 0x90, 0x5a, 0xe8, 0x3e, 0xcb, 0xe1, 0x41, 0xd8, 0x5f, 0xab, 0xac, 0x5b, 0xe7, + 0x61, 0x09, 0x92, 0x62, 0xc8, 0x42, 0x12, 0x3f, 0x9d, 0x17, 0x11, 0x17, 0x1d, 0x89, 0x1c, 0x59, + 0x55, 0x42, 0xec, 0x37, 0x7b, 0xdc, 0x30, 0xe7, 0x01, 0x8f, 0x76, 0x6c, 0xda, 0xb0, 0x45, 0x50, + 0x02, 0x8d, 0x27, 0xea, 0x55, 0x04, 0x11, 0xf6, 0xf3, 0x3f, 0xca, 0xed, 0xef, 0x8c, 0xf6, 0xb6, + 0xd5, 0x83, 0x46, 0xa1, 0x56, 0xd9, 0xc5, 0xa5, 0x65, 0x45, 0x9c, 0x50, 0x3e, 0x9e, 0xc6, 0xd0, + 0x83, 0x8d, 0x13, 0xd0, 0x6a, 0x21, 0x30, 0x44, 0x70, 0x6a, 0x95, 0xf2, 0x48, 0x18, 0x84, 0xe5, + 0x60, 0xa4, 0xb3, 0xe5, 0x74, 0xe0, 0x8a, 0x47, 0x58, 0x82, 0x89, 0xb7, 0x16, 0xc0, 0x1a, 0x0f, + 0x0f, 0x35, 0x56, 0xa3, 0x0c, 0xdb, 0x12, 0xc0, 0x02, 0x8f, 0x1a, 0x72, 0xd1, 0x73, 0xbf, 0xf0, + 0x67, 0x94, 0xaa, 0xc8, 0x73, 0x5b, 0x95, 0x61, 0x5a, 0xca, 0x41, 0xf5, 0xe9, 0xc6, 0x38, 0x21, + 0x67, 0x1b, 0xe7, 0xc5, 0x7b, 0x0d, 0x06, 0x60, 0x6d, 0x31, 0x40, 0x6e, 0xa5, 0xd6, 0xfa, 0xe1, + 0xd1, 0x85, 0x8e, 0x52, 0x2d, 0xf5, 0x06, 0x90, 0xf8, 0x55, 0xf9, 0x1e, 0x8e, 0x7f, 0xd5, 0xc7, + 0x32, 0x0a, 0x93, 0xb8, 0xe0, 0xe3, 0x1c, 0xe1, 0xa0, 0xfe, 0xa6, 0x11, 0x4b, 0x08, 0x14, 0x47, + 0x10, 0x56, 0xc5, 0x62, 0x38, 0x22, 0x12, 0xfc, 0x2b, 0x9a, 0x9e, 0xf2, 0x19, 0xe7, 0xa4, 0xa2, + 0x0f, 0xb8, 0x32, 0xeb, 0x42, 0x77, 0x3c, 0xb2, 0x41, 0xbf, 0x3c, 0x05, 0x19, 0xf3, 0x6a, 0x50, + 0x74, 0x41, 0x0e, 0x02, 0xab, 0x1a, 0xc7, 0x69, 0x04, 0x76, 0xb4, 0xb2, 0x45, 0x6f, 0x05, 0x92, + 0x77, 0x83, 0x9b, 0xc2, 0x4b, 0xeb, 0x30, 0xf1, 0x8e, 0xf0, 0x2c, 0xa8, 0x52, 0xdf, 0xcf, 0x0f, + 0xd4, 0x63, 0xb7, 0x55, 0x9e, 0x8d, 0xd9, 0xc0, 0xef, 0x02, 0xaa, 0x74, 0x76, 0x43, 0x4b, 0x60, + 0x53, 0x04, 0xce, 0x21, 0xa5, 0xa0, 0x1c, 0x48, 0xca, 0x64, 0xe3, 0xc7, 0x18, 0xc2, 0x67, 0x95, + 0xba, 0x85, 0xe9, 0x87, 0xee, 0xd8, 0x03, 0x07, 0xc4, 0xe7, 0x6a, 0xf8, 0x83, 0xb4, 0xbc, 0xb6, + 0x82, 0x9e, 0xc9, 0x1e, 0xe3, 0xa9, 0x36, 0x22, 0x77, 0xc4, 0x98, 0x3c, 0x50, 0xfb, 0x6e, 0xd9, + 0x42, 0x2a, 0x48, 0xb6, 0xe8, 0x33, 0x7c, 0xc4, 0x30, 0xd7, 0xc0, 0x59, 0x6d, 0x5c, 0x74, 0x93, + 0x8b, 0x70, 0x28, 0x25, 0xcc, 0x52, 0x3d, 0xb1, 0xa8, 0xa6, 0x60, 0x39, 0x3a, 0x2d, 0xf6, 0x53, + 0x0e, 0x34, 0x28, 0xe1, 0x2b, 0x89, 0x08, 0x27, 0x3a, 0x28, 0x51, 0xef, 0x20, 0xf9, 0x9c, 0x36, + 0xb1, 0x2c, 0xeb, 0x6a, 0xeb, 0x60, 0x08, 0x0b, 0x25, 0xac, 0x34, 0x4d, 0x21, 0xea, 0x2d, 0x27, + 0x98, 0x62, 0x14, 0x68, 0x41, 0x94, 0x66, 0x20, 0x0d, 0x52, 0x32, 0x0d, 0x71, 0x68, 0x1a, 0x44, + 0x13, 0x47, 0xda, 0x22, 0xd6, 0xf5, 0x3a, 0x3a, 0x05, 0x9f, 0xfc, 0x62, 0xbc, 0x76, 0xd9, 0x37, + 0x7f, 0x73, 0x2b, 0x8d, 0x83, 0xa5, 0x81, 0xf3, 0x98, 0x95, 0x56, 0x99, 0x19, 0x73, 0xd7, 0x24, + 0xf7, 0x62, 0x79, 0xf5, 0x7b, 0x2e, 0x05, 0x41, 0x65, 0x72, 0xfb, 0x6a, 0xd1, 0xd2, 0xe9, 0x9c, + 0x08, 0x53, 0x8d, 0x08, 0x84, 0x27, 0xe7, 0x6a, 0xda, 0x99, 0xf2, 0xbf, 0x13, 0xb4, 0x1f, 0xa8, + 0x5f, 0x21, 0x40, 0xc0, 0x64, 0xb4, 0x0a, 0x6a, 0x2f, 0x88, 0x09, 0xff, 0x82, 0x19, 0x9b, 0xec, + 0x4f, 0xa0, 0xdf, 0x73, 0xb2, 0x41, 0x00, 0x09, 0xa6, 0xff, 0x38, 0x58, 0x68, 0x44, 0xe0, 0x67, + 0xda, 0xd7, 0x57, 0xd9, 0x9c, 0xf6, 0x0a, 0xd6, 0x9f, 0x6a, 0x3b, 0x98, 0x59, 0xdd, 0xdf, 0xe2, + 0x10, 0x56, 0xd5, 0xf3, 0x51, 0x20, 0x7e, 0xc5, 0x78, 0x0d, 0x18, 0xcf, 0x8f, 0x0c, 0x01, 0xf2, + 0xaa, 0xa2, 0x05, 0x9c, 0x65, 0x8e, 0x10, 0x86, 0x0a, 0x2c, 0x6c, 0x45, 0x7b, 0x6d, 0x03, 0xdf, + 0x57, 0xd3, 0x36, 0x21, 0xee, 0xd1, 0xd1, 0x81, 0x5e, 0x27, 0x86, 0xbc, 0x76, 0x70, 0x85, 0xe0, + 0x95, 0x46, 0xc7, 0xc8, 0x8b, 0x95, 0x28, 0x39, 0xc8, 0x55, 0xf9, 0x61, 0x7c, 0xd5, 0x37, 0x48, + 0xad, 0x68, 0x1c, 0x4e, 0x84, 0x38, 0x48, 0x34, 0xad, 0x24, 0xab, 0xfa, 0x1d, 0x6f, 0xda, 0x2e, + 0x41, 0xc4, 0xcc, 0x5c, 0x3b, 0xaf, 0x32, 0xb7, 0x13, 0x3d, 0x0a, 0x44, 0x83, 0x01, 0x78, 0x07, + 0xfe, 0x6f, 0xae, 0xfe, 0x11, 0xa4, 0x29, 0x54, 0x7d, 0x83, 0x8a, 0xd4, 0xed, 0xba, 0x93, 0x13, + 0x60, 0x3a, 0xd4, 0xa9, 0xa4, 0x63, 0x3e, 0x06, 0x81, 0xa0, 0x31, 0x8b, 0xc2, 0x25, 0x70, 0xaa, + 0xc8, 0x41, 0xcd, 0xce, 0x55, 0x9b, 0x6a, 0x6f, 0x75, 0x01, 0xcb, 0xd4, 0xde, 0x6b, 0xcc, 0x38, + 0xe5, 0x14, 0x18, 0xe4, 0x53, 0xac, 0x26, 0x08, 0x1e, 0x07, 0x78, 0x3c, 0xd4, 0x17, 0xdd, 0x40, + 0x50, 0x3c, 0x94, 0x46, 0x6b, 0xc4, 0xf3, 0x7b, 0xdd, 0x2d, 0xe3, 0xe9, 0x0e, 0x23, 0x44, 0x39, + 0xbc, 0x97, 0xa4, 0xa0, 0xda, 0x84, 0x20, 0xec, 0x94, 0xce, 0x0e, 0x04, 0xd4, 0xb0, 0x61, 0xb4, + 0x4f, 0xa7, 0x08, 0x71, 0xd6, 0x8e, 0x48, 0x6f, 0x88, 0xd4, 0x19, 0x60, 0x0a, 0x91, 0x77, 0x99, + 0xbb, 0xce, 0x30, 0xb8, 0x36, 0x1b, 0x0c, 0x13, 0x0e, 0x2d, 0x79, 0xc6, 0xe6, 0x79, 0xa4, 0xd7, + 0x4d, 0xea, 0x8e, 0xa2, 0xc1, 0x40, 0xbd, 0x2b, 0xde, 0x04, 0x78, 0xa6, 0x59, 0x8a, 0x10, 0xac, + 0xc3, 0xf6, 0x53, 0x71, 0xfe, 0x79, 0x0f, 0x79, 0x37, 0xd5, 0xbf, 0xdd, 0xab, 0xad, 0xac, 0x9e, + 0x12, 0xac, 0xbd, 0xd5, 0x06, 0x26, 0x35, 0xab, 0xb1, 0x0d, 0x26, 0x5e, 0x87, 0x3a, 0xa0, 0x07, + 0xb0, 0xb5, 0x72, 0xc8, 0xad, 0x43, 0x2b, 0x87, 0xb1, 0x91, 0xf4, 0x1c, 0x42, 0xd8, 0x51, 0xa6, + 0x6e, 0xf6, 0xa7, 0xff, 0x53, 0xd8, 0xa5, 0x11, 0xce, 0x2c, 0x01, 0xf4, 0x1d, 0x22, 0x23, 0x4d, + 0xcb, 0x27, 0x61, 0x06, 0xdb, 0x9d, 0x3c, 0x99, 0x0c, 0x5e, 0x1f, 0xca, 0x13, 0xde, 0x97, 0xdf, + 0xbd, 0x28, 0x72, 0xdc, 0x2d, 0x69, 0x9c, 0x3b, 0x6a, 0xa2, 0x0c, 0x5c, 0xf6, 0xfa, 0x2f, 0xc5, + 0xe6, 0xd6, 0x6c, 0xcd, 0x1a, 0xfe, 0x39, 0xed, 0x31, 0x72, 0x26, 0xbb, 0xa5, 0xfd, 0x2a, 0x97, + 0x0a, 0xdb, 0xa5, 0x54, 0xb1, 0x44, 0x00, 0x3f, 0x9b, 0x79, 0xa2, 0xda, 0xc3, 0xc1, 0x4d, 0xdf, + 0x70, 0x43, 0xc9, 0x0b, 0xdb, 0x4a, 0x24, 0xf7, 0xba, 0x4b, 0xac, 0x46, 0x78, 0x42, 0x3b, 0x66, + 0xe3, 0x2d, 0x3a, 0x42, 0x9a, 0x84, 0x3c, 0x5b, 0x36, 0x6f, 0x66, 0x14, 0x58, 0xec, 0x60, 0x4b, + 0x67, 0xfb, 0x6a, 0x34, 0x2c, 0x6a, 0x15, 0xb7, 0xc6, 0x7b, 0x0a, 0xe3, 0x5b, 0x9a, 0xcd, 0x84, + 0x2e, 0xab, 0x18, 0x8f, 0x08, 0x07, 0xe2, 0x25, 0xb6, 0x3d, 0x21, 0x0f, 0x59, 0xb7, 0x92, 0xaa, + 0x4f, 0x79, 0xcd, 0x60, 0x7e, 0x0a, 0x0a, 0x85, 0xff, 0x4d, 0x0d, 0x01, 0x0f, 0xe2, 0xcf, 0x97, + 0xee, 0x13, 0x75, 0xfc, 0x91, 0x80, 0x0a, 0x96, 0x86, 0x6c, 0x88, 0x09, 0xeb, 0x5c, 0x71, 0x6b, + 0x24, 0x51, 0xec, 0xd3, 0xa4, 0x83, 0x14, 0x47, 0x8b, 0xa0, 0x21, 0x95, 0x38, 0xf3, 0x0f, 0x56, + 0x81, 0xb5, 0x93, 0xfe, 0xe1, 0x63, 0x8f, 0x88, 0x6b, 0x85, 0x38, 0xce, 0x3c, 0x5c, 0xea, 0x46, + 0x73, 0xb8, 0x00, 0xd9, 0x5d, 0xa8, 0x3f, 0x76, 0xfd, 0xdc, 0x9e, 0x78, 0x90, 0x83, 0xd2, 0x29, + 0xb2, 0xbd, 0x86, 0x85, 0x58, 0x65, 0x33, 0xb7, 0x01, 0xab, 0x68, 0x84, 0xc5, 0xab, 0x7a, 0x77, + 0x8e, 0x4b, 0xf2, 0x27, 0x3d, 0x44, 0x3e, 0xa4, 0x4e, 0x19, 0x20, 0xde, 0xaa, 0xe2, 0x28, 0xf2, + 0x85, 0x86, 0xa6, 0x92, 0x2a, 0xce, 0x88, 0xae, 0x9f, 0xfe, 0xff, 0xac, 0x1a, 0xbf, 0x78, 0x69, + 0xe4, 0x98, 0xb5, 0xa1, 0x54, 0x97, 0x05, 0x25, 0x70, 0x3e, 0x67, 0x00, 0x96, 0xc5, 0xe0, 0x39, + 0x9c, 0x95, 0x92, 0x7d, 0xd7, 0x23, 0x83, 0xb9, 0xe2, 0xf3, 0xbb, 0x65, 0x98, 0xcc, 0xda, 0x47, + 0xf2, 0xd3, 0x59, 0x43, 0x34, 0x92, 0x32, 0x03, 0x70, 0x5f, 0x5f, 0xcd, 0x8c, 0xba, 0xc6, 0x97, + 0x48, 0x20, 0x18, 0x8e, 0xe2, 0xfc, 0x96, 0xc9, 0x6a, 0x4a, 0xcf, 0x4c, 0xf8, 0x68, 0x55, 0x3c, + 0x80, 0x8f, 0x69, 0x41, 0xe2, 0xf1, 0x08, 0x90, 0xe4, 0xa0, 0xf4, 0x63, 0x04, 0x4f, 0x64, 0x16, + 0xfc, 0xd5, 0x32, 0xf0, 0x87, 0x57, 0x60, 0x28, 0x85, 0xfc, 0x1f, 0x8c, 0x42, 0xec, 0xc1, 0x41, + 0x93, 0x32, 0x0b, 0x4b, 0x8e, 0xbc, 0x18, 0xc7, 0x15, 0xd4, 0xe1, 0x99, 0x3f, 0x69, 0x74, 0x05, + 0x44, 0xd1, 0xd7, 0x83, 0xc0, 0x01, 0x00, 0x34, 0x0e, 0x44, 0x56, 0xf5, 0xe2, 0x6c, 0xfe, 0x26, + 0xfb, 0x10, 0x2a, 0xfc, 0xea, 0xb6, 0x1f, 0xef, 0x62, 0xbe, 0x39, 0x0d, 0xa2, 0xfc, 0xea, 0x72, + 0x2d, 0xa6, 0x1e, 0x5c, 0x25, 0x0f, 0xcc, 0xe6, 0xad, 0xc5, 0xe6, 0x53, 0xc9, 0x1c, 0x46, 0x4a, + 0x89, 0xaf, 0x58, 0xf9, 0xa3, 0x09, 0x0b, 0x6e, 0xdf, 0x29, 0xcd, 0xfc, 0x4c, 0xb8, 0x9b, 0x3e, + 0x0e, 0x5b, 0xdb, 0x4e, 0x4b, 0x82, 0x36, 0x7b, 0x01, 0xe9, 0x83, 0x75, 0x5a, 0xfc, 0xe5, 0x90, + 0xc3, 0xe9, 0xc2, 0x6f, 0x15, 0x8f, 0x01, 0xc5, 0x8a, 0x0a, 0xea, 0x73, 0x02, 0xc0, 0xa4, 0x7a, + 0x18, 0x32, 0x30, 0xb9, 0x05, 0xb7, 0x03, 0x02, 0xef, 0xac, 0x2f, 0xdc, 0x5c, 0x40, 0x2a, 0x56, + 0x0b, 0xe5, 0xe3, 0x70, 0x85, 0x88, 0x1d, 0xd9, 0x7d, 0xa0, 0x40, 0x8d, 0x37, 0x85, 0xdf, 0xd0, + 0xca, 0xd6, 0x1f, 0xe7, 0x67, 0xfa, 0xc5, 0xb8, 0x92, 0xdd, 0x4f, 0x26, 0x4d, 0x77, 0xbe, 0x51, + 0xa8, 0x0b, 0x1d, 0x2c, 0xb4, 0x52, 0x33, 0x8d, 0x95, 0xaf, 0xf1, 0xbd, 0x6e, 0x91, 0xde, 0xac, + 0xf6, 0xba, 0x0a, 0x5c, 0x9b, 0x67, 0x20, 0x21, 0xd1, 0x33, 0xf7, 0x0f, 0xf4, 0xb1, 0x2a, 0x6b, + 0x5b, 0x30, 0x31, 0x01, 0x1d, 0xb3, 0x10, 0xec, 0xef, 0x05, 0x24, 0x72, 0xd6, 0xb5, 0x14, 0x48, + 0xef, 0xc7, 0x93, 0xf8, 0xf4, 0x76, 0x9a, 0x24, 0x01, 0xe3, 0x26, 0xca, 0x30, 0xa0, 0xc5, 0x1c, + 0x7e, 0xc2, 0x19, 0x7a, 0x87, 0xf9, 0x1d, 0xd3, 0xa4, 0xae, 0x81, 0xb3, 0x06, 0x2f, 0xbd, 0xc3, + 0xd5, 0xb6, 0xd7, 0xa7, 0x82, 0x8d, 0xab, 0x0e, 0x34, 0x9e, 0xe2, 0x37, 0x2b, 0x0b, 0x49, 0x94, + 0x1f, 0x25, 0x33, 0x27, 0xdf, 0x15, 0x3e, 0x2c, 0x90, 0x60, 0x19, 0x28, 0xcc, 0xd1, 0x0f, 0xc8, + 0x67, 0x5e, 0x5c, 0x63, 0x42, 0x14, 0x7c, 0xfb, 0x22, 0x21, 0x43, 0x7f, 0x31, 0x3a, 0xa5, 0xe4, + 0x87, 0x75, 0xfe, 0x08, 0x45, 0xa7, 0x32, 0xd9, 0x5f, 0x54, 0x93, 0x64, 0xce, 0xaf, 0xca, 0x4a, + 0x1e, 0xd9, 0xde, 0x5a, 0x64, 0x9f, 0x77, 0x93, 0x49, 0x54, 0x7a, 0xa9, 0x96, 0xc0, 0x0e, 0xf4, + 0x0c, 0xc2, 0x43, 0x33, 0x42, 0x92, 0x3f, 0x11, 0x96, 0x8b, 0x50, 0x11, 0xa6, 0x9c, 0xe7, 0x38, + 0x40, 0xaa, 0x19, 0x56, 0x6e, 0x6e, 0x6a, 0xe6, 0x9f, 0xa4, 0xbe, 0x10, 0xc5, 0xf8, 0x72, 0xe0, + 0xaf, 0xec, 0x51, 0xa0, 0xd9, 0x28, 0x08, 0xe9, 0x16, 0x1c, 0x50, 0x97, 0xe7, 0x18, 0x38, 0xd0, + 0x05, 0x35, 0x49, 0x72, 0xfa, 0xe4, 0x7b, 0x6e, 0x52, 0x92, 0x41, 0x1d, 0xcd, 0x08, 0x79, 0xd7, + 0x75, 0xd8, 0x9e, 0x02, 0x70, 0xaf, 0x09, 0x6c, 0xac, 0x1c, 0x33, 0xa1, 0x7e, 0x56, 0xcd, 0xad, + 0x4e, 0x4d, 0xc8, 0xae, 0xa4, 0xac, 0xbf, 0x29, 0x52, 0xa0, 0x1e, 0x29, 0x76, 0x08, 0xc1, 0x2d, + 0x7f, 0xcf, 0x2a, 0x63, 0xde, 0xd0, 0x38, 0xa0, 0xf8, 0xf5, 0xc0, 0x0e, 0x1b, 0xce, 0x32, 0xe4, + 0x67, 0xa6, 0x9d, 0xf1, 0xb5, 0x02, 0x91, 0xb0, 0x4c, 0xbf, 0xf9, 0x38, 0x33, 0x47, 0xf8, 0x82, + 0x8f, 0x17, 0xc0, 0xd8, 0xa6, 0xe4, 0x0c, 0x85, 0xa7, 0xc2, 0x81, 0xf3, 0x99, 0x6e, 0x8c, 0x4b, + 0x40, 0x9e, 0x7c, 0x31, 0x13, 0x03, 0x36, 0x33, 0x0c, 0x95, 0xcd, 0xe3, 0x35, 0x4c, 0x73, 0x83, + 0x3d, 0x80, 0xaa, 0xa7, 0xbb, 0x15, 0x1b, 0x7e, 0xbd, 0x23, 0x31, 0xe7, 0x50, 0x51, 0xe0, 0x51, + 0xaf, 0xf1, 0x74, 0x2d, 0x4f, 0xa7, 0x6b, 0x81, 0x5a, 0x07, 0xd6, 0x0f, 0xb4, 0xdf, 0x95, 0x5d, + 0xf8, 0x7c, 0x47, 0xea, 0x0c, 0x90, 0x3d, 0x73, 0x2d, 0x05, 0x07, 0x50, 0xc9, 0x92, 0x6c, 0xdf, + 0xd3, 0xbc, 0xcc, 0xb0, 0x60, 0xfe, 0xf4, 0x6b, 0xc9, 0x9c, 0x1d, 0x99, 0x1f, 0x45, 0x66, 0xe9, + 0x66, 0xb3, 0xd8, 0x3f, 0x87, 0x32, 0x09, 0x0d, 0x8e, 0xe4, 0xb6, 0x68, 0xd8, 0x5c, 0x13, 0x58, + 0x16, 0x27, 0xa3, 0x9a, 0x51, 0x3a, 0x8a, 0xac, 0x03, 0x7e, 0x65, 0x32, 0x0e, 0xff, 0xb6, 0x2b, + 0x8f, 0xe1, 0x65, 0x03, 0x1d, 0x84, 0x31, 0x7b, 0x08, 0x29, 0x55, 0xa7, 0x1f, 0x1b, 0x95, 0x1d, + 0x5e, 0x68, 0x8f, 0x6f, 0xc7, 0x52, 0x55, 0x09, 0x8a, 0x8e, 0xff, 0xd3, 0x5b, 0x41, 0x60, 0xb8, + 0x3a, 0x05, 0x5b, 0xb9, 0xe0, 0xbe, 0x0f, 0xd8, 0xf7, 0x01, 0xb5, 0xeb, 0xc9, 0xed, 0x8e, 0xe4, + 0x85, 0x69, 0x18, 0xdd, 0xa1, 0x27, 0xf0, 0x9a, 0x13, 0x51, 0xe7, 0x22, 0xdf, 0x04, 0xcd, 0xc3, + 0xd9, 0xa8, 0x73, 0xdb, 0xe8, 0xb7, 0x39, 0x66, 0x9b, 0x36, 0x15, 0xad, 0x14, 0xad, 0x9d, 0xf0, + 0x64, 0x69, 0xa3, 0x6a, 0xbb, 0x59, 0xfb, 0xce, 0x00, 0xac, 0x23, 0xb4, 0x7f, 0x3a, 0xa2, 0xf9, + 0x55, 0x4b, 0x7b, 0x0f, 0x9d, 0x5a, 0x2b, 0xc7, 0x5e, 0xb7, 0xfb, 0x21, 0x10, 0xf4, 0x0d, 0x2e, + 0x62, 0xca, 0x7b, 0x30, 0x0f, 0xdf, 0xa7, 0xf3, 0xd2, 0xf4, 0x6c, 0xd8, 0x14, 0x76, 0x02, 0x3b, + 0x43, 0x59, 0xd7, 0xa9, 0x19, 0x81, 0x1d, 0x65, 0xe8, 0xc3, 0x9b, 0x69, 0xf2, 0xd4, 0x73, 0xf3, + 0xf8, 0x84, 0xaa, 0xf9, 0x1e, 0xa9, 0x1e, 0xcd, 0x84, 0xc4, 0x45, 0xa6, 0x34, 0xf2, 0x8a, 0x93, + 0x3b, 0xb6, 0x2b, 0xc8, 0x49, 0x48, 0x1c, 0xd9, 0x70, 0x8e, 0xf2, 0x07, 0x2b, 0xf5, 0x22, 0x63, + 0x3f, 0x0c, 0x2b, 0xb7, 0xd6, 0x8a, 0x6f, 0x64, 0x41, 0x33, 0x7a, 0xd7, 0x02, 0x13, 0x50, 0xec, + 0x36, 0xa9, 0x6a, 0x31, 0x26, 0xe3, 0x00, 0xa7, 0x67, 0xbb, 0xac, 0x22, 0xee, 0xbc, 0x33, 0xb0, + 0x4f, 0xdf, 0x2b, 0x36, 0xdf, 0x8f, 0x1a, 0x6a, 0xc5, 0x21, 0x78, 0xd0, 0x8c, 0x5c, 0x71, 0xe5, + 0xde, 0xa3, 0x85, 0x39, 0x5b, 0x62, 0x3f, 0xea, 0xae, 0x03, 0x14, 0x67, 0x4e, 0xc7, 0x9b, 0x4a, + 0x5d, 0x26, 0xca, 0x1f, 0xdf, 0xa0, 0x8f, 0x18, 0x2b, 0xf4, 0x2d, 0x4a, 0xd3, 0x9c, 0x07, 0x7c, + 0xb7, 0xa6, 0x1e, 0xcb, 0xb6, 0x48, 0x02, 0x79, 0x6a, 0xf3, 0x67, 0xf4, 0xe2, 0xe7, 0x5f, 0x0e, + 0x3a, 0x27, 0xb5, 0xff, 0xc4, 0xef, 0x5b, 0xf6, 0x02, 0x64, 0x73, 0x94, 0x8c, 0x50, 0x29, 0x86, + 0xcc, 0x02, 0x6e, 0xc4, 0x70, 0xa8, 0x36, 0xc9, 0x3f, 0x32, 0xc3, 0x1d, 0x21, 0x54, 0x64, 0x9d, + 0xdc, 0x71, 0x30, 0xd3, 0x97, 0x4c, 0x4c, 0xd2, 0xfa, 0xb9, 0x80, 0x11, 0x12, 0x47, 0xa3, 0x5d, + 0x85, 0x61, 0xbe, 0x6c, 0x8c, 0xdc, 0x12, 0x59, 0x1d, 0xbb, 0x81, 0xe6, 0x5e, 0x99, 0xf9, 0x78, + 0xce, 0xe1, 0x8b, 0x4f, 0x6a, 0x01, 0xce, 0xb4, 0xc1, 0xb0, 0xf8, 0x50, 0x4c, 0x4d, 0x48, 0x1e, + 0xea, 0x94, 0x6f, 0xab, 0x26, 0xf8, 0x0c, 0x74, 0xd2, 0xd3, 0x75, 0x6a, 0x83, 0x96, 0xfd, 0xb4, + 0x5e, 0xfb, 0x06, 0x63, 0xf7, 0x1c, 0xa9, 0x15, 0xc9, 0x72, 0xc2, 0xf7, 0x36, 0x03, 0x66, 0xca, + 0x66, 0x3b, 0x8e, 0x39, 0x59, 0x51, 0x27, 0x87, 0xe7, 0xbb, 0x98, 0xc2, 0xb0, 0xe6, 0x1c, 0xb9, + 0x05, 0xb6, 0xde, 0x55, 0xbb, 0xb8, 0xff, 0x42, 0x79, 0xf1, 0xa3, 0x09, 0xa6, 0xe2, 0xc9, 0xa5, + 0x58, 0x42, 0x9a, 0xdb, 0x08, 0xd3, 0x29, 0x17, 0xc2, 0x91, 0x10, 0xdf, 0x3a, 0xb3, 0x41, 0x3a, + 0x27, 0x73, 0xf7, 0xc7, 0xd9, 0xa4, 0x58, 0xef, 0xd2, 0xcd, 0x2e, 0xe1, 0x42, 0xd4, 0x05, 0x7e, + 0x96, 0x8b, 0x26, 0x99, 0x7c, 0xfc, 0x34, 0x33, 0x18, 0x3b, 0x29, 0x71, 0x3f, 0x39, 0x7a, 0x4c, + 0xf0, 0x01, 0x20, 0xe0, 0x44, 0x5a, 0x88, 0xb6, 0xcc, 0xb6, 0xcd, 0x96, 0x8a, 0x1f, 0x9e, 0xcb, + 0x3c, 0x7f, 0x7e, 0x1a, 0x2c, 0xbf, 0x2a, 0xda, 0xd1, 0x91, 0x53, 0x20, 0x00, 0x10, 0xb4, 0x83, + 0x78, 0x8f, 0xeb, 0xc1, 0x0f, 0xe2, 0x10, 0x14, 0x5d, 0x27, 0x3a, 0x3d, 0x5e, 0x3e, 0x3d, 0xe5, + 0x7c, 0x84, 0xaa, 0x7c, 0x6a, 0xa8, 0x3d, 0x86, 0x0a, 0x79, 0xcc, 0xa1, 0x09, 0x2e, 0x96, 0x41, + 0x41, 0xc5, 0xce, 0x3e, 0x9d, 0x93, 0x20, 0xb0, 0x7a, 0x53, 0xfd, 0x10, 0xba, 0x2f, 0xe4, 0x0f, + 0xfd, 0xbf, 0x55, 0x23, 0x2b, 0x3a, 0x2d, 0xaa, 0x7e, 0xf1, 0xbc, 0x6d, 0x93, 0x57, 0xc7, 0x1b, + 0xd4, 0x28, 0x03, 0x8f, 0xae, 0x3c, 0x90, 0xb2, 0xb1, 0xff, 0x2c, 0x40, 0xa2, 0xd4, 0x0a, 0x55, + 0xde, 0xeb, 0xf7, 0x85, 0xad, 0x6e, 0x13, 0x6e, 0x55, 0x53, 0x06, 0xf1, 0x37, 0x2e, 0x50, 0x78, + 0xe0, 0x6f, 0x27, 0xc1, 0xbe, 0xc5, 0x81, 0xb3, 0x52, 0xd5, 0xc0, 0xe9, 0x98, 0xf5, 0x74, 0x5b, + 0x17, 0xdd, 0x84, 0xbc, 0xed, 0x06, 0x2c, 0xa3, 0xa4, 0x48, 0xc9, 0xf1, 0xa1, 0x9d, 0xf2, 0x48, + 0x23, 0x59, 0x09, 0xd5, 0x88, 0xf1, 0x79, 0xa2, 0x03, 0xe6, 0x8d, 0xe6, 0x3a, 0xb9, 0xd3, 0xeb, + 0xcb, 0xa6, 0x13, 0xd0, 0xef, 0xe3, 0x11, 0x71, 0x0e, 0x1b, 0xf3, 0xd3, 0xa9, 0xc3, 0xfb, 0xc6, + 0xbd, 0xf8, 0xd8, 0x99, 0x41, 0x81, 0x6f, 0xe8, 0x09, 0x7d, 0x0a, 0xcd, 0x91, 0xc0, 0xa2, 0x38, + 0x42, 0x5c, 0x53, 0x19, 0x02, 0x5e, 0x21, 0xab, 0xa1, 0xf1, 0xe8, 0x0d, 0xf0, 0x6d, 0x65, 0xab, + 0x4d, 0x39, 0xa4, 0x05, 0xda, 0x30, 0xc4, 0x4c, 0x94, 0x3a, 0xd8, 0x49, 0x00, 0x39, 0x85, 0xe4, + 0x91, 0x55, 0xf9, 0x40, 0x08, 0x22, 0x04, 0x1a, 0xa5, 0xe2, 0x48, 0x3d, 0x10, 0x76, 0xb4, 0x25, + 0x7f, 0x12, 0xb2, 0xfb, 0xda, 0xa5, 0xa9, 0x18, 0x28, 0x91, 0x1d, 0x86, 0x0f, 0xda, 0x10, 0x53, + 0xa9, 0x99, 0xc1, 0xc8, 0x02, 0x41, 0x3a, 0x42, 0xdc, 0x55, 0x21, 0xca, 0x6e, 0x8a, 0x75, 0x5b, + 0xe1, 0x26, 0xdf, 0x16, 0x48, 0x14, 0xc7, 0x01, 0xad, 0x2f, 0x75, 0x49, 0x64, 0x44, 0xff, 0x5a, + 0xc6, 0x70, 0x89, 0x10, 0x79, 0xac, 0x0e, 0x2f, 0xaf, 0x6d, 0x57, 0xf5, 0x59, 0x6c, 0x79, 0x1b, + 0x9d, 0x4c, 0x39, 0xb3, 0xa5, 0xbf, 0xb6, 0xe0, 0x78, 0x76, 0x81, 0x4f, 0xde, 0xea, 0xa0, 0xdd, + 0x63, 0x25, 0x7c, 0x4f, 0x1d, 0x53, 0x2d, 0x2d, 0x4d, 0x61, 0x72, 0x86, 0x07, 0x6e, 0xd3, 0x23, + 0xe3, 0x79, 0xc4, 0x27, 0xc5, 0xfe, 0x5d, 0x05, 0xb1, 0xe3, 0x45, 0x1b, 0x6c, 0xd7, 0x1e, 0x8f, + 0x62, 0xc2, 0x85, 0x0d, 0x2c, 0xbe, 0x25, 0xc5, 0x38, 0xe9, 0xa2, 0x80, 0x34, 0x4f, 0x4e, 0x30, + 0xff, 0xaf, 0x16, 0x4c, 0x8b, 0xd0, 0xb1, 0x0e, 0x3f, 0x4e, 0xf9, 0x0d, 0x4e, 0x1d, 0x95, 0x49, + 0x66, 0xcf, 0xa0, 0x8f, 0xa3, 0xf6, 0x35, 0xfa, 0x88, 0xa1, 0xf9, 0xfc, 0x34, 0x71, 0xd6, 0xfe, + 0xbc, 0x21, 0x6f, 0xbe, 0xc4, 0xca, 0xd7, 0x85, 0xa3, 0x65, 0x10, 0x5c, 0x46, 0xc9, 0xbd, 0xce, + 0xbf, 0xcc, 0x4c, 0x3c, 0x7e, 0x2a, 0x28, 0x09, 0x6a, 0x73, 0x16, 0x35, 0xf7, 0xe3, 0x4e, 0x8a, + 0xbb, 0x7a, 0x54, 0x2c, 0xe1, 0x18, 0x1c, 0x90, 0x14, 0xe7, 0x5a, 0xe8, 0xd9, 0xc9, 0x29, 0x20, + 0x12, 0x5e, 0x0a, 0xcf, 0xdc, 0xcd, 0x16, 0x86, 0xde, 0x72, 0x0e, 0x41, 0x52, 0x91, 0x74, 0x4c, + 0x68, 0x50, 0xc1, 0x91, 0xcc, 0x92, 0xca, 0x42, 0x8a, 0x6a, 0x1a, 0xfd, 0x37, 0x70, 0x61, 0xab, + 0x18, 0x21, 0x07, 0x0e, 0xc5, 0x62, 0x02, 0xc8, 0xf8, 0xe5, 0xa3, 0x94, 0x38, 0xff, 0x40, 0xbf, + 0xee, 0x77, 0xa1, 0x5f, 0x19, 0x91, 0x26, 0x72, 0xc0, 0x32, 0x1b, 0x8a, 0xab, 0xc3, 0x2a, 0x00, + 0x50, 0xee, 0xd9, 0xc9, 0xa4, 0x07, 0x04, 0x7c, 0xa1, 0xd7, 0xbb, 0xba, 0x46, 0x64, 0xbc, 0x07, + 0x00, 0x30, 0x02, 0x1d, 0xe4, 0x64, 0xc9, 0x0d, 0x2a, 0xfc, 0x3a, 0xdb, 0xeb, 0x73, 0x54, 0x2a, + 0x97, 0x48, 0xa3, 0x06, 0xe7, 0x36, 0x1c, 0xae, 0xbb, 0xe2, 0x3a, 0xa7, 0x4f, 0xa4, 0x39, 0x67, + 0xc3, 0xab, 0x1f, 0x13, 0x30, 0xa2, 0x5c, 0x49, 0x52, 0x04, 0xf5, 0x46, 0x74, 0x50, 0xae, 0xa8, + 0xd3, 0xae, 0x33, 0x84, 0x9f, 0x8c, 0x27, 0xfc, 0x42, 0xa4, 0x44, 0x4f, 0x2d, 0xa2, 0xb9, 0x84, + 0x43, 0x46, 0x87, 0x6b, 0x4e, 0xb3, 0xa4, 0x47, 0x5c, 0xd1, 0xc2, 0xac, 0x0f, 0x34, 0x99, 0x00, + 0xfc, 0xc9, 0xab, 0x85, 0x0e, 0x49, 0x9f, 0xf4, 0x95, 0x7f, 0xc3, 0x8f, 0x35, 0xd0, 0x3c, 0xbe, + 0x7c, 0xbc, 0x2d, 0xe4, 0xd7, 0x03, 0x62, 0x86, 0xd8, 0x4d, 0x3d, 0x65, 0xc0, 0xa3, 0x7d, 0xc1, + 0x83, 0x70, 0xd0, 0x3a, 0x1b, 0xd6, 0x32, 0x46, 0xf4, 0xb6, 0x95, 0x09, 0xf7, 0xca, 0x71, 0xa8, + 0x05, 0x7b, 0xbb, 0xcb, 0x8e, 0x8f, 0x11, 0x79, 0x1a, 0xd1, 0xdd, 0x41, 0x3f, 0x95, 0x2b, 0xdf, + 0x31, 0x11, 0xa2, 0xe4, 0x56, 0x04, 0x11, 0x40, 0x68, 0x6b, 0xa7, 0x22, 0xa3, 0xb7, 0x7a, 0x95, + 0x2d, 0xa7, 0xd3, 0x61, 0x68, 0xb5, 0x26, 0x82, 0x8f, 0xb6, 0x21, 0xb3, 0xae, 0x12, 0x1c, 0xa6, + 0x22, 0x2f, 0xd2, 0x5e, 0x28, 0x14, 0x01, 0x94, 0xb9, 0x56, 0x88, 0x9f, 0x56, 0xd0, 0xee, 0x02, + 0xd3, 0x58, 0x6c, 0x9d, 0xc0, 0x0a, 0xf8, 0x0b, 0xdf, 0xea, 0xf0, 0xf9, 0xe5, 0xbb, 0x64, 0x46, + 0x29, 0x67, 0xa8, 0xaa, 0xb0, 0xb4, 0x24, 0xb2, 0x85, 0x20, 0x14, 0x42, 0x73, 0xe0, 0x53, 0xed, + 0xa0, 0x0f, 0x23, 0x7f, 0xd0, 0x9e, 0x98, 0xd2, 0x69, 0x64, 0x9b, 0xb1, 0x9c, 0xcd, 0x06, 0x8f, + 0x64, 0x52, 0x45, 0x24, 0x13, 0x35, 0x34, 0xbf, 0x52, 0xff, 0x4a, 0x1f, 0x96, 0x6a, 0xc5, 0x38, + 0xb3, 0x50, 0xf6, 0xe3, 0xb0, 0x7b, 0x3f, 0x3e, 0x67, 0xa7, 0x5b, 0x4e, 0x91, 0x27, 0xb5, 0x46, + 0x71, 0x0c, 0x50, 0xb1, 0xfb, 0xb5, 0x90, 0x9a, 0x8d, 0xa5, 0x7b, 0x36, 0x11, 0x97, 0x56, 0xd8, + 0x31, 0x2c, 0x54, 0xe0, 0x12, 0x68, 0x1e, 0x86, 0x8c, 0x10, 0x36, 0xce, 0x12, 0x3b, 0xad, 0x8b, + 0xf1, 0x45, 0x97, 0xb8, 0x76, 0x19, 0x38, 0x99, 0x72, 0x87, 0x78, 0x1d, 0x6e, 0xe6, 0x75, 0x70, + 0x05, 0x3b, 0x1e, 0xfb, 0xe8, 0xba, 0x94, 0x67, 0x6e, 0x3e, 0x32, 0x86, 0xa3, 0x77, 0x07, 0xfc, + 0xa1, 0x05, 0x03, 0x97, 0x72, 0x7b, 0x9b, 0x8e, 0xd0, 0x63, 0x5a, 0xc4, 0x58, 0x1b, 0x5d, 0x95, + 0xe9, 0x49, 0x80, 0x7a, 0xfc, 0xcb, 0x08, 0xa4, 0x4d, 0xf6, 0x5d, 0x73, 0x77, 0xe1, 0x19, 0x1d, + 0xaf, 0x67, 0xa8, 0x6e, 0x37, 0xa9, 0x19, 0xe7, 0xa0, 0x17, 0x86, 0x62, 0x13, 0xde, 0x48, 0x81, + 0x72, 0x3b, 0xc2, 0xba, 0xdb, 0x4c, 0x9b, 0x0b, 0xab, 0x10, 0x2c, 0xf9, 0xc1, 0x0e, 0xc4, 0x2f, + 0x16, 0x35, 0x26, 0x91, 0xf2, 0xf8, 0x33, 0xc4, 0x01, 0x46, 0x3e, 0xb3, 0x21, 0x66, 0x62, 0xf7, + 0x5e, 0xae, 0x53, 0x7e, 0xdf, 0x62, 0xad, 0x96, 0x58, 0xc5, 0x52, 0x46, 0xb4, 0x13, 0x6a, 0x9f, + 0x69, 0x32, 0x55, 0xc8, 0xd4, 0xcd, 0x12, 0xa4, 0x6a, 0x7d, 0x31, 0x6a, 0x6e, 0x13, 0x56, 0xfc, + 0x8d, 0x2c, 0xe8, 0xf4, 0x54, 0x83, 0xaa, 0x2a, 0x00, 0xfd, 0xdd, 0xee, 0x95, 0x27, 0xbe, 0xcf, + 0x58, 0xb1, 0xa5, 0xdf, 0x1e, 0x2b, 0x18, 0x98, 0x3c, 0x6e, 0x1f, 0x5e, 0x93, 0xdf, 0x90, 0x2c, + 0x7d, 0xae, 0x89, 0xa7, 0x56, 0x59, 0x27, 0x5c, 0x15, 0x22, 0xf9, 0xf4, 0xdc, 0x71, 0x00, 0xfe, + 0x69, 0x9c, 0x34, 0x56, 0x07, 0x10, 0x1c, 0x47, 0x47, 0x6c, 0xa0, 0x43, 0x74, 0x68, 0x89, 0x8c, + 0x31, 0xd2, 0x69, 0x11, 0x94, 0x7f, 0x45, 0x01, 0x5a, 0x0e, 0x50, 0x75, 0xf6, 0x70, 0xa5, 0x5f, + 0xc1, 0x78, 0x45, 0xd8, 0x1d, 0x2b, 0xb6, 0xbc, 0x0f, 0xb8, 0xab, 0x13, 0x40, 0xf6, 0xb5, 0x43, + 0x82, 0x7d, 0xe5, 0x53, 0x63, 0x6a, 0xf7, 0xed, 0xf4, 0xf0, 0x56, 0x75, 0xdd, 0xc0, 0x8e, 0xa0, + 0x68, 0x66, 0xf1, 0xce, 0x08, 0x73, 0xbb, 0xd4, 0xff, 0x3e, 0x10, 0xbb, 0xca, 0x51, 0x48, 0x44, + 0xe7, 0x76, 0x37, 0x98, 0x0e, 0x80, 0xa5, 0x00, 0x46, 0xb3, 0x22, 0x02, 0x62, 0xe7, 0xef, 0x24, + 0x3a, 0xeb, 0x9c, 0x53, 0x30, 0x4f, 0x39, 0x38, 0x0b, 0xc0, 0x4c, 0x7b, 0xbf, 0xbf, 0xb4, 0xc8, + 0xf6, 0x5e, 0x69, 0x26, 0xfb, 0xdb, 0x0d, 0x80, 0x94, 0xd3, 0x4e, 0xa0, 0x51, 0x5b, 0xb2, 0x8d, + 0x5c, 0x31, 0xc9, 0x0f, 0x8c, 0xf5, 0xa9, 0x7f, 0x1b, 0xe8, 0x78, 0x51, 0x41, 0xdb, 0xf6, 0x40, + 0x62, 0x5d, 0x9b, 0x49, 0xbe, 0x09, 0x03, 0xc4, 0x43, 0xcc, 0xb1, 0xc5, 0xf8, 0x14, 0x9f, 0x05, + 0xa0, 0x4c, 0x93, 0x49, 0x3c, 0x7a, 0x05, 0xee, 0x35, 0x91, 0x38, 0xc7, 0xb0, 0x8a, 0xea, 0x1b, + 0x01, 0xcc, 0xc7, 0xb5, 0x0e, 0x02, 0xa8, 0xe2, 0xa3, 0x01, 0x81, 0x6c, 0x0a, 0x6a, 0xc3, 0x0d, + 0x0d, 0x4d, 0x58, 0x41, 0xcb, 0xfc, 0x36, 0x1e, 0x15, 0xf4, 0x89, 0xca, 0x1c, 0xbc, 0xd4, 0xd8, + 0x70, 0x36, 0x1d, 0x6d, 0x30, 0x7b, 0x28, 0x8d, 0x94, 0x4d, 0x8e, 0x02, 0xf3, 0x06, 0x44, 0x39, + 0xf4, 0xfe, 0xde, 0x2a, 0x45, 0xf2, 0xb5, 0xcb, 0x44, 0xe2, 0xd7, 0x41, 0x4f, 0xfb, 0x0a, 0x86, + 0xbf, 0x47, 0x21, 0x70, 0x17, 0x4d, 0x33, 0x5e, 0xd7, 0x00, 0x13, 0x47, 0xa3, 0x56, 0x90, 0x04, + 0x43, 0x5c, 0xf8, 0x61, 0x2b, 0xf8, 0x83, 0xe5, 0x5b, 0x48, 0x82, 0x0c, 0xbb, 0x92, 0xf5, 0xdc, + 0x03, 0xd3, 0x9b, 0xc6, 0x12, 0xb7, 0x34, 0x65, 0x28, 0xac, 0x45, 0x11, 0x61, 0x73, 0x58, 0x87, + 0xb2, 0xc7, 0x2c, 0xd8, 0x79, 0x28, 0xa5, 0x1f, 0xd3, 0x0b, 0xb6, 0x7a, 0x30, 0xa1, 0x9c, 0x25, + 0x23, 0x7b, 0x74, 0x17, 0xc4, 0xc6, 0x7c, 0xa9, 0x66, 0xeb, 0xe1, 0x2d, 0x74, 0x82, 0xc7, 0xe8, + 0xb3, 0xa6, 0xcd, 0x92, 0x15, 0x87, 0x0c, 0x2a, 0x0b, 0x04, 0x64, 0xf9, 0x3f, 0x81, 0x95, 0x5c, + 0xb2, 0x1c, 0x6d, 0xf7, 0xa4, 0x0b, 0xb9, 0xcd, 0xfe, 0x05, 0x9c, 0x4a, 0x66, 0xc3, 0xef, 0x0e, + 0x6b, 0xb9, 0xb2, 0x56, 0x1b, 0x82, 0x2f, 0xc1, 0x46, 0xbe, 0x31, 0xcb, 0x50, 0xdf, 0xa6, 0xe5, + 0xa8, 0x97, 0x2e, 0x13, 0xe2, 0xe3, 0x1d, 0x84, 0xa7, 0x4b, 0x45, 0x35, 0xb9, 0x6c, 0xa8, 0x1f, + 0x56, 0x3f, 0x30, 0xa8, 0x6c, 0x32, 0xb8, 0xae, 0xd0, 0x95, 0xd0, 0x5b, 0x8d, 0xec, 0x37, 0xb7, + 0xa7, 0x9f, 0xe6, 0x4f, 0xdc, 0xd1, 0x4a, 0xf9, 0xf0, 0x04, 0x6e, 0x93, 0x57, 0xbb, 0xbe, 0xf9, + 0xd2, 0x37, 0x2e, 0x14, 0x14, 0x54, 0xbe, 0xad, 0x9f, 0xad, 0xdd, 0x1c, 0x8e, 0x07, 0x6f, 0xb7, + 0x28, 0xc7, 0xe7, 0x5a, 0x5d, 0x70, 0x52, 0x96, 0x14, 0x5f, 0x44, 0xcc, 0xa0, 0xac, 0x0b, 0x2c, + 0xac, 0xe6, 0xe8, 0xba, 0x7a, 0x50, 0x29, 0x86, 0x88, 0xe7, 0x0d, 0x5c, 0xef, 0xa4, 0x87, 0x1b, + 0x71, 0xfd, 0xe9, 0x68, 0xb1, 0xae, 0xf6, 0xcd, 0xd7, 0xdf, 0x2a, 0xbf, 0x46, 0x45, 0xf0, 0x45, + 0xae, 0x1a, 0xef, 0x89, 0x31, 0x17, 0x1d, 0x37, 0xba, 0xed, 0x0a, 0x0c, 0xf5, 0x9f, 0x40, 0x4f, + 0x33, 0x80, 0x3a, 0xb4, 0x88, 0xa4, 0x30, 0x25, 0xe8, 0x4f, 0x03, 0xb4, 0x37, 0x12, 0x9d, 0x52, + 0x3e, 0xd5, 0xb8, 0x24, 0xdc, 0xd1, 0x35, 0xe6, 0xda, 0xa1, 0xd2, 0x02, 0x04, 0x58, 0x07, 0xdd, + 0xd0, 0x6a, 0x7b, 0xd6, 0x47, 0x0c, 0xaa, 0xcc, 0xe9, 0xf6, 0x11, 0xd3, 0xbd, 0xf7, 0x09, 0xab, + 0xd2, 0xf3, 0xd1, 0xda, 0x9c, 0xf0, 0x2f, 0x20, 0x14, 0x14, 0x78, 0xf5, 0x31, 0x7b, 0x19, 0x64, + 0x13, 0x1e, 0xbb, 0x18, 0x60, 0x1d, 0xcd, 0xa2, 0x52, 0x2e, 0x64, 0x79, 0xd2, 0xca, 0x81, 0xe5, + 0x6d, 0x4c, 0xe5, 0x52, 0xb5, 0x96, 0x0f, 0xc8, 0x80, 0x1a, 0x27, 0x69, 0x22, 0xef, 0x67, 0xde, + 0x7b, 0xf9, 0xaf, 0xfe, 0x34, 0x88, 0x1e, 0x2a, 0xb8, 0xbe, 0x10, 0xb7, 0x6e, 0xec, 0x73, 0x80, + 0x9d, 0xca, 0x48, 0xbd, 0xd3, 0xf7, 0x3d, 0xbb, 0xa8, 0x7c, 0x73, 0xbb, 0x1f, 0x2d, 0x1b, 0xd9, + 0x85, 0xf6, 0x16, 0x7e, 0xdd, 0x48, 0x87, 0x23, 0x95, 0xe3, 0x79, 0x07, 0xb9, 0xd9, 0x9f, 0xca, + 0x59, 0x2b, 0x7b, 0x82, 0x3e, 0x45, 0x00, 0x1f, 0xff, 0x01, 0x98, 0x56, 0x06, 0x0b, 0xc4, 0xe9, + 0x65, 0xf7, 0xac, 0x2a, 0x5d, 0x48, 0x9e, 0x6b, 0x02, 0x6a, 0x2d, 0xdf, 0x50, 0x87, 0x4b, 0x21, + 0x16, 0x74, 0x24, 0x99, 0xac, 0x2e, 0x11, 0x00, 0x44, 0xbb, 0x2e, 0x45, 0x65, 0xf7, 0x11, 0xd5, + 0xdb, 0xfc, 0x66, 0xed, 0xd9, 0x14, 0x54, 0x52, 0xc7, 0x44, 0xbb, 0x9b, 0x9b, 0x5d, 0x60, 0x69, + 0xbc, 0x43, 0xc3, 0x59, 0xdc, 0x99, 0xf5, 0x18, 0xdd, 0x92, 0x03, 0x24, 0xa8, 0xda, 0x5b, 0x91, + 0xc0, 0xf5, 0x51, 0x24, 0x8a, 0x75, 0x1b, 0x50, 0x86, 0x2d, 0x3a, 0xf7, 0x37, 0x36, 0x13, 0x1c, + 0x8c, 0x29, 0xae, 0xa1, 0x38, 0x5a, 0x89, 0x01, 0x01, 0x04, 0x57, 0x45, 0x54, 0x48, 0x01, 0x51, + 0x23, 0x84, 0x58, 0xb0, 0xd0, 0xdd, 0x6d, 0x49, 0x3e, 0xc9, 0x64, 0xa7, 0x46, 0x21, 0x17, 0x23, + 0x7e, 0xa2, 0x14, 0xab, 0x8b, 0xb5, 0x4b, 0x5a, 0x7d, 0x9e, 0x00, 0x5f, 0x56, 0x06, 0x86, 0x5f, + 0x5c, 0x7c, 0x04, 0xad, 0xb7, 0x14, 0x97, 0x25, 0xe0, 0x2a, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc9, 0xcd, 0x43, 0x2e, 0xde, 0xa8, 0x73, 0x19, 0xb8, 0xbd, 0xf5, 0xb4, 0x00, 0xd1, + 0x7c, 0xb0, 0xd4, 0x74, 0x3f, 0x21, 0x74, 0xc1, 0x50, 0x37, 0xc7, 0xfd, 0x9e, 0x5c, 0xdc, 0xe9, + 0x45, 0x86, 0x4c, 0x29, 0xe3, 0x15, 0x3f, 0x0c, 0x0f, 0x8d, 0xf0, 0x15, 0xdd, 0xa9, 0x02, 0x16, + 0x6c, 0xda, 0x01, 0x5a, 0xf9, 0x06, 0x33, 0x78, 0xfa, 0xdc, 0xc3, 0xcc, 0x19, 0xad, 0x25, 0xff, + 0x82, 0x25, 0x47, 0xea, 0x17, 0x04, 0x55, 0x5d, 0x56, 0x53, 0x69, 0x74, 0xd6, 0x2e, 0x91, 0xfc, + 0x3d, 0x6d, 0xcb, 0x39, 0x76, 0xf1, 0x08, 0x26, 0xba, 0xd9, 0x72, 0x21, 0xf4, 0x2d, 0x60, 0x2c, + 0x4f, 0x8e, 0x00, 0x3c, 0x99, 0x76, 0x4d, 0x0d, 0xda, 0x13, 0x9b, 0x31, 0x65, 0xda, 0x5d, 0xc4, + 0xbf, 0x97, 0x00, 0xc6, 0xa5, 0x63, 0xfc, 0xd0, 0x54, 0x3f, 0x54, 0x9e, 0x7b, 0x19, 0xd4, 0xcc, + 0x4c, 0xaf, 0x77, 0x33, 0xbb, 0x23, 0xe1, 0x95, 0x16, 0x4d, 0xde, 0xb6, 0xbf, 0xd4, 0x57, 0x8a, + 0x5d, 0x48, 0x12, 0x41, 0x31, 0xd3, 0x18, 0xc0, 0xdc, 0x23, 0xe2, 0xe6, 0xd5, 0x99, 0x50, 0xbe, + 0xa6, 0xe5, 0x9f, 0xe4, 0x90, 0xba, 0x1e, 0x9e, 0x26, 0xbd, 0x63, 0xcc, 0xb6, 0x4b, 0x36, 0x4d, + 0x91, 0x8c, 0x15, 0x65, 0x4b, 0x72, 0xa6, 0xda, 0xb9, 0x56, 0x7e, 0xf2, 0x57, 0xf2, 0x50, 0x2f, + 0xc2, 0xca, 0x84, +]]; From c3a8583903235196df21f3c03ff17ed1d20265cb Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 21:59:31 +0100 Subject: [PATCH 14/15] Add a method to return the inner value (IssueBundle) of IssueData wrapper --- zebra-chain/src/orchard_zsa/issuance.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/zebra-chain/src/orchard_zsa/issuance.rs b/zebra-chain/src/orchard_zsa/issuance.rs index d45f10253cd..4a3cb968926 100644 --- a/zebra-chain/src/orchard_zsa/issuance.rs +++ b/zebra-chain/src/orchard_zsa/issuance.rs @@ -27,6 +27,13 @@ use super::burn::ASSET_BASE_SIZE; #[derive(Clone, Debug, PartialEq, Eq)] pub struct IssueData(IssueBundle); +impl IssueData { + /// Returns a reference to the inner `IssueBundle`. + pub fn inner(&self) -> &IssueBundle { + &self.0 + } +} + impl From> for IssueData { fn from(inner: IssueBundle) -> Self { Self(inner) From 4855c25724fd15d8809304a933000766c90835dc Mon Sep 17 00:00:00 2001 From: Dmitry Demin Date: Mon, 11 Nov 2024 22:02:36 +0100 Subject: [PATCH 15/15] Add more checks after deserializing issuance block in issuance_block test --- zebra-chain/src/orchard_zsa/tests/issuance.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/zebra-chain/src/orchard_zsa/tests/issuance.rs b/zebra-chain/src/orchard_zsa/tests/issuance.rs index 902af757adf..9dc90d881c7 100644 --- a/zebra-chain/src/orchard_zsa/tests/issuance.rs +++ b/zebra-chain/src/orchard_zsa/tests/issuance.rs @@ -1,4 +1,4 @@ -use crate::{block::Block, serialization::ZcashDeserialize}; +use crate::{block::Block, serialization::ZcashDeserialize, transaction::Transaction}; use super::vectors::BLOCKS; @@ -6,4 +6,20 @@ use super::vectors::BLOCKS; fn issuance_block() { let issuance_block = Block::zcash_deserialize(BLOCKS[0].as_ref()).expect("issuance block should deserialize"); + + for transaction in issuance_block.transactions { + if let Transaction::V6 { + orchard_zsa_issue_data, + .. + } = transaction.as_ref() + { + let issue_bundle = orchard_zsa_issue_data + .as_ref() + .expect("V6 transaction in the issuance test block has orchard_zsa_issue_data") + .inner(); + + assert_eq!(issue_bundle.actions().len(), 1); + assert_eq!(issue_bundle.actions()[0].notes().len(), 1); + } + } }