diff --git a/Cargo.lock b/Cargo.lock index c34c7f4d8a2bb..48b27edd192c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4526,6 +4526,7 @@ dependencies = [ "fail", "futures", "hex", + "itertools 0.13.0", "move-binary-format", "move-core-types", "move-unit-test", @@ -9527,7 +9528,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -17527,7 +17528,7 @@ dependencies = [ "errno", "js-sys", "libc", - "rustix 0.38.28", + "rustix 0.37.27", "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", "winapi 0.3.9", diff --git a/api/doc/spec.json b/api/doc/spec.json index c436c7f51082b..f08a1894615ad 100644 --- a/api/doc/spec.json +++ b/api/doc/spec.json @@ -13959,6 +13959,21 @@ }, "components": { "schemas": { + "AbstractionSignature": { + "type": "object", + "required": [ + "function_info", + "auth_data" + ], + "properties": { + "function_info": { + "type": "string" + }, + "auth_data": { + "$ref": "#/components/schemas/HexEncodedBytes" + } + } + }, "AccountData": { "type": "object", "description": "Account data\n\nA simplified version of the onchain Account resource", @@ -13993,6 +14008,9 @@ }, { "$ref": "#/components/schemas/AccountSignature_NoAccountSignature" + }, + { + "$ref": "#/components/schemas/AccountSignature_AbstractionSignature" } ], "discriminator": { @@ -14002,10 +14020,33 @@ "multi_ed25519_signature": "#/components/schemas/AccountSignature_MultiEd25519Signature", "single_key_signature": "#/components/schemas/AccountSignature_SingleKeySignature", "multi_key_signature": "#/components/schemas/AccountSignature_MultiKeySignature", - "no_account_signature": "#/components/schemas/AccountSignature_NoAccountSignature" + "no_account_signature": "#/components/schemas/AccountSignature_NoAccountSignature", + "abstraction_signature": "#/components/schemas/AccountSignature_AbstractionSignature" } } }, + "AccountSignature_AbstractionSignature": { + "allOf": [ + { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "abstraction_signature" + ], + "example": "abstraction_signature" + } + } + }, + { + "$ref": "#/components/schemas/AbstractionSignature" + } + ] + }, "AccountSignature_Ed25519Signature": { "allOf": [ { diff --git a/api/doc/spec.yaml b/api/doc/spec.yaml index 8fef310321eda..dcf362d6f4fb0 100644 --- a/api/doc/spec.yaml +++ b/api/doc/spec.yaml @@ -10438,6 +10438,16 @@ paths: operationId: view components: schemas: + AbstractionSignature: + type: object + required: + - function_info + - auth_data + properties: + function_info: + type: string + auth_data: + $ref: '#/components/schemas/HexEncodedBytes' AccountData: type: object description: |- @@ -10468,6 +10478,7 @@ components: - $ref: '#/components/schemas/AccountSignature_SingleKeySignature' - $ref: '#/components/schemas/AccountSignature_MultiKeySignature' - $ref: '#/components/schemas/AccountSignature_NoAccountSignature' + - $ref: '#/components/schemas/AccountSignature_AbstractionSignature' discriminator: propertyName: type mapping: @@ -10476,6 +10487,19 @@ components: single_key_signature: '#/components/schemas/AccountSignature_SingleKeySignature' multi_key_signature: '#/components/schemas/AccountSignature_MultiKeySignature' no_account_signature: '#/components/schemas/AccountSignature_NoAccountSignature' + abstraction_signature: '#/components/schemas/AccountSignature_AbstractionSignature' + AccountSignature_AbstractionSignature: + allOf: + - type: object + required: + - type + properties: + type: + type: string + enum: + - abstraction_signature + example: abstraction_signature + - $ref: '#/components/schemas/AbstractionSignature' AccountSignature_Ed25519Signature: allOf: - type: object diff --git a/api/src/tests/account_abstraction_test.rs b/api/src/tests/account_abstraction_test.rs new file mode 100644 index 0000000000000..0e507ec251f3e --- /dev/null +++ b/api/src/tests/account_abstraction_test.rs @@ -0,0 +1,188 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use super::new_test_context; +use aptos_api_test_context::{current_function_name, TestContext}; +use aptos_crypto::{ + bls12381::{PrivateKey, PublicKey}, + test_utils::KeyPair, + SigningKey, Uniform, +}; +use aptos_types::{ + function_info::FunctionInfo, + transaction::{EntryFunction, TransactionStatus}, +}; +use move_core_types::{identifier::Identifier, language_storage::ModuleId, vm_status::StatusCode}; +use rand::rngs::OsRng; +use serde_json::json; +use std::{path::PathBuf, sync::Arc}; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_account_abstraction_single_signer() { + let key_pair = Arc::new(KeyPair::::generate(&mut OsRng)); + + let mut context = new_test_context(current_function_name!()); + let mut account = context.create_account().await; + let user_addr = account.address(); + let other = context.create_account().await; + + // Publish packages + let named_addresses = vec![("aa".to_string(), user_addr)]; + let txn = futures::executor::block_on(async move { + let path = PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) + .join("../aptos-move/move-examples/account_abstraction/bls12381_single_key"); + TestContext::build_package(path, named_addresses) + }); + context.publish_package(&mut account, txn).await; + + let txn0 = context.mint_user_account(&account).await; + context.commit_block(&vec![txn0]).await; + + context + .api_execute_entry_function( + &mut account, + &format!("0x{}::single_key::update_public_key", user_addr.to_hex()), + json!([]), + json!([hex::encode(key_pair.public_key.to_bytes())]), + ) + .await; + + let func_info = FunctionInfo::new( + user_addr, + "single_key".to_string(), + "authenticate".to_string(), + ); + let txn3 = context + .add_dispatchable_authentication_function(&account, func_info.clone()) + .await; + context.commit_block(&vec![txn3]).await; + + let factory = context.transaction_factory(); + + let fake_sign = Arc::new(|_: &[u8]| b"invalid_signature".to_vec()); + // case 1: invalid aa signature + account.set_abstraction_auth(func_info.clone(), fake_sign); + let aa_txn = account.sign_aa_transaction_with_transaction_builder( + vec![], + None, + factory + .account_transfer(other.address(), 1) + .expiration_timestamp_secs(u64::MAX), + ); + + let txn_status = context.try_commit_block(&vec![aa_txn]).await; + assert!(matches!( + txn_status.last(), + Some(TransactionStatus::Discard(StatusCode::ABORTED)) + )); + // decrement seq num for aborted txn. + account.decrement_sequence_number(); + + // case 2: successful AA txn. + let sign_func = Arc::new(move |x: &[u8]| { + key_pair + .private_key + .sign_arbitrary_message(x) + .to_bytes() + .to_vec() + }); + account.set_abstraction_auth(func_info.clone(), sign_func); + let balance_start = context.get_apt_balance(other.address()).await; + let aa_txn = account.sign_aa_transaction_with_transaction_builder( + vec![], + None, + factory + .account_transfer(other.address(), 4) + .expiration_timestamp_secs(u64::MAX), + ); + context + .expect_status_code(202) + .post_bcs_txn("/transactions", bcs::to_bytes(&aa_txn).unwrap()) + .await; + context.commit_mempool_txns(1).await; + assert_eq!( + balance_start + 4, + context.get_apt_balance(other.address()).await + ); +} + +/// This tests a function with params (signer_a, signer_b, signer_c, d) works for the AA authentication flow. +/// a, c are AA; b, d are normal ed25519 accounts. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_account_abstraction_multi_agent_with_abstracted_sender() { + let key_pair = Arc::new(KeyPair::::generate(&mut OsRng)); + let mut context = new_test_context(current_function_name!()); + let mut a = context.create_account().await; + let b = context.create_account().await; + let mut c = context.create_account().await; + let d = context.create_account().await; + let a_addr = a.address(); + + // Publish packages + let named_addresses = vec![("aa".to_string(), a_addr)]; + let txn = futures::executor::block_on(async move { + let path = PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) + .join("../aptos-move/move-examples/account_abstraction/bls12381_single_key"); + TestContext::build_package(path, named_addresses) + }); + context.publish_package(&mut a, txn).await; + + context + .commit_block(&vec![context.mint_user_account(&a).await]) + .await; + context + .commit_block(&vec![context.mint_user_account(&b).await]) + .await; + context + .commit_block(&vec![context.mint_user_account(&c).await]) + .await; + + // Convert c to aa + context + .api_execute_entry_function( + &mut c, + &format!("0x{}::single_key::update_public_key", a_addr.to_hex()), + json!([]), + json!([hex::encode(key_pair.public_key.to_bytes())]), + ) + .await; + let func_info = FunctionInfo::new(a_addr, "single_key".to_string(), "authenticate".to_string()); + let txn = context + .add_dispatchable_authentication_function(&c, func_info.clone()) + .await; + context.commit_block(&vec![txn]).await; + + let sign_func = Arc::new(move |x: &[u8]| { + key_pair + .private_key + .sign_arbitrary_message(x) + .to_bytes() + .to_vec() + }); + c.set_abstraction_auth(func_info, sign_func); + + let factory = context.transaction_factory(); + let balance_start = context.get_apt_balance(d.address()).await; + let aa_txn = a.sign_aa_transaction_with_transaction_builder( + vec![&b, &c], + None, + factory + .entry_function(EntryFunction::new( + ModuleId::new(a_addr, Identifier::new("test_functions").unwrap()), + Identifier::new("transfer_to_the_last").unwrap(), + vec![], + vec![bcs::to_bytes(&d.address()).unwrap()], + )) + .expiration_timestamp_secs(u64::MAX), + ); + context + .expect_status_code(202) + .post_bcs_txn("/transactions", bcs::to_bytes(&aa_txn).unwrap()) + .await; + context.commit_mempool_txns(1).await; + assert_eq!( + balance_start + 3, + context.get_apt_balance(d.address()).await + ); +} diff --git a/api/src/tests/mod.rs b/api/src/tests/mod.rs index 43468220043b8..ff6325fa6b796 100644 --- a/api/src/tests/mod.rs +++ b/api/src/tests/mod.rs @@ -2,6 +2,7 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 +mod account_abstraction_test; mod accounts_test; mod blocks_test; mod converter_test; diff --git a/api/test-context/src/test_context.rs b/api/test-context/src/test_context.rs index cd0e85509619d..e4f9d686be7ca 100644 --- a/api/test-context/src/test_context.rs +++ b/api/test-context/src/test_context.rs @@ -42,6 +42,7 @@ use aptos_types::{ block_info::BlockInfo, block_metadata::BlockMetadata, chain_id::ChainId, + function_info::FunctionInfo, indexer::indexer_db_reader::IndexerReader, ledger_info::{LedgerInfo, LedgerInfoWithSignatures}, transaction::{ @@ -506,6 +507,19 @@ impl TestContext { ) } + pub async fn add_dispatchable_authentication_function( + &self, + account: &LocalAccount, + func: FunctionInfo, + ) -> SignedTransaction { + let factory = self.transaction_factory(); + account.sign_with_transaction_builder( + factory + .add_dispatchable_authentication_function(func) + .expiration_timestamp_secs(u64::MAX), + ) + } + pub async fn execute_multisig_transaction( &mut self, owner: &mut LocalAccount, @@ -771,7 +785,10 @@ impl TestContext { } } - pub async fn commit_block(&mut self, signed_txns: &[SignedTransaction]) { + pub async fn try_commit_block( + &mut self, + signed_txns: &[SignedTransaction], + ) -> Vec { let metadata = self.new_block_metadata(); let timestamp = metadata.timestamp_usecs(); let txns: Vec = std::iter::once(Transaction::BlockMetadata(metadata.clone())) @@ -795,28 +812,36 @@ impl TestContext { .unwrap(); let compute_status = result.compute_status_for_input_txns().clone(); assert_eq!(compute_status.len(), txns.len(), "{:?}", result); - // But the rest of the txns must be Kept. - for st in compute_status { + if !compute_status + .iter() + .any(|s| !matches!(&s, TransactionStatus::Keep(_))) + { + self.executor + .commit_blocks( + vec![metadata.id()], + // StateCheckpoint/BlockEpilogue is added on top of the input transactions. + self.new_ledger_info(&metadata, result.root_hash(), txns.len() + 1), + ) + .unwrap(); + + self.mempool + .mempool_notifier + .notify_new_commit(txns, timestamp) + .await + .unwrap(); + } + compute_status + } + + pub async fn commit_block(&mut self, signed_txns: &[SignedTransaction]) { + // The txns must be kept. + for st in self.try_commit_block(signed_txns).await { match st { TransactionStatus::Discard(st) => panic!("transaction is discarded: {:?}", st), TransactionStatus::Retry => panic!("should not retry"), TransactionStatus::Keep(_) => (), } } - - self.executor - .commit_blocks( - vec![metadata.id()], - // StateCheckpoint/BlockEpilogue is added on top of the input transactions. - self.new_ledger_info(&metadata, result.root_hash(), txns.len() + 1), - ) - .unwrap(); - - self.mempool - .mempool_notifier - .notify_new_commit(txns, timestamp) - .await - .unwrap(); } pub async fn get_sequence_number(&self, account: AccountAddress) -> u64 { diff --git a/api/types/src/lib.rs b/api/types/src/lib.rs index e7ab206cde38a..5c9abbfcc26c3 100644 --- a/api/types/src/lib.rs +++ b/api/types/src/lib.rs @@ -45,17 +45,17 @@ pub use state::RawStateValueRequest; use std::str::FromStr; pub use table::{RawTableItemRequest, TableItemRequest}; pub use transaction::{ - AccountSignature, BlockMetadataTransaction, DeleteModule, DeleteResource, DeleteTableItem, - DirectWriteSet, Ed25519Signature, EncodeSubmissionRequest, EntryFunctionPayload, Event, - FeePayerSignature, GasEstimation, GasEstimationBcs, GenesisPayload, GenesisTransaction, - MultiAgentSignature, MultiEd25519Signature, MultiKeySignature, MultisigPayload, - MultisigTransactionPayload, NoAccountSignature, PendingTransaction, PublicKey, ScriptPayload, - ScriptWriteSet, Signature, SingleKeySignature, SubmitTransactionRequest, Transaction, - TransactionData, TransactionId, TransactionInfo, TransactionOnChainData, TransactionPayload, - TransactionSignature, TransactionSigningMessage, TransactionsBatchSingleSubmissionFailure, - TransactionsBatchSubmissionResult, UserCreateSigningMessageRequest, UserTransaction, - UserTransactionRequest, VersionedEvent, WriteModule, WriteResource, WriteSet, WriteSetChange, - WriteSetPayload, WriteTableItem, + AbstractionSignature, AccountSignature, BlockMetadataTransaction, DeleteModule, DeleteResource, + DeleteTableItem, DirectWriteSet, Ed25519Signature, EncodeSubmissionRequest, + EntryFunctionPayload, Event, FeePayerSignature, GasEstimation, GasEstimationBcs, + GenesisPayload, GenesisTransaction, MultiAgentSignature, MultiEd25519Signature, + MultiKeySignature, MultisigPayload, MultisigTransactionPayload, NoAccountSignature, + PendingTransaction, PublicKey, ScriptPayload, ScriptWriteSet, Signature, SingleKeySignature, + SubmitTransactionRequest, Transaction, TransactionData, TransactionId, TransactionInfo, + TransactionOnChainData, TransactionPayload, TransactionSignature, TransactionSigningMessage, + TransactionsBatchSingleSubmissionFailure, TransactionsBatchSubmissionResult, + UserCreateSigningMessageRequest, UserTransaction, UserTransactionRequest, VersionedEvent, + WriteModule, WriteResource, WriteSet, WriteSetChange, WriteSetPayload, WriteTableItem, }; pub use view::{ViewFunction, ViewRequest}; pub use wrappers::{EventGuid, IdentifierWrapper, StateKeyWrapper}; diff --git a/api/types/src/transaction.rs b/api/types/src/transaction.rs index bc3b51f2f5fc6..065e149448d92 100755 --- a/api/types/src/transaction.rs +++ b/api/types/src/transaction.rs @@ -22,6 +22,7 @@ use aptos_types::{ block_metadata_ext::BlockMetadataExt, contract_event::{ContractEvent, EventWithVersion}, dkg::{DKGTranscript, DKGTranscriptMetadata}, + function_info::FunctionInfo, jwks::{jwk::JWK, ProviderJWKs, QuorumCertifiedUpdate}, keyless, transaction::{ @@ -33,6 +34,7 @@ use aptos_types::{ Script, SignedTransaction, TransactionOutput, TransactionWithProof, }, }; +use bcs::to_bytes; use once_cell::sync::Lazy; use poem_openapi::{Object, Union}; use serde::{Deserialize, Serialize}; @@ -1916,6 +1918,18 @@ impl VerifyInput for NoAccountSignature { } } +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Object)] +pub struct AbstractionSignature { + pub function_info: String, + pub auth_data: HexEncodedBytes, +} + +impl VerifyInput for AbstractionSignature { + fn verify(&self) -> anyhow::Result<()> { + Ok(()) + } +} + impl TryFrom for TransactionAuthenticator { type Error = anyhow::Error; @@ -1933,6 +1947,17 @@ impl TryFrom for AccountAuthenticator { } } +impl TryFrom for AccountAuthenticator { + type Error = anyhow::Error; + + fn try_from(value: AbstractionSignature) -> Result { + Ok(AccountAuthenticator::Abstraction { + function_info: FunctionInfo::from_str(&value.function_info)?, + auth_data: bcs::from_bytes(value.auth_data.inner())?, + }) + } +} + /// Account signature scheme /// /// The account signature scheme allows you to have two types of accounts: @@ -1949,6 +1974,7 @@ pub enum AccountSignature { SingleKeySignature(SingleKeySignature), MultiKeySignature(MultiKeySignature), NoAccountSignature(NoAccountSignature), + AbstractionSignature(AbstractionSignature), } impl VerifyInput for AccountSignature { @@ -1959,6 +1985,7 @@ impl VerifyInput for AccountSignature { AccountSignature::SingleKeySignature(inner) => inner.verify(), AccountSignature::MultiKeySignature(inner) => inner.verify(), AccountSignature::NoAccountSignature(inner) => inner.verify(), + AccountSignature::AbstractionSignature(inner) => inner.verify(), } } } @@ -1973,6 +2000,7 @@ impl TryFrom for AccountAuthenticator { AccountSignature::SingleKeySignature(s) => s.try_into()?, AccountSignature::MultiKeySignature(s) => s.try_into()?, AccountSignature::NoAccountSignature(s) => s.try_into()?, + AccountSignature::AbstractionSignature(s) => s.try_into()?, }) } } @@ -2134,6 +2162,15 @@ impl From<&AccountAuthenticator> for AccountSignature { }) }, NoAccountAuthenticator => AccountSignature::NoAccountSignature(NoAccountSignature), + Abstraction { + function_info, + auth_data, + } => Self::AbstractionSignature(AbstractionSignature { + function_info: function_info.to_string(), + auth_data: to_bytes(auth_data) + .expect("bcs serialization cannot fail") + .into(), + }), } } } diff --git a/aptos-move/aptos-abstract-gas-usage/src/algebra.rs b/aptos-move/aptos-abstract-gas-usage/src/algebra.rs index 654cb9c97e97f..e0998444e7e8a 100644 --- a/aptos-move/aptos-abstract-gas-usage/src/algebra.rs +++ b/aptos-move/aptos-abstract-gas-usage/src/algebra.rs @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 use aptos_gas_algebra::{ - DynamicExpression, Fee, FeePerGasUnit, GasExpression, InternalGas, InternalGasUnit, NumBytes, - Octa, + DynamicExpression, Fee, FeePerGasUnit, Gas, GasExpression, InternalGas, InternalGasUnit, + NumBytes, Octa, }; use aptos_gas_meter::GasAlgebra; use aptos_gas_schedule::VMGasParameters; @@ -100,4 +100,8 @@ impl GasAlgebra for CalibrationAlgebra { fn storage_fee_used(&self) -> Fee { self.base.storage_fee_used() } + + fn inject_balance(&mut self, new_initial_gas: impl Into) -> PartialVMResult<()> { + self.base.inject_balance(new_initial_gas) + } } diff --git a/aptos-move/aptos-gas-meter/src/algebra.rs b/aptos-move/aptos-gas-meter/src/algebra.rs index adc4d8697d760..d88fdef7fb8b2 100644 --- a/aptos-move/aptos-gas-meter/src/algebra.rs +++ b/aptos-move/aptos-gas-meter/src/algebra.rs @@ -13,7 +13,7 @@ use move_core_types::{ gas_algebra::{InternalGas, InternalGasUnit}, vm_status::StatusCode, }; -use std::fmt::Debug; +use std::{fmt::Debug, ops::AddAssign}; /// Base gas algebra implementation that tracks the gas usage using its internal counters. /// @@ -290,4 +290,14 @@ impl GasAlgebra for StandardGasAlgebra { fn storage_fee_used(&self) -> Fee { self.storage_fee_used } + + // Reset the initial gas balance to reflect the new balance with the change carried over. + fn inject_balance(&mut self, extra_balance: impl Into) -> PartialVMResult<()> { + let extra_unit = extra_balance + .into() + .to_unit_with_params(&self.vm_gas_params.txn); + self.initial_balance.add_assign(extra_unit); + self.balance.add_assign(extra_unit); + Ok(()) + } } diff --git a/aptos-move/aptos-gas-meter/src/traits.rs b/aptos-move/aptos-gas-meter/src/traits.rs index bbbd3c4071f7b..b9bdb99042444 100644 --- a/aptos-move/aptos-gas-meter/src/traits.rs +++ b/aptos-move/aptos-gas-meter/src/traits.rs @@ -83,6 +83,9 @@ pub trait GasAlgebra { /// Returns the amount of storage fee used. fn storage_fee_used(&self) -> Fee; + + /// Bump the `extra_balance`. + fn inject_balance(&mut self, extra_balance: impl Into) -> PartialVMResult<()>; } /// Trait representing a gas meter used inside the Aptos VM. @@ -248,4 +251,11 @@ pub trait AptosGasMeter: MoveGasMeter { fn storage_fee_used(&self) -> Fee { self.algebra().storage_fee_used() } + + /// Bump the `extra_balance`. + fn inject_balance(&mut self, extra_balance: impl Into) -> VMResult<()> { + self.algebra_mut() + .inject_balance(extra_balance) + .map_err(|e| e.finish(Location::Undefined)) + } } diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index b9bb7deccfe55..72526a5404d6e 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -256,6 +256,7 @@ crate::gas_schedule::macros::define_gas_parameters!( [function_info_check_dispatch_type_compatibility_impl_base: InternalGas, { RELEASE_V1_13.. => "function_info.check_dispatch_type_compatibility_impl.base" }, 1002], [function_info_load_function_base: InternalGas, { RELEASE_V1_13.. => "function_info.load_function.base" }, 551], [dispatchable_fungible_asset_dispatch_base: InternalGas, { RELEASE_V1_13.. => "dispatchable_fungible_asset.dispatch.base" }, 551], + [dispatchable_authenticate_dispatch_base: InternalGas, { RELEASE_V1_26.. => "dispatchable_authenticate.dispatch.base" }, 551], // Reusing SHA2-512's cost from Ristretto [hash_sha2_512_base: InternalGas, { 4.. => "hash.sha2_512.base" }, 11910], // 3_240 * 20 diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/transaction.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/transaction.rs index 5c51fa9ee314b..ef7c0db01dcd6 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/transaction.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/transaction.rs @@ -6,7 +6,9 @@ use crate::{ gas_schedule::VMGasParameters, - ver::gas_feature_versions::{RELEASE_V1_11, RELEASE_V1_12, RELEASE_V1_13, RELEASE_V1_15}, + ver::gas_feature_versions::{ + RELEASE_V1_11, RELEASE_V1_12, RELEASE_V1_13, RELEASE_V1_15, RELEASE_V1_26, + }, }; use aptos_gas_algebra::{ AbstractValueSize, Fee, FeePerByte, FeePerGasUnit, FeePerSlot, Gas, GasExpression, @@ -268,6 +270,11 @@ crate::gas_schedule::macros::define_gas_parameters!( max_ty_depth: NumTypeNodes, { RELEASE_V1_15.. => "max_ty_depth" }, 20, + ], + [ + max_aa_gas: Gas, + { RELEASE_V1_26.. => "max_aa_gas" }, + 60, ] ] ); diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index 9ca8597b6181c..376af23caa9ec 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -136,6 +136,7 @@ pub enum FeatureFlag { DisallowInitModuleToPublishModules, EnableCallTreeAndInstructionVMCache, PermissionedSigner, + AccountAbstraction, } fn generate_features_blob(writer: &CodeWriter, data: &[u64]) { @@ -363,6 +364,7 @@ impl From for AptosFeatureFlag { AptosFeatureFlag::ENABLE_CALL_TREE_AND_INSTRUCTION_VM_CACHE }, FeatureFlag::PermissionedSigner => AptosFeatureFlag::PERMISSIONED_SIGNER, + FeatureFlag::AccountAbstraction => AptosFeatureFlag::ACCOUNT_ABSTRACTION, } } } @@ -517,6 +519,7 @@ impl From for FeatureFlag { FeatureFlag::EnableCallTreeAndInstructionVMCache }, AptosFeatureFlag::PERMISSIONED_SIGNER => FeatureFlag::PermissionedSigner, + AptosFeatureFlag::ACCOUNT_ABSTRACTION => FeatureFlag::AccountAbstraction, } } } diff --git a/aptos-move/aptos-vm/Cargo.toml b/aptos-move/aptos-vm/Cargo.toml index 94897e9368d97..3b68cf1e0b79a 100644 --- a/aptos-move/aptos-vm/Cargo.toml +++ b/aptos-move/aptos-vm/Cargo.toml @@ -46,6 +46,7 @@ derive_more = { workspace = true } fail = { workspace = true } futures = { workspace = true } hex = { workspace = true } +itertools = { workspace = true } move-binary-format = { workspace = true } move-core-types = { workspace = true } move-unit-test = { workspace = true, optional = true } diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index 6a9eee602f73e..128790cc9a4b5 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -59,6 +59,7 @@ use aptos_types::{ chain_id::ChainId, contract_event::ContractEvent, fee_statement::FeeStatement, + function_info::FunctionInfo, move_utils::as_move_value::AsMoveValue, on_chain_config::{ ApprovedExecutionHashes, ConfigStorage, FeatureFlag, Features, OnChainConfig, @@ -67,7 +68,8 @@ use aptos_types::{ randomness::Randomness, state_store::{state_key::StateKey, StateView, TStateView}, transaction::{ - authenticator::AnySignature, signature_verified_transaction::SignatureVerifiedTransaction, + authenticator::{AbstractionAuthData, AnySignature, AuthenticationProof}, + signature_verified_transaction::SignatureVerifiedTransaction, BlockOutput, EntryFunction, ExecutionError, ExecutionStatus, ModuleBundle, Multisig, MultisigTransactionPayload, Script, SignedTransaction, Transaction, TransactionArgument, TransactionOutput, TransactionPayload, TransactionStatus, VMValidatorResult, @@ -113,7 +115,10 @@ use move_core_types::{ move_resource::MoveStructType, transaction_argument::convert_txn_args, value::{serialize_values, MoveTypeLayout, MoveValue}, - vm_status::StatusType, + vm_status::{ + StatusCode::{ACCOUNT_AUTHENTICATION_GAS_LIMIT_EXCEEDED, OUT_OF_GAS}, + StatusType, + }, }; use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_runtime::{ @@ -161,6 +166,35 @@ macro_rules! unwrap_or_discard { }; } +pub(crate) struct SerializedSigners { + senders: Vec>, + fee_payer: Option>, +} + +impl SerializedSigners { + pub fn new(senders: Vec>, fee_payer: Option>) -> Self { + Self { senders, fee_payer } + } + + pub fn sender(&self) -> Vec { + self.senders[0].clone() + } + + pub fn senders(&self) -> Vec> { + self.senders.clone() + } + + pub fn fee_payer(&self) -> Option> { + self.fee_payer.clone() + } +} + +pub(crate) fn serialized_signer(account_address: &AccountAddress) -> Vec { + MoveValue::Signer(*account_address) + .simple_serialize() + .unwrap() +} + pub(crate) fn get_system_transaction_output( session: SessionExt, module_storage: &impl AptosModuleStorage, @@ -444,6 +478,7 @@ impl AptosVM { txn_data: &TransactionMetadata, resolver: &impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, + serialized_signers: &SerializedSigners, log_context: &AdapterLogSchema, change_set_configs: &ChangeSetConfigs, traversal_context: &mut TraversalContext, @@ -491,6 +526,7 @@ impl AptosVM { txn_data, resolver, module_storage, + serialized_signers, status, log_context, change_set_configs, @@ -538,6 +574,7 @@ impl AptosVM { txn_data: &TransactionMetadata, resolver: &impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, + serialized_signers: &SerializedSigners, status: ExecutionStatus, log_context: &AdapterLogSchema, change_set_configs: &ChangeSetConfigs, @@ -659,6 +696,7 @@ impl AptosVM { transaction_validation::run_failure_epilogue( session, module_storage, + serialized_signers, gas_meter.balance(), fee_statement, self.features(), @@ -676,6 +714,7 @@ impl AptosVM { &self, mut epilogue_session: EpilogueSession, module_storage: &impl AptosModuleStorage, + serialized_signers: &SerializedSigners, gas_meter: &impl AptosGasMeter, txn_data: &TransactionMetadata, log_context: &AdapterLogSchema, @@ -707,6 +746,7 @@ impl AptosVM { transaction_validation::run_success_epilogue( session, module_storage, + serialized_signers, gas_meter.balance(), fee_statement, self.features(), @@ -739,12 +779,12 @@ impl AptosVM { fn validate_and_execute_script( &self, session: &mut SessionExt, + serialized_signers: &SerializedSigners, code_storage: &impl AptosCodeStorage, // Note: cannot use AptosGasMeter because it is not implemented for // UnmeteredGasMeter. gas_meter: &mut impl GasMeter, traversal_context: &mut TraversalContext, - senders: Vec, script: &Script, ) -> Result<(), VMStatus> { if !self @@ -802,7 +842,7 @@ impl AptosVM { let args = verifier::transaction_arg_validation::validate_combine_signer_and_txn_args( session, code_storage, - senders, + serialized_signers, convert_txn_args(script.args()), &func, self.features().is_enabled(FeatureFlag::STRUCT_CONSTRUCTORS), @@ -824,9 +864,9 @@ impl AptosVM { resolver: &impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, session: &mut SessionExt, + serialized_signers: &SerializedSigners, gas_meter: &mut impl AptosGasMeter, traversal_context: &mut TraversalContext, - senders: Vec, entry_fn: &EntryFunction, _txn_data: &TransactionMetadata, ) -> Result<(), VMStatus> { @@ -883,7 +923,7 @@ impl AptosVM { let args = verifier::transaction_arg_validation::validate_combine_signer_and_txn_args( session, module_storage, - senders, + serialized_signers, entry_fn.args().to_vec(), &function, struct_constructors_enabled, @@ -903,6 +943,7 @@ impl AptosVM { resolver: &'r impl AptosMoveResolver, code_storage: &impl AptosCodeStorage, mut session: UserSession<'r, 'l>, + serialized_signers: &SerializedSigners, gas_meter: &mut impl AptosGasMeter, traversal_context: &mut TraversalContext<'a>, txn_data: &TransactionMetadata, @@ -929,10 +970,10 @@ impl AptosVM { session.execute(|session| { self.validate_and_execute_script( session, + serialized_signers, code_storage, gas_meter, traversal_context, - txn_data.senders(), script, ) })?; @@ -943,9 +984,9 @@ impl AptosVM { resolver, code_storage, session, + serialized_signers, gas_meter, traversal_context, - txn_data.senders(), entry_fn, txn_data, ) @@ -977,9 +1018,12 @@ impl AptosVM { txn_data, )?; + // ============= Gas fee cannot change after this line ============= + self.success_transaction_cleanup( epilogue_session, code_storage, + serialized_signers, gas_meter, txn_data, log_context, @@ -1050,6 +1094,7 @@ impl AptosVM { resolver: &'r impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, session: UserSession<'r, 'l>, + serialized_signers: &SerializedSigners, gas_meter: &mut impl AptosGasMeter, traversal_context: &mut TraversalContext<'a>, txn_data: &TransactionMetadata, @@ -1094,6 +1139,7 @@ impl AptosVM { self.success_transaction_cleanup( epilogue_session, module_storage, + serialized_signers, gas_meter, txn_data, log_context, @@ -1120,6 +1166,7 @@ impl AptosVM { resolver: &'r impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, mut session: UserSession<'r, 'l>, + serialized_signers: &SerializedSigners, prologue_session_change_set: &SystemSessionChangeSet, gas_meter: &mut impl AptosGasMeter, traversal_context: &mut TraversalContext, @@ -1288,6 +1335,7 @@ impl AptosVM { self.success_transaction_cleanup( epilogue_session, module_storage, + serialized_signers, gas_meter, txn_data, log_context, @@ -1302,6 +1350,7 @@ impl AptosVM { resolver: &'r impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, session: UserSession<'r, 'l>, + serialized_signers: &SerializedSigners, prologue_session_change_set: &SystemSessionChangeSet, gas_meter: &mut impl AptosGasMeter, traversal_context: &mut TraversalContext<'a>, @@ -1322,6 +1371,7 @@ impl AptosVM { resolver, module_storage, session, + serialized_signers, gas_meter, traversal_context, txn_data, @@ -1335,6 +1385,7 @@ impl AptosVM { resolver, module_storage, session, + serialized_signers, prologue_session_change_set, gas_meter, traversal_context, @@ -1367,9 +1418,9 @@ impl AptosVM { resolver, module_storage, session, + &SerializedSigners::new(vec![serialized_signer(&multisig_address)], None), gas_meter, traversal_context, - vec![multisig_address], payload, txn_data, ) @@ -1458,10 +1509,7 @@ impl AptosVM { // with the general verify_module above. if init_function.is_ok() { if verifier::module_init::verify_module_init_function(module).is_ok() { - let args: Vec> = senders - .iter() - .map(|s| MoveValue::Signer(*s).simple_serialize().unwrap()) - .collect(); + let args: Vec> = senders.iter().map(serialized_signer).collect(); session.execute_function_bypass_visibility( &module.self_id(), init_func_name, @@ -1830,7 +1878,8 @@ impl AptosVM { log_context: &AdapterLogSchema, is_approved_gov_script: bool, traversal_context: &mut TraversalContext, - ) -> Result<(), VMStatus> { + gas_meter: &mut impl AptosGasMeter, + ) -> Result { // Check transaction format. if transaction.contains_duplicate_signers() { return Err(VMStatus::error( @@ -1853,6 +1902,76 @@ impl AptosVM { )?; } + // Account Abstraction dispatchable authentication. + let senders = transaction_data.senders(); + let proofs = transaction_data.authentication_proofs(); + + // Add fee payer. + let fee_payer_signer = if let Some(fee_payer) = transaction_data.fee_payer { + Some(match &transaction_data.fee_payer_authentication_proof { + Some(AuthenticationProof::Abstraction { + function_info, + auth_data, + }) => { + if self.features().is_account_abstraction_enabled() { + dispatchable_authenticate( + session, + gas_meter, + fee_payer, + function_info.clone(), + auth_data, + traversal_context, + module_storage, + ) + .map_err(|mut vm_error| { + if vm_error.major_status() == OUT_OF_GAS { + vm_error + .set_major_status(ACCOUNT_AUTHENTICATION_GAS_LIMIT_EXCEEDED); + } + vm_error.into_vm_status() + }) + } else { + return Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)); + } + }, + _ => Ok(serialized_signer(&fee_payer)), + }?) + } else { + None + }; + let sender_signers = itertools::zip_eq(senders, proofs) + .map(|(sender, proof)| match proof { + AuthenticationProof::Abstraction { + function_info, + auth_data, + } => { + if self.features().is_account_abstraction_enabled() { + dispatchable_authenticate( + session, + gas_meter, + sender, + function_info.clone(), + auth_data, + traversal_context, + module_storage, + ) + .map_err(|mut vm_error| { + if vm_error.major_status() == OUT_OF_GAS { + vm_error + .set_major_status(ACCOUNT_AUTHENTICATION_GAS_LIMIT_EXCEEDED); + } + vm_error.into_vm_status() + }) + } else { + Err(VMStatus::error(StatusCode::FEATURE_UNDER_GATING, None)) + } + }, + _ => Ok(serialized_signer(&sender)), + }) + .collect::>()?; + + let serialized_signers = SerializedSigners::new(sender_signers, fee_payer_signer); + // The prologue MUST be run AFTER any validation. Otherwise you may run prologue and hit // SEQUENCE_NUMBER_TOO_NEW if there is more than one transaction from the same sender and // end up skipping validation. @@ -1860,12 +1979,14 @@ impl AptosVM { session, resolver, module_storage, + &serialized_signers, transaction.payload(), transaction_data, log_context, is_approved_gov_script, traversal_context, - ) + )?; + Ok(serialized_signers) } // Called when the execution of the user transaction fails, in order to discard the @@ -1876,6 +1997,7 @@ impl AptosVM { err: VMStatus, resolver: &impl AptosMoveResolver, module_storage: &impl AptosModuleStorage, + serialized_signers: &SerializedSigners, txn_data: &TransactionMetadata, log_context: &AdapterLogSchema, gas_meter: &mut impl AptosGasMeter, @@ -1900,6 +2022,7 @@ impl AptosVM { txn_data, resolver, module_storage, + serialized_signers, log_context, change_set_configs, traversal_context, @@ -1913,8 +2036,8 @@ impl AptosVM { txn: &SignedTransaction, txn_data: TransactionMetadata, is_approved_gov_script: bool, - gas_meter: &mut impl AptosGasMeter, log_context: &AdapterLogSchema, + gas_meter: &mut impl AptosGasMeter, ) -> (VMStatus, VMOutput) { let _timer = VM_TIMER.timer_with_label("AptosVM::execute_user_transaction_impl"); @@ -1923,7 +2046,8 @@ impl AptosVM { // Revalidate the transaction. let mut prologue_session = PrologueSession::new(self, &txn_data, resolver); - let exec_result = prologue_session.execute(|session| { + let initial_gas = gas_meter.balance(); + let serialized_signers = unwrap_or_discard!(prologue_session.execute(|session| { self.validate_signed_transaction( session, resolver, @@ -1933,9 +2057,24 @@ impl AptosVM { log_context, is_approved_gov_script, &mut traversal_context, + gas_meter, ) - }); - unwrap_or_discard!(exec_result); + })); + + if self.features().is_account_abstraction_enabled() { + let max_aa_gas = unwrap_or_discard!(self.gas_params(log_context)) + .vm + .txn + .max_aa_gas; + if max_aa_gas < txn_data.max_gas_amount() { + // Reset initial gas after validation with max_aa_gas. + unwrap_or_discard!(gas_meter + .inject_balance(txn_data.max_gas_amount().checked_sub(max_aa_gas).unwrap())); + } + } else { + assert_eq!(initial_gas, gas_meter.balance()); + } + let storage_gas_params = unwrap_or_discard!(self.storage_gas_params(log_context)); let change_set_configs = &storage_gas_params.change_set_configs; let (prologue_change_set, mut user_session) = unwrap_or_discard!(prologue_session @@ -1984,6 +2123,7 @@ impl AptosVM { resolver, code_storage, user_session, + &serialized_signers, gas_meter, &mut traversal_context, &txn_data, @@ -1996,6 +2136,7 @@ impl AptosVM { resolver, code_storage, user_session, + &serialized_signers, &prologue_change_set, gas_meter, &mut traversal_context, @@ -2020,12 +2161,13 @@ impl AptosVM { .expect("Balance should always be less than or equal to max gas amount set"); TXN_GAS_USAGE.observe(u64::from(gas_usage) as f64); - result.unwrap_or_else(|err| { + let (vm_status, output) = result.unwrap_or_else(|err| { self.on_user_transaction_execution_failure( prologue_change_set, err, resolver, code_storage, + &serialized_signers, &txn_data, log_context, gas_meter, @@ -2033,7 +2175,8 @@ impl AptosVM { new_published_modules_loaded, &mut traversal_context, ) - }) + }); + (vm_status, output) } /// Main entrypoint for executing a user transaction that also allows the customization of the @@ -2048,28 +2191,36 @@ impl AptosVM { ) -> Result<(VMStatus, VMOutput, G), VMStatus> where G: AptosGasMeter, - F: FnOnce(u64, VMGasParameters, StorageGasParameters, bool, Gas) -> G, + F: Fn(u64, VMGasParameters, StorageGasParameters, bool, Gas) -> G, { let txn_metadata = TransactionMetadata::new(txn); let is_approved_gov_script = is_approved_gov_script(resolver, txn, &txn_metadata); - let balance = txn.max_gas_amount().into(); + let vm_params = self.gas_params(log_context)?.vm.clone(); + + let initial_balance = if self.features().is_account_abstraction_enabled() { + vm_params.txn.max_aa_gas.min(txn.max_gas_amount().into()) + } else { + txn.max_gas_amount().into() + }; + let mut gas_meter = make_gas_meter( self.gas_feature_version(), - self.gas_params(log_context)?.vm.clone(), + vm_params, self.storage_gas_params(log_context)?.clone(), is_approved_gov_script, - balance, + initial_balance, ); + let (status, output) = self.execute_user_transaction_impl( resolver, code_storage, txn, txn_metadata, is_approved_gov_script, - &mut gas_meter, log_context, + &mut gas_meter, ); Ok((status, output, gas_meter)) @@ -2089,7 +2240,7 @@ impl AptosVM { modify_gas_meter: F, ) -> Result<(VMStatus, VMOutput, G), VMStatus> where - F: FnOnce(ProdGasMeter) -> G, + F: Fn(ProdGasMeter) -> G, G: AptosGasMeter, { self.execute_user_transaction_with_custom_gas_meter( @@ -2170,8 +2321,8 @@ impl AptosVM { WriteSetPayload::Script { script, execute_as } => { let mut tmp_session = self.new_session(resolver, session_id, None); let senders = match txn_sender { - None => vec![*execute_as], - Some(sender) => vec![sender, *execute_as], + None => vec![serialized_signer(execute_as)], + Some(sender) => vec![serialized_signer(&sender), serialized_signer(execute_as)], }; let traversal_storage = TraversalStorage::new(); @@ -2179,10 +2330,10 @@ impl AptosVM { self.validate_and_execute_script( &mut tmp_session, + &SerializedSigners::new(senders, None), code_storage, &mut UnmeteredGasMeter, &mut traversal_context, - senders, script, )?; @@ -2554,6 +2705,7 @@ impl AptosVM { session: &mut SessionExt, resolver: &impl AptosMoveResolver, module_storage: &impl ModuleStorage, + serialized_signers: &SerializedSigners, payload: &TransactionPayload, txn_data: &TransactionMetadata, log_context: &AdapterLogSchema, @@ -2576,6 +2728,7 @@ impl AptosVM { transaction_validation::run_script_prologue( session, module_storage, + serialized_signers, txn_data, self.features(), log_context, @@ -2590,6 +2743,7 @@ impl AptosVM { transaction_validation::run_script_prologue( session, module_storage, + serialized_signers, txn_data, self.features(), log_context, @@ -2958,6 +3112,32 @@ impl VMValidator for AptosVM { Some(txn_data.as_user_transaction_context()), ); + let vm_params = match self.gas_params(&log_context) { + Ok(vm_params) => vm_params.vm.clone(), + Err(err) => { + return VMValidatorResult::new(Some(err.status_code()), 0); + }, + }; + let storage_gas_params = match self.storage_gas_params(&log_context) { + Ok(storage_params) => storage_params.clone(), + Err(err) => { + return VMValidatorResult::new(Some(err.status_code()), 0); + }, + }; + + let initial_balance = if self.features().is_account_abstraction_enabled() { + vm_params.txn.max_aa_gas.min(txn_data.max_gas_amount()) + } else { + txn_data.max_gas_amount() + }; + + let mut gas_meter = make_prod_gas_meter( + self.gas_feature_version(), + vm_params, + storage_gas_params, + is_approved_gov_script, + initial_balance, + ); let storage = TraversalStorage::new(); // Increment the counter for transactions verified. @@ -2970,6 +3150,7 @@ impl VMValidator for AptosVM { &log_context, is_approved_gov_script, &mut TraversalContext::new(&storage), + &mut gas_meter, ) { Err(err) if err.status_code() != StatusCode::SEQUENCE_NUMBER_TOO_NEW => ( "failure", @@ -3047,6 +3228,47 @@ fn create_account_if_does_not_exist( .map(|_return_vals| ()) } +fn dispatchable_authenticate( + session: &mut SessionExt, + gas_meter: &mut impl GasMeter, + account: AccountAddress, + function_info: FunctionInfo, + auth_data: &AbstractionAuthData, + traversal_context: &mut TraversalContext, + module_storage: &impl ModuleStorage, +) -> VMResult> { + let auth_data = bcs::to_bytes(auth_data).expect("from rust succeeds"); + let mut params = serialize_values(&vec![ + MoveValue::Signer(account), + function_info.as_move_value(), + ]); + params.push(auth_data); + session + .execute_function_bypass_visibility( + &ACCOUNT_ABSTRACTION_MODULE, + AUTHENTICATE, + vec![], + params, + gas_meter, + traversal_context, + module_storage, + ) + .map(|mut return_vals| { + assert!( + return_vals.mutable_reference_outputs.is_empty() + && return_vals.return_values.len() == 1, + "Abstraction authentication function must only have 1 return value" + ); + let (signer_data, signer_layout) = return_vals.return_values.pop().expect("Must exist"); + assert_eq!( + signer_layout, + MoveTypeLayout::Signer, + "Abstraction authentication function returned non-signer." + ); + signer_data + }) +} + /// Signals that the transaction should trigger the flow for creating an account as part of a /// sponsored transaction. This occurs when: /// * The feature gate is enabled SPONSORED_AUTOMATIC_ACCOUNT_V1_CREATION diff --git a/aptos-move/aptos-vm/src/system_module_names.rs b/aptos-move/aptos-vm/src/system_module_names.rs index e6945a6114c20..1124da643abfc 100644 --- a/aptos-move/aptos-vm/src/system_module_names.rs +++ b/aptos-move/aptos-vm/src/system_module_names.rs @@ -15,9 +15,18 @@ pub static ACCOUNT_MODULE: Lazy = Lazy::new(|| { ) }); +pub static ACCOUNT_ABSTRACTION_MODULE: Lazy = Lazy::new(|| { + ModuleId::new( + account_config::CORE_CODE_ADDRESS, + ident_str!("account_abstraction").to_owned(), + ) +}); + pub const CREATE_ACCOUNT_IF_DOES_NOT_EXIST: &IdentStr = ident_str!("create_account_if_does_not_exist"); +pub const AUTHENTICATE: &IdentStr = ident_str!("authenticate"); + // Data to resolve basic account and transaction flow functions and structs /// The ModuleId for the aptos block module pub static BLOCK_MODULE: Lazy = Lazy::new(|| { diff --git a/aptos-move/aptos-vm/src/testing.rs b/aptos-move/aptos-vm/src/testing.rs index 2ee83eea33d1f..ffd356d101f46 100644 --- a/aptos-move/aptos-vm/src/testing.rs +++ b/aptos-move/aptos-vm/src/testing.rs @@ -1,6 +1,8 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +#[cfg(any(test, feature = "testing"))] +use crate::aptos_vm::{serialized_signer, SerializedSigners}; use crate::AptosVM; #[cfg(any(test, feature = "testing"))] use crate::{ @@ -112,6 +114,10 @@ impl AptosVM { &txn_data, &resolver, &module_storage, + &SerializedSigners::new( + vec![serialized_signer(&txn_data.sender)], + txn_data.fee_payer().as_ref().map(serialized_signer), + ), &log_context, change_set_configs, &mut TraversalContext::new(&traversal_storage), diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 87148c22957de..b5041e8a5d1a6 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -8,21 +8,21 @@ use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - user_transaction_context::UserTransactionContext, EntryFunction, Multisig, - SignedTransaction, TransactionPayload, + authenticator::AuthenticationProof, user_transaction_context::UserTransactionContext, + EntryFunction, Multisig, SignedTransaction, TransactionPayload, }, }; pub struct TransactionMetadata { pub sender: AccountAddress, - pub authentication_key: Vec, + pub authentication_proof: AuthenticationProof, pub secondary_signers: Vec, - pub secondary_authentication_keys: Vec>, + pub secondary_authentication_proofs: Vec, pub sequence_number: u64, pub fee_payer: Option, /// `None` if the [TransactionAuthenticator] lacks an authenticator for the fee payer. /// `Some([])` if the authenticator for the fee payer is a [NoAccountAuthenticator]. - pub fee_payer_authentication_key: Option>, + pub fee_payer_authentication_proof: Option, pub max_gas_amount: Gas, pub gas_unit_price: FeePerGasUnit, pub transaction_size: NumBytes, @@ -39,29 +39,20 @@ impl TransactionMetadata { pub fn new(txn: &SignedTransaction) -> Self { Self { sender: txn.sender(), - authentication_key: txn - .authenticator() - .sender() - .authentication_key() - .map_or_else(Vec::new, |auth_key| auth_key.to_vec()), + authentication_proof: txn.authenticator().sender().authentication_proof(), secondary_signers: txn.authenticator().secondary_signer_addresses(), - secondary_authentication_keys: txn + secondary_authentication_proofs: txn .authenticator() .secondary_signers() .iter() - .map(|account_auth| { - account_auth - .authentication_key() - .map_or_else(Vec::new, |auth_key| auth_key.to_vec()) - }) + .map(|account_auth| account_auth.authentication_proof()) .collect(), sequence_number: txn.sequence_number(), fee_payer: txn.authenticator_ref().fee_payer_address(), - fee_payer_authentication_key: txn.authenticator().fee_payer_signer().map(|signer| { - signer - .authentication_key() - .map_or_else(Vec::new, |auth_key| auth_key.to_vec()) - }), + fee_payer_authentication_proof: txn + .authenticator() + .fee_payer_signer() + .map(|signer| signer.authentication_proof()), max_gas_amount: txn.max_gas_amount().into(), gas_unit_price: txn.gas_unit_price().into(), transaction_size: (txn.raw_txn_bytes_len() as u64).into(), @@ -124,8 +115,14 @@ impl TransactionMetadata { senders } - pub fn authentication_key(&self) -> &[u8] { - &self.authentication_key + pub fn authentication_proofs(&self) -> Vec<&AuthenticationProof> { + let mut proofs = vec![self.authentication_proof()]; + proofs.extend(self.secondary_authentication_proofs.iter()); + proofs + } + + pub fn authentication_proof(&self) -> &AuthenticationProof { + &self.authentication_proof } pub fn sequence_number(&self) -> u64 { diff --git a/aptos-move/aptos-vm/src/transaction_validation.rs b/aptos-move/aptos-vm/src/transaction_validation.rs index b9c680f54240c..f1957ab980735 100644 --- a/aptos-move/aptos-vm/src/transaction_validation.rs +++ b/aptos-move/aptos-vm/src/transaction_validation.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{ + aptos_vm::SerializedSigners, errors::{convert_epilogue_error, convert_prologue_error, expect_only_successful_execution}, move_vm_ext::SessionExt, system_module_names::{ @@ -14,7 +15,7 @@ use crate::{ use aptos_gas_algebra::Gas; use aptos_types::{ account_config::constants::CORE_CODE_ADDRESS, fee_statement::FeeStatement, - on_chain_config::Features, transaction::Multisig, + move_utils::as_move_value::AsMoveValue, on_chain_config::Features, transaction::Multisig, }; use aptos_vm_logging::log_schema::AdapterLogSchema; use fail::fail_point; @@ -50,6 +51,9 @@ pub static APTOS_TRANSACTION_VALIDATION: Lazy = user_epilogue_extended_name: Identifier::new("epilogue_extended").unwrap(), user_epilogue_gas_payer_extended_name: Identifier::new("epilogue_gas_payer_extended") .unwrap(), + unified_prologue_name: Identifier::new("unified_prologue").unwrap(), + unified_prologue_fee_payer_name: Identifier::new("unified_prologue_fee_payer").unwrap(), + unified_epilogue_name: Identifier::new("unified_epilogue").unwrap(), }); /// On-chain functions used to validate transactions @@ -67,6 +71,9 @@ pub struct TransactionValidation { pub multi_agent_prologue_extended_name: Identifier, pub user_epilogue_extended_name: Identifier, pub user_epilogue_gas_payer_extended_name: Identifier, + pub unified_prologue_name: Identifier, + pub unified_prologue_fee_payer_name: Identifier, + pub unified_epilogue_name: Identifier, } impl TransactionValidation { @@ -87,6 +94,7 @@ impl TransactionValidation { pub(crate) fn run_script_prologue( session: &mut SessionExt, module_storage: &impl ModuleStorage, + serialized_signers: &SerializedSigners, txn_data: &TransactionMetadata, features: &Features, log_context: &AdapterLogSchema, @@ -94,136 +102,241 @@ pub(crate) fn run_script_prologue( is_simulation: bool, ) -> Result<(), VMStatus> { let txn_sequence_number = txn_data.sequence_number(); - let txn_authentication_key = txn_data.authentication_key().to_vec(); + let txn_authentication_key = txn_data.authentication_proof().optional_auth_key(); let txn_gas_price = txn_data.gas_unit_price(); let txn_max_gas_units = txn_data.max_gas_amount(); let txn_expiration_timestamp_secs = txn_data.expiration_timestamp_secs(); let chain_id = txn_data.chain_id(); let mut gas_meter = UnmeteredGasMeter; - let secondary_auth_keys: Vec = txn_data - .secondary_authentication_keys - .iter() - .map(|auth_key| MoveValue::vector_u8(auth_key.to_vec())) - .collect(); - let (prologue_function_name, args) = if let (Some(fee_payer), Some(fee_payer_auth_key)) = ( - txn_data.fee_payer(), - txn_data.fee_payer_authentication_key.as_ref(), - ) { - if features.is_transaction_simulation_enhancement_enabled() { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::vector_address(txn_data.secondary_signers()), - MoveValue::Vector(secondary_auth_keys), - MoveValue::Address(fee_payer), - MoveValue::vector_u8(fee_payer_auth_key.to_vec()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - MoveValue::Bool(is_simulation), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.fee_payer_prologue_extended_name, - args, - ) - } else { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::vector_address(txn_data.secondary_signers()), - MoveValue::Vector(secondary_auth_keys), - MoveValue::Address(fee_payer), - MoveValue::vector_u8(fee_payer_auth_key.to_vec()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - ]; - (&APTOS_TRANSACTION_VALIDATION.fee_payer_prologue_name, args) - } - } else if txn_data.is_multi_agent() { - if features.is_transaction_simulation_enhancement_enabled() { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::vector_address(txn_data.secondary_signers()), - MoveValue::Vector(secondary_auth_keys), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - MoveValue::Bool(is_simulation), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.multi_agent_prologue_extended_name, - args, - ) - } else { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::vector_address(txn_data.secondary_signers()), - MoveValue::Vector(secondary_auth_keys), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.multi_agent_prologue_name, - args, + // Use the new prologues that takes signer from both sender and optional gas payer + if features.is_account_abstraction_enabled() { + let secondary_auth_keys: Vec = txn_data + .secondary_authentication_proofs + .iter() + .map(|auth_key| auth_key.optional_auth_key().as_move_value()) + .collect(); + let (prologue_function_name, serialized_args) = + if let (Some(_fee_payer), Some(fee_payer_auth_key)) = ( + txn_data.fee_payer(), + txn_data + .fee_payer_authentication_proof + .as_ref() + .map(|proof| proof.optional_auth_key()), + ) { + let serialized_args = vec![ + serialized_signers.sender(), + serialized_signers + .fee_payer() + .ok_or_else(|| VMStatus::error(StatusCode::UNREACHABLE, None))?, + txn_authentication_key + .as_move_value() + .simple_serialize() + .unwrap(), + fee_payer_auth_key + .as_move_value() + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_sequence_number) + .simple_serialize() + .unwrap(), + MoveValue::vector_address(txn_data.secondary_signers()) + .simple_serialize() + .unwrap(), + MoveValue::Vector(secondary_auth_keys) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_gas_price.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_max_gas_units.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_expiration_timestamp_secs) + .simple_serialize() + .unwrap(), + MoveValue::U8(chain_id.id()).simple_serialize().unwrap(), + MoveValue::Bool(is_simulation).simple_serialize().unwrap(), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.unified_prologue_fee_payer_name, + serialized_args, + ) + } else { + let serialized_args = vec![ + serialized_signers.sender(), + txn_authentication_key + .as_move_value() + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_sequence_number) + .simple_serialize() + .unwrap(), + MoveValue::vector_address(txn_data.secondary_signers()) + .simple_serialize() + .unwrap(), + MoveValue::Vector(secondary_auth_keys) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_gas_price.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_max_gas_units.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_expiration_timestamp_secs) + .simple_serialize() + .unwrap(), + MoveValue::U8(chain_id.id()).simple_serialize().unwrap(), + MoveValue::Bool(is_simulation).simple_serialize().unwrap(), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.unified_prologue_name, + serialized_args, + ) + }; + session + .execute_function_bypass_visibility( + &APTOS_TRANSACTION_VALIDATION.module_id(), + prologue_function_name, + vec![], + serialized_args, + &mut gas_meter, + traversal_context, + module_storage, ) - } + .map(|_return_vals| ()) + .map_err(expect_no_verification_errors) + .or_else(|err| convert_prologue_error(err, log_context)) } else { - #[allow(clippy::collapsible_else_if)] - if features.is_transaction_simulation_enhancement_enabled() { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - MoveValue::vector_u8(txn_data.script_hash.clone()), - MoveValue::Bool(is_simulation), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.script_prologue_extended_name, - args, - ) + let secondary_auth_keys: Vec = txn_data + .secondary_authentication_proofs + .iter() + .map(|auth_key| MoveValue::vector_u8(auth_key.optional_auth_key().unwrap_or_default())) + .collect(); + let (prologue_function_name, args) = if let (Some(fee_payer), Some(fee_payer_auth_key)) = ( + txn_data.fee_payer(), + txn_data + .fee_payer_authentication_proof + .as_ref() + .map(|proof| proof.optional_auth_key()), + ) { + if features.is_transaction_simulation_enhancement_enabled() { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::vector_address(txn_data.secondary_signers()), + MoveValue::Vector(secondary_auth_keys), + MoveValue::Address(fee_payer), + MoveValue::vector_u8(fee_payer_auth_key.unwrap_or_default()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + MoveValue::Bool(is_simulation), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.fee_payer_prologue_extended_name, + args, + ) + } else { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::vector_address(txn_data.secondary_signers()), + MoveValue::Vector(secondary_auth_keys), + MoveValue::Address(fee_payer), + MoveValue::vector_u8(fee_payer_auth_key.unwrap_or_default()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + ]; + (&APTOS_TRANSACTION_VALIDATION.fee_payer_prologue_name, args) + } + } else if txn_data.is_multi_agent() { + if features.is_transaction_simulation_enhancement_enabled() { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::vector_address(txn_data.secondary_signers()), + MoveValue::Vector(secondary_auth_keys), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + MoveValue::Bool(is_simulation), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.multi_agent_prologue_extended_name, + args, + ) + } else { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::vector_address(txn_data.secondary_signers()), + MoveValue::Vector(secondary_auth_keys), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.multi_agent_prologue_name, + args, + ) + } } else { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(txn_sequence_number), - MoveValue::vector_u8(txn_authentication_key), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(txn_expiration_timestamp_secs), - MoveValue::U8(chain_id.id()), - MoveValue::vector_u8(txn_data.script_hash.clone()), - ]; - (&APTOS_TRANSACTION_VALIDATION.script_prologue_name, args) - } - }; - session - .execute_function_bypass_visibility( - &APTOS_TRANSACTION_VALIDATION.module_id(), - prologue_function_name, - vec![], - serialize_values(&args), - &mut gas_meter, - traversal_context, - module_storage, - ) - .map(|_return_vals| ()) - .map_err(expect_no_verification_errors) - .or_else(|err| convert_prologue_error(err, log_context)) + #[allow(clippy::collapsible_else_if)] + if features.is_transaction_simulation_enhancement_enabled() { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + MoveValue::vector_u8(txn_data.script_hash.clone()), + MoveValue::Bool(is_simulation), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.script_prologue_extended_name, + args, + ) + } else { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(txn_sequence_number), + MoveValue::vector_u8(txn_authentication_key.unwrap_or_default()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(txn_expiration_timestamp_secs), + MoveValue::U8(chain_id.id()), + MoveValue::vector_u8(txn_data.script_hash.clone()), + ]; + (&APTOS_TRANSACTION_VALIDATION.script_prologue_name, args) + } + }; + + session + .execute_function_bypass_visibility( + &APTOS_TRANSACTION_VALIDATION.module_id(), + prologue_function_name, + vec![], + serialize_values(&args), + &mut gas_meter, + traversal_context, + module_storage, + ) + .map(|_return_vals| ()) + .map_err(expect_no_verification_errors) + .or_else(|err| convert_prologue_error(err, log_context)) + } } /// Run the prologue for a multisig transaction. This needs to verify that: @@ -274,6 +387,7 @@ pub(crate) fn run_multisig_prologue( fn run_epilogue( session: &mut SessionExt, module_storage: &impl ModuleStorage, + serialized_signers: &SerializedSigners, gas_remaining: Gas, fee_statement: FeeStatement, txn_data: &TransactionMetadata, @@ -284,84 +398,115 @@ fn run_epilogue( let txn_gas_price = txn_data.gas_unit_price(); let txn_max_gas_units = txn_data.max_gas_amount(); - // We can unconditionally do this as this condition can only be true if the prologue - // accepted it, in which case the gas payer feature is enabled. - if let Some(fee_payer) = txn_data.fee_payer() { - let (func_name, args) = { - if features.is_transaction_simulation_enhancement_enabled() { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::Address(fee_payer), - MoveValue::U64(fee_statement.storage_fee_refund()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(gas_remaining.into()), - MoveValue::Bool(is_simulation), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.user_epilogue_gas_payer_extended_name, - args, - ) - } else { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::Address(fee_payer), - MoveValue::U64(fee_statement.storage_fee_refund()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(gas_remaining.into()), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.user_epilogue_gas_payer_name, - args, - ) - } - }; + if features.is_account_abstraction_enabled() { + let serialize_args = vec![ + serialized_signers.sender(), + serialized_signers + .fee_payer() + .unwrap_or(serialized_signers.sender()), + MoveValue::U64(fee_statement.storage_fee_refund()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_gas_price.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(txn_max_gas_units.into()) + .simple_serialize() + .unwrap(), + MoveValue::U64(gas_remaining.into()) + .simple_serialize() + .unwrap(), + MoveValue::Bool(is_simulation).simple_serialize().unwrap(), + ]; session.execute_function_bypass_visibility( &APTOS_TRANSACTION_VALIDATION.module_id(), - func_name, + &APTOS_TRANSACTION_VALIDATION.unified_epilogue_name, vec![], - serialize_values(&args), + serialize_args, &mut UnmeteredGasMeter, traversal_context, module_storage, ) } else { - // Regular tx, run the normal epilogue - let (func_name, args) = { - if features.is_transaction_simulation_enhancement_enabled() { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(fee_statement.storage_fee_refund()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(gas_remaining.into()), - MoveValue::Bool(is_simulation), - ]; - ( - &APTOS_TRANSACTION_VALIDATION.user_epilogue_extended_name, - args, - ) - } else { - let args = vec![ - MoveValue::Signer(txn_data.sender), - MoveValue::U64(fee_statement.storage_fee_refund()), - MoveValue::U64(txn_gas_price.into()), - MoveValue::U64(txn_max_gas_units.into()), - MoveValue::U64(gas_remaining.into()), - ]; - (&APTOS_TRANSACTION_VALIDATION.user_epilogue_name, args) - } - }; - session.execute_function_bypass_visibility( - &APTOS_TRANSACTION_VALIDATION.module_id(), - func_name, - vec![], - serialize_values(&args), - &mut UnmeteredGasMeter, - traversal_context, - module_storage, - ) + // We can unconditionally do this as this condition can only be true if the prologue + // accepted it, in which case the gas payer feature is enabled. + if let Some(fee_payer) = txn_data.fee_payer() { + let (func_name, args) = { + if features.is_transaction_simulation_enhancement_enabled() { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::Address(fee_payer), + MoveValue::U64(fee_statement.storage_fee_refund()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(gas_remaining.into()), + MoveValue::Bool(is_simulation), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.user_epilogue_gas_payer_extended_name, + args, + ) + } else { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::Address(fee_payer), + MoveValue::U64(fee_statement.storage_fee_refund()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(gas_remaining.into()), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.user_epilogue_gas_payer_name, + args, + ) + } + }; + session.execute_function_bypass_visibility( + &APTOS_TRANSACTION_VALIDATION.module_id(), + func_name, + vec![], + serialize_values(&args), + &mut UnmeteredGasMeter, + traversal_context, + module_storage, + ) + } else { + // Regular tx, run the normal epilogue + let (func_name, args) = { + if features.is_transaction_simulation_enhancement_enabled() { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(fee_statement.storage_fee_refund()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(gas_remaining.into()), + MoveValue::Bool(is_simulation), + ]; + ( + &APTOS_TRANSACTION_VALIDATION.user_epilogue_extended_name, + args, + ) + } else { + let args = vec![ + MoveValue::Signer(txn_data.sender), + MoveValue::U64(fee_statement.storage_fee_refund()), + MoveValue::U64(txn_gas_price.into()), + MoveValue::U64(txn_max_gas_units.into()), + MoveValue::U64(gas_remaining.into()), + ]; + (&APTOS_TRANSACTION_VALIDATION.user_epilogue_name, args) + } + }; + session.execute_function_bypass_visibility( + &APTOS_TRANSACTION_VALIDATION.module_id(), + func_name, + vec![], + serialize_values(&args), + &mut UnmeteredGasMeter, + traversal_context, + module_storage, + ) + } } .map(|_return_vals| ()) .map_err(expect_no_verification_errors)?; @@ -400,6 +545,7 @@ fn emit_fee_statement( pub(crate) fn run_success_epilogue( session: &mut SessionExt, module_storage: &impl ModuleStorage, + serialized_signers: &SerializedSigners, gas_remaining: Gas, fee_statement: FeeStatement, features: &Features, @@ -418,6 +564,7 @@ pub(crate) fn run_success_epilogue( run_epilogue( session, module_storage, + serialized_signers, gas_remaining, fee_statement, txn_data, @@ -433,6 +580,7 @@ pub(crate) fn run_success_epilogue( pub(crate) fn run_failure_epilogue( session: &mut SessionExt, module_storage: &impl ModuleStorage, + serialized_signers: &SerializedSigners, gas_remaining: Gas, fee_statement: FeeStatement, features: &Features, @@ -444,6 +592,7 @@ pub(crate) fn run_failure_epilogue( run_epilogue( session, module_storage, + serialized_signers, gas_remaining, fee_statement, txn_data, diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index 153f26da17ecf..d6a96952a88e7 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -6,7 +6,7 @@ //! TODO: we should not only validate the types but also the actual values, e.g. //! for strings whether they consist of correct characters. -use crate::{move_vm_ext::SessionExt, VMStatus}; +use crate::{aptos_vm::SerializedSigners, move_vm_ext::SessionExt, VMStatus}; use aptos_vm_types::module_and_script_storage::module_storage::AptosModuleStorage; use move_binary_format::{ errors::{Location, PartialVMError}, @@ -18,7 +18,6 @@ use move_core_types::{ ident_str, identifier::{IdentStr, Identifier}, language_storage::ModuleId, - value::MoveValue, vm_status::StatusCode, }; use move_vm_metrics::{Timer, VM_TIMER}; @@ -103,10 +102,10 @@ pub(crate) fn get_allowed_structs( /// 3. check arg types are allowed after signers /// /// after validation, add senders and non-signer arguments to generate the final args -pub fn validate_combine_signer_and_txn_args( +pub(crate) fn validate_combine_signer_and_txn_args( session: &mut SessionExt, module_storage: &impl AptosModuleStorage, - senders: Vec, + serialized_signers: &SerializedSigners, args: Vec>, func: &LoadedFunction, are_struct_constructors_enabled: bool, @@ -161,7 +160,8 @@ pub fn validate_combine_signer_and_txn_args( // signers actually passed is matching first to maintain backward compatibility before // moving on to the validation of non-signer args. // the number of txn senders should be the same number of signers - if signer_param_cnt > 0 && senders.len() != signer_param_cnt { + let sender_signers = serialized_signers.senders(); + if signer_param_cnt > 0 && sender_signers.len() != signer_param_cnt { return Err(VMStatus::error( StatusCode::NUMBER_OF_SIGNER_ARGUMENTS_MISMATCH, None, @@ -185,11 +185,7 @@ pub fn validate_combine_signer_and_txn_args( let combined_args = if signer_param_cnt == 0 { args } else { - senders - .into_iter() - .map(|s| MoveValue::Signer(s).simple_serialize().unwrap()) - .chain(args) - .collect() + sender_signers.into_iter().chain(args).collect() }; Ok(combined_args) } diff --git a/aptos-move/framework/aptos-framework/doc/account_abstraction.md b/aptos-move/framework/aptos-framework/doc/account_abstraction.md new file mode 100644 index 0000000000000..ed670f841a159 --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/account_abstraction.md @@ -0,0 +1,581 @@ + + + +# Module `0x1::account_abstraction` + + + +- [Struct `UpdateDispatchableAuthenticator`](#0x1_account_abstraction_UpdateDispatchableAuthenticator) +- [Struct `RemoveDispatchableAuthenticator`](#0x1_account_abstraction_RemoveDispatchableAuthenticator) +- [Enum Resource `DispatchableAuthenticator`](#0x1_account_abstraction_DispatchableAuthenticator) +- [Constants](#@Constants_0) +- [Function `add_dispatchable_authentication_function`](#0x1_account_abstraction_add_dispatchable_authentication_function) +- [Function `remove_dispatchable_authentication_function`](#0x1_account_abstraction_remove_dispatchable_authentication_function) +- [Function `remove_dispatchable_authenticator`](#0x1_account_abstraction_remove_dispatchable_authenticator) +- [Function `resource_addr`](#0x1_account_abstraction_resource_addr) +- [Function `update_dispatchable_authenticator_impl`](#0x1_account_abstraction_update_dispatchable_authenticator_impl) +- [Function `using_dispatchable_authenticator`](#0x1_account_abstraction_using_dispatchable_authenticator) +- [Function `dispatchable_authenticator`](#0x1_account_abstraction_dispatchable_authenticator) +- [Function `dispatchable_authenticator_internal`](#0x1_account_abstraction_dispatchable_authenticator_internal) +- [Function `authenticate`](#0x1_account_abstraction_authenticate) +- [Function `dispatchable_authenticate`](#0x1_account_abstraction_dispatchable_authenticate) +- [Specification](#@Specification_1) + - [Function `dispatchable_authenticate`](#@Specification_1_dispatchable_authenticate) + + +
use 0x1::auth_data;
+use 0x1::create_signer;
+use 0x1::error;
+use 0x1::event;
+use 0x1::function_info;
+use 0x1::object;
+use 0x1::option;
+use 0x1::ordered_map;
+use 0x1::permissioned_signer;
+use 0x1::signer;
+use 0x1::string;
+
+ + + + + +## Struct `UpdateDispatchableAuthenticator` + + + +
#[event]
+struct UpdateDispatchableAuthenticator has drop, store
+
+ + + +
+Fields + + +
+
+account: address +
+
+ +
+
+update: vector<u8> +
+
+ +
+
+auth_function: function_info::FunctionInfo +
+
+ +
+
+ + +
+ + + +## Struct `RemoveDispatchableAuthenticator` + + + +
#[event]
+struct RemoveDispatchableAuthenticator has drop, store
+
+ + + +
+Fields + + +
+
+account: address +
+
+ +
+
+ + +
+ + + +## Enum Resource `DispatchableAuthenticator` + +The dispatchable authenticator that defines how to authenticates this account in the specified module. +An integral part of Account Abstraction. + + +
#[resource_group_member(#[group = 0x1::object::ObjectGroup])]
+enum DispatchableAuthenticator has copy, drop, key
+
+ + + +
+Variants + + +
+V1 + + +
+Fields + + +
+
+auth_functions: ordered_map::OrderedMap<function_info::FunctionInfo, bool> +
+
+ +
+
+ + +
+ +
+ +
+ + + +## Constants + + + + + + +
const MAX_U64: u128 = 18446744073709551615;
+
+ + + + + + + +
const ENOT_MASTER_SIGNER: u64 = 4;
+
+ + + + + + + +
const EAUTH_FUNCTION_SIGNATURE_MISMATCH: u64 = 3;
+
+ + + + + + + +
const EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED: u64 = 1;
+
+ + + + + + + +
const EFUNCTION_INFO_EXISTENCE: u64 = 2;
+
+ + + + + +## Function `add_dispatchable_authentication_function` + +Update dispatchable authenticator that enables account abstraction. +Note: it is a private entry function that can only be called directly from transaction. + + +
public entry fun add_dispatchable_authentication_function(account: &signer, module_address: address, module_name: string::String, function_name: string::String)
+
+ + + +
+Implementation + + +
public entry fun add_dispatchable_authentication_function(
+    account: &signer,
+    module_address: address,
+    module_name: String,
+    function_name: String,
+) acquires DispatchableAuthenticator {
+    assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    update_dispatchable_authenticator_impl(
+        account,
+        function_info::new_function_info_from_address(module_address, module_name, function_name),
+        true
+    );
+}
+
+ + + +
+ + + +## Function `remove_dispatchable_authentication_function` + + + +
public entry fun remove_dispatchable_authentication_function(account: &signer, module_address: address, module_name: string::String, function_name: string::String)
+
+ + + +
+Implementation + + +
public entry fun remove_dispatchable_authentication_function(
+    account: &signer,
+    module_address: address,
+    module_name: String,
+    function_name: String,
+) acquires DispatchableAuthenticator {
+    assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    update_dispatchable_authenticator_impl(
+        account,
+        function_info::new_function_info_from_address(module_address, module_name, function_name),
+        false
+    );
+}
+
+ + + +
+ + + +## Function `remove_dispatchable_authenticator` + +Update dispatchable authenticator that disables account abstraction. +Note: it is a private entry function that can only be called directly from transaction. + + +
public entry fun remove_dispatchable_authenticator(account: &signer)
+
+ + + +
+Implementation + + +
public entry fun remove_dispatchable_authenticator(
+    account: &signer,
+) acquires DispatchableAuthenticator {
+    assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    let addr = signer::address_of(account);
+    let resource_addr = resource_addr(addr);
+    if (exists<DispatchableAuthenticator>(resource_addr)) {
+        move_from<DispatchableAuthenticator>(resource_addr);
+        event::emit(RemoveDispatchableAuthenticator {
+            account: addr,
+        });
+    };
+}
+
+ + + +
+ + + +## Function `resource_addr` + + + +
fun resource_addr(source: address): address
+
+ + + +
+Implementation + + +
inline fun resource_addr(source: address): address {
+    object::create_user_derived_object_address(source, @aptos_fungible_asset)
+}
+
+ + + +
+ + + +## Function `update_dispatchable_authenticator_impl` + + + +
fun update_dispatchable_authenticator_impl(account: &signer, auth_function: function_info::FunctionInfo, is_add: bool)
+
+ + + +
+Implementation + + +
fun update_dispatchable_authenticator_impl(
+    account: &signer,
+    auth_function: FunctionInfo,
+    is_add: bool,
+) acquires DispatchableAuthenticator {
+    let addr = signer::address_of(account);
+    let resource_addr = resource_addr(addr);
+    let dispatcher_auth_function_info = function_info::new_function_info_from_address(
+        @aptos_framework,
+        string::utf8(b"account_abstraction"),
+        string::utf8(b"dispatchable_authenticate"),
+    );
+    assert!(
+        function_info::check_dispatch_type_compatibility(&dispatcher_auth_function_info, &auth_function),
+        error::invalid_argument(EAUTH_FUNCTION_SIGNATURE_MISMATCH)
+    );
+    if (is_add && !exists<DispatchableAuthenticator>(resource_addr)) {
+        move_to(
+            &create_signer::create_signer(resource_addr),
+            DispatchableAuthenticator::V1 { auth_functions: ordered_map::new() }
+        );
+    };
+    if (exists<DispatchableAuthenticator>(resource_addr)) {
+        let current_map = &mut borrow_global_mut<DispatchableAuthenticator>(resource_addr).auth_functions;
+        if (is_add) {
+            assert!(
+                !ordered_map::contains(current_map, &auth_function),
+                error::already_exists(EFUNCTION_INFO_EXISTENCE)
+            );
+            ordered_map::add(current_map, auth_function, true);
+        } else {
+            assert!(
+                ordered_map::contains(current_map, &auth_function),
+                error::not_found(EFUNCTION_INFO_EXISTENCE)
+            );
+            ordered_map::remove(current_map, &auth_function);
+        };
+        event::emit(
+            UpdateDispatchableAuthenticator {
+                account: addr,
+                update: if (is_add) { b"add" } else { b"remove" },
+                auth_function,
+            }
+        );
+        if (ordered_map::length(current_map) == 0) {
+            remove_dispatchable_authenticator(account);
+        }
+    };
+}
+
+ + + +
+ + + +## Function `using_dispatchable_authenticator` + +Return true if the account is an abstracted account that can be authenticated with dispatchable move authenticator. + + +
#[view]
+public fun using_dispatchable_authenticator(addr: address): bool
+
+ + + +
+Implementation + + +
public fun using_dispatchable_authenticator(addr: address): bool {
+    exists<DispatchableAuthenticator>(resource_addr(addr))
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticator` + +Return the current dispatchable authenticator move function info. None means this authentication scheme is disabled. + + +
#[view]
+public fun dispatchable_authenticator(addr: address): option::Option<vector<function_info::FunctionInfo>>
+
+ + + +
+Implementation + + +
public fun dispatchable_authenticator(addr: address): Option<vector<FunctionInfo>> acquires DispatchableAuthenticator {
+    let resource_addr = resource_addr(addr);
+    if (exists<DispatchableAuthenticator>(resource_addr)) {
+        option::some(
+            ordered_map::keys(&borrow_global<DispatchableAuthenticator>(resource_addr).auth_functions)
+        )
+    } else { option::none() }
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticator_internal` + + + +
fun dispatchable_authenticator_internal(addr: address): &ordered_map::OrderedMap<function_info::FunctionInfo, bool>
+
+ + + +
+Implementation + + +
inline fun dispatchable_authenticator_internal(addr: address): &OrderedMap<FunctionInfo, bool> {
+    assert!(using_dispatchable_authenticator(addr), error::not_found(EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED));
+    &borrow_global<DispatchableAuthenticator>(resource_addr(addr)).auth_functions
+}
+
+ + + +
+ + + +## Function `authenticate` + + + +
fun authenticate(account: signer, func_info: function_info::FunctionInfo, signing_data: auth_data::AbstractionAuthData): signer
+
+ + + +
+Implementation + + +
fun authenticate(
+    account: signer,
+    func_info: FunctionInfo,
+    signing_data: AbstractionAuthData,
+): signer acquires DispatchableAuthenticator {
+    let func_infos = dispatchable_authenticator_internal(signer::address_of(&account));
+    assert!(ordered_map::contains(func_infos, &func_info), error::not_found(EFUNCTION_INFO_EXISTENCE));
+    function_info::load_module_from_function(&func_info);
+    dispatchable_authenticate(account, signing_data, &func_info)
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticate` + +The native function to dispatch customized move authentication function. + + +
fun dispatchable_authenticate(account: signer, signing_data: auth_data::AbstractionAuthData, function: &function_info::FunctionInfo): signer
+
+ + + +
+Implementation + + +
native fun dispatchable_authenticate(
+    account: signer,
+    signing_data: AbstractionAuthData,
+    function: &FunctionInfo
+): signer;
+
+ + + +
+ + + +## Specification + + + +
pragma verify = false;
+
+ + + + + + + +
fun spec_dispatchable_authenticate(
+   account: signer,
+   signing_data: AbstractionAuthData,
+   function: &FunctionInfo
+): signer;
+
+ + + + + +### Function `dispatchable_authenticate` + + +
fun dispatchable_authenticate(account: signer, signing_data: auth_data::AbstractionAuthData, function: &function_info::FunctionInfo): signer
+
+ + + + +
pragma opaque;
+ensures [abstract] result == spec_dispatchable_authenticate(account, signing_data, function);
+
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/auth_data.md b/aptos-move/framework/aptos-framework/doc/auth_data.md new file mode 100644 index 0000000000000..d24ad59f5cc25 --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/auth_data.md @@ -0,0 +1,111 @@ + + + +# Module `0x1::auth_data` + + + +- [Enum `AbstractionAuthData`](#0x1_auth_data_AbstractionAuthData) +- [Function `digest`](#0x1_auth_data_digest) +- [Function `authenticator`](#0x1_auth_data_authenticator) + + +
+ + + + + +## Enum `AbstractionAuthData` + + + +
enum AbstractionAuthData has copy, drop
+
+ + + +
+Variants + + +
+V1 + + +
+Fields + + +
+
+digest: vector<u8> +
+
+ +
+
+authenticator: vector<u8> +
+
+ +
+
+ + +
+ +
+ +
+ + + +## Function `digest` + + + +
public fun digest(signing_data: &auth_data::AbstractionAuthData): &vector<u8>
+
+ + + +
+Implementation + + +
public fun digest(signing_data: &AbstractionAuthData): &vector<u8> {
+    &signing_data.digest
+}
+
+ + + +
+ + + +## Function `authenticator` + + + +
public fun authenticator(signing_data: &auth_data::AbstractionAuthData): &vector<u8>
+
+ + + +
+Implementation + + +
public fun authenticator(signing_data: &AbstractionAuthData): &vector<u8> {
+    &signing_data.authenticator
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/bcs_stream.md b/aptos-move/framework/aptos-framework/doc/bcs_stream.md new file mode 100644 index 0000000000000..1de9a5914caf2 --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/bcs_stream.md @@ -0,0 +1,663 @@ + + + +# Module `0x1::bcs_stream` + +This module enables the deserialization of BCS-formatted byte arrays into Move primitive types. +Deserialization Strategies: +- Per-Byte Deserialization: Employed for most types to ensure lower gas consumption, this method processes each byte +individually to match the length and type requirements of target Move types. +- Exception: For the deserialize_address function, the function-based approach from aptos_std::from_bcs is used +due to type constraints, even though it is generally more gas-intensive. +- This can be optimized further by introducing native vector slices. +Application: +- This deserializer is particularly valuable for processing BCS serialized data within Move modules, +especially useful for systems requiring cross-chain message interpretation or off-chain data verification. + + +- [Struct `BCSStream`](#0x1_bcs_stream_BCSStream) +- [Constants](#@Constants_0) +- [Function `new`](#0x1_bcs_stream_new) +- [Function `deserialize_uleb128`](#0x1_bcs_stream_deserialize_uleb128) +- [Function `deserialize_bool`](#0x1_bcs_stream_deserialize_bool) +- [Function `deserialize_address`](#0x1_bcs_stream_deserialize_address) +- [Function `deserialize_u8`](#0x1_bcs_stream_deserialize_u8) +- [Function `deserialize_u16`](#0x1_bcs_stream_deserialize_u16) +- [Function `deserialize_u32`](#0x1_bcs_stream_deserialize_u32) +- [Function `deserialize_u64`](#0x1_bcs_stream_deserialize_u64) +- [Function `deserialize_u128`](#0x1_bcs_stream_deserialize_u128) +- [Function `deserialize_u256`](#0x1_bcs_stream_deserialize_u256) +- [Function `deserialize_u256_entry`](#0x1_bcs_stream_deserialize_u256_entry) +- [Function `deserialize_vector`](#0x1_bcs_stream_deserialize_vector) +- [Function `deserialize_string`](#0x1_bcs_stream_deserialize_string) +- [Function `deserialize_option`](#0x1_bcs_stream_deserialize_option) +- [Specification](#@Specification_1) + + +
use 0x1::error;
+use 0x1::from_bcs;
+use 0x1::string;
+use 0x1::vector;
+
+ + + + + +## Struct `BCSStream` + + + +
struct BCSStream has drop
+
+ + + +
+Fields + + +
+
+data: vector<u8> +
+
+ Byte buffer containing the serialized data. +
+
+cur: u64 +
+
+ Cursor indicating the current position in the byte buffer. +
+
+ + +
+ + + +## Constants + + + + +The data does not fit the expected format. + + +
const EMALFORMED_DATA: u64 = 1;
+
+ + + + + +There are not enough bytes to deserialize for the given type. + + +
const EOUT_OF_BYTES: u64 = 2;
+
+ + + + + +## Function `new` + +Constructs a new BCSStream instance from the provided byte array. + + +
public fun new(data: vector<u8>): bcs_stream::BCSStream
+
+ + + +
+Implementation + + +
public fun new(data: vector<u8>): BCSStream {
+    BCSStream {
+        data,
+        cur: 0,
+    }
+}
+
+ + + +
+ + + +## Function `deserialize_uleb128` + +Deserializes a ULEB128-encoded integer from the stream. +In the BCS format, lengths of vectors are represented using ULEB128 encoding. + + +
public fun deserialize_uleb128(stream: &mut bcs_stream::BCSStream): u64
+
+ + + +
+Implementation + + +
public fun deserialize_uleb128(stream: &mut BCSStream): u64 {
+    let res = 0;
+    let shift = 0;
+
+    while (stream.cur < vector::length(&stream.data)) {
+        let byte = *vector::borrow(&stream.data, stream.cur);
+        stream.cur = stream.cur + 1;
+
+        let val = ((byte & 0x7f) as u64);
+        if (((val << shift) >> shift) != val) {
+            abort error::invalid_argument(EMALFORMED_DATA)
+        };
+        res = res | (val << shift);
+
+        if ((byte & 0x80) == 0) {
+            if (shift > 0 && val == 0) {
+                abort error::invalid_argument(EMALFORMED_DATA)
+            };
+            return res
+        };
+
+        shift = shift + 7;
+        if (shift > 64) {
+            abort error::invalid_argument(EMALFORMED_DATA)
+        };
+    };
+
+    abort error::out_of_range(EOUT_OF_BYTES)
+}
+
+ + + +
+ + + +## Function `deserialize_bool` + +Deserializes a bool value from the stream. + + +
public fun deserialize_bool(stream: &mut bcs_stream::BCSStream): bool
+
+ + + +
+Implementation + + +
public fun deserialize_bool(stream: &mut BCSStream): bool {
+    assert!(stream.cur < vector::length(&stream.data), error::out_of_range(EOUT_OF_BYTES));
+    let byte = *vector::borrow(&stream.data, stream.cur);
+    stream.cur = stream.cur + 1;
+    if (byte == 0) {
+        false
+    } else if (byte == 1) {
+        true
+    } else {
+        abort error::invalid_argument(EMALFORMED_DATA)
+    }
+}
+
+ + + +
+ + + +## Function `deserialize_address` + +Deserializes an address value from the stream. +32-byte address values are serialized using little-endian byte order. +This function utilizes the to_address function from the aptos_std::from_bcs module, +because the Move type system does not permit per-byte referencing of addresses. + + +
public fun deserialize_address(stream: &mut bcs_stream::BCSStream): address
+
+ + + +
+Implementation + + +
public fun deserialize_address(stream: &mut BCSStream): address {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res = from_bcs::to_address(vector::slice(data, cur, cur + 32));
+
+    stream.cur = cur + 32;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u8` + +Deserializes a u8 value from the stream. +1-byte u8 values are serialized using little-endian byte order. + + +
public fun deserialize_u8(stream: &mut bcs_stream::BCSStream): u8
+
+ + + +
+Implementation + + +
public fun deserialize_u8(stream: &mut BCSStream): u8 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur < vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+
+    let res = *vector::borrow(data, cur);
+
+    stream.cur = cur + 1;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u16` + +Deserializes a u16 value from the stream. +2-byte u16 values are serialized using little-endian byte order. + + +
public fun deserialize_u16(stream: &mut bcs_stream::BCSStream): u16
+
+ + + +
+Implementation + + +
public fun deserialize_u16(stream: &mut BCSStream): u16 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 2 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u16) |
+            ((*vector::borrow(data, cur + 1) as u16) << 8)
+    ;
+
+    stream.cur = stream.cur + 2;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u32` + +Deserializes a u32 value from the stream. +4-byte u32 values are serialized using little-endian byte order. + + +
public fun deserialize_u32(stream: &mut bcs_stream::BCSStream): u32
+
+ + + +
+Implementation + + +
public fun deserialize_u32(stream: &mut BCSStream): u32 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 4 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u32) |
+            ((*vector::borrow(data, cur + 1) as u32) << 8) |
+            ((*vector::borrow(data, cur + 2) as u32) << 16) |
+            ((*vector::borrow(data, cur + 3) as u32) << 24)
+    ;
+
+    stream.cur = stream.cur + 4;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u64` + +Deserializes a u64 value from the stream. +8-byte u64 values are serialized using little-endian byte order. + + +
public fun deserialize_u64(stream: &mut bcs_stream::BCSStream): u64
+
+ + + +
+Implementation + + +
public fun deserialize_u64(stream: &mut BCSStream): u64 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 8 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u64) |
+            ((*vector::borrow(data, cur + 1) as u64) << 8) |
+            ((*vector::borrow(data, cur + 2) as u64) << 16) |
+            ((*vector::borrow(data, cur + 3) as u64) << 24) |
+            ((*vector::borrow(data, cur + 4) as u64) << 32) |
+            ((*vector::borrow(data, cur + 5) as u64) << 40) |
+            ((*vector::borrow(data, cur + 6) as u64) << 48) |
+            ((*vector::borrow(data, cur + 7) as u64) << 56)
+    ;
+
+    stream.cur = stream.cur + 8;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u128` + +Deserializes a u128 value from the stream. +16-byte u128 values are serialized using little-endian byte order. + + +
public fun deserialize_u128(stream: &mut bcs_stream::BCSStream): u128
+
+ + + +
+Implementation + + +
public fun deserialize_u128(stream: &mut BCSStream): u128 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 16 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u128) |
+            ((*vector::borrow(data, cur + 1) as u128) << 8) |
+            ((*vector::borrow(data, cur + 2) as u128) << 16) |
+            ((*vector::borrow(data, cur + 3) as u128) << 24) |
+            ((*vector::borrow(data, cur + 4) as u128) << 32) |
+            ((*vector::borrow(data, cur + 5) as u128) << 40) |
+            ((*vector::borrow(data, cur + 6) as u128) << 48) |
+            ((*vector::borrow(data, cur + 7) as u128) << 56) |
+            ((*vector::borrow(data, cur + 8) as u128) << 64) |
+            ((*vector::borrow(data, cur + 9) as u128) << 72) |
+            ((*vector::borrow(data, cur + 10) as u128) << 80) |
+            ((*vector::borrow(data, cur + 11) as u128) << 88) |
+            ((*vector::borrow(data, cur + 12) as u128) << 96) |
+            ((*vector::borrow(data, cur + 13) as u128) << 104) |
+            ((*vector::borrow(data, cur + 14) as u128) << 112) |
+            ((*vector::borrow(data, cur + 15) as u128) << 120)
+    ;
+
+    stream.cur = stream.cur + 16;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u256` + +Deserializes a u256 value from the stream. +32-byte u256 values are serialized using little-endian byte order. + + +
public fun deserialize_u256(stream: &mut bcs_stream::BCSStream): u256
+
+ + + +
+Implementation + + +
public fun deserialize_u256(stream: &mut BCSStream): u256 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u256) |
+            ((*vector::borrow(data, cur + 1) as u256) << 8) |
+            ((*vector::borrow(data, cur + 2) as u256) << 16) |
+            ((*vector::borrow(data, cur + 3) as u256) << 24) |
+            ((*vector::borrow(data, cur + 4) as u256) << 32) |
+            ((*vector::borrow(data, cur + 5) as u256) << 40) |
+            ((*vector::borrow(data, cur + 6) as u256) << 48) |
+            ((*vector::borrow(data, cur + 7) as u256) << 56) |
+            ((*vector::borrow(data, cur + 8) as u256) << 64) |
+            ((*vector::borrow(data, cur + 9) as u256) << 72) |
+            ((*vector::borrow(data, cur + 10) as u256) << 80) |
+            ((*vector::borrow(data, cur + 11) as u256) << 88) |
+            ((*vector::borrow(data, cur + 12) as u256) << 96) |
+            ((*vector::borrow(data, cur + 13) as u256) << 104) |
+            ((*vector::borrow(data, cur + 14) as u256) << 112) |
+            ((*vector::borrow(data, cur + 15) as u256) << 120) |
+            ((*vector::borrow(data, cur + 16) as u256) << 128) |
+            ((*vector::borrow(data, cur + 17) as u256) << 136) |
+            ((*vector::borrow(data, cur + 18) as u256) << 144) |
+            ((*vector::borrow(data, cur + 19) as u256) << 152) |
+            ((*vector::borrow(data, cur + 20) as u256) << 160) |
+            ((*vector::borrow(data, cur + 21) as u256) << 168) |
+            ((*vector::borrow(data, cur + 22) as u256) << 176) |
+            ((*vector::borrow(data, cur + 23) as u256) << 184) |
+            ((*vector::borrow(data, cur + 24) as u256) << 192) |
+            ((*vector::borrow(data, cur + 25) as u256) << 200) |
+            ((*vector::borrow(data, cur + 26) as u256) << 208) |
+            ((*vector::borrow(data, cur + 27) as u256) << 216) |
+            ((*vector::borrow(data, cur + 28) as u256) << 224) |
+            ((*vector::borrow(data, cur + 29) as u256) << 232) |
+            ((*vector::borrow(data, cur + 30) as u256) << 240) |
+            ((*vector::borrow(data, cur + 31) as u256) << 248)
+    ;
+
+    stream.cur = stream.cur + 32;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u256_entry` + +Deserializes a u256 value from the stream. + + +
public entry fun deserialize_u256_entry(data: vector<u8>, cursor: u64)
+
+ + + +
+Implementation + + +
public entry fun deserialize_u256_entry(data: vector<u8>, cursor: u64) {
+    let stream = BCSStream {
+        data: data,
+        cur: cursor,
+    };
+    deserialize_u256(&mut stream);
+}
+
+ + + +
+ + + +## Function `deserialize_vector` + +Deserializes an array of BCS deserializable elements from the stream. +First, reads the length of the vector, which is in uleb128 format. +After determining the length, it then reads the contents of the vector. +The elem_deserializer lambda expression is used sequentially to deserialize each element of the vector. + + +
public fun deserialize_vector<E>(stream: &mut bcs_stream::BCSStream, elem_deserializer: |&mut bcs_stream::BCSStream|E): vector<E>
+
+ + + +
+Implementation + + +
public inline fun deserialize_vector<E>(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): vector<E> {
+    let len = deserialize_uleb128(stream);
+    let v = vector::empty();
+
+    let i = 0;
+    while (i < len) {
+        vector::push_back(&mut v, elem_deserializer(stream));
+        i = i + 1;
+    };
+
+    v
+}
+
+ + + +
+ + + +## Function `deserialize_string` + +Deserializes utf-8 String from the stream. +First, reads the length of the String, which is in uleb128 format. +After determining the length, it then reads the contents of the String. + + +
public fun deserialize_string(stream: &mut bcs_stream::BCSStream): string::String
+
+ + + +
+Implementation + + +
public fun deserialize_string(stream: &mut BCSStream): String {
+    let len = deserialize_uleb128(stream);
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + len <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+
+    let res = string::utf8(vector::slice(data, cur, cur + len));
+    stream.cur = cur + len;
+
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_option` + +Deserializes Option from the stream. +First, reads a single byte representing the presence (0x01) or absence (0x00) of data. +After determining the presence of data, it then reads the actual data if present. +The elem_deserializer lambda expression is used to deserialize the element contained within the Option. + + +
public fun deserialize_option<E>(stream: &mut bcs_stream::BCSStream, elem_deserializer: |&mut bcs_stream::BCSStream|E): option::Option<E>
+
+ + + +
+Implementation + + +
public inline fun deserialize_option<E>(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): Option<E> {
+    let is_data = deserialize_bool(stream);
+    if (is_data) {
+        option::some(elem_deserializer(stream))
+    } else {
+        option::none()
+    }
+}
+
+ + + +
+ + + +## Specification + + + +
pragma verify = false;
+
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/lite_account.md b/aptos-move/framework/aptos-framework/doc/lite_account.md new file mode 100644 index 0000000000000..fe595f286e68b --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/lite_account.md @@ -0,0 +1,547 @@ + + + +# Module `0x1::lite_account` + + + +- [Struct `UpdateDispatchableAuthenticator`](#0x1_lite_account_UpdateDispatchableAuthenticator) +- [Struct `RemoveDispatchableAuthenticator`](#0x1_lite_account_RemoveDispatchableAuthenticator) +- [Resource `DispatchableAuthenticator`](#0x1_lite_account_DispatchableAuthenticator) +- [Constants](#@Constants_0) +- [Function `add_dispatchable_authentication_function`](#0x1_lite_account_add_dispatchable_authentication_function) +- [Function `remove_dispatchable_authentication_function`](#0x1_lite_account_remove_dispatchable_authentication_function) +- [Function `remove_dispatchable_authenticator`](#0x1_lite_account_remove_dispatchable_authenticator) +- [Function `resource_addr`](#0x1_lite_account_resource_addr) +- [Function `update_dispatchable_authenticator_impl`](#0x1_lite_account_update_dispatchable_authenticator_impl) +- [Function `using_dispatchable_authenticator`](#0x1_lite_account_using_dispatchable_authenticator) +- [Function `dispatchable_authenticator`](#0x1_lite_account_dispatchable_authenticator) +- [Function `dispatchable_authenticator_internal`](#0x1_lite_account_dispatchable_authenticator_internal) +- [Function `authenticate`](#0x1_lite_account_authenticate) +- [Function `dispatchable_authenticate`](#0x1_lite_account_dispatchable_authenticate) +- [Specification](#@Specification_1) + - [Function `dispatchable_authenticate`](#@Specification_1_dispatchable_authenticate) + + +
use 0x1::create_signer;
+use 0x1::error;
+use 0x1::event;
+use 0x1::function_info;
+use 0x1::object;
+use 0x1::option;
+use 0x1::signer;
+use 0x1::signing_data;
+use 0x1::simple_map;
+use 0x1::string;
+
+ + + + + +## Struct `UpdateDispatchableAuthenticator` + + + +
#[event]
+struct UpdateDispatchableAuthenticator has drop, store
+
+ + + +
+Fields + + +
+
+account: address +
+
+ +
+
+update: vector<u8> +
+
+ +
+
+auth_function: function_info::FunctionInfo +
+
+ +
+
+ + +
+ + + +## Struct `RemoveDispatchableAuthenticator` + + + +
#[event]
+struct RemoveDispatchableAuthenticator has drop, store
+
+ + + +
+Fields + + +
+
+account: address +
+
+ +
+
+ + +
+ + + +## Resource `DispatchableAuthenticator` + +The dispatchable authenticator that defines how to authenticates this account in the specified module. +An integral part of Account Abstraction. + + +
#[resource_group_member(#[group = 0x1::object::ObjectGroup])]
+struct DispatchableAuthenticator has copy, drop, key
+
+ + + +
+Fields + + +
+
+auth_functions: simple_map::SimpleMap<function_info::FunctionInfo, bool> +
+
+ +
+
+ + +
+ + + +## Constants + + + + + + +
const MAX_U64: u128 = 18446744073709551615;
+
+ + + + + + + +
const EAUTH_FUNCTION_SIGNATURE_MISMATCH: u64 = 3;
+
+ + + + + + + +
const EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED: u64 = 1;
+
+ + + + + + + +
const EFUNCTION_INFO_EXISTENCE: u64 = 2;
+
+ + + + + + + +
const ENOT_MASTER_SIGNER: u64 = 4;
+
+ + + + + +## Function `add_dispatchable_authentication_function` + +Update dispatchable authenticator that enables account abstraction. +Note: it is a private entry function that can only be called directly from transaction. + + +
public entry fun add_dispatchable_authentication_function(account: &signer, module_address: address, module_name: string::String, function_name: string::String)
+
+ + + +
+Implementation + + +
public entry fun add_dispatchable_authentication_function(
+    account: &signer,
+    module_address: address,
+    module_name: String,
+    function_name: String,
+) acquires DispatchableAuthenticator {
+    //assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    update_dispatchable_authenticator_impl(
+        account,
+        function_info::new_function_info_from_address(module_address, module_name, function_name),
+        true
+    );
+}
+
+ + + +
+ + + +## Function `remove_dispatchable_authentication_function` + + + +
public entry fun remove_dispatchable_authentication_function(account: &signer, module_address: address, module_name: string::String, function_name: string::String)
+
+ + + +
+Implementation + + +
public entry fun remove_dispatchable_authentication_function(
+    account: &signer,
+    module_address: address,
+    module_name: String,
+    function_name: String,
+) acquires DispatchableAuthenticator {
+    //assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    update_dispatchable_authenticator_impl(
+        account,
+        function_info::new_function_info_from_address(module_address, module_name, function_name),
+        false
+    );
+}
+
+ + + +
+ + + +## Function `remove_dispatchable_authenticator` + +Update dispatchable authenticator that disables account abstraction. +Note: it is a private entry function that can only be called directly from transaction. + + +
public entry fun remove_dispatchable_authenticator(account: &signer)
+
+ + + +
+Implementation + + +
public entry fun remove_dispatchable_authenticator(
+    account: &signer,
+) acquires DispatchableAuthenticator {
+    //assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER));
+    let addr = signer::address_of(account);
+    let resource_addr = resource_addr(addr);
+    if (exists<DispatchableAuthenticator>(resource_addr)) {
+        move_from<DispatchableAuthenticator>(resource_addr);
+        event::emit(RemoveDispatchableAuthenticator {
+            account: addr,
+        });
+    };
+}
+
+ + + +
+ + + +## Function `resource_addr` + + + +
fun resource_addr(source: address): address
+
+ + + +
+Implementation + + +
inline fun resource_addr(source: address): address {
+    object::create_user_derived_object_address(source, @aptos_fungible_asset)
+}
+
+ + + +
+ + + +## Function `update_dispatchable_authenticator_impl` + + + +
public(friend) fun update_dispatchable_authenticator_impl(account: &signer, auth_function: function_info::FunctionInfo, is_add: bool)
+
+ + + +
+Implementation + + +
public(friend) fun update_dispatchable_authenticator_impl(
+    account: &signer,
+    auth_function: FunctionInfo,
+    is_add: bool,
+) acquires DispatchableAuthenticator {
+    let addr = signer::address_of(account);
+    let resource_addr = resource_addr(addr);
+        let dispatcher_auth_function_info = function_info::new_function_info_from_address(
+            @aptos_framework,
+            string::utf8(b"lite_account"),
+            string::utf8(b"dispatchable_authenticate"),
+        );
+        assert!(
+            function_info::check_dispatch_type_compatibility(&dispatcher_auth_function_info, &auth_function),
+            error::invalid_argument(EAUTH_FUNCTION_SIGNATURE_MISMATCH)
+        );
+    if (is_add && !exists<DispatchableAuthenticator>(resource_addr)) {
+            move_to(&create_signer::create_signer(resource_addr), DispatchableAuthenticator {
+                auth_functions: simple_map::new()
+            });
+        };
+        if (exists<DispatchableAuthenticator>(resource_addr)) {
+            let current_map = &mut borrow_global_mut<DispatchableAuthenticator>(resource_addr).auth_functions;
+            if (is_add) {
+                assert!(!simple_map::contains_key(current_map, &auth_function), error::already_exists(EFUNCTION_INFO_EXISTENCE));
+                simple_map::add(current_map, auth_function, true);
+            } else {
+                assert!(simple_map::contains_key(current_map, &auth_function), error::not_found(EFUNCTION_INFO_EXISTENCE));
+                simple_map::remove(current_map, &auth_function);
+            };
+            event::emit(
+                UpdateDispatchableAuthenticator {
+                    account: addr,
+                    update: if (is_add) {b"add"} else {b"remove"},
+                    auth_function,
+                }
+            );
+            if (simple_map::length(current_map) == 0) {
+                remove_dispatchable_authenticator(account);
+            }
+        };
+}
+
+ + + +
+ + + +## Function `using_dispatchable_authenticator` + +Return true if the account is an abstracted account that can be authenticated with dispatchable move authenticator. + + +
#[view]
+public fun using_dispatchable_authenticator(addr: address): bool
+
+ + + +
+Implementation + + +
public fun using_dispatchable_authenticator(addr: address): bool {
+    exists<DispatchableAuthenticator>(resource_addr(addr))
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticator` + +Return the current dispatchable authenticator move function info. None means this authentication scheme is disabled. + + +
#[view]
+public fun dispatchable_authenticator(addr: address): option::Option<vector<function_info::FunctionInfo>>
+
+ + + +
+Implementation + + +
public fun dispatchable_authenticator(addr: address): Option<vector<FunctionInfo>> acquires DispatchableAuthenticator {
+    let resource_addr = resource_addr(addr);
+    if (exists<DispatchableAuthenticator>(resource_addr)) {
+        option::some(
+            simple_map::keys(&borrow_global<DispatchableAuthenticator>(resource_addr).auth_functions)
+        )
+    } else { option::none() }
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticator_internal` + + + +
fun dispatchable_authenticator_internal(addr: address): &simple_map::SimpleMap<function_info::FunctionInfo, bool>
+
+ + + +
+Implementation + + +
inline fun dispatchable_authenticator_internal(addr: address): &SimpleMap<FunctionInfo, bool> {
+    assert!(using_dispatchable_authenticator(addr), error::not_found(EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED));
+    &borrow_global<DispatchableAuthenticator>(resource_addr(addr)).auth_functions
+}
+
+ + + +
+ + + +## Function `authenticate` + + + +
fun authenticate(account: signer, func_info: function_info::FunctionInfo, signing_data: signing_data::SigningData): signer
+
+ + + +
+Implementation + + +
fun authenticate(
+    account: signer,
+    func_info: FunctionInfo,
+    signing_data: SigningData,
+): signer acquires DispatchableAuthenticator {
+    let func_infos = dispatchable_authenticator_internal(signer::address_of(&account));
+    assert!(simple_map::contains_key(func_infos, &func_info), error::not_found(EFUNCTION_INFO_EXISTENCE));
+    function_info::load_module_from_function(&func_info);
+    dispatchable_authenticate(account, signing_data, &func_info)
+}
+
+ + + +
+ + + +## Function `dispatchable_authenticate` + +The native function to dispatch customized move authentication function. + + +
fun dispatchable_authenticate(account: signer, signing_data: signing_data::SigningData, function: &function_info::FunctionInfo): signer
+
+ + + +
+Implementation + + +
native fun dispatchable_authenticate(
+    account: signer,
+    signing_data: SigningData,
+    function: &FunctionInfo
+): signer;
+
+ + + +
+ + + +## Specification + + + +
pragma verify = false;
+
+ + + + + +### Function `dispatchable_authenticate` + + +
fun dispatchable_authenticate(account: signer, signing_data: signing_data::SigningData, function: &function_info::FunctionInfo): signer
+
+ + + + +
pragma opaque;
+
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/overview.md b/aptos-move/framework/aptos-framework/doc/overview.md index 06453ea579191..4e7b3a475209b 100644 --- a/aptos-move/framework/aptos-framework/doc/overview.md +++ b/aptos-move/framework/aptos-framework/doc/overview.md @@ -13,12 +13,14 @@ This is the reference documentation of the Aptos framework. - [`0x1::account`](account.md#0x1_account) +- [`0x1::account_abstraction`](account_abstraction.md#0x1_account_abstraction) - [`0x1::aggregator`](aggregator.md#0x1_aggregator) - [`0x1::aggregator_factory`](aggregator_factory.md#0x1_aggregator_factory) - [`0x1::aggregator_v2`](aggregator_v2.md#0x1_aggregator_v2) - [`0x1::aptos_account`](aptos_account.md#0x1_aptos_account) - [`0x1::aptos_coin`](aptos_coin.md#0x1_aptos_coin) - [`0x1::aptos_governance`](aptos_governance.md#0x1_aptos_governance) +- [`0x1::auth_data`](auth_data.md#0x1_auth_data) - [`0x1::big_ordered_map`](big_ordered_map.md#0x1_big_ordered_map) - [`0x1::block`](block.md#0x1_block) - [`0x1::chain_id`](chain_id.md#0x1_chain_id) diff --git a/aptos-move/framework/aptos-framework/doc/permissioned_delegation.md b/aptos-move/framework/aptos-framework/doc/permissioned_delegation.md new file mode 100644 index 0000000000000..2edb6975559be --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/permissioned_delegation.md @@ -0,0 +1,361 @@ + + + +# Module `0x1::permissioned_delegation` + + + +- [Resource `Delegation`](#0x1_permissioned_delegation_Delegation) +- [Constants](#@Constants_0) +- [Function `add_permissioned_handle`](#0x1_permissioned_delegation_add_permissioned_handle) +- [Function `remove_permissioned_handle`](#0x1_permissioned_delegation_remove_permissioned_handle) +- [Function `permissioned_signer_by_key`](#0x1_permissioned_delegation_permissioned_signer_by_key) +- [Function `remove_permissioned_handle_by_delegate`](#0x1_permissioned_delegation_remove_permissioned_handle_by_delegate) +- [Function `handle_address_by_key`](#0x1_permissioned_delegation_handle_address_by_key) +- [Function `authenticate`](#0x1_permissioned_delegation_authenticate) +- [Function `get_permissioned_signer`](#0x1_permissioned_delegation_get_permissioned_signer) + + +
use 0x1::bcs_stream;
+use 0x1::ed25519;
+use 0x1::error;
+use 0x1::permissioned_signer;
+use 0x1::signer;
+use 0x1::table;
+
+ + + + + +## Resource `Delegation` + + + +
struct Delegation has key
+
+ + + +
+Fields + + +
+
+handles: table::Table<ed25519::UnvalidatedPublicKey, permissioned_signer::StorablePermissionedHandle> +
+
+ +
+
+ + +
+ + + +## Constants + + + + + + +
const ENOT_MASTER_SIGNER: u64 = 1;
+
+ + + + + + + +
const EINVALID_PUBLIC_KEY: u64 = 2;
+
+ + + + + + + +
const EHANDLE_EXISTENCE: u64 = 5;
+
+ + + + + + + +
const EINVALID_SIGNATURE: u64 = 4;
+
+ + + + + + + +
const EPUBLIC_KEY_NOT_FOUND: u64 = 3;
+
+ + + + + +## Function `add_permissioned_handle` + + + +
public fun add_permissioned_handle(master: &signer, key: vector<u8>, expiration_time: u64): signer
+
+ + + +
+Implementation + + +
public fun add_permissioned_handle(
+    master: &signer,
+    key: vector<u8>,
+    expiration_time: u64,
+): signer acquires Delegation {
+    assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER));
+    let addr = signer::address_of(master);
+    let pubkey = ed25519::new_unvalidated_public_key_from_bytes(key);
+    if (!exists<Delegation>(addr)) {
+        move_to(master, Delegation {
+            handles: table::new()
+        });
+    };
+    let handles = &mut borrow_global_mut<Delegation>(addr).handles;
+    assert!(!table::contains(handles, pubkey), error::already_exists(EHANDLE_EXISTENCE));
+    let handle = permissioned_signer::create_storable_permissioned_handle(master, expiration_time);
+    let permissioned_signer = permissioned_signer::signer_from_storable_permissioned(&handle);
+    table::add(handles, pubkey, handle);
+    permissioned_signer
+}
+
+ + + +
+ + + +## Function `remove_permissioned_handle` + + + +
public fun remove_permissioned_handle(master: &signer, key: vector<u8>)
+
+ + + +
+Implementation + + +
public fun remove_permissioned_handle(
+    master: &signer,
+    key: vector<u8>,
+) acquires Delegation {
+    assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER));
+    let addr = signer::address_of(master);
+    let pubkey = ed25519::new_unvalidated_public_key_from_bytes(key);
+    let handles = &mut borrow_global_mut<Delegation>(addr).handles;
+    assert!(table::contains(handles, pubkey), error::not_found(EHANDLE_EXISTENCE));
+    permissioned_signer::destroy_storable_permissioned_handle(table::remove(handles, pubkey));
+}
+
+ + + +
+ + + +## Function `permissioned_signer_by_key` + + + +
public fun permissioned_signer_by_key(master: &signer, key: vector<u8>): signer
+
+ + + +
+Implementation + + +
public fun permissioned_signer_by_key(
+    master: &signer,
+    key: vector<u8>,
+): signer acquires Delegation {
+    assert!(!is_permissioned_signer(master), error::permission_denied(ENOT_MASTER_SIGNER));
+    let addr = signer::address_of(master);
+    let pubkey = ed25519::new_unvalidated_public_key_from_bytes(key);
+    get_permissioned_signer(addr, pubkey)
+}
+
+ + + +
+ + + +## Function `remove_permissioned_handle_by_delegate` + + + +
public fun remove_permissioned_handle_by_delegate(master: address, signature: vector<u8>): permissioned_signer::StorablePermissionedHandle
+
+ + + +
+Implementation + + +
public fun remove_permissioned_handle_by_delegate(
+    master: address,
+    signature: vector<u8>,
+): StorablePermissionedHandle acquires Delegation {
+    let stream = bcs_stream::new(signature);
+    let public_key = new_unvalidated_public_key_from_bytes(
+        bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x))
+    );
+    let signature = new_signature_from_bytes(
+        bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x))
+    );
+    assert!(
+        ed25519::signature_verify_strict(
+            &signature,
+            &public_key,
+            vector[1, 2, 3],
+        ),
+        error::permission_denied(EINVALID_SIGNATURE)
+    );
+    let handles = &mut borrow_global_mut<Delegation>(master).handles;
+    assert!(table::contains(handles, public_key), error::not_found(EHANDLE_EXISTENCE));
+    table::remove(handles, public_key)
+}
+
+ + + +
+ + + +## Function `handle_address_by_key` + + + +
#[view]
+public fun handle_address_by_key(master: address, key: vector<u8>): address
+
+ + + +
+Implementation + + +
public fun handle_address_by_key(master: address, key: vector<u8>): address acquires Delegation {
+    let pubkey = ed25519::new_unvalidated_public_key_from_bytes(key);
+    let handles = &borrow_global<Delegation>(master).handles;
+    assert!(table::contains(handles, pubkey), error::not_found(EHANDLE_EXISTENCE));
+    permissioned_signer::permission_address(table::borrow(handles, pubkey))
+}
+
+ + + +
+ + + +## Function `authenticate` + +Authorization function for account abstraction. + + +
public fun authenticate(account: signer, transaction_hash: vector<u8>, signature: vector<u8>): signer
+
+ + + +
+Implementation + + +
public fun authenticate(
+    account: signer,
+    transaction_hash: vector<u8>,
+    signature: vector<u8>
+): signer acquires Delegation {
+    let addr = signer::address_of(&account);
+    let stream = bcs_stream::new(signature);
+    let public_key = new_unvalidated_public_key_from_bytes(
+        bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x))
+    );
+    let signature = new_signature_from_bytes(
+        bcs_stream::deserialize_vector<u8>(&mut stream, |x| deserialize_u8(x))
+    );
+    assert!(
+        ed25519::signature_verify_strict(
+            &signature,
+            &public_key,
+            transaction_hash,
+        ),
+        error::permission_denied(EINVALID_SIGNATURE)
+    );
+    get_permissioned_signer(addr, public_key)
+}
+
+ + + +
+ + + +## Function `get_permissioned_signer` + + + +
fun get_permissioned_signer(master: address, pubkey: ed25519::UnvalidatedPublicKey): signer
+
+ + + +
+Implementation + + +
inline fun get_permissioned_signer(master: address, pubkey: UnvalidatedPublicKey): signer {
+    if (exists<Delegation>(master)) {
+        let handles = &borrow_global<Delegation>(master).handles;
+        if (table::contains(handles, pubkey)) {
+            let signer = permissioned_signer::signer_from_storable_permissioned(table::borrow(handles, pubkey));
+            signer
+        } else {
+            abort error::permission_denied(EINVALID_SIGNATURE)
+        }
+    } else {
+        abort error::permission_denied(EINVALID_SIGNATURE)
+    }
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/signing_data.md b/aptos-move/framework/aptos-framework/doc/signing_data.md new file mode 100644 index 0000000000000..2288c9d4ac9cf --- /dev/null +++ b/aptos-move/framework/aptos-framework/doc/signing_data.md @@ -0,0 +1,111 @@ + + + +# Module `0x1::signing_data` + + + +- [Enum `SigningData`](#0x1_signing_data_SigningData) +- [Function `digest`](#0x1_signing_data_digest) +- [Function `authenticator`](#0x1_signing_data_authenticator) + + +
+ + + + + +## Enum `SigningData` + + + +
enum SigningData has copy, drop
+
+ + + +
+Variants + + +
+V1 + + +
+Fields + + +
+
+digest: vector<u8> +
+
+ +
+
+authenticator: vector<u8> +
+
+ +
+
+ + +
+ +
+ +
+ + + +## Function `digest` + + + +
public fun digest(signing_data: &signing_data::SigningData): &vector<u8>
+
+ + + +
+Implementation + + +
public fun digest(signing_data: &SigningData): &vector<u8> {
+    &signing_data.digest
+}
+
+ + + +
+ + + +## Function `authenticator` + + + +
public fun authenticator(signing_data: &signing_data::SigningData): &vector<u8>
+
+ + + +
+Implementation + + +
public fun authenticator(signing_data: &SigningData): &vector<u8> {
+    &signing_data.authenticator
+}
+
+ + + +
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/doc/transaction_validation.md b/aptos-move/framework/aptos-framework/doc/transaction_validation.md index c126406ef89b5..90b0e01a7a56f 100644 --- a/aptos-move/framework/aptos-framework/doc/transaction_validation.md +++ b/aptos-move/framework/aptos-framework/doc/transaction_validation.md @@ -22,6 +22,9 @@ - [Function `epilogue_gas_payer_extended`](#0x1_transaction_validation_epilogue_gas_payer_extended) - [Function `skip_auth_key_check`](#0x1_transaction_validation_skip_auth_key_check) - [Function `skip_gas_payment`](#0x1_transaction_validation_skip_gas_payment) +- [Function `unified_prologue`](#0x1_transaction_validation_unified_prologue) +- [Function `unified_prologue_fee_payer`](#0x1_transaction_validation_unified_prologue_fee_payer) +- [Function `unified_epilogue`](#0x1_transaction_validation_unified_epilogue) - [Specification](#@Specification_1) - [High-level Requirements](#high-level-req) - [Module-level Specification](#module-level-spec) @@ -38,16 +41,22 @@ - [Function `epilogue_extended`](#@Specification_1_epilogue_extended) - [Function `epilogue_gas_payer`](#@Specification_1_epilogue_gas_payer) - [Function `epilogue_gas_payer_extended`](#@Specification_1_epilogue_gas_payer_extended) + - [Function `unified_prologue`](#@Specification_1_unified_prologue) + - [Function `unified_prologue_fee_payer`](#@Specification_1_unified_prologue_fee_payer) + - [Function `unified_epilogue`](#@Specification_1_unified_epilogue)
use 0x1::account;
+use 0x1::account_abstraction;
 use 0x1::aptos_account;
 use 0x1::aptos_coin;
 use 0x1::bcs;
 use 0x1::chain_id;
 use 0x1::coin;
+use 0x1::create_signer;
 use 0x1::error;
 use 0x1::features;
+use 0x1::option;
 use 0x1::signer;
 use 0x1::system_addresses;
 use 0x1::timestamp;
@@ -282,7 +291,7 @@ Only called during genesis to initialize system resources for this module.
 
 
 
-
fun prologue_common(sender: signer, gas_payer: address, txn_sequence_number: u64, txn_authentication_key: vector<u8>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
fun prologue_common(sender: &signer, gas_payer: &signer, txn_sequence_number: u64, txn_authentication_key: option::Option<vector<u8>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
 
@@ -292,10 +301,10 @@ Only called during genesis to initialize system resources for this module.
fun prologue_common(
-    sender: signer,
-    gas_payer: address,
+    sender: &signer,
+    gas_payer: &signer,
     txn_sequence_number: u64,
-    txn_authentication_key: vector<u8>,
+    txn_authentication_key: Option<vector<u8>>,
     txn_gas_price: u64,
     txn_max_gas_units: u64,
     txn_expiration_time: u64,
@@ -308,23 +317,33 @@ Only called during genesis to initialize system resources for this module.
     );
     assert!(chain_id::get() == chain_id, error::invalid_argument(PROLOGUE_EBAD_CHAIN_ID));
 
-    let transaction_sender = signer::address_of(&sender);
+    let transaction_sender = signer::address_of(sender);
+    let gas_payer_address = signer::address_of(gas_payer);
 
     if (
-        transaction_sender == gas_payer
+        transaction_sender == gas_payer_address
             || account::exists_at(transaction_sender)
             || !features::sponsored_automatic_account_creation_enabled()
             || txn_sequence_number > 0
     ) {
         assert!(account::exists_at(transaction_sender), error::invalid_argument(PROLOGUE_EACCOUNT_DOES_NOT_EXIST));
         if (!features::transaction_simulation_enhancement_enabled() ||
-                !skip_auth_key_check(is_simulation, &txn_authentication_key)) {
-            assert!(
-                txn_authentication_key == account::get_authentication_key(transaction_sender),
-                error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
-            )
+            !skip_auth_key_check(is_simulation, &txn_authentication_key)) {
+            if (option::is_some(&txn_authentication_key)) {
+                assert!(
+                    txn_authentication_key == option::some(account::get_authentication_key(transaction_sender)),
+                    error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+                );
+            } else {
+                assert!(
+                    features::is_account_abstraction_enabled(
+                    ) && account_abstraction::using_dispatchable_authenticator(
+                        transaction_sender
+                    ),
+                    error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+                )
+            };
         };
-
         let account_sequence_number = account::get_sequence_number(transaction_sender);
         assert!(
             txn_sequence_number < (1u64 << 63),
@@ -351,7 +370,7 @@ Only called during genesis to initialize system resources for this module.
         if (!features::transaction_simulation_enhancement_enabled() ||
                 !skip_auth_key_check(is_simulation, &txn_authentication_key)) {
             assert!(
-                txn_authentication_key == bcs::to_bytes(&transaction_sender),
+                txn_authentication_key == option::some(bcs::to_bytes(&transaction_sender)),
                 error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
             );
         }
@@ -359,15 +378,18 @@ Only called during genesis to initialize system resources for this module.
 
     let max_transaction_fee = txn_gas_price * txn_max_gas_units;
 
-    if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment(is_simulation, gas_payer)) {
+    if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment(
+        is_simulation,
+        gas_payer_address
+    )) {
         if (features::operations_default_to_fa_apt_store_enabled()) {
             assert!(
-                aptos_account::is_fungible_balance_at_least(gas_payer, max_transaction_fee),
+                aptos_account::is_fungible_balance_at_least(gas_payer_address, max_transaction_fee),
                 error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT)
             );
         } else {
             assert!(
-                coin::is_balance_at_least<AptosCoin>(gas_payer, max_transaction_fee),
+                coin::is_balance_at_least<AptosCoin>(gas_payer_address, max_transaction_fee),
                 error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT)
             );
         }
@@ -404,13 +426,12 @@ Only called during genesis to initialize system resources for this module.
     chain_id: u8,
     _script_hash: vector<u8>,
 ) {
-    let gas_payer = signer::address_of(&sender);
     // prologue_common with is_simulation set to false behaves identically to the original script_prologue function.
     prologue_common(
-        sender,
-        gas_payer,
+        &sender,
+        &sender,
         txn_sequence_number,
-        txn_public_key,
+        option::some(txn_public_key),
         txn_gas_price,
         txn_max_gas_units,
         txn_expiration_time,
@@ -450,12 +471,11 @@ Only called during genesis to initialize system resources for this module.
     _script_hash: vector<u8>,
     is_simulation: bool,
 ) {
-    let gas_payer = signer::address_of(&sender);
     prologue_common(
-        sender,
-        gas_payer,
+        &sender,
+        &sender,
         txn_sequence_number,
-        txn_public_key,
+        option::some(txn_public_key),
         txn_gas_price,
         txn_max_gas_units,
         txn_expiration_time,
@@ -495,21 +515,24 @@ Only called during genesis to initialize system resources for this module.
     txn_expiration_time: u64,
     chain_id: u8,
 ) {
-    let sender_addr = signer::address_of(&sender);
     // prologue_common and multi_agent_common_prologue with is_simulation set to false behaves identically to the
     // original multi_agent_script_prologue function.
     prologue_common(
-        sender,
-        sender_addr,
+        &sender,
+        &sender,
         txn_sequence_number,
-        txn_sender_public_key,
+        option::some(txn_sender_public_key),
         txn_gas_price,
         txn_max_gas_units,
         txn_expiration_time,
         chain_id,
         false,
     );
-    multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, false);
+    multi_agent_common_prologue(
+        secondary_signer_addresses,
+        vector::map(secondary_signer_public_key_hashes, |x| option::some(x)),
+        false
+    );
 }
 
@@ -544,19 +567,22 @@ Only called during genesis to initialize system resources for this module. chain_id: u8, is_simulation: bool, ) { - let sender_addr = signer::address_of(&sender); prologue_common( - sender, - sender_addr, + &sender, + &sender, txn_sequence_number, - txn_sender_public_key, + option::some(txn_sender_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, chain_id, is_simulation, ); - multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation); + multi_agent_common_prologue( + secondary_signer_addresses, + vector::map(secondary_signer_public_key_hashes, |x| option::some(x)), + is_simulation + ); }
@@ -570,7 +596,7 @@ Only called during genesis to initialize system resources for this module. -
fun multi_agent_common_prologue(secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<vector<u8>>, is_simulation: bool)
+
fun multi_agent_common_prologue(secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, is_simulation: bool)
 
@@ -581,7 +607,7 @@ Only called during genesis to initialize system resources for this module.
fun multi_agent_common_prologue(
     secondary_signer_addresses: vector<address>,
-    secondary_signer_public_key_hashes: vector<vector<u8>>,
+    secondary_signer_public_key_hashes: vector<Option<vector<u8>>>,
     is_simulation: bool,
 ) {
     let num_secondary_signers = vector::length(&secondary_signer_addresses);
@@ -592,27 +618,53 @@ Only called during genesis to initialize system resources for this module.
 
     let i = 0;
     while ({
-        spec {
-            invariant i <= num_secondary_signers;
-            invariant forall j in 0..i:
-                account::exists_at(secondary_signer_addresses[j]);
-            invariant forall j in 0..i:
-                secondary_signer_public_key_hashes[j] == account::get_authentication_key(secondary_signer_addresses[j]) ||
-                    (features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(secondary_signer_public_key_hashes[j]));
-        };
+        // spec {
+        //     invariant i <= num_secondary_signers;
+        //     invariant forall j in 0..i:
+        //         account::exists_at(secondary_signer_addresses[j]);
+        //     invariant forall j in 0..i:
+        //         secondary_signer_public_key_hashes[j] == account::get_authentication_key(secondary_signer_addresses[j]) ||
+        //             (features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(secondary_signer_public_key_hashes[j]));
+        //         account::account_resource_exists_at(secondary_signer_addresses[j])
+        //         && secondary_signer_public_key_hashes[j]
+        //             == account::get_authentication_key(secondary_signer_addresses[j])
+        //             || features::account_abstraction_enabled() && account_abstraction::using_native_authenticator(
+        //             secondary_signer_addresses[j]
+        //         ) && option::spec_some(secondary_signer_public_key_hashes[j]) == account_abstraction::native_authenticator(
+        //         account::exists_at(secondary_signer_addresses[j])
+        //         && secondary_signer_public_key_hashes[j]
+        //             == account::spec_get_authentication_key(secondary_signer_addresses[j])
+        //             || features::spec_account_abstraction_enabled() && account_abstraction::using_native_authenticator(
+        //             secondary_signer_addresses[j]
+        //         ) && option::spec_some(
+        //             secondary_signer_public_key_hashes[j]
+        //         ) == account_abstraction::spec_native_authenticator(
+        //             secondary_signer_addresses[j]
+        //         );
+        // };
         (i < num_secondary_signers)
     }) {
         let secondary_address = *vector::borrow(&secondary_signer_addresses, i);
         assert!(account::exists_at(secondary_address), error::invalid_argument(PROLOGUE_EACCOUNT_DOES_NOT_EXIST));
-
         let signer_public_key_hash = *vector::borrow(&secondary_signer_public_key_hashes, i);
         if (!features::transaction_simulation_enhancement_enabled() ||
-                !skip_auth_key_check(is_simulation, &signer_public_key_hash)) {
-            assert!(
-                signer_public_key_hash == account::get_authentication_key(secondary_address),
-                error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
-            )
+            !skip_auth_key_check(is_simulation, &signer_public_key_hash)) {
+            if (option::is_some(&signer_public_key_hash)) {
+                assert!(
+                    signer_public_key_hash == option::some(account::get_authentication_key(secondary_address)),
+                    error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+                );
+            } else {
+                assert!(
+                    features::is_account_abstraction_enabled(
+                    ) && account_abstraction::using_dispatchable_authenticator(
+                        secondary_address
+                    ),
+                    error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+                )
+            };
         };
+
         i = i + 1;
     }
 }
@@ -654,17 +706,21 @@ Only called during genesis to initialize system resources for this module.
     // prologue_common and multi_agent_common_prologue with is_simulation set to false behaves identically to the
     // original fee_payer_script_prologue function.
     prologue_common(
-        sender,
-        fee_payer_address,
+        &sender,
+        &create_signer::create_signer(fee_payer_address),
         txn_sequence_number,
-        txn_sender_public_key,
+        option::some(txn_sender_public_key),
         txn_gas_price,
         txn_max_gas_units,
         txn_expiration_time,
         chain_id,
         false,
     );
-    multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, false);
+    multi_agent_common_prologue(
+        secondary_signer_addresses,
+        vector::map(secondary_signer_public_key_hashes, |x| option::some(x)),
+        false
+    );
     assert!(
         fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address),
         error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
@@ -707,24 +763,25 @@ Only called during genesis to initialize system resources for this module.
 ) {
     assert!(features::fee_payer_enabled(), error::invalid_state(PROLOGUE_EFEE_PAYER_NOT_ENABLED));
     prologue_common(
-        sender,
-        fee_payer_address,
+        &sender,
+        &create_signer::create_signer(fee_payer_address),
         txn_sequence_number,
-        txn_sender_public_key,
+        option::some(txn_sender_public_key),
         txn_gas_price,
         txn_max_gas_units,
         txn_expiration_time,
         chain_id,
         is_simulation,
     );
-    multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation);
-    if (!features::transaction_simulation_enhancement_enabled() ||
-        !skip_auth_key_check(is_simulation, &fee_payer_public_key_hash)) {
-        assert!(
-            fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address),
-            error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
-        )
-    }
+    multi_agent_common_prologue(
+        secondary_signer_addresses,
+        vector::map(secondary_signer_public_key_hashes, |x| option::some(x)),
+        is_simulation
+    );
+    assert!(
+        fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address),
+        error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY),
+    )
 }
 
@@ -757,7 +814,14 @@ Called by the Adapter gas_units_remaining: u64, ) { let addr = signer::address_of(&account); - epilogue_gas_payer(account, addr, storage_fee_refunded, txn_gas_price, txn_max_gas_units, gas_units_remaining); + epilogue_gas_payer( + account, + addr, + storage_fee_refunded, + txn_gas_price, + txn_max_gas_units, + gas_units_remaining + ); }
@@ -789,7 +853,15 @@ Called by the Adapter is_simulation: bool, ) { let addr = signer::address_of(&account); - epilogue_gas_payer_extended(account, addr, storage_fee_refunded, txn_gas_price, txn_max_gas_units, gas_units_remaining, is_simulation); + epilogue_gas_payer_extended( + account, + addr, + storage_fee_refunded, + txn_gas_price, + txn_max_gas_units, + gas_units_remaining, + is_simulation + ); }
@@ -820,7 +892,7 @@ Called by the Adapter storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, - gas_units_remaining: u64, + gas_units_remaining: u64 ) { // epilogue_gas_payer_extended with is_simulation set to false behaves identically to the original // epilogue_gas_payer function. @@ -913,7 +985,7 @@ Called by the Adapter -
fun skip_auth_key_check(is_simulation: bool, auth_key: &vector<u8>): bool
+
fun skip_auth_key_check(is_simulation: bool, auth_key: &option::Option<vector<u8>>): bool
 
@@ -922,8 +994,8 @@ Called by the Adapter Implementation -
inline fun skip_auth_key_check(is_simulation: bool, auth_key: &vector<u8>): bool {
-    is_simulation && vector::is_empty(auth_key)
+
inline fun skip_auth_key_check(is_simulation: bool, auth_key: &Option<vector<u8>>): bool {
+    is_simulation && (option::is_none(auth_key) || vector::is_empty(option::borrow(auth_key)))
 }
 
@@ -953,6 +1025,190 @@ Called by the Adapter + + + + +## Function `unified_prologue` + +new set of functions + + +
fun unified_prologue(sender: signer, txn_sender_public_key: option::Option<vector<u8>>, txn_sequence_number: u64, secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
+ + + +
+Implementation + + +
fun unified_prologue(
+    sender: signer,
+    txn_sender_public_key: Option<vector<u8>>,
+    txn_sequence_number: u64,
+    secondary_signer_addresses: vector<address>,
+    secondary_signer_public_key_hashes: vector<Option<vector<u8>>>,
+    txn_gas_price: u64,
+    txn_max_gas_units: u64,
+    txn_expiration_time: u64,
+    chain_id: u8,
+    is_simulation: bool,
+) {
+    prologue_common(
+        &sender,
+        &sender,
+        txn_sequence_number,
+        txn_sender_public_key,
+        txn_gas_price,
+        txn_max_gas_units,
+        txn_expiration_time,
+        chain_id,
+        is_simulation,
+    );
+    multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation);
+}
+
+ + + +
+ + + +## Function `unified_prologue_fee_payer` + +If there is no fee_payer, fee_payer = sender + + +
fun unified_prologue_fee_payer(sender: signer, fee_payer: signer, txn_sender_public_key: option::Option<vector<u8>>, fee_payer_public_key_hash: option::Option<vector<u8>>, txn_sequence_number: u64, secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
+ + + +
+Implementation + + +
fun unified_prologue_fee_payer(
+    sender: signer,
+    fee_payer: signer,
+    txn_sender_public_key: Option<vector<u8>>,
+    fee_payer_public_key_hash: Option<vector<u8>>,
+    txn_sequence_number: u64,
+    secondary_signer_addresses: vector<address>,
+    secondary_signer_public_key_hashes: vector<Option<vector<u8>>>,
+    txn_gas_price: u64,
+    txn_max_gas_units: u64,
+    txn_expiration_time: u64,
+    chain_id: u8,
+    is_simulation: bool,
+) {
+    prologue_common(
+        &sender,
+        &fee_payer,
+        txn_sequence_number,
+        txn_sender_public_key,
+        txn_gas_price,
+        txn_max_gas_units,
+        txn_expiration_time,
+        chain_id,
+        is_simulation,
+    );
+    multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation);
+    if (!features::transaction_simulation_enhancement_enabled() ||
+        !skip_auth_key_check(is_simulation, &fee_payer_public_key_hash)) {
+        let fee_payer_address = signer::address_of(&fee_payer);
+        if (option::is_some(&fee_payer_public_key_hash)) {
+            assert!(
+                fee_payer_public_key_hash == option::some(account::get_authentication_key(fee_payer_address)),
+                error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+            );
+        } else {
+            assert!(
+                features::is_account_abstraction_enabled() && account_abstraction::using_dispatchable_authenticator(
+                    fee_payer_address
+                ),
+                error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY)
+            )
+        };
+    }
+}
+
+ + + +
+ + + +## Function `unified_epilogue` + + + +
fun unified_epilogue(account: signer, gas_payer: signer, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64, is_simulation: bool)
+
+ + + +
+Implementation + + +
fun unified_epilogue(
+    account: signer,
+    gas_payer: signer,
+    storage_fee_refunded: u64,
+    txn_gas_price: u64,
+    txn_max_gas_units: u64,
+    gas_units_remaining: u64,
+    is_simulation: bool,
+) {
+    assert!(txn_max_gas_units >= gas_units_remaining, error::invalid_argument(EOUT_OF_GAS));
+    let gas_used = txn_max_gas_units - gas_units_remaining;
+
+    assert!(
+        (txn_gas_price as u128) * (gas_used as u128) <= MAX_U64,
+        error::out_of_range(EOUT_OF_GAS)
+    );
+    let transaction_fee_amount = txn_gas_price * gas_used;
+
+    let gas_payer_address = signer::address_of(&gas_payer);
+    // it's important to maintain the error code consistent with vm
+    // to do failed transaction cleanup.
+    if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment(
+        is_simulation,
+        gas_payer_address
+    )) {
+        if (features::operations_default_to_fa_apt_store_enabled()) {
+            assert!(
+                aptos_account::is_fungible_balance_at_least(gas_payer_address, transaction_fee_amount),
+                error::out_of_range(PROLOGUE_ECANT_PAY_GAS_DEPOSIT),
+            );
+        } else {
+            assert!(
+                coin::is_balance_at_least<AptosCoin>(gas_payer_address, transaction_fee_amount),
+                error::out_of_range(PROLOGUE_ECANT_PAY_GAS_DEPOSIT),
+            );
+        };
+
+        if (transaction_fee_amount > storage_fee_refunded) {
+            let burn_amount = transaction_fee_amount - storage_fee_refunded;
+            transaction_fee::burn_fee(gas_payer_address, burn_amount);
+        } else if (transaction_fee_amount < storage_fee_refunded) {
+            let mint_amount = storage_fee_refunded - transaction_fee_amount;
+            transaction_fee::mint_and_refund(gas_payer_address, mint_amount)
+        };
+    };
+
+    // Increment sequence number
+    let addr = signer::address_of(&account);
+    account::increment_sequence_number(addr);
+}
+
+ + +
@@ -1039,10 +1295,10 @@ Give some constraints that may abort according to the conditions.
schema PrologueCommonAbortsIf {
-    sender: signer;
-    gas_payer: address;
+    sender: &signer;
+    gas_payer: &signer;
     txn_sequence_number: u64;
-    txn_authentication_key: vector<u8>;
+    txn_authentication_key: Option<vector<u8>>;
     txn_gas_price: u64;
     txn_max_gas_units: u64;
     txn_expiration_time: u64;
@@ -1052,28 +1308,33 @@ Give some constraints that may abort according to the conditions.
     aborts_if !exists<ChainId>(@aptos_framework);
     aborts_if !(chain_id::get() == chain_id);
     let transaction_sender = signer::address_of(sender);
+    let gas_payer_addr = signer::address_of(gas_payer);
     aborts_if (
         !features::spec_is_enabled(features::SPONSORED_AUTOMATIC_ACCOUNT_CREATION)
             || account::exists_at(transaction_sender)
-            || transaction_sender == gas_payer
+            || transaction_sender == gas_payer_addr
             || txn_sequence_number > 0
     ) && (
         !(txn_sequence_number >= global<Account>(transaction_sender).sequence_number)
-            || !(txn_authentication_key == global<Account>(transaction_sender).authentication_key)
+            || !(option::spec_is_none(txn_authentication_key) || option::spec_borrow(
+            txn_authentication_key
+        ) == global<Account>(transaction_sender).authentication_key)
             || !account::exists_at(transaction_sender)
             || !(txn_sequence_number == global<Account>(transaction_sender).sequence_number)
     );
     aborts_if features::spec_is_enabled(features::SPONSORED_AUTOMATIC_ACCOUNT_CREATION)
-        && transaction_sender != gas_payer
+        && transaction_sender != gas_payer_addr
         && txn_sequence_number == 0
         && !account::exists_at(transaction_sender)
-        && txn_authentication_key != bcs::to_bytes(transaction_sender);
+        && (option::spec_is_none(txn_authentication_key) || option::spec_borrow(
+        txn_authentication_key
+    ) != bcs::to_bytes(transaction_sender));
     aborts_if !(txn_sequence_number < (1u64 << 63));
     let max_transaction_fee = txn_gas_price * txn_max_gas_units;
     aborts_if max_transaction_fee > MAX_U64;
-    aborts_if !exists<CoinStore<AptosCoin>>(gas_payer);
+    aborts_if !exists<CoinStore<AptosCoin>>(gas_payer_addr);
     // This enforces high-level requirement 1:
-    aborts_if !(global<CoinStore<AptosCoin>>(gas_payer).coin.value >= max_transaction_fee);
+    aborts_if !(global<CoinStore<AptosCoin>>(gas_payer_addr).coin.value >= max_transaction_fee);
 }
 
@@ -1084,7 +1345,7 @@ Give some constraints that may abort according to the conditions. ### Function `prologue_common` -
fun prologue_common(sender: signer, gas_payer: address, txn_sequence_number: u64, txn_authentication_key: vector<u8>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
fun prologue_common(sender: &signer, gas_payer: &signer, txn_sequence_number: u64, txn_authentication_key: option::Option<vector<u8>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
 
@@ -1118,7 +1379,7 @@ Give some constraints that may abort according to the conditions.
schema MultiAgentPrologueCommonAbortsIf {
     secondary_signer_addresses: vector<address>;
-    secondary_signer_public_key_hashes: vector<vector<u8>>;
+    secondary_signer_public_key_hashes: vector<Option<vector<u8>>>;
     is_simulation: bool;
     let num_secondary_signers = len(secondary_signer_addresses);
     aborts_if len(secondary_signer_public_key_hashes) != num_secondary_signers;
@@ -1127,12 +1388,17 @@ Give some constraints that may abort according to the conditions.
         !account::exists_at(secondary_signer_addresses[i]);
     aborts_if exists i in 0..num_secondary_signers:
         !can_skip(features::spec_simulation_enhancement_enabled(), is_simulation, secondary_signer_public_key_hashes[i]) &&
-            secondary_signer_public_key_hashes[i] !=
+            option::spec_is_some(secondary_signer_public_key_hashes[i]) && option::spec_borrow(
+            secondary_signer_public_key_hashes[i]
+        ) !=
                 account::get_authentication_key(secondary_signer_addresses[i]);
     ensures forall i in 0..num_secondary_signers:
         account::exists_at(secondary_signer_addresses[i]);
     ensures forall i in 0..num_secondary_signers:
-        secondary_signer_public_key_hashes[i] == account::get_authentication_key(secondary_signer_addresses[i])
+        option::spec_is_none(secondary_signer_public_key_hashes[i]) || option::spec_borrow(
+            secondary_signer_public_key_hashes[i]
+        ) ==
+            account::get_authentication_key(secondary_signer_addresses[i])
             || can_skip(features::spec_simulation_enhancement_enabled(), is_simulation, secondary_signer_public_key_hashes[i]);
 }
 
@@ -1143,8 +1409,8 @@ Give some constraints that may abort according to the conditions. -
fun can_skip(feature_flag: bool, is_simulation: bool, auth_key: vector<u8>): bool {
-   features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(auth_key)
+
fun can_skip(feature_flag: bool, is_simulation: bool, auth_key: Option<vector<u8>>): bool {
+   features::spec_simulation_enhancement_enabled() && is_simulation && option::spec_is_none(auth_key)
 }
 
@@ -1163,8 +1429,8 @@ Give some constraints that may abort according to the conditions.
pragma verify = false;
 include PrologueCommonAbortsIf {
-    gas_payer: signer::address_of(sender),
-    txn_authentication_key: txn_public_key
+    gas_payer: sender,
+    txn_authentication_key: option::spec_some(txn_public_key)
 };
 
@@ -1200,18 +1466,8 @@ not equal the number of singers.
pragma verify_duration_estimate = 120;
-let gas_payer = signer::address_of(sender);
+let gas_payer = sender;
 pragma verify = false;
-include PrologueCommonAbortsIf {
-    gas_payer,
-    txn_sequence_number,
-    txn_authentication_key: txn_sender_public_key,
-};
-include MultiAgentPrologueCommonAbortsIf {
-    secondary_signer_addresses,
-    secondary_signer_public_key_hashes,
-    is_simulation,
-};
 
@@ -1221,17 +1477,13 @@ not equal the number of singers. ### Function `multi_agent_common_prologue` -
fun multi_agent_common_prologue(secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<vector<u8>>, is_simulation: bool)
+
fun multi_agent_common_prologue(secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, is_simulation: bool)
 
-
include MultiAgentPrologueCommonAbortsIf {
-    secondary_signer_addresses,
-    secondary_signer_public_key_hashes,
-    is_simulation,
-};
+
pragma aborts_if_is_partial;
 
@@ -1263,21 +1515,17 @@ not equal the number of singers. -
pragma verify_duration_estimate = 120;
+
pragma aborts_if_is_partial;
+pragma verify_duration_estimate = 120;
 aborts_if !features::spec_is_enabled(features::FEE_PAYER_ENABLED);
-let gas_payer = fee_payer_address;
+let gas_payer = create_signer::create_signer(fee_payer_address);
 include PrologueCommonAbortsIf {
     gas_payer,
     txn_sequence_number,
-    txn_authentication_key: txn_sender_public_key,
+    txn_authentication_key: option::spec_some(txn_sender_public_key),
 };
-include MultiAgentPrologueCommonAbortsIf {
-    secondary_signer_addresses,
-    secondary_signer_public_key_hashes,
-    is_simulation,
-};
-aborts_if !account::exists_at(gas_payer);
-aborts_if !(fee_payer_public_key_hash == account::get_authentication_key(gas_payer));
+aborts_if !account::exists_at(fee_payer_address);
+aborts_if !(fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address));
 aborts_if !features::spec_fee_payer_enabled();
 
@@ -1330,6 +1578,74 @@ Skip transaction_fee::burn_fee verification. +
pragma verify = false;
+
+ + + + + +### Function `epilogue_gas_payer_extended` + + +
fun epilogue_gas_payer_extended(account: signer, gas_payer: address, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64, is_simulation: bool)
+
+ + +Abort according to the conditions. +AptosCoinCapabilities and CoinInfo should exist. +Skip transaction_fee::burn_fee verification. + + +
pragma verify = false;
+include EpilogueGasPayerAbortsIf;
+
+ + + + + +### Function `unified_prologue` + + +
fun unified_prologue(sender: signer, txn_sender_public_key: option::Option<vector<u8>>, txn_sequence_number: u64, secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `unified_prologue_fee_payer` + + +
fun unified_prologue_fee_payer(sender: signer, fee_payer: signer, txn_sender_public_key: option::Option<vector<u8>>, fee_payer_public_key_hash: option::Option<vector<u8>>, txn_sequence_number: u64, secondary_signer_addresses: vector<address>, secondary_signer_public_key_hashes: vector<option::Option<vector<u8>>>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, chain_id: u8, is_simulation: bool)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `unified_epilogue` + + +
fun unified_epilogue(account: signer, gas_payer: signer, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64, is_simulation: bool)
+
+ + + +
pragma verify = false;
 
@@ -1384,24 +1700,4 @@ Skip transaction_fee::burn_fee verification.
- - - -### Function `epilogue_gas_payer_extended` - - -
fun epilogue_gas_payer_extended(account: signer, gas_payer: address, storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, gas_units_remaining: u64, is_simulation: bool)
-
- - -Abort according to the conditions. -AptosCoinCapabilities and CoinInfo should exist. -Skip transaction_fee::burn_fee verification. - - -
pragma verify = false;
-include EpilogueGasPayerAbortsIf;
-
- - [move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-framework/sources/account.move b/aptos-move/framework/aptos-framework/sources/account/account.move similarity index 100% rename from aptos-move/framework/aptos-framework/sources/account.move rename to aptos-move/framework/aptos-framework/sources/account/account.move diff --git a/aptos-move/framework/aptos-framework/sources/account.spec.move b/aptos-move/framework/aptos-framework/sources/account/account.spec.move similarity index 100% rename from aptos-move/framework/aptos-framework/sources/account.spec.move rename to aptos-move/framework/aptos-framework/sources/account/account.spec.move diff --git a/aptos-move/framework/aptos-framework/sources/account/account_abstraction.move b/aptos-move/framework/aptos-framework/sources/account/account_abstraction.move new file mode 100644 index 0000000000000..176ca42ca19c2 --- /dev/null +++ b/aptos-move/framework/aptos-framework/sources/account/account_abstraction.move @@ -0,0 +1,203 @@ +module aptos_framework::account_abstraction { + use std::error; + use std::option::{Self, Option}; + use std::signer; + use std::string::{Self, String}; + use aptos_std::ordered_map::{Self, OrderedMap}; + use aptos_framework::create_signer; + use aptos_framework::event; + use aptos_framework::function_info::{Self, FunctionInfo}; + use aptos_framework::object; + use aptos_framework::auth_data::AbstractionAuthData; + use aptos_framework::permissioned_signer::is_permissioned_signer; + #[test_only] + use aptos_framework::account::create_account_for_test; + + friend aptos_framework::transaction_validation; + #[test_only] + friend aptos_framework::account_abstraction_tests; + + const EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED: u64 = 1; + const EFUNCTION_INFO_EXISTENCE: u64 = 2; + const EAUTH_FUNCTION_SIGNATURE_MISMATCH: u64 = 3; + const ENOT_MASTER_SIGNER: u64 = 4; + + const MAX_U64: u128 = 18446744073709551615; + + #[event] + struct UpdateDispatchableAuthenticator has store, drop { + account: address, + update: vector, + auth_function: FunctionInfo, + } + + #[event] + struct RemoveDispatchableAuthenticator has store, drop { + account: address, + } + + #[resource_group_member(group = aptos_framework::object::ObjectGroup)] + /// The dispatchable authenticator that defines how to authenticates this account in the specified module. + /// An integral part of Account Abstraction. + enum DispatchableAuthenticator has key, copy, drop { + V1 { auth_functions: OrderedMap } + } + + /// Update dispatchable authenticator that enables account abstraction. + /// Note: it is a private entry function that can only be called directly from transaction. + public entry fun add_dispatchable_authentication_function( + account: &signer, + module_address: address, + module_name: String, + function_name: String, + ) acquires DispatchableAuthenticator { + assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER)); + update_dispatchable_authenticator_impl( + account, + function_info::new_function_info_from_address(module_address, module_name, function_name), + true + ); + } + + public entry fun remove_dispatchable_authentication_function( + account: &signer, + module_address: address, + module_name: String, + function_name: String, + ) acquires DispatchableAuthenticator { + assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER)); + update_dispatchable_authenticator_impl( + account, + function_info::new_function_info_from_address(module_address, module_name, function_name), + false + ); + } + + /// Update dispatchable authenticator that disables account abstraction. + /// Note: it is a private entry function that can only be called directly from transaction. + public entry fun remove_dispatchable_authenticator( + account: &signer, + ) acquires DispatchableAuthenticator { + assert!(!is_permissioned_signer(account), error::permission_denied(ENOT_MASTER_SIGNER)); + let addr = signer::address_of(account); + let resource_addr = resource_addr(addr); + if (exists(resource_addr)) { + move_from(resource_addr); + event::emit(RemoveDispatchableAuthenticator { + account: addr, + }); + }; + } + + inline fun resource_addr(source: address): address { + object::create_user_derived_object_address(source, @aptos_fungible_asset) + } + + fun update_dispatchable_authenticator_impl( + account: &signer, + auth_function: FunctionInfo, + is_add: bool, + ) acquires DispatchableAuthenticator { + let addr = signer::address_of(account); + let resource_addr = resource_addr(addr); + let dispatcher_auth_function_info = function_info::new_function_info_from_address( + @aptos_framework, + string::utf8(b"account_abstraction"), + string::utf8(b"dispatchable_authenticate"), + ); + assert!( + function_info::check_dispatch_type_compatibility(&dispatcher_auth_function_info, &auth_function), + error::invalid_argument(EAUTH_FUNCTION_SIGNATURE_MISMATCH) + ); + if (is_add && !exists(resource_addr)) { + move_to( + &create_signer::create_signer(resource_addr), + DispatchableAuthenticator::V1 { auth_functions: ordered_map::new() } + ); + }; + if (exists(resource_addr)) { + let current_map = &mut borrow_global_mut(resource_addr).auth_functions; + if (is_add) { + assert!( + !ordered_map::contains(current_map, &auth_function), + error::already_exists(EFUNCTION_INFO_EXISTENCE) + ); + ordered_map::add(current_map, auth_function, true); + } else { + assert!( + ordered_map::contains(current_map, &auth_function), + error::not_found(EFUNCTION_INFO_EXISTENCE) + ); + ordered_map::remove(current_map, &auth_function); + }; + event::emit( + UpdateDispatchableAuthenticator { + account: addr, + update: if (is_add) { b"add" } else { b"remove" }, + auth_function, + } + ); + if (ordered_map::length(current_map) == 0) { + remove_dispatchable_authenticator(account); + } + }; + } + + #[view] + /// Return `true` if the account is an abstracted account that can be authenticated with dispatchable move authenticator. + public fun using_dispatchable_authenticator(addr: address): bool { + exists(resource_addr(addr)) + } + + #[view] + /// Return the current dispatchable authenticator move function info. `None` means this authentication scheme is disabled. + public fun dispatchable_authenticator(addr: address): Option> acquires DispatchableAuthenticator { + let resource_addr = resource_addr(addr); + if (exists(resource_addr)) { + option::some( + ordered_map::keys(&borrow_global(resource_addr).auth_functions) + ) + } else { option::none() } + } + + inline fun dispatchable_authenticator_internal(addr: address): &OrderedMap { + assert!(using_dispatchable_authenticator(addr), error::not_found(EDISPATCHABLE_AUTHENTICATOR_IS_NOT_USED)); + &borrow_global(resource_addr(addr)).auth_functions + } + + fun authenticate( + account: signer, + func_info: FunctionInfo, + signing_data: AbstractionAuthData, + ): signer acquires DispatchableAuthenticator { + let func_infos = dispatchable_authenticator_internal(signer::address_of(&account)); + assert!(ordered_map::contains(func_infos, &func_info), error::not_found(EFUNCTION_INFO_EXISTENCE)); + function_info::load_module_from_function(&func_info); + dispatchable_authenticate(account, signing_data, &func_info) + } + + /// The native function to dispatch customized move authentication function. + native fun dispatchable_authenticate( + account: signer, + signing_data: AbstractionAuthData, + function: &FunctionInfo + ): signer; + + #[test(bob = @0xb0b)] + entry fun test_dispatchable_authenticator( + bob: &signer, + ) acquires DispatchableAuthenticator { + let bob_addr = signer::address_of(bob); + create_account_for_test(bob_addr); + assert!(!using_dispatchable_authenticator(bob_addr), 0); + add_dispatchable_authentication_function( + bob, + @aptos_framework, + string::utf8(b"account_abstraction_tests"), + string::utf8(b"test_auth") + ); + assert!(using_dispatchable_authenticator(bob_addr), 0); + remove_dispatchable_authenticator(bob); + assert!(!using_dispatchable_authenticator(bob_addr), 0); + } +} diff --git a/aptos-move/framework/aptos-framework/sources/account/account_abstraction.spec.move b/aptos-move/framework/aptos-framework/sources/account/account_abstraction.spec.move new file mode 100644 index 0000000000000..00163529aa71e --- /dev/null +++ b/aptos-move/framework/aptos-framework/sources/account/account_abstraction.spec.move @@ -0,0 +1,17 @@ +spec aptos_framework::account_abstraction { + spec module { + pragma verify = false; + } + + + spec fun spec_dispatchable_authenticate( + account: signer, + signing_data: AbstractionAuthData, + function: &FunctionInfo + ): signer; + + spec dispatchable_authenticate(account: signer, signing_data: AbstractionAuthData, function: &FunctionInfo): signer { + pragma opaque; + ensures [abstract] result == spec_dispatchable_authenticate(account, signing_data, function); + } +} diff --git a/aptos-move/framework/aptos-framework/sources/account/auth_data.move b/aptos-move/framework/aptos-framework/sources/account/auth_data.move new file mode 100644 index 0000000000000..7d1eed70a2602 --- /dev/null +++ b/aptos-move/framework/aptos-framework/sources/account/auth_data.move @@ -0,0 +1,18 @@ +module aptos_framework::auth_data { + enum AbstractionAuthData has copy, drop { + V1 { digest: vector, authenticator: vector }, + } + + #[test_only] + public fun create_auth_data(digest: vector, authenticator: vector): AbstractionAuthData { + AbstractionAuthData::V1 { digest, authenticator } + } + + public fun digest(signing_data: &AbstractionAuthData): &vector { + &signing_data.digest + } + + public fun authenticator(signing_data: &AbstractionAuthData): &vector { + &signing_data.authenticator + } +} diff --git a/aptos-move/framework/aptos-framework/sources/create_signer.move b/aptos-move/framework/aptos-framework/sources/create_signer.move index a92dd88845568..8bea49055b469 100644 --- a/aptos-move/framework/aptos-framework/sources/create_signer.move +++ b/aptos-move/framework/aptos-framework/sources/create_signer.move @@ -14,9 +14,11 @@ module aptos_framework::create_signer { friend aptos_framework::coin; friend aptos_framework::fungible_asset; friend aptos_framework::genesis; + friend aptos_framework::account_abstraction; friend aptos_framework::multisig_account; friend aptos_framework::object; friend aptos_framework::permissioned_signer; + friend aptos_framework::transaction_validation; public(friend) native fun create_signer(addr: address): signer; } diff --git a/aptos-move/framework/aptos-framework/sources/function_info.move b/aptos-move/framework/aptos-framework/sources/function_info.move index 112a1c33b5903..6466c15d45a58 100644 --- a/aptos-move/framework/aptos-framework/sources/function_info.move +++ b/aptos-move/framework/aptos-framework/sources/function_info.move @@ -7,6 +7,7 @@ module aptos_framework::function_info { friend aptos_framework::fungible_asset; friend aptos_framework::dispatchable_fungible_asset; + friend aptos_framework::account_abstraction; /// String is not a valid Move identifier const EINVALID_IDENTIFIER: u64 = 1; diff --git a/aptos-move/framework/aptos-framework/sources/transaction_validation.move b/aptos-move/framework/aptos-framework/sources/transaction_validation.move index f9821da0b5486..c70a191e1784f 100644 --- a/aptos-move/framework/aptos-framework/sources/transaction_validation.move +++ b/aptos-move/framework/aptos-framework/sources/transaction_validation.move @@ -2,14 +2,18 @@ module aptos_framework::transaction_validation { use std::bcs; use std::error; use std::features; + use std::option; + use std::option::Option; use std::signer; use std::vector; use aptos_framework::account; use aptos_framework::aptos_account; + use aptos_framework::account_abstraction; use aptos_framework::aptos_coin::AptosCoin; use aptos_framework::chain_id; use aptos_framework::coin; + use aptos_framework::create_signer; use aptos_framework::system_addresses; use aptos_framework::timestamp; use aptos_framework::transaction_fee; @@ -71,10 +75,10 @@ module aptos_framework::transaction_validation { } fun prologue_common( - sender: signer, - gas_payer: address, + sender: &signer, + gas_payer: &signer, txn_sequence_number: u64, - txn_authentication_key: vector, + txn_authentication_key: Option>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, @@ -87,23 +91,33 @@ module aptos_framework::transaction_validation { ); assert!(chain_id::get() == chain_id, error::invalid_argument(PROLOGUE_EBAD_CHAIN_ID)); - let transaction_sender = signer::address_of(&sender); + let transaction_sender = signer::address_of(sender); + let gas_payer_address = signer::address_of(gas_payer); if ( - transaction_sender == gas_payer + transaction_sender == gas_payer_address || account::exists_at(transaction_sender) || !features::sponsored_automatic_account_creation_enabled() || txn_sequence_number > 0 ) { assert!(account::exists_at(transaction_sender), error::invalid_argument(PROLOGUE_EACCOUNT_DOES_NOT_EXIST)); if (!features::transaction_simulation_enhancement_enabled() || - !skip_auth_key_check(is_simulation, &txn_authentication_key)) { - assert!( - txn_authentication_key == account::get_authentication_key(transaction_sender), - error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), - ) + !skip_auth_key_check(is_simulation, &txn_authentication_key)) { + if (option::is_some(&txn_authentication_key)) { + assert!( + txn_authentication_key == option::some(account::get_authentication_key(transaction_sender)), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ); + } else { + assert!( + features::is_account_abstraction_enabled( + ) && account_abstraction::using_dispatchable_authenticator( + transaction_sender + ), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ) + }; }; - let account_sequence_number = account::get_sequence_number(transaction_sender); assert!( txn_sequence_number < (1u64 << 63), @@ -130,7 +144,7 @@ module aptos_framework::transaction_validation { if (!features::transaction_simulation_enhancement_enabled() || !skip_auth_key_check(is_simulation, &txn_authentication_key)) { assert!( - txn_authentication_key == bcs::to_bytes(&transaction_sender), + txn_authentication_key == option::some(bcs::to_bytes(&transaction_sender)), error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), ); } @@ -138,15 +152,18 @@ module aptos_framework::transaction_validation { let max_transaction_fee = txn_gas_price * txn_max_gas_units; - if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment(is_simulation, gas_payer)) { + if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment( + is_simulation, + gas_payer_address + )) { if (features::operations_default_to_fa_apt_store_enabled()) { assert!( - aptos_account::is_fungible_balance_at_least(gas_payer, max_transaction_fee), + aptos_account::is_fungible_balance_at_least(gas_payer_address, max_transaction_fee), error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT) ); } else { assert!( - coin::is_balance_at_least(gas_payer, max_transaction_fee), + coin::is_balance_at_least(gas_payer_address, max_transaction_fee), error::invalid_argument(PROLOGUE_ECANT_PAY_GAS_DEPOSIT) ); } @@ -163,13 +180,12 @@ module aptos_framework::transaction_validation { chain_id: u8, _script_hash: vector, ) { - let gas_payer = signer::address_of(&sender); // prologue_common with is_simulation set to false behaves identically to the original script_prologue function. prologue_common( - sender, - gas_payer, + &sender, + &sender, txn_sequence_number, - txn_public_key, + option::some(txn_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, @@ -192,12 +208,11 @@ module aptos_framework::transaction_validation { _script_hash: vector, is_simulation: bool, ) { - let gas_payer = signer::address_of(&sender); prologue_common( - sender, - gas_payer, + &sender, + &sender, txn_sequence_number, - txn_public_key, + option::some(txn_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, @@ -217,21 +232,24 @@ module aptos_framework::transaction_validation { txn_expiration_time: u64, chain_id: u8, ) { - let sender_addr = signer::address_of(&sender); // prologue_common and multi_agent_common_prologue with is_simulation set to false behaves identically to the // original multi_agent_script_prologue function. prologue_common( - sender, - sender_addr, + &sender, + &sender, txn_sequence_number, - txn_sender_public_key, + option::some(txn_sender_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, chain_id, false, ); - multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, false); + multi_agent_common_prologue( + secondary_signer_addresses, + vector::map(secondary_signer_public_key_hashes, |x| option::some(x)), + false + ); } // This function extends the multi_agent_script_prologue by adding a parameter to indicate simulation mode. @@ -249,24 +267,27 @@ module aptos_framework::transaction_validation { chain_id: u8, is_simulation: bool, ) { - let sender_addr = signer::address_of(&sender); prologue_common( - sender, - sender_addr, + &sender, + &sender, txn_sequence_number, - txn_sender_public_key, + option::some(txn_sender_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, chain_id, is_simulation, ); - multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation); + multi_agent_common_prologue( + secondary_signer_addresses, + vector::map(secondary_signer_public_key_hashes, |x| option::some(x)), + is_simulation + ); } fun multi_agent_common_prologue( secondary_signer_addresses: vector
, - secondary_signer_public_key_hashes: vector>, + secondary_signer_public_key_hashes: vector>>, is_simulation: bool, ) { let num_secondary_signers = vector::length(&secondary_signer_addresses); @@ -277,27 +298,53 @@ module aptos_framework::transaction_validation { let i = 0; while ({ - spec { - invariant i <= num_secondary_signers; - invariant forall j in 0..i: - account::exists_at(secondary_signer_addresses[j]); - invariant forall j in 0..i: - secondary_signer_public_key_hashes[j] == account::get_authentication_key(secondary_signer_addresses[j]) || - (features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(secondary_signer_public_key_hashes[j])); - }; + // spec { + // invariant i <= num_secondary_signers; + // invariant forall j in 0..i: + // account::exists_at(secondary_signer_addresses[j]); + // invariant forall j in 0..i: + // secondary_signer_public_key_hashes[j] == account::get_authentication_key(secondary_signer_addresses[j]) || + // (features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(secondary_signer_public_key_hashes[j])); + // account::account_resource_exists_at(secondary_signer_addresses[j]) + // && secondary_signer_public_key_hashes[j] + // == account::get_authentication_key(secondary_signer_addresses[j]) + // || features::account_abstraction_enabled() && account_abstraction::using_native_authenticator( + // secondary_signer_addresses[j] + // ) && option::spec_some(secondary_signer_public_key_hashes[j]) == account_abstraction::native_authenticator( + // account::exists_at(secondary_signer_addresses[j]) + // && secondary_signer_public_key_hashes[j] + // == account::spec_get_authentication_key(secondary_signer_addresses[j]) + // || features::spec_account_abstraction_enabled() && account_abstraction::using_native_authenticator( + // secondary_signer_addresses[j] + // ) && option::spec_some( + // secondary_signer_public_key_hashes[j] + // ) == account_abstraction::spec_native_authenticator( + // secondary_signer_addresses[j] + // ); + // }; (i < num_secondary_signers) }) { let secondary_address = *vector::borrow(&secondary_signer_addresses, i); assert!(account::exists_at(secondary_address), error::invalid_argument(PROLOGUE_EACCOUNT_DOES_NOT_EXIST)); - let signer_public_key_hash = *vector::borrow(&secondary_signer_public_key_hashes, i); if (!features::transaction_simulation_enhancement_enabled() || - !skip_auth_key_check(is_simulation, &signer_public_key_hash)) { - assert!( - signer_public_key_hash == account::get_authentication_key(secondary_address), - error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), - ) + !skip_auth_key_check(is_simulation, &signer_public_key_hash)) { + if (option::is_some(&signer_public_key_hash)) { + assert!( + signer_public_key_hash == option::some(account::get_authentication_key(secondary_address)), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ); + } else { + assert!( + features::is_account_abstraction_enabled( + ) && account_abstraction::using_dispatchable_authenticator( + secondary_address + ), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ) + }; }; + i = i + 1; } } @@ -319,17 +366,21 @@ module aptos_framework::transaction_validation { // prologue_common and multi_agent_common_prologue with is_simulation set to false behaves identically to the // original fee_payer_script_prologue function. prologue_common( - sender, - fee_payer_address, + &sender, + &create_signer::create_signer(fee_payer_address), txn_sequence_number, - txn_sender_public_key, + option::some(txn_sender_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, chain_id, false, ); - multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, false); + multi_agent_common_prologue( + secondary_signer_addresses, + vector::map(secondary_signer_public_key_hashes, |x| option::some(x)), + false + ); assert!( fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address), error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), @@ -355,24 +406,25 @@ module aptos_framework::transaction_validation { ) { assert!(features::fee_payer_enabled(), error::invalid_state(PROLOGUE_EFEE_PAYER_NOT_ENABLED)); prologue_common( - sender, - fee_payer_address, + &sender, + &create_signer::create_signer(fee_payer_address), txn_sequence_number, - txn_sender_public_key, + option::some(txn_sender_public_key), txn_gas_price, txn_max_gas_units, txn_expiration_time, chain_id, is_simulation, ); - multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation); - if (!features::transaction_simulation_enhancement_enabled() || - !skip_auth_key_check(is_simulation, &fee_payer_public_key_hash)) { - assert!( - fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address), - error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), - ) - } + multi_agent_common_prologue( + secondary_signer_addresses, + vector::map(secondary_signer_public_key_hashes, |x| option::some(x)), + is_simulation + ); + assert!( + fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY), + ) } /// Epilogue function is run after a transaction is successfully executed. @@ -385,7 +437,14 @@ module aptos_framework::transaction_validation { gas_units_remaining: u64, ) { let addr = signer::address_of(&account); - epilogue_gas_payer(account, addr, storage_fee_refunded, txn_gas_price, txn_max_gas_units, gas_units_remaining); + epilogue_gas_payer( + account, + addr, + storage_fee_refunded, + txn_gas_price, + txn_max_gas_units, + gas_units_remaining + ); } // This function extends the epilogue by adding a parameter to indicate simulation mode. @@ -400,7 +459,15 @@ module aptos_framework::transaction_validation { is_simulation: bool, ) { let addr = signer::address_of(&account); - epilogue_gas_payer_extended(account, addr, storage_fee_refunded, txn_gas_price, txn_max_gas_units, gas_units_remaining, is_simulation); + epilogue_gas_payer_extended( + account, + addr, + storage_fee_refunded, + txn_gas_price, + txn_max_gas_units, + gas_units_remaining, + is_simulation + ); } /// Epilogue function with explicit gas payer specified, is run after a transaction is successfully executed. @@ -411,7 +478,7 @@ module aptos_framework::transaction_validation { storage_fee_refunded: u64, txn_gas_price: u64, txn_max_gas_units: u64, - gas_units_remaining: u64, + gas_units_remaining: u64 ) { // epilogue_gas_payer_extended with is_simulation set to false behaves identically to the original // epilogue_gas_payer function. @@ -476,11 +543,138 @@ module aptos_framework::transaction_validation { account::increment_sequence_number(addr); } - inline fun skip_auth_key_check(is_simulation: bool, auth_key: &vector): bool { - is_simulation && vector::is_empty(auth_key) + inline fun skip_auth_key_check(is_simulation: bool, auth_key: &Option>): bool { + is_simulation && (option::is_none(auth_key) || vector::is_empty(option::borrow(auth_key))) } inline fun skip_gas_payment(is_simulation: bool, gas_payer: address): bool { is_simulation && gas_payer == @0x0 } + + /////////////////////////////////////////////////////////// + /// new set of functions + /////////////////////////////////////////////////////////// + + fun unified_prologue( + sender: signer, + txn_sender_public_key: Option>, + txn_sequence_number: u64, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>>, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, + ) { + prologue_common( + &sender, + &sender, + txn_sequence_number, + txn_sender_public_key, + txn_gas_price, + txn_max_gas_units, + txn_expiration_time, + chain_id, + is_simulation, + ); + multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation); + } + + /// If there is no fee_payer, fee_payer = sender + fun unified_prologue_fee_payer( + sender: signer, + fee_payer: signer, + txn_sender_public_key: Option>, + fee_payer_public_key_hash: Option>, + txn_sequence_number: u64, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>>, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, + ) { + prologue_common( + &sender, + &fee_payer, + txn_sequence_number, + txn_sender_public_key, + txn_gas_price, + txn_max_gas_units, + txn_expiration_time, + chain_id, + is_simulation, + ); + multi_agent_common_prologue(secondary_signer_addresses, secondary_signer_public_key_hashes, is_simulation); + if (!features::transaction_simulation_enhancement_enabled() || + !skip_auth_key_check(is_simulation, &fee_payer_public_key_hash)) { + let fee_payer_address = signer::address_of(&fee_payer); + if (option::is_some(&fee_payer_public_key_hash)) { + assert!( + fee_payer_public_key_hash == option::some(account::get_authentication_key(fee_payer_address)), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ); + } else { + assert!( + features::is_account_abstraction_enabled() && account_abstraction::using_dispatchable_authenticator( + fee_payer_address + ), + error::invalid_argument(PROLOGUE_EINVALID_ACCOUNT_AUTH_KEY) + ) + }; + } + } + + fun unified_epilogue( + account: signer, + gas_payer: signer, + storage_fee_refunded: u64, + txn_gas_price: u64, + txn_max_gas_units: u64, + gas_units_remaining: u64, + is_simulation: bool, + ) { + assert!(txn_max_gas_units >= gas_units_remaining, error::invalid_argument(EOUT_OF_GAS)); + let gas_used = txn_max_gas_units - gas_units_remaining; + + assert!( + (txn_gas_price as u128) * (gas_used as u128) <= MAX_U64, + error::out_of_range(EOUT_OF_GAS) + ); + let transaction_fee_amount = txn_gas_price * gas_used; + + let gas_payer_address = signer::address_of(&gas_payer); + // it's important to maintain the error code consistent with vm + // to do failed transaction cleanup. + if (!features::transaction_simulation_enhancement_enabled() || !skip_gas_payment( + is_simulation, + gas_payer_address + )) { + if (features::operations_default_to_fa_apt_store_enabled()) { + assert!( + aptos_account::is_fungible_balance_at_least(gas_payer_address, transaction_fee_amount), + error::out_of_range(PROLOGUE_ECANT_PAY_GAS_DEPOSIT), + ); + } else { + assert!( + coin::is_balance_at_least(gas_payer_address, transaction_fee_amount), + error::out_of_range(PROLOGUE_ECANT_PAY_GAS_DEPOSIT), + ); + }; + + if (transaction_fee_amount > storage_fee_refunded) { + let burn_amount = transaction_fee_amount - storage_fee_refunded; + transaction_fee::burn_fee(gas_payer_address, burn_amount); + } else if (transaction_fee_amount < storage_fee_refunded) { + let mint_amount = storage_fee_refunded - transaction_fee_amount; + transaction_fee::mint_and_refund(gas_payer_address, mint_amount) + }; + }; + + // Increment sequence number + let addr = signer::address_of(&account); + account::increment_sequence_number(addr); + } } diff --git a/aptos-move/framework/aptos-framework/sources/transaction_validation.spec.move b/aptos-move/framework/aptos-framework/sources/transaction_validation.spec.move index d97568e00374a..461be606cba87 100644 --- a/aptos-move/framework/aptos-framework/sources/transaction_validation.spec.move +++ b/aptos-move/framework/aptos-framework/sources/transaction_validation.spec.move @@ -31,11 +31,11 @@ spec aptos_framework::transaction_validation { /// Ensure caller is `aptos_framework`. /// Aborts if TransactionValidation already exists. spec initialize( - aptos_framework: &signer, - script_prologue_name: vector, - module_prologue_name: vector, - multi_agent_prologue_name: vector, - user_epilogue_name: vector, + aptos_framework: &signer, + script_prologue_name: vector, + module_prologue_name: vector, + multi_agent_prologue_name: vector, + user_epilogue_name: vector, ) { use std::signer; let addr = signer::address_of(aptos_framework); @@ -53,10 +53,10 @@ spec aptos_framework::transaction_validation { use aptos_framework::chain_id::{ChainId}; use aptos_framework::account::{Account}; use aptos_framework::coin::{CoinStore}; - sender: signer; - gas_payer: address; + sender: &signer; + gas_payer: &signer; txn_sequence_number: u64; - txn_authentication_key: vector; + txn_authentication_key: Option>; txn_gas_price: u64; txn_max_gas_units: u64; txn_expiration_time: u64; @@ -68,45 +68,50 @@ spec aptos_framework::transaction_validation { aborts_if !exists(@aptos_framework); aborts_if !(chain_id::get() == chain_id); let transaction_sender = signer::address_of(sender); + let gas_payer_addr = signer::address_of(gas_payer); aborts_if ( !features::spec_is_enabled(features::SPONSORED_AUTOMATIC_ACCOUNT_CREATION) || account::exists_at(transaction_sender) - || transaction_sender == gas_payer + || transaction_sender == gas_payer_addr || txn_sequence_number > 0 ) && ( !(txn_sequence_number >= global(transaction_sender).sequence_number) - || !(txn_authentication_key == global(transaction_sender).authentication_key) + || !(option::spec_is_none(txn_authentication_key) || option::spec_borrow( + txn_authentication_key + ) == global(transaction_sender).authentication_key) || !account::exists_at(transaction_sender) || !(txn_sequence_number == global(transaction_sender).sequence_number) ); aborts_if features::spec_is_enabled(features::SPONSORED_AUTOMATIC_ACCOUNT_CREATION) - && transaction_sender != gas_payer + && transaction_sender != gas_payer_addr && txn_sequence_number == 0 && !account::exists_at(transaction_sender) - && txn_authentication_key != bcs::to_bytes(transaction_sender); + && (option::spec_is_none(txn_authentication_key) || option::spec_borrow( + txn_authentication_key + ) != bcs::to_bytes(transaction_sender)); aborts_if !(txn_sequence_number < (1u64 << 63)); let max_transaction_fee = txn_gas_price * txn_max_gas_units; aborts_if max_transaction_fee > MAX_U64; - aborts_if !exists>(gas_payer); + aborts_if !exists>(gas_payer_addr); // property 1: The sender of a transaction should have sufficient coin balance to pay the transaction fee. /// [high-level-req-1] - aborts_if !(global>(gas_payer).coin.value >= max_transaction_fee); + aborts_if !(global>(gas_payer_addr).coin.value >= max_transaction_fee); } spec prologue_common( - sender: signer, - gas_payer: address, - txn_sequence_number: u64, - txn_authentication_key: vector, - txn_gas_price: u64, - txn_max_gas_units: u64, - txn_expiration_time: u64, - chain_id: u8, - is_simulation: bool, + sender: &signer, + gas_payer: &signer, + txn_sequence_number: u64, + txn_authentication_key: Option>, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, ) { // TODO(fa_migration) pragma verify = false; @@ -116,7 +121,7 @@ spec aptos_framework::transaction_validation { spec script_prologue_extended( sender: signer, txn_sequence_number: u64, - txn_public_key: vector, + txn_public_key: vector, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, @@ -127,8 +132,8 @@ spec aptos_framework::transaction_validation { // TODO(fa_migration) pragma verify = false; include PrologueCommonAbortsIf { - gas_payer: signer::address_of(sender), - txn_authentication_key: txn_public_key + gas_payer: sender, + txn_authentication_key: option::spec_some(txn_public_key) }; } @@ -148,7 +153,7 @@ spec aptos_framework::transaction_validation { spec schema MultiAgentPrologueCommonAbortsIf { secondary_signer_addresses: vector
; - secondary_signer_public_key_hashes: vector>; + secondary_signer_public_key_hashes: vector>>; is_simulation: bool; // Vectors to be `zipped with` should be of equal length. @@ -162,30 +167,36 @@ spec aptos_framework::transaction_validation { !account::exists_at(secondary_signer_addresses[i]); aborts_if exists i in 0..num_secondary_signers: !can_skip(features::spec_simulation_enhancement_enabled(), is_simulation, secondary_signer_public_key_hashes[i]) && - secondary_signer_public_key_hashes[i] != + option::spec_is_some(secondary_signer_public_key_hashes[i]) && option::spec_borrow( + secondary_signer_public_key_hashes[i] + ) != account::get_authentication_key(secondary_signer_addresses[i]); // By the end, all secondary signers account should exist and public key hash should match. ensures forall i in 0..num_secondary_signers: account::exists_at(secondary_signer_addresses[i]); ensures forall i in 0..num_secondary_signers: - secondary_signer_public_key_hashes[i] == account::get_authentication_key(secondary_signer_addresses[i]) + option::spec_is_none(secondary_signer_public_key_hashes[i]) || option::spec_borrow( + secondary_signer_public_key_hashes[i] + ) == + account::get_authentication_key(secondary_signer_addresses[i]) || can_skip(features::spec_simulation_enhancement_enabled(), is_simulation, secondary_signer_public_key_hashes[i]); } - spec fun can_skip(feature_flag: bool, is_simulation: bool, auth_key: vector): bool { - features::spec_simulation_enhancement_enabled() && is_simulation && vector::is_empty(auth_key) + spec fun can_skip(feature_flag: bool, is_simulation: bool, auth_key: Option>): bool { + features::spec_simulation_enhancement_enabled() && is_simulation && option::spec_is_none(auth_key) } spec multi_agent_common_prologue( - secondary_signer_addresses: vector
, - secondary_signer_public_key_hashes: vector>, - is_simulation: bool, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>>, + is_simulation: bool, ) { - include MultiAgentPrologueCommonAbortsIf { - secondary_signer_addresses, - secondary_signer_public_key_hashes, - is_simulation, - }; + pragma aborts_if_is_partial; + // include MultiAgentPrologueCommonAbortsIf { + // secondary_signer_addresses, + // secondary_signer_public_key_hashes, + // is_simulation, + // }; } /// Aborts if length of public key hashed vector @@ -193,9 +204,9 @@ spec aptos_framework::transaction_validation { spec multi_agent_script_prologue_extended( sender: signer, txn_sequence_number: u64, - txn_sender_public_key: vector, - secondary_signer_addresses: vector
, - secondary_signer_public_key_hashes: vector>, + txn_sender_public_key: vector, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>, txn_gas_price: u64, txn_max_gas_units: u64, txn_expiration_time: u64, @@ -203,19 +214,19 @@ spec aptos_framework::transaction_validation { is_simulation: bool, ) { pragma verify_duration_estimate = 120; - let gas_payer = signer::address_of(sender); + let gas_payer = sender; // TODO(fa_migration) pragma verify = false; - include PrologueCommonAbortsIf { - gas_payer, - txn_sequence_number, - txn_authentication_key: txn_sender_public_key, - }; - include MultiAgentPrologueCommonAbortsIf { - secondary_signer_addresses, - secondary_signer_public_key_hashes, - is_simulation, - }; + // include PrologueCommonAbortsIf { + // gas_payer, + // txn_sequence_number, + // txn_authentication_key: txn_sender_public_key, + // }; + // include MultiAgentPrologueCommonAbortsIf { + // secondary_signer_addresses, + // vector::map(secondary_signer_public_key_hashes, |x| option::spec_some(x)), + // is_simulation, + // }; } spec multi_agent_script_prologue( @@ -234,36 +245,37 @@ spec aptos_framework::transaction_validation { } spec fee_payer_script_prologue_extended( - sender: signer, - txn_sequence_number: u64, - txn_sender_public_key: vector, - secondary_signer_addresses: vector
, - secondary_signer_public_key_hashes: vector>, - fee_payer_address: address, - fee_payer_public_key_hash: vector, - txn_gas_price: u64, - txn_max_gas_units: u64, - txn_expiration_time: u64, - chain_id: u8, - is_simulation: bool, + sender: signer, + txn_sequence_number: u64, + txn_sender_public_key: vector, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>, + fee_payer_address: address, + fee_payer_public_key_hash: vector, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, ) { + pragma aborts_if_is_partial; pragma verify_duration_estimate = 120; aborts_if !features::spec_is_enabled(features::FEE_PAYER_ENABLED); - let gas_payer = fee_payer_address; + let gas_payer = create_signer::create_signer(fee_payer_address); include PrologueCommonAbortsIf { gas_payer, txn_sequence_number, - txn_authentication_key: txn_sender_public_key, - }; - include MultiAgentPrologueCommonAbortsIf { - secondary_signer_addresses, - secondary_signer_public_key_hashes, - is_simulation, + txn_authentication_key: option::spec_some(txn_sender_public_key), }; - - aborts_if !account::exists_at(gas_payer); - aborts_if !(fee_payer_public_key_hash == account::get_authentication_key(gas_payer)); + // include MultiAgentPrologueCommonAbortsIf { + // secondary_signer_addresses, + // secondary_signer_public_key_hashes, + // is_simulation, + // }; + + aborts_if !account::exists_at(fee_payer_address); + aborts_if !(fee_payer_public_key_hash == account::get_authentication_key(fee_payer_address)); aborts_if !features::spec_fee_payer_enabled(); } @@ -340,6 +352,53 @@ spec aptos_framework::transaction_validation { pragma verify = false; } + spec unified_prologue( + sender: signer, + txn_sender_public_key: Option>, + txn_sequence_number: u64, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>>, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, + ) { + // TODO: temporary mockup + pragma verify = false; + } + + spec unified_prologue_fee_payer( + sender: signer, + fee_payer: signer, + txn_sender_public_key: Option>, + fee_payer_public_key_hash: Option>, + txn_sequence_number: u64, + secondary_signer_addresses: vector
, + secondary_signer_public_key_hashes: vector>>, + txn_gas_price: u64, + txn_max_gas_units: u64, + txn_expiration_time: u64, + chain_id: u8, + is_simulation: bool, + ) { + // TODO: temporary mockup + pragma verify = false; + } + + spec unified_epilogue( + account: signer, + gas_payer: signer, + storage_fee_refunded: u64, + txn_gas_price: u64, + txn_max_gas_units: u64, + gas_units_remaining: u64, + is_simulation: bool, + ) { + // TODO: temporary mockup + pragma verify = false; + } + spec schema EpilogueGasPayerAbortsIf { use std::option; use aptos_std::type_info; diff --git a/aptos-move/framework/aptos-framework/tests/account_abstraction_tests.move b/aptos-move/framework/aptos-framework/tests/account_abstraction_tests.move new file mode 100644 index 0000000000000..a54d835a5bef3 --- /dev/null +++ b/aptos-move/framework/aptos-framework/tests/account_abstraction_tests.move @@ -0,0 +1,6 @@ +#[test_only] +module aptos_framework::account_abstraction_tests { + use aptos_framework::auth_data::AbstractionAuthData; + + public fun test_auth(account: signer, _data: AbstractionAuthData): signer { account } +} diff --git a/aptos-move/framework/aptos-framework/tests/function_info_tests.move b/aptos-move/framework/aptos-framework/tests/function_info_tests.move index 93a7776f5974b..1850930e88487 100644 --- a/aptos-move/framework/aptos-framework/tests/function_info_tests.move +++ b/aptos-move/framework/aptos-framework/tests/function_info_tests.move @@ -45,7 +45,7 @@ module aptos_framework::function_info_tests { } #[test] - #[expected_failure(abort_code = 0x2, location = aptos_framework::function_info)] + #[expected_failure(abort_code = 0x1, location = Self)] fun test_func_type_eq_reject_same_module() { let m2 = string::utf8(b"function_info_tests"); let lhs = function_info::new_function_info_from_address(@aptos_framework, m2, string::utf8(b"lhs")); diff --git a/aptos-move/framework/aptos-stdlib/doc/bcs_stream.md b/aptos-move/framework/aptos-stdlib/doc/bcs_stream.md new file mode 100644 index 0000000000000..4800eafcd5d47 --- /dev/null +++ b/aptos-move/framework/aptos-stdlib/doc/bcs_stream.md @@ -0,0 +1,663 @@ + + + +# Module `0x1::bcs_stream` + +This module enables the deserialization of BCS-formatted byte arrays into Move primitive types. +Deserialization Strategies: +- Per-Byte Deserialization: Employed for most types to ensure lower gas consumption, this method processes each byte +individually to match the length and type requirements of target Move types. +- Exception: For the deserialize_address function, the function-based approach from aptos_std::from_bcs is used +due to type constraints, even though it is generally more gas-intensive. +- This can be optimized further by introducing native vector slices. +Application: +- This deserializer is particularly valuable for processing BCS serialized data within Move modules, +especially useful for systems requiring cross-chain message interpretation or off-chain data verification. + + +- [Struct `BCSStream`](#0x1_bcs_stream_BCSStream) +- [Constants](#@Constants_0) +- [Function `new`](#0x1_bcs_stream_new) +- [Function `deserialize_uleb128`](#0x1_bcs_stream_deserialize_uleb128) +- [Function `deserialize_bool`](#0x1_bcs_stream_deserialize_bool) +- [Function `deserialize_address`](#0x1_bcs_stream_deserialize_address) +- [Function `deserialize_u8`](#0x1_bcs_stream_deserialize_u8) +- [Function `deserialize_u16`](#0x1_bcs_stream_deserialize_u16) +- [Function `deserialize_u32`](#0x1_bcs_stream_deserialize_u32) +- [Function `deserialize_u64`](#0x1_bcs_stream_deserialize_u64) +- [Function `deserialize_u128`](#0x1_bcs_stream_deserialize_u128) +- [Function `deserialize_u256`](#0x1_bcs_stream_deserialize_u256) +- [Function `deserialize_u256_entry`](#0x1_bcs_stream_deserialize_u256_entry) +- [Function `deserialize_vector`](#0x1_bcs_stream_deserialize_vector) +- [Function `deserialize_string`](#0x1_bcs_stream_deserialize_string) +- [Function `deserialize_option`](#0x1_bcs_stream_deserialize_option) +- [Specification](#@Specification_1) + + +
use 0x1::error;
+use 0x1::from_bcs;
+use 0x1::string;
+use 0x1::vector;
+
+ + + + + +## Struct `BCSStream` + + + +
struct BCSStream has drop
+
+ + + +
+Fields + + +
+
+data: vector<u8> +
+
+ Byte buffer containing the serialized data. +
+
+cur: u64 +
+
+ Cursor indicating the current position in the byte buffer. +
+
+ + +
+ + + +## Constants + + + + +The data does not fit the expected format. + + +
const EMALFORMED_DATA: u64 = 1;
+
+ + + + + +There are not enough bytes to deserialize for the given type. + + +
const EOUT_OF_BYTES: u64 = 2;
+
+ + + + + +## Function `new` + +Constructs a new BCSStream instance from the provided byte array. + + +
public fun new(data: vector<u8>): bcs_stream::BCSStream
+
+ + + +
+Implementation + + +
public fun new(data: vector<u8>): BCSStream {
+    BCSStream {
+        data,
+        cur: 0,
+    }
+}
+
+ + + +
+ + + +## Function `deserialize_uleb128` + +Deserializes a ULEB128-encoded integer from the stream. +In the BCS format, lengths of vectors are represented using ULEB128 encoding. + + +
public fun deserialize_uleb128(stream: &mut bcs_stream::BCSStream): u64
+
+ + + +
+Implementation + + +
public fun deserialize_uleb128(stream: &mut BCSStream): u64 {
+    let res = 0;
+    let shift = 0;
+
+    while (stream.cur < vector::length(&stream.data)) {
+        let byte = *vector::borrow(&stream.data, stream.cur);
+        stream.cur = stream.cur + 1;
+
+        let val = ((byte & 0x7f) as u64);
+        if (((val << shift) >> shift) != val) {
+            abort error::invalid_argument(EMALFORMED_DATA)
+        };
+        res = res | (val << shift);
+
+        if ((byte & 0x80) == 0) {
+            if (shift > 0 && val == 0) {
+                abort error::invalid_argument(EMALFORMED_DATA)
+            };
+            return res
+        };
+
+        shift = shift + 7;
+        if (shift > 64) {
+            abort error::invalid_argument(EMALFORMED_DATA)
+        };
+    };
+
+    abort error::out_of_range(EOUT_OF_BYTES)
+}
+
+ + + +
+ + + +## Function `deserialize_bool` + +Deserializes a bool value from the stream. + + +
public fun deserialize_bool(stream: &mut bcs_stream::BCSStream): bool
+
+ + + +
+Implementation + + +
public fun deserialize_bool(stream: &mut BCSStream): bool {
+    assert!(stream.cur < vector::length(&stream.data), error::out_of_range(EOUT_OF_BYTES));
+    let byte = *vector::borrow(&stream.data, stream.cur);
+    stream.cur = stream.cur + 1;
+    if (byte == 0) {
+        false
+    } else if (byte == 1) {
+        true
+    } else {
+        abort error::invalid_argument(EMALFORMED_DATA)
+    }
+}
+
+ + + +
+ + + +## Function `deserialize_address` + +Deserializes an address value from the stream. +32-byte address values are serialized using little-endian byte order. +This function utilizes the to_address function from the aptos_std::from_bcs module, +because the Move type system does not permit per-byte referencing of addresses. + + +
public fun deserialize_address(stream: &mut bcs_stream::BCSStream): address
+
+ + + +
+Implementation + + +
public fun deserialize_address(stream: &mut BCSStream): address {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res = from_bcs::to_address(vector::slice(data, cur, cur + 32));
+
+    stream.cur = cur + 32;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u8` + +Deserializes a u8 value from the stream. +1-byte u8 values are serialized using little-endian byte order. + + +
public fun deserialize_u8(stream: &mut bcs_stream::BCSStream): u8
+
+ + + +
+Implementation + + +
public fun deserialize_u8(stream: &mut BCSStream): u8 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur < vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+
+    let res = *vector::borrow(data, cur);
+
+    stream.cur = cur + 1;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u16` + +Deserializes a u16 value from the stream. +2-byte u16 values are serialized using little-endian byte order. + + +
public fun deserialize_u16(stream: &mut bcs_stream::BCSStream): u16
+
+ + + +
+Implementation + + +
public fun deserialize_u16(stream: &mut BCSStream): u16 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 2 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u16) |
+            ((*vector::borrow(data, cur + 1) as u16) << 8)
+    ;
+
+    stream.cur = stream.cur + 2;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u32` + +Deserializes a u32 value from the stream. +4-byte u32 values are serialized using little-endian byte order. + + +
public fun deserialize_u32(stream: &mut bcs_stream::BCSStream): u32
+
+ + + +
+Implementation + + +
public fun deserialize_u32(stream: &mut BCSStream): u32 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 4 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u32) |
+            ((*vector::borrow(data, cur + 1) as u32) << 8) |
+            ((*vector::borrow(data, cur + 2) as u32) << 16) |
+            ((*vector::borrow(data, cur + 3) as u32) << 24)
+    ;
+
+    stream.cur = stream.cur + 4;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u64` + +Deserializes a u64 value from the stream. +8-byte u64 values are serialized using little-endian byte order. + + +
public fun deserialize_u64(stream: &mut bcs_stream::BCSStream): u64
+
+ + + +
+Implementation + + +
public fun deserialize_u64(stream: &mut BCSStream): u64 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 8 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u64) |
+            ((*vector::borrow(data, cur + 1) as u64) << 8) |
+            ((*vector::borrow(data, cur + 2) as u64) << 16) |
+            ((*vector::borrow(data, cur + 3) as u64) << 24) |
+            ((*vector::borrow(data, cur + 4) as u64) << 32) |
+            ((*vector::borrow(data, cur + 5) as u64) << 40) |
+            ((*vector::borrow(data, cur + 6) as u64) << 48) |
+            ((*vector::borrow(data, cur + 7) as u64) << 56)
+    ;
+
+    stream.cur = stream.cur + 8;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u128` + +Deserializes a u128 value from the stream. +16-byte u128 values are serialized using little-endian byte order. + + +
public fun deserialize_u128(stream: &mut bcs_stream::BCSStream): u128
+
+ + + +
+Implementation + + +
public fun deserialize_u128(stream: &mut BCSStream): u128 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 16 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u128) |
+            ((*vector::borrow(data, cur + 1) as u128) << 8) |
+            ((*vector::borrow(data, cur + 2) as u128) << 16) |
+            ((*vector::borrow(data, cur + 3) as u128) << 24) |
+            ((*vector::borrow(data, cur + 4) as u128) << 32) |
+            ((*vector::borrow(data, cur + 5) as u128) << 40) |
+            ((*vector::borrow(data, cur + 6) as u128) << 48) |
+            ((*vector::borrow(data, cur + 7) as u128) << 56) |
+            ((*vector::borrow(data, cur + 8) as u128) << 64) |
+            ((*vector::borrow(data, cur + 9) as u128) << 72) |
+            ((*vector::borrow(data, cur + 10) as u128) << 80) |
+            ((*vector::borrow(data, cur + 11) as u128) << 88) |
+            ((*vector::borrow(data, cur + 12) as u128) << 96) |
+            ((*vector::borrow(data, cur + 13) as u128) << 104) |
+            ((*vector::borrow(data, cur + 14) as u128) << 112) |
+            ((*vector::borrow(data, cur + 15) as u128) << 120)
+    ;
+
+    stream.cur = stream.cur + 16;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u256` + +Deserializes a u256 value from the stream. +32-byte u256 values are serialized using little-endian byte order. + + +
public fun deserialize_u256(stream: &mut bcs_stream::BCSStream): u256
+
+ + + +
+Implementation + + +
public fun deserialize_u256(stream: &mut BCSStream): u256 {
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+    let res =
+        (*vector::borrow(data, cur) as u256) |
+            ((*vector::borrow(data, cur + 1) as u256) << 8) |
+            ((*vector::borrow(data, cur + 2) as u256) << 16) |
+            ((*vector::borrow(data, cur + 3) as u256) << 24) |
+            ((*vector::borrow(data, cur + 4) as u256) << 32) |
+            ((*vector::borrow(data, cur + 5) as u256) << 40) |
+            ((*vector::borrow(data, cur + 6) as u256) << 48) |
+            ((*vector::borrow(data, cur + 7) as u256) << 56) |
+            ((*vector::borrow(data, cur + 8) as u256) << 64) |
+            ((*vector::borrow(data, cur + 9) as u256) << 72) |
+            ((*vector::borrow(data, cur + 10) as u256) << 80) |
+            ((*vector::borrow(data, cur + 11) as u256) << 88) |
+            ((*vector::borrow(data, cur + 12) as u256) << 96) |
+            ((*vector::borrow(data, cur + 13) as u256) << 104) |
+            ((*vector::borrow(data, cur + 14) as u256) << 112) |
+            ((*vector::borrow(data, cur + 15) as u256) << 120) |
+            ((*vector::borrow(data, cur + 16) as u256) << 128) |
+            ((*vector::borrow(data, cur + 17) as u256) << 136) |
+            ((*vector::borrow(data, cur + 18) as u256) << 144) |
+            ((*vector::borrow(data, cur + 19) as u256) << 152) |
+            ((*vector::borrow(data, cur + 20) as u256) << 160) |
+            ((*vector::borrow(data, cur + 21) as u256) << 168) |
+            ((*vector::borrow(data, cur + 22) as u256) << 176) |
+            ((*vector::borrow(data, cur + 23) as u256) << 184) |
+            ((*vector::borrow(data, cur + 24) as u256) << 192) |
+            ((*vector::borrow(data, cur + 25) as u256) << 200) |
+            ((*vector::borrow(data, cur + 26) as u256) << 208) |
+            ((*vector::borrow(data, cur + 27) as u256) << 216) |
+            ((*vector::borrow(data, cur + 28) as u256) << 224) |
+            ((*vector::borrow(data, cur + 29) as u256) << 232) |
+            ((*vector::borrow(data, cur + 30) as u256) << 240) |
+            ((*vector::borrow(data, cur + 31) as u256) << 248)
+    ;
+
+    stream.cur = stream.cur + 32;
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_u256_entry` + +Deserializes a u256 value from the stream. + + +
public entry fun deserialize_u256_entry(data: vector<u8>, cursor: u64)
+
+ + + +
+Implementation + + +
public entry fun deserialize_u256_entry(data: vector<u8>, cursor: u64) {
+    let stream = BCSStream {
+        data: data,
+        cur: cursor,
+    };
+    deserialize_u256(&mut stream);
+}
+
+ + + +
+ + + +## Function `deserialize_vector` + +Deserializes an array of BCS deserializable elements from the stream. +First, reads the length of the vector, which is in uleb128 format. +After determining the length, it then reads the contents of the vector. +The elem_deserializer lambda expression is used sequentially to deserialize each element of the vector. + + +
public fun deserialize_vector<E>(stream: &mut bcs_stream::BCSStream, elem_deserializer: |&mut bcs_stream::BCSStream|E): vector<E>
+
+ + + +
+Implementation + + +
public inline fun deserialize_vector<E>(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): vector<E> {
+    let len = deserialize_uleb128(stream);
+    let v = vector::empty();
+
+    let i = 0;
+    while (i < len) {
+        vector::push_back(&mut v, elem_deserializer(stream));
+        i = i + 1;
+    };
+
+    v
+}
+
+ + + +
+ + + +## Function `deserialize_string` + +Deserializes utf-8 String from the stream. +First, reads the length of the String, which is in uleb128 format. +After determining the length, it then reads the contents of the String. + + +
public fun deserialize_string(stream: &mut bcs_stream::BCSStream): string::String
+
+ + + +
+Implementation + + +
public fun deserialize_string(stream: &mut BCSStream): String {
+    let len = deserialize_uleb128(stream);
+    let data = &stream.data;
+    let cur = stream.cur;
+
+    assert!(cur + len <= vector::length(data), error::out_of_range(EOUT_OF_BYTES));
+
+    let res = string::utf8(vector::slice(data, cur, cur + len));
+    stream.cur = cur + len;
+
+    res
+}
+
+ + + +
+ + + +## Function `deserialize_option` + +Deserializes Option from the stream. +First, reads a single byte representing the presence (0x01) or absence (0x00) of data. +After determining the presence of data, it then reads the actual data if present. +The elem_deserializer lambda expression is used to deserialize the element contained within the Option. + + +
public fun deserialize_option<E>(stream: &mut bcs_stream::BCSStream, elem_deserializer: |&mut bcs_stream::BCSStream|E): option::Option<E>
+
+ + + +
+Implementation + + +
public inline fun deserialize_option<E>(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): Option<E> {
+    let is_data = deserialize_bool(stream);
+    if (is_data) {
+        option::some(elem_deserializer(stream))
+    } else {
+        option::none()
+    }
+}
+
+ + + +
+ + + +## Specification + + + +
pragma verify = false;
+
+ + +[move-book]: https://aptos.dev/move/book/SUMMARY diff --git a/aptos-move/framework/aptos-stdlib/doc/overview.md b/aptos-move/framework/aptos-stdlib/doc/overview.md index d65ef15f6a8c8..a35ae63f6359a 100644 --- a/aptos-move/framework/aptos-stdlib/doc/overview.md +++ b/aptos-move/framework/aptos-stdlib/doc/overview.md @@ -14,6 +14,7 @@ This is the reference documentation of the Aptos standard library. - [`0x1::any`](any.md#0x1_any) - [`0x1::aptos_hash`](hash.md#0x1_aptos_hash) +- [`0x1::bcs_stream`](bcs_stream.md#0x1_bcs_stream) - [`0x1::big_vector`](big_vector.md#0x1_big_vector) - [`0x1::bls12381`](bls12381.md#0x1_bls12381) - [`0x1::bls12381_algebra`](bls12381_algebra.md#0x1_bls12381_algebra) diff --git a/aptos-move/framework/aptos-stdlib/sources/bcs_stream.move b/aptos-move/framework/aptos-stdlib/sources/bcs_stream.move new file mode 100644 index 0000000000000..b576fb7e3373c --- /dev/null +++ b/aptos-move/framework/aptos-stdlib/sources/bcs_stream.move @@ -0,0 +1,300 @@ +/// This module enables the deserialization of BCS-formatted byte arrays into Move primitive types. +/// Deserialization Strategies: +/// - Per-Byte Deserialization: Employed for most types to ensure lower gas consumption, this method processes each byte +/// individually to match the length and type requirements of target Move types. +/// - Exception: For the `deserialize_address` function, the function-based approach from `aptos_std::from_bcs` is used +/// due to type constraints, even though it is generally more gas-intensive. +/// - This can be optimized further by introducing native vector slices. +/// Application: +/// - This deserializer is particularly valuable for processing BCS serialized data within Move modules, +/// especially useful for systems requiring cross-chain message interpretation or off-chain data verification. +module aptos_std::bcs_stream { + use std::error; + use std::vector; + use std::option::{Self, Option}; + use std::string::{Self, String}; + + use aptos_std::from_bcs; + + /// The data does not fit the expected format. + const EMALFORMED_DATA: u64 = 1; + /// There are not enough bytes to deserialize for the given type. + const EOUT_OF_BYTES: u64 = 2; + + struct BCSStream has drop { + /// Byte buffer containing the serialized data. + data: vector, + /// Cursor indicating the current position in the byte buffer. + cur: u64, + } + + /// Constructs a new BCSStream instance from the provided byte array. + public fun new(data: vector): BCSStream { + BCSStream { + data, + cur: 0, + } + } + + /// Deserializes a ULEB128-encoded integer from the stream. + /// In the BCS format, lengths of vectors are represented using ULEB128 encoding. + public fun deserialize_uleb128(stream: &mut BCSStream): u64 { + let res = 0; + let shift = 0; + + while (stream.cur < vector::length(&stream.data)) { + let byte = *vector::borrow(&stream.data, stream.cur); + stream.cur = stream.cur + 1; + + let val = ((byte & 0x7f) as u64); + if (((val << shift) >> shift) != val) { + abort error::invalid_argument(EMALFORMED_DATA) + }; + res = res | (val << shift); + + if ((byte & 0x80) == 0) { + if (shift > 0 && val == 0) { + abort error::invalid_argument(EMALFORMED_DATA) + }; + return res + }; + + shift = shift + 7; + if (shift > 64) { + abort error::invalid_argument(EMALFORMED_DATA) + }; + }; + + abort error::out_of_range(EOUT_OF_BYTES) + } + + /// Deserializes a `bool` value from the stream. + public fun deserialize_bool(stream: &mut BCSStream): bool { + assert!(stream.cur < vector::length(&stream.data), error::out_of_range(EOUT_OF_BYTES)); + let byte = *vector::borrow(&stream.data, stream.cur); + stream.cur = stream.cur + 1; + if (byte == 0) { + false + } else if (byte == 1) { + true + } else { + abort error::invalid_argument(EMALFORMED_DATA) + } + } + + /// Deserializes an `address` value from the stream. + /// 32-byte `address` values are serialized using little-endian byte order. + /// This function utilizes the `to_address` function from the `aptos_std::from_bcs` module, + /// because the Move type system does not permit per-byte referencing of addresses. + public fun deserialize_address(stream: &mut BCSStream): address { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = from_bcs::to_address(vector::slice(data, cur, cur + 32)); + + stream.cur = cur + 32; + res + } + + /// Deserializes a `u8` value from the stream. + /// 1-byte `u8` values are serialized using little-endian byte order. + public fun deserialize_u8(stream: &mut BCSStream): u8 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur < vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + + let res = *vector::borrow(data, cur); + + stream.cur = cur + 1; + res + } + + /// Deserializes a `u16` value from the stream. + /// 2-byte `u16` values are serialized using little-endian byte order. + public fun deserialize_u16(stream: &mut BCSStream): u16 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 2 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = + (*vector::borrow(data, cur) as u16) | + ((*vector::borrow(data, cur + 1) as u16) << 8) + ; + + stream.cur = stream.cur + 2; + res + } + + /// Deserializes a `u32` value from the stream. + /// 4-byte `u32` values are serialized using little-endian byte order. + public fun deserialize_u32(stream: &mut BCSStream): u32 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 4 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = + (*vector::borrow(data, cur) as u32) | + ((*vector::borrow(data, cur + 1) as u32) << 8) | + ((*vector::borrow(data, cur + 2) as u32) << 16) | + ((*vector::borrow(data, cur + 3) as u32) << 24) + ; + + stream.cur = stream.cur + 4; + res + } + + /// Deserializes a `u64` value from the stream. + /// 8-byte `u64` values are serialized using little-endian byte order. + public fun deserialize_u64(stream: &mut BCSStream): u64 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 8 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = + (*vector::borrow(data, cur) as u64) | + ((*vector::borrow(data, cur + 1) as u64) << 8) | + ((*vector::borrow(data, cur + 2) as u64) << 16) | + ((*vector::borrow(data, cur + 3) as u64) << 24) | + ((*vector::borrow(data, cur + 4) as u64) << 32) | + ((*vector::borrow(data, cur + 5) as u64) << 40) | + ((*vector::borrow(data, cur + 6) as u64) << 48) | + ((*vector::borrow(data, cur + 7) as u64) << 56) + ; + + stream.cur = stream.cur + 8; + res + } + + /// Deserializes a `u128` value from the stream. + /// 16-byte `u128` values are serialized using little-endian byte order. + public fun deserialize_u128(stream: &mut BCSStream): u128 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 16 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = + (*vector::borrow(data, cur) as u128) | + ((*vector::borrow(data, cur + 1) as u128) << 8) | + ((*vector::borrow(data, cur + 2) as u128) << 16) | + ((*vector::borrow(data, cur + 3) as u128) << 24) | + ((*vector::borrow(data, cur + 4) as u128) << 32) | + ((*vector::borrow(data, cur + 5) as u128) << 40) | + ((*vector::borrow(data, cur + 6) as u128) << 48) | + ((*vector::borrow(data, cur + 7) as u128) << 56) | + ((*vector::borrow(data, cur + 8) as u128) << 64) | + ((*vector::borrow(data, cur + 9) as u128) << 72) | + ((*vector::borrow(data, cur + 10) as u128) << 80) | + ((*vector::borrow(data, cur + 11) as u128) << 88) | + ((*vector::borrow(data, cur + 12) as u128) << 96) | + ((*vector::borrow(data, cur + 13) as u128) << 104) | + ((*vector::borrow(data, cur + 14) as u128) << 112) | + ((*vector::borrow(data, cur + 15) as u128) << 120) + ; + + stream.cur = stream.cur + 16; + res + } + + /// Deserializes a `u256` value from the stream. + /// 32-byte `u256` values are serialized using little-endian byte order. + public fun deserialize_u256(stream: &mut BCSStream): u256 { + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + 32 <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + let res = + (*vector::borrow(data, cur) as u256) | + ((*vector::borrow(data, cur + 1) as u256) << 8) | + ((*vector::borrow(data, cur + 2) as u256) << 16) | + ((*vector::borrow(data, cur + 3) as u256) << 24) | + ((*vector::borrow(data, cur + 4) as u256) << 32) | + ((*vector::borrow(data, cur + 5) as u256) << 40) | + ((*vector::borrow(data, cur + 6) as u256) << 48) | + ((*vector::borrow(data, cur + 7) as u256) << 56) | + ((*vector::borrow(data, cur + 8) as u256) << 64) | + ((*vector::borrow(data, cur + 9) as u256) << 72) | + ((*vector::borrow(data, cur + 10) as u256) << 80) | + ((*vector::borrow(data, cur + 11) as u256) << 88) | + ((*vector::borrow(data, cur + 12) as u256) << 96) | + ((*vector::borrow(data, cur + 13) as u256) << 104) | + ((*vector::borrow(data, cur + 14) as u256) << 112) | + ((*vector::borrow(data, cur + 15) as u256) << 120) | + ((*vector::borrow(data, cur + 16) as u256) << 128) | + ((*vector::borrow(data, cur + 17) as u256) << 136) | + ((*vector::borrow(data, cur + 18) as u256) << 144) | + ((*vector::borrow(data, cur + 19) as u256) << 152) | + ((*vector::borrow(data, cur + 20) as u256) << 160) | + ((*vector::borrow(data, cur + 21) as u256) << 168) | + ((*vector::borrow(data, cur + 22) as u256) << 176) | + ((*vector::borrow(data, cur + 23) as u256) << 184) | + ((*vector::borrow(data, cur + 24) as u256) << 192) | + ((*vector::borrow(data, cur + 25) as u256) << 200) | + ((*vector::borrow(data, cur + 26) as u256) << 208) | + ((*vector::borrow(data, cur + 27) as u256) << 216) | + ((*vector::borrow(data, cur + 28) as u256) << 224) | + ((*vector::borrow(data, cur + 29) as u256) << 232) | + ((*vector::borrow(data, cur + 30) as u256) << 240) | + ((*vector::borrow(data, cur + 31) as u256) << 248) + ; + + stream.cur = stream.cur + 32; + res + } + + /// Deserializes a `u256` value from the stream. + public entry fun deserialize_u256_entry(data: vector, cursor: u64) { + let stream = BCSStream { + data: data, + cur: cursor, + }; + deserialize_u256(&mut stream); + } + + /// Deserializes an array of BCS deserializable elements from the stream. + /// First, reads the length of the vector, which is in uleb128 format. + /// After determining the length, it then reads the contents of the vector. + /// The `elem_deserializer` lambda expression is used sequentially to deserialize each element of the vector. + public inline fun deserialize_vector(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): vector { + let len = deserialize_uleb128(stream); + let v = vector::empty(); + + let i = 0; + while (i < len) { + vector::push_back(&mut v, elem_deserializer(stream)); + i = i + 1; + }; + + v + } + + /// Deserializes utf-8 `String` from the stream. + /// First, reads the length of the String, which is in uleb128 format. + /// After determining the length, it then reads the contents of the String. + public fun deserialize_string(stream: &mut BCSStream): String { + let len = deserialize_uleb128(stream); + let data = &stream.data; + let cur = stream.cur; + + assert!(cur + len <= vector::length(data), error::out_of_range(EOUT_OF_BYTES)); + + let res = string::utf8(vector::slice(data, cur, cur + len)); + stream.cur = cur + len; + + res + } + + /// Deserializes `Option` from the stream. + /// First, reads a single byte representing the presence (0x01) or absence (0x00) of data. + /// After determining the presence of data, it then reads the actual data if present. + /// The `elem_deserializer` lambda expression is used to deserialize the element contained within the `Option`. + public inline fun deserialize_option(stream: &mut BCSStream, elem_deserializer: |&mut BCSStream| E): Option { + let is_data = deserialize_bool(stream); + if (is_data) { + option::some(elem_deserializer(stream)) + } else { + option::none() + } + } +} diff --git a/aptos-move/framework/aptos-stdlib/sources/bcs_stream.spec.move b/aptos-move/framework/aptos-stdlib/sources/bcs_stream.spec.move new file mode 100644 index 0000000000000..d1088fd5c393e --- /dev/null +++ b/aptos-move/framework/aptos-stdlib/sources/bcs_stream.spec.move @@ -0,0 +1,5 @@ +spec aptos_std::bcs_stream { + spec module { + pragma verify = false; + } +} diff --git a/aptos-move/framework/aptos-stdlib/sources/from_bcs.move b/aptos-move/framework/aptos-stdlib/sources/from_bcs.move index 045e77821d385..5cc33845d1b17 100644 --- a/aptos-move/framework/aptos-stdlib/sources/from_bcs.move +++ b/aptos-move/framework/aptos-stdlib/sources/from_bcs.move @@ -70,7 +70,6 @@ module aptos_std::from_bcs { friend aptos_std::any; friend aptos_std::copyable_any; - #[test_only] use std::bcs; diff --git a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs index b6f9d1d1d8c06..ccfc2c1b68590 100644 --- a/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs +++ b/aptos-move/framework/cached-packages/src/aptos_framework_sdk_builder.rs @@ -165,6 +165,24 @@ pub enum EntryFunctionCall { /// authority of the new authentication key. AccountSetOriginatingAddress {}, + /// Update dispatchable authenticator that enables account abstraction. + /// Note: it is a private entry function that can only be called directly from transaction. + AccountAbstractionAddDispatchableAuthenticationFunction { + module_address: AccountAddress, + module_name: Vec, + function_name: Vec, + }, + + AccountAbstractionRemoveDispatchableAuthenticationFunction { + module_address: AccountAddress, + module_name: Vec, + function_name: Vec, + }, + + /// Update dispatchable authenticator that disables account abstraction. + /// Note: it is a private entry function that can only be called directly from transaction. + AccountAbstractionRemoveDispatchableAuthenticator {}, + /// Batch version of APT transfer. AptosAccountBatchTransfer { recipients: Vec, @@ -1225,6 +1243,27 @@ impl EntryFunctionCall { cap_update_table, ), AccountSetOriginatingAddress {} => account_set_originating_address(), + AccountAbstractionAddDispatchableAuthenticationFunction { + module_address, + module_name, + function_name, + } => account_abstraction_add_dispatchable_authentication_function( + module_address, + module_name, + function_name, + ), + AccountAbstractionRemoveDispatchableAuthenticationFunction { + module_address, + module_name, + function_name, + } => account_abstraction_remove_dispatchable_authentication_function( + module_address, + module_name, + function_name, + ), + AccountAbstractionRemoveDispatchableAuthenticator {} => { + account_abstraction_remove_dispatchable_authenticator() + }, AptosAccountBatchTransfer { recipients, amounts, @@ -2106,6 +2145,71 @@ pub fn account_set_originating_address() -> TransactionPayload { )) } +/// Update dispatchable authenticator that enables account abstraction. +/// Note: it is a private entry function that can only be called directly from transaction. +pub fn account_abstraction_add_dispatchable_authentication_function( + module_address: AccountAddress, + module_name: Vec, + function_name: Vec, +) -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("account_abstraction").to_owned(), + ), + ident_str!("add_dispatchable_authentication_function").to_owned(), + vec![], + vec![ + bcs::to_bytes(&module_address).unwrap(), + bcs::to_bytes(&module_name).unwrap(), + bcs::to_bytes(&function_name).unwrap(), + ], + )) +} + +pub fn account_abstraction_remove_dispatchable_authentication_function( + module_address: AccountAddress, + module_name: Vec, + function_name: Vec, +) -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("account_abstraction").to_owned(), + ), + ident_str!("remove_dispatchable_authentication_function").to_owned(), + vec![], + vec![ + bcs::to_bytes(&module_address).unwrap(), + bcs::to_bytes(&module_name).unwrap(), + bcs::to_bytes(&function_name).unwrap(), + ], + )) +} + +/// Update dispatchable authenticator that disables account abstraction. +/// Note: it is a private entry function that can only be called directly from transaction. +pub fn account_abstraction_remove_dispatchable_authenticator() -> TransactionPayload { + TransactionPayload::EntryFunction(EntryFunction::new( + ModuleId::new( + AccountAddress::new([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, + ]), + ident_str!("account_abstraction").to_owned(), + ), + ident_str!("remove_dispatchable_authenticator").to_owned(), + vec![], + vec![], + )) +} + /// Batch version of APT transfer. pub fn aptos_account_batch_transfer( recipients: Vec, @@ -5201,6 +5305,48 @@ mod decoder { } } + pub fn account_abstraction_add_dispatchable_authentication_function( + payload: &TransactionPayload, + ) -> Option { + if let TransactionPayload::EntryFunction(script) = payload { + Some( + EntryFunctionCall::AccountAbstractionAddDispatchableAuthenticationFunction { + module_address: bcs::from_bytes(script.args().get(0)?).ok()?, + module_name: bcs::from_bytes(script.args().get(1)?).ok()?, + function_name: bcs::from_bytes(script.args().get(2)?).ok()?, + }, + ) + } else { + None + } + } + + pub fn account_abstraction_remove_dispatchable_authentication_function( + payload: &TransactionPayload, + ) -> Option { + if let TransactionPayload::EntryFunction(script) = payload { + Some( + EntryFunctionCall::AccountAbstractionRemoveDispatchableAuthenticationFunction { + module_address: bcs::from_bytes(script.args().get(0)?).ok()?, + module_name: bcs::from_bytes(script.args().get(1)?).ok()?, + function_name: bcs::from_bytes(script.args().get(2)?).ok()?, + }, + ) + } else { + None + } + } + + pub fn account_abstraction_remove_dispatchable_authenticator( + payload: &TransactionPayload, + ) -> Option { + if let TransactionPayload::EntryFunction(_script) = payload { + Some(EntryFunctionCall::AccountAbstractionRemoveDispatchableAuthenticator {}) + } else { + None + } + } + pub fn aptos_account_batch_transfer(payload: &TransactionPayload) -> Option { if let TransactionPayload::EntryFunction(script) = payload { Some(EntryFunctionCall::AptosAccountBatchTransfer { @@ -6969,6 +7115,18 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazy + +Whether the account abstraction is enabled. + +Lifetime: transient + + +
const ACCOUNT_ABSTRACTION: u64 = 85;
+
+ + + @@ -3387,6 +3401,52 @@ Deprecated feature + + + + +## Function `get_account_abstraction_feature` + + + +
public fun get_account_abstraction_feature(): u64
+
+ + + +
+Implementation + + +
public fun get_account_abstraction_feature(): u64 { ACCOUNT_ABSTRACTION }
+
+ + + +
+ + + +## Function `is_account_abstraction_enabled` + + + +
public fun is_account_abstraction_enabled(): bool
+
+ + + +
+Implementation + + +
public fun is_account_abstraction_enabled(): bool acquires Features {
+    is_enabled(ACCOUNT_ABSTRACTION)
+}
+
+ + +
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index 6ff204e4dd834..28de7017df8d9 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -623,6 +623,17 @@ module std::features { is_enabled(PERMISSIONED_SIGNER) } + /// Whether the account abstraction is enabled. + /// + /// Lifetime: transient + const ACCOUNT_ABSTRACTION: u64 = 85; + + public fun get_account_abstraction_feature(): u64 { ACCOUNT_ABSTRACTION } + + public fun is_account_abstraction_enabled(): bool acquires Features { + is_enabled(ACCOUNT_ABSTRACTION) + } + // ============================================================================================ // Feature Flag Implementation diff --git a/aptos-move/framework/src/natives/account_abstraction.rs b/aptos-move/framework/src/natives/account_abstraction.rs new file mode 100644 index 0000000000000..65bff16aad776 --- /dev/null +++ b/aptos-move/framework/src/natives/account_abstraction.rs @@ -0,0 +1,61 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use super::function_info::extract_function_info; +use aptos_gas_schedule::gas_params::natives::aptos_framework::DISPATCHABLE_AUTHENTICATE_DISPATCH_BASE; +use aptos_native_interface::{ + RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, +}; +use move_vm_runtime::native_functions::NativeFunction; +use move_vm_types::{loaded_data::runtime_types::Type, values::Value}; +use smallvec::SmallVec; +use std::collections::VecDeque; + +/*************************************************************************************************** + * native fun dispatchable_authenticate + * + * Directs control flow based on the last argument. We use the same native function implementation + * for all dispatching native. + * gas cost: a flat fee because we charged the loading of those modules previously. + * + **************************************************************************************************/ +pub(crate) fn native_dispatch( + context: &mut SafeNativeContext, + ty_args: Vec, + mut arguments: VecDeque, +) -> SafeNativeResult> { + let (module_name, func_name) = extract_function_info(&mut arguments)?; + // Check if the module is already properly charged in this transaction. + if !module_name.address().is_special() + && !context + .traversal_context() + .visited + .contains_key(&(module_name.address(), module_name.name())) + { + return Err(SafeNativeError::Abort { abort_code: 4 }); + } + + // Use Error to instruct the VM to perform a function call dispatch. + Err(SafeNativeError::FunctionDispatch { + cost: context.eval_gas(DISPATCHABLE_AUTHENTICATE_DISPATCH_BASE), + module_name, + func_name, + ty_args, + args: arguments.into_iter().collect(), + }) +} + +/*************************************************************************************************** + * module + * + **************************************************************************************************/ +pub fn make_all( + builder: &SafeNativeBuilder, +) -> impl Iterator + '_ { + let natives = [( + "dispatchable_authenticate", + native_dispatch as RawSafeNative, + )]; + + builder.make_named_natives(natives) +} diff --git a/aptos-move/framework/src/natives/dispatchable_fungible_asset.rs b/aptos-move/framework/src/natives/dispatchable_fungible_asset.rs index 9554c5d163377..b9dc026345868 100644 --- a/aptos-move/framework/src/natives/dispatchable_fungible_asset.rs +++ b/aptos-move/framework/src/natives/dispatchable_fungible_asset.rs @@ -25,11 +25,19 @@ pub(crate) fn native_dispatch( ) -> SafeNativeResult> { let (module_name, func_name) = extract_function_info(&mut arguments)?; // Check if the module is already properly charged in this transaction. - if !context - .traversal_context() - .visited - .contains_key(&(module_name.address(), module_name.name())) - { + let is_err = if context.get_feature_flags().is_account_abstraction_enabled() { + !module_name.address().is_special() + && !context + .traversal_context() + .visited + .contains_key(&(module_name.address(), module_name.name())) + } else { + !context + .traversal_context() + .visited + .contains_key(&(module_name.address(), module_name.name())) + }; + if is_err { return Err(SafeNativeError::Abort { abort_code: 4 }); } diff --git a/aptos-move/framework/src/natives/function_info.rs b/aptos-move/framework/src/natives/function_info.rs index 2884ad8c82141..e30061b6fb806 100644 --- a/aptos-move/framework/src/natives/function_info.rs +++ b/aptos-move/framework/src/natives/function_info.rs @@ -83,11 +83,19 @@ fn native_check_dispatch_type_compatibility_impl( let (rhs, rhs_id) = { let (module, func) = extract_function_info(&mut arguments)?; - if !context - .traversal_context() - .visited - .contains_key(&(module.address(), module.name())) - { + let is_err = if context.get_feature_flags().is_account_abstraction_enabled() { + !module.address().is_special() + && !context + .traversal_context() + .visited + .contains_key(&(module.address(), module.name())) + } else { + !context + .traversal_context() + .visited + .contains_key(&(module.address(), module.name())) + }; + if is_err { return Err(SafeNativeError::Abort { abort_code: 2 }); } ( diff --git a/aptos-move/framework/src/natives/mod.rs b/aptos-move/framework/src/natives/mod.rs index 956c590b4afc8..4fc3c8ec76e07 100644 --- a/aptos-move/framework/src/natives/mod.rs +++ b/aptos-move/framework/src/natives/mod.rs @@ -3,6 +3,8 @@ // SPDX-License-Identifier: Apache-2.0 pub mod account; + +pub mod account_abstraction; pub mod aggregator_natives; pub mod code; pub mod consensus_config; @@ -96,6 +98,10 @@ pub fn all_natives( "permissioned_signer", permissioned_signer::make_all(builder) ); + add_natives_from_module!( + "account_abstraction", + account_abstraction::make_all(builder) + ); if inject_create_signer_for_gov_sim { add_natives_from_module!( diff --git a/aptos-move/move-examples/account_abstraction/bls12381_single_key/Move.toml b/aptos-move/move-examples/account_abstraction/bls12381_single_key/Move.toml new file mode 100644 index 0000000000000..18c97ec8116e9 --- /dev/null +++ b/aptos-move/move-examples/account_abstraction/bls12381_single_key/Move.toml @@ -0,0 +1,10 @@ +[package] +name = "AA" +version = "0.0.0" + +[addresses] +aa = "_" + +[dependencies] +AptosFramework = { local = "../../../framework/aptos-framework" } +AptosStdlib = { local = "../../../framework/aptos-stdlib" } diff --git a/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/single_key.move b/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/single_key.move new file mode 100644 index 0000000000000..25e1e37c0ffa7 --- /dev/null +++ b/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/single_key.move @@ -0,0 +1,58 @@ +module aa::single_key { + use std::option; + use std::signer; + use aptos_std::bls12381::{Self, PublicKey}; + use aptos_framework::auth_data::{Self, AbstractionAuthData}; + + /// Only fungible asset metadata owner can make changes. + const EINVALID_PUBLIC_KEY: u64 = 1; + const EPUBLIC_KEY_NOT_FOUND: u64 = 2; + const EINVALID_SIGNATURE: u64 = 3; + + /// Store the BLS public key. + struct BLSPublicKey has key, drop { + key: PublicKey + } + + /// Update the public key. + public entry fun update_public_key(admin: &signer, key: vector) acquires BLSPublicKey { + let addr = signer::address_of(admin); + let pubkey_opt = bls12381::public_key_from_bytes(key); + assert!(option::is_some(&pubkey_opt), EINVALID_PUBLIC_KEY); + if (exists(addr)) { + let pubkey = &mut borrow_global_mut(addr).key; + *pubkey = option::destroy_some(pubkey_opt); + } else { + move_to(admin, BLSPublicKey { + key: option::destroy_some(pubkey_opt) + }) + }; + } + + /// Authorization function for account abstraction. + public fun authenticate( + account: signer, + signing_data: AbstractionAuthData, + ): signer acquires BLSPublicKey { + let addr = signer::address_of(&account); + assert!(exists(addr), EPUBLIC_KEY_NOT_FOUND); + let pubkey = &borrow_global(addr).key; + assert!( + bls12381::verify_normal_signature( + &bls12381::signature_from_bytes(*auth_data::authenticator(&signing_data)), + pubkey, + *auth_data::digest(&signing_data) + ), + EINVALID_SIGNATURE + ); + account + } + + /// cleanup storage footprint before transition to another authentication scheme. + public entry fun cleanup(admin: &signer) acquires BLSPublicKey { + let addr = signer::address_of(admin); + if (exists(addr)) { + move_from(addr); + }; + } +} diff --git a/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/test_functions.move b/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/test_functions.move new file mode 100644 index 0000000000000..b522b2fd6393e --- /dev/null +++ b/aptos-move/move-examples/account_abstraction/bls12381_single_key/sources/test_functions.move @@ -0,0 +1,10 @@ +module aa::test_functions { + use aptos_framework::aptos_account; + + /// test function for multi-agent aa. + public entry fun transfer_to_the_last(a: &signer, b: &signer, c: &signer, d: address) { + aptos_account::transfer(a, d, 1); + aptos_account::transfer(b, d, 1); + aptos_account::transfer(c, d, 1); + } +} diff --git a/crates/indexer/src/models/signatures.rs b/crates/indexer/src/models/signatures.rs index f6ea964a5e4fb..1c9bef2a76a23 100644 --- a/crates/indexer/src/models/signatures.rs +++ b/crates/indexer/src/models/signatures.rs @@ -5,8 +5,9 @@ use crate::{models::transactions::Transaction, schema::signatures, util::standardize_address}; use anyhow::{Context, Result}; use aptos_api_types::{ - AccountSignature as APIAccountSignature, Ed25519Signature as APIEd25519Signature, - FeePayerSignature as APIFeePayerSignature, MultiAgentSignature as APIMultiAgentSignature, + AbstractionSignature as APIAbstractionSignature, AccountSignature as APIAccountSignature, + Ed25519Signature as APIEd25519Signature, FeePayerSignature as APIFeePayerSignature, + MultiAgentSignature as APIMultiAgentSignature, MultiEd25519Signature as APIMultiEd25519Signature, MultiKeySignature as APIMultiKeySignature, NoAccountSignature as APINoAccountSignature, SingleKeySignature as APISingleKeySignature, TransactionSignature as APITransactionSignature, @@ -313,6 +314,17 @@ impl Signature { multi_agent_index, override_address, )], + APIAccountSignature::AbstractionSignature(sig) => { + vec![Self::parse_abstraction_signature( + sig, + sender, + transaction_version, + transaction_block_height, + is_sender_primary, + multi_agent_index, + override_address, + )] + }, } } @@ -390,4 +402,29 @@ impl Signature { multi_sig_index: 0, } } + + fn parse_abstraction_signature( + _s: &APIAbstractionSignature, + sender: &String, + transaction_version: i64, + transaction_block_height: i64, + is_sender_primary: bool, + multi_agent_index: i64, + override_address: Option<&String>, + ) -> Self { + let signer = standardize_address(override_address.unwrap_or(sender)); + Self { + transaction_version, + transaction_block_height, + signer, + is_sender_primary, + type_: String::from("abstraction_signature"), + public_key: "Not implemented".into(), + threshold: 1, + public_key_indices: serde_json::Value::Array(vec![]), + signature: "Not implemented".into(), + multi_agent_index, + multi_sig_index: 0, + } + } } diff --git a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs index 434b6947f3e20..b4058fbed142c 100644 --- a/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs +++ b/ecosystem/indexer-grpc/indexer-grpc-fullnode/src/convert.rs @@ -675,6 +675,15 @@ pub fn convert_account_signature( "[Indexer Fullnode] Indexer should never see transactions with NoAccountSignature" ) }, + AccountSignature::AbstractionSignature(s) => ( + transaction::account_signature::Type::Abstraction, + transaction::account_signature::Signature::Abstraction( + transaction::AbstractionSignature { + function_info: s.function_info.to_owned(), + signature: s.auth_data.inner().to_owned(), + }, + ), + ), }; transaction::AccountSignature { diff --git a/execution/executor/src/metrics.rs b/execution/executor/src/metrics.rs index c47a31967bc8c..587e0f9612550 100644 --- a/execution/executor/src/metrics.rs +++ b/execution/executor/src/metrics.rs @@ -417,6 +417,11 @@ pub fn update_counters_for_processed_chunk( .with_label_values(&[process_type, "NoAccountAuthenticator"]) .inc(); }, + AccountAuthenticator::Abstraction { .. } => { + PROCESSED_TXNS_AUTHENTICATOR + .with_label_values(&[process_type, "AbstractionAuthenticator"]) + .inc(); + }, }; } diff --git a/execution/executor/tests/internal_indexer_test.rs b/execution/executor/tests/internal_indexer_test.rs index cd55845261243..b80161c391cca 100644 --- a/execution/executor/tests/internal_indexer_test.rs +++ b/execution/executor/tests/internal_indexer_test.rs @@ -237,12 +237,14 @@ fn test_db_indexer_data() { ident_str!("features"), ident_str!("from_bcs"), ident_str!("pool_u64"), + ident_str!("auth_data"), ident_str!("secp256k1"), ident_str!("timestamp"), ident_str!("type_info"), ident_str!("aggregator"), ident_str!("aptos_coin"), ident_str!("aptos_hash"), + ident_str!("bcs_stream"), ident_str!("big_vector"), ident_str!("bit_vector"), ident_str!("capability"), @@ -292,6 +294,7 @@ fn test_db_indexer_data() { ident_str!("randomness_config"), ident_str!("table_with_length"), ident_str!("aggregator_factory"), + ident_str!("account_abstraction"), ident_str!("governance_proposal"), ident_str!("optional_aggregator"), ident_str!("permissioned_signer"), diff --git a/protos/proto/aptos/transaction/v1/transaction.proto b/protos/proto/aptos/transaction/v1/transaction.proto index 19331b83bf293..7d3ee043a5e91 100644 --- a/protos/proto/aptos/transaction/v1/transaction.proto +++ b/protos/proto/aptos/transaction/v1/transaction.proto @@ -581,6 +581,11 @@ message MultiKeySignature { uint32 signatures_required = 3; } +message AbstractionSignature { + string function_info = 1; + bytes signature = 2; +} + message SingleSender { AccountSignature sender = 1; } @@ -592,6 +597,7 @@ message AccountSignature { TYPE_MULTI_ED25519 = 2; TYPE_SINGLE_KEY = 4; TYPE_MULTI_KEY = 5; + TYPE_ABSTRACTION = 6; reserved 3; } @@ -603,6 +609,7 @@ message AccountSignature { // 4 is reserved. SingleKeySignature single_key_signature = 5; MultiKeySignature multi_key_signature = 6; + AbstractionSignature abstraction = 7; } } diff --git a/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.py b/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.py index 7dcb01b77feb9..f11d41489c2a2 100644 --- a/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.py +++ b/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.py @@ -17,7 +17,7 @@ ) DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n&aptos/transaction/v1/transaction.proto\x12\x14\x61ptos.transaction.v1\x1a$aptos/util/timestamp/timestamp.proto"\x9a\x01\n\x05\x42lock\x12\x32\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x12\n\x06height\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x37\n\x0ctransactions\x18\x03 \x03(\x0b\x32!.aptos.transaction.v1.Transaction\x12\x10\n\x08\x63hain_id\x18\x04 \x01(\r"\xda\x07\n\x0bTransaction\x12\x32\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x13\n\x07version\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x33\n\x04info\x18\x03 \x01(\x0b\x32%.aptos.transaction.v1.TransactionInfo\x12\x11\n\x05\x65poch\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x18\n\x0c\x62lock_height\x18\x05 \x01(\x04\x42\x02\x30\x01\x12?\n\x04type\x18\x06 \x01(\x0e\x32\x31.aptos.transaction.v1.Transaction.TransactionType\x12H\n\x0e\x62lock_metadata\x18\x07 \x01(\x0b\x32..aptos.transaction.v1.BlockMetadataTransactionH\x00\x12;\n\x07genesis\x18\x08 \x01(\x0b\x32(.aptos.transaction.v1.GenesisTransactionH\x00\x12L\n\x10state_checkpoint\x18\t \x01(\x0b\x32\x30.aptos.transaction.v1.StateCheckpointTransactionH\x00\x12\x35\n\x04user\x18\n \x01(\x0b\x32%.aptos.transaction.v1.UserTransactionH\x00\x12?\n\tvalidator\x18\x15 \x01(\x0b\x32*.aptos.transaction.v1.ValidatorTransactionH\x00\x12H\n\x0e\x62lock_epilogue\x18\x17 \x01(\x0b\x32..aptos.transaction.v1.BlockEpilogueTransactionH\x00\x12<\n\tsize_info\x18\x16 \x01(\x0b\x32).aptos.transaction.v1.TransactionSizeInfo"\xfd\x01\n\x0fTransactionType\x12 \n\x1cTRANSACTION_TYPE_UNSPECIFIED\x10\x00\x12\x1c\n\x18TRANSACTION_TYPE_GENESIS\x10\x01\x12#\n\x1fTRANSACTION_TYPE_BLOCK_METADATA\x10\x02\x12%\n!TRANSACTION_TYPE_STATE_CHECKPOINT\x10\x03\x12\x19\n\x15TRANSACTION_TYPE_USER\x10\x04\x12\x1e\n\x1aTRANSACTION_TYPE_VALIDATOR\x10\x14\x12#\n\x1fTRANSACTION_TYPE_BLOCK_EPILOGUE\x10\x15\x42\n\n\x08txn_data"\xbe\x01\n\x18\x42lockMetadataTransaction\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x05round\x18\x02 \x01(\x04\x42\x02\x30\x01\x12+\n\x06\x65vents\x18\x03 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event\x12#\n\x1bprevious_block_votes_bitvec\x18\x04 \x01(\x0c\x12\x10\n\x08proposer\x18\x05 \x01(\t\x12\x1f\n\x17\x66\x61iled_proposer_indices\x18\x06 \x03(\r"r\n\x12GenesisTransaction\x12/\n\x07payload\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.WriteSet\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x1c\n\x1aStateCheckpointTransaction"\xfa\n\n\x14ValidatorTransaction\x12[\n\x13observed_jwk_update\x18\x01 \x01(\x0b\x32<.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdateH\x00\x12J\n\ndkg_update\x18\x02 \x01(\x0b\x32\x34.aptos.transaction.v1.ValidatorTransaction.DkgUpdateH\x00\x12+\n\x06\x65vents\x18\x03 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event\x1a\xc4\x07\n\x11ObservedJwkUpdate\x12s\n\x17quorum_certified_update\x18\x01 \x01(\x0b\x32R.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.QuorumCertifiedUpdate\x1a\x8d\x04\n\x14\x45xportedProviderJWKs\x12\x0e\n\x06issuer\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x04\x12\x63\n\x04jwks\x18\x03 \x03(\x0b\x32U.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK\x1a\xee\x02\n\x03JWK\x12\x7f\n\x0funsupported_jwk\x18\x01 \x01(\x0b\x32\x64.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK.UnsupportedJWKH\x00\x12h\n\x03rsa\x18\x02 \x01(\x0b\x32Y.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK.RSAH\x00\x1a\x42\n\x03RSA\x12\x0b\n\x03kid\x18\x01 \x01(\t\x12\x0b\n\x03kty\x18\x02 \x01(\t\x12\x0b\n\x03\x61lg\x18\x03 \x01(\t\x12\t\n\x01\x65\x18\x04 \x01(\t\x12\t\n\x01n\x18\x05 \x01(\t\x1a-\n\x0eUnsupportedJWK\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x42\t\n\x07JwkType\x1a\x41\n\x1a\x45xportedAggregateSignature\x12\x16\n\x0esigner_indices\x18\x01 \x03(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x1a\xe6\x01\n\x15QuorumCertifiedUpdate\x12\x61\n\x06update\x18\x01 \x01(\x0b\x32Q.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs\x12j\n\tmulti_sig\x18\x02 \x01(\x0b\x32W.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedAggregateSignature\x1a\xa8\x01\n\tDkgUpdate\x12Z\n\x0e\x64kg_transcript\x18\x01 \x01(\x0b\x32\x42.aptos.transaction.v1.ValidatorTransaction.DkgUpdate.DkgTranscript\x1a?\n\rDkgTranscript\x12\r\n\x05\x65poch\x18\x01 \x01(\x04\x12\x0e\n\x06\x61uthor\x18\x02 \x01(\t\x12\x0f\n\x07payload\x18\x03 \x01(\x0c\x42\x1a\n\x18ValidatorTransactionType"n\n\x18\x42lockEpilogueTransaction\x12?\n\x0e\x62lock_end_info\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.BlockEndInfoH\x00\x88\x01\x01\x42\x11\n\x0f_block_end_info"\x9e\x01\n\x0c\x42lockEndInfo\x12\x1f\n\x17\x62lock_gas_limit_reached\x18\x01 \x01(\x08\x12"\n\x1a\x62lock_output_limit_reached\x18\x02 \x01(\x08\x12\'\n\x1f\x62lock_effective_block_gas_units\x18\x03 \x01(\x04\x12 \n\x18\x62lock_approx_output_size\x18\x04 \x01(\x04"}\n\x0fUserTransaction\x12=\n\x07request\x18\x01 \x01(\x0b\x32,.aptos.transaction.v1.UserTransactionRequest\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x9f\x01\n\x05\x45vent\x12+\n\x03key\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.EventKey\x12\x1b\n\x0fsequence_number\x18\x02 \x01(\x04\x42\x02\x30\x01\x12,\n\x04type\x18\x03 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x10\n\x08type_str\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t"\xa1\x02\n\x0fTransactionInfo\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x19\n\x11state_change_hash\x18\x02 \x01(\x0c\x12\x17\n\x0f\x65vent_root_hash\x18\x03 \x01(\x0c\x12"\n\x15state_checkpoint_hash\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x08gas_used\x18\x05 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x07success\x18\x06 \x01(\x08\x12\x11\n\tvm_status\x18\x07 \x01(\t\x12\x1d\n\x15\x61\x63\x63umulator_root_hash\x18\x08 \x01(\x0c\x12\x35\n\x07\x63hanges\x18\t \x03(\x0b\x32$.aptos.transaction.v1.WriteSetChangeB\x18\n\x16_state_checkpoint_hash"@\n\x08\x45ventKey\x12\x1b\n\x0f\x63reation_number\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x17\n\x0f\x61\x63\x63ount_address\x18\x02 \x01(\t"\xb0\x02\n\x16UserTransactionRequest\x12\x0e\n\x06sender\x18\x01 \x01(\t\x12\x1b\n\x0fsequence_number\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x1a\n\x0emax_gas_amount\x18\x03 \x01(\x04\x42\x02\x30\x01\x12\x1a\n\x0egas_unit_price\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x42\n\x19\x65xpiration_timestamp_secs\x18\x05 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x39\n\x07payload\x18\x06 \x01(\x0b\x32(.aptos.transaction.v1.TransactionPayload\x12\x32\n\tsignature\x18\x07 \x01(\x0b\x32\x1f.aptos.transaction.v1.Signature"\xda\x02\n\x08WriteSet\x12\x43\n\x0ewrite_set_type\x18\x01 \x01(\x0e\x32+.aptos.transaction.v1.WriteSet.WriteSetType\x12@\n\x10script_write_set\x18\x02 \x01(\x0b\x32$.aptos.transaction.v1.ScriptWriteSetH\x00\x12@\n\x10\x64irect_write_set\x18\x03 \x01(\x0b\x32$.aptos.transaction.v1.DirectWriteSetH\x00"x\n\x0cWriteSetType\x12\x1e\n\x1aWRITE_SET_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1fWRITE_SET_TYPE_SCRIPT_WRITE_SET\x10\x01\x12#\n\x1fWRITE_SET_TYPE_DIRECT_WRITE_SET\x10\x02\x42\x0b\n\twrite_set"Y\n\x0eScriptWriteSet\x12\x12\n\nexecute_as\x18\x01 \x01(\t\x12\x33\n\x06script\x18\x02 \x01(\x0b\x32#.aptos.transaction.v1.ScriptPayload"}\n\x0e\x44irectWriteSet\x12>\n\x10write_set_change\x18\x01 \x03(\x0b\x32$.aptos.transaction.v1.WriteSetChange\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x89\x05\n\x0eWriteSetChange\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).aptos.transaction.v1.WriteSetChange.Type\x12;\n\rdelete_module\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.DeleteModuleH\x00\x12?\n\x0f\x64\x65lete_resource\x18\x03 \x01(\x0b\x32$.aptos.transaction.v1.DeleteResourceH\x00\x12\x42\n\x11\x64\x65lete_table_item\x18\x04 \x01(\x0b\x32%.aptos.transaction.v1.DeleteTableItemH\x00\x12\x39\n\x0cwrite_module\x18\x05 \x01(\x0b\x32!.aptos.transaction.v1.WriteModuleH\x00\x12=\n\x0ewrite_resource\x18\x06 \x01(\x0b\x32#.aptos.transaction.v1.WriteResourceH\x00\x12@\n\x10write_table_item\x18\x07 \x01(\x0b\x32$.aptos.transaction.v1.WriteTableItemH\x00"\xb5\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12TYPE_DELETE_MODULE\x10\x01\x12\x18\n\x14TYPE_DELETE_RESOURCE\x10\x02\x12\x1a\n\x16TYPE_DELETE_TABLE_ITEM\x10\x03\x12\x15\n\x11TYPE_WRITE_MODULE\x10\x04\x12\x17\n\x13TYPE_WRITE_RESOURCE\x10\x05\x12\x19\n\x15TYPE_WRITE_TABLE_ITEM\x10\x06\x42\x08\n\x06\x63hange"k\n\x0c\x44\x65leteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x32\n\x06module\x18\x03 \x01(\x0b\x32".aptos.transaction.v1.MoveModuleId"~\n\x0e\x44\x65leteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x31\n\x04type\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTag\x12\x10\n\x08type_str\x18\x04 \x01(\t"{\n\x0f\x44\x65leteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\x0c\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x33\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32%.aptos.transaction.v1.DeleteTableData"0\n\x0f\x44\x65leteTableData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t"n\n\x0bWriteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x36\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32(.aptos.transaction.v1.MoveModuleBytecode"\x8b\x01\n\rWriteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x31\n\x04type\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTag\x12\x10\n\x08type_str\x18\x04 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\t"R\n\x0eWriteTableData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x12\n\nvalue_type\x18\x04 \x01(\t"y\n\x0eWriteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\x0c\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x32\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32$.aptos.transaction.v1.WriteTableData"\x8c\x04\n\x12TransactionPayload\x12;\n\x04type\x18\x01 \x01(\x0e\x32-.aptos.transaction.v1.TransactionPayload.Type\x12L\n\x16\x65ntry_function_payload\x18\x02 \x01(\x0b\x32*.aptos.transaction.v1.EntryFunctionPayloadH\x00\x12=\n\x0escript_payload\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.ScriptPayloadH\x00\x12\x42\n\x11write_set_payload\x18\x05 \x01(\x0b\x32%.aptos.transaction.v1.WriteSetPayloadH\x00\x12\x41\n\x10multisig_payload\x18\x06 \x01(\x0b\x32%.aptos.transaction.v1.MultisigPayloadH\x00"\x93\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bTYPE_ENTRY_FUNCTION_PAYLOAD\x10\x01\x12\x17\n\x13TYPE_SCRIPT_PAYLOAD\x10\x02\x12\x1a\n\x16TYPE_WRITE_SET_PAYLOAD\x10\x04\x12\x19\n\x15TYPE_MULTISIG_PAYLOAD\x10\x05"\x04\x08\x03\x10\x03\x42\t\n\x07payloadJ\x04\x08\x04\x10\x05"\xb9\x01\n\x14\x45ntryFunctionPayload\x12\x37\n\x08\x66unction\x18\x01 \x01(\x0b\x32%.aptos.transaction.v1.EntryFunctionId\x12\x36\n\x0etype_arguments\x18\x02 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x11\n\targuments\x18\x03 \x03(\t\x12\x1d\n\x15\x65ntry_function_id_str\x18\x04 \x01(\t"W\n\x12MoveScriptBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12/\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.MoveFunction"\x92\x01\n\rScriptPayload\x12\x36\n\x04\x63ode\x18\x01 \x01(\x0b\x32(.aptos.transaction.v1.MoveScriptBytecode\x12\x36\n\x0etype_arguments\x18\x02 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x11\n\targuments\x18\x03 \x03(\t"\x97\x01\n\x0fMultisigPayload\x12\x18\n\x10multisig_address\x18\x01 \x01(\t\x12R\n\x13transaction_payload\x18\x02 \x01(\x0b\x32\x30.aptos.transaction.v1.MultisigTransactionPayloadH\x00\x88\x01\x01\x42\x16\n\x14_transaction_payload"\xf9\x01\n\x1aMultisigTransactionPayload\x12\x43\n\x04type\x18\x01 \x01(\x0e\x32\x35.aptos.transaction.v1.MultisigTransactionPayload.Type\x12L\n\x16\x65ntry_function_payload\x18\x02 \x01(\x0b\x32*.aptos.transaction.v1.EntryFunctionPayloadH\x00"=\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bTYPE_ENTRY_FUNCTION_PAYLOAD\x10\x01\x42\t\n\x07payload"U\n\x12MoveModuleBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12-\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32 .aptos.transaction.v1.MoveModule"\xd2\x01\n\nMoveModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x33\n\x07\x66riends\x18\x03 \x03(\x0b\x32".aptos.transaction.v1.MoveModuleId\x12=\n\x11\x65xposed_functions\x18\x04 \x03(\x0b\x32".aptos.transaction.v1.MoveFunction\x12\x31\n\x07structs\x18\x05 \x03(\x0b\x32 .aptos.transaction.v1.MoveStruct"\x92\x03\n\x0cMoveFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x41\n\nvisibility\x18\x02 \x01(\x0e\x32-.aptos.transaction.v1.MoveFunction.Visibility\x12\x10\n\x08is_entry\x18\x03 \x01(\x08\x12O\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x32.aptos.transaction.v1.MoveFunctionGenericTypeParam\x12.\n\x06params\x18\x05 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12.\n\x06return\x18\x06 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType"n\n\nVisibility\x12\x1a\n\x16VISIBILITY_UNSPECIFIED\x10\x00\x12\x16\n\x12VISIBILITY_PRIVATE\x10\x01\x12\x15\n\x11VISIBILITY_PUBLIC\x10\x02\x12\x15\n\x11VISIBILITY_FRIEND\x10\x03"\xfb\x01\n\nMoveStruct\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tis_native\x18\x02 \x01(\x08\x12\x10\n\x08is_event\x18\x06 \x01(\x08\x12\x34\n\tabilities\x18\x03 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility\x12M\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x30.aptos.transaction.v1.MoveStructGenericTypeParam\x12\x35\n\x06\x66ields\x18\x05 \x03(\x0b\x32%.aptos.transaction.v1.MoveStructField"h\n\x1aMoveStructGenericTypeParam\x12\x36\n\x0b\x63onstraints\x18\x01 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility\x12\x12\n\nis_phantom\x18\x02 \x01(\x08"M\n\x0fMoveStructField\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\x04type\x18\x02 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveType"V\n\x1cMoveFunctionGenericTypeParam\x12\x36\n\x0b\x63onstraints\x18\x01 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility"\xf8\x02\n\x08MoveType\x12-\n\x04type\x18\x01 \x01(\x0e\x32\x1f.aptos.transaction.v1.MoveTypes\x12\x30\n\x06vector\x18\x03 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveTypeH\x00\x12\x35\n\x06struct\x18\x04 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTagH\x00\x12"\n\x18generic_type_param_index\x18\x05 \x01(\rH\x00\x12\x41\n\treference\x18\x06 \x01(\x0b\x32,.aptos.transaction.v1.MoveType.ReferenceTypeH\x00\x12\x14\n\nunparsable\x18\x07 \x01(\tH\x00\x1aL\n\rReferenceType\x12\x0f\n\x07mutable\x18\x01 \x01(\x08\x12*\n\x02to\x18\x02 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveTypeB\t\n\x07\x63ontent"D\n\x0fWriteSetPayload\x12\x31\n\twrite_set\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.WriteSet"S\n\x0f\x45ntryFunctionId\x12\x32\n\x06module\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.MoveModuleId\x12\x0c\n\x04name\x18\x02 \x01(\t"-\n\x0cMoveModuleId\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t"{\n\rMoveStructTag\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06module\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12;\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType"\x9b\x04\n\tSignature\x12\x32\n\x04type\x18\x01 \x01(\x0e\x32$.aptos.transaction.v1.Signature.Type\x12\x39\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32&.aptos.transaction.v1.Ed25519SignatureH\x00\x12\x44\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32+.aptos.transaction.v1.MultiEd25519SignatureH\x00\x12@\n\x0bmulti_agent\x18\x04 \x01(\x0b\x32).aptos.transaction.v1.MultiAgentSignatureH\x00\x12<\n\tfee_payer\x18\x05 \x01(\x0b\x32\'.aptos.transaction.v1.FeePayerSignatureH\x00\x12;\n\rsingle_sender\x18\x07 \x01(\x0b\x32".aptos.transaction.v1.SingleSenderH\x00"\x8e\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x16\n\x12TYPE_MULTI_ED25519\x10\x02\x12\x14\n\x10TYPE_MULTI_AGENT\x10\x03\x12\x12\n\x0eTYPE_FEE_PAYER\x10\x04\x12\x16\n\x12TYPE_SINGLE_SENDER\x10\x06"\x04\x08\x05\x10\x05\x42\x0b\n\tsignature"9\n\x10\x45\x64\x32\x35\x35\x31\x39Signature\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c"o\n\x15MultiEd25519Signature\x12\x13\n\x0bpublic_keys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\x11\n\tthreshold\x18\x03 \x01(\r\x12\x1a\n\x12public_key_indices\x18\x04 \x03(\r"\xb4\x01\n\x13MultiAgentSignature\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12\x41\n\x11secondary_signers\x18\x03 \x03(\x0b\x32&.aptos.transaction.v1.AccountSignature"\x8f\x02\n\x11\x46\x65\x65PayerSignature\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12\x41\n\x11secondary_signers\x18\x03 \x03(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12\x19\n\x11\x66\x65\x65_payer_address\x18\x04 \x01(\t\x12@\n\x10\x66\x65\x65_payer_signer\x18\x05 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature"\xec\x01\n\x0c\x41nyPublicKey\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.aptos.transaction.v1.AnyPublicKey.Type\x12\x12\n\npublic_key\x18\x02 \x01(\x0c"\x90\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x18\n\x14TYPE_SECP256K1_ECDSA\x10\x02\x12\x18\n\x14TYPE_SECP256R1_ECDSA\x10\x03\x12\x10\n\x0cTYPE_KEYLESS\x10\x04\x12\x1a\n\x16TYPE_FEDERATED_KEYLESS\x10\x05"\xb9\x03\n\x0c\x41nySignature\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.aptos.transaction.v1.AnySignature.Type\x12\x15\n\tsignature\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12\x30\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x03 \x01(\x0b\x32\x1d.aptos.transaction.v1.Ed25519H\x00\x12?\n\x0fsecp256k1_ecdsa\x18\x04 \x01(\x0b\x32$.aptos.transaction.v1.Secp256k1EcdsaH\x00\x12\x32\n\x08webauthn\x18\x05 \x01(\x0b\x32\x1e.aptos.transaction.v1.WebAuthnH\x00\x12\x30\n\x07keyless\x18\x06 \x01(\x0b\x32\x1d.aptos.transaction.v1.KeylessH\x00"m\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x18\n\x14TYPE_SECP256K1_ECDSA\x10\x02\x12\x11\n\rTYPE_WEBAUTHN\x10\x03\x12\x10\n\x0cTYPE_KEYLESS\x10\x04\x42\x13\n\x11signature_variant"\x1c\n\x07\x45\x64\x32\x35\x35\x31\x39\x12\x11\n\tsignature\x18\x01 \x01(\x0c"#\n\x0eSecp256k1Ecdsa\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x1d\n\x08WebAuthn\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x1c\n\x07Keyless\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x83\x01\n\x12SingleKeySignature\x12\x36\n\npublic_key\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.AnyPublicKey\x12\x35\n\tsignature\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.AnySignature"X\n\x10IndexedSignature\x12\r\n\x05index\x18\x01 \x01(\r\x12\x35\n\tsignature\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.AnySignature"\xa5\x01\n\x11MultiKeySignature\x12\x37\n\x0bpublic_keys\x18\x01 \x03(\x0b\x32".aptos.transaction.v1.AnyPublicKey\x12:\n\nsignatures\x18\x02 \x03(\x0b\x32&.aptos.transaction.v1.IndexedSignature\x12\x1b\n\x13signatures_required\x18\x03 \x01(\r"F\n\x0cSingleSender\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature"\xe4\x03\n\x10\x41\x63\x63ountSignature\x12\x39\n\x04type\x18\x01 \x01(\x0e\x32+.aptos.transaction.v1.AccountSignature.Type\x12\x39\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32&.aptos.transaction.v1.Ed25519SignatureH\x00\x12\x44\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32+.aptos.transaction.v1.MultiEd25519SignatureH\x00\x12H\n\x14single_key_signature\x18\x05 \x01(\x0b\x32(.aptos.transaction.v1.SingleKeySignatureH\x00\x12\x46\n\x13multi_key_signature\x18\x06 \x01(\x0b\x32\'.aptos.transaction.v1.MultiKeySignatureH\x00"u\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x16\n\x12TYPE_MULTI_ED25519\x10\x02\x12\x13\n\x0fTYPE_SINGLE_KEY\x10\x04\x12\x12\n\x0eTYPE_MULTI_KEY\x10\x05"\x04\x08\x03\x10\x03\x42\x0b\n\tsignature"\xb1\x01\n\x13TransactionSizeInfo\x12\x19\n\x11transaction_bytes\x18\x01 \x01(\r\x12<\n\x0f\x65vent_size_info\x18\x02 \x03(\x0b\x32#.aptos.transaction.v1.EventSizeInfo\x12\x41\n\x12write_op_size_info\x18\x03 \x03(\x0b\x32%.aptos.transaction.v1.WriteOpSizeInfo"<\n\rEventSizeInfo\x12\x16\n\x0etype_tag_bytes\x18\x01 \x01(\r\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\r"9\n\x0fWriteOpSizeInfo\x12\x11\n\tkey_bytes\x18\x01 \x01(\r\x12\x13\n\x0bvalue_bytes\x18\x02 \x01(\r*\xea\x02\n\tMoveTypes\x12\x1a\n\x16MOVE_TYPES_UNSPECIFIED\x10\x00\x12\x13\n\x0fMOVE_TYPES_BOOL\x10\x01\x12\x11\n\rMOVE_TYPES_U8\x10\x02\x12\x12\n\x0eMOVE_TYPES_U16\x10\x0c\x12\x12\n\x0eMOVE_TYPES_U32\x10\r\x12\x12\n\x0eMOVE_TYPES_U64\x10\x03\x12\x13\n\x0fMOVE_TYPES_U128\x10\x04\x12\x13\n\x0fMOVE_TYPES_U256\x10\x0e\x12\x16\n\x12MOVE_TYPES_ADDRESS\x10\x05\x12\x15\n\x11MOVE_TYPES_SIGNER\x10\x06\x12\x15\n\x11MOVE_TYPES_VECTOR\x10\x07\x12\x15\n\x11MOVE_TYPES_STRUCT\x10\x08\x12!\n\x1dMOVE_TYPES_GENERIC_TYPE_PARAM\x10\t\x12\x18\n\x14MOVE_TYPES_REFERENCE\x10\n\x12\x19\n\x15MOVE_TYPES_UNPARSABLE\x10\x0b*\x87\x01\n\x0bMoveAbility\x12\x1c\n\x18MOVE_ABILITY_UNSPECIFIED\x10\x00\x12\x15\n\x11MOVE_ABILITY_COPY\x10\x01\x12\x15\n\x11MOVE_ABILITY_DROP\x10\x02\x12\x16\n\x12MOVE_ABILITY_STORE\x10\x03\x12\x14\n\x10MOVE_ABILITY_KEY\x10\x04\x62\x06proto3' + b'\n&aptos/transaction/v1/transaction.proto\x12\x14\x61ptos.transaction.v1\x1a$aptos/util/timestamp/timestamp.proto"\x9a\x01\n\x05\x42lock\x12\x32\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x12\n\x06height\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x37\n\x0ctransactions\x18\x03 \x03(\x0b\x32!.aptos.transaction.v1.Transaction\x12\x10\n\x08\x63hain_id\x18\x04 \x01(\r"\xda\x07\n\x0bTransaction\x12\x32\n\ttimestamp\x18\x01 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x13\n\x07version\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x33\n\x04info\x18\x03 \x01(\x0b\x32%.aptos.transaction.v1.TransactionInfo\x12\x11\n\x05\x65poch\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x18\n\x0c\x62lock_height\x18\x05 \x01(\x04\x42\x02\x30\x01\x12?\n\x04type\x18\x06 \x01(\x0e\x32\x31.aptos.transaction.v1.Transaction.TransactionType\x12H\n\x0e\x62lock_metadata\x18\x07 \x01(\x0b\x32..aptos.transaction.v1.BlockMetadataTransactionH\x00\x12;\n\x07genesis\x18\x08 \x01(\x0b\x32(.aptos.transaction.v1.GenesisTransactionH\x00\x12L\n\x10state_checkpoint\x18\t \x01(\x0b\x32\x30.aptos.transaction.v1.StateCheckpointTransactionH\x00\x12\x35\n\x04user\x18\n \x01(\x0b\x32%.aptos.transaction.v1.UserTransactionH\x00\x12?\n\tvalidator\x18\x15 \x01(\x0b\x32*.aptos.transaction.v1.ValidatorTransactionH\x00\x12H\n\x0e\x62lock_epilogue\x18\x17 \x01(\x0b\x32..aptos.transaction.v1.BlockEpilogueTransactionH\x00\x12<\n\tsize_info\x18\x16 \x01(\x0b\x32).aptos.transaction.v1.TransactionSizeInfo"\xfd\x01\n\x0fTransactionType\x12 \n\x1cTRANSACTION_TYPE_UNSPECIFIED\x10\x00\x12\x1c\n\x18TRANSACTION_TYPE_GENESIS\x10\x01\x12#\n\x1fTRANSACTION_TYPE_BLOCK_METADATA\x10\x02\x12%\n!TRANSACTION_TYPE_STATE_CHECKPOINT\x10\x03\x12\x19\n\x15TRANSACTION_TYPE_USER\x10\x04\x12\x1e\n\x1aTRANSACTION_TYPE_VALIDATOR\x10\x14\x12#\n\x1fTRANSACTION_TYPE_BLOCK_EPILOGUE\x10\x15\x42\n\n\x08txn_data"\xbe\x01\n\x18\x42lockMetadataTransaction\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\x05round\x18\x02 \x01(\x04\x42\x02\x30\x01\x12+\n\x06\x65vents\x18\x03 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event\x12#\n\x1bprevious_block_votes_bitvec\x18\x04 \x01(\x0c\x12\x10\n\x08proposer\x18\x05 \x01(\t\x12\x1f\n\x17\x66\x61iled_proposer_indices\x18\x06 \x03(\r"r\n\x12GenesisTransaction\x12/\n\x07payload\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.WriteSet\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x1c\n\x1aStateCheckpointTransaction"\xfa\n\n\x14ValidatorTransaction\x12[\n\x13observed_jwk_update\x18\x01 \x01(\x0b\x32<.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdateH\x00\x12J\n\ndkg_update\x18\x02 \x01(\x0b\x32\x34.aptos.transaction.v1.ValidatorTransaction.DkgUpdateH\x00\x12+\n\x06\x65vents\x18\x03 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event\x1a\xc4\x07\n\x11ObservedJwkUpdate\x12s\n\x17quorum_certified_update\x18\x01 \x01(\x0b\x32R.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.QuorumCertifiedUpdate\x1a\x8d\x04\n\x14\x45xportedProviderJWKs\x12\x0e\n\x06issuer\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x04\x12\x63\n\x04jwks\x18\x03 \x03(\x0b\x32U.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK\x1a\xee\x02\n\x03JWK\x12\x7f\n\x0funsupported_jwk\x18\x01 \x01(\x0b\x32\x64.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK.UnsupportedJWKH\x00\x12h\n\x03rsa\x18\x02 \x01(\x0b\x32Y.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs.JWK.RSAH\x00\x1a\x42\n\x03RSA\x12\x0b\n\x03kid\x18\x01 \x01(\t\x12\x0b\n\x03kty\x18\x02 \x01(\t\x12\x0b\n\x03\x61lg\x18\x03 \x01(\t\x12\t\n\x01\x65\x18\x04 \x01(\t\x12\t\n\x01n\x18\x05 \x01(\t\x1a-\n\x0eUnsupportedJWK\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x42\t\n\x07JwkType\x1a\x41\n\x1a\x45xportedAggregateSignature\x12\x16\n\x0esigner_indices\x18\x01 \x03(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x1a\xe6\x01\n\x15QuorumCertifiedUpdate\x12\x61\n\x06update\x18\x01 \x01(\x0b\x32Q.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedProviderJWKs\x12j\n\tmulti_sig\x18\x02 \x01(\x0b\x32W.aptos.transaction.v1.ValidatorTransaction.ObservedJwkUpdate.ExportedAggregateSignature\x1a\xa8\x01\n\tDkgUpdate\x12Z\n\x0e\x64kg_transcript\x18\x01 \x01(\x0b\x32\x42.aptos.transaction.v1.ValidatorTransaction.DkgUpdate.DkgTranscript\x1a?\n\rDkgTranscript\x12\r\n\x05\x65poch\x18\x01 \x01(\x04\x12\x0e\n\x06\x61uthor\x18\x02 \x01(\t\x12\x0f\n\x07payload\x18\x03 \x01(\x0c\x42\x1a\n\x18ValidatorTransactionType"n\n\x18\x42lockEpilogueTransaction\x12?\n\x0e\x62lock_end_info\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.BlockEndInfoH\x00\x88\x01\x01\x42\x11\n\x0f_block_end_info"\x9e\x01\n\x0c\x42lockEndInfo\x12\x1f\n\x17\x62lock_gas_limit_reached\x18\x01 \x01(\x08\x12"\n\x1a\x62lock_output_limit_reached\x18\x02 \x01(\x08\x12\'\n\x1f\x62lock_effective_block_gas_units\x18\x03 \x01(\x04\x12 \n\x18\x62lock_approx_output_size\x18\x04 \x01(\x04"}\n\x0fUserTransaction\x12=\n\x07request\x18\x01 \x01(\x0b\x32,.aptos.transaction.v1.UserTransactionRequest\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x9f\x01\n\x05\x45vent\x12+\n\x03key\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.EventKey\x12\x1b\n\x0fsequence_number\x18\x02 \x01(\x04\x42\x02\x30\x01\x12,\n\x04type\x18\x03 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x10\n\x08type_str\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t"\xa1\x02\n\x0fTransactionInfo\x12\x0c\n\x04hash\x18\x01 \x01(\x0c\x12\x19\n\x11state_change_hash\x18\x02 \x01(\x0c\x12\x17\n\x0f\x65vent_root_hash\x18\x03 \x01(\x0c\x12"\n\x15state_checkpoint_hash\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x12\x14\n\x08gas_used\x18\x05 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x07success\x18\x06 \x01(\x08\x12\x11\n\tvm_status\x18\x07 \x01(\t\x12\x1d\n\x15\x61\x63\x63umulator_root_hash\x18\x08 \x01(\x0c\x12\x35\n\x07\x63hanges\x18\t \x03(\x0b\x32$.aptos.transaction.v1.WriteSetChangeB\x18\n\x16_state_checkpoint_hash"@\n\x08\x45ventKey\x12\x1b\n\x0f\x63reation_number\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x17\n\x0f\x61\x63\x63ount_address\x18\x02 \x01(\t"\xb0\x02\n\x16UserTransactionRequest\x12\x0e\n\x06sender\x18\x01 \x01(\t\x12\x1b\n\x0fsequence_number\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x1a\n\x0emax_gas_amount\x18\x03 \x01(\x04\x42\x02\x30\x01\x12\x1a\n\x0egas_unit_price\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x42\n\x19\x65xpiration_timestamp_secs\x18\x05 \x01(\x0b\x32\x1f.aptos.util.timestamp.Timestamp\x12\x39\n\x07payload\x18\x06 \x01(\x0b\x32(.aptos.transaction.v1.TransactionPayload\x12\x32\n\tsignature\x18\x07 \x01(\x0b\x32\x1f.aptos.transaction.v1.Signature"\xda\x02\n\x08WriteSet\x12\x43\n\x0ewrite_set_type\x18\x01 \x01(\x0e\x32+.aptos.transaction.v1.WriteSet.WriteSetType\x12@\n\x10script_write_set\x18\x02 \x01(\x0b\x32$.aptos.transaction.v1.ScriptWriteSetH\x00\x12@\n\x10\x64irect_write_set\x18\x03 \x01(\x0b\x32$.aptos.transaction.v1.DirectWriteSetH\x00"x\n\x0cWriteSetType\x12\x1e\n\x1aWRITE_SET_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1fWRITE_SET_TYPE_SCRIPT_WRITE_SET\x10\x01\x12#\n\x1fWRITE_SET_TYPE_DIRECT_WRITE_SET\x10\x02\x42\x0b\n\twrite_set"Y\n\x0eScriptWriteSet\x12\x12\n\nexecute_as\x18\x01 \x01(\t\x12\x33\n\x06script\x18\x02 \x01(\x0b\x32#.aptos.transaction.v1.ScriptPayload"}\n\x0e\x44irectWriteSet\x12>\n\x10write_set_change\x18\x01 \x03(\x0b\x32$.aptos.transaction.v1.WriteSetChange\x12+\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x1b.aptos.transaction.v1.Event"\x89\x05\n\x0eWriteSetChange\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).aptos.transaction.v1.WriteSetChange.Type\x12;\n\rdelete_module\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.DeleteModuleH\x00\x12?\n\x0f\x64\x65lete_resource\x18\x03 \x01(\x0b\x32$.aptos.transaction.v1.DeleteResourceH\x00\x12\x42\n\x11\x64\x65lete_table_item\x18\x04 \x01(\x0b\x32%.aptos.transaction.v1.DeleteTableItemH\x00\x12\x39\n\x0cwrite_module\x18\x05 \x01(\x0b\x32!.aptos.transaction.v1.WriteModuleH\x00\x12=\n\x0ewrite_resource\x18\x06 \x01(\x0b\x32#.aptos.transaction.v1.WriteResourceH\x00\x12@\n\x10write_table_item\x18\x07 \x01(\x0b\x32$.aptos.transaction.v1.WriteTableItemH\x00"\xb5\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12TYPE_DELETE_MODULE\x10\x01\x12\x18\n\x14TYPE_DELETE_RESOURCE\x10\x02\x12\x1a\n\x16TYPE_DELETE_TABLE_ITEM\x10\x03\x12\x15\n\x11TYPE_WRITE_MODULE\x10\x04\x12\x17\n\x13TYPE_WRITE_RESOURCE\x10\x05\x12\x19\n\x15TYPE_WRITE_TABLE_ITEM\x10\x06\x42\x08\n\x06\x63hange"k\n\x0c\x44\x65leteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x32\n\x06module\x18\x03 \x01(\x0b\x32".aptos.transaction.v1.MoveModuleId"~\n\x0e\x44\x65leteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x31\n\x04type\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTag\x12\x10\n\x08type_str\x18\x04 \x01(\t"{\n\x0f\x44\x65leteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\x0c\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x33\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32%.aptos.transaction.v1.DeleteTableData"0\n\x0f\x44\x65leteTableData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t"n\n\x0bWriteModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x36\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32(.aptos.transaction.v1.MoveModuleBytecode"\x8b\x01\n\rWriteResource\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x16\n\x0estate_key_hash\x18\x02 \x01(\x0c\x12\x31\n\x04type\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTag\x12\x10\n\x08type_str\x18\x04 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\t"R\n\x0eWriteTableData\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x10\n\x08key_type\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x12\n\nvalue_type\x18\x04 \x01(\t"y\n\x0eWriteTableItem\x12\x16\n\x0estate_key_hash\x18\x01 \x01(\x0c\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x32\n\x04\x64\x61ta\x18\x04 \x01(\x0b\x32$.aptos.transaction.v1.WriteTableData"\x8c\x04\n\x12TransactionPayload\x12;\n\x04type\x18\x01 \x01(\x0e\x32-.aptos.transaction.v1.TransactionPayload.Type\x12L\n\x16\x65ntry_function_payload\x18\x02 \x01(\x0b\x32*.aptos.transaction.v1.EntryFunctionPayloadH\x00\x12=\n\x0escript_payload\x18\x03 \x01(\x0b\x32#.aptos.transaction.v1.ScriptPayloadH\x00\x12\x42\n\x11write_set_payload\x18\x05 \x01(\x0b\x32%.aptos.transaction.v1.WriteSetPayloadH\x00\x12\x41\n\x10multisig_payload\x18\x06 \x01(\x0b\x32%.aptos.transaction.v1.MultisigPayloadH\x00"\x93\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bTYPE_ENTRY_FUNCTION_PAYLOAD\x10\x01\x12\x17\n\x13TYPE_SCRIPT_PAYLOAD\x10\x02\x12\x1a\n\x16TYPE_WRITE_SET_PAYLOAD\x10\x04\x12\x19\n\x15TYPE_MULTISIG_PAYLOAD\x10\x05"\x04\x08\x03\x10\x03\x42\t\n\x07payloadJ\x04\x08\x04\x10\x05"\xb9\x01\n\x14\x45ntryFunctionPayload\x12\x37\n\x08\x66unction\x18\x01 \x01(\x0b\x32%.aptos.transaction.v1.EntryFunctionId\x12\x36\n\x0etype_arguments\x18\x02 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x11\n\targuments\x18\x03 \x03(\t\x12\x1d\n\x15\x65ntry_function_id_str\x18\x04 \x01(\t"W\n\x12MoveScriptBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12/\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.MoveFunction"\x92\x01\n\rScriptPayload\x12\x36\n\x04\x63ode\x18\x01 \x01(\x0b\x32(.aptos.transaction.v1.MoveScriptBytecode\x12\x36\n\x0etype_arguments\x18\x02 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12\x11\n\targuments\x18\x03 \x03(\t"\x97\x01\n\x0fMultisigPayload\x12\x18\n\x10multisig_address\x18\x01 \x01(\t\x12R\n\x13transaction_payload\x18\x02 \x01(\x0b\x32\x30.aptos.transaction.v1.MultisigTransactionPayloadH\x00\x88\x01\x01\x42\x16\n\x14_transaction_payload"\xf9\x01\n\x1aMultisigTransactionPayload\x12\x43\n\x04type\x18\x01 \x01(\x0e\x32\x35.aptos.transaction.v1.MultisigTransactionPayload.Type\x12L\n\x16\x65ntry_function_payload\x18\x02 \x01(\x0b\x32*.aptos.transaction.v1.EntryFunctionPayloadH\x00"=\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bTYPE_ENTRY_FUNCTION_PAYLOAD\x10\x01\x42\t\n\x07payload"U\n\x12MoveModuleBytecode\x12\x10\n\x08\x62ytecode\x18\x01 \x01(\x0c\x12-\n\x03\x61\x62i\x18\x02 \x01(\x0b\x32 .aptos.transaction.v1.MoveModule"\xd2\x01\n\nMoveModule\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x33\n\x07\x66riends\x18\x03 \x03(\x0b\x32".aptos.transaction.v1.MoveModuleId\x12=\n\x11\x65xposed_functions\x18\x04 \x03(\x0b\x32".aptos.transaction.v1.MoveFunction\x12\x31\n\x07structs\x18\x05 \x03(\x0b\x32 .aptos.transaction.v1.MoveStruct"\x92\x03\n\x0cMoveFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x41\n\nvisibility\x18\x02 \x01(\x0e\x32-.aptos.transaction.v1.MoveFunction.Visibility\x12\x10\n\x08is_entry\x18\x03 \x01(\x08\x12O\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x32.aptos.transaction.v1.MoveFunctionGenericTypeParam\x12.\n\x06params\x18\x05 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType\x12.\n\x06return\x18\x06 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType"n\n\nVisibility\x12\x1a\n\x16VISIBILITY_UNSPECIFIED\x10\x00\x12\x16\n\x12VISIBILITY_PRIVATE\x10\x01\x12\x15\n\x11VISIBILITY_PUBLIC\x10\x02\x12\x15\n\x11VISIBILITY_FRIEND\x10\x03"\xfb\x01\n\nMoveStruct\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tis_native\x18\x02 \x01(\x08\x12\x10\n\x08is_event\x18\x06 \x01(\x08\x12\x34\n\tabilities\x18\x03 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility\x12M\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x30.aptos.transaction.v1.MoveStructGenericTypeParam\x12\x35\n\x06\x66ields\x18\x05 \x03(\x0b\x32%.aptos.transaction.v1.MoveStructField"h\n\x1aMoveStructGenericTypeParam\x12\x36\n\x0b\x63onstraints\x18\x01 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility\x12\x12\n\nis_phantom\x18\x02 \x01(\x08"M\n\x0fMoveStructField\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\x04type\x18\x02 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveType"V\n\x1cMoveFunctionGenericTypeParam\x12\x36\n\x0b\x63onstraints\x18\x01 \x03(\x0e\x32!.aptos.transaction.v1.MoveAbility"\xf8\x02\n\x08MoveType\x12-\n\x04type\x18\x01 \x01(\x0e\x32\x1f.aptos.transaction.v1.MoveTypes\x12\x30\n\x06vector\x18\x03 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveTypeH\x00\x12\x35\n\x06struct\x18\x04 \x01(\x0b\x32#.aptos.transaction.v1.MoveStructTagH\x00\x12"\n\x18generic_type_param_index\x18\x05 \x01(\rH\x00\x12\x41\n\treference\x18\x06 \x01(\x0b\x32,.aptos.transaction.v1.MoveType.ReferenceTypeH\x00\x12\x14\n\nunparsable\x18\x07 \x01(\tH\x00\x1aL\n\rReferenceType\x12\x0f\n\x07mutable\x18\x01 \x01(\x08\x12*\n\x02to\x18\x02 \x01(\x0b\x32\x1e.aptos.transaction.v1.MoveTypeB\t\n\x07\x63ontent"D\n\x0fWriteSetPayload\x12\x31\n\twrite_set\x18\x01 \x01(\x0b\x32\x1e.aptos.transaction.v1.WriteSet"S\n\x0f\x45ntryFunctionId\x12\x32\n\x06module\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.MoveModuleId\x12\x0c\n\x04name\x18\x02 \x01(\t"-\n\x0cMoveModuleId\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t"{\n\rMoveStructTag\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0e\n\x06module\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12;\n\x13generic_type_params\x18\x04 \x03(\x0b\x32\x1e.aptos.transaction.v1.MoveType"\x9b\x04\n\tSignature\x12\x32\n\x04type\x18\x01 \x01(\x0e\x32$.aptos.transaction.v1.Signature.Type\x12\x39\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32&.aptos.transaction.v1.Ed25519SignatureH\x00\x12\x44\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32+.aptos.transaction.v1.MultiEd25519SignatureH\x00\x12@\n\x0bmulti_agent\x18\x04 \x01(\x0b\x32).aptos.transaction.v1.MultiAgentSignatureH\x00\x12<\n\tfee_payer\x18\x05 \x01(\x0b\x32\'.aptos.transaction.v1.FeePayerSignatureH\x00\x12;\n\rsingle_sender\x18\x07 \x01(\x0b\x32".aptos.transaction.v1.SingleSenderH\x00"\x8e\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x16\n\x12TYPE_MULTI_ED25519\x10\x02\x12\x14\n\x10TYPE_MULTI_AGENT\x10\x03\x12\x12\n\x0eTYPE_FEE_PAYER\x10\x04\x12\x16\n\x12TYPE_SINGLE_SENDER\x10\x06"\x04\x08\x05\x10\x05\x42\x0b\n\tsignature"9\n\x10\x45\x64\x32\x35\x35\x31\x39Signature\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c"o\n\x15MultiEd25519Signature\x12\x13\n\x0bpublic_keys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\x11\n\tthreshold\x18\x03 \x01(\r\x12\x1a\n\x12public_key_indices\x18\x04 \x03(\r"\xb4\x01\n\x13MultiAgentSignature\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12\x41\n\x11secondary_signers\x18\x03 \x03(\x0b\x32&.aptos.transaction.v1.AccountSignature"\x8f\x02\n\x11\x46\x65\x65PayerSignature\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12"\n\x1asecondary_signer_addresses\x18\x02 \x03(\t\x12\x41\n\x11secondary_signers\x18\x03 \x03(\x0b\x32&.aptos.transaction.v1.AccountSignature\x12\x19\n\x11\x66\x65\x65_payer_address\x18\x04 \x01(\t\x12@\n\x10\x66\x65\x65_payer_signer\x18\x05 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature"\xec\x01\n\x0c\x41nyPublicKey\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.aptos.transaction.v1.AnyPublicKey.Type\x12\x12\n\npublic_key\x18\x02 \x01(\x0c"\x90\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x18\n\x14TYPE_SECP256K1_ECDSA\x10\x02\x12\x18\n\x14TYPE_SECP256R1_ECDSA\x10\x03\x12\x10\n\x0cTYPE_KEYLESS\x10\x04\x12\x1a\n\x16TYPE_FEDERATED_KEYLESS\x10\x05"\xb9\x03\n\x0c\x41nySignature\x12\x35\n\x04type\x18\x01 \x01(\x0e\x32\'.aptos.transaction.v1.AnySignature.Type\x12\x15\n\tsignature\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12\x30\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x03 \x01(\x0b\x32\x1d.aptos.transaction.v1.Ed25519H\x00\x12?\n\x0fsecp256k1_ecdsa\x18\x04 \x01(\x0b\x32$.aptos.transaction.v1.Secp256k1EcdsaH\x00\x12\x32\n\x08webauthn\x18\x05 \x01(\x0b\x32\x1e.aptos.transaction.v1.WebAuthnH\x00\x12\x30\n\x07keyless\x18\x06 \x01(\x0b\x32\x1d.aptos.transaction.v1.KeylessH\x00"m\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x18\n\x14TYPE_SECP256K1_ECDSA\x10\x02\x12\x11\n\rTYPE_WEBAUTHN\x10\x03\x12\x10\n\x0cTYPE_KEYLESS\x10\x04\x42\x13\n\x11signature_variant"\x1c\n\x07\x45\x64\x32\x35\x35\x31\x39\x12\x11\n\tsignature\x18\x01 \x01(\x0c"#\n\x0eSecp256k1Ecdsa\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x1d\n\x08WebAuthn\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x1c\n\x07Keyless\x12\x11\n\tsignature\x18\x01 \x01(\x0c"\x83\x01\n\x12SingleKeySignature\x12\x36\n\npublic_key\x18\x01 \x01(\x0b\x32".aptos.transaction.v1.AnyPublicKey\x12\x35\n\tsignature\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.AnySignature"X\n\x10IndexedSignature\x12\r\n\x05index\x18\x01 \x01(\r\x12\x35\n\tsignature\x18\x02 \x01(\x0b\x32".aptos.transaction.v1.AnySignature"\xa5\x01\n\x11MultiKeySignature\x12\x37\n\x0bpublic_keys\x18\x01 \x03(\x0b\x32".aptos.transaction.v1.AnyPublicKey\x12:\n\nsignatures\x18\x02 \x03(\x0b\x32&.aptos.transaction.v1.IndexedSignature\x12\x1b\n\x13signatures_required\x18\x03 \x01(\r"@\n\x14\x41\x62stractionSignature\x12\x15\n\rfunction_info\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c"F\n\x0cSingleSender\x12\x36\n\x06sender\x18\x01 \x01(\x0b\x32&.aptos.transaction.v1.AccountSignature"\xbe\x04\n\x10\x41\x63\x63ountSignature\x12\x39\n\x04type\x18\x01 \x01(\x0e\x32+.aptos.transaction.v1.AccountSignature.Type\x12\x39\n\x07\x65\x64\x32\x35\x35\x31\x39\x18\x02 \x01(\x0b\x32&.aptos.transaction.v1.Ed25519SignatureH\x00\x12\x44\n\rmulti_ed25519\x18\x03 \x01(\x0b\x32+.aptos.transaction.v1.MultiEd25519SignatureH\x00\x12H\n\x14single_key_signature\x18\x05 \x01(\x0b\x32(.aptos.transaction.v1.SingleKeySignatureH\x00\x12\x46\n\x13multi_key_signature\x18\x06 \x01(\x0b\x32\'.aptos.transaction.v1.MultiKeySignatureH\x00\x12\x41\n\x0b\x61\x62straction\x18\x07 \x01(\x0b\x32*.aptos.transaction.v1.AbstractionSignatureH\x00"\x8b\x01\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x10\n\x0cTYPE_ED25519\x10\x01\x12\x16\n\x12TYPE_MULTI_ED25519\x10\x02\x12\x13\n\x0fTYPE_SINGLE_KEY\x10\x04\x12\x12\n\x0eTYPE_MULTI_KEY\x10\x05\x12\x14\n\x10TYPE_ABSTRACTION\x10\x06"\x04\x08\x03\x10\x03\x42\x0b\n\tsignature"\xb1\x01\n\x13TransactionSizeInfo\x12\x19\n\x11transaction_bytes\x18\x01 \x01(\r\x12<\n\x0f\x65vent_size_info\x18\x02 \x03(\x0b\x32#.aptos.transaction.v1.EventSizeInfo\x12\x41\n\x12write_op_size_info\x18\x03 \x03(\x0b\x32%.aptos.transaction.v1.WriteOpSizeInfo"<\n\rEventSizeInfo\x12\x16\n\x0etype_tag_bytes\x18\x01 \x01(\r\x12\x13\n\x0btotal_bytes\x18\x02 \x01(\r"9\n\x0fWriteOpSizeInfo\x12\x11\n\tkey_bytes\x18\x01 \x01(\r\x12\x13\n\x0bvalue_bytes\x18\x02 \x01(\r*\xea\x02\n\tMoveTypes\x12\x1a\n\x16MOVE_TYPES_UNSPECIFIED\x10\x00\x12\x13\n\x0fMOVE_TYPES_BOOL\x10\x01\x12\x11\n\rMOVE_TYPES_U8\x10\x02\x12\x12\n\x0eMOVE_TYPES_U16\x10\x0c\x12\x12\n\x0eMOVE_TYPES_U32\x10\r\x12\x12\n\x0eMOVE_TYPES_U64\x10\x03\x12\x13\n\x0fMOVE_TYPES_U128\x10\x04\x12\x13\n\x0fMOVE_TYPES_U256\x10\x0e\x12\x16\n\x12MOVE_TYPES_ADDRESS\x10\x05\x12\x15\n\x11MOVE_TYPES_SIGNER\x10\x06\x12\x15\n\x11MOVE_TYPES_VECTOR\x10\x07\x12\x15\n\x11MOVE_TYPES_STRUCT\x10\x08\x12!\n\x1dMOVE_TYPES_GENERIC_TYPE_PARAM\x10\t\x12\x18\n\x14MOVE_TYPES_REFERENCE\x10\n\x12\x19\n\x15MOVE_TYPES_UNPARSABLE\x10\x0b*\x87\x01\n\x0bMoveAbility\x12\x1c\n\x18MOVE_ABILITY_UNSPECIFIED\x10\x00\x12\x15\n\x11MOVE_ABILITY_COPY\x10\x01\x12\x15\n\x11MOVE_ABILITY_DROP\x10\x02\x12\x16\n\x12MOVE_ABILITY_STORE\x10\x03\x12\x14\n\x10MOVE_ABILITY_KEY\x10\x04\x62\x06proto3' ) _globals = globals() @@ -57,10 +57,10 @@ ]._serialized_options = b"0\001" _ANYSIGNATURE.fields_by_name["signature"]._options = None _ANYSIGNATURE.fields_by_name["signature"]._serialized_options = b"\030\001" - _globals["_MOVETYPES"]._serialized_start = 12843 - _globals["_MOVETYPES"]._serialized_end = 13205 - _globals["_MOVEABILITY"]._serialized_start = 13208 - _globals["_MOVEABILITY"]._serialized_end = 13343 + _globals["_MOVETYPES"]._serialized_start = 12999 + _globals["_MOVETYPES"]._serialized_end = 13361 + _globals["_MOVEABILITY"]._serialized_start = 13364 + _globals["_MOVEABILITY"]._serialized_end = 13499 _globals["_BLOCK"]._serialized_start = 103 _globals["_BLOCK"]._serialized_end = 257 _globals["_TRANSACTION"]._serialized_start = 260 @@ -237,16 +237,18 @@ _globals["_INDEXEDSIGNATURE"]._serialized_end = 11812 _globals["_MULTIKEYSIGNATURE"]._serialized_start = 11815 _globals["_MULTIKEYSIGNATURE"]._serialized_end = 11980 - _globals["_SINGLESENDER"]._serialized_start = 11982 - _globals["_SINGLESENDER"]._serialized_end = 12052 - _globals["_ACCOUNTSIGNATURE"]._serialized_start = 12055 - _globals["_ACCOUNTSIGNATURE"]._serialized_end = 12539 - _globals["_ACCOUNTSIGNATURE_TYPE"]._serialized_start = 12409 - _globals["_ACCOUNTSIGNATURE_TYPE"]._serialized_end = 12526 - _globals["_TRANSACTIONSIZEINFO"]._serialized_start = 12542 - _globals["_TRANSACTIONSIZEINFO"]._serialized_end = 12719 - _globals["_EVENTSIZEINFO"]._serialized_start = 12721 - _globals["_EVENTSIZEINFO"]._serialized_end = 12781 - _globals["_WRITEOPSIZEINFO"]._serialized_start = 12783 - _globals["_WRITEOPSIZEINFO"]._serialized_end = 12840 + _globals["_ABSTRACTIONSIGNATURE"]._serialized_start = 11982 + _globals["_ABSTRACTIONSIGNATURE"]._serialized_end = 12046 + _globals["_SINGLESENDER"]._serialized_start = 12048 + _globals["_SINGLESENDER"]._serialized_end = 12118 + _globals["_ACCOUNTSIGNATURE"]._serialized_start = 12121 + _globals["_ACCOUNTSIGNATURE"]._serialized_end = 12695 + _globals["_ACCOUNTSIGNATURE_TYPE"]._serialized_start = 12543 + _globals["_ACCOUNTSIGNATURE_TYPE"]._serialized_end = 12682 + _globals["_TRANSACTIONSIZEINFO"]._serialized_start = 12698 + _globals["_TRANSACTIONSIZEINFO"]._serialized_end = 12875 + _globals["_EVENTSIZEINFO"]._serialized_start = 12877 + _globals["_EVENTSIZEINFO"]._serialized_end = 12937 + _globals["_WRITEOPSIZEINFO"]._serialized_start = 12939 + _globals["_WRITEOPSIZEINFO"]._serialized_end = 12996 # @@protoc_insertion_point(module_scope) diff --git a/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.pyi b/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.pyi index 54935f9e289d1..1367b643a9957 100644 --- a/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.pyi +++ b/protos/python/aptos_protos/aptos/transaction/v1/transaction_pb2.pyi @@ -1358,6 +1358,16 @@ class MultiKeySignature(_message.Message): signatures_required: _Optional[int] = ..., ) -> None: ... +class AbstractionSignature(_message.Message): + __slots__ = ["function_info", "signature"] + FUNCTION_INFO_FIELD_NUMBER: _ClassVar[int] + SIGNATURE_FIELD_NUMBER: _ClassVar[int] + function_info: str + signature: bytes + def __init__( + self, function_info: _Optional[str] = ..., signature: _Optional[bytes] = ... + ) -> None: ... + class SingleSender(_message.Message): __slots__ = ["sender"] SENDER_FIELD_NUMBER: _ClassVar[int] @@ -1373,6 +1383,7 @@ class AccountSignature(_message.Message): "multi_ed25519", "single_key_signature", "multi_key_signature", + "abstraction", ] class Type(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): @@ -1382,21 +1393,25 @@ class AccountSignature(_message.Message): TYPE_MULTI_ED25519: _ClassVar[AccountSignature.Type] TYPE_SINGLE_KEY: _ClassVar[AccountSignature.Type] TYPE_MULTI_KEY: _ClassVar[AccountSignature.Type] + TYPE_ABSTRACTION: _ClassVar[AccountSignature.Type] TYPE_UNSPECIFIED: AccountSignature.Type TYPE_ED25519: AccountSignature.Type TYPE_MULTI_ED25519: AccountSignature.Type TYPE_SINGLE_KEY: AccountSignature.Type TYPE_MULTI_KEY: AccountSignature.Type + TYPE_ABSTRACTION: AccountSignature.Type TYPE_FIELD_NUMBER: _ClassVar[int] ED25519_FIELD_NUMBER: _ClassVar[int] MULTI_ED25519_FIELD_NUMBER: _ClassVar[int] SINGLE_KEY_SIGNATURE_FIELD_NUMBER: _ClassVar[int] MULTI_KEY_SIGNATURE_FIELD_NUMBER: _ClassVar[int] + ABSTRACTION_FIELD_NUMBER: _ClassVar[int] type: AccountSignature.Type ed25519: Ed25519Signature multi_ed25519: MultiEd25519Signature single_key_signature: SingleKeySignature multi_key_signature: MultiKeySignature + abstraction: AbstractionSignature def __init__( self, type: _Optional[_Union[AccountSignature.Type, str]] = ..., @@ -1404,6 +1419,7 @@ class AccountSignature(_message.Message): multi_ed25519: _Optional[_Union[MultiEd25519Signature, _Mapping]] = ..., single_key_signature: _Optional[_Union[SingleKeySignature, _Mapping]] = ..., multi_key_signature: _Optional[_Union[MultiKeySignature, _Mapping]] = ..., + abstraction: _Optional[_Union[AbstractionSignature, _Mapping]] = ..., ) -> None: ... class TransactionSizeInfo(_message.Message): diff --git a/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.rs b/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.rs index 9045273d87043..74a4ad5408735 100644 --- a/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.rs +++ b/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // @generated +// This file is @generated by prost-build. /// Transaction is a simplified representation for the transaction /// happened on the chain. Mainly built for streaming into BigQuery. /// It matches with the structure defined for the transaction in Indexer. diff --git a/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.serde.rs b/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.serde.rs index 790f4c7101117..a4261dde1fdd7 100644 --- a/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.serde.rs +++ b/protos/rust/src/pb/aptos.bigquery_schema.transaction.v1.serde.rs @@ -17,7 +17,9 @@ impl serde::Serialize for Transaction { len += 1; } let mut struct_ser = serializer.serialize_struct("aptos.bigquery_schema.transaction.v1.Transaction", len)?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("version", ToString::to_string(&self.version).as_str())?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("blockHeight", ToString::to_string(&self.block_height).as_str())?; struct_ser.serialize_field("hash", &self.hash)?; struct_ser.serialize_field("type", &self.r#type)?; @@ -29,13 +31,18 @@ impl serde::Serialize for Transaction { if let Some(v) = self.state_checkpoint_hash.as_ref() { struct_ser.serialize_field("stateCheckpointHash", v)?; } + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("gasUsed", ToString::to_string(&self.gas_used).as_str())?; struct_ser.serialize_field("success", &self.success)?; struct_ser.serialize_field("vmStatus", &self.vm_status)?; struct_ser.serialize_field("accumulatorRootHash", &self.accumulator_root_hash)?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("numEvents", ToString::to_string(&self.num_events).as_str())?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("numWriteSetChanges", ToString::to_string(&self.num_write_set_changes).as_str())?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("epoch", ToString::to_string(&self.epoch).as_str())?; + #[allow(clippy::needless_borrow)] struct_ser.serialize_field("insertedAt", ToString::to_string(&self.inserted_at).as_str())?; struct_ser.end() } @@ -145,7 +152,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { formatter.write_str("struct aptos.bigquery_schema.transaction.v1.Transaction") } - fn visit_map(self, mut map: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -165,14 +172,14 @@ impl<'de> serde::Deserialize<'de> for Transaction { let mut num_write_set_changes__ = None; let mut epoch__ = None; let mut inserted_at__ = None; - while let Some(k) = map.next_key()? { + while let Some(k) = map_.next_key()? { match k { GeneratedField::Version => { if version__.is_some() { return Err(serde::de::Error::duplicate_field("version")); } version__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::BlockHeight => { @@ -180,77 +187,77 @@ impl<'de> serde::Deserialize<'de> for Transaction { return Err(serde::de::Error::duplicate_field("blockHeight")); } block_height__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::Hash => { if hash__.is_some() { return Err(serde::de::Error::duplicate_field("hash")); } - hash__ = Some(map.next_value()?); + hash__ = Some(map_.next_value()?); } GeneratedField::Type => { if r#type__.is_some() { return Err(serde::de::Error::duplicate_field("type")); } - r#type__ = Some(map.next_value()?); + r#type__ = Some(map_.next_value()?); } GeneratedField::Payload => { if payload__.is_some() { return Err(serde::de::Error::duplicate_field("payload")); } - payload__ = map.next_value()?; + payload__ = map_.next_value()?; } GeneratedField::StateChangeHash => { if state_change_hash__.is_some() { return Err(serde::de::Error::duplicate_field("stateChangeHash")); } - state_change_hash__ = Some(map.next_value()?); + state_change_hash__ = Some(map_.next_value()?); } GeneratedField::EventRootHash => { if event_root_hash__.is_some() { return Err(serde::de::Error::duplicate_field("eventRootHash")); } - event_root_hash__ = Some(map.next_value()?); + event_root_hash__ = Some(map_.next_value()?); } GeneratedField::StateCheckpointHash => { if state_checkpoint_hash__.is_some() { return Err(serde::de::Error::duplicate_field("stateCheckpointHash")); } - state_checkpoint_hash__ = map.next_value()?; + state_checkpoint_hash__ = map_.next_value()?; } GeneratedField::GasUsed => { if gas_used__.is_some() { return Err(serde::de::Error::duplicate_field("gasUsed")); } gas_used__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::Success => { if success__.is_some() { return Err(serde::de::Error::duplicate_field("success")); } - success__ = Some(map.next_value()?); + success__ = Some(map_.next_value()?); } GeneratedField::VmStatus => { if vm_status__.is_some() { return Err(serde::de::Error::duplicate_field("vmStatus")); } - vm_status__ = Some(map.next_value()?); + vm_status__ = Some(map_.next_value()?); } GeneratedField::AccumulatorRootHash => { if accumulator_root_hash__.is_some() { return Err(serde::de::Error::duplicate_field("accumulatorRootHash")); } - accumulator_root_hash__ = Some(map.next_value()?); + accumulator_root_hash__ = Some(map_.next_value()?); } GeneratedField::NumEvents => { if num_events__.is_some() { return Err(serde::de::Error::duplicate_field("numEvents")); } num_events__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::NumWriteSetChanges => { @@ -258,7 +265,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { return Err(serde::de::Error::duplicate_field("numWriteSetChanges")); } num_write_set_changes__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::Epoch => { @@ -266,7 +273,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { return Err(serde::de::Error::duplicate_field("epoch")); } epoch__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } GeneratedField::InsertedAt => { @@ -274,7 +281,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { return Err(serde::de::Error::duplicate_field("insertedAt")); } inserted_at__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } } diff --git a/protos/rust/src/pb/aptos.indexer.v1.rs b/protos/rust/src/pb/aptos.indexer.v1.rs index fa19bc8c41dfa..f8bba237f4fdd 100644 --- a/protos/rust/src/pb/aptos.indexer.v1.rs +++ b/protos/rust/src/pb/aptos.indexer.v1.rs @@ -4,6 +4,7 @@ // @generated // This file is @generated by prost-build. /// This is for storage only. +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsInStorage { /// Required; transactions data. @@ -13,6 +14,7 @@ pub struct TransactionsInStorage { #[prost(uint64, optional, tag="2")] pub starting_version: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GetTransactionsRequest { /// Required; start version of current stream. @@ -28,6 +30,7 @@ pub struct GetTransactionsRequest { pub batch_size: ::core::option::Option, } /// TransactionsResponse is a batch of transactions. +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsResponse { /// Required; transactions data. @@ -37,6 +40,7 @@ pub struct TransactionsResponse { #[prost(uint64, optional, tag="2")] pub chain_id: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct StreamProgressSampleProto { #[prost(message, optional, tag="1")] @@ -46,11 +50,13 @@ pub struct StreamProgressSampleProto { #[prost(uint64, tag="3")] pub size_bytes: u64, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StreamProgress { #[prost(message, repeated, tag="1")] pub samples: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ActiveStream { #[prost(string, optional, tag="1")] @@ -64,11 +70,13 @@ pub struct ActiveStream { #[prost(message, optional, tag="5")] pub progress: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StreamInfo { #[prost(message, repeated, tag="1")] pub active_streams: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct LiveDataServiceInfo { #[prost(uint64, optional, tag="1")] @@ -83,6 +91,7 @@ pub struct LiveDataServiceInfo { #[prost(uint64, optional, tag="5")] pub min_servable_version: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct HistoricalDataServiceInfo { #[prost(uint64, optional, tag="1")] @@ -94,6 +103,7 @@ pub struct HistoricalDataServiceInfo { #[prost(message, optional, tag="4")] pub stream_info: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct FullnodeInfo { #[prost(uint64, optional, tag="1")] @@ -103,6 +113,7 @@ pub struct FullnodeInfo { #[prost(uint64, optional, tag="3")] pub known_latest_version: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GrpcManagerInfo { #[prost(uint64, optional, tag="1")] @@ -114,6 +125,7 @@ pub struct GrpcManagerInfo { #[prost(string, optional, tag="4")] pub master_address: ::core::option::Option<::prost::alloc::string::String>, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ServiceInfo { #[prost(string, optional, tag="1")] @@ -123,7 +135,8 @@ pub struct ServiceInfo { } /// Nested message and enum types in `ServiceInfo`. pub mod service_info { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Info { #[prost(message, tag="2")] LiveDataServiceInfo(super::LiveDataServiceInfo), @@ -135,16 +148,19 @@ pub mod service_info { GrpcManagerInfo(super::GrpcManagerInfo), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct HeartbeatRequest { #[prost(message, optional, tag="1")] pub service_info: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct HeartbeatResponse { #[prost(uint64, optional, tag="1")] pub known_latest_version: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct PingDataServiceRequest { #[prost(uint64, optional, tag="1")] @@ -153,6 +169,7 @@ pub struct PingDataServiceRequest { #[prost(bool, tag="2")] pub ping_live_data_service: bool, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PingDataServiceResponse { #[prost(oneof="ping_data_service_response::Info", tags="1, 2")] @@ -160,7 +177,8 @@ pub struct PingDataServiceResponse { } /// Nested message and enum types in `PingDataServiceResponse`. pub mod ping_data_service_response { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Info { #[prost(message, tag="1")] LiveDataServiceInfo(super::LiveDataServiceInfo), @@ -168,11 +186,13 @@ pub mod ping_data_service_response { HistoricalDataServiceInfo(super::HistoricalDataServiceInfo), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GetDataServiceForRequestRequest { #[prost(message, optional, tag="1")] pub user_request: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataServiceForRequestResponse { #[prost(string, tag="1")] diff --git a/protos/rust/src/pb/aptos.indexer.v1.tonic.rs b/protos/rust/src/pb/aptos.indexer.v1.tonic.rs index 4e0c6ea804053..7c1140ba61e57 100644 --- a/protos/rust/src/pb/aptos.indexer.v1.tonic.rs +++ b/protos/rust/src/pb/aptos.indexer.v1.tonic.rs @@ -4,13 +4,7 @@ // @generated /// Generated client implementations. pub mod raw_data_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; /// @@ -33,8 +27,8 @@ pub mod raw_data_client { where T: tonic::client::GrpcService, T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); @@ -59,7 +53,7 @@ pub mod raw_data_client { >, , - >>::Error: Into + std::marker::Send + std::marker::Sync, + >>::Error: Into + Send + Sync, { RawDataClient::new(InterceptedService::new(inner, interceptor)) } @@ -107,7 +101,8 @@ pub mod raw_data_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -124,22 +119,16 @@ pub mod raw_data_client { } /// Generated server implementations. pub mod raw_data_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with RawDataServer. #[async_trait] - pub trait RawData: std::marker::Send + std::marker::Sync + 'static { + pub trait RawData: Send + Sync + 'static { /// Server streaming response type for the GetTransactions method. type GetTransactionsStream: tonic::codegen::tokio_stream::Stream< Item = std::result::Result, > - + std::marker::Send + + Send + 'static; /** Get transactions batch without any filtering from starting version and end if transaction count is present. */ @@ -153,14 +142,14 @@ pub mod raw_data_server { } /// #[derive(Debug)] - pub struct RawDataServer { + pub struct RawDataServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } - impl RawDataServer { + impl RawDataServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } @@ -214,8 +203,8 @@ pub mod raw_data_server { impl tonic::codegen::Service> for RawDataServer where T: RawData, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; @@ -277,25 +266,23 @@ pub mod raw_data_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) }) } } } } - impl Clone for RawDataServer { + impl Clone for RawDataServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { @@ -307,21 +294,13 @@ pub mod raw_data_server { } } } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "aptos.indexer.v1.RawData"; - impl tonic::server::NamedService for RawDataServer { - const NAME: &'static str = SERVICE_NAME; + impl tonic::server::NamedService for RawDataServer { + const NAME: &'static str = "aptos.indexer.v1.RawData"; } } /// Generated client implementations. pub mod grpc_manager_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; /// @@ -344,8 +323,8 @@ pub mod grpc_manager_client { where T: tonic::client::GrpcService, T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); @@ -370,7 +349,7 @@ pub mod grpc_manager_client { >, , - >>::Error: Into + std::marker::Send + std::marker::Sync, + >>::Error: Into + Send + Sync, { GrpcManagerClient::new(InterceptedService::new(inner, interceptor)) } @@ -417,7 +396,8 @@ pub mod grpc_manager_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -442,7 +422,8 @@ pub mod grpc_manager_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -469,7 +450,8 @@ pub mod grpc_manager_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -491,17 +473,11 @@ pub mod grpc_manager_client { } /// Generated server implementations. pub mod grpc_manager_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with GrpcManagerServer. #[async_trait] - pub trait GrpcManager: std::marker::Send + std::marker::Sync + 'static { + pub trait GrpcManager: Send + Sync + 'static { /// async fn heartbeat( &self, @@ -529,14 +505,14 @@ pub mod grpc_manager_server { } /// #[derive(Debug)] - pub struct GrpcManagerServer { + pub struct GrpcManagerServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } - impl GrpcManagerServer { + impl GrpcManagerServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } @@ -590,8 +566,8 @@ pub mod grpc_manager_server { impl tonic::codegen::Service> for GrpcManagerServer where T: GrpcManager, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; @@ -747,25 +723,23 @@ pub mod grpc_manager_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) }) } } } } - impl Clone for GrpcManagerServer { + impl Clone for GrpcManagerServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { @@ -777,21 +751,13 @@ pub mod grpc_manager_server { } } } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "aptos.indexer.v1.GrpcManager"; - impl tonic::server::NamedService for GrpcManagerServer { - const NAME: &'static str = SERVICE_NAME; + impl tonic::server::NamedService for GrpcManagerServer { + const NAME: &'static str = "aptos.indexer.v1.GrpcManager"; } } /// Generated client implementations. pub mod data_service_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; /// @@ -814,8 +780,8 @@ pub mod data_service_client { where T: tonic::client::GrpcService, T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); @@ -840,7 +806,7 @@ pub mod data_service_client { >, , - >>::Error: Into + std::marker::Send + std::marker::Sync, + >>::Error: Into + Send + Sync, { DataServiceClient::new(InterceptedService::new(inner, interceptor)) } @@ -887,7 +853,8 @@ pub mod data_service_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -912,7 +879,8 @@ pub mod data_service_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -931,17 +899,11 @@ pub mod data_service_client { } /// Generated server implementations. pub mod data_service_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with DataServiceServer. #[async_trait] - pub trait DataService: std::marker::Send + std::marker::Sync + 'static { + pub trait DataService: Send + Sync + 'static { /// async fn ping( &self, @@ -954,7 +916,7 @@ pub mod data_service_server { type GetTransactionsStream: tonic::codegen::tokio_stream::Stream< Item = std::result::Result, > - + std::marker::Send + + Send + 'static; /// async fn get_transactions( @@ -967,14 +929,14 @@ pub mod data_service_server { } /// #[derive(Debug)] - pub struct DataServiceServer { + pub struct DataServiceServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } - impl DataServiceServer { + impl DataServiceServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } @@ -1028,8 +990,8 @@ pub mod data_service_server { impl tonic::codegen::Service> for DataServiceServer where T: DataService, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; @@ -1136,25 +1098,23 @@ pub mod data_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) }) } } } } - impl Clone for DataServiceServer { + impl Clone for DataServiceServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { @@ -1166,9 +1126,7 @@ pub mod data_service_server { } } } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "aptos.indexer.v1.DataService"; - impl tonic::server::NamedService for DataServiceServer { - const NAME: &'static str = SERVICE_NAME; + impl tonic::server::NamedService for DataServiceServer { + const NAME: &'static str = "aptos.indexer.v1.DataService"; } } diff --git a/protos/rust/src/pb/aptos.internal.fullnode.v1.rs b/protos/rust/src/pb/aptos.internal.fullnode.v1.rs index f5547af9719d0..90c0d9208ae5f 100644 --- a/protos/rust/src/pb/aptos.internal.fullnode.v1.rs +++ b/protos/rust/src/pb/aptos.internal.fullnode.v1.rs @@ -10,11 +10,13 @@ // TransactionOutput data(size n) // StreamStatus: BATCH_END with version x + (k + 1) * n - 1 +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsOutput { #[prost(message, repeated, tag="1")] pub transactions: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct StreamStatus { #[prost(enumeration="stream_status::StatusType", tag="1")] @@ -44,9 +46,9 @@ pub mod stream_status { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "STATUS_TYPE_UNSPECIFIED", - Self::Init => "STATUS_TYPE_INIT", - Self::BatchEnd => "STATUS_TYPE_BATCH_END", + StatusType::Unspecified => "STATUS_TYPE_UNSPECIFIED", + StatusType::Init => "STATUS_TYPE_INIT", + StatusType::BatchEnd => "STATUS_TYPE_BATCH_END", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -60,6 +62,7 @@ pub mod stream_status { } } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GetTransactionsFromNodeRequest { /// Required; start version of current stream. @@ -71,6 +74,7 @@ pub struct GetTransactionsFromNodeRequest { #[prost(uint64, optional, tag="2")] pub transactions_count: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsFromNodeResponse { /// Making sure that all the responses include a chain id @@ -81,7 +85,8 @@ pub struct TransactionsFromNodeResponse { } /// Nested message and enum types in `TransactionsFromNodeResponse`. pub mod transactions_from_node_response { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Response { #[prost(message, tag="1")] Status(super::StreamStatus), @@ -89,9 +94,11 @@ pub mod transactions_from_node_response { Data(super::TransactionsOutput), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct PingFullnodeRequest { } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct PingFullnodeResponse { #[prost(message, optional, tag="1")] diff --git a/protos/rust/src/pb/aptos.internal.fullnode.v1.tonic.rs b/protos/rust/src/pb/aptos.internal.fullnode.v1.tonic.rs index f8cf73cd62ea8..3879fd94dcefd 100644 --- a/protos/rust/src/pb/aptos.internal.fullnode.v1.tonic.rs +++ b/protos/rust/src/pb/aptos.internal.fullnode.v1.tonic.rs @@ -4,13 +4,7 @@ // @generated /// Generated client implementations. pub mod fullnode_data_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; /// @@ -33,8 +27,8 @@ pub mod fullnode_data_client { where T: tonic::client::GrpcService, T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); @@ -59,7 +53,7 @@ pub mod fullnode_data_client { >, , - >>::Error: Into + std::marker::Send + std::marker::Sync, + >>::Error: Into + Send + Sync, { FullnodeDataClient::new(InterceptedService::new(inner, interceptor)) } @@ -106,7 +100,8 @@ pub mod fullnode_data_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -135,7 +130,8 @@ pub mod fullnode_data_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -157,17 +153,11 @@ pub mod fullnode_data_client { } /// Generated server implementations. pub mod fullnode_data_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with FullnodeDataServer. #[async_trait] - pub trait FullnodeData: std::marker::Send + std::marker::Sync + 'static { + pub trait FullnodeData: Send + Sync + 'static { /// async fn ping( &self, @@ -183,7 +173,7 @@ pub mod fullnode_data_server { tonic::Status, >, > - + std::marker::Send + + Send + 'static; /// async fn get_transactions_from_node( @@ -196,14 +186,14 @@ pub mod fullnode_data_server { } /// #[derive(Debug)] - pub struct FullnodeDataServer { + pub struct FullnodeDataServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } - impl FullnodeDataServer { + impl FullnodeDataServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } @@ -257,8 +247,8 @@ pub mod fullnode_data_server { impl tonic::codegen::Service> for FullnodeDataServer where T: FullnodeData, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; @@ -371,25 +361,23 @@ pub mod fullnode_data_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) }) } } } } - impl Clone for FullnodeDataServer { + impl Clone for FullnodeDataServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { @@ -401,9 +389,7 @@ pub mod fullnode_data_server { } } } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "aptos.internal.fullnode.v1.FullnodeData"; - impl tonic::server::NamedService for FullnodeDataServer { - const NAME: &'static str = SERVICE_NAME; + impl tonic::server::NamedService for FullnodeDataServer { + const NAME: &'static str = "aptos.internal.fullnode.v1.FullnodeData"; } } diff --git a/protos/rust/src/pb/aptos.remote_executor.v1.rs b/protos/rust/src/pb/aptos.remote_executor.v1.rs index 29daad3efd968..b84e6e1e68f50 100644 --- a/protos/rust/src/pb/aptos.remote_executor.v1.rs +++ b/protos/rust/src/pb/aptos.remote_executor.v1.rs @@ -3,6 +3,7 @@ // @generated // This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct NetworkMessage { #[prost(bytes="vec", tag="1")] @@ -10,6 +11,7 @@ pub struct NetworkMessage { #[prost(string, tag="2")] pub message_type: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct Empty { } diff --git a/protos/rust/src/pb/aptos.remote_executor.v1.tonic.rs b/protos/rust/src/pb/aptos.remote_executor.v1.tonic.rs index 85f08bf9e8caa..bab5b94b15a56 100644 --- a/protos/rust/src/pb/aptos.remote_executor.v1.tonic.rs +++ b/protos/rust/src/pb/aptos.remote_executor.v1.tonic.rs @@ -4,13 +4,7 @@ // @generated /// Generated client implementations. pub mod network_message_service_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; /// @@ -33,8 +27,8 @@ pub mod network_message_service_client { where T: tonic::client::GrpcService, T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); @@ -59,7 +53,7 @@ pub mod network_message_service_client { >, , - >>::Error: Into + std::marker::Send + std::marker::Sync, + >>::Error: Into + Send + Sync, { NetworkMessageServiceClient::new(InterceptedService::new(inner, interceptor)) } @@ -103,7 +97,8 @@ pub mod network_message_service_client { .ready() .await .map_err(|e| { - tonic::Status::unknown( + tonic::Status::new( + tonic::Code::Unknown, format!("Service was not ready: {}", e.into()), ) })?; @@ -125,17 +120,11 @@ pub mod network_message_service_client { } /// Generated server implementations. pub mod network_message_service_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value, - )] + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with NetworkMessageServiceServer. #[async_trait] - pub trait NetworkMessageService: std::marker::Send + std::marker::Sync + 'static { + pub trait NetworkMessageService: Send + Sync + 'static { /// async fn simple_msg_exchange( &self, @@ -144,14 +133,14 @@ pub mod network_message_service_server { } /// #[derive(Debug)] - pub struct NetworkMessageServiceServer { + pub struct NetworkMessageServiceServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } - impl NetworkMessageServiceServer { + impl NetworkMessageServiceServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } @@ -206,8 +195,8 @@ pub mod network_message_service_server { for NetworkMessageServiceServer where T: NetworkMessageService, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; @@ -271,25 +260,23 @@ pub mod network_message_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); - let headers = response.headers_mut(); - headers - .insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers - .insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", tonic::Code::Unimplemented as i32) + .header( + http::header::CONTENT_TYPE, + tonic::metadata::GRPC_CONTENT_TYPE, + ) + .body(empty_body()) + .unwrap(), + ) }) } } } } - impl Clone for NetworkMessageServiceServer { + impl Clone for NetworkMessageServiceServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { @@ -301,9 +288,8 @@ pub mod network_message_service_server { } } } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "aptos.remote_executor.v1.NetworkMessageService"; - impl tonic::server::NamedService for NetworkMessageServiceServer { - const NAME: &'static str = SERVICE_NAME; + impl tonic::server::NamedService + for NetworkMessageServiceServer { + const NAME: &'static str = "aptos.remote_executor.v1.NetworkMessageService"; } } diff --git a/protos/rust/src/pb/aptos.transaction.v1.rs b/protos/rust/src/pb/aptos.transaction.v1.rs index 8e9ffcceb7d51..3f029a2fe9981 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.rs @@ -12,6 +12,7 @@ /// the same `height`. /// /// The Genesis Transaction (version 0) is contained within the first block, which has a height of `0` +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Block { /// Timestamp represents the timestamp of the `BlockMetadataTransaction` (or `GenesisTransaction` for the genesis block) @@ -34,6 +35,7 @@ pub struct Block { /// - Block Metadata Transaction: transactions generated by the chain to group together transactions forming a "block" /// - Block Epilogue / State Checkpoint Transaction: transactions generated by the chain to end the group transactions forming a bloc /// - Genesis Transaction: the first transaction of the chain, with all core contract and validator information baked in +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Transaction { #[prost(message, optional, tag="1")] @@ -74,13 +76,13 @@ pub mod transaction { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TRANSACTION_TYPE_UNSPECIFIED", - Self::Genesis => "TRANSACTION_TYPE_GENESIS", - Self::BlockMetadata => "TRANSACTION_TYPE_BLOCK_METADATA", - Self::StateCheckpoint => "TRANSACTION_TYPE_STATE_CHECKPOINT", - Self::User => "TRANSACTION_TYPE_USER", - Self::Validator => "TRANSACTION_TYPE_VALIDATOR", - Self::BlockEpilogue => "TRANSACTION_TYPE_BLOCK_EPILOGUE", + TransactionType::Unspecified => "TRANSACTION_TYPE_UNSPECIFIED", + TransactionType::Genesis => "TRANSACTION_TYPE_GENESIS", + TransactionType::BlockMetadata => "TRANSACTION_TYPE_BLOCK_METADATA", + TransactionType::StateCheckpoint => "TRANSACTION_TYPE_STATE_CHECKPOINT", + TransactionType::User => "TRANSACTION_TYPE_USER", + TransactionType::Validator => "TRANSACTION_TYPE_VALIDATOR", + TransactionType::BlockEpilogue => "TRANSACTION_TYPE_BLOCK_EPILOGUE", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -97,7 +99,8 @@ pub mod transaction { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum TxnData { #[prost(message, tag="7")] BlockMetadata(super::BlockMetadataTransaction), @@ -116,6 +119,7 @@ pub mod transaction { } } /// Transaction types. +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BlockMetadataTransaction { #[prost(string, tag="1")] @@ -131,6 +135,7 @@ pub struct BlockMetadataTransaction { #[prost(uint32, repeated, tag="6")] pub failed_proposer_indices: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisTransaction { #[prost(message, optional, tag="1")] @@ -138,9 +143,11 @@ pub struct GenesisTransaction { #[prost(message, repeated, tag="2")] pub events: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct StateCheckpointTransaction { } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ValidatorTransaction { #[prost(message, repeated, tag="3")] @@ -150,14 +157,16 @@ pub struct ValidatorTransaction { } /// Nested message and enum types in `ValidatorTransaction`. pub mod validator_transaction { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ObservedJwkUpdate { #[prost(message, optional, tag="1")] pub quorum_certified_update: ::core::option::Option, } /// Nested message and enum types in `ObservedJwkUpdate`. pub mod observed_jwk_update { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ExportedProviderJwKs { #[prost(string, tag="1")] pub issuer: ::prost::alloc::string::String, @@ -168,14 +177,16 @@ pub mod validator_transaction { } /// Nested message and enum types in `ExportedProviderJWKs`. pub mod exported_provider_jw_ks { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct Jwk { #[prost(oneof="jwk::JwkType", tags="1, 2")] pub jwk_type: ::core::option::Option, } /// Nested message and enum types in `JWK`. pub mod jwk { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct Rsa { #[prost(string, tag="1")] pub kid: ::prost::alloc::string::String, @@ -188,14 +199,16 @@ pub mod validator_transaction { #[prost(string, tag="5")] pub n: ::prost::alloc::string::String, } - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct UnsupportedJwk { #[prost(bytes="vec", tag="1")] pub id: ::prost::alloc::vec::Vec, #[prost(bytes="vec", tag="2")] pub payload: ::prost::alloc::vec::Vec, } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum JwkType { #[prost(message, tag="1")] UnsupportedJwk(UnsupportedJwk), @@ -204,7 +217,8 @@ pub mod validator_transaction { } } } - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ExportedAggregateSignature { #[prost(uint64, repeated, tag="1")] pub signer_indices: ::prost::alloc::vec::Vec, @@ -212,7 +226,8 @@ pub mod validator_transaction { #[prost(bytes="vec", tag="2")] pub sig: ::prost::alloc::vec::Vec, } - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct QuorumCertifiedUpdate { #[prost(message, optional, tag="1")] pub update: ::core::option::Option, @@ -220,14 +235,16 @@ pub mod validator_transaction { pub multi_sig: ::core::option::Option, } } - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct DkgUpdate { #[prost(message, optional, tag="1")] pub dkg_transcript: ::core::option::Option, } /// Nested message and enum types in `DkgUpdate`. pub mod dkg_update { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct DkgTranscript { #[prost(uint64, tag="1")] pub epoch: u64, @@ -237,7 +254,8 @@ pub mod validator_transaction { pub payload: ::prost::alloc::vec::Vec, } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum ValidatorTransactionType { #[prost(message, tag="1")] ObservedJwkUpdate(ObservedJwkUpdate), @@ -245,11 +263,13 @@ pub mod validator_transaction { DkgUpdate(DkgUpdate), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct BlockEpilogueTransaction { #[prost(message, optional, tag="1")] pub block_end_info: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct BlockEndInfo { #[prost(bool, tag="1")] @@ -261,6 +281,7 @@ pub struct BlockEndInfo { #[prost(uint64, tag="4")] pub block_approx_output_size: u64, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct UserTransaction { #[prost(message, optional, tag="1")] @@ -268,6 +289,7 @@ pub struct UserTransaction { #[prost(message, repeated, tag="2")] pub events: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Event { #[prost(message, optional, tag="1")] @@ -281,6 +303,7 @@ pub struct Event { #[prost(string, tag="4")] pub data: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionInfo { #[prost(bytes="vec", tag="1")] @@ -302,6 +325,7 @@ pub struct TransactionInfo { #[prost(message, repeated, tag="9")] pub changes: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventKey { #[prost(uint64, tag="1")] @@ -309,6 +333,7 @@ pub struct EventKey { #[prost(string, tag="2")] pub account_address: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct UserTransactionRequest { #[prost(string, tag="1")] @@ -326,6 +351,7 @@ pub struct UserTransactionRequest { #[prost(message, optional, tag="7")] pub signature: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteSet { #[prost(enumeration="write_set::WriteSetType", tag="1")] @@ -349,9 +375,9 @@ pub mod write_set { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "WRITE_SET_TYPE_UNSPECIFIED", - Self::ScriptWriteSet => "WRITE_SET_TYPE_SCRIPT_WRITE_SET", - Self::DirectWriteSet => "WRITE_SET_TYPE_DIRECT_WRITE_SET", + WriteSetType::Unspecified => "WRITE_SET_TYPE_UNSPECIFIED", + WriteSetType::ScriptWriteSet => "WRITE_SET_TYPE_SCRIPT_WRITE_SET", + WriteSetType::DirectWriteSet => "WRITE_SET_TYPE_DIRECT_WRITE_SET", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -364,7 +390,8 @@ pub mod write_set { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum WriteSet { #[prost(message, tag="2")] ScriptWriteSet(super::ScriptWriteSet), @@ -372,6 +399,7 @@ pub mod write_set { DirectWriteSet(super::DirectWriteSet), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ScriptWriteSet { #[prost(string, tag="1")] @@ -379,6 +407,7 @@ pub struct ScriptWriteSet { #[prost(message, optional, tag="2")] pub script: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DirectWriteSet { #[prost(message, repeated, tag="1")] @@ -386,6 +415,7 @@ pub struct DirectWriteSet { #[prost(message, repeated, tag="2")] pub events: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteSetChange { #[prost(enumeration="write_set_change::Type", tag="1")] @@ -413,13 +443,13 @@ pub mod write_set_change { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::DeleteModule => "TYPE_DELETE_MODULE", - Self::DeleteResource => "TYPE_DELETE_RESOURCE", - Self::DeleteTableItem => "TYPE_DELETE_TABLE_ITEM", - Self::WriteModule => "TYPE_WRITE_MODULE", - Self::WriteResource => "TYPE_WRITE_RESOURCE", - Self::WriteTableItem => "TYPE_WRITE_TABLE_ITEM", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::DeleteModule => "TYPE_DELETE_MODULE", + Type::DeleteResource => "TYPE_DELETE_RESOURCE", + Type::DeleteTableItem => "TYPE_DELETE_TABLE_ITEM", + Type::WriteModule => "TYPE_WRITE_MODULE", + Type::WriteResource => "TYPE_WRITE_RESOURCE", + Type::WriteTableItem => "TYPE_WRITE_TABLE_ITEM", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -436,7 +466,8 @@ pub mod write_set_change { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Change { #[prost(message, tag="2")] DeleteModule(super::DeleteModule), @@ -452,6 +483,7 @@ pub mod write_set_change { WriteTableItem(super::WriteTableItem), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DeleteModule { #[prost(string, tag="1")] @@ -461,6 +493,7 @@ pub struct DeleteModule { #[prost(message, optional, tag="3")] pub module: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DeleteResource { #[prost(string, tag="1")] @@ -472,6 +505,7 @@ pub struct DeleteResource { #[prost(string, tag="4")] pub type_str: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DeleteTableItem { #[prost(bytes="vec", tag="1")] @@ -483,6 +517,7 @@ pub struct DeleteTableItem { #[prost(message, optional, tag="4")] pub data: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DeleteTableData { #[prost(string, tag="1")] @@ -490,6 +525,7 @@ pub struct DeleteTableData { #[prost(string, tag="2")] pub key_type: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteModule { #[prost(string, tag="1")] @@ -499,6 +535,7 @@ pub struct WriteModule { #[prost(message, optional, tag="3")] pub data: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteResource { #[prost(string, tag="1")] @@ -512,6 +549,7 @@ pub struct WriteResource { #[prost(string, tag="5")] pub data: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteTableData { #[prost(string, tag="1")] @@ -523,6 +561,7 @@ pub struct WriteTableData { #[prost(string, tag="4")] pub value_type: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteTableItem { #[prost(bytes="vec", tag="1")] @@ -534,6 +573,7 @@ pub struct WriteTableItem { #[prost(message, optional, tag="4")] pub data: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionPayload { #[prost(enumeration="transaction_payload::Type", tag="1")] @@ -559,11 +599,11 @@ pub mod transaction_payload { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::EntryFunctionPayload => "TYPE_ENTRY_FUNCTION_PAYLOAD", - Self::ScriptPayload => "TYPE_SCRIPT_PAYLOAD", - Self::WriteSetPayload => "TYPE_WRITE_SET_PAYLOAD", - Self::MultisigPayload => "TYPE_MULTISIG_PAYLOAD", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::EntryFunctionPayload => "TYPE_ENTRY_FUNCTION_PAYLOAD", + Type::ScriptPayload => "TYPE_SCRIPT_PAYLOAD", + Type::WriteSetPayload => "TYPE_WRITE_SET_PAYLOAD", + Type::MultisigPayload => "TYPE_MULTISIG_PAYLOAD", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -578,7 +618,8 @@ pub mod transaction_payload { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Payload { #[prost(message, tag="2")] EntryFunctionPayload(super::EntryFunctionPayload), @@ -590,6 +631,7 @@ pub mod transaction_payload { MultisigPayload(super::MultisigPayload), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EntryFunctionPayload { #[prost(message, optional, tag="1")] @@ -601,6 +643,7 @@ pub struct EntryFunctionPayload { #[prost(string, tag="4")] pub entry_function_id_str: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveScriptBytecode { #[prost(bytes="vec", tag="1")] @@ -608,6 +651,7 @@ pub struct MoveScriptBytecode { #[prost(message, optional, tag="2")] pub abi: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ScriptPayload { #[prost(message, optional, tag="1")] @@ -617,6 +661,7 @@ pub struct ScriptPayload { #[prost(string, repeated, tag="3")] pub arguments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MultisigPayload { #[prost(string, tag="1")] @@ -624,6 +669,7 @@ pub struct MultisigPayload { #[prost(message, optional, tag="2")] pub transaction_payload: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MultisigTransactionPayload { #[prost(enumeration="multisig_transaction_payload::Type", tag="1")] @@ -646,8 +692,8 @@ pub mod multisig_transaction_payload { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::EntryFunctionPayload => "TYPE_ENTRY_FUNCTION_PAYLOAD", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::EntryFunctionPayload => "TYPE_ENTRY_FUNCTION_PAYLOAD", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -659,12 +705,14 @@ pub mod multisig_transaction_payload { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Payload { #[prost(message, tag="2")] EntryFunctionPayload(super::EntryFunctionPayload), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveModuleBytecode { #[prost(bytes="vec", tag="1")] @@ -672,6 +720,7 @@ pub struct MoveModuleBytecode { #[prost(message, optional, tag="2")] pub abi: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveModule { #[prost(string, tag="1")] @@ -685,6 +734,7 @@ pub struct MoveModule { #[prost(message, repeated, tag="5")] pub structs: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveFunction { #[prost(string, tag="1")] @@ -717,10 +767,10 @@ pub mod move_function { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "VISIBILITY_UNSPECIFIED", - Self::Private => "VISIBILITY_PRIVATE", - Self::Public => "VISIBILITY_PUBLIC", - Self::Friend => "VISIBILITY_FRIEND", + Visibility::Unspecified => "VISIBILITY_UNSPECIFIED", + Visibility::Private => "VISIBILITY_PRIVATE", + Visibility::Public => "VISIBILITY_PUBLIC", + Visibility::Friend => "VISIBILITY_FRIEND", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -735,6 +785,7 @@ pub mod move_function { } } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveStruct { #[prost(string, tag="1")] @@ -750,6 +801,7 @@ pub struct MoveStruct { #[prost(message, repeated, tag="5")] pub fields: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveStructGenericTypeParam { #[prost(enumeration="MoveAbility", repeated, tag="1")] @@ -757,6 +809,7 @@ pub struct MoveStructGenericTypeParam { #[prost(bool, tag="2")] pub is_phantom: bool, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveStructField { #[prost(string, tag="1")] @@ -764,11 +817,13 @@ pub struct MoveStructField { #[prost(message, optional, tag="2")] pub r#type: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveFunctionGenericTypeParam { #[prost(enumeration="MoveAbility", repeated, tag="1")] pub constraints: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveType { #[prost(enumeration="MoveTypes", tag="1")] @@ -778,14 +833,16 @@ pub struct MoveType { } /// Nested message and enum types in `MoveType`. pub mod move_type { - #[derive(Clone, PartialEq, ::prost::Message)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ReferenceType { #[prost(bool, tag="1")] pub mutable: bool, #[prost(message, optional, boxed, tag="2")] pub to: ::core::option::Option<::prost::alloc::boxed::Box>, } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Content { #[prost(message, tag="3")] Vector(::prost::alloc::boxed::Box), @@ -799,11 +856,13 @@ pub mod move_type { Unparsable(::prost::alloc::string::String), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WriteSetPayload { #[prost(message, optional, tag="1")] pub write_set: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EntryFunctionId { #[prost(message, optional, tag="1")] @@ -811,6 +870,7 @@ pub struct EntryFunctionId { #[prost(string, tag="2")] pub name: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveModuleId { #[prost(string, tag="1")] @@ -818,6 +878,7 @@ pub struct MoveModuleId { #[prost(string, tag="2")] pub name: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MoveStructTag { #[prost(string, tag="1")] @@ -829,6 +890,7 @@ pub struct MoveStructTag { #[prost(message, repeated, tag="4")] pub generic_type_params: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Signature { #[prost(enumeration="signature::Type", tag="1")] @@ -855,12 +917,12 @@ pub mod signature { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::Ed25519 => "TYPE_ED25519", - Self::MultiEd25519 => "TYPE_MULTI_ED25519", - Self::MultiAgent => "TYPE_MULTI_AGENT", - Self::FeePayer => "TYPE_FEE_PAYER", - Self::SingleSender => "TYPE_SINGLE_SENDER", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::Ed25519 => "TYPE_ED25519", + Type::MultiEd25519 => "TYPE_MULTI_ED25519", + Type::MultiAgent => "TYPE_MULTI_AGENT", + Type::FeePayer => "TYPE_FEE_PAYER", + Type::SingleSender => "TYPE_SINGLE_SENDER", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -876,7 +938,8 @@ pub mod signature { } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Signature { #[prost(message, tag="2")] Ed25519(super::Ed25519Signature), @@ -891,6 +954,7 @@ pub mod signature { SingleSender(super::SingleSender), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Ed25519Signature { #[prost(bytes="vec", tag="1")] @@ -898,6 +962,7 @@ pub struct Ed25519Signature { #[prost(bytes="vec", tag="2")] pub signature: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MultiEd25519Signature { #[prost(bytes="vec", repeated, tag="1")] @@ -909,6 +974,7 @@ pub struct MultiEd25519Signature { #[prost(uint32, repeated, tag="4")] pub public_key_indices: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MultiAgentSignature { #[prost(message, optional, tag="1")] @@ -918,6 +984,7 @@ pub struct MultiAgentSignature { #[prost(message, repeated, tag="3")] pub secondary_signers: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct FeePayerSignature { #[prost(message, optional, tag="1")] @@ -931,6 +998,7 @@ pub struct FeePayerSignature { #[prost(message, optional, tag="5")] pub fee_payer_signer: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AnyPublicKey { #[prost(enumeration="any_public_key::Type", tag="1")] @@ -957,12 +1025,12 @@ pub mod any_public_key { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::Ed25519 => "TYPE_ED25519", - Self::Secp256k1Ecdsa => "TYPE_SECP256K1_ECDSA", - Self::Secp256r1Ecdsa => "TYPE_SECP256R1_ECDSA", - Self::Keyless => "TYPE_KEYLESS", - Self::FederatedKeyless => "TYPE_FEDERATED_KEYLESS", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::Ed25519 => "TYPE_ED25519", + Type::Secp256k1Ecdsa => "TYPE_SECP256K1_ECDSA", + Type::Secp256r1Ecdsa => "TYPE_SECP256R1_ECDSA", + Type::Keyless => "TYPE_KEYLESS", + Type::FederatedKeyless => "TYPE_FEDERATED_KEYLESS", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -979,6 +1047,7 @@ pub mod any_public_key { } } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AnySignature { #[prost(enumeration="any_signature::Type", tag="1")] @@ -1010,11 +1079,11 @@ pub mod any_signature { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::Ed25519 => "TYPE_ED25519", - Self::Secp256k1Ecdsa => "TYPE_SECP256K1_ECDSA", - Self::Webauthn => "TYPE_WEBAUTHN", - Self::Keyless => "TYPE_KEYLESS", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::Ed25519 => "TYPE_ED25519", + Type::Secp256k1Ecdsa => "TYPE_SECP256K1_ECDSA", + Type::Webauthn => "TYPE_WEBAUTHN", + Type::Keyless => "TYPE_KEYLESS", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -1030,7 +1099,8 @@ pub mod any_signature { } } /// Support: >= 1.10. - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum SignatureVariant { #[prost(message, tag="3")] Ed25519(super::Ed25519), @@ -1042,26 +1112,31 @@ pub mod any_signature { Keyless(super::Keyless), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Ed25519 { #[prost(bytes="vec", tag="1")] pub signature: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Secp256k1Ecdsa { #[prost(bytes="vec", tag="1")] pub signature: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WebAuthn { #[prost(bytes="vec", tag="1")] pub signature: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Keyless { #[prost(bytes="vec", tag="1")] pub signature: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SingleKeySignature { #[prost(message, optional, tag="1")] @@ -1069,6 +1144,7 @@ pub struct SingleKeySignature { #[prost(message, optional, tag="2")] pub signature: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IndexedSignature { #[prost(uint32, tag="1")] @@ -1076,6 +1152,7 @@ pub struct IndexedSignature { #[prost(message, optional, tag="2")] pub signature: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MultiKeySignature { #[prost(message, repeated, tag="1")] @@ -1085,16 +1162,26 @@ pub struct MultiKeySignature { #[prost(uint32, tag="3")] pub signatures_required: u32, } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AbstractionSignature { + #[prost(string, tag="1")] + pub function_info: ::prost::alloc::string::String, + #[prost(bytes="vec", tag="2")] + pub signature: ::prost::alloc::vec::Vec, +} +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SingleSender { #[prost(message, optional, tag="1")] pub sender: ::core::option::Option, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AccountSignature { #[prost(enumeration="account_signature::Type", tag="1")] pub r#type: i32, - #[prost(oneof="account_signature::Signature", tags="2, 3, 5, 6")] + #[prost(oneof="account_signature::Signature", tags="2, 3, 5, 6, 7")] pub signature: ::core::option::Option, } /// Nested message and enum types in `AccountSignature`. @@ -1107,6 +1194,7 @@ pub mod account_signature { MultiEd25519 = 2, SingleKey = 4, MultiKey = 5, + Abstraction = 6, } impl Type { /// String value of the enum field names used in the ProtoBuf definition. @@ -1115,11 +1203,12 @@ pub mod account_signature { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "TYPE_UNSPECIFIED", - Self::Ed25519 => "TYPE_ED25519", - Self::MultiEd25519 => "TYPE_MULTI_ED25519", - Self::SingleKey => "TYPE_SINGLE_KEY", - Self::MultiKey => "TYPE_MULTI_KEY", + Type::Unspecified => "TYPE_UNSPECIFIED", + Type::Ed25519 => "TYPE_ED25519", + Type::MultiEd25519 => "TYPE_MULTI_ED25519", + Type::SingleKey => "TYPE_SINGLE_KEY", + Type::MultiKey => "TYPE_MULTI_KEY", + Type::Abstraction => "TYPE_ABSTRACTION", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -1130,11 +1219,13 @@ pub mod account_signature { "TYPE_MULTI_ED25519" => Some(Self::MultiEd25519), "TYPE_SINGLE_KEY" => Some(Self::SingleKey), "TYPE_MULTI_KEY" => Some(Self::MultiKey), + "TYPE_ABSTRACTION" => Some(Self::Abstraction), _ => None, } } } - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Signature { #[prost(message, tag="2")] Ed25519(super::Ed25519Signature), @@ -1145,8 +1236,11 @@ pub mod account_signature { SingleKeySignature(super::SingleKeySignature), #[prost(message, tag="6")] MultiKeySignature(super::MultiKeySignature), + #[prost(message, tag="7")] + Abstraction(super::AbstractionSignature), } } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionSizeInfo { #[prost(uint32, tag="1")] @@ -1156,6 +1250,7 @@ pub struct TransactionSizeInfo { #[prost(message, repeated, tag="3")] pub write_op_size_info: ::prost::alloc::vec::Vec, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct EventSizeInfo { #[prost(uint32, tag="1")] @@ -1163,6 +1258,7 @@ pub struct EventSizeInfo { #[prost(uint32, tag="2")] pub total_bytes: u32, } +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WriteOpSizeInfo { #[prost(uint32, tag="1")] @@ -1201,21 +1297,21 @@ impl MoveTypes { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "MOVE_TYPES_UNSPECIFIED", - Self::Bool => "MOVE_TYPES_BOOL", - Self::U8 => "MOVE_TYPES_U8", - Self::U16 => "MOVE_TYPES_U16", - Self::U32 => "MOVE_TYPES_U32", - Self::U64 => "MOVE_TYPES_U64", - Self::U128 => "MOVE_TYPES_U128", - Self::U256 => "MOVE_TYPES_U256", - Self::Address => "MOVE_TYPES_ADDRESS", - Self::Signer => "MOVE_TYPES_SIGNER", - Self::Vector => "MOVE_TYPES_VECTOR", - Self::Struct => "MOVE_TYPES_STRUCT", - Self::GenericTypeParam => "MOVE_TYPES_GENERIC_TYPE_PARAM", - Self::Reference => "MOVE_TYPES_REFERENCE", - Self::Unparsable => "MOVE_TYPES_UNPARSABLE", + MoveTypes::Unspecified => "MOVE_TYPES_UNSPECIFIED", + MoveTypes::Bool => "MOVE_TYPES_BOOL", + MoveTypes::U8 => "MOVE_TYPES_U8", + MoveTypes::U16 => "MOVE_TYPES_U16", + MoveTypes::U32 => "MOVE_TYPES_U32", + MoveTypes::U64 => "MOVE_TYPES_U64", + MoveTypes::U128 => "MOVE_TYPES_U128", + MoveTypes::U256 => "MOVE_TYPES_U256", + MoveTypes::Address => "MOVE_TYPES_ADDRESS", + MoveTypes::Signer => "MOVE_TYPES_SIGNER", + MoveTypes::Vector => "MOVE_TYPES_VECTOR", + MoveTypes::Struct => "MOVE_TYPES_STRUCT", + MoveTypes::GenericTypeParam => "MOVE_TYPES_GENERIC_TYPE_PARAM", + MoveTypes::Reference => "MOVE_TYPES_REFERENCE", + MoveTypes::Unparsable => "MOVE_TYPES_UNPARSABLE", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -1256,11 +1352,11 @@ impl MoveAbility { /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { - Self::Unspecified => "MOVE_ABILITY_UNSPECIFIED", - Self::Copy => "MOVE_ABILITY_COPY", - Self::Drop => "MOVE_ABILITY_DROP", - Self::Store => "MOVE_ABILITY_STORE", - Self::Key => "MOVE_ABILITY_KEY", + MoveAbility::Unspecified => "MOVE_ABILITY_UNSPECIFIED", + MoveAbility::Copy => "MOVE_ABILITY_COPY", + MoveAbility::Drop => "MOVE_ABILITY_DROP", + MoveAbility::Store => "MOVE_ABILITY_STORE", + MoveAbility::Key => "MOVE_ABILITY_KEY", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -1277,7 +1373,7 @@ impl MoveAbility { } /// Encoded file descriptor set for the `aptos.transaction.v1` package pub const FILE_DESCRIPTOR_SET: &[u8] = &[ - 0x0a, 0xdd, 0xb8, 0x02, 0x0a, 0x26, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, + 0x0a, 0x9d, 0xbc, 0x02, 0x0a, 0x26, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, @@ -2181,1604 +2277,1632 @@ pub const FILE_DESCRIPTOR_SET: &[u8] = &[ 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x4e, 0x0a, 0x0c, 0x53, 0x69, 0x6e, - 0x67, 0x6c, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x74, 0x6f, - 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0xa8, 0x04, 0x0a, 0x10, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x3f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, - 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x42, 0x0a, 0x07, 0x65, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x07, 0x65, 0x64, 0x32, 0x35, - 0x35, 0x31, 0x39, 0x12, 0x52, 0x0a, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x65, 0x64, 0x32, - 0x35, 0x35, 0x31, 0x39, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x74, - 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x6e, - 0x67, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, - 0x00, 0x52, 0x12, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x59, 0x0a, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, - 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x11, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x22, 0x75, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, - 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x44, 0x32, 0x35, 0x35, 0x31, 0x39, 0x10, 0x01, - 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x45, - 0x44, 0x32, 0x35, 0x35, 0x31, 0x39, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x12, 0x12, 0x0a, - 0x0e, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, - 0x05, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x42, 0x0b, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x11, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, - 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x69, - 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x52, 0x0a, 0x12, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, - 0x6f, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, - 0x70, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x4f, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x56, 0x0a, 0x0d, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x0e, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x54, 0x61, 0x67, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x70, 0x53, 0x69, 0x7a, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x2a, 0xea, 0x02, 0x0a, 0x09, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, - 0x0f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, - 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, - 0x5f, 0x55, 0x38, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x53, 0x5f, 0x55, 0x31, 0x36, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x4f, 0x56, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x12, 0x0a, - 0x0e, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x36, 0x34, 0x10, - 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, - 0x55, 0x31, 0x32, 0x38, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x32, 0x35, 0x36, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, 0x4d, - 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, - 0x53, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x53, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, - 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, - 0x07, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, - 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x08, 0x12, 0x21, 0x0a, 0x1d, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4d, - 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, - 0x4e, 0x43, 0x45, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x52, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, - 0x2a, 0x87, 0x01, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x41, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, - 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, - 0x4f, 0x50, 0x59, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x4f, - 0x52, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, - 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x42, 0x9e, 0x01, 0x0a, 0x18, 0x63, - 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0xa2, 0x02, 0x03, 0x41, 0x54, - 0x58, 0xaa, 0x02, 0x14, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x14, 0x41, 0x70, 0x74, 0x6f, 0x73, - 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, - 0x02, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x16, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x3a, 0x3a, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x4a, 0xaa, 0xba, 0x01, 0x0a, - 0x07, 0x12, 0x05, 0x03, 0x00, 0xee, 0x04, 0x01, 0x0a, 0x4e, 0x0a, 0x01, 0x0c, 0x12, 0x03, 0x03, - 0x00, 0x12, 0x32, 0x44, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0xc2, - 0xa9, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x20, 0x53, 0x50, 0x44, 0x58, 0x2d, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x2d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3a, 0x20, 0x41, 0x70, 0x61, - 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x0a, 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, 0x03, 0x05, - 0x00, 0x1d, 0x0a, 0x09, 0x0a, 0x02, 0x03, 0x00, 0x12, 0x03, 0x07, 0x00, 0x2e, 0x0a, 0xa3, 0x05, - 0x0a, 0x02, 0x04, 0x00, 0x12, 0x04, 0x12, 0x00, 0x20, 0x01, 0x1a, 0x96, 0x05, 0x20, 0x41, 0x20, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x20, 0x68, - 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, - 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x28, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x60, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x29, 0x0a, 0x20, 0x41, - 0x6c, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x60, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x6f, 0x72, 0x20, 0x6d, - 0x6f, 0x72, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x60, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x60, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x60, - 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x6d, - 0x6f, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, 0x0a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, - 0x61, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, - 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x3a, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x61, 0x6d, 0x65, 0x20, 0x60, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x60, 0x2e, 0x0a, 0x0a, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x20, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x30, 0x29, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, - 0x61, 0x73, 0x20, 0x61, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, - 0x30, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x12, 0x08, 0x0d, 0x0a, - 0xde, 0x01, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x15, 0x02, 0x2f, 0x1a, 0xd0, 0x01, - 0x20, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x60, 0x47, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x20, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x60, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x0a, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, 0x03, 0x15, 0x02, 0x20, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x15, 0x21, 0x2a, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x15, 0x2d, 0x2e, 0x0a, 0x88, 0x01, 0x0a, 0x04, 0x04, - 0x00, 0x02, 0x01, 0x12, 0x03, 0x18, 0x02, 0x29, 0x1a, 0x7b, 0x20, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x69, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x42, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x41, 0x62, 0x73, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x22, 0x4e, 0x0a, 0x0c, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x53, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x06, 0x73, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x22, 0x8f, 0x05, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x07, 0x65, 0x64, + 0x32, 0x35, 0x35, 0x31, 0x39, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, + 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x07, 0x65, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x12, 0x52, + 0x0a, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x65, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x45, 0x64, 0x32, 0x35, 0x35, 0x31, 0x39, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x45, 0x64, 0x32, 0x35, 0x35, + 0x31, 0x39, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4b, 0x65, + 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x12, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x59, 0x0a, 0x13, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x4b, + 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x4e, 0x0a, 0x0b, 0x61, + 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0b, + 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x45, 0x44, 0x32, 0x35, 0x35, 0x31, 0x39, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x45, 0x44, 0x32, 0x35, 0x35, + 0x31, 0x39, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x05, 0x12, 0x14, 0x0a, + 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x54, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x06, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x42, 0x0b, 0x0a, 0x09, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, + 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x52, 0x0a, 0x12, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x5f, 0x6f, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4f, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x4f, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x56, 0x0a, 0x0d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, + 0x0e, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x54, 0x61, 0x67, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x70, 0x53, + 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x2a, 0xea, 0x02, 0x0a, 0x09, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x42, 0x4f, + 0x4f, 0x4c, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x53, 0x5f, 0x55, 0x38, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x4f, 0x56, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x31, 0x36, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x4d, + 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x33, 0x32, 0x10, 0x0d, 0x12, + 0x12, 0x0a, 0x0e, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x36, + 0x34, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x53, 0x5f, 0x55, 0x31, 0x32, 0x38, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x56, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x32, 0x35, 0x36, 0x10, 0x0e, 0x12, 0x16, 0x0a, + 0x12, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x41, 0x44, 0x44, 0x52, + 0x45, 0x53, 0x53, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x53, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x56, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x53, 0x5f, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x08, 0x12, 0x21, 0x0a, 0x1d, 0x4d, 0x4f, + 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x10, 0x09, 0x12, 0x18, 0x0a, + 0x14, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x46, 0x45, + 0x52, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x4f, 0x56, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x52, 0x53, 0x41, 0x42, 0x4c, 0x45, + 0x10, 0x0b, 0x2a, 0x87, 0x01, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x41, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, + 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, + 0x5f, 0x43, 0x4f, 0x50, 0x59, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x4f, 0x56, 0x45, 0x5f, + 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x44, 0x52, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x16, + 0x0a, 0x12, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x53, + 0x54, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x41, + 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x04, 0x42, 0x9e, 0x01, 0x0a, + 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0xa2, 0x02, 0x03, + 0x41, 0x54, 0x58, 0xaa, 0x02, 0x14, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x14, 0x41, 0x70, 0x74, + 0x6f, 0x73, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x16, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x3a, 0x3a, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x4a, 0xa8, 0xbc, + 0x01, 0x0a, 0x07, 0x12, 0x05, 0x03, 0x00, 0xf5, 0x04, 0x01, 0x0a, 0x4e, 0x0a, 0x01, 0x0c, 0x12, + 0x03, 0x03, 0x00, 0x12, 0x32, 0x44, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0xc2, 0xa9, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x53, 0x50, 0x44, 0x58, 0x2d, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x2d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3a, 0x20, 0x41, + 0x70, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x0a, 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, + 0x03, 0x05, 0x00, 0x1d, 0x0a, 0x09, 0x0a, 0x02, 0x03, 0x00, 0x12, 0x03, 0x07, 0x00, 0x2e, 0x0a, + 0xa3, 0x05, 0x0a, 0x02, 0x04, 0x00, 0x12, 0x04, 0x12, 0x00, 0x20, 0x01, 0x1a, 0x96, 0x05, 0x20, + 0x41, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x70, 0x74, 0x6f, 0x73, + 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x28, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x61, + 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x60, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x29, 0x0a, + 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x60, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x6f, 0x72, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, - 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, - 0x18, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x18, 0x09, - 0x0f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x18, 0x12, 0x13, 0x0a, - 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x08, 0x12, 0x03, 0x18, 0x14, 0x28, 0x0a, 0x0d, 0x0a, - 0x06, 0x04, 0x00, 0x02, 0x01, 0x08, 0x06, 0x12, 0x03, 0x18, 0x15, 0x27, 0x0a, 0x87, 0x02, 0x0a, - 0x04, 0x04, 0x00, 0x02, 0x02, 0x12, 0x03, 0x1c, 0x02, 0x28, 0x1a, 0xf9, 0x01, 0x20, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x60, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x60, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x6c, 0x79, + 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, + 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2c, 0x0a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, + 0x73, 0x6f, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x3a, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0a, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x60, 0x2e, 0x0a, + 0x0a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x20, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x30, 0x29, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x60, 0x30, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x12, 0x08, + 0x0d, 0x0a, 0xde, 0x01, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x15, 0x02, 0x2f, 0x1a, + 0xd0, 0x01, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x60, 0x47, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x65, + 0x72, 0x79, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x60, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, 0x03, 0x15, 0x02, 0x20, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x15, 0x21, 0x2a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x15, 0x2d, 0x2e, 0x0a, 0x88, 0x01, 0x0a, + 0x04, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x18, 0x02, 0x29, 0x1a, 0x7b, 0x20, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x05, + 0x12, 0x03, 0x18, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, + 0x18, 0x09, 0x0f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x18, 0x12, + 0x13, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x01, 0x08, 0x12, 0x03, 0x18, 0x14, 0x28, 0x0a, + 0x0d, 0x0a, 0x06, 0x04, 0x00, 0x02, 0x01, 0x08, 0x06, 0x12, 0x03, 0x18, 0x15, 0x27, 0x0a, 0x87, + 0x02, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x02, 0x12, 0x03, 0x1c, 0x02, 0x28, 0x1a, 0xf9, 0x01, 0x20, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x68, 0x6f, 0x6c, + 0x64, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, - 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x28, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x29, 0x0a, - 0x20, 0x61, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x2c, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, - 0x20, 0x28, 0x62, 0x75, 0x74, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x29, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x60, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x04, 0x12, - 0x03, 0x1c, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x06, 0x12, 0x03, 0x1c, - 0x0b, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x1c, 0x17, 0x23, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x1c, 0x26, 0x27, 0x0a, 0x99, - 0x01, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x03, 0x12, 0x03, 0x1f, 0x02, 0x16, 0x1a, 0x8b, 0x01, 0x20, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x73, - 0x20, 0x75, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, - 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x74, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75, - 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, - 0x02, 0x03, 0x05, 0x12, 0x03, 0x1f, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x03, - 0x01, 0x12, 0x03, 0x1f, 0x09, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x03, 0x03, 0x12, - 0x03, 0x1f, 0x14, 0x15, 0x0a, 0x94, 0x04, 0x0a, 0x02, 0x04, 0x01, 0x12, 0x04, 0x27, 0x00, 0x47, - 0x01, 0x1a, 0x87, 0x04, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x34, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, - 0x0a, 0x20, 0x2d, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x0a, 0x20, 0x2d, - 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x20, 0x74, 0x6f, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x22, 0x0a, 0x20, 0x2d, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x45, 0x70, 0x69, 0x6c, 0x6f, - 0x67, 0x75, 0x65, 0x20, 0x2f, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, - 0x62, 0x6c, 0x6f, 0x63, 0x0a, 0x20, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x20, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x62, 0x61, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, - 0x01, 0x01, 0x12, 0x03, 0x27, 0x08, 0x13, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x00, 0x12, - 0x03, 0x28, 0x02, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x06, 0x12, 0x03, 0x28, - 0x02, 0x20, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x28, 0x21, 0x2a, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x28, 0x2d, 0x2e, 0x0a, 0x0b, - 0x0a, 0x04, 0x04, 0x01, 0x02, 0x01, 0x12, 0x03, 0x29, 0x02, 0x2a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x29, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, - 0x01, 0x01, 0x12, 0x03, 0x29, 0x09, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x01, 0x03, - 0x12, 0x03, 0x29, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x01, 0x08, 0x12, 0x03, - 0x29, 0x15, 0x29, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x02, 0x01, 0x08, 0x06, 0x12, 0x03, 0x29, - 0x16, 0x28, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x02, 0x12, 0x03, 0x2a, 0x02, 0x1b, 0x0a, - 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x02, 0x06, 0x12, 0x03, 0x2a, 0x02, 0x11, 0x0a, 0x0c, 0x0a, - 0x05, 0x04, 0x01, 0x02, 0x02, 0x01, 0x12, 0x03, 0x2a, 0x12, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x01, 0x02, 0x02, 0x03, 0x12, 0x03, 0x2a, 0x19, 0x1a, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, - 0x03, 0x12, 0x03, 0x2b, 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x05, 0x12, - 0x03, 0x2b, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x01, 0x12, 0x03, 0x2b, - 0x09, 0x0e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x03, 0x12, 0x03, 0x2b, 0x11, 0x12, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x08, 0x12, 0x03, 0x2b, 0x13, 0x27, 0x0a, 0x0d, - 0x0a, 0x06, 0x04, 0x01, 0x02, 0x03, 0x08, 0x06, 0x12, 0x03, 0x2b, 0x14, 0x26, 0x0a, 0x0b, 0x0a, - 0x04, 0x04, 0x01, 0x02, 0x04, 0x12, 0x03, 0x2c, 0x02, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, - 0x02, 0x04, 0x05, 0x12, 0x03, 0x2c, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x04, - 0x01, 0x12, 0x03, 0x2c, 0x09, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x04, 0x03, 0x12, - 0x03, 0x2c, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x04, 0x08, 0x12, 0x03, 0x2c, - 0x1a, 0x2e, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x02, 0x04, 0x08, 0x06, 0x12, 0x03, 0x2c, 0x1b, - 0x2d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x01, 0x04, 0x00, 0x12, 0x04, 0x2e, 0x02, 0x37, 0x03, 0x0a, - 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x04, 0x00, 0x01, 0x12, 0x03, 0x2e, 0x07, 0x16, 0x0a, 0x0d, 0x0a, - 0x06, 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2f, 0x04, 0x25, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2f, 0x04, 0x20, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x03, 0x2f, 0x23, 0x24, 0x0a, 0x0d, 0x0a, 0x06, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x30, 0x04, 0x21, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x01, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x30, 0x04, 0x1c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x01, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, 0x30, 0x1f, 0x20, 0x0a, 0x0d, 0x0a, 0x06, 0x04, - 0x01, 0x04, 0x00, 0x02, 0x02, 0x12, 0x03, 0x31, 0x04, 0x28, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, - 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x31, 0x04, 0x23, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, - 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x03, 0x31, 0x26, 0x27, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, - 0x04, 0x00, 0x02, 0x03, 0x12, 0x03, 0x32, 0x04, 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x04, - 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, 0x32, 0x04, 0x25, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x04, - 0x00, 0x02, 0x03, 0x02, 0x12, 0x03, 0x32, 0x28, 0x29, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x04, - 0x00, 0x02, 0x04, 0x12, 0x03, 0x33, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, - 0x02, 0x04, 0x01, 0x12, 0x03, 0x33, 0x04, 0x19, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, - 0x02, 0x04, 0x02, 0x12, 0x03, 0x33, 0x1c, 0x1d, 0x0a, 0x32, 0x0a, 0x06, 0x04, 0x01, 0x04, 0x00, - 0x02, 0x05, 0x12, 0x03, 0x35, 0x04, 0x24, 0x1a, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x20, 0x35, 0x2d, 0x31, 0x39, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, 0x03, 0x35, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x05, 0x02, 0x12, 0x03, 0x35, 0x21, 0x23, 0x0a, 0x0d, 0x0a, 0x06, - 0x04, 0x01, 0x04, 0x00, 0x02, 0x06, 0x12, 0x03, 0x36, 0x04, 0x29, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x01, 0x04, 0x00, 0x02, 0x06, 0x01, 0x12, 0x03, 0x36, 0x04, 0x23, 0x0a, 0x0e, 0x0a, 0x07, 0x04, - 0x01, 0x04, 0x00, 0x02, 0x06, 0x02, 0x12, 0x03, 0x36, 0x26, 0x28, 0x0a, 0x0b, 0x0a, 0x04, 0x04, - 0x01, 0x02, 0x05, 0x12, 0x03, 0x39, 0x02, 0x1b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x05, - 0x06, 0x12, 0x03, 0x39, 0x02, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x05, 0x01, 0x12, - 0x03, 0x39, 0x12, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x05, 0x03, 0x12, 0x03, 0x39, - 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x01, 0x08, 0x00, 0x12, 0x04, 0x3b, 0x02, 0x44, 0x03, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x08, 0x00, 0x01, 0x12, 0x03, 0x3b, 0x08, 0x10, 0x0a, 0x0b, - 0x0a, 0x04, 0x04, 0x01, 0x02, 0x06, 0x12, 0x03, 0x3c, 0x04, 0x30, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x01, 0x02, 0x06, 0x06, 0x12, 0x03, 0x3c, 0x04, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, - 0x06, 0x01, 0x12, 0x03, 0x3c, 0x1d, 0x2b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x06, 0x03, - 0x12, 0x03, 0x3c, 0x2e, 0x2f, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x07, 0x12, 0x03, 0x3d, - 0x04, 0x23, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x06, 0x12, 0x03, 0x3d, 0x04, 0x16, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x01, 0x12, 0x03, 0x3d, 0x17, 0x1e, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x03, 0x12, 0x03, 0x3d, 0x21, 0x22, 0x0a, 0x0b, 0x0a, 0x04, - 0x04, 0x01, 0x02, 0x08, 0x12, 0x03, 0x3e, 0x04, 0x34, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, - 0x08, 0x06, 0x12, 0x03, 0x3e, 0x04, 0x1e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x08, 0x01, - 0x12, 0x03, 0x3e, 0x1f, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x08, 0x03, 0x12, 0x03, - 0x3e, 0x32, 0x33, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x09, 0x12, 0x03, 0x3f, 0x04, 0x1e, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x09, 0x06, 0x12, 0x03, 0x3f, 0x04, 0x13, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x01, 0x02, 0x09, 0x01, 0x12, 0x03, 0x3f, 0x14, 0x18, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x01, 0x02, 0x09, 0x03, 0x12, 0x03, 0x3f, 0x1b, 0x1d, 0x0a, 0x30, 0x0a, 0x04, 0x04, 0x01, - 0x02, 0x0a, 0x12, 0x03, 0x41, 0x04, 0x28, 0x1a, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, - 0x31, 0x31, 0x2d, 0x31, 0x39, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x01, 0x02, 0x0a, 0x06, 0x12, 0x03, 0x41, 0x04, 0x18, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, - 0x02, 0x0a, 0x01, 0x12, 0x03, 0x41, 0x19, 0x22, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0a, - 0x03, 0x12, 0x03, 0x41, 0x25, 0x27, 0x0a, 0x6e, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x0b, 0x12, 0x03, - 0x43, 0x04, 0x31, 0x1a, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x32, 0x32, 0x20, 0x69, - 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x75, 0x70, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, - 0x28, 0x61, 0x6c, 0x6c, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, - 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x6f, 0x20, 0x32, 0x33, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, 0x06, 0x12, - 0x03, 0x43, 0x04, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, 0x01, 0x12, 0x03, 0x43, - 0x1d, 0x2b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, 0x03, 0x12, 0x03, 0x43, 0x2e, 0x30, - 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x0c, 0x12, 0x03, 0x46, 0x02, 0x25, 0x0a, 0x0c, 0x0a, - 0x05, 0x04, 0x01, 0x02, 0x0c, 0x06, 0x12, 0x03, 0x46, 0x02, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x01, 0x02, 0x0c, 0x01, 0x12, 0x03, 0x46, 0x16, 0x1f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, - 0x0c, 0x03, 0x12, 0x03, 0x46, 0x22, 0x24, 0x0a, 0x20, 0x0a, 0x02, 0x04, 0x02, 0x12, 0x04, 0x4a, - 0x00, 0x51, 0x01, 0x1a, 0x14, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x02, 0x01, - 0x12, 0x03, 0x4a, 0x08, 0x20, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x00, 0x12, 0x03, 0x4b, - 0x02, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x05, 0x12, 0x03, 0x4b, 0x02, 0x08, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x4b, 0x09, 0x0b, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x4b, 0x0e, 0x0f, 0x0a, 0x0b, 0x0a, 0x04, - 0x04, 0x02, 0x02, 0x01, 0x12, 0x03, 0x4c, 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, - 0x01, 0x05, 0x12, 0x03, 0x4c, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x01, 0x01, - 0x12, 0x03, 0x4c, 0x09, 0x0e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x01, 0x03, 0x12, 0x03, - 0x4c, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x01, 0x08, 0x12, 0x03, 0x4c, 0x13, - 0x27, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x02, 0x02, 0x01, 0x08, 0x06, 0x12, 0x03, 0x4c, 0x14, 0x26, - 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x02, 0x12, 0x03, 0x4d, 0x02, 0x1c, 0x0a, 0x0c, 0x0a, - 0x05, 0x04, 0x02, 0x02, 0x02, 0x04, 0x12, 0x03, 0x4d, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x02, 0x02, 0x02, 0x06, 0x12, 0x03, 0x4d, 0x0b, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, - 0x02, 0x01, 0x12, 0x03, 0x4d, 0x11, 0x17, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x02, 0x03, - 0x12, 0x03, 0x4d, 0x1a, 0x1b, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x03, 0x12, 0x03, 0x4e, - 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x05, 0x12, 0x03, 0x4e, 0x02, 0x07, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x01, 0x12, 0x03, 0x4e, 0x08, 0x23, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x03, 0x12, 0x03, 0x4e, 0x26, 0x27, 0x0a, 0x0b, 0x0a, 0x04, - 0x04, 0x02, 0x02, 0x04, 0x12, 0x03, 0x4f, 0x02, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, - 0x04, 0x05, 0x12, 0x03, 0x4f, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x04, 0x01, - 0x12, 0x03, 0x4f, 0x09, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x04, 0x03, 0x12, 0x03, - 0x4f, 0x14, 0x15, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x05, 0x12, 0x03, 0x50, 0x02, 0x2e, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x05, 0x04, 0x12, 0x03, 0x50, 0x02, 0x0a, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x02, 0x02, 0x05, 0x05, 0x12, 0x03, 0x50, 0x0b, 0x11, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x02, 0x02, 0x05, 0x01, 0x12, 0x03, 0x50, 0x12, 0x29, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, - 0x02, 0x05, 0x03, 0x12, 0x03, 0x50, 0x2c, 0x2d, 0x0a, 0x0a, 0x0a, 0x02, 0x04, 0x03, 0x12, 0x04, - 0x53, 0x00, 0x56, 0x01, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x03, 0x01, 0x12, 0x03, 0x53, 0x08, 0x1a, - 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x00, 0x12, 0x03, 0x54, 0x02, 0x17, 0x0a, 0x0c, 0x0a, - 0x05, 0x04, 0x03, 0x02, 0x00, 0x06, 0x12, 0x03, 0x54, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, - 0x03, 0x02, 0x00, 0x01, 0x12, 0x03, 0x54, 0x0b, 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, - 0x00, 0x03, 0x12, 0x03, 0x54, 0x15, 0x16, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x01, 0x12, - 0x03, 0x55, 0x02, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x04, 0x12, 0x03, 0x55, - 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x06, 0x12, 0x03, 0x55, 0x0b, 0x10, - 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x12, 0x03, 0x55, 0x11, 0x17, 0x0a, 0x0c, - 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x03, 0x12, 0x03, 0x55, 0x1a, 0x1b, 0x0a, 0x09, 0x0a, 0x02, - 0x04, 0x04, 0x12, 0x03, 0x58, 0x00, 0x25, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x04, 0x01, 0x12, 0x03, - 0x58, 0x08, 0x22, 0x0a, 0x0b, 0x0a, 0x02, 0x04, 0x05, 0x12, 0x05, 0x5a, 0x00, 0x8e, 0x01, 0x01, - 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x05, 0x01, 0x12, 0x03, 0x5a, 0x08, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x05, 0x08, 0x00, 0x12, 0x04, 0x5b, 0x02, 0x5e, 0x03, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, - 0x08, 0x00, 0x01, 0x12, 0x03, 0x5b, 0x08, 0x20, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x05, 0x02, 0x00, - 0x12, 0x03, 0x5c, 0x04, 0x2e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x06, 0x12, 0x03, - 0x5c, 0x04, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x01, 0x12, 0x03, 0x5c, 0x16, - 0x29, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x03, 0x12, 0x03, 0x5c, 0x2c, 0x2d, 0x0a, - 0x0b, 0x0a, 0x04, 0x04, 0x05, 0x02, 0x01, 0x12, 0x03, 0x5d, 0x04, 0x1d, 0x0a, 0x0c, 0x0a, 0x05, - 0x04, 0x05, 0x02, 0x01, 0x06, 0x12, 0x03, 0x5d, 0x04, 0x0d, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, - 0x02, 0x01, 0x01, 0x12, 0x03, 0x5d, 0x0e, 0x18, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x01, - 0x03, 0x12, 0x03, 0x5d, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x04, 0x04, 0x05, 0x03, 0x00, 0x12, 0x05, - 0x60, 0x02, 0x82, 0x01, 0x03, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x03, 0x00, 0x01, 0x12, 0x03, - 0x60, 0x0a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x12, 0x04, 0x61, - 0x04, 0x77, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, - 0x61, 0x0c, 0x20, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, - 0x03, 0x62, 0x06, 0x18, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x05, 0x12, 0x03, 0x62, 0x06, 0x0c, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x01, 0x12, 0x03, 0x62, 0x0d, 0x13, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x62, 0x16, 0x17, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x63, 0x06, 0x19, 0x0a, 0x10, 0x0a, 0x09, 0x04, - 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x63, 0x06, 0x0c, 0x0a, 0x10, 0x0a, - 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x63, 0x0d, 0x14, 0x0a, - 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x63, 0x17, - 0x18, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x12, 0x04, 0x64, - 0x06, 0x74, 0x07, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, - 0x12, 0x03, 0x64, 0x0e, 0x11, 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x03, 0x00, 0x12, 0x04, 0x65, 0x08, 0x6b, 0x09, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x65, 0x10, 0x13, 0x0a, 0x13, 0x0a, - 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x66, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x65, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, + 0x29, 0x0a, 0x20, 0x61, 0x20, 0x60, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x20, + 0x74, 0x6f, 0x20, 0x28, 0x62, 0x75, 0x74, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x29, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x60, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, + 0x04, 0x12, 0x03, 0x1c, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x06, 0x12, + 0x03, 0x1c, 0x0b, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x1c, + 0x17, 0x23, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x1c, 0x26, 0x27, + 0x0a, 0x99, 0x01, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x03, 0x12, 0x03, 0x1f, 0x02, 0x16, 0x1a, 0x8b, + 0x01, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x73, 0x20, 0x75, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x74, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, + 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x00, 0x02, 0x03, 0x05, 0x12, 0x03, 0x1f, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, + 0x02, 0x03, 0x01, 0x12, 0x03, 0x1f, 0x09, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x03, + 0x03, 0x12, 0x03, 0x1f, 0x14, 0x15, 0x0a, 0x94, 0x04, 0x0a, 0x02, 0x04, 0x01, 0x12, 0x04, 0x27, + 0x00, 0x47, 0x01, 0x1a, 0x87, 0x04, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, + 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x34, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x3a, 0x0a, 0x20, 0x2d, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x0a, + 0x20, 0x2d, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x67, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x22, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x22, 0x0a, 0x20, 0x2d, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x45, 0x70, 0x69, + 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x20, 0x2f, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, + 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x0a, 0x20, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x0a, 0x0a, 0x0a, + 0x03, 0x04, 0x01, 0x01, 0x12, 0x03, 0x27, 0x08, 0x13, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, + 0x00, 0x12, 0x03, 0x28, 0x02, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x06, 0x12, + 0x03, 0x28, 0x02, 0x20, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x28, + 0x21, 0x2a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x28, 0x2d, 0x2e, + 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x01, 0x12, 0x03, 0x29, 0x02, 0x2a, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x29, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x01, 0x02, 0x01, 0x01, 0x12, 0x03, 0x29, 0x09, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, + 0x01, 0x03, 0x12, 0x03, 0x29, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x01, 0x08, + 0x12, 0x03, 0x29, 0x15, 0x29, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x02, 0x01, 0x08, 0x06, 0x12, + 0x03, 0x29, 0x16, 0x28, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x02, 0x12, 0x03, 0x2a, 0x02, + 0x1b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x02, 0x06, 0x12, 0x03, 0x2a, 0x02, 0x11, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x02, 0x01, 0x12, 0x03, 0x2a, 0x12, 0x16, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x02, 0x03, 0x12, 0x03, 0x2a, 0x19, 0x1a, 0x0a, 0x0b, 0x0a, 0x04, 0x04, + 0x01, 0x02, 0x03, 0x12, 0x03, 0x2b, 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, + 0x05, 0x12, 0x03, 0x2b, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x01, 0x12, + 0x03, 0x2b, 0x09, 0x0e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x03, 0x12, 0x03, 0x2b, + 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x03, 0x08, 0x12, 0x03, 0x2b, 0x13, 0x27, + 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x02, 0x03, 0x08, 0x06, 0x12, 0x03, 0x2b, 0x14, 0x26, 0x0a, + 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x04, 0x12, 0x03, 0x2c, 0x02, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x01, 0x02, 0x04, 0x05, 0x12, 0x03, 0x2c, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, + 0x02, 0x04, 0x01, 0x12, 0x03, 0x2c, 0x09, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x04, + 0x03, 0x12, 0x03, 0x2c, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x04, 0x08, 0x12, + 0x03, 0x2c, 0x1a, 0x2e, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x02, 0x04, 0x08, 0x06, 0x12, 0x03, + 0x2c, 0x1b, 0x2d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x01, 0x04, 0x00, 0x12, 0x04, 0x2e, 0x02, 0x37, + 0x03, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x04, 0x00, 0x01, 0x12, 0x03, 0x2e, 0x07, 0x16, 0x0a, + 0x0d, 0x0a, 0x06, 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2f, 0x04, 0x25, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2f, 0x04, 0x20, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x03, 0x2f, 0x23, 0x24, 0x0a, 0x0d, + 0x0a, 0x06, 0x04, 0x01, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x30, 0x04, 0x21, 0x0a, 0x0e, 0x0a, + 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x30, 0x04, 0x1c, 0x0a, 0x0e, 0x0a, + 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, 0x30, 0x1f, 0x20, 0x0a, 0x0d, 0x0a, + 0x06, 0x04, 0x01, 0x04, 0x00, 0x02, 0x02, 0x12, 0x03, 0x31, 0x04, 0x28, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x01, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x31, 0x04, 0x23, 0x0a, 0x0e, 0x0a, 0x07, + 0x04, 0x01, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x03, 0x31, 0x26, 0x27, 0x0a, 0x0d, 0x0a, 0x06, + 0x04, 0x01, 0x04, 0x00, 0x02, 0x03, 0x12, 0x03, 0x32, 0x04, 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x01, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, 0x32, 0x04, 0x25, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x01, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x03, 0x32, 0x28, 0x29, 0x0a, 0x0d, 0x0a, 0x06, 0x04, + 0x01, 0x04, 0x00, 0x02, 0x04, 0x12, 0x03, 0x33, 0x04, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, + 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x33, 0x04, 0x19, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x01, + 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x03, 0x33, 0x1c, 0x1d, 0x0a, 0x32, 0x0a, 0x06, 0x04, 0x01, + 0x04, 0x00, 0x02, 0x05, 0x12, 0x03, 0x35, 0x04, 0x24, 0x1a, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x35, 0x2d, 0x31, 0x39, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, 0x03, 0x35, 0x04, 0x1e, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x05, 0x02, 0x12, 0x03, 0x35, 0x21, 0x23, 0x0a, 0x0d, + 0x0a, 0x06, 0x04, 0x01, 0x04, 0x00, 0x02, 0x06, 0x12, 0x03, 0x36, 0x04, 0x29, 0x0a, 0x0e, 0x0a, + 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x06, 0x01, 0x12, 0x03, 0x36, 0x04, 0x23, 0x0a, 0x0e, 0x0a, + 0x07, 0x04, 0x01, 0x04, 0x00, 0x02, 0x06, 0x02, 0x12, 0x03, 0x36, 0x26, 0x28, 0x0a, 0x0b, 0x0a, + 0x04, 0x04, 0x01, 0x02, 0x05, 0x12, 0x03, 0x39, 0x02, 0x1b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, + 0x02, 0x05, 0x06, 0x12, 0x03, 0x39, 0x02, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x05, + 0x01, 0x12, 0x03, 0x39, 0x12, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x05, 0x03, 0x12, + 0x03, 0x39, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x01, 0x08, 0x00, 0x12, 0x04, 0x3b, 0x02, + 0x44, 0x03, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x08, 0x00, 0x01, 0x12, 0x03, 0x3b, 0x08, 0x10, + 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x06, 0x12, 0x03, 0x3c, 0x04, 0x30, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x06, 0x06, 0x12, 0x03, 0x3c, 0x04, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x01, 0x02, 0x06, 0x01, 0x12, 0x03, 0x3c, 0x1d, 0x2b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, + 0x06, 0x03, 0x12, 0x03, 0x3c, 0x2e, 0x2f, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x07, 0x12, + 0x03, 0x3d, 0x04, 0x23, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x06, 0x12, 0x03, 0x3d, + 0x04, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x01, 0x12, 0x03, 0x3d, 0x17, 0x1e, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x07, 0x03, 0x12, 0x03, 0x3d, 0x21, 0x22, 0x0a, 0x0b, + 0x0a, 0x04, 0x04, 0x01, 0x02, 0x08, 0x12, 0x03, 0x3e, 0x04, 0x34, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x01, 0x02, 0x08, 0x06, 0x12, 0x03, 0x3e, 0x04, 0x1e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, + 0x08, 0x01, 0x12, 0x03, 0x3e, 0x1f, 0x2f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x08, 0x03, + 0x12, 0x03, 0x3e, 0x32, 0x33, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x09, 0x12, 0x03, 0x3f, + 0x04, 0x1e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x09, 0x06, 0x12, 0x03, 0x3f, 0x04, 0x13, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x09, 0x01, 0x12, 0x03, 0x3f, 0x14, 0x18, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x01, 0x02, 0x09, 0x03, 0x12, 0x03, 0x3f, 0x1b, 0x1d, 0x0a, 0x30, 0x0a, 0x04, + 0x04, 0x01, 0x02, 0x0a, 0x12, 0x03, 0x41, 0x04, 0x28, 0x1a, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x31, 0x31, 0x2d, 0x31, 0x39, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0a, 0x06, 0x12, 0x03, 0x41, 0x04, 0x18, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x01, 0x02, 0x0a, 0x01, 0x12, 0x03, 0x41, 0x19, 0x22, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, + 0x02, 0x0a, 0x03, 0x12, 0x03, 0x41, 0x25, 0x27, 0x0a, 0x6e, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x0b, + 0x12, 0x03, 0x43, 0x04, 0x31, 0x1a, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x32, 0x32, + 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x75, 0x70, 0x20, 0x62, 0x65, 0x6c, 0x6f, + 0x77, 0x20, 0x28, 0x61, 0x6c, 0x6c, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x32, 0x33, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, + 0x06, 0x12, 0x03, 0x43, 0x04, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, 0x01, 0x12, + 0x03, 0x43, 0x1d, 0x2b, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0b, 0x03, 0x12, 0x03, 0x43, + 0x2e, 0x30, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x01, 0x02, 0x0c, 0x12, 0x03, 0x46, 0x02, 0x25, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x01, 0x02, 0x0c, 0x06, 0x12, 0x03, 0x46, 0x02, 0x15, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x01, 0x02, 0x0c, 0x01, 0x12, 0x03, 0x46, 0x16, 0x1f, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x01, 0x02, 0x0c, 0x03, 0x12, 0x03, 0x46, 0x22, 0x24, 0x0a, 0x20, 0x0a, 0x02, 0x04, 0x02, 0x12, + 0x04, 0x4a, 0x00, 0x51, 0x01, 0x1a, 0x14, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0a, 0x0a, 0x03, 0x04, + 0x02, 0x01, 0x12, 0x03, 0x4a, 0x08, 0x20, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x00, 0x12, + 0x03, 0x4b, 0x02, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x05, 0x12, 0x03, 0x4b, + 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x4b, 0x09, 0x0b, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x4b, 0x0e, 0x0f, 0x0a, 0x0b, + 0x0a, 0x04, 0x04, 0x02, 0x02, 0x01, 0x12, 0x03, 0x4c, 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x02, 0x02, 0x01, 0x05, 0x12, 0x03, 0x4c, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, + 0x01, 0x01, 0x12, 0x03, 0x4c, 0x09, 0x0e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x01, 0x03, + 0x12, 0x03, 0x4c, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x01, 0x08, 0x12, 0x03, + 0x4c, 0x13, 0x27, 0x0a, 0x0d, 0x0a, 0x06, 0x04, 0x02, 0x02, 0x01, 0x08, 0x06, 0x12, 0x03, 0x4c, + 0x14, 0x26, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x02, 0x12, 0x03, 0x4d, 0x02, 0x1c, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x02, 0x04, 0x12, 0x03, 0x4d, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x02, 0x02, 0x02, 0x06, 0x12, 0x03, 0x4d, 0x0b, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x02, 0x02, 0x02, 0x01, 0x12, 0x03, 0x4d, 0x11, 0x17, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, + 0x02, 0x03, 0x12, 0x03, 0x4d, 0x1a, 0x1b, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x03, 0x12, + 0x03, 0x4e, 0x02, 0x28, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x05, 0x12, 0x03, 0x4e, + 0x02, 0x07, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x01, 0x12, 0x03, 0x4e, 0x08, 0x23, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x03, 0x03, 0x12, 0x03, 0x4e, 0x26, 0x27, 0x0a, 0x0b, + 0x0a, 0x04, 0x04, 0x02, 0x02, 0x04, 0x12, 0x03, 0x4f, 0x02, 0x16, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x02, 0x02, 0x04, 0x05, 0x12, 0x03, 0x4f, 0x02, 0x08, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, + 0x04, 0x01, 0x12, 0x03, 0x4f, 0x09, 0x11, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x04, 0x03, + 0x12, 0x03, 0x4f, 0x14, 0x15, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x02, 0x02, 0x05, 0x12, 0x03, 0x50, + 0x02, 0x2e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x05, 0x04, 0x12, 0x03, 0x50, 0x02, 0x0a, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x02, 0x02, 0x05, 0x05, 0x12, 0x03, 0x50, 0x0b, 0x11, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x02, 0x02, 0x05, 0x01, 0x12, 0x03, 0x50, 0x12, 0x29, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x02, 0x02, 0x05, 0x03, 0x12, 0x03, 0x50, 0x2c, 0x2d, 0x0a, 0x0a, 0x0a, 0x02, 0x04, 0x03, + 0x12, 0x04, 0x53, 0x00, 0x56, 0x01, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x03, 0x01, 0x12, 0x03, 0x53, + 0x08, 0x1a, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x03, 0x02, 0x00, 0x12, 0x03, 0x54, 0x02, 0x17, 0x0a, + 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x00, 0x06, 0x12, 0x03, 0x54, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, + 0x05, 0x04, 0x03, 0x02, 0x00, 0x01, 0x12, 0x03, 0x54, 0x0b, 0x12, 0x0a, 0x0c, 0x0a, 0x05, 0x04, + 0x03, 0x02, 0x00, 0x03, 0x12, 0x03, 0x54, 0x15, 0x16, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x12, 0x03, 0x55, 0x02, 0x1c, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x04, 0x12, + 0x03, 0x55, 0x02, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x06, 0x12, 0x03, 0x55, + 0x0b, 0x10, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x12, 0x03, 0x55, 0x11, 0x17, + 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x03, 0x02, 0x01, 0x03, 0x12, 0x03, 0x55, 0x1a, 0x1b, 0x0a, 0x09, + 0x0a, 0x02, 0x04, 0x04, 0x12, 0x03, 0x58, 0x00, 0x25, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x04, 0x01, + 0x12, 0x03, 0x58, 0x08, 0x22, 0x0a, 0x0b, 0x0a, 0x02, 0x04, 0x05, 0x12, 0x05, 0x5a, 0x00, 0x8e, + 0x01, 0x01, 0x0a, 0x0a, 0x0a, 0x03, 0x04, 0x05, 0x01, 0x12, 0x03, 0x5a, 0x08, 0x1c, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x05, 0x08, 0x00, 0x12, 0x04, 0x5b, 0x02, 0x5e, 0x03, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x05, 0x08, 0x00, 0x01, 0x12, 0x03, 0x5b, 0x08, 0x20, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x05, + 0x02, 0x00, 0x12, 0x03, 0x5c, 0x04, 0x2e, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x06, + 0x12, 0x03, 0x5c, 0x04, 0x15, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x01, 0x12, 0x03, + 0x5c, 0x16, 0x29, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x00, 0x03, 0x12, 0x03, 0x5c, 0x2c, + 0x2d, 0x0a, 0x0b, 0x0a, 0x04, 0x04, 0x05, 0x02, 0x01, 0x12, 0x03, 0x5d, 0x04, 0x1d, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x05, 0x02, 0x01, 0x06, 0x12, 0x03, 0x5d, 0x04, 0x0d, 0x0a, 0x0c, 0x0a, 0x05, + 0x04, 0x05, 0x02, 0x01, 0x01, 0x12, 0x03, 0x5d, 0x0e, 0x18, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, + 0x02, 0x01, 0x03, 0x12, 0x03, 0x5d, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x04, 0x04, 0x05, 0x03, 0x00, + 0x12, 0x05, 0x60, 0x02, 0x82, 0x01, 0x03, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x05, 0x03, 0x00, 0x01, + 0x12, 0x03, 0x60, 0x0a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x12, + 0x04, 0x61, 0x04, 0x77, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x01, + 0x12, 0x03, 0x61, 0x0c, 0x20, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x12, 0x03, 0x62, 0x06, 0x18, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x05, 0x12, 0x03, 0x62, 0x06, 0x0c, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x62, 0x0d, 0x13, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x62, 0x16, 0x17, 0x0a, 0x0f, 0x0a, 0x08, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x63, 0x06, 0x19, 0x0a, 0x10, 0x0a, + 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x63, 0x06, 0x0c, 0x0a, + 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x63, 0x0d, + 0x14, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, + 0x63, 0x17, 0x18, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x12, + 0x04, 0x64, 0x06, 0x74, 0x07, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x01, 0x12, 0x03, 0x64, 0x0e, 0x11, 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x12, 0x04, 0x65, 0x08, 0x6b, 0x09, 0x0a, 0x12, 0x0a, 0x0b, 0x04, + 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x65, 0x10, 0x13, 0x0a, + 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, + 0x03, 0x66, 0x0a, 0x19, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x66, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x66, 0x11, 0x14, + 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x03, 0x12, 0x03, 0x66, 0x17, 0x18, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x67, 0x0a, 0x19, 0x0a, 0x14, 0x0a, 0x0d, 0x04, + 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x67, 0x0a, + 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, + 0x01, 0x01, 0x12, 0x03, 0x67, 0x11, 0x14, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x67, 0x17, 0x18, 0x0a, 0x13, 0x0a, + 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x68, 0x0a, 0x19, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x05, 0x12, 0x03, 0x66, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x66, 0x11, 0x14, 0x0a, 0x14, - 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, - 0x03, 0x66, 0x17, 0x18, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x67, 0x0a, 0x19, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x05, 0x12, 0x03, 0x67, 0x0a, 0x10, 0x0a, - 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, - 0x12, 0x03, 0x67, 0x11, 0x14, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x67, 0x17, 0x18, 0x0a, 0x13, 0x0a, 0x0c, 0x04, - 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x68, 0x0a, 0x19, - 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, - 0x05, 0x12, 0x03, 0x68, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x68, 0x11, 0x14, 0x0a, 0x14, 0x0a, 0x0d, - 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x68, - 0x17, 0x18, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x03, 0x12, 0x03, 0x69, 0x0a, 0x17, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x03, 0x05, 0x12, 0x03, 0x69, 0x0a, 0x10, 0x0a, 0x14, 0x0a, - 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, 0x12, 0x03, - 0x69, 0x11, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x02, 0x03, 0x03, 0x12, 0x03, 0x69, 0x15, 0x16, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x12, 0x03, 0x6a, 0x0a, 0x17, 0x0a, 0x14, - 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x05, 0x12, - 0x03, 0x6a, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x6a, 0x11, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x03, 0x12, 0x03, 0x6a, 0x15, 0x16, - 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x12, 0x04, - 0x6c, 0x08, 0x6f, 0x09, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x01, 0x01, 0x12, 0x03, 0x6c, 0x10, 0x1e, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x12, 0x03, 0x6d, 0x0a, 0x17, 0x0a, 0x14, 0x0a, - 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x05, 0x12, 0x03, - 0x6d, 0x0a, 0x0f, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, - 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x6d, 0x10, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x6d, 0x15, 0x16, 0x0a, - 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x12, - 0x03, 0x6e, 0x0a, 0x1c, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x6e, 0x0a, 0x0f, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, 0x03, 0x6e, 0x10, 0x17, - 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, - 0x03, 0x12, 0x03, 0x6e, 0x1a, 0x1b, 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x08, 0x00, 0x12, 0x04, 0x70, 0x08, 0x73, 0x09, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x12, 0x03, 0x70, 0x0e, 0x15, 0x0a, 0x11, - 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x71, 0x0a, - 0x2d, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x06, - 0x12, 0x03, 0x71, 0x0a, 0x18, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, - 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x71, 0x19, 0x28, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, - 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x71, 0x2b, 0x2c, 0x0a, 0x11, 0x0a, - 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x72, 0x0a, 0x16, - 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x06, 0x12, - 0x03, 0x72, 0x0a, 0x0d, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x01, 0x01, 0x12, 0x03, 0x72, 0x0e, 0x11, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x72, 0x14, 0x15, 0x0a, 0x0f, 0x0a, 0x08, - 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x76, 0x06, 0x1c, 0x0a, 0x10, 0x0a, - 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x04, 0x12, 0x03, 0x76, 0x06, 0x0e, 0x0a, - 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x06, 0x12, 0x03, 0x76, 0x0f, - 0x12, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, - 0x76, 0x13, 0x17, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x03, - 0x12, 0x03, 0x76, 0x1a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x12, - 0x04, 0x78, 0x04, 0x7c, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x01, - 0x12, 0x03, 0x78, 0x0c, 0x26, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, - 0x00, 0x12, 0x03, 0x79, 0x06, 0x29, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, - 0x02, 0x00, 0x04, 0x12, 0x03, 0x79, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x01, 0x02, 0x00, 0x05, 0x12, 0x03, 0x79, 0x0f, 0x15, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x79, 0x16, 0x24, 0x0a, 0x10, 0x0a, 0x09, - 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x79, 0x27, 0x28, 0x0a, 0x1e, - 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x12, 0x03, 0x7b, 0x06, 0x14, 0x1a, - 0x0d, 0x20, 0x48, 0x65, 0x78, 0x54, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x10, - 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x7b, 0x06, 0x0b, - 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, 0x03, 0x7b, - 0x0c, 0x0f, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x03, 0x12, - 0x03, 0x7b, 0x12, 0x13, 0x0a, 0x0f, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x12, 0x05, - 0x7d, 0x04, 0x80, 0x01, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x01, - 0x12, 0x03, 0x7d, 0x0c, 0x21, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, - 0x00, 0x12, 0x03, 0x7e, 0x06, 0x26, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, - 0x02, 0x00, 0x06, 0x12, 0x03, 0x7e, 0x06, 0x1a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, - 0x03, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x7e, 0x1b, 0x21, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, - 0x03, 0x00, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x7e, 0x24, 0x25, 0x0a, 0x0f, 0x0a, 0x08, - 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x12, 0x03, 0x7f, 0x06, 0x2f, 0x0a, 0x10, 0x0a, - 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x06, 0x12, 0x03, 0x7f, 0x06, 0x20, 0x0a, - 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x01, 0x12, 0x03, 0x7f, 0x21, - 0x2a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x03, 0x12, 0x03, - 0x7f, 0x2d, 0x2e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0x81, - 0x01, 0x04, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x06, 0x12, 0x04, - 0x81, 0x01, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, - 0x04, 0x81, 0x01, 0x1a, 0x31, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x03, - 0x12, 0x04, 0x81, 0x01, 0x34, 0x35, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x05, 0x03, 0x01, 0x12, 0x06, - 0x84, 0x01, 0x02, 0x8b, 0x01, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x03, 0x01, 0x01, 0x12, - 0x04, 0x84, 0x01, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x12, - 0x06, 0x85, 0x01, 0x04, 0x89, 0x01, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x01, 0x03, - 0x00, 0x01, 0x12, 0x04, 0x85, 0x01, 0x0c, 0x19, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x01, - 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0x86, 0x01, 0x06, 0x17, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, - 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0x86, 0x01, 0x06, 0x0c, 0x0a, 0x11, 0x0a, - 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x86, 0x01, 0x0d, 0x12, - 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0x86, - 0x01, 0x15, 0x16, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x01, 0x12, - 0x04, 0x87, 0x01, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, - 0x01, 0x05, 0x12, 0x04, 0x87, 0x01, 0x06, 0x0c, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, - 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x87, 0x01, 0x0d, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, - 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0x87, 0x01, 0x16, 0x17, 0x0a, 0x10, - 0x0a, 0x08, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x02, 0x12, 0x04, 0x88, 0x01, 0x06, 0x18, - 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x02, 0x05, 0x12, 0x04, 0x88, - 0x01, 0x06, 0x0b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x02, 0x01, - 0x12, 0x04, 0x88, 0x01, 0x0c, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, - 0x02, 0x02, 0x03, 0x12, 0x04, 0x88, 0x01, 0x16, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, - 0x01, 0x02, 0x00, 0x12, 0x04, 0x8a, 0x01, 0x04, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, - 0x01, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8a, 0x01, 0x04, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, - 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8a, 0x01, 0x12, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, - 0x05, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8a, 0x01, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x05, 0x02, 0x02, 0x12, 0x04, 0x8d, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, - 0x02, 0x02, 0x04, 0x12, 0x04, 0x8d, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x02, - 0x02, 0x06, 0x12, 0x04, 0x8d, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x02, - 0x01, 0x12, 0x04, 0x8d, 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x02, 0x02, 0x03, - 0x12, 0x04, 0x8d, 0x01, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x06, 0x12, 0x06, 0x90, 0x01, - 0x00, 0x92, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x06, 0x01, 0x12, 0x04, 0x90, 0x01, 0x08, - 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x06, 0x02, 0x00, 0x12, 0x04, 0x91, 0x01, 0x02, 0x2b, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x04, 0x12, 0x04, 0x91, 0x01, 0x02, 0x0a, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x06, 0x12, 0x04, 0x91, 0x01, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x06, 0x02, 0x00, 0x01, 0x12, 0x04, 0x91, 0x01, 0x18, 0x26, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x06, 0x02, 0x00, 0x03, 0x12, 0x04, 0x91, 0x01, 0x29, 0x2a, 0x0a, 0x0c, 0x0a, 0x02, 0x04, - 0x07, 0x12, 0x06, 0x94, 0x01, 0x00, 0x99, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x07, 0x01, - 0x12, 0x04, 0x94, 0x01, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x00, 0x12, 0x04, - 0x95, 0x01, 0x02, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x05, 0x12, 0x04, 0x95, - 0x01, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x01, 0x12, 0x04, 0x95, 0x01, - 0x07, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x03, 0x12, 0x04, 0x95, 0x01, 0x21, - 0x22, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x01, 0x12, 0x04, 0x96, 0x01, 0x02, 0x26, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x01, 0x05, 0x12, 0x04, 0x96, 0x01, 0x02, 0x06, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x07, 0x02, 0x01, 0x01, 0x12, 0x04, 0x96, 0x01, 0x07, 0x21, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x07, 0x02, 0x01, 0x03, 0x12, 0x04, 0x96, 0x01, 0x24, 0x25, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x07, 0x02, 0x02, 0x12, 0x04, 0x97, 0x01, 0x02, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, - 0x02, 0x02, 0x05, 0x12, 0x04, 0x97, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, - 0x02, 0x01, 0x12, 0x04, 0x97, 0x01, 0x09, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x02, - 0x03, 0x12, 0x04, 0x97, 0x01, 0x2b, 0x2c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x03, 0x12, - 0x04, 0x98, 0x01, 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x05, 0x12, 0x04, - 0x98, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x01, 0x12, 0x04, 0x98, - 0x01, 0x09, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x03, 0x12, 0x04, 0x98, 0x01, - 0x24, 0x25, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x08, 0x12, 0x06, 0x9b, 0x01, 0x00, 0x9e, 0x01, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x08, 0x01, 0x12, 0x04, 0x9b, 0x01, 0x08, 0x17, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x08, 0x02, 0x00, 0x12, 0x04, 0x9c, 0x01, 0x02, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x08, 0x02, 0x00, 0x06, 0x12, 0x04, 0x9c, 0x01, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, - 0x02, 0x00, 0x01, 0x12, 0x04, 0x9c, 0x01, 0x19, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, - 0x00, 0x03, 0x12, 0x04, 0x9c, 0x01, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x08, 0x02, 0x01, - 0x12, 0x04, 0x9d, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x04, 0x12, - 0x04, 0x9d, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x06, 0x12, 0x04, - 0x9d, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9d, - 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x03, 0x12, 0x04, 0x9d, 0x01, - 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x09, 0x12, 0x06, 0xa0, 0x01, 0x00, 0xa6, 0x01, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x09, 0x01, 0x12, 0x04, 0xa0, 0x01, 0x08, 0x0d, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x09, 0x02, 0x00, 0x12, 0x04, 0xa1, 0x01, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x09, 0x02, 0x00, 0x06, 0x12, 0x04, 0xa1, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xa1, 0x01, 0x0b, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, - 0x00, 0x03, 0x12, 0x04, 0xa1, 0x01, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x01, - 0x12, 0x04, 0xa2, 0x01, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x05, 0x12, - 0x04, 0xa2, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x01, 0x12, 0x04, - 0xa2, 0x01, 0x09, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x03, 0x12, 0x04, 0xa2, - 0x01, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x08, 0x12, 0x04, 0xa2, 0x01, - 0x1d, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x09, 0x02, 0x01, 0x08, 0x06, 0x12, 0x04, 0xa2, 0x01, - 0x1e, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x02, 0x12, 0x04, 0xa3, 0x01, 0x02, 0x14, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x06, 0x12, 0x04, 0xa3, 0x01, 0x02, 0x0a, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x01, 0x12, 0x04, 0xa3, 0x01, 0x0b, 0x0f, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x03, 0x12, 0x04, 0xa3, 0x01, 0x12, 0x13, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x09, 0x02, 0x03, 0x12, 0x04, 0xa4, 0x01, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x09, 0x02, 0x03, 0x05, 0x12, 0x04, 0xa4, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, - 0x02, 0x03, 0x01, 0x12, 0x04, 0xa4, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, - 0x03, 0x03, 0x12, 0x04, 0xa4, 0x01, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x04, - 0x12, 0x04, 0xa5, 0x01, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, 0x05, 0x12, - 0x04, 0xa5, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, 0x01, 0x12, 0x04, - 0xa5, 0x01, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, 0x03, 0x12, 0x04, 0xa5, - 0x01, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0a, 0x12, 0x06, 0xa8, 0x01, 0x00, 0xb2, 0x01, - 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0a, 0x01, 0x12, 0x04, 0xa8, 0x01, 0x08, 0x17, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x00, 0x12, 0x04, 0xa9, 0x01, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa9, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa9, 0x01, 0x08, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, - 0x02, 0x00, 0x03, 0x12, 0x04, 0xa9, 0x01, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, - 0x01, 0x12, 0x04, 0xaa, 0x01, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x01, 0x05, - 0x12, 0x04, 0xaa, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x01, 0x01, 0x12, - 0x04, 0xaa, 0x01, 0x08, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x01, 0x03, 0x12, 0x04, - 0xaa, 0x01, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x02, 0x12, 0x04, 0xab, 0x01, - 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x05, 0x12, 0x04, 0xab, 0x01, 0x02, - 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x01, 0x12, 0x04, 0xab, 0x01, 0x08, 0x17, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xab, 0x01, 0x1a, 0x1b, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x03, 0x12, 0x04, 0xac, 0x01, 0x02, 0x2b, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x0a, 0x02, 0x03, 0x04, 0x12, 0x04, 0xac, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0a, 0x02, 0x03, 0x05, 0x12, 0x04, 0xac, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xac, 0x01, 0x11, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, - 0x02, 0x03, 0x03, 0x12, 0x04, 0xac, 0x01, 0x29, 0x2a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, - 0x04, 0x12, 0x04, 0xad, 0x01, 0x02, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x05, - 0x12, 0x04, 0xad, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x01, 0x12, - 0x04, 0xad, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x03, 0x12, 0x04, - 0xad, 0x01, 0x14, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x08, 0x12, 0x04, 0xad, - 0x01, 0x16, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0a, 0x02, 0x04, 0x08, 0x06, 0x12, 0x04, 0xad, - 0x01, 0x17, 0x29, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x05, 0x12, 0x04, 0xae, 0x01, 0x02, - 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x05, 0x12, 0x04, 0xae, 0x01, 0x02, 0x06, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x01, 0x12, 0x04, 0xae, 0x01, 0x07, 0x0e, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x03, 0x12, 0x04, 0xae, 0x01, 0x11, 0x12, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x06, 0x12, 0x04, 0xaf, 0x01, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0a, 0x02, 0x06, 0x05, 0x12, 0x04, 0xaf, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0a, 0x02, 0x06, 0x01, 0x12, 0x04, 0xaf, 0x01, 0x09, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, - 0x02, 0x06, 0x03, 0x12, 0x04, 0xaf, 0x01, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, - 0x07, 0x12, 0x04, 0xb0, 0x01, 0x02, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x07, 0x05, - 0x12, 0x04, 0xb0, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x07, 0x01, 0x12, - 0x04, 0xb0, 0x01, 0x08, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x07, 0x03, 0x12, 0x04, - 0xb0, 0x01, 0x20, 0x21, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x08, 0x12, 0x04, 0xb1, 0x01, - 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x04, 0x12, 0x04, 0xb1, 0x01, 0x02, - 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x06, 0x12, 0x04, 0xb1, 0x01, 0x0b, 0x19, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x01, 0x12, 0x04, 0xb1, 0x01, 0x1a, 0x21, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x03, 0x12, 0x04, 0xb1, 0x01, 0x24, 0x25, 0x0a, 0x0c, - 0x0a, 0x02, 0x04, 0x0b, 0x12, 0x06, 0xb4, 0x01, 0x00, 0xb7, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, - 0x04, 0x0b, 0x01, 0x12, 0x04, 0xb4, 0x01, 0x08, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0b, 0x02, - 0x00, 0x12, 0x04, 0xb5, 0x01, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x05, - 0x12, 0x04, 0xb5, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x01, 0x12, - 0x04, 0xb5, 0x01, 0x09, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x03, 0x12, 0x04, - 0xb5, 0x01, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x08, 0x12, 0x04, 0xb5, - 0x01, 0x1d, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0b, 0x02, 0x00, 0x08, 0x06, 0x12, 0x04, 0xb5, - 0x01, 0x1e, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0b, 0x02, 0x01, 0x12, 0x04, 0xb6, 0x01, 0x02, - 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb6, 0x01, 0x02, 0x08, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb6, 0x01, 0x09, 0x18, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb6, 0x01, 0x1b, 0x1c, 0x0a, 0x0c, - 0x0a, 0x02, 0x04, 0x0c, 0x12, 0x06, 0xb9, 0x01, 0x00, 0xc1, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, - 0x04, 0x0c, 0x01, 0x12, 0x04, 0xb9, 0x01, 0x08, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, - 0x00, 0x12, 0x04, 0xba, 0x01, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x00, 0x05, - 0x12, 0x04, 0xba, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x00, 0x01, 0x12, - 0x04, 0xba, 0x01, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x00, 0x03, 0x12, 0x04, - 0xba, 0x01, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x01, 0x12, 0x04, 0xbb, 0x01, - 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x05, 0x12, 0x04, 0xbb, 0x01, 0x02, - 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbb, 0x01, 0x09, 0x18, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbb, 0x01, 0x1b, 0x1c, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x08, 0x12, 0x04, 0xbb, 0x01, 0x1d, 0x31, 0x0a, 0x0e, - 0x0a, 0x06, 0x04, 0x0c, 0x02, 0x01, 0x08, 0x06, 0x12, 0x04, 0xbb, 0x01, 0x1e, 0x30, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x02, 0x12, 0x04, 0xbc, 0x01, 0x02, 0x31, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0c, 0x02, 0x02, 0x05, 0x12, 0x04, 0xbc, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xbc, 0x01, 0x09, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, - 0x02, 0x02, 0x03, 0x12, 0x04, 0xbc, 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, - 0x02, 0x08, 0x12, 0x04, 0xbc, 0x01, 0x1c, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0c, 0x02, 0x02, - 0x08, 0x06, 0x12, 0x04, 0xbc, 0x01, 0x1d, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x03, - 0x12, 0x04, 0xbd, 0x01, 0x02, 0x31, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x05, 0x12, - 0x04, 0xbd, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x01, 0x12, 0x04, - 0xbd, 0x01, 0x09, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x03, 0x12, 0x04, 0xbd, - 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x08, 0x12, 0x04, 0xbd, 0x01, - 0x1c, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0c, 0x02, 0x03, 0x08, 0x06, 0x12, 0x04, 0xbd, 0x01, - 0x1d, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x04, 0x12, 0x04, 0xbe, 0x01, 0x02, 0x3f, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x06, 0x12, 0x04, 0xbe, 0x01, 0x02, 0x20, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x01, 0x12, 0x04, 0xbe, 0x01, 0x21, 0x3a, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x03, 0x12, 0x04, 0xbe, 0x01, 0x3d, 0x3e, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x0c, 0x02, 0x05, 0x12, 0x04, 0xbf, 0x01, 0x02, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0c, 0x02, 0x05, 0x06, 0x12, 0x04, 0xbf, 0x01, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, - 0x02, 0x05, 0x01, 0x12, 0x04, 0xbf, 0x01, 0x15, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, - 0x05, 0x03, 0x12, 0x04, 0xbf, 0x01, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x06, - 0x12, 0x04, 0xc0, 0x01, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, 0x06, 0x12, - 0x04, 0xc0, 0x01, 0x02, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, 0x01, 0x12, 0x04, - 0xc0, 0x01, 0x0c, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, 0x03, 0x12, 0x04, 0xc0, - 0x01, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0d, 0x12, 0x06, 0xc3, 0x01, 0x00, 0xcf, 0x01, - 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0d, 0x01, 0x12, 0x04, 0xc3, 0x01, 0x08, 0x10, 0x0a, 0x0e, - 0x0a, 0x04, 0x04, 0x0d, 0x04, 0x00, 0x12, 0x06, 0xc4, 0x01, 0x02, 0xc8, 0x01, 0x03, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x0d, 0x04, 0x00, 0x01, 0x12, 0x04, 0xc4, 0x01, 0x07, 0x13, 0x0a, 0x0e, 0x0a, - 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xc5, 0x01, 0x04, 0x23, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc5, 0x01, 0x04, 0x1e, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xc5, 0x01, 0x21, 0x22, 0x0a, - 0x0e, 0x0a, 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xc6, 0x01, 0x04, 0x28, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc6, 0x01, 0x04, 0x23, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xc6, 0x01, 0x26, - 0x27, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xc7, 0x01, 0x04, - 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc7, 0x01, - 0x04, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xc7, - 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0d, 0x02, 0x00, 0x12, 0x04, 0xca, 0x01, 0x02, - 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x06, 0x12, 0x04, 0xca, 0x01, 0x02, 0x0e, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xca, 0x01, 0x0f, 0x1d, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xca, 0x01, 0x20, 0x21, 0x0a, 0x0e, - 0x0a, 0x04, 0x04, 0x0d, 0x08, 0x00, 0x12, 0x06, 0xcb, 0x01, 0x02, 0xce, 0x01, 0x03, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x0d, 0x08, 0x00, 0x01, 0x12, 0x04, 0xcb, 0x01, 0x08, 0x11, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x0d, 0x02, 0x01, 0x12, 0x04, 0xcc, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0d, 0x02, 0x01, 0x06, 0x12, 0x04, 0xcc, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xcc, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xcc, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0d, 0x02, 0x02, - 0x12, 0x04, 0xcd, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, 0x06, 0x12, - 0x04, 0xcd, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xcd, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, 0x03, 0x12, 0x04, 0xcd, - 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0e, 0x12, 0x06, 0xd1, 0x01, 0x00, 0xd4, 0x01, - 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0e, 0x01, 0x12, 0x04, 0xd1, 0x01, 0x08, 0x16, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x0e, 0x02, 0x00, 0x12, 0x04, 0xd2, 0x01, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xd2, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x01, 0x09, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, - 0x02, 0x00, 0x03, 0x12, 0x04, 0xd2, 0x01, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0e, 0x02, - 0x01, 0x12, 0x04, 0xd3, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x01, 0x06, - 0x12, 0x04, 0xd3, 0x01, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x01, 0x01, 0x12, - 0x04, 0xd3, 0x01, 0x10, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x01, 0x03, 0x12, 0x04, - 0xd3, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0f, 0x12, 0x06, 0xd6, 0x01, 0x00, 0xd9, - 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0f, 0x01, 0x12, 0x04, 0xd6, 0x01, 0x08, 0x16, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x0f, 0x02, 0x00, 0x12, 0x04, 0xd7, 0x01, 0x02, 0x2f, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x0f, 0x02, 0x00, 0x04, 0x12, 0x04, 0xd7, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x0f, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd7, 0x01, 0x0b, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x0f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd7, 0x01, 0x1a, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, - 0x02, 0x00, 0x03, 0x12, 0x04, 0xd7, 0x01, 0x2d, 0x2e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0f, 0x02, - 0x01, 0x12, 0x04, 0xd8, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x04, - 0x12, 0x04, 0xd8, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x06, 0x12, - 0x04, 0xd8, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x01, 0x12, 0x04, - 0xd8, 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x03, 0x12, 0x04, 0xd8, - 0x01, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x10, 0x12, 0x06, 0xdb, 0x01, 0x00, 0xf0, 0x01, - 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x10, 0x01, 0x12, 0x04, 0xdb, 0x01, 0x08, 0x16, 0x0a, 0x0e, - 0x0a, 0x04, 0x04, 0x10, 0x04, 0x00, 0x12, 0x06, 0xdc, 0x01, 0x02, 0xe4, 0x01, 0x03, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x10, 0x04, 0x00, 0x01, 0x12, 0x04, 0xdc, 0x01, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, - 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xdd, 0x01, 0x04, 0x19, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xdd, 0x01, 0x04, 0x14, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xdd, 0x01, 0x17, 0x18, 0x0a, - 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xde, 0x01, 0x04, 0x1b, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x01, 0x04, 0x16, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xde, 0x01, 0x19, - 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xdf, 0x01, 0x04, - 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xdf, 0x01, - 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xdf, - 0x01, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xe0, - 0x01, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, - 0xe0, 0x01, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, - 0x04, 0xe0, 0x01, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x04, 0x12, - 0x04, 0xe1, 0x01, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x04, 0x01, - 0x12, 0x04, 0xe1, 0x01, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x04, - 0x02, 0x12, 0x04, 0xe1, 0x01, 0x18, 0x19, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, - 0x05, 0x12, 0x04, 0xe2, 0x01, 0x04, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, - 0x05, 0x01, 0x12, 0x04, 0xe2, 0x01, 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, - 0x02, 0x05, 0x02, 0x12, 0x04, 0xe2, 0x01, 0x1a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, - 0x00, 0x02, 0x06, 0x12, 0x04, 0xe3, 0x01, 0x04, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, - 0x00, 0x02, 0x06, 0x01, 0x12, 0x04, 0xe3, 0x01, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, - 0x04, 0x00, 0x02, 0x06, 0x02, 0x12, 0x04, 0xe3, 0x01, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x10, 0x02, 0x00, 0x12, 0x04, 0xe6, 0x01, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, - 0x00, 0x06, 0x12, 0x04, 0xe6, 0x01, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x00, - 0x01, 0x12, 0x04, 0xe6, 0x01, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x00, 0x03, - 0x12, 0x04, 0xe6, 0x01, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x10, 0x08, 0x00, 0x12, 0x06, - 0xe8, 0x01, 0x02, 0xef, 0x01, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x08, 0x00, 0x01, 0x12, - 0x04, 0xe8, 0x01, 0x08, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x01, 0x12, 0x04, 0xe9, - 0x01, 0x04, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe9, 0x01, - 0x04, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, 0x01, 0x11, - 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe9, 0x01, 0x21, 0x22, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x02, 0x12, 0x04, 0xea, 0x01, 0x04, 0x27, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x10, 0x02, 0x02, 0x06, 0x12, 0x04, 0xea, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x10, 0x02, 0x02, 0x01, 0x12, 0x04, 0xea, 0x01, 0x13, 0x22, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x10, 0x02, 0x02, 0x03, 0x12, 0x04, 0xea, 0x01, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x10, 0x02, 0x03, 0x12, 0x04, 0xeb, 0x01, 0x04, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, - 0x03, 0x06, 0x12, 0x04, 0xeb, 0x01, 0x04, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x03, - 0x01, 0x12, 0x04, 0xeb, 0x01, 0x14, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x03, 0x03, - 0x12, 0x04, 0xeb, 0x01, 0x28, 0x29, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x04, 0x12, 0x04, - 0xec, 0x01, 0x04, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x06, 0x12, 0x04, 0xec, - 0x01, 0x04, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x01, 0x12, 0x04, 0xec, 0x01, - 0x10, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x03, 0x12, 0x04, 0xec, 0x01, 0x1f, - 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x05, 0x12, 0x04, 0xed, 0x01, 0x04, 0x25, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x05, 0x06, 0x12, 0x04, 0xed, 0x01, 0x04, 0x11, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x10, 0x02, 0x05, 0x01, 0x12, 0x04, 0xed, 0x01, 0x12, 0x20, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x10, 0x02, 0x05, 0x03, 0x12, 0x04, 0xed, 0x01, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x10, 0x02, 0x06, 0x12, 0x04, 0xee, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, - 0x02, 0x06, 0x06, 0x12, 0x04, 0xee, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, - 0x06, 0x01, 0x12, 0x04, 0xee, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x06, - 0x03, 0x12, 0x04, 0xee, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x11, 0x12, 0x06, 0xf2, - 0x01, 0x00, 0xf6, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x11, 0x01, 0x12, 0x04, 0xf2, 0x01, - 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x11, 0x02, 0x00, 0x12, 0x04, 0xf3, 0x01, 0x02, 0x15, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf3, 0x01, 0x02, 0x08, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf3, 0x01, 0x09, 0x10, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf3, 0x01, 0x13, 0x14, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x11, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x11, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf4, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xf4, 0x01, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xf4, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x11, 0x02, 0x02, - 0x12, 0x04, 0xf5, 0x01, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, 0x06, 0x12, - 0x04, 0xf5, 0x01, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xf5, 0x01, 0x0f, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf5, - 0x01, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x12, 0x12, 0x06, 0xf8, 0x01, 0x00, 0xfd, 0x01, - 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x12, 0x01, 0x12, 0x04, 0xf8, 0x01, 0x08, 0x16, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x12, 0x02, 0x00, 0x12, 0x04, 0xf9, 0x01, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x12, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf9, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x12, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf9, 0x01, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, - 0x02, 0x00, 0x03, 0x12, 0x04, 0xf9, 0x01, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, - 0x01, 0x12, 0x04, 0xfa, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x01, 0x05, - 0x12, 0x04, 0xfa, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x01, 0x01, 0x12, - 0x04, 0xfa, 0x01, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x01, 0x03, 0x12, 0x04, - 0xfa, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, 0x02, 0x12, 0x04, 0xfb, 0x01, - 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x06, 0x12, 0x04, 0xfb, 0x01, 0x02, - 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x01, 0x12, 0x04, 0xfb, 0x01, 0x10, 0x14, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfb, 0x01, 0x17, 0x18, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, 0x03, 0x12, 0x04, 0xfc, 0x01, 0x02, 0x16, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x12, 0x02, 0x03, 0x05, 0x12, 0x04, 0xfc, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x12, 0x02, 0x03, 0x01, 0x12, 0x04, 0xfc, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x12, 0x02, 0x03, 0x03, 0x12, 0x04, 0xfc, 0x01, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x13, - 0x12, 0x06, 0xff, 0x01, 0x00, 0x84, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x13, 0x01, 0x12, - 0x04, 0xff, 0x01, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x00, 0x12, 0x04, 0x80, - 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x05, 0x12, 0x04, 0x80, 0x02, - 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x01, 0x12, 0x04, 0x80, 0x02, 0x08, - 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x03, 0x12, 0x04, 0x80, 0x02, 0x19, 0x1a, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x01, 0x12, 0x04, 0x81, 0x02, 0x02, 0x14, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x13, 0x02, 0x01, 0x05, 0x12, 0x04, 0x81, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x13, 0x02, 0x01, 0x01, 0x12, 0x04, 0x81, 0x02, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x13, 0x02, 0x01, 0x03, 0x12, 0x04, 0x81, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x13, 0x02, 0x02, 0x12, 0x04, 0x82, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, - 0x02, 0x05, 0x12, 0x04, 0x82, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x02, - 0x01, 0x12, 0x04, 0x82, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x02, 0x03, - 0x12, 0x04, 0x82, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x03, 0x12, 0x04, - 0x83, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x06, 0x12, 0x04, 0x83, - 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x01, 0x12, 0x04, 0x83, 0x02, - 0x12, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x03, 0x12, 0x04, 0x83, 0x02, 0x19, - 0x1a, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x14, 0x12, 0x06, 0x86, 0x02, 0x00, 0x89, 0x02, 0x01, 0x0a, - 0x0b, 0x0a, 0x03, 0x04, 0x14, 0x01, 0x12, 0x04, 0x86, 0x02, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x14, 0x02, 0x00, 0x12, 0x04, 0x87, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, - 0x02, 0x00, 0x05, 0x12, 0x04, 0x87, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, - 0x00, 0x01, 0x12, 0x04, 0x87, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x00, - 0x03, 0x12, 0x04, 0x87, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x14, 0x02, 0x01, 0x12, - 0x04, 0x88, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x05, 0x12, 0x04, - 0x88, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x01, 0x12, 0x04, 0x88, - 0x02, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x03, 0x12, 0x04, 0x88, 0x02, - 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x15, 0x12, 0x06, 0x8b, 0x02, 0x00, 0x8f, 0x02, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x15, 0x01, 0x12, 0x04, 0x8b, 0x02, 0x08, 0x13, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x15, 0x02, 0x00, 0x12, 0x04, 0x8c, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x15, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8c, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, - 0x02, 0x00, 0x01, 0x12, 0x04, 0x8c, 0x02, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, - 0x00, 0x03, 0x12, 0x04, 0x8c, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x15, 0x02, 0x01, - 0x12, 0x04, 0x8d, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, 0x05, 0x12, - 0x04, 0x8d, 0x02, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, 0x01, 0x12, 0x04, - 0x8d, 0x02, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8d, - 0x02, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x15, 0x02, 0x02, 0x12, 0x04, 0x8e, 0x02, 0x02, - 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x06, 0x12, 0x04, 0x8e, 0x02, 0x02, 0x14, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x01, 0x12, 0x04, 0x8e, 0x02, 0x15, 0x19, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x03, 0x12, 0x04, 0x8e, 0x02, 0x1c, 0x1d, 0x0a, 0x0c, - 0x0a, 0x02, 0x04, 0x16, 0x12, 0x06, 0x91, 0x02, 0x00, 0x97, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, - 0x04, 0x16, 0x01, 0x12, 0x04, 0x91, 0x02, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, - 0x00, 0x12, 0x04, 0x92, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x00, 0x05, - 0x12, 0x04, 0x92, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x00, 0x01, 0x12, - 0x04, 0x92, 0x02, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x00, 0x03, 0x12, 0x04, - 0x92, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x01, 0x12, 0x04, 0x93, 0x02, - 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x05, 0x12, 0x04, 0x93, 0x02, 0x02, - 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x01, 0x12, 0x04, 0x93, 0x02, 0x08, 0x16, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x03, 0x12, 0x04, 0x93, 0x02, 0x19, 0x1a, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x02, 0x12, 0x04, 0x94, 0x02, 0x02, 0x19, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x16, 0x02, 0x02, 0x06, 0x12, 0x04, 0x94, 0x02, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x16, 0x02, 0x02, 0x01, 0x12, 0x04, 0x94, 0x02, 0x10, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x16, 0x02, 0x02, 0x03, 0x12, 0x04, 0x94, 0x02, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, - 0x02, 0x03, 0x12, 0x04, 0x95, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x03, - 0x05, 0x12, 0x04, 0x95, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x03, 0x01, - 0x12, 0x04, 0x95, 0x02, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x03, 0x03, 0x12, - 0x04, 0x95, 0x02, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x04, 0x12, 0x04, 0x96, - 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x05, 0x12, 0x04, 0x96, 0x02, - 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x01, 0x12, 0x04, 0x96, 0x02, 0x09, - 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x03, 0x12, 0x04, 0x96, 0x02, 0x10, 0x11, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x17, 0x12, 0x06, 0x99, 0x02, 0x00, 0x9e, 0x02, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x17, 0x01, 0x12, 0x04, 0x99, 0x02, 0x08, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x17, 0x02, 0x00, 0x12, 0x04, 0x9a, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, - 0x00, 0x05, 0x12, 0x04, 0x9a, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x00, - 0x01, 0x12, 0x04, 0x9a, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x00, 0x03, - 0x12, 0x04, 0x9a, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x17, 0x02, 0x01, 0x12, 0x04, - 0x9b, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x05, 0x12, 0x04, 0x9b, - 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9b, 0x02, - 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x03, 0x12, 0x04, 0x9b, 0x02, 0x14, - 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x17, 0x02, 0x02, 0x12, 0x04, 0x9c, 0x02, 0x02, 0x13, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x02, 0x05, 0x12, 0x04, 0x9c, 0x02, 0x02, 0x08, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x17, 0x02, 0x02, 0x01, 0x12, 0x04, 0x9c, 0x02, 0x09, 0x0e, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x17, 0x02, 0x02, 0x03, 0x12, 0x04, 0x9c, 0x02, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x17, 0x02, 0x03, 0x12, 0x04, 0x9d, 0x02, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, - 0x02, 0x03, 0x05, 0x12, 0x04, 0x9d, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, - 0x03, 0x01, 0x12, 0x04, 0x9d, 0x02, 0x09, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x03, - 0x03, 0x12, 0x04, 0x9d, 0x02, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x18, 0x12, 0x06, 0xa0, - 0x02, 0x00, 0xa5, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x18, 0x01, 0x12, 0x04, 0xa0, 0x02, - 0x08, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x00, 0x12, 0x04, 0xa1, 0x02, 0x02, 0x1b, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa1, 0x02, 0x02, 0x07, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa1, 0x02, 0x08, 0x16, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa1, 0x02, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x18, 0x02, 0x01, 0x12, 0x04, 0xa2, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x18, 0x02, 0x01, 0x05, 0x12, 0x04, 0xa2, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xa2, 0x02, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xa2, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x02, - 0x12, 0x04, 0xa3, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, 0x05, 0x12, - 0x04, 0xa3, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xa3, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, 0x03, 0x12, 0x04, 0xa3, - 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x03, 0x12, 0x04, 0xa4, 0x02, 0x02, - 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x06, 0x12, 0x04, 0xa4, 0x02, 0x02, 0x10, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa4, 0x02, 0x11, 0x15, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x03, 0x12, 0x04, 0xa4, 0x02, 0x18, 0x19, 0x0a, 0x0c, - 0x0a, 0x02, 0x04, 0x19, 0x12, 0x06, 0xa7, 0x02, 0x00, 0xba, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, - 0x04, 0x19, 0x01, 0x12, 0x04, 0xa7, 0x02, 0x08, 0x1a, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x19, 0x04, - 0x00, 0x12, 0x06, 0xa8, 0x02, 0x02, 0xaf, 0x02, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x04, - 0x00, 0x01, 0x12, 0x04, 0xa8, 0x02, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, - 0x02, 0x00, 0x12, 0x04, 0xa9, 0x02, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xa9, 0x02, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, - 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xa9, 0x02, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, - 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xaa, 0x02, 0x04, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, - 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xaa, 0x02, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, - 0x19, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xaa, 0x02, 0x22, 0x23, 0x0a, 0x0e, 0x0a, 0x06, - 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xab, 0x02, 0x04, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, - 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xab, 0x02, 0x04, 0x17, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xab, 0x02, 0x1a, 0x1b, 0x0a, 0x0e, - 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xac, 0x02, 0x04, 0x1f, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xac, 0x02, 0x04, 0x1a, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0xac, 0x02, 0x1d, 0x1e, - 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0xad, 0x02, 0x04, 0x1e, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0xad, 0x02, 0x04, - 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0xad, 0x02, - 0x1c, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x04, 0x00, 0x04, 0x12, 0x04, 0xae, 0x02, 0x04, - 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x12, 0x04, 0xae, 0x02, 0x0d, - 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x01, 0x12, 0x04, 0xae, 0x02, - 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x02, 0x12, 0x04, 0xae, - 0x02, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x00, 0x12, 0x04, 0xb1, 0x02, 0x02, - 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x06, 0x12, 0x04, 0xb1, 0x02, 0x02, 0x06, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb1, 0x02, 0x07, 0x0b, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb1, 0x02, 0x0e, 0x0f, 0x0a, 0x0e, - 0x0a, 0x04, 0x04, 0x19, 0x08, 0x00, 0x12, 0x06, 0xb3, 0x02, 0x02, 0xb8, 0x02, 0x03, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x19, 0x08, 0x00, 0x01, 0x12, 0x04, 0xb3, 0x02, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x19, 0x02, 0x01, 0x12, 0x04, 0xb4, 0x02, 0x04, 0x34, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x19, 0x02, 0x01, 0x06, 0x12, 0x04, 0xb4, 0x02, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xb4, 0x02, 0x19, 0x2f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xb4, 0x02, 0x32, 0x33, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x02, - 0x12, 0x04, 0xb5, 0x02, 0x04, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, 0x06, 0x12, - 0x04, 0xb5, 0x02, 0x04, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xb5, 0x02, 0x12, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, 0x03, 0x12, 0x04, 0xb5, - 0x02, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x03, 0x12, 0x04, 0xb6, 0x02, 0x04, - 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x06, 0x12, 0x04, 0xb6, 0x02, 0x04, 0x13, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x01, 0x12, 0x04, 0xb6, 0x02, 0x14, 0x25, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x03, 0x12, 0x04, 0xb6, 0x02, 0x28, 0x29, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x19, 0x02, 0x04, 0x12, 0x04, 0xb7, 0x02, 0x04, 0x29, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x19, 0x02, 0x04, 0x06, 0x12, 0x04, 0xb7, 0x02, 0x04, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x19, 0x02, 0x04, 0x01, 0x12, 0x04, 0xb7, 0x02, 0x14, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, - 0x02, 0x04, 0x03, 0x12, 0x04, 0xb7, 0x02, 0x27, 0x28, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x19, 0x09, - 0x12, 0x04, 0xb9, 0x02, 0x02, 0x0d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x09, 0x00, 0x12, 0x04, - 0xb9, 0x02, 0x0b, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x09, 0x00, 0x01, 0x12, 0x04, 0xb9, - 0x02, 0x0b, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x09, 0x00, 0x02, 0x12, 0x04, 0xb9, 0x02, - 0x0b, 0x0c, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1a, 0x12, 0x06, 0xbc, 0x02, 0x00, 0xc1, 0x02, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1a, 0x01, 0x12, 0x04, 0xbc, 0x02, 0x08, 0x1c, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x1a, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x02, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x1a, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbd, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x02, 0x12, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, - 0x00, 0x03, 0x12, 0x04, 0xbd, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1a, 0x02, 0x01, - 0x12, 0x04, 0xbe, 0x02, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x04, 0x12, - 0x04, 0xbe, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x06, 0x12, 0x04, - 0xbe, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbe, - 0x02, 0x14, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbe, 0x02, - 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1a, 0x02, 0x02, 0x12, 0x04, 0xbf, 0x02, 0x02, 0x20, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x04, 0x12, 0x04, 0xbf, 0x02, 0x02, 0x0a, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x05, 0x12, 0x04, 0xbf, 0x02, 0x0b, 0x11, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x01, 0x12, 0x04, 0xbf, 0x02, 0x12, 0x1b, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x1a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xbf, 0x02, 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x1a, 0x02, 0x03, 0x12, 0x04, 0xc0, 0x02, 0x02, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, - 0x02, 0x03, 0x05, 0x12, 0x04, 0xc0, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, - 0x03, 0x01, 0x12, 0x04, 0xc0, 0x02, 0x09, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x03, - 0x03, 0x12, 0x04, 0xc0, 0x02, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1b, 0x12, 0x06, 0xc3, - 0x02, 0x00, 0xc6, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1b, 0x01, 0x12, 0x04, 0xc3, 0x02, - 0x08, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1b, 0x02, 0x00, 0x12, 0x04, 0xc4, 0x02, 0x02, 0x15, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc4, 0x02, 0x02, 0x07, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc4, 0x02, 0x08, 0x10, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc4, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x1b, 0x02, 0x01, 0x12, 0x04, 0xc5, 0x02, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x1b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xc5, 0x02, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xc5, 0x02, 0x0f, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xc5, 0x02, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1c, 0x12, 0x06, - 0xc8, 0x02, 0x00, 0xcc, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1c, 0x01, 0x12, 0x04, 0xc8, - 0x02, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1c, 0x02, 0x00, 0x12, 0x04, 0xc9, 0x02, 0x02, - 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc9, 0x02, 0x02, 0x14, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc9, 0x02, 0x15, 0x19, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc9, 0x02, 0x1c, 0x1d, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x1c, 0x02, 0x01, 0x12, 0x04, 0xca, 0x02, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x1c, 0x02, 0x01, 0x04, 0x12, 0x04, 0xca, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x1c, 0x02, 0x01, 0x06, 0x12, 0x04, 0xca, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xca, 0x02, 0x14, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xca, 0x02, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1c, 0x02, 0x02, - 0x12, 0x04, 0xcb, 0x02, 0x02, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x04, 0x12, - 0x04, 0xcb, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x05, 0x12, 0x04, - 0xcb, 0x02, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xcb, - 0x02, 0x12, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x03, 0x12, 0x04, 0xcb, 0x02, - 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1d, 0x12, 0x06, 0xce, 0x02, 0x00, 0xd1, 0x02, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1d, 0x01, 0x12, 0x04, 0xce, 0x02, 0x08, 0x17, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x1d, 0x02, 0x00, 0x12, 0x04, 0xcf, 0x02, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x1d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xcf, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xcf, 0x02, 0x09, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, - 0x00, 0x03, 0x12, 0x04, 0xcf, 0x02, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1d, 0x02, 0x01, - 0x12, 0x04, 0xd0, 0x02, 0x02, 0x3e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x04, 0x12, - 0x04, 0xd0, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x06, 0x12, 0x04, - 0xd0, 0x02, 0x0b, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd0, - 0x02, 0x26, 0x39, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xd0, 0x02, - 0x3c, 0x3d, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1e, 0x12, 0x06, 0xd3, 0x02, 0x00, 0xde, 0x02, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1e, 0x01, 0x12, 0x04, 0xd3, 0x02, 0x08, 0x22, 0x0a, 0x0e, 0x0a, - 0x04, 0x04, 0x1e, 0x04, 0x00, 0x12, 0x06, 0xd4, 0x02, 0x02, 0xd7, 0x02, 0x03, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x1e, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd4, 0x02, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, - 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd5, 0x02, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, - 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x02, 0x04, 0x14, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd5, 0x02, 0x17, 0x18, 0x0a, 0x0e, - 0x0a, 0x06, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd6, 0x02, 0x04, 0x24, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd6, 0x02, 0x04, 0x1f, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd6, 0x02, 0x22, 0x23, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1e, 0x02, 0x00, 0x12, 0x04, 0xd9, 0x02, 0x02, 0x10, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd9, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x1e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd9, 0x02, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x1e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd9, 0x02, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, - 0x1e, 0x08, 0x00, 0x12, 0x06, 0xdb, 0x02, 0x02, 0xdd, 0x02, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x1e, 0x08, 0x00, 0x01, 0x12, 0x04, 0xdb, 0x02, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1e, - 0x02, 0x01, 0x12, 0x04, 0xdc, 0x02, 0x04, 0x34, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x01, - 0x06, 0x12, 0x04, 0xdc, 0x02, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x01, 0x01, - 0x12, 0x04, 0xdc, 0x02, 0x19, 0x2f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x01, 0x03, 0x12, - 0x04, 0xdc, 0x02, 0x32, 0x33, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1f, 0x12, 0x06, 0xe0, 0x02, 0x00, - 0xe3, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1f, 0x01, 0x12, 0x04, 0xe0, 0x02, 0x08, 0x1a, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1f, 0x02, 0x00, 0x12, 0x04, 0xe1, 0x02, 0x02, 0x15, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe1, 0x02, 0x02, 0x07, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x1f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe1, 0x02, 0x08, 0x10, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x1f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe1, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x1f, 0x02, 0x01, 0x12, 0x04, 0xe2, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, - 0x01, 0x06, 0x12, 0x04, 0xe2, 0x02, 0x02, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x01, - 0x01, 0x12, 0x04, 0xe2, 0x02, 0x0d, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x01, 0x03, - 0x12, 0x04, 0xe2, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x20, 0x12, 0x06, 0xe5, 0x02, - 0x00, 0xeb, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x20, 0x01, 0x12, 0x04, 0xe5, 0x02, 0x08, - 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, 0x00, 0x12, 0x04, 0xe6, 0x02, 0x02, 0x15, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe6, 0x02, 0x02, 0x08, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x20, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe6, 0x02, 0x09, 0x10, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x20, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe6, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x20, 0x02, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, - 0x02, 0x01, 0x05, 0x12, 0x04, 0xe7, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, - 0x01, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x01, - 0x03, 0x12, 0x04, 0xe7, 0x02, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, 0x02, 0x12, - 0x04, 0xe8, 0x02, 0x02, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x04, 0x12, 0x04, - 0xe8, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x06, 0x12, 0x04, 0xe8, - 0x02, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x01, 0x12, 0x04, 0xe8, 0x02, - 0x18, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x03, 0x12, 0x04, 0xe8, 0x02, 0x22, - 0x23, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x02, 0x2e, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe9, 0x02, 0x02, 0x0a, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x06, 0x12, 0x04, 0xe9, 0x02, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x20, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe9, 0x02, 0x18, 0x29, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x20, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x2c, 0x2d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x20, 0x02, 0x04, 0x12, 0x04, 0xea, 0x02, 0x02, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, - 0x04, 0x04, 0x12, 0x04, 0xea, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x04, - 0x06, 0x12, 0x04, 0xea, 0x02, 0x0b, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x04, 0x01, - 0x12, 0x04, 0xea, 0x02, 0x16, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x04, 0x03, 0x12, - 0x04, 0xea, 0x02, 0x20, 0x21, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x21, 0x12, 0x06, 0xec, 0x02, 0x00, - 0xf9, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x21, 0x01, 0x12, 0x04, 0xec, 0x02, 0x08, 0x14, - 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x21, 0x04, 0x00, 0x12, 0x06, 0xed, 0x02, 0x02, 0xf2, 0x02, 0x03, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x04, 0x00, 0x01, 0x12, 0x04, 0xed, 0x02, 0x07, 0x11, 0x0a, - 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xee, 0x02, 0x04, 0x1f, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xee, 0x02, 0x04, 0x1a, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xee, 0x02, 0x1d, - 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xef, 0x02, 0x04, - 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xef, 0x02, - 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xef, - 0x02, 0x19, 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xf0, - 0x02, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xf0, 0x02, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, - 0x04, 0xf0, 0x02, 0x18, 0x19, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x03, 0x12, - 0x04, 0xf1, 0x02, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x03, 0x01, - 0x12, 0x04, 0xf1, 0x02, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x03, - 0x02, 0x12, 0x04, 0xf1, 0x02, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x00, 0x12, - 0x04, 0xf3, 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x05, 0x12, 0x04, - 0xf3, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf3, - 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf3, 0x02, - 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x02, 0x02, 0x29, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x06, 0x12, 0x04, 0xf4, 0x02, 0x02, 0x19, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf4, 0x02, 0x1a, 0x24, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf4, 0x02, 0x27, 0x28, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x21, 0x02, 0x02, 0x12, 0x04, 0xf5, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x21, 0x02, 0x02, 0x05, 0x12, 0x04, 0xf5, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, - 0x02, 0x02, 0x01, 0x12, 0x04, 0xf5, 0x02, 0x07, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, - 0x02, 0x03, 0x12, 0x04, 0xf5, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x03, - 0x12, 0x04, 0xf6, 0x02, 0x02, 0x40, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x04, 0x12, - 0x04, 0xf6, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x06, 0x12, 0x04, - 0xf6, 0x02, 0x0b, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x01, 0x12, 0x04, 0xf6, - 0x02, 0x28, 0x3b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x03, 0x12, 0x04, 0xf6, 0x02, - 0x3e, 0x3f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x04, 0x12, 0x04, 0xf7, 0x02, 0x02, 0x1f, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x04, 0x12, 0x04, 0xf7, 0x02, 0x02, 0x0a, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x06, 0x12, 0x04, 0xf7, 0x02, 0x0b, 0x13, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x01, 0x12, 0x04, 0xf7, 0x02, 0x14, 0x1a, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x21, 0x02, 0x04, 0x03, 0x12, 0x04, 0xf7, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x21, 0x02, 0x05, 0x12, 0x04, 0xf8, 0x02, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, - 0x02, 0x05, 0x04, 0x12, 0x04, 0xf8, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, - 0x05, 0x06, 0x12, 0x04, 0xf8, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x05, - 0x01, 0x12, 0x04, 0xf8, 0x02, 0x14, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x05, 0x03, - 0x12, 0x04, 0xf8, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x22, 0x12, 0x06, 0xfb, 0x02, - 0x00, 0x82, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x22, 0x01, 0x12, 0x04, 0xfb, 0x02, 0x08, - 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x00, 0x12, 0x04, 0xfc, 0x02, 0x02, 0x12, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x00, 0x05, 0x12, 0x04, 0xfc, 0x02, 0x02, 0x08, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x22, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfc, 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x22, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfc, 0x02, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x22, 0x02, 0x01, 0x12, 0x04, 0xfd, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, - 0x02, 0x01, 0x05, 0x12, 0x04, 0xfd, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, - 0x01, 0x01, 0x12, 0x04, 0xfd, 0x02, 0x07, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x01, - 0x03, 0x12, 0x04, 0xfd, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x02, 0x12, - 0x04, 0xfe, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x05, 0x12, 0x04, - 0xfe, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x01, 0x12, 0x04, 0xfe, - 0x02, 0x07, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfe, 0x02, - 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x03, 0x12, 0x04, 0xff, 0x02, 0x02, 0x25, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x04, 0x12, 0x04, 0xff, 0x02, 0x02, 0x0a, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x06, 0x12, 0x04, 0xff, 0x02, 0x0b, 0x16, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x01, 0x12, 0x04, 0xff, 0x02, 0x17, 0x20, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x22, 0x02, 0x03, 0x03, 0x12, 0x04, 0xff, 0x02, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x22, 0x02, 0x04, 0x12, 0x04, 0x80, 0x03, 0x02, 0x3e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, - 0x02, 0x04, 0x04, 0x12, 0x04, 0x80, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, - 0x04, 0x06, 0x12, 0x04, 0x80, 0x03, 0x0b, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x04, - 0x01, 0x12, 0x04, 0x80, 0x03, 0x26, 0x39, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x04, 0x03, - 0x12, 0x04, 0x80, 0x03, 0x3c, 0x3d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x05, 0x12, 0x04, - 0x81, 0x03, 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x04, 0x12, 0x04, 0x81, - 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x06, 0x12, 0x04, 0x81, 0x03, - 0x0b, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x01, 0x12, 0x04, 0x81, 0x03, 0x1b, - 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x03, 0x12, 0x04, 0x81, 0x03, 0x24, 0x25, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x23, 0x12, 0x06, 0x84, 0x03, 0x00, 0x87, 0x03, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x23, 0x01, 0x12, 0x04, 0x84, 0x03, 0x08, 0x22, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x23, 0x02, 0x00, 0x12, 0x04, 0x85, 0x03, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, - 0x00, 0x04, 0x12, 0x04, 0x85, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x00, - 0x06, 0x12, 0x04, 0x85, 0x03, 0x0b, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x00, 0x01, - 0x12, 0x04, 0x85, 0x03, 0x17, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x00, 0x03, 0x12, - 0x04, 0x85, 0x03, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x23, 0x02, 0x01, 0x12, 0x04, 0x86, - 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x05, 0x12, 0x04, 0x86, 0x03, - 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x01, 0x12, 0x04, 0x86, 0x03, 0x07, - 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x03, 0x12, 0x04, 0x86, 0x03, 0x14, 0x15, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x24, 0x12, 0x06, 0x89, 0x03, 0x00, 0x8c, 0x03, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x24, 0x01, 0x12, 0x04, 0x89, 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x24, 0x02, 0x00, 0x12, 0x04, 0x8a, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, - 0x00, 0x05, 0x12, 0x04, 0x8a, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x00, - 0x01, 0x12, 0x04, 0x8a, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x00, 0x03, - 0x12, 0x04, 0x8a, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x24, 0x02, 0x01, 0x12, 0x04, - 0x8b, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x06, 0x12, 0x04, 0x8b, - 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8b, 0x03, - 0x0b, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8b, 0x03, 0x12, - 0x13, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x25, 0x12, 0x06, 0x8e, 0x03, 0x00, 0x90, 0x03, 0x01, 0x0a, - 0x0b, 0x0a, 0x03, 0x04, 0x25, 0x01, 0x12, 0x04, 0x8e, 0x03, 0x08, 0x24, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x25, 0x02, 0x00, 0x12, 0x04, 0x8f, 0x03, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, - 0x02, 0x00, 0x04, 0x12, 0x04, 0x8f, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, 0x02, - 0x00, 0x06, 0x12, 0x04, 0x8f, 0x03, 0x0b, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, 0x02, 0x00, - 0x01, 0x12, 0x04, 0x8f, 0x03, 0x17, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, 0x02, 0x00, 0x03, - 0x12, 0x04, 0x8f, 0x03, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x02, 0x05, 0x00, 0x12, 0x06, 0x92, 0x03, - 0x00, 0xa2, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x05, 0x00, 0x01, 0x12, 0x04, 0x92, 0x03, 0x05, - 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x00, 0x12, 0x04, 0x93, 0x03, 0x02, 0x1d, 0x0a, - 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x93, 0x03, 0x02, 0x18, 0x0a, 0x0d, - 0x0a, 0x05, 0x05, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x93, 0x03, 0x1b, 0x1c, 0x0a, 0x0c, 0x0a, - 0x04, 0x05, 0x00, 0x02, 0x01, 0x12, 0x04, 0x94, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, - 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x94, 0x03, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, - 0x02, 0x01, 0x02, 0x12, 0x04, 0x94, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, - 0x02, 0x12, 0x04, 0x95, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x02, 0x01, - 0x12, 0x04, 0x95, 0x03, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x02, 0x02, 0x12, - 0x04, 0x95, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x03, 0x12, 0x04, 0x96, - 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0x96, 0x03, - 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0x96, 0x03, 0x13, - 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x04, 0x12, 0x04, 0x97, 0x03, 0x02, 0x16, 0x0a, - 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x97, 0x03, 0x02, 0x10, 0x0a, 0x0d, - 0x0a, 0x05, 0x05, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x97, 0x03, 0x13, 0x15, 0x0a, 0x0c, 0x0a, - 0x04, 0x05, 0x00, 0x02, 0x05, 0x12, 0x04, 0x98, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x05, - 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0x98, 0x03, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, - 0x02, 0x05, 0x02, 0x12, 0x04, 0x98, 0x03, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, - 0x06, 0x12, 0x04, 0x99, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x06, 0x01, - 0x12, 0x04, 0x99, 0x03, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x06, 0x02, 0x12, - 0x04, 0x99, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x07, 0x12, 0x04, 0x9a, - 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x07, 0x01, 0x12, 0x04, 0x9a, 0x03, - 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x07, 0x02, 0x12, 0x04, 0x9a, 0x03, 0x14, - 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x08, 0x12, 0x04, 0x9b, 0x03, 0x02, 0x19, 0x0a, - 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x08, 0x01, 0x12, 0x04, 0x9b, 0x03, 0x02, 0x14, 0x0a, 0x0d, - 0x0a, 0x05, 0x05, 0x00, 0x02, 0x08, 0x02, 0x12, 0x04, 0x9b, 0x03, 0x17, 0x18, 0x0a, 0x0c, 0x0a, - 0x04, 0x05, 0x00, 0x02, 0x09, 0x12, 0x04, 0x9c, 0x03, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x05, - 0x00, 0x02, 0x09, 0x01, 0x12, 0x04, 0x9c, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, - 0x02, 0x09, 0x02, 0x12, 0x04, 0x9c, 0x03, 0x16, 0x17, 0x0a, 0x2b, 0x0a, 0x04, 0x05, 0x00, 0x02, - 0x0a, 0x12, 0x04, 0x9d, 0x03, 0x02, 0x18, 0x22, 0x1d, 0x20, 0x60, 0x7b, 0x20, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x3a, 0x20, 0x42, 0x6f, 0x78, 0x3c, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3e, 0x20, 0x7d, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0a, 0x01, 0x12, - 0x04, 0x9d, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0a, 0x02, 0x12, 0x04, - 0x9d, 0x03, 0x16, 0x17, 0x0a, 0x22, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0b, 0x12, 0x04, 0x9e, 0x03, - 0x02, 0x18, 0x22, 0x14, 0x20, 0x60, 0x28, 0x4d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x29, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0b, - 0x01, 0x12, 0x04, 0x9e, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0b, 0x02, - 0x12, 0x04, 0x9e, 0x03, 0x16, 0x17, 0x0a, 0x22, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0c, 0x12, 0x04, - 0x9f, 0x03, 0x02, 0x24, 0x22, 0x14, 0x20, 0x60, 0x7b, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, - 0x20, 0x75, 0x31, 0x36, 0x20, 0x7d, 0x60, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, - 0x02, 0x0c, 0x01, 0x12, 0x04, 0x9f, 0x03, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, - 0x0c, 0x02, 0x12, 0x04, 0x9f, 0x03, 0x22, 0x23, 0x0a, 0x37, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0d, - 0x12, 0x04, 0xa0, 0x03, 0x02, 0x1c, 0x22, 0x29, 0x20, 0x60, 0x7b, 0x20, 0x6d, 0x75, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x3a, 0x20, 0x42, - 0x6f, 0x78, 0x3c, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3e, 0x20, 0x7d, 0x60, 0x2c, - 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0d, 0x01, 0x12, 0x04, 0xa0, 0x03, 0x02, 0x16, - 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0d, 0x02, 0x12, 0x04, 0xa0, 0x03, 0x19, 0x1b, 0x0a, - 0x1b, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0e, 0x12, 0x04, 0xa1, 0x03, 0x02, 0x1d, 0x22, 0x0d, 0x20, - 0x60, 0x28, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, - 0x05, 0x00, 0x02, 0x0e, 0x01, 0x12, 0x04, 0xa1, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x05, - 0x00, 0x02, 0x0e, 0x02, 0x12, 0x04, 0xa1, 0x03, 0x1a, 0x1c, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x26, - 0x12, 0x06, 0xa4, 0x03, 0x00, 0xb2, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x26, 0x01, 0x12, - 0x04, 0xa4, 0x03, 0x08, 0x10, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x26, 0x03, 0x00, 0x12, 0x06, 0xa5, - 0x03, 0x02, 0xa8, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x03, 0x00, 0x01, 0x12, 0x04, - 0xa5, 0x03, 0x0a, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, - 0xa6, 0x03, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, - 0x04, 0xa6, 0x03, 0x04, 0x08, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, 0x01, - 0x12, 0x04, 0xa6, 0x03, 0x09, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, - 0x03, 0x12, 0x04, 0xa6, 0x03, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x26, 0x03, 0x00, 0x02, - 0x01, 0x12, 0x04, 0xa7, 0x03, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, - 0x01, 0x06, 0x12, 0x04, 0xa7, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xa7, 0x03, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, - 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0xa7, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, - 0x02, 0x00, 0x12, 0x04, 0xaa, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x00, - 0x06, 0x12, 0x04, 0xaa, 0x03, 0x02, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x00, 0x01, - 0x12, 0x04, 0xaa, 0x03, 0x0c, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x00, 0x03, 0x12, - 0x04, 0xaa, 0x03, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x26, 0x08, 0x00, 0x12, 0x06, 0xab, - 0x03, 0x02, 0xb1, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x08, 0x00, 0x01, 0x12, 0x04, - 0xab, 0x03, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x01, 0x12, 0x04, 0xac, 0x03, - 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x06, 0x12, 0x04, 0xac, 0x03, 0x04, - 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x01, 0x12, 0x04, 0xac, 0x03, 0x0d, 0x13, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x03, 0x12, 0x04, 0xac, 0x03, 0x16, 0x17, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x02, 0x12, 0x04, 0xad, 0x03, 0x04, 0x1d, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x26, 0x02, 0x02, 0x06, 0x12, 0x04, 0xad, 0x03, 0x04, 0x11, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x26, 0x02, 0x02, 0x01, 0x12, 0x04, 0xad, 0x03, 0x12, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x26, 0x02, 0x02, 0x03, 0x12, 0x04, 0xad, 0x03, 0x1b, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, - 0x02, 0x03, 0x12, 0x04, 0xae, 0x03, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x03, - 0x05, 0x12, 0x04, 0xae, 0x03, 0x04, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x03, 0x01, - 0x12, 0x04, 0xae, 0x03, 0x0b, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x03, 0x03, 0x12, - 0x04, 0xae, 0x03, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x04, 0x12, 0x04, 0xaf, - 0x03, 0x04, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x06, 0x12, 0x04, 0xaf, 0x03, - 0x04, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x01, 0x12, 0x04, 0xaf, 0x03, 0x12, - 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x03, 0x12, 0x04, 0xaf, 0x03, 0x1e, 0x1f, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x05, 0x12, 0x04, 0xb0, 0x03, 0x04, 0x1a, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x26, 0x02, 0x05, 0x05, 0x12, 0x04, 0xb0, 0x03, 0x04, 0x0a, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x26, 0x02, 0x05, 0x01, 0x12, 0x04, 0xb0, 0x03, 0x0b, 0x15, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x26, 0x02, 0x05, 0x03, 0x12, 0x04, 0xb0, 0x03, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x02, 0x05, - 0x01, 0x12, 0x06, 0xb4, 0x03, 0x00, 0xba, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x05, 0x01, 0x01, - 0x12, 0x04, 0xb4, 0x03, 0x05, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x00, 0x12, 0x04, - 0xb5, 0x03, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb5, - 0x03, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x00, 0x02, 0x12, 0x04, 0xb5, 0x03, - 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x01, 0x12, 0x04, 0xb6, 0x03, 0x02, 0x18, - 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb6, 0x03, 0x02, 0x13, 0x0a, - 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x01, 0x02, 0x12, 0x04, 0xb6, 0x03, 0x16, 0x17, 0x0a, 0x0c, - 0x0a, 0x04, 0x05, 0x01, 0x02, 0x02, 0x12, 0x04, 0xb7, 0x03, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, - 0x05, 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb7, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, - 0x01, 0x02, 0x02, 0x02, 0x12, 0x04, 0xb7, 0x03, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, - 0x02, 0x03, 0x12, 0x04, 0xb8, 0x03, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x03, - 0x01, 0x12, 0x04, 0xb8, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x03, 0x02, - 0x12, 0x04, 0xb8, 0x03, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x04, 0x12, 0x04, - 0xb9, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x04, 0x01, 0x12, 0x04, 0xb9, - 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x04, 0x02, 0x12, 0x04, 0xb9, 0x03, - 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x27, 0x12, 0x06, 0xbc, 0x03, 0x00, 0xbe, 0x03, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x27, 0x01, 0x12, 0x04, 0xbc, 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x27, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x03, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x27, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbd, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x27, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x03, 0x0b, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x27, 0x02, - 0x00, 0x03, 0x12, 0x04, 0xbd, 0x03, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x28, 0x12, 0x06, - 0xc0, 0x03, 0x00, 0xc3, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x28, 0x01, 0x12, 0x04, 0xc0, - 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x28, 0x02, 0x00, 0x12, 0x04, 0xc1, 0x03, 0x02, - 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc1, 0x03, 0x02, 0x0e, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc1, 0x03, 0x0f, 0x15, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc1, 0x03, 0x18, 0x19, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x28, 0x02, 0x01, 0x12, 0x04, 0xc2, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x28, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc2, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x28, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc2, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, - 0x02, 0x01, 0x03, 0x12, 0x04, 0xc2, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x29, 0x12, - 0x06, 0xc5, 0x03, 0x00, 0xc8, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x29, 0x01, 0x12, 0x04, - 0xc5, 0x03, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x29, 0x02, 0x00, 0x12, 0x04, 0xc6, 0x03, - 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc6, 0x03, 0x02, - 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc6, 0x03, 0x09, 0x10, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc6, 0x03, 0x13, 0x14, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x29, 0x02, 0x01, 0x12, 0x04, 0xc7, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x29, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc7, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x29, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc7, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x29, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc7, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2a, - 0x12, 0x06, 0xca, 0x03, 0x00, 0xcf, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2a, 0x01, 0x12, - 0x04, 0xca, 0x03, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x00, 0x12, 0x04, 0xcb, - 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xcb, 0x03, - 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcb, 0x03, 0x09, - 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcb, 0x03, 0x13, 0x14, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x01, 0x12, 0x04, 0xcc, 0x03, 0x02, 0x14, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x01, 0x05, 0x12, 0x04, 0xcc, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcc, 0x03, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xcc, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x2a, 0x02, 0x02, 0x12, 0x04, 0xcd, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, - 0x02, 0x05, 0x12, 0x04, 0xcd, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x02, - 0x01, 0x12, 0x04, 0xcd, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x02, 0x03, - 0x12, 0x04, 0xcd, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x03, 0x12, 0x04, - 0xce, 0x03, 0x02, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x04, 0x12, 0x04, 0xce, - 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x06, 0x12, 0x04, 0xce, 0x03, - 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xce, 0x03, 0x14, - 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xce, 0x03, 0x2a, 0x2b, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2b, 0x12, 0x06, 0xd1, 0x03, 0x00, 0xe5, 0x03, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x2b, 0x01, 0x12, 0x04, 0xd1, 0x03, 0x08, 0x11, 0x0a, 0x0e, 0x0a, 0x04, 0x04, - 0x2b, 0x04, 0x00, 0x12, 0x06, 0xd2, 0x03, 0x02, 0xda, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2b, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x03, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, - 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd3, 0x03, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, - 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd3, 0x03, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, - 0x2b, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd3, 0x03, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, - 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd4, 0x03, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, - 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd4, 0x03, 0x04, 0x10, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd4, 0x03, 0x13, 0x14, 0x0a, 0x0e, - 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xd5, 0x03, 0x04, 0x1b, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd5, 0x03, 0x04, 0x16, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xd5, 0x03, 0x19, 0x1a, - 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xd6, 0x03, 0x04, 0x19, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xd6, 0x03, 0x04, - 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0xd6, 0x03, - 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0xd7, 0x03, - 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0xd7, - 0x03, 0x04, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, - 0xd7, 0x03, 0x15, 0x16, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x05, 0x12, 0x04, - 0xd8, 0x03, 0x04, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, - 0x04, 0xd8, 0x03, 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x05, 0x02, - 0x12, 0x04, 0xd8, 0x03, 0x19, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x04, 0x00, 0x04, 0x12, - 0x04, 0xd9, 0x03, 0x04, 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x04, 0x00, 0x12, - 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x04, 0x00, 0x01, - 0x12, 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x04, 0x00, - 0x02, 0x12, 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x00, 0x12, - 0x04, 0xdc, 0x03, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x06, 0x12, 0x04, - 0xdc, 0x03, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xdc, - 0x03, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xdc, 0x03, - 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x2b, 0x08, 0x00, 0x12, 0x06, 0xdd, 0x03, 0x02, 0xe4, - 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x08, 0x00, 0x01, 0x12, 0x04, 0xdd, 0x03, 0x08, - 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x01, 0x12, 0x04, 0xde, 0x03, 0x04, 0x21, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xde, 0x03, 0x04, 0x14, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x03, 0x15, 0x1c, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xde, 0x03, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, - 0x04, 0x2b, 0x02, 0x02, 0x12, 0x04, 0xdf, 0x03, 0x04, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, - 0x02, 0x02, 0x06, 0x12, 0x04, 0xdf, 0x03, 0x04, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, - 0x02, 0x01, 0x12, 0x04, 0xdf, 0x03, 0x1a, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x02, - 0x03, 0x12, 0x04, 0xdf, 0x03, 0x2a, 0x2b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x03, 0x12, - 0x04, 0xe0, 0x03, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x06, 0x12, 0x04, - 0xe0, 0x03, 0x04, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe0, - 0x03, 0x18, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe0, 0x03, - 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x04, 0x12, 0x04, 0xe1, 0x03, 0x04, 0x24, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x06, 0x12, 0x04, 0xe1, 0x03, 0x04, 0x15, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe1, 0x03, 0x16, 0x1f, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe1, 0x03, 0x22, 0x23, 0x0a, 0x1e, 0x0a, - 0x04, 0x04, 0x2b, 0x02, 0x05, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x23, 0x1a, 0x10, 0x20, 0x36, 0x20, - 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2b, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x10, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2b, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe3, 0x03, 0x11, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2b, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe3, 0x03, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2c, - 0x12, 0x06, 0xe7, 0x03, 0x00, 0xea, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2c, 0x01, 0x12, - 0x04, 0xe7, 0x03, 0x08, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2c, 0x02, 0x00, 0x12, 0x04, 0xe8, - 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe8, 0x03, - 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe8, 0x03, 0x08, - 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe8, 0x03, 0x15, 0x16, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2c, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x03, 0x02, 0x16, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe9, 0x03, 0x02, 0x07, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, 0x03, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe9, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, - 0x2d, 0x12, 0x06, 0xec, 0x03, 0x00, 0xf1, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2d, 0x01, - 0x12, 0x04, 0xec, 0x03, 0x08, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x00, 0x12, 0x04, - 0xed, 0x03, 0x02, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x04, 0x12, 0x04, 0xed, - 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xed, 0x03, - 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xed, 0x03, 0x11, - 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xed, 0x03, 0x1f, 0x20, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x01, 0x12, 0x04, 0xee, 0x03, 0x02, 0x20, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x01, 0x04, 0x12, 0x04, 0xee, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xee, 0x03, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xee, 0x03, 0x11, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xee, 0x03, 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, - 0x02, 0x02, 0x12, 0x04, 0xef, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x02, - 0x05, 0x12, 0x04, 0xef, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x02, 0x01, - 0x12, 0x04, 0xef, 0x03, 0x09, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x02, 0x03, 0x12, - 0x04, 0xef, 0x03, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x03, 0x12, 0x04, 0xf0, - 0x03, 0x02, 0x29, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x04, 0x12, 0x04, 0xf0, 0x03, - 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x05, 0x12, 0x04, 0xf0, 0x03, 0x0b, - 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x01, 0x12, 0x04, 0xf0, 0x03, 0x12, 0x24, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x03, 0x12, 0x04, 0xf0, 0x03, 0x27, 0x28, 0x0a, - 0x0c, 0x0a, 0x02, 0x04, 0x2e, 0x12, 0x06, 0xf3, 0x03, 0x00, 0xf7, 0x03, 0x01, 0x0a, 0x0b, 0x0a, - 0x03, 0x04, 0x2e, 0x01, 0x12, 0x04, 0xf3, 0x03, 0x08, 0x1b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2e, - 0x02, 0x00, 0x12, 0x04, 0xf4, 0x03, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x00, - 0x06, 0x12, 0x04, 0xf4, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x00, 0x01, - 0x12, 0x04, 0xf4, 0x03, 0x13, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x00, 0x03, 0x12, - 0x04, 0xf4, 0x03, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2e, 0x02, 0x01, 0x12, 0x04, 0xf5, - 0x03, 0x02, 0x31, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x04, 0x12, 0x04, 0xf5, 0x03, - 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf5, 0x03, 0x0b, - 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf5, 0x03, 0x12, 0x2c, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf5, 0x03, 0x2f, 0x30, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x2e, 0x02, 0x02, 0x12, 0x04, 0xf6, 0x03, 0x02, 0x32, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2e, 0x02, 0x02, 0x04, 0x12, 0x04, 0xf6, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2e, 0x02, 0x02, 0x06, 0x12, 0x04, 0xf6, 0x03, 0x0b, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2e, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf6, 0x03, 0x1c, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, - 0x02, 0x02, 0x03, 0x12, 0x04, 0xf6, 0x03, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2f, 0x12, - 0x06, 0xf9, 0x03, 0x00, 0xff, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2f, 0x01, 0x12, 0x04, - 0xf9, 0x03, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x00, 0x12, 0x04, 0xfa, 0x03, - 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x06, 0x12, 0x04, 0xfa, 0x03, 0x02, - 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfa, 0x03, 0x13, 0x19, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfa, 0x03, 0x1c, 0x1d, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x01, 0x12, 0x04, 0xfb, 0x03, 0x02, 0x31, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x2f, 0x02, 0x01, 0x04, 0x12, 0x04, 0xfb, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2f, 0x02, 0x01, 0x05, 0x12, 0x04, 0xfb, 0x03, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2f, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfb, 0x03, 0x12, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, - 0x02, 0x01, 0x03, 0x12, 0x04, 0xfb, 0x03, 0x2f, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, - 0x02, 0x12, 0x04, 0xfc, 0x03, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x04, - 0x12, 0x04, 0xfc, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x06, 0x12, - 0x04, 0xfc, 0x03, 0x0b, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x01, 0x12, 0x04, - 0xfc, 0x03, 0x1c, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfc, - 0x03, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x03, 0x12, 0x04, 0xfd, 0x03, 0x02, - 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x05, 0x12, 0x04, 0xfd, 0x03, 0x02, 0x08, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x01, 0x12, 0x04, 0xfd, 0x03, 0x09, 0x1a, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x03, 0x12, 0x04, 0xfd, 0x03, 0x1d, 0x1e, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x04, 0x12, 0x04, 0xfe, 0x03, 0x02, 0x28, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x2f, 0x02, 0x04, 0x06, 0x12, 0x04, 0xfe, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x2f, 0x02, 0x04, 0x01, 0x12, 0x04, 0xfe, 0x03, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, - 0x02, 0x04, 0x03, 0x12, 0x04, 0xfe, 0x03, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x30, 0x12, - 0x06, 0x81, 0x04, 0x00, 0x8d, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x30, 0x01, 0x12, 0x04, - 0x81, 0x04, 0x08, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x30, 0x04, 0x00, 0x12, 0x06, 0x82, 0x04, - 0x02, 0x89, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x04, 0x00, 0x01, 0x12, 0x04, 0x82, - 0x04, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x83, - 0x04, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, - 0x83, 0x04, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, - 0x04, 0x83, 0x04, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x01, 0x12, - 0x04, 0x84, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x01, 0x01, - 0x12, 0x04, 0x84, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x01, - 0x02, 0x12, 0x04, 0x84, 0x04, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, - 0x02, 0x12, 0x04, 0x85, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, - 0x02, 0x01, 0x12, 0x04, 0x85, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, - 0x02, 0x02, 0x02, 0x12, 0x04, 0x85, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, - 0x00, 0x02, 0x03, 0x12, 0x04, 0x86, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, - 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0x86, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, - 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0x86, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, - 0x30, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0x87, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, - 0x30, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x87, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, - 0x04, 0x30, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x87, 0x04, 0x13, 0x14, 0x0a, 0x0e, 0x0a, - 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x12, 0x04, 0x88, 0x04, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0x88, 0x04, 0x04, 0x1a, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x02, 0x12, 0x04, 0x88, 0x04, 0x1d, 0x1e, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x30, 0x02, 0x00, 0x12, 0x04, 0x8b, 0x04, 0x02, 0x10, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x30, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8b, 0x04, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x30, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8b, 0x04, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x30, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8b, 0x04, 0x0e, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x30, - 0x02, 0x01, 0x12, 0x04, 0x8c, 0x04, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, 0x01, - 0x05, 0x12, 0x04, 0x8c, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, 0x01, 0x01, - 0x12, 0x04, 0x8c, 0x04, 0x08, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, 0x01, 0x03, 0x12, - 0x04, 0x8c, 0x04, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x31, 0x12, 0x06, 0x8f, 0x04, 0x00, - 0xa5, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x31, 0x01, 0x12, 0x04, 0x8f, 0x04, 0x08, 0x14, - 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x31, 0x04, 0x00, 0x12, 0x06, 0x90, 0x04, 0x02, 0x96, 0x04, 0x03, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x04, 0x00, 0x01, 0x12, 0x04, 0x90, 0x04, 0x07, 0x0b, 0x0a, - 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x91, 0x04, 0x04, 0x19, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x91, 0x04, 0x04, 0x14, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x91, 0x04, 0x17, - 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x92, 0x04, 0x04, - 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x92, 0x04, - 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x92, - 0x04, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0x93, - 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, - 0x93, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, - 0x04, 0x93, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x03, 0x12, - 0x04, 0x94, 0x04, 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x03, 0x01, - 0x12, 0x04, 0x94, 0x04, 0x04, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x03, - 0x02, 0x12, 0x04, 0x94, 0x04, 0x14, 0x15, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, - 0x04, 0x12, 0x04, 0x95, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, - 0x04, 0x01, 0x12, 0x04, 0x95, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, - 0x02, 0x04, 0x02, 0x12, 0x04, 0x95, 0x04, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, 0x02, - 0x00, 0x12, 0x04, 0x98, 0x04, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x00, 0x06, - 0x12, 0x04, 0x98, 0x04, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x00, 0x01, 0x12, - 0x04, 0x98, 0x04, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x00, 0x03, 0x12, 0x04, - 0x98, 0x04, 0x0e, 0x0f, 0x0a, 0x64, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x01, 0x12, 0x04, 0x9c, 0x04, - 0x02, 0x2a, 0x1a, 0x56, 0x20, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x3a, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x0a, - 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x3a, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x2e, 0x31, 0x30, 0x2c, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, - 0x02, 0x01, 0x05, 0x12, 0x04, 0x9c, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, - 0x01, 0x01, 0x12, 0x04, 0x9c, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x01, - 0x03, 0x12, 0x04, 0x9c, 0x04, 0x14, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x01, 0x08, - 0x12, 0x04, 0x9c, 0x04, 0x16, 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x02, 0x01, 0x08, 0x03, - 0x12, 0x04, 0x9c, 0x04, 0x17, 0x28, 0x0a, 0x23, 0x0a, 0x04, 0x04, 0x31, 0x08, 0x00, 0x12, 0x06, - 0x9f, 0x04, 0x02, 0xa4, 0x04, 0x03, 0x1a, 0x13, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x3a, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x2e, 0x31, 0x30, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x31, 0x08, 0x00, 0x01, 0x12, 0x04, 0x9f, 0x04, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, - 0x02, 0x02, 0x12, 0x04, 0xa0, 0x04, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x02, - 0x06, 0x12, 0x04, 0xa0, 0x04, 0x04, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x02, 0x01, - 0x12, 0x04, 0xa0, 0x04, 0x0c, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x02, 0x03, 0x12, - 0x04, 0xa0, 0x04, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x03, 0x12, 0x04, 0xa1, - 0x04, 0x04, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x06, 0x12, 0x04, 0xa1, 0x04, - 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa1, 0x04, 0x13, - 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x03, 0x12, 0x04, 0xa1, 0x04, 0x25, 0x26, - 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x04, 0x12, 0x04, 0xa2, 0x04, 0x04, 0x1a, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x31, 0x02, 0x04, 0x06, 0x12, 0x04, 0xa2, 0x04, 0x04, 0x0c, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x31, 0x02, 0x04, 0x01, 0x12, 0x04, 0xa2, 0x04, 0x0d, 0x15, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x31, 0x02, 0x04, 0x03, 0x12, 0x04, 0xa2, 0x04, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x31, 0x02, 0x05, 0x12, 0x04, 0xa3, 0x04, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, - 0x05, 0x06, 0x12, 0x04, 0xa3, 0x04, 0x04, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x05, - 0x01, 0x12, 0x04, 0xa3, 0x04, 0x0c, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x05, 0x03, - 0x12, 0x04, 0xa3, 0x04, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x32, 0x12, 0x06, 0xa7, 0x04, - 0x00, 0xa9, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x32, 0x01, 0x12, 0x04, 0xa7, 0x04, 0x08, - 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x32, 0x02, 0x00, 0x12, 0x04, 0xa8, 0x04, 0x02, 0x16, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x32, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa8, 0x04, 0x02, 0x07, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x32, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa8, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x32, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa8, 0x04, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, - 0x04, 0x33, 0x12, 0x06, 0xab, 0x04, 0x00, 0xad, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x33, - 0x01, 0x12, 0x04, 0xab, 0x04, 0x08, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x33, 0x02, 0x00, 0x12, - 0x04, 0xac, 0x04, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x05, 0x12, 0x04, - 0xac, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x01, 0x12, 0x04, 0xac, - 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x03, 0x12, 0x04, 0xac, 0x04, - 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x34, 0x12, 0x06, 0xaf, 0x04, 0x00, 0xb1, 0x04, 0x01, - 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x34, 0x01, 0x12, 0x04, 0xaf, 0x04, 0x08, 0x10, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x34, 0x02, 0x00, 0x12, 0x04, 0xb0, 0x04, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x34, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb0, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x34, - 0x02, 0x00, 0x01, 0x12, 0x04, 0xb0, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x34, 0x02, - 0x00, 0x03, 0x12, 0x04, 0xb0, 0x04, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x35, 0x12, 0x06, - 0xb3, 0x04, 0x00, 0xb5, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x35, 0x01, 0x12, 0x04, 0xb3, - 0x04, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x35, 0x02, 0x00, 0x12, 0x04, 0xb4, 0x04, 0x02, - 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb4, 0x04, 0x02, 0x07, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb4, 0x04, 0x08, 0x11, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb4, 0x04, 0x14, 0x15, 0x0a, 0x0c, - 0x0a, 0x02, 0x04, 0x36, 0x12, 0x06, 0xb7, 0x04, 0x00, 0xba, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, - 0x04, 0x36, 0x01, 0x12, 0x04, 0xb7, 0x04, 0x08, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x36, 0x02, - 0x00, 0x12, 0x04, 0xb8, 0x04, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x00, 0x06, - 0x12, 0x04, 0xb8, 0x04, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x00, 0x01, 0x12, - 0x04, 0xb8, 0x04, 0x0f, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x00, 0x03, 0x12, 0x04, - 0xb8, 0x04, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x36, 0x02, 0x01, 0x12, 0x04, 0xb9, 0x04, - 0x02, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x06, 0x12, 0x04, 0xb9, 0x04, 0x02, - 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb9, 0x04, 0x0f, 0x18, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb9, 0x04, 0x1b, 0x1c, 0x0a, - 0x0c, 0x0a, 0x02, 0x04, 0x37, 0x12, 0x06, 0xbc, 0x04, 0x00, 0xbf, 0x04, 0x01, 0x0a, 0x0b, 0x0a, - 0x03, 0x04, 0x37, 0x01, 0x12, 0x04, 0xbc, 0x04, 0x08, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x37, - 0x02, 0x00, 0x12, 0x04, 0xbd, 0x04, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x00, - 0x05, 0x12, 0x04, 0xbd, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x00, 0x01, - 0x12, 0x04, 0xbd, 0x04, 0x09, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x00, 0x03, 0x12, - 0x04, 0xbd, 0x04, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x37, 0x02, 0x01, 0x12, 0x04, 0xbe, - 0x04, 0x02, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x06, 0x12, 0x04, 0xbe, 0x04, - 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbe, 0x04, 0x0f, - 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbe, 0x04, 0x1b, 0x1c, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x38, 0x12, 0x06, 0xc1, 0x04, 0x00, 0xc5, 0x04, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x38, 0x01, 0x12, 0x04, 0xc1, 0x04, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, - 0x38, 0x02, 0x00, 0x12, 0x04, 0xc2, 0x04, 0x02, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, - 0x00, 0x04, 0x12, 0x04, 0xc2, 0x04, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x00, - 0x06, 0x12, 0x04, 0xc2, 0x04, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x00, 0x01, - 0x12, 0x04, 0xc2, 0x04, 0x18, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x00, 0x03, 0x12, - 0x04, 0xc2, 0x04, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x38, 0x02, 0x01, 0x12, 0x04, 0xc3, - 0x04, 0x02, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x04, 0x12, 0x04, 0xc3, 0x04, - 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x06, 0x12, 0x04, 0xc3, 0x04, 0x0b, - 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc3, 0x04, 0x1c, 0x26, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc3, 0x04, 0x29, 0x2a, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x38, 0x02, 0x02, 0x12, 0x04, 0xc4, 0x04, 0x02, 0x21, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x38, 0x02, 0x02, 0x05, 0x12, 0x04, 0xc4, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x38, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc4, 0x04, 0x09, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x38, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc4, 0x04, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x39, - 0x12, 0x06, 0xc7, 0x04, 0x00, 0xc9, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x39, 0x01, 0x12, - 0x04, 0xc7, 0x04, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x39, 0x02, 0x00, 0x12, 0x04, 0xc8, - 0x04, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc8, 0x04, - 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc8, 0x04, 0x13, - 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc8, 0x04, 0x1c, 0x1d, - 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3a, 0x12, 0x06, 0xcb, 0x04, 0x00, 0xde, 0x04, 0x01, 0x0a, 0x0b, - 0x0a, 0x03, 0x04, 0x3a, 0x01, 0x12, 0x04, 0xcb, 0x04, 0x08, 0x18, 0x0a, 0x0e, 0x0a, 0x04, 0x04, - 0x3a, 0x04, 0x00, 0x12, 0x06, 0xcc, 0x04, 0x02, 0xd4, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x3a, 0x04, 0x00, 0x01, 0x12, 0x04, 0xcc, 0x04, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3a, - 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xcd, 0x04, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, - 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcd, 0x04, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, - 0x3a, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xcd, 0x04, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, - 0x04, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xce, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, - 0x04, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xce, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, - 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xce, 0x04, 0x13, 0x14, 0x0a, 0x0e, - 0x0a, 0x06, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xcf, 0x04, 0x04, 0x1b, 0x0a, 0x0f, - 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xcf, 0x04, 0x04, 0x16, 0x0a, - 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xcf, 0x04, 0x19, 0x1a, - 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xd0, 0x04, 0x04, 0x18, - 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xd0, 0x04, 0x04, - 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0xd0, 0x04, - 0x16, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0xd1, 0x04, - 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0xd1, - 0x04, 0x04, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, - 0xd1, 0x04, 0x15, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x04, 0x00, 0x04, 0x12, 0x04, 0xd3, - 0x04, 0x04, 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3a, 0x04, 0x00, 0x04, 0x00, 0x12, 0x04, 0xd3, - 0x04, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x04, 0x00, 0x01, 0x12, 0x04, - 0xd3, 0x04, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3a, 0x04, 0x00, 0x04, 0x00, 0x02, 0x12, - 0x04, 0xd3, 0x04, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3a, 0x02, 0x00, 0x12, 0x04, 0xd6, - 0x04, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd6, 0x04, - 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd6, 0x04, 0x07, - 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd6, 0x04, 0x0e, 0x0f, - 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x3a, 0x08, 0x00, 0x12, 0x06, 0xd7, 0x04, 0x02, 0xdd, 0x04, 0x03, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x08, 0x00, 0x01, 0x12, 0x04, 0xd7, 0x04, 0x08, 0x11, 0x0a, - 0x0c, 0x0a, 0x04, 0x04, 0x3a, 0x02, 0x01, 0x12, 0x04, 0xd8, 0x04, 0x04, 0x21, 0x0a, 0x0d, 0x0a, - 0x05, 0x04, 0x3a, 0x02, 0x01, 0x06, 0x12, 0x04, 0xd8, 0x04, 0x04, 0x14, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x3a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd8, 0x04, 0x15, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x3a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xd8, 0x04, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3a, - 0x02, 0x02, 0x12, 0x04, 0xd9, 0x04, 0x04, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x02, - 0x06, 0x12, 0x04, 0xd9, 0x04, 0x04, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x02, 0x01, - 0x12, 0x04, 0xd9, 0x04, 0x1a, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x02, 0x03, 0x12, - 0x04, 0xd9, 0x04, 0x2a, 0x2b, 0x0a, 0x1e, 0x0a, 0x04, 0x04, 0x3a, 0x02, 0x03, 0x12, 0x04, 0xdb, - 0x04, 0x04, 0x30, 0x1a, 0x10, 0x20, 0x34, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x03, 0x06, 0x12, 0x04, - 0xdb, 0x04, 0x04, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xdb, - 0x04, 0x17, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xdb, 0x04, - 0x2e, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3a, 0x02, 0x04, 0x12, 0x04, 0xdc, 0x04, 0x04, 0x2e, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x04, 0x06, 0x12, 0x04, 0xdc, 0x04, 0x04, 0x15, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x04, 0x01, 0x12, 0x04, 0xdc, 0x04, 0x16, 0x29, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x04, 0x03, 0x12, 0x04, 0xdc, 0x04, 0x2c, 0x2d, 0x0a, 0x0c, 0x0a, - 0x02, 0x04, 0x3b, 0x12, 0x06, 0xe0, 0x04, 0x00, 0xe4, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, - 0x3b, 0x01, 0x12, 0x04, 0xe0, 0x04, 0x08, 0x1b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x00, - 0x12, 0x04, 0xe1, 0x04, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, 0x05, 0x12, - 0x04, 0xe1, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, 0x01, 0x12, 0x04, - 0xe1, 0x04, 0x09, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe1, - 0x04, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x01, 0x12, 0x04, 0xe2, 0x04, 0x02, - 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe2, 0x04, 0x02, 0x0a, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe2, 0x04, 0x0b, 0x18, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe2, 0x04, 0x19, 0x28, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe2, 0x04, 0x2b, 0x2c, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x3b, 0x02, 0x02, 0x12, 0x04, 0xe3, 0x04, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x3b, 0x02, 0x02, 0x04, 0x12, 0x04, 0xe3, 0x04, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, - 0x02, 0x02, 0x06, 0x12, 0x04, 0xe3, 0x04, 0x0b, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, - 0x02, 0x01, 0x12, 0x04, 0xe3, 0x04, 0x1b, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x02, - 0x03, 0x12, 0x04, 0xe3, 0x04, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3c, 0x12, 0x06, 0xe6, - 0x04, 0x00, 0xe9, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x3c, 0x01, 0x12, 0x04, 0xe6, 0x04, - 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3c, 0x02, 0x00, 0x12, 0x04, 0xe7, 0x04, 0x02, 0x1c, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe7, 0x04, 0x02, 0x08, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe7, 0x04, 0x09, 0x17, 0x0a, 0x0d, - 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe7, 0x04, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, - 0x04, 0x04, 0x3c, 0x02, 0x01, 0x12, 0x04, 0xe8, 0x04, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x3c, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe8, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, - 0x02, 0x01, 0x01, 0x12, 0x04, 0xe8, 0x04, 0x09, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, - 0x01, 0x03, 0x12, 0x04, 0xe8, 0x04, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3d, 0x12, 0x06, - 0xeb, 0x04, 0x00, 0xee, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x3d, 0x01, 0x12, 0x04, 0xeb, - 0x04, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3d, 0x02, 0x00, 0x12, 0x04, 0xec, 0x04, 0x02, - 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xec, 0x04, 0x02, 0x08, - 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xec, 0x04, 0x09, 0x12, 0x0a, - 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xec, 0x04, 0x15, 0x16, 0x0a, 0x0c, - 0x0a, 0x04, 0x04, 0x3d, 0x02, 0x01, 0x12, 0x04, 0xed, 0x04, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, - 0x04, 0x3d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xed, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, - 0x3d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xed, 0x04, 0x09, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, - 0x02, 0x01, 0x03, 0x12, 0x04, 0xed, 0x04, 0x17, 0x18, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x02, 0x02, 0x05, 0x12, 0x03, 0x68, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x68, 0x11, 0x14, 0x0a, 0x14, + 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, + 0x03, 0x68, 0x17, 0x18, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x03, 0x12, 0x03, 0x69, 0x0a, 0x17, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x03, 0x05, 0x12, 0x03, 0x69, 0x0a, 0x10, 0x0a, + 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x03, 0x01, + 0x12, 0x03, 0x69, 0x11, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x02, 0x03, 0x03, 0x12, 0x03, 0x69, 0x15, 0x16, 0x0a, 0x13, 0x0a, 0x0c, 0x04, + 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x12, 0x03, 0x6a, 0x0a, 0x17, + 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, + 0x05, 0x12, 0x03, 0x6a, 0x0a, 0x10, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x6a, 0x11, 0x12, 0x0a, 0x14, 0x0a, 0x0d, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x04, 0x03, 0x12, 0x03, 0x6a, + 0x15, 0x16, 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, + 0x12, 0x04, 0x6c, 0x08, 0x6f, 0x09, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x01, 0x01, 0x12, 0x03, 0x6c, 0x10, 0x1e, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x12, 0x03, 0x6d, 0x0a, 0x17, 0x0a, + 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x05, + 0x12, 0x03, 0x6d, 0x0a, 0x0f, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x6d, 0x10, 0x12, 0x0a, 0x14, 0x0a, 0x0d, 0x04, + 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x6d, 0x15, + 0x16, 0x0a, 0x13, 0x0a, 0x0c, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x12, 0x03, 0x6e, 0x0a, 0x1c, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x6e, 0x0a, 0x0f, 0x0a, 0x14, 0x0a, 0x0d, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, 0x03, 0x6e, + 0x10, 0x17, 0x0a, 0x14, 0x0a, 0x0d, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x01, + 0x02, 0x01, 0x03, 0x12, 0x03, 0x6e, 0x1a, 0x1b, 0x0a, 0x12, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x08, 0x00, 0x12, 0x04, 0x70, 0x08, 0x73, 0x09, 0x0a, 0x12, 0x0a, 0x0b, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x12, 0x03, 0x70, 0x0e, 0x15, + 0x0a, 0x11, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, + 0x71, 0x0a, 0x2d, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x06, 0x12, 0x03, 0x71, 0x0a, 0x18, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x71, 0x19, 0x28, 0x0a, 0x12, 0x0a, 0x0b, 0x04, + 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x71, 0x2b, 0x2c, 0x0a, + 0x11, 0x0a, 0x0a, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x72, + 0x0a, 0x16, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, + 0x06, 0x12, 0x03, 0x72, 0x0a, 0x0d, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x72, 0x0e, 0x11, 0x0a, 0x12, 0x0a, 0x0b, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x72, 0x14, 0x15, 0x0a, 0x0f, + 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x76, 0x06, 0x1c, 0x0a, + 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x04, 0x12, 0x03, 0x76, 0x06, + 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x06, 0x12, 0x03, + 0x76, 0x0f, 0x12, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, + 0x12, 0x03, 0x76, 0x13, 0x17, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x00, 0x02, + 0x02, 0x03, 0x12, 0x03, 0x76, 0x1a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x01, 0x12, 0x04, 0x78, 0x04, 0x7c, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x01, 0x01, 0x12, 0x03, 0x78, 0x0c, 0x26, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x01, 0x02, 0x00, 0x12, 0x03, 0x79, 0x06, 0x29, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, + 0x03, 0x01, 0x02, 0x00, 0x04, 0x12, 0x03, 0x79, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x05, 0x12, 0x03, 0x79, 0x0f, 0x15, 0x0a, 0x10, 0x0a, 0x09, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x03, 0x79, 0x16, 0x24, 0x0a, 0x10, + 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x03, 0x79, 0x27, 0x28, + 0x0a, 0x1e, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x12, 0x03, 0x7b, 0x06, + 0x14, 0x1a, 0x0d, 0x20, 0x48, 0x65, 0x78, 0x54, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x0a, + 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x05, 0x12, 0x03, 0x7b, + 0x06, 0x0b, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, 0x01, 0x12, + 0x03, 0x7b, 0x0c, 0x0f, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x01, 0x02, 0x01, + 0x03, 0x12, 0x03, 0x7b, 0x12, 0x13, 0x0a, 0x0f, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, + 0x12, 0x05, 0x7d, 0x04, 0x80, 0x01, 0x05, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x02, 0x01, 0x12, 0x03, 0x7d, 0x0c, 0x21, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x7e, 0x06, 0x26, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, + 0x03, 0x02, 0x02, 0x00, 0x06, 0x12, 0x03, 0x7e, 0x06, 0x1a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, + 0x03, 0x00, 0x03, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x7e, 0x1b, 0x21, 0x0a, 0x10, 0x0a, 0x09, + 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x7e, 0x24, 0x25, 0x0a, 0x0f, + 0x0a, 0x08, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x12, 0x03, 0x7f, 0x06, 0x2f, 0x0a, + 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x06, 0x12, 0x03, 0x7f, 0x06, + 0x20, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x01, 0x12, 0x03, + 0x7f, 0x21, 0x2a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x00, 0x03, 0x02, 0x02, 0x01, 0x03, + 0x12, 0x03, 0x7f, 0x2d, 0x2e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x12, + 0x04, 0x81, 0x01, 0x04, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, 0x06, + 0x12, 0x04, 0x81, 0x01, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, 0x00, + 0x01, 0x12, 0x04, 0x81, 0x01, 0x1a, 0x31, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, 0x00, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x81, 0x01, 0x34, 0x35, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x05, 0x03, 0x01, + 0x12, 0x06, 0x84, 0x01, 0x02, 0x8b, 0x01, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x03, 0x01, + 0x01, 0x12, 0x04, 0x84, 0x01, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x05, 0x03, 0x01, 0x03, + 0x00, 0x12, 0x06, 0x85, 0x01, 0x04, 0x89, 0x01, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x05, 0x03, + 0x01, 0x03, 0x00, 0x01, 0x12, 0x04, 0x85, 0x01, 0x0c, 0x19, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, + 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0x86, 0x01, 0x06, 0x17, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0x86, 0x01, 0x06, 0x0c, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x86, 0x01, + 0x0d, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, + 0x04, 0x86, 0x01, 0x15, 0x16, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, + 0x01, 0x12, 0x04, 0x87, 0x01, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, + 0x00, 0x02, 0x01, 0x05, 0x12, 0x04, 0x87, 0x01, 0x06, 0x0c, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, + 0x03, 0x01, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x87, 0x01, 0x0d, 0x13, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0x87, 0x01, 0x16, 0x17, + 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x02, 0x12, 0x04, 0x88, 0x01, + 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, 0x02, 0x05, 0x12, + 0x04, 0x88, 0x01, 0x06, 0x0b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, 0x03, 0x00, 0x02, + 0x02, 0x01, 0x12, 0x04, 0x88, 0x01, 0x0c, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x05, 0x03, 0x01, + 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x04, 0x88, 0x01, 0x16, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x05, 0x03, 0x01, 0x02, 0x00, 0x12, 0x04, 0x8a, 0x01, 0x04, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x05, 0x03, 0x01, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8a, 0x01, 0x04, 0x11, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x05, 0x03, 0x01, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8a, 0x01, 0x12, 0x20, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x05, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8a, 0x01, 0x23, 0x24, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x05, 0x02, 0x02, 0x12, 0x04, 0x8d, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x05, 0x02, 0x02, 0x04, 0x12, 0x04, 0x8d, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x05, 0x02, 0x02, 0x06, 0x12, 0x04, 0x8d, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, + 0x02, 0x02, 0x01, 0x12, 0x04, 0x8d, 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x05, 0x02, + 0x02, 0x03, 0x12, 0x04, 0x8d, 0x01, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x06, 0x12, 0x06, + 0x90, 0x01, 0x00, 0x92, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x06, 0x01, 0x12, 0x04, 0x90, + 0x01, 0x08, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x06, 0x02, 0x00, 0x12, 0x04, 0x91, 0x01, 0x02, + 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x04, 0x12, 0x04, 0x91, 0x01, 0x02, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x06, 0x12, 0x04, 0x91, 0x01, 0x0b, 0x17, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x01, 0x12, 0x04, 0x91, 0x01, 0x18, 0x26, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x06, 0x02, 0x00, 0x03, 0x12, 0x04, 0x91, 0x01, 0x29, 0x2a, 0x0a, 0x0c, 0x0a, + 0x02, 0x04, 0x07, 0x12, 0x06, 0x94, 0x01, 0x00, 0x99, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, + 0x07, 0x01, 0x12, 0x04, 0x94, 0x01, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x00, + 0x12, 0x04, 0x95, 0x01, 0x02, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x05, 0x12, + 0x04, 0x95, 0x01, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x95, 0x01, 0x07, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x00, 0x03, 0x12, 0x04, 0x95, + 0x01, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, 0x01, 0x12, 0x04, 0x96, 0x01, 0x02, + 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x01, 0x05, 0x12, 0x04, 0x96, 0x01, 0x02, 0x06, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x01, 0x01, 0x12, 0x04, 0x96, 0x01, 0x07, 0x21, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x01, 0x03, 0x12, 0x04, 0x96, 0x01, 0x24, 0x25, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x07, 0x02, 0x02, 0x12, 0x04, 0x97, 0x01, 0x02, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x07, 0x02, 0x02, 0x05, 0x12, 0x04, 0x97, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x07, 0x02, 0x02, 0x01, 0x12, 0x04, 0x97, 0x01, 0x09, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, + 0x02, 0x02, 0x03, 0x12, 0x04, 0x97, 0x01, 0x2b, 0x2c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x07, 0x02, + 0x03, 0x12, 0x04, 0x98, 0x01, 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x05, + 0x12, 0x04, 0x98, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x01, 0x12, + 0x04, 0x98, 0x01, 0x09, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x07, 0x02, 0x03, 0x03, 0x12, 0x04, + 0x98, 0x01, 0x24, 0x25, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x08, 0x12, 0x06, 0x9b, 0x01, 0x00, 0x9e, + 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x08, 0x01, 0x12, 0x04, 0x9b, 0x01, 0x08, 0x17, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x08, 0x02, 0x00, 0x12, 0x04, 0x9c, 0x01, 0x02, 0x25, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x08, 0x02, 0x00, 0x06, 0x12, 0x04, 0x9c, 0x01, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x08, 0x02, 0x00, 0x01, 0x12, 0x04, 0x9c, 0x01, 0x19, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x08, 0x02, 0x00, 0x03, 0x12, 0x04, 0x9c, 0x01, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x08, + 0x02, 0x01, 0x12, 0x04, 0x9d, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, + 0x04, 0x12, 0x04, 0x9d, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x06, + 0x12, 0x04, 0x9d, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x01, 0x12, + 0x04, 0x9d, 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x08, 0x02, 0x01, 0x03, 0x12, 0x04, + 0x9d, 0x01, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x09, 0x12, 0x06, 0xa0, 0x01, 0x00, 0xa6, + 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x09, 0x01, 0x12, 0x04, 0xa0, 0x01, 0x08, 0x0d, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x00, 0x12, 0x04, 0xa1, 0x01, 0x02, 0x13, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x09, 0x02, 0x00, 0x06, 0x12, 0x04, 0xa1, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x09, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa1, 0x01, 0x0b, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x09, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa1, 0x01, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, + 0x02, 0x01, 0x12, 0x04, 0xa2, 0x01, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, + 0x05, 0x12, 0x04, 0xa2, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xa2, 0x01, 0x09, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xa2, 0x01, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x01, 0x08, 0x12, 0x04, + 0xa2, 0x01, 0x1d, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x09, 0x02, 0x01, 0x08, 0x06, 0x12, 0x04, + 0xa2, 0x01, 0x1e, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x02, 0x12, 0x04, 0xa3, 0x01, + 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x06, 0x12, 0x04, 0xa3, 0x01, 0x02, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x01, 0x12, 0x04, 0xa3, 0x01, 0x0b, 0x0f, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x02, 0x03, 0x12, 0x04, 0xa3, 0x01, 0x12, 0x13, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x09, 0x02, 0x03, 0x12, 0x04, 0xa4, 0x01, 0x02, 0x16, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x09, 0x02, 0x03, 0x05, 0x12, 0x04, 0xa4, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x09, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa4, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x09, 0x02, 0x03, 0x03, 0x12, 0x04, 0xa4, 0x01, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x09, + 0x02, 0x04, 0x12, 0x04, 0xa5, 0x01, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, + 0x05, 0x12, 0x04, 0xa5, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, 0x01, + 0x12, 0x04, 0xa5, 0x01, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x09, 0x02, 0x04, 0x03, 0x12, + 0x04, 0xa5, 0x01, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0a, 0x12, 0x06, 0xa8, 0x01, 0x00, + 0xb2, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0a, 0x01, 0x12, 0x04, 0xa8, 0x01, 0x08, 0x17, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x00, 0x12, 0x04, 0xa9, 0x01, 0x02, 0x11, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa9, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa9, 0x01, 0x08, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa9, 0x01, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0a, 0x02, 0x01, 0x12, 0x04, 0xaa, 0x01, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, + 0x01, 0x05, 0x12, 0x04, 0xaa, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xaa, 0x01, 0x08, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xaa, 0x01, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x02, 0x12, 0x04, + 0xab, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x05, 0x12, 0x04, 0xab, + 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x01, 0x12, 0x04, 0xab, 0x01, + 0x08, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xab, 0x01, 0x1a, + 0x1b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x03, 0x12, 0x04, 0xac, 0x01, 0x02, 0x2b, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x03, 0x04, 0x12, 0x04, 0xac, 0x01, 0x02, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x03, 0x05, 0x12, 0x04, 0xac, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xac, 0x01, 0x11, 0x26, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xac, 0x01, 0x29, 0x2a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0a, 0x02, 0x04, 0x12, 0x04, 0xad, 0x01, 0x02, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, + 0x04, 0x05, 0x12, 0x04, 0xad, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, + 0x01, 0x12, 0x04, 0xad, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x03, + 0x12, 0x04, 0xad, 0x01, 0x14, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x04, 0x08, 0x12, + 0x04, 0xad, 0x01, 0x16, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0a, 0x02, 0x04, 0x08, 0x06, 0x12, + 0x04, 0xad, 0x01, 0x17, 0x29, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x05, 0x12, 0x04, 0xae, + 0x01, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x05, 0x12, 0x04, 0xae, 0x01, + 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x01, 0x12, 0x04, 0xae, 0x01, 0x07, + 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x05, 0x03, 0x12, 0x04, 0xae, 0x01, 0x11, 0x12, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x06, 0x12, 0x04, 0xaf, 0x01, 0x02, 0x17, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x06, 0x05, 0x12, 0x04, 0xaf, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0a, 0x02, 0x06, 0x01, 0x12, 0x04, 0xaf, 0x01, 0x09, 0x12, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0a, 0x02, 0x06, 0x03, 0x12, 0x04, 0xaf, 0x01, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0a, 0x02, 0x07, 0x12, 0x04, 0xb0, 0x01, 0x02, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, + 0x07, 0x05, 0x12, 0x04, 0xb0, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x07, + 0x01, 0x12, 0x04, 0xb0, 0x01, 0x08, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x07, 0x03, + 0x12, 0x04, 0xb0, 0x01, 0x20, 0x21, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0a, 0x02, 0x08, 0x12, 0x04, + 0xb1, 0x01, 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x04, 0x12, 0x04, 0xb1, + 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x06, 0x12, 0x04, 0xb1, 0x01, + 0x0b, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x01, 0x12, 0x04, 0xb1, 0x01, 0x1a, + 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0a, 0x02, 0x08, 0x03, 0x12, 0x04, 0xb1, 0x01, 0x24, 0x25, + 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0b, 0x12, 0x06, 0xb4, 0x01, 0x00, 0xb7, 0x01, 0x01, 0x0a, 0x0b, + 0x0a, 0x03, 0x04, 0x0b, 0x01, 0x12, 0x04, 0xb4, 0x01, 0x08, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0b, 0x02, 0x00, 0x12, 0x04, 0xb5, 0x01, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, + 0x00, 0x05, 0x12, 0x04, 0xb5, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xb5, 0x01, 0x09, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xb5, 0x01, 0x1b, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x00, 0x08, 0x12, + 0x04, 0xb5, 0x01, 0x1d, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0b, 0x02, 0x00, 0x08, 0x06, 0x12, + 0x04, 0xb5, 0x01, 0x1e, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0b, 0x02, 0x01, 0x12, 0x04, 0xb6, + 0x01, 0x02, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb6, 0x01, + 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb6, 0x01, 0x09, + 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb6, 0x01, 0x1b, 0x1c, + 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0c, 0x12, 0x06, 0xb9, 0x01, 0x00, 0xc1, 0x01, 0x01, 0x0a, 0x0b, + 0x0a, 0x03, 0x04, 0x0c, 0x01, 0x12, 0x04, 0xb9, 0x01, 0x08, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0c, 0x02, 0x00, 0x12, 0x04, 0xba, 0x01, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, + 0x00, 0x05, 0x12, 0x04, 0xba, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xba, 0x01, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xba, 0x01, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x01, 0x12, 0x04, + 0xbb, 0x01, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x05, 0x12, 0x04, 0xbb, + 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbb, 0x01, + 0x09, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbb, 0x01, 0x1b, + 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x01, 0x08, 0x12, 0x04, 0xbb, 0x01, 0x1d, 0x31, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0c, 0x02, 0x01, 0x08, 0x06, 0x12, 0x04, 0xbb, 0x01, 0x1e, 0x30, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x02, 0x12, 0x04, 0xbc, 0x01, 0x02, 0x31, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x02, 0x05, 0x12, 0x04, 0xbc, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xbc, 0x01, 0x09, 0x17, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0c, 0x02, 0x02, 0x03, 0x12, 0x04, 0xbc, 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x0c, 0x02, 0x02, 0x08, 0x12, 0x04, 0xbc, 0x01, 0x1c, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0c, + 0x02, 0x02, 0x08, 0x06, 0x12, 0x04, 0xbc, 0x01, 0x1d, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, + 0x02, 0x03, 0x12, 0x04, 0xbd, 0x01, 0x02, 0x31, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, + 0x05, 0x12, 0x04, 0xbd, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x01, + 0x12, 0x04, 0xbd, 0x01, 0x09, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x03, 0x12, + 0x04, 0xbd, 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x03, 0x08, 0x12, 0x04, + 0xbd, 0x01, 0x1c, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0c, 0x02, 0x03, 0x08, 0x06, 0x12, 0x04, + 0xbd, 0x01, 0x1d, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x04, 0x12, 0x04, 0xbe, 0x01, + 0x02, 0x3f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x06, 0x12, 0x04, 0xbe, 0x01, 0x02, + 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x01, 0x12, 0x04, 0xbe, 0x01, 0x21, 0x3a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x04, 0x03, 0x12, 0x04, 0xbe, 0x01, 0x3d, 0x3e, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x0c, 0x02, 0x05, 0x12, 0x04, 0xbf, 0x01, 0x02, 0x21, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0c, 0x02, 0x05, 0x06, 0x12, 0x04, 0xbf, 0x01, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0c, 0x02, 0x05, 0x01, 0x12, 0x04, 0xbf, 0x01, 0x15, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x0c, 0x02, 0x05, 0x03, 0x12, 0x04, 0xbf, 0x01, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0c, + 0x02, 0x06, 0x12, 0x04, 0xc0, 0x01, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, + 0x06, 0x12, 0x04, 0xc0, 0x01, 0x02, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, 0x01, + 0x12, 0x04, 0xc0, 0x01, 0x0c, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0c, 0x02, 0x06, 0x03, 0x12, + 0x04, 0xc0, 0x01, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0d, 0x12, 0x06, 0xc3, 0x01, 0x00, + 0xcf, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0d, 0x01, 0x12, 0x04, 0xc3, 0x01, 0x08, 0x10, + 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x0d, 0x04, 0x00, 0x12, 0x06, 0xc4, 0x01, 0x02, 0xc8, 0x01, 0x03, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x04, 0x00, 0x01, 0x12, 0x04, 0xc4, 0x01, 0x07, 0x13, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xc5, 0x01, 0x04, 0x23, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc5, 0x01, 0x04, 0x1e, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xc5, 0x01, 0x21, + 0x22, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xc6, 0x01, 0x04, + 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc6, 0x01, + 0x04, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xc6, + 0x01, 0x26, 0x27, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xc7, + 0x01, 0x04, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, + 0xc7, 0x01, 0x04, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x0d, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, + 0x04, 0xc7, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0d, 0x02, 0x00, 0x12, 0x04, 0xca, + 0x01, 0x02, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x06, 0x12, 0x04, 0xca, 0x01, + 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xca, 0x01, 0x0f, + 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xca, 0x01, 0x20, 0x21, + 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x0d, 0x08, 0x00, 0x12, 0x06, 0xcb, 0x01, 0x02, 0xce, 0x01, 0x03, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x08, 0x00, 0x01, 0x12, 0x04, 0xcb, 0x01, 0x08, 0x11, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x0d, 0x02, 0x01, 0x12, 0x04, 0xcc, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0d, 0x02, 0x01, 0x06, 0x12, 0x04, 0xcc, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcc, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x0d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xcc, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0d, + 0x02, 0x02, 0x12, 0x04, 0xcd, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, + 0x06, 0x12, 0x04, 0xcd, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xcd, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0d, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xcd, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0e, 0x12, 0x06, 0xd1, 0x01, 0x00, + 0xd4, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0e, 0x01, 0x12, 0x04, 0xd1, 0x01, 0x08, 0x16, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0e, 0x02, 0x00, 0x12, 0x04, 0xd2, 0x01, 0x02, 0x18, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xd2, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x01, 0x09, 0x13, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd2, 0x01, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0e, 0x02, 0x01, 0x12, 0x04, 0xd3, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, + 0x01, 0x06, 0x12, 0x04, 0xd3, 0x01, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xd3, 0x01, 0x10, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0e, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xd3, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x0f, 0x12, 0x06, 0xd6, 0x01, + 0x00, 0xd9, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x0f, 0x01, 0x12, 0x04, 0xd6, 0x01, 0x08, + 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x0f, 0x02, 0x00, 0x12, 0x04, 0xd7, 0x01, 0x02, 0x2f, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x00, 0x04, 0x12, 0x04, 0xd7, 0x01, 0x02, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd7, 0x01, 0x0b, 0x19, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x0f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd7, 0x01, 0x1a, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x0f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd7, 0x01, 0x2d, 0x2e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x0f, 0x02, 0x01, 0x12, 0x04, 0xd8, 0x01, 0x02, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, + 0x01, 0x04, 0x12, 0x04, 0xd8, 0x01, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, + 0x06, 0x12, 0x04, 0xd8, 0x01, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xd8, 0x01, 0x11, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x0f, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xd8, 0x01, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x10, 0x12, 0x06, 0xdb, 0x01, 0x00, + 0xf0, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x10, 0x01, 0x12, 0x04, 0xdb, 0x01, 0x08, 0x16, + 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x10, 0x04, 0x00, 0x12, 0x06, 0xdc, 0x01, 0x02, 0xe4, 0x01, 0x03, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x04, 0x00, 0x01, 0x12, 0x04, 0xdc, 0x01, 0x07, 0x0b, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xdd, 0x01, 0x04, 0x19, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xdd, 0x01, 0x04, 0x14, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xdd, 0x01, 0x17, + 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xde, 0x01, 0x04, + 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x01, + 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xde, + 0x01, 0x19, 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xdf, + 0x01, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, + 0xdf, 0x01, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, + 0x04, 0xdf, 0x01, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, 0x12, + 0x04, 0xe0, 0x01, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, 0x01, + 0x12, 0x04, 0xe0, 0x01, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, 0x03, + 0x02, 0x12, 0x04, 0xe0, 0x01, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, 0x00, 0x02, + 0x04, 0x12, 0x04, 0xe1, 0x01, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, 0x02, + 0x04, 0x01, 0x12, 0x04, 0xe1, 0x01, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, 0x00, + 0x02, 0x04, 0x02, 0x12, 0x04, 0xe1, 0x01, 0x18, 0x19, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x10, 0x04, + 0x00, 0x02, 0x05, 0x12, 0x04, 0xe2, 0x01, 0x04, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, 0x04, + 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe2, 0x01, 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x10, + 0x04, 0x00, 0x02, 0x05, 0x02, 0x12, 0x04, 0xe2, 0x01, 0x1a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x10, 0x04, 0x00, 0x02, 0x06, 0x12, 0x04, 0xe3, 0x01, 0x04, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x10, 0x04, 0x00, 0x02, 0x06, 0x01, 0x12, 0x04, 0xe3, 0x01, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x10, 0x04, 0x00, 0x02, 0x06, 0x02, 0x12, 0x04, 0xe3, 0x01, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x10, 0x02, 0x00, 0x12, 0x04, 0xe6, 0x01, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x10, 0x02, 0x00, 0x06, 0x12, 0x04, 0xe6, 0x01, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, + 0x02, 0x00, 0x01, 0x12, 0x04, 0xe6, 0x01, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, + 0x00, 0x03, 0x12, 0x04, 0xe6, 0x01, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x10, 0x08, 0x00, + 0x12, 0x06, 0xe8, 0x01, 0x02, 0xef, 0x01, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x08, 0x00, + 0x01, 0x12, 0x04, 0xe8, 0x01, 0x08, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x01, 0x12, + 0x04, 0xe9, 0x01, 0x04, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x06, 0x12, 0x04, + 0xe9, 0x01, 0x04, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, + 0x01, 0x11, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe9, 0x01, + 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x02, 0x12, 0x04, 0xea, 0x01, 0x04, 0x27, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x02, 0x06, 0x12, 0x04, 0xea, 0x01, 0x04, 0x12, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x02, 0x01, 0x12, 0x04, 0xea, 0x01, 0x13, 0x22, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x10, 0x02, 0x02, 0x03, 0x12, 0x04, 0xea, 0x01, 0x25, 0x26, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x10, 0x02, 0x03, 0x12, 0x04, 0xeb, 0x01, 0x04, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x10, 0x02, 0x03, 0x06, 0x12, 0x04, 0xeb, 0x01, 0x04, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, + 0x02, 0x03, 0x01, 0x12, 0x04, 0xeb, 0x01, 0x14, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, + 0x03, 0x03, 0x12, 0x04, 0xeb, 0x01, 0x28, 0x29, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x04, + 0x12, 0x04, 0xec, 0x01, 0x04, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x06, 0x12, + 0x04, 0xec, 0x01, 0x04, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x01, 0x12, 0x04, + 0xec, 0x01, 0x10, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x04, 0x03, 0x12, 0x04, 0xec, + 0x01, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x10, 0x02, 0x05, 0x12, 0x04, 0xed, 0x01, 0x04, + 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x05, 0x06, 0x12, 0x04, 0xed, 0x01, 0x04, 0x11, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x05, 0x01, 0x12, 0x04, 0xed, 0x01, 0x12, 0x20, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x10, 0x02, 0x05, 0x03, 0x12, 0x04, 0xed, 0x01, 0x23, 0x24, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x10, 0x02, 0x06, 0x12, 0x04, 0xee, 0x01, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x10, 0x02, 0x06, 0x06, 0x12, 0x04, 0xee, 0x01, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x10, 0x02, 0x06, 0x01, 0x12, 0x04, 0xee, 0x01, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x10, + 0x02, 0x06, 0x03, 0x12, 0x04, 0xee, 0x01, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x11, 0x12, + 0x06, 0xf2, 0x01, 0x00, 0xf6, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x11, 0x01, 0x12, 0x04, + 0xf2, 0x01, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x11, 0x02, 0x00, 0x12, 0x04, 0xf3, 0x01, + 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf3, 0x01, 0x02, + 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf3, 0x01, 0x09, 0x10, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf3, 0x01, 0x13, 0x14, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x11, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x11, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf4, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x11, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf4, 0x01, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x11, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf4, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x11, + 0x02, 0x02, 0x12, 0x04, 0xf5, 0x01, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, + 0x06, 0x12, 0x04, 0xf5, 0x01, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xf5, 0x01, 0x0f, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x11, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xf5, 0x01, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x12, 0x12, 0x06, 0xf8, 0x01, 0x00, + 0xfd, 0x01, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x12, 0x01, 0x12, 0x04, 0xf8, 0x01, 0x08, 0x16, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, 0x00, 0x12, 0x04, 0xf9, 0x01, 0x02, 0x15, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x12, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf9, 0x01, 0x02, 0x08, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x12, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf9, 0x01, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x12, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf9, 0x01, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x12, 0x02, 0x01, 0x12, 0x04, 0xfa, 0x01, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, + 0x01, 0x05, 0x12, 0x04, 0xfa, 0x01, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xfa, 0x01, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xfa, 0x01, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, 0x02, 0x12, 0x04, + 0xfb, 0x01, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x06, 0x12, 0x04, 0xfb, + 0x01, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x01, 0x12, 0x04, 0xfb, 0x01, + 0x10, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x02, 0x03, 0x12, 0x04, 0xfb, 0x01, 0x17, + 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x12, 0x02, 0x03, 0x12, 0x04, 0xfc, 0x01, 0x02, 0x16, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x12, 0x02, 0x03, 0x05, 0x12, 0x04, 0xfc, 0x01, 0x02, 0x08, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x12, 0x02, 0x03, 0x01, 0x12, 0x04, 0xfc, 0x01, 0x09, 0x11, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x12, 0x02, 0x03, 0x03, 0x12, 0x04, 0xfc, 0x01, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, + 0x04, 0x13, 0x12, 0x06, 0xff, 0x01, 0x00, 0x84, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x13, + 0x01, 0x12, 0x04, 0xff, 0x01, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x00, 0x12, + 0x04, 0x80, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x05, 0x12, 0x04, + 0x80, 0x02, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x01, 0x12, 0x04, 0x80, + 0x02, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x00, 0x03, 0x12, 0x04, 0x80, 0x02, + 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x01, 0x12, 0x04, 0x81, 0x02, 0x02, 0x14, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x01, 0x05, 0x12, 0x04, 0x81, 0x02, 0x02, 0x08, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x01, 0x01, 0x12, 0x04, 0x81, 0x02, 0x09, 0x0f, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x13, 0x02, 0x01, 0x03, 0x12, 0x04, 0x81, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x13, 0x02, 0x02, 0x12, 0x04, 0x82, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x13, 0x02, 0x02, 0x05, 0x12, 0x04, 0x82, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, + 0x02, 0x02, 0x01, 0x12, 0x04, 0x82, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, + 0x02, 0x03, 0x12, 0x04, 0x82, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x13, 0x02, 0x03, + 0x12, 0x04, 0x83, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x06, 0x12, + 0x04, 0x83, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x01, 0x12, 0x04, + 0x83, 0x02, 0x12, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x13, 0x02, 0x03, 0x03, 0x12, 0x04, 0x83, + 0x02, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x14, 0x12, 0x06, 0x86, 0x02, 0x00, 0x89, 0x02, + 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x14, 0x01, 0x12, 0x04, 0x86, 0x02, 0x08, 0x17, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x14, 0x02, 0x00, 0x12, 0x04, 0x87, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x14, 0x02, 0x00, 0x05, 0x12, 0x04, 0x87, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x14, 0x02, 0x00, 0x01, 0x12, 0x04, 0x87, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, + 0x02, 0x00, 0x03, 0x12, 0x04, 0x87, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x14, 0x02, + 0x01, 0x12, 0x04, 0x88, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x05, + 0x12, 0x04, 0x88, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x01, 0x12, + 0x04, 0x88, 0x02, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x14, 0x02, 0x01, 0x03, 0x12, 0x04, + 0x88, 0x02, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x15, 0x12, 0x06, 0x8b, 0x02, 0x00, 0x8f, + 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x15, 0x01, 0x12, 0x04, 0x8b, 0x02, 0x08, 0x13, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x15, 0x02, 0x00, 0x12, 0x04, 0x8c, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x15, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8c, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x15, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8c, 0x02, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x15, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8c, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x15, + 0x02, 0x01, 0x12, 0x04, 0x8d, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, + 0x05, 0x12, 0x04, 0x8d, 0x02, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, 0x01, + 0x12, 0x04, 0x8d, 0x02, 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x01, 0x03, 0x12, + 0x04, 0x8d, 0x02, 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x15, 0x02, 0x02, 0x12, 0x04, 0x8e, + 0x02, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x06, 0x12, 0x04, 0x8e, 0x02, + 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x01, 0x12, 0x04, 0x8e, 0x02, 0x15, + 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x15, 0x02, 0x02, 0x03, 0x12, 0x04, 0x8e, 0x02, 0x1c, 0x1d, + 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x16, 0x12, 0x06, 0x91, 0x02, 0x00, 0x97, 0x02, 0x01, 0x0a, 0x0b, + 0x0a, 0x03, 0x04, 0x16, 0x01, 0x12, 0x04, 0x91, 0x02, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x16, 0x02, 0x00, 0x12, 0x04, 0x92, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, + 0x00, 0x05, 0x12, 0x04, 0x92, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x00, + 0x01, 0x12, 0x04, 0x92, 0x02, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x00, 0x03, + 0x12, 0x04, 0x92, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x01, 0x12, 0x04, + 0x93, 0x02, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x05, 0x12, 0x04, 0x93, + 0x02, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x01, 0x12, 0x04, 0x93, 0x02, + 0x08, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x01, 0x03, 0x12, 0x04, 0x93, 0x02, 0x19, + 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x02, 0x12, 0x04, 0x94, 0x02, 0x02, 0x19, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x02, 0x06, 0x12, 0x04, 0x94, 0x02, 0x02, 0x0f, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x16, 0x02, 0x02, 0x01, 0x12, 0x04, 0x94, 0x02, 0x10, 0x14, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x16, 0x02, 0x02, 0x03, 0x12, 0x04, 0x94, 0x02, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x16, 0x02, 0x03, 0x12, 0x04, 0x95, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, + 0x02, 0x03, 0x05, 0x12, 0x04, 0x95, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, + 0x03, 0x01, 0x12, 0x04, 0x95, 0x02, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x03, + 0x03, 0x12, 0x04, 0x95, 0x02, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x16, 0x02, 0x04, 0x12, + 0x04, 0x96, 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x05, 0x12, 0x04, + 0x96, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x01, 0x12, 0x04, 0x96, + 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x16, 0x02, 0x04, 0x03, 0x12, 0x04, 0x96, 0x02, + 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x17, 0x12, 0x06, 0x99, 0x02, 0x00, 0x9e, 0x02, 0x01, + 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x17, 0x01, 0x12, 0x04, 0x99, 0x02, 0x08, 0x16, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x17, 0x02, 0x00, 0x12, 0x04, 0x9a, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x17, 0x02, 0x00, 0x05, 0x12, 0x04, 0x9a, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, + 0x02, 0x00, 0x01, 0x12, 0x04, 0x9a, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x9a, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x17, 0x02, 0x01, + 0x12, 0x04, 0x9b, 0x02, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x05, 0x12, + 0x04, 0x9b, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x9b, 0x02, 0x09, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x01, 0x03, 0x12, 0x04, 0x9b, + 0x02, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x17, 0x02, 0x02, 0x12, 0x04, 0x9c, 0x02, 0x02, + 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x02, 0x05, 0x12, 0x04, 0x9c, 0x02, 0x02, 0x08, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x02, 0x01, 0x12, 0x04, 0x9c, 0x02, 0x09, 0x0e, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x17, 0x02, 0x02, 0x03, 0x12, 0x04, 0x9c, 0x02, 0x11, 0x12, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x17, 0x02, 0x03, 0x12, 0x04, 0x9d, 0x02, 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x17, 0x02, 0x03, 0x05, 0x12, 0x04, 0x9d, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x17, 0x02, 0x03, 0x01, 0x12, 0x04, 0x9d, 0x02, 0x09, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x17, + 0x02, 0x03, 0x03, 0x12, 0x04, 0x9d, 0x02, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x18, 0x12, + 0x06, 0xa0, 0x02, 0x00, 0xa5, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x18, 0x01, 0x12, 0x04, + 0xa0, 0x02, 0x08, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x00, 0x12, 0x04, 0xa1, 0x02, + 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa1, 0x02, 0x02, + 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa1, 0x02, 0x08, 0x16, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa1, 0x02, 0x19, 0x1a, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x01, 0x12, 0x04, 0xa2, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x18, 0x02, 0x01, 0x05, 0x12, 0x04, 0xa2, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x18, 0x02, 0x01, 0x01, 0x12, 0x04, 0xa2, 0x02, 0x09, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x18, 0x02, 0x01, 0x03, 0x12, 0x04, 0xa2, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, + 0x02, 0x02, 0x12, 0x04, 0xa3, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, + 0x05, 0x12, 0x04, 0xa3, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xa3, 0x02, 0x09, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xa3, 0x02, 0x0f, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x18, 0x02, 0x03, 0x12, 0x04, 0xa4, + 0x02, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x06, 0x12, 0x04, 0xa4, 0x02, + 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa4, 0x02, 0x11, + 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x18, 0x02, 0x03, 0x03, 0x12, 0x04, 0xa4, 0x02, 0x18, 0x19, + 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x19, 0x12, 0x06, 0xa7, 0x02, 0x00, 0xba, 0x02, 0x01, 0x0a, 0x0b, + 0x0a, 0x03, 0x04, 0x19, 0x01, 0x12, 0x04, 0xa7, 0x02, 0x08, 0x1a, 0x0a, 0x0e, 0x0a, 0x04, 0x04, + 0x19, 0x04, 0x00, 0x12, 0x06, 0xa8, 0x02, 0x02, 0xaf, 0x02, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x19, 0x04, 0x00, 0x01, 0x12, 0x04, 0xa8, 0x02, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, + 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xa9, 0x02, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa9, 0x02, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x19, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xa9, 0x02, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x19, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xaa, 0x02, 0x04, 0x24, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x19, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xaa, 0x02, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xaa, 0x02, 0x22, 0x23, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xab, 0x02, 0x04, 0x1c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xab, 0x02, 0x04, 0x17, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xab, 0x02, 0x1a, 0x1b, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xac, 0x02, 0x04, 0x1f, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xac, 0x02, 0x04, + 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0xac, 0x02, + 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0xad, 0x02, + 0x04, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0xad, + 0x02, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, + 0xad, 0x02, 0x1c, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x04, 0x00, 0x04, 0x12, 0x04, 0xae, + 0x02, 0x04, 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x12, 0x04, 0xae, + 0x02, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x01, 0x12, 0x04, + 0xae, 0x02, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x19, 0x04, 0x00, 0x04, 0x00, 0x02, 0x12, + 0x04, 0xae, 0x02, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x00, 0x12, 0x04, 0xb1, + 0x02, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x06, 0x12, 0x04, 0xb1, 0x02, + 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb1, 0x02, 0x07, + 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb1, 0x02, 0x0e, 0x0f, + 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x19, 0x08, 0x00, 0x12, 0x06, 0xb3, 0x02, 0x02, 0xb8, 0x02, 0x03, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x08, 0x00, 0x01, 0x12, 0x04, 0xb3, 0x02, 0x08, 0x0f, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x01, 0x12, 0x04, 0xb4, 0x02, 0x04, 0x34, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x19, 0x02, 0x01, 0x06, 0x12, 0x04, 0xb4, 0x02, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x19, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb4, 0x02, 0x19, 0x2f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x19, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb4, 0x02, 0x32, 0x33, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, + 0x02, 0x02, 0x12, 0x04, 0xb5, 0x02, 0x04, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, + 0x06, 0x12, 0x04, 0xb5, 0x02, 0x04, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xb5, 0x02, 0x12, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xb5, 0x02, 0x23, 0x24, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x03, 0x12, 0x04, 0xb6, + 0x02, 0x04, 0x2a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x06, 0x12, 0x04, 0xb6, 0x02, + 0x04, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x01, 0x12, 0x04, 0xb6, 0x02, 0x14, + 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x02, 0x03, 0x03, 0x12, 0x04, 0xb6, 0x02, 0x28, 0x29, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x02, 0x04, 0x12, 0x04, 0xb7, 0x02, 0x04, 0x29, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x19, 0x02, 0x04, 0x06, 0x12, 0x04, 0xb7, 0x02, 0x04, 0x13, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x19, 0x02, 0x04, 0x01, 0x12, 0x04, 0xb7, 0x02, 0x14, 0x24, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x19, 0x02, 0x04, 0x03, 0x12, 0x04, 0xb7, 0x02, 0x27, 0x28, 0x0a, 0x0b, 0x0a, 0x03, 0x04, + 0x19, 0x09, 0x12, 0x04, 0xb9, 0x02, 0x02, 0x0d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x19, 0x09, 0x00, + 0x12, 0x04, 0xb9, 0x02, 0x0b, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x09, 0x00, 0x01, 0x12, + 0x04, 0xb9, 0x02, 0x0b, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x19, 0x09, 0x00, 0x02, 0x12, 0x04, + 0xb9, 0x02, 0x0b, 0x0c, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1a, 0x12, 0x06, 0xbc, 0x02, 0x00, 0xc1, + 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1a, 0x01, 0x12, 0x04, 0xbc, 0x02, 0x08, 0x1c, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x1a, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x02, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x1a, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbd, 0x02, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x1a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x02, 0x12, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbd, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1a, + 0x02, 0x01, 0x12, 0x04, 0xbe, 0x02, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, + 0x04, 0x12, 0x04, 0xbe, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x06, + 0x12, 0x04, 0xbe, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xbe, 0x02, 0x14, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xbe, 0x02, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1a, 0x02, 0x02, 0x12, 0x04, 0xbf, 0x02, + 0x02, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x04, 0x12, 0x04, 0xbf, 0x02, 0x02, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x05, 0x12, 0x04, 0xbf, 0x02, 0x0b, 0x11, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x01, 0x12, 0x04, 0xbf, 0x02, 0x12, 0x1b, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x1a, 0x02, 0x02, 0x03, 0x12, 0x04, 0xbf, 0x02, 0x1e, 0x1f, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x1a, 0x02, 0x03, 0x12, 0x04, 0xc0, 0x02, 0x02, 0x23, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x1a, 0x02, 0x03, 0x05, 0x12, 0x04, 0xc0, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xc0, 0x02, 0x09, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1a, + 0x02, 0x03, 0x03, 0x12, 0x04, 0xc0, 0x02, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1b, 0x12, + 0x06, 0xc3, 0x02, 0x00, 0xc6, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1b, 0x01, 0x12, 0x04, + 0xc3, 0x02, 0x08, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1b, 0x02, 0x00, 0x12, 0x04, 0xc4, 0x02, + 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc4, 0x02, 0x02, + 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc4, 0x02, 0x08, 0x10, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1b, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc4, 0x02, 0x13, 0x14, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x1b, 0x02, 0x01, 0x12, 0x04, 0xc5, 0x02, 0x02, 0x17, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x1b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xc5, 0x02, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x1b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc5, 0x02, 0x0f, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc5, 0x02, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1c, + 0x12, 0x06, 0xc8, 0x02, 0x00, 0xcc, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1c, 0x01, 0x12, + 0x04, 0xc8, 0x02, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1c, 0x02, 0x00, 0x12, 0x04, 0xc9, + 0x02, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc9, 0x02, + 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc9, 0x02, 0x15, + 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc9, 0x02, 0x1c, 0x1d, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1c, 0x02, 0x01, 0x12, 0x04, 0xca, 0x02, 0x02, 0x27, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x01, 0x04, 0x12, 0x04, 0xca, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x1c, 0x02, 0x01, 0x06, 0x12, 0x04, 0xca, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x1c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xca, 0x02, 0x14, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xca, 0x02, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1c, + 0x02, 0x02, 0x12, 0x04, 0xcb, 0x02, 0x02, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, + 0x04, 0x12, 0x04, 0xcb, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x05, + 0x12, 0x04, 0xcb, 0x02, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xcb, 0x02, 0x12, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1c, 0x02, 0x02, 0x03, 0x12, 0x04, + 0xcb, 0x02, 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1d, 0x12, 0x06, 0xce, 0x02, 0x00, 0xd1, + 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1d, 0x01, 0x12, 0x04, 0xce, 0x02, 0x08, 0x17, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x1d, 0x02, 0x00, 0x12, 0x04, 0xcf, 0x02, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x1d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xcf, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x1d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcf, 0x02, 0x09, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcf, 0x02, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1d, + 0x02, 0x01, 0x12, 0x04, 0xd0, 0x02, 0x02, 0x3e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, + 0x04, 0x12, 0x04, 0xd0, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x06, + 0x12, 0x04, 0xd0, 0x02, 0x0b, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xd0, 0x02, 0x26, 0x39, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1d, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xd0, 0x02, 0x3c, 0x3d, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1e, 0x12, 0x06, 0xd3, 0x02, 0x00, 0xde, + 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1e, 0x01, 0x12, 0x04, 0xd3, 0x02, 0x08, 0x22, 0x0a, + 0x0e, 0x0a, 0x04, 0x04, 0x1e, 0x04, 0x00, 0x12, 0x06, 0xd4, 0x02, 0x02, 0xd7, 0x02, 0x03, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd4, 0x02, 0x07, 0x0b, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd5, 0x02, 0x04, 0x19, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x02, 0x04, 0x14, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd5, 0x02, 0x17, 0x18, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd6, 0x02, 0x04, 0x24, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd6, 0x02, 0x04, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x1e, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd6, 0x02, + 0x22, 0x23, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1e, 0x02, 0x00, 0x12, 0x04, 0xd9, 0x02, 0x02, 0x10, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd9, 0x02, 0x02, 0x06, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd9, 0x02, 0x07, 0x0b, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd9, 0x02, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, + 0x04, 0x04, 0x1e, 0x08, 0x00, 0x12, 0x06, 0xdb, 0x02, 0x02, 0xdd, 0x02, 0x03, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x1e, 0x08, 0x00, 0x01, 0x12, 0x04, 0xdb, 0x02, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x1e, 0x02, 0x01, 0x12, 0x04, 0xdc, 0x02, 0x04, 0x34, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, + 0x02, 0x01, 0x06, 0x12, 0x04, 0xdc, 0x02, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xdc, 0x02, 0x19, 0x2f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1e, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xdc, 0x02, 0x32, 0x33, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x1f, 0x12, 0x06, 0xe0, + 0x02, 0x00, 0xe3, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x1f, 0x01, 0x12, 0x04, 0xe0, 0x02, + 0x08, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x1f, 0x02, 0x00, 0x12, 0x04, 0xe1, 0x02, 0x02, 0x15, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe1, 0x02, 0x02, 0x07, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe1, 0x02, 0x08, 0x10, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x1f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe1, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x1f, 0x02, 0x01, 0x12, 0x04, 0xe2, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x1f, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe2, 0x02, 0x02, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, + 0x02, 0x01, 0x01, 0x12, 0x04, 0xe2, 0x02, 0x0d, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x1f, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xe2, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x20, 0x12, 0x06, + 0xe5, 0x02, 0x00, 0xeb, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x20, 0x01, 0x12, 0x04, 0xe5, + 0x02, 0x08, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, 0x00, 0x12, 0x04, 0xe6, 0x02, 0x02, + 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe6, 0x02, 0x02, 0x08, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe6, 0x02, 0x09, 0x10, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe6, 0x02, 0x13, 0x14, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x20, 0x02, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x20, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe7, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x20, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xe7, 0x02, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, + 0x02, 0x12, 0x04, 0xe8, 0x02, 0x02, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x04, + 0x12, 0x04, 0xe8, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x06, 0x12, + 0x04, 0xe8, 0x02, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x01, 0x12, 0x04, + 0xe8, 0x02, 0x18, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x02, 0x03, 0x12, 0x04, 0xe8, + 0x02, 0x22, 0x23, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x20, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x02, + 0x2e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x04, 0x12, 0x04, 0xe9, 0x02, 0x02, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x06, 0x12, 0x04, 0xe9, 0x02, 0x0b, 0x17, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe9, 0x02, 0x18, 0x29, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x20, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x2c, 0x2d, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x20, 0x02, 0x04, 0x12, 0x04, 0xea, 0x02, 0x02, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x20, 0x02, 0x04, 0x04, 0x12, 0x04, 0xea, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, + 0x02, 0x04, 0x06, 0x12, 0x04, 0xea, 0x02, 0x0b, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, + 0x04, 0x01, 0x12, 0x04, 0xea, 0x02, 0x16, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x20, 0x02, 0x04, + 0x03, 0x12, 0x04, 0xea, 0x02, 0x20, 0x21, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x21, 0x12, 0x06, 0xec, + 0x02, 0x00, 0xf9, 0x02, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x21, 0x01, 0x12, 0x04, 0xec, 0x02, + 0x08, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x21, 0x04, 0x00, 0x12, 0x06, 0xed, 0x02, 0x02, 0xf2, + 0x02, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x04, 0x00, 0x01, 0x12, 0x04, 0xed, 0x02, 0x07, + 0x11, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xee, 0x02, 0x04, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xee, 0x02, + 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xee, + 0x02, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xef, + 0x02, 0x04, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xef, 0x02, 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, + 0x04, 0xef, 0x02, 0x19, 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, 0x12, + 0x04, 0xf0, 0x02, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xf0, 0x02, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, 0x02, + 0x02, 0x12, 0x04, 0xf0, 0x02, 0x18, 0x19, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x21, 0x04, 0x00, 0x02, + 0x03, 0x12, 0x04, 0xf1, 0x02, 0x04, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, 0x02, + 0x03, 0x01, 0x12, 0x04, 0xf1, 0x02, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x21, 0x04, 0x00, + 0x02, 0x03, 0x02, 0x12, 0x04, 0xf1, 0x02, 0x18, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, + 0x00, 0x12, 0x04, 0xf3, 0x02, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xf3, 0x02, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xf3, 0x02, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xf3, 0x02, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x02, + 0x02, 0x29, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x06, 0x12, 0x04, 0xf4, 0x02, 0x02, + 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf4, 0x02, 0x1a, 0x24, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf4, 0x02, 0x27, 0x28, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x02, 0x12, 0x04, 0xf5, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x21, 0x02, 0x02, 0x05, 0x12, 0x04, 0xf5, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x21, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf5, 0x02, 0x07, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x21, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf5, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, + 0x02, 0x03, 0x12, 0x04, 0xf6, 0x02, 0x02, 0x40, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, + 0x04, 0x12, 0x04, 0xf6, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x06, + 0x12, 0x04, 0xf6, 0x02, 0x0b, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xf6, 0x02, 0x28, 0x3b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x03, 0x03, 0x12, 0x04, + 0xf6, 0x02, 0x3e, 0x3f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x21, 0x02, 0x04, 0x12, 0x04, 0xf7, 0x02, + 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x04, 0x12, 0x04, 0xf7, 0x02, 0x02, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x06, 0x12, 0x04, 0xf7, 0x02, 0x0b, 0x13, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x01, 0x12, 0x04, 0xf7, 0x02, 0x14, 0x1a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, 0x04, 0x03, 0x12, 0x04, 0xf7, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x21, 0x02, 0x05, 0x12, 0x04, 0xf8, 0x02, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x21, 0x02, 0x05, 0x04, 0x12, 0x04, 0xf8, 0x02, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x21, 0x02, 0x05, 0x06, 0x12, 0x04, 0xf8, 0x02, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, + 0x02, 0x05, 0x01, 0x12, 0x04, 0xf8, 0x02, 0x14, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x21, 0x02, + 0x05, 0x03, 0x12, 0x04, 0xf8, 0x02, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x22, 0x12, 0x06, + 0xfb, 0x02, 0x00, 0x82, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x22, 0x01, 0x12, 0x04, 0xfb, + 0x02, 0x08, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x00, 0x12, 0x04, 0xfc, 0x02, 0x02, + 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x00, 0x05, 0x12, 0x04, 0xfc, 0x02, 0x02, 0x08, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfc, 0x02, 0x09, 0x0d, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfc, 0x02, 0x10, 0x11, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x22, 0x02, 0x01, 0x12, 0x04, 0xfd, 0x02, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x22, 0x02, 0x01, 0x05, 0x12, 0x04, 0xfd, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x22, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfd, 0x02, 0x07, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xfd, 0x02, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, + 0x02, 0x12, 0x04, 0xfe, 0x02, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x05, + 0x12, 0x04, 0xfe, 0x02, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xfe, 0x02, 0x07, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x02, 0x03, 0x12, 0x04, + 0xfe, 0x02, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x03, 0x12, 0x04, 0xff, 0x02, + 0x02, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x04, 0x12, 0x04, 0xff, 0x02, 0x02, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x06, 0x12, 0x04, 0xff, 0x02, 0x0b, 0x16, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x01, 0x12, 0x04, 0xff, 0x02, 0x17, 0x20, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x03, 0x03, 0x12, 0x04, 0xff, 0x02, 0x23, 0x24, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x22, 0x02, 0x04, 0x12, 0x04, 0x80, 0x03, 0x02, 0x3e, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x22, 0x02, 0x04, 0x04, 0x12, 0x04, 0x80, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x22, 0x02, 0x04, 0x06, 0x12, 0x04, 0x80, 0x03, 0x0b, 0x25, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, + 0x02, 0x04, 0x01, 0x12, 0x04, 0x80, 0x03, 0x26, 0x39, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, + 0x04, 0x03, 0x12, 0x04, 0x80, 0x03, 0x3c, 0x3d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x22, 0x02, 0x05, + 0x12, 0x04, 0x81, 0x03, 0x02, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x04, 0x12, + 0x04, 0x81, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x06, 0x12, 0x04, + 0x81, 0x03, 0x0b, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x01, 0x12, 0x04, 0x81, + 0x03, 0x1b, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x22, 0x02, 0x05, 0x03, 0x12, 0x04, 0x81, 0x03, + 0x24, 0x25, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x23, 0x12, 0x06, 0x84, 0x03, 0x00, 0x87, 0x03, 0x01, + 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x23, 0x01, 0x12, 0x04, 0x84, 0x03, 0x08, 0x22, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x23, 0x02, 0x00, 0x12, 0x04, 0x85, 0x03, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x23, 0x02, 0x00, 0x04, 0x12, 0x04, 0x85, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, + 0x02, 0x00, 0x06, 0x12, 0x04, 0x85, 0x03, 0x0b, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, + 0x00, 0x01, 0x12, 0x04, 0x85, 0x03, 0x17, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x00, + 0x03, 0x12, 0x04, 0x85, 0x03, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x23, 0x02, 0x01, 0x12, + 0x04, 0x86, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x05, 0x12, 0x04, + 0x86, 0x03, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x01, 0x12, 0x04, 0x86, + 0x03, 0x07, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x23, 0x02, 0x01, 0x03, 0x12, 0x04, 0x86, 0x03, + 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x24, 0x12, 0x06, 0x89, 0x03, 0x00, 0x8c, 0x03, 0x01, + 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x24, 0x01, 0x12, 0x04, 0x89, 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x24, 0x02, 0x00, 0x12, 0x04, 0x8a, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x24, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8a, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, + 0x02, 0x00, 0x01, 0x12, 0x04, 0x8a, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x8a, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x24, 0x02, 0x01, + 0x12, 0x04, 0x8b, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x06, 0x12, + 0x04, 0x8b, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x8b, 0x03, 0x0b, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x24, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8b, + 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x25, 0x12, 0x06, 0x8e, 0x03, 0x00, 0x90, 0x03, + 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x25, 0x01, 0x12, 0x04, 0x8e, 0x03, 0x08, 0x24, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x25, 0x02, 0x00, 0x12, 0x04, 0x8f, 0x03, 0x02, 0x27, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x25, 0x02, 0x00, 0x04, 0x12, 0x04, 0x8f, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x25, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8f, 0x03, 0x0b, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, + 0x02, 0x00, 0x01, 0x12, 0x04, 0x8f, 0x03, 0x17, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x25, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x8f, 0x03, 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x02, 0x05, 0x00, 0x12, 0x06, + 0x92, 0x03, 0x00, 0xa2, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x05, 0x00, 0x01, 0x12, 0x04, 0x92, + 0x03, 0x05, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x00, 0x12, 0x04, 0x93, 0x03, 0x02, + 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x93, 0x03, 0x02, 0x18, + 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x93, 0x03, 0x1b, 0x1c, 0x0a, + 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x01, 0x12, 0x04, 0x94, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, + 0x05, 0x05, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x94, 0x03, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, + 0x05, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x94, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, + 0x00, 0x02, 0x02, 0x12, 0x04, 0x95, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, + 0x02, 0x01, 0x12, 0x04, 0x95, 0x03, 0x02, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x02, + 0x02, 0x12, 0x04, 0x95, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x03, 0x12, + 0x04, 0x96, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, + 0x96, 0x03, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0x96, + 0x03, 0x13, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x04, 0x12, 0x04, 0x97, 0x03, 0x02, + 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x97, 0x03, 0x02, 0x10, + 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x97, 0x03, 0x13, 0x15, 0x0a, + 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x05, 0x12, 0x04, 0x98, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, + 0x05, 0x05, 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0x98, 0x03, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, + 0x05, 0x00, 0x02, 0x05, 0x02, 0x12, 0x04, 0x98, 0x03, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x05, + 0x00, 0x02, 0x06, 0x12, 0x04, 0x99, 0x03, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, + 0x06, 0x01, 0x12, 0x04, 0x99, 0x03, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x06, + 0x02, 0x12, 0x04, 0x99, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x07, 0x12, + 0x04, 0x9a, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x07, 0x01, 0x12, 0x04, + 0x9a, 0x03, 0x02, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x07, 0x02, 0x12, 0x04, 0x9a, + 0x03, 0x14, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x08, 0x12, 0x04, 0x9b, 0x03, 0x02, + 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x08, 0x01, 0x12, 0x04, 0x9b, 0x03, 0x02, 0x14, + 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x08, 0x02, 0x12, 0x04, 0x9b, 0x03, 0x17, 0x18, 0x0a, + 0x0c, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x09, 0x12, 0x04, 0x9c, 0x03, 0x02, 0x18, 0x0a, 0x0d, 0x0a, + 0x05, 0x05, 0x00, 0x02, 0x09, 0x01, 0x12, 0x04, 0x9c, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, + 0x05, 0x00, 0x02, 0x09, 0x02, 0x12, 0x04, 0x9c, 0x03, 0x16, 0x17, 0x0a, 0x2b, 0x0a, 0x04, 0x05, + 0x00, 0x02, 0x0a, 0x12, 0x04, 0x9d, 0x03, 0x02, 0x18, 0x22, 0x1d, 0x20, 0x60, 0x7b, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x42, 0x6f, 0x78, 0x3c, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3e, 0x20, 0x7d, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0a, + 0x01, 0x12, 0x04, 0x9d, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0a, 0x02, + 0x12, 0x04, 0x9d, 0x03, 0x16, 0x17, 0x0a, 0x22, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0b, 0x12, 0x04, + 0x9e, 0x03, 0x02, 0x18, 0x22, 0x14, 0x20, 0x60, 0x28, 0x4d, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x54, 0x61, 0x67, 0x29, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, + 0x02, 0x0b, 0x01, 0x12, 0x04, 0x9e, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, + 0x0b, 0x02, 0x12, 0x04, 0x9e, 0x03, 0x16, 0x17, 0x0a, 0x22, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0c, + 0x12, 0x04, 0x9f, 0x03, 0x02, 0x24, 0x22, 0x14, 0x20, 0x60, 0x7b, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x3a, 0x20, 0x75, 0x31, 0x36, 0x20, 0x7d, 0x60, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x05, 0x00, 0x02, 0x0c, 0x01, 0x12, 0x04, 0x9f, 0x03, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, + 0x00, 0x02, 0x0c, 0x02, 0x12, 0x04, 0x9f, 0x03, 0x22, 0x23, 0x0a, 0x37, 0x0a, 0x04, 0x05, 0x00, + 0x02, 0x0d, 0x12, 0x04, 0xa0, 0x03, 0x02, 0x1c, 0x22, 0x29, 0x20, 0x60, 0x7b, 0x20, 0x6d, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x3a, + 0x20, 0x42, 0x6f, 0x78, 0x3c, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3e, 0x20, 0x7d, + 0x60, 0x2c, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0d, 0x01, 0x12, 0x04, 0xa0, 0x03, + 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0d, 0x02, 0x12, 0x04, 0xa0, 0x03, 0x19, + 0x1b, 0x0a, 0x1b, 0x0a, 0x04, 0x05, 0x00, 0x02, 0x0e, 0x12, 0x04, 0xa1, 0x03, 0x02, 0x1d, 0x22, + 0x0d, 0x20, 0x60, 0x28, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x60, 0x2c, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x05, 0x00, 0x02, 0x0e, 0x01, 0x12, 0x04, 0xa1, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, + 0x05, 0x05, 0x00, 0x02, 0x0e, 0x02, 0x12, 0x04, 0xa1, 0x03, 0x1a, 0x1c, 0x0a, 0x0c, 0x0a, 0x02, + 0x04, 0x26, 0x12, 0x06, 0xa4, 0x03, 0x00, 0xb2, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x26, + 0x01, 0x12, 0x04, 0xa4, 0x03, 0x08, 0x10, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x26, 0x03, 0x00, 0x12, + 0x06, 0xa5, 0x03, 0x02, 0xa8, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x03, 0x00, 0x01, + 0x12, 0x04, 0xa5, 0x03, 0x0a, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, + 0x12, 0x04, 0xa6, 0x03, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xa6, 0x03, 0x04, 0x08, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xa6, 0x03, 0x09, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, 0x00, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xa6, 0x03, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x26, 0x03, + 0x00, 0x02, 0x01, 0x12, 0x04, 0xa7, 0x03, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, 0x03, + 0x00, 0x02, 0x01, 0x06, 0x12, 0x04, 0xa7, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x26, + 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xa7, 0x03, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x26, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0xa7, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x26, 0x02, 0x00, 0x12, 0x04, 0xaa, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, + 0x02, 0x00, 0x06, 0x12, 0x04, 0xaa, 0x03, 0x02, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xaa, 0x03, 0x0c, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xaa, 0x03, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x26, 0x08, 0x00, 0x12, + 0x06, 0xab, 0x03, 0x02, 0xb1, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x08, 0x00, 0x01, + 0x12, 0x04, 0xab, 0x03, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x01, 0x12, 0x04, + 0xac, 0x03, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x06, 0x12, 0x04, 0xac, + 0x03, 0x04, 0x0c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x01, 0x12, 0x04, 0xac, 0x03, + 0x0d, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x01, 0x03, 0x12, 0x04, 0xac, 0x03, 0x16, + 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x02, 0x12, 0x04, 0xad, 0x03, 0x04, 0x1d, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x02, 0x06, 0x12, 0x04, 0xad, 0x03, 0x04, 0x11, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x26, 0x02, 0x02, 0x01, 0x12, 0x04, 0xad, 0x03, 0x12, 0x18, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x26, 0x02, 0x02, 0x03, 0x12, 0x04, 0xad, 0x03, 0x1b, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x26, 0x02, 0x03, 0x12, 0x04, 0xae, 0x03, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, + 0x02, 0x03, 0x05, 0x12, 0x04, 0xae, 0x03, 0x04, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, + 0x03, 0x01, 0x12, 0x04, 0xae, 0x03, 0x0b, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xae, 0x03, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x04, 0x12, + 0x04, 0xaf, 0x03, 0x04, 0x20, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x06, 0x12, 0x04, + 0xaf, 0x03, 0x04, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x01, 0x12, 0x04, 0xaf, + 0x03, 0x12, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x04, 0x03, 0x12, 0x04, 0xaf, 0x03, + 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x26, 0x02, 0x05, 0x12, 0x04, 0xb0, 0x03, 0x04, 0x1a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x05, 0x05, 0x12, 0x04, 0xb0, 0x03, 0x04, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x26, 0x02, 0x05, 0x01, 0x12, 0x04, 0xb0, 0x03, 0x0b, 0x15, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x26, 0x02, 0x05, 0x03, 0x12, 0x04, 0xb0, 0x03, 0x18, 0x19, 0x0a, 0x0c, 0x0a, + 0x02, 0x05, 0x01, 0x12, 0x06, 0xb4, 0x03, 0x00, 0xba, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x05, + 0x01, 0x01, 0x12, 0x04, 0xb4, 0x03, 0x05, 0x10, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x00, + 0x12, 0x04, 0xb5, 0x03, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xb5, 0x03, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x00, 0x02, 0x12, 0x04, + 0xb5, 0x03, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x01, 0x12, 0x04, 0xb6, 0x03, + 0x02, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb6, 0x03, 0x02, + 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x01, 0x02, 0x12, 0x04, 0xb6, 0x03, 0x16, 0x17, + 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x02, 0x12, 0x04, 0xb7, 0x03, 0x02, 0x18, 0x0a, 0x0d, + 0x0a, 0x05, 0x05, 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb7, 0x03, 0x02, 0x13, 0x0a, 0x0d, 0x0a, + 0x05, 0x05, 0x01, 0x02, 0x02, 0x02, 0x12, 0x04, 0xb7, 0x03, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, + 0x05, 0x01, 0x02, 0x03, 0x12, 0x04, 0xb8, 0x03, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, + 0x02, 0x03, 0x01, 0x12, 0x04, 0xb8, 0x03, 0x02, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, + 0x03, 0x02, 0x12, 0x04, 0xb8, 0x03, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x05, 0x01, 0x02, 0x04, + 0x12, 0x04, 0xb9, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x04, 0x01, 0x12, + 0x04, 0xb9, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x05, 0x01, 0x02, 0x04, 0x02, 0x12, 0x04, + 0xb9, 0x03, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x27, 0x12, 0x06, 0xbc, 0x03, 0x00, 0xbe, + 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x27, 0x01, 0x12, 0x04, 0xbc, 0x03, 0x08, 0x17, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x27, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x03, 0x02, 0x19, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x27, 0x02, 0x00, 0x06, 0x12, 0x04, 0xbd, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x27, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x03, 0x0b, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x27, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbd, 0x03, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x28, + 0x12, 0x06, 0xc0, 0x03, 0x00, 0xc3, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x28, 0x01, 0x12, + 0x04, 0xc0, 0x03, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x28, 0x02, 0x00, 0x12, 0x04, 0xc1, + 0x03, 0x02, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc1, 0x03, + 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc1, 0x03, 0x0f, + 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x28, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc1, 0x03, 0x18, 0x19, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x28, 0x02, 0x01, 0x12, 0x04, 0xc2, 0x03, 0x02, 0x12, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x28, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc2, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x28, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc2, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x28, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc2, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, 0x04, + 0x29, 0x12, 0x06, 0xc5, 0x03, 0x00, 0xc8, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x29, 0x01, + 0x12, 0x04, 0xc5, 0x03, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x29, 0x02, 0x00, 0x12, 0x04, + 0xc6, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc6, + 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc6, 0x03, + 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc6, 0x03, 0x13, + 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x29, 0x02, 0x01, 0x12, 0x04, 0xc7, 0x03, 0x02, 0x12, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x29, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc7, 0x03, 0x02, 0x08, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x29, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc7, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x29, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc7, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x02, + 0x04, 0x2a, 0x12, 0x06, 0xca, 0x03, 0x00, 0xcf, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2a, + 0x01, 0x12, 0x04, 0xca, 0x03, 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x00, 0x12, + 0x04, 0xcb, 0x03, 0x02, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xcb, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcb, + 0x03, 0x09, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcb, 0x03, + 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x01, 0x12, 0x04, 0xcc, 0x03, 0x02, 0x14, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x01, 0x05, 0x12, 0x04, 0xcc, 0x03, 0x02, 0x08, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcc, 0x03, 0x09, 0x0f, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xcc, 0x03, 0x12, 0x13, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x2a, 0x02, 0x02, 0x12, 0x04, 0xcd, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x2a, 0x02, 0x02, 0x05, 0x12, 0x04, 0xcd, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, + 0x02, 0x02, 0x01, 0x12, 0x04, 0xcd, 0x03, 0x09, 0x0d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, + 0x02, 0x03, 0x12, 0x04, 0xcd, 0x03, 0x10, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2a, 0x02, 0x03, + 0x12, 0x04, 0xce, 0x03, 0x02, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x04, 0x12, + 0x04, 0xce, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x06, 0x12, 0x04, + 0xce, 0x03, 0x0b, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xce, + 0x03, 0x14, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xce, 0x03, + 0x2a, 0x2b, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2b, 0x12, 0x06, 0xd1, 0x03, 0x00, 0xe5, 0x03, 0x01, + 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2b, 0x01, 0x12, 0x04, 0xd1, 0x03, 0x08, 0x11, 0x0a, 0x0e, 0x0a, + 0x04, 0x04, 0x2b, 0x04, 0x00, 0x12, 0x06, 0xd2, 0x03, 0x02, 0xda, 0x03, 0x03, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2b, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x03, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x2b, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd3, 0x03, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x2b, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd3, 0x03, 0x04, 0x14, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd3, 0x03, 0x17, 0x18, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd4, 0x03, 0x04, 0x15, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd4, 0x03, 0x04, 0x10, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd4, 0x03, 0x13, 0x14, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xd5, 0x03, 0x04, 0x1b, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd5, 0x03, 0x04, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xd5, 0x03, + 0x19, 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xd6, 0x03, + 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0xd6, + 0x03, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, + 0xd6, 0x03, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, + 0xd7, 0x03, 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, + 0x04, 0xd7, 0x03, 0x04, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x04, 0x02, + 0x12, 0x04, 0xd7, 0x03, 0x15, 0x16, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x05, + 0x12, 0x04, 0xd8, 0x03, 0x04, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, 0x05, + 0x01, 0x12, 0x04, 0xd8, 0x03, 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x02, + 0x05, 0x02, 0x12, 0x04, 0xd8, 0x03, 0x19, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x04, 0x00, + 0x04, 0x12, 0x04, 0xd9, 0x03, 0x04, 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x2b, 0x04, 0x00, 0x04, + 0x00, 0x12, 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, 0x04, + 0x00, 0x01, 0x12, 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x2b, 0x04, 0x00, + 0x04, 0x00, 0x02, 0x12, 0x04, 0xd9, 0x03, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, + 0x00, 0x12, 0x04, 0xdc, 0x03, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x06, + 0x12, 0x04, 0xdc, 0x03, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xdc, 0x03, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xdc, 0x03, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x2b, 0x08, 0x00, 0x12, 0x06, 0xdd, 0x03, + 0x02, 0xe4, 0x03, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x08, 0x00, 0x01, 0x12, 0x04, 0xdd, + 0x03, 0x08, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x01, 0x12, 0x04, 0xde, 0x03, 0x04, + 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xde, 0x03, 0x04, 0x14, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x03, 0x15, 0x1c, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xde, 0x03, 0x1f, 0x20, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x02, 0x12, 0x04, 0xdf, 0x03, 0x04, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x2b, 0x02, 0x02, 0x06, 0x12, 0x04, 0xdf, 0x03, 0x04, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x2b, 0x02, 0x02, 0x01, 0x12, 0x04, 0xdf, 0x03, 0x1a, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, + 0x02, 0x02, 0x03, 0x12, 0x04, 0xdf, 0x03, 0x2a, 0x2b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, + 0x03, 0x12, 0x04, 0xe0, 0x03, 0x04, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x06, + 0x12, 0x04, 0xe0, 0x03, 0x04, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xe0, 0x03, 0x18, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x03, 0x03, 0x12, 0x04, + 0xe0, 0x03, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x04, 0x12, 0x04, 0xe1, 0x03, + 0x04, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x06, 0x12, 0x04, 0xe1, 0x03, 0x04, + 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe1, 0x03, 0x16, 0x1f, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe1, 0x03, 0x22, 0x23, 0x0a, + 0x1e, 0x0a, 0x04, 0x04, 0x2b, 0x02, 0x05, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x23, 0x1a, 0x10, 0x20, + 0x36, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x10, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2b, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe3, 0x03, 0x11, 0x1e, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2b, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe3, 0x03, 0x21, 0x22, 0x0a, 0x0c, 0x0a, 0x02, + 0x04, 0x2c, 0x12, 0x06, 0xe7, 0x03, 0x00, 0xea, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2c, + 0x01, 0x12, 0x04, 0xe7, 0x03, 0x08, 0x18, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2c, 0x02, 0x00, 0x12, + 0x04, 0xe8, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xe8, 0x03, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe8, + 0x03, 0x08, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe8, 0x03, + 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2c, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x03, 0x02, 0x16, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe9, 0x03, 0x02, 0x07, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, 0x03, 0x08, 0x11, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe9, 0x03, 0x14, 0x15, 0x0a, 0x0c, 0x0a, + 0x02, 0x04, 0x2d, 0x12, 0x06, 0xec, 0x03, 0x00, 0xf1, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, + 0x2d, 0x01, 0x12, 0x04, 0xec, 0x03, 0x08, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x00, + 0x12, 0x04, 0xed, 0x03, 0x02, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x04, 0x12, + 0x04, 0xed, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xed, 0x03, 0x0b, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xed, + 0x03, 0x11, 0x1c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xed, 0x03, + 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x01, 0x12, 0x04, 0xee, 0x03, 0x02, 0x20, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x01, 0x04, 0x12, 0x04, 0xee, 0x03, 0x02, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xee, 0x03, 0x0b, 0x10, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xee, 0x03, 0x11, 0x1b, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xee, 0x03, 0x1e, 0x1f, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x2d, 0x02, 0x02, 0x12, 0x04, 0xef, 0x03, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, + 0x02, 0x02, 0x05, 0x12, 0x04, 0xef, 0x03, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, + 0x02, 0x01, 0x12, 0x04, 0xef, 0x03, 0x09, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xef, 0x03, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2d, 0x02, 0x03, 0x12, + 0x04, 0xf0, 0x03, 0x02, 0x29, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x04, 0x12, 0x04, + 0xf0, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x05, 0x12, 0x04, 0xf0, + 0x03, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x01, 0x12, 0x04, 0xf0, 0x03, + 0x12, 0x24, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2d, 0x02, 0x03, 0x03, 0x12, 0x04, 0xf0, 0x03, 0x27, + 0x28, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x2e, 0x12, 0x06, 0xf3, 0x03, 0x00, 0xf7, 0x03, 0x01, 0x0a, + 0x0b, 0x0a, 0x03, 0x04, 0x2e, 0x01, 0x12, 0x04, 0xf3, 0x03, 0x08, 0x1b, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x2e, 0x02, 0x00, 0x12, 0x04, 0xf4, 0x03, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, + 0x02, 0x00, 0x06, 0x12, 0x04, 0xf4, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xf4, 0x03, 0x13, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xf4, 0x03, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2e, 0x02, 0x01, 0x12, + 0x04, 0xf5, 0x03, 0x02, 0x31, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xf5, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf5, + 0x03, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf5, 0x03, + 0x12, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf5, 0x03, 0x2f, + 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2e, 0x02, 0x02, 0x12, 0x04, 0xf6, 0x03, 0x02, 0x32, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x02, 0x04, 0x12, 0x04, 0xf6, 0x03, 0x02, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2e, 0x02, 0x02, 0x06, 0x12, 0x04, 0xf6, 0x03, 0x0b, 0x1b, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2e, 0x02, 0x02, 0x01, 0x12, 0x04, 0xf6, 0x03, 0x1c, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x2e, 0x02, 0x02, 0x03, 0x12, 0x04, 0xf6, 0x03, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x02, 0x04, + 0x2f, 0x12, 0x06, 0xf9, 0x03, 0x00, 0xff, 0x03, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x2f, 0x01, + 0x12, 0x04, 0xf9, 0x03, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x00, 0x12, 0x04, + 0xfa, 0x03, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x06, 0x12, 0x04, 0xfa, + 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfa, 0x03, + 0x13, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x00, 0x03, 0x12, 0x04, 0xfa, 0x03, 0x1c, + 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x01, 0x12, 0x04, 0xfb, 0x03, 0x02, 0x31, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x01, 0x04, 0x12, 0x04, 0xfb, 0x03, 0x02, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x01, 0x05, 0x12, 0x04, 0xfb, 0x03, 0x0b, 0x11, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2f, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfb, 0x03, 0x12, 0x2c, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x2f, 0x02, 0x01, 0x03, 0x12, 0x04, 0xfb, 0x03, 0x2f, 0x30, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x2f, 0x02, 0x02, 0x12, 0x04, 0xfc, 0x03, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, + 0x02, 0x04, 0x12, 0x04, 0xfc, 0x03, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, + 0x06, 0x12, 0x04, 0xfc, 0x03, 0x0b, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xfc, 0x03, 0x1c, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xfc, 0x03, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x03, 0x12, 0x04, 0xfd, + 0x03, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x05, 0x12, 0x04, 0xfd, 0x03, + 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x01, 0x12, 0x04, 0xfd, 0x03, 0x09, + 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x03, 0x03, 0x12, 0x04, 0xfd, 0x03, 0x1d, 0x1e, + 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x2f, 0x02, 0x04, 0x12, 0x04, 0xfe, 0x03, 0x02, 0x28, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x2f, 0x02, 0x04, 0x06, 0x12, 0x04, 0xfe, 0x03, 0x02, 0x12, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x2f, 0x02, 0x04, 0x01, 0x12, 0x04, 0xfe, 0x03, 0x13, 0x23, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x2f, 0x02, 0x04, 0x03, 0x12, 0x04, 0xfe, 0x03, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x02, 0x04, + 0x30, 0x12, 0x06, 0x81, 0x04, 0x00, 0x8d, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x30, 0x01, + 0x12, 0x04, 0x81, 0x04, 0x08, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x30, 0x04, 0x00, 0x12, 0x06, + 0x82, 0x04, 0x02, 0x89, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x04, 0x00, 0x01, 0x12, + 0x04, 0x82, 0x04, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, 0x12, + 0x04, 0x83, 0x04, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x12, 0x04, 0x83, 0x04, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x00, + 0x02, 0x12, 0x04, 0x83, 0x04, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, + 0x01, 0x12, 0x04, 0x84, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, + 0x01, 0x01, 0x12, 0x04, 0x84, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, + 0x02, 0x01, 0x02, 0x12, 0x04, 0x84, 0x04, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, + 0x00, 0x02, 0x02, 0x12, 0x04, 0x85, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, + 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0x85, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, + 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0x85, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x30, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0x86, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x30, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0x86, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x30, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0x86, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x04, 0x12, 0x04, 0x87, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x87, 0x04, 0x04, 0x10, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x87, 0x04, 0x13, 0x14, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x12, 0x04, 0x88, 0x04, 0x04, 0x1f, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x01, 0x12, 0x04, 0x88, 0x04, 0x04, 0x1a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x30, 0x04, 0x00, 0x02, 0x05, 0x02, 0x12, 0x04, 0x88, 0x04, 0x1d, + 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x30, 0x02, 0x00, 0x12, 0x04, 0x8b, 0x04, 0x02, 0x10, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, 0x00, 0x06, 0x12, 0x04, 0x8b, 0x04, 0x02, 0x06, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x30, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8b, 0x04, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x30, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8b, 0x04, 0x0e, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x30, 0x02, 0x01, 0x12, 0x04, 0x8c, 0x04, 0x02, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, + 0x02, 0x01, 0x05, 0x12, 0x04, 0x8c, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, + 0x01, 0x01, 0x12, 0x04, 0x8c, 0x04, 0x08, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x30, 0x02, 0x01, + 0x03, 0x12, 0x04, 0x8c, 0x04, 0x15, 0x16, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x31, 0x12, 0x06, 0x8f, + 0x04, 0x00, 0xa5, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x31, 0x01, 0x12, 0x04, 0x8f, 0x04, + 0x08, 0x14, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x31, 0x04, 0x00, 0x12, 0x06, 0x90, 0x04, 0x02, 0x96, + 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x04, 0x00, 0x01, 0x12, 0x04, 0x90, 0x04, 0x07, + 0x0b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x91, 0x04, 0x04, + 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x91, 0x04, + 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0x91, + 0x04, 0x17, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x92, + 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x92, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, + 0x04, 0x92, 0x04, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, 0x12, + 0x04, 0x93, 0x04, 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, 0x01, + 0x12, 0x04, 0x93, 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, 0x02, + 0x02, 0x12, 0x04, 0x93, 0x04, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, 0x00, 0x02, + 0x03, 0x12, 0x04, 0x94, 0x04, 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, 0x02, + 0x03, 0x01, 0x12, 0x04, 0x94, 0x04, 0x04, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, 0x00, + 0x02, 0x03, 0x02, 0x12, 0x04, 0x94, 0x04, 0x14, 0x15, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x04, + 0x00, 0x02, 0x04, 0x12, 0x04, 0x95, 0x04, 0x04, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, 0x04, + 0x00, 0x02, 0x04, 0x01, 0x12, 0x04, 0x95, 0x04, 0x04, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x31, + 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x04, 0x95, 0x04, 0x13, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x31, 0x02, 0x00, 0x12, 0x04, 0x98, 0x04, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, + 0x00, 0x06, 0x12, 0x04, 0x98, 0x04, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x00, + 0x01, 0x12, 0x04, 0x98, 0x04, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x00, 0x03, + 0x12, 0x04, 0x98, 0x04, 0x0e, 0x0f, 0x0a, 0x64, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x01, 0x12, 0x04, + 0x9c, 0x04, 0x02, 0x2a, 0x1a, 0x56, 0x20, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x2e, 0x0a, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x3a, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x2e, 0x31, 0x30, + 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x69, 0x73, 0x20, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x31, 0x02, 0x01, 0x05, 0x12, 0x04, 0x9c, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x31, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9c, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, + 0x02, 0x01, 0x03, 0x12, 0x04, 0x9c, 0x04, 0x14, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, + 0x01, 0x08, 0x12, 0x04, 0x9c, 0x04, 0x16, 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x31, 0x02, 0x01, + 0x08, 0x03, 0x12, 0x04, 0x9c, 0x04, 0x17, 0x28, 0x0a, 0x23, 0x0a, 0x04, 0x04, 0x31, 0x08, 0x00, + 0x12, 0x06, 0x9f, 0x04, 0x02, 0xa4, 0x04, 0x03, 0x1a, 0x13, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x3a, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x2e, 0x31, 0x30, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x31, 0x08, 0x00, 0x01, 0x12, 0x04, 0x9f, 0x04, 0x08, 0x19, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x31, 0x02, 0x02, 0x12, 0x04, 0xa0, 0x04, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, + 0x02, 0x02, 0x06, 0x12, 0x04, 0xa0, 0x04, 0x04, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, + 0x02, 0x01, 0x12, 0x04, 0xa0, 0x04, 0x0c, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xa0, 0x04, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x03, 0x12, + 0x04, 0xa1, 0x04, 0x04, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x06, 0x12, 0x04, + 0xa1, 0x04, 0x04, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x01, 0x12, 0x04, 0xa1, + 0x04, 0x13, 0x22, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x03, 0x03, 0x12, 0x04, 0xa1, 0x04, + 0x25, 0x26, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x31, 0x02, 0x04, 0x12, 0x04, 0xa2, 0x04, 0x04, 0x1a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x04, 0x06, 0x12, 0x04, 0xa2, 0x04, 0x04, 0x0c, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, 0x04, 0x01, 0x12, 0x04, 0xa2, 0x04, 0x0d, 0x15, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x31, 0x02, 0x04, 0x03, 0x12, 0x04, 0xa2, 0x04, 0x18, 0x19, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x31, 0x02, 0x05, 0x12, 0x04, 0xa3, 0x04, 0x04, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x31, 0x02, 0x05, 0x06, 0x12, 0x04, 0xa3, 0x04, 0x04, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, + 0x02, 0x05, 0x01, 0x12, 0x04, 0xa3, 0x04, 0x0c, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x31, 0x02, + 0x05, 0x03, 0x12, 0x04, 0xa3, 0x04, 0x16, 0x17, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x32, 0x12, 0x06, + 0xa7, 0x04, 0x00, 0xa9, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x32, 0x01, 0x12, 0x04, 0xa7, + 0x04, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x32, 0x02, 0x00, 0x12, 0x04, 0xa8, 0x04, 0x02, + 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x32, 0x02, 0x00, 0x05, 0x12, 0x04, 0xa8, 0x04, 0x02, 0x07, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x32, 0x02, 0x00, 0x01, 0x12, 0x04, 0xa8, 0x04, 0x08, 0x11, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x32, 0x02, 0x00, 0x03, 0x12, 0x04, 0xa8, 0x04, 0x14, 0x15, 0x0a, 0x0c, + 0x0a, 0x02, 0x04, 0x33, 0x12, 0x06, 0xab, 0x04, 0x00, 0xad, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, + 0x04, 0x33, 0x01, 0x12, 0x04, 0xab, 0x04, 0x08, 0x16, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x33, 0x02, + 0x00, 0x12, 0x04, 0xac, 0x04, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xac, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xac, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x33, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xac, 0x04, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x34, 0x12, 0x06, 0xaf, 0x04, 0x00, 0xb1, + 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x34, 0x01, 0x12, 0x04, 0xaf, 0x04, 0x08, 0x10, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x34, 0x02, 0x00, 0x12, 0x04, 0xb0, 0x04, 0x02, 0x16, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x34, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb0, 0x04, 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x34, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb0, 0x04, 0x08, 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x34, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb0, 0x04, 0x14, 0x15, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x35, + 0x12, 0x06, 0xb3, 0x04, 0x00, 0xb5, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x35, 0x01, 0x12, + 0x04, 0xb3, 0x04, 0x08, 0x0f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x35, 0x02, 0x00, 0x12, 0x04, 0xb4, + 0x04, 0x02, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb4, 0x04, + 0x02, 0x07, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb4, 0x04, 0x08, + 0x11, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x35, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb4, 0x04, 0x14, 0x15, + 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x36, 0x12, 0x06, 0xb7, 0x04, 0x00, 0xba, 0x04, 0x01, 0x0a, 0x0b, + 0x0a, 0x03, 0x04, 0x36, 0x01, 0x12, 0x04, 0xb7, 0x04, 0x08, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, + 0x36, 0x02, 0x00, 0x12, 0x04, 0xb8, 0x04, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, + 0x00, 0x06, 0x12, 0x04, 0xb8, 0x04, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xb8, 0x04, 0x0f, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xb8, 0x04, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x36, 0x02, 0x01, 0x12, 0x04, + 0xb9, 0x04, 0x02, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x06, 0x12, 0x04, 0xb9, + 0x04, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb9, 0x04, + 0x0f, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x36, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb9, 0x04, 0x1b, + 0x1c, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x37, 0x12, 0x06, 0xbc, 0x04, 0x00, 0xbf, 0x04, 0x01, 0x0a, + 0x0b, 0x0a, 0x03, 0x04, 0x37, 0x01, 0x12, 0x04, 0xbc, 0x04, 0x08, 0x18, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x37, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x04, 0x02, 0x13, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, + 0x02, 0x00, 0x05, 0x12, 0x04, 0xbd, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xbd, 0x04, 0x09, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xbd, 0x04, 0x11, 0x12, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x37, 0x02, 0x01, 0x12, + 0x04, 0xbe, 0x04, 0x02, 0x1d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x06, 0x12, 0x04, + 0xbe, 0x04, 0x02, 0x0e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x01, 0x12, 0x04, 0xbe, + 0x04, 0x0f, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x37, 0x02, 0x01, 0x03, 0x12, 0x04, 0xbe, 0x04, + 0x1b, 0x1c, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x38, 0x12, 0x06, 0xc1, 0x04, 0x00, 0xc5, 0x04, 0x01, + 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x38, 0x01, 0x12, 0x04, 0xc1, 0x04, 0x08, 0x19, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x38, 0x02, 0x00, 0x12, 0x04, 0xc2, 0x04, 0x02, 0x28, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x38, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc2, 0x04, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, + 0x02, 0x00, 0x06, 0x12, 0x04, 0xc2, 0x04, 0x0b, 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xc2, 0x04, 0x18, 0x23, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xc2, 0x04, 0x26, 0x27, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x38, 0x02, 0x01, 0x12, + 0x04, 0xc3, 0x04, 0x02, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xc3, 0x04, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x06, 0x12, 0x04, 0xc3, + 0x04, 0x0b, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc3, 0x04, + 0x1c, 0x26, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc3, 0x04, 0x29, + 0x2a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x38, 0x02, 0x02, 0x12, 0x04, 0xc4, 0x04, 0x02, 0x21, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x38, 0x02, 0x02, 0x05, 0x12, 0x04, 0xc4, 0x04, 0x02, 0x08, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x38, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc4, 0x04, 0x09, 0x1c, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x38, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc4, 0x04, 0x1f, 0x20, 0x0a, 0x0c, 0x0a, 0x02, + 0x04, 0x39, 0x12, 0x06, 0xc7, 0x04, 0x00, 0xca, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x39, + 0x01, 0x12, 0x04, 0xc7, 0x04, 0x08, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x39, 0x02, 0x00, 0x12, + 0x04, 0xc8, 0x04, 0x02, 0x1b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xc8, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc8, + 0x04, 0x09, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc8, 0x04, + 0x19, 0x1a, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x39, 0x02, 0x01, 0x12, 0x04, 0xc9, 0x04, 0x02, 0x16, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc9, 0x04, 0x02, 0x07, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x39, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc9, 0x04, 0x08, 0x11, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x39, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc9, 0x04, 0x14, 0x15, 0x0a, 0x0c, 0x0a, + 0x02, 0x04, 0x3a, 0x12, 0x06, 0xcc, 0x04, 0x00, 0xce, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, + 0x3a, 0x01, 0x12, 0x04, 0xcc, 0x04, 0x08, 0x14, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3a, 0x02, 0x00, + 0x12, 0x04, 0xcd, 0x04, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x06, 0x12, + 0x04, 0xcd, 0x04, 0x02, 0x12, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x01, 0x12, 0x04, + 0xcd, 0x04, 0x13, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcd, + 0x04, 0x1c, 0x1d, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3b, 0x12, 0x06, 0xd0, 0x04, 0x00, 0xe5, 0x04, + 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x3b, 0x01, 0x12, 0x04, 0xd0, 0x04, 0x08, 0x18, 0x0a, 0x0e, + 0x0a, 0x04, 0x04, 0x3b, 0x04, 0x00, 0x12, 0x06, 0xd1, 0x04, 0x02, 0xda, 0x04, 0x03, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x3b, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd1, 0x04, 0x07, 0x0b, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd2, 0x04, 0x04, 0x19, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x04, 0x04, 0x14, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd2, 0x04, 0x17, 0x18, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd3, 0x04, 0x04, 0x15, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd3, 0x04, 0x04, 0x10, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd3, 0x04, 0x13, + 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0xd4, 0x04, 0x04, + 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd4, 0x04, + 0x04, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xd4, + 0x04, 0x19, 0x1a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x03, 0x12, 0x04, 0xd5, + 0x04, 0x04, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, + 0xd5, 0x04, 0x04, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, + 0x04, 0xd5, 0x04, 0x16, 0x17, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x04, 0x12, + 0x04, 0xd6, 0x04, 0x04, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x04, 0x01, + 0x12, 0x04, 0xd6, 0x04, 0x04, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, 0x04, + 0x02, 0x12, 0x04, 0xd6, 0x04, 0x15, 0x16, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, 0x02, + 0x05, 0x12, 0x04, 0xd7, 0x04, 0x04, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, 0x02, + 0x05, 0x01, 0x12, 0x04, 0xd7, 0x04, 0x04, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, + 0x02, 0x05, 0x02, 0x12, 0x04, 0xd7, 0x04, 0x17, 0x18, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x04, + 0x00, 0x04, 0x12, 0x04, 0xd9, 0x04, 0x04, 0x0f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x3b, 0x04, 0x00, + 0x04, 0x00, 0x12, 0x04, 0xd9, 0x04, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, 0x00, + 0x04, 0x00, 0x01, 0x12, 0x04, 0xd9, 0x04, 0x0d, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x3b, 0x04, + 0x00, 0x04, 0x00, 0x02, 0x12, 0x04, 0xd9, 0x04, 0x0d, 0x0e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, + 0x02, 0x00, 0x12, 0x04, 0xdc, 0x04, 0x02, 0x10, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, + 0x06, 0x12, 0x04, 0xdc, 0x04, 0x02, 0x06, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xdc, 0x04, 0x07, 0x0b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x00, 0x03, 0x12, + 0x04, 0xdc, 0x04, 0x0e, 0x0f, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x3b, 0x08, 0x00, 0x12, 0x06, 0xdd, + 0x04, 0x02, 0xe4, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x08, 0x00, 0x01, 0x12, 0x04, + 0xdd, 0x04, 0x08, 0x11, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x01, 0x12, 0x04, 0xde, 0x04, + 0x04, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x06, 0x12, 0x04, 0xde, 0x04, 0x04, + 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x04, 0x15, 0x1c, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x01, 0x03, 0x12, 0x04, 0xde, 0x04, 0x1f, 0x20, 0x0a, + 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x02, 0x12, 0x04, 0xdf, 0x04, 0x04, 0x2c, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x3b, 0x02, 0x02, 0x06, 0x12, 0x04, 0xdf, 0x04, 0x04, 0x19, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x3b, 0x02, 0x02, 0x01, 0x12, 0x04, 0xdf, 0x04, 0x1a, 0x27, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x3b, 0x02, 0x02, 0x03, 0x12, 0x04, 0xdf, 0x04, 0x2a, 0x2b, 0x0a, 0x1e, 0x0a, 0x04, 0x04, 0x3b, + 0x02, 0x03, 0x12, 0x04, 0xe1, 0x04, 0x04, 0x30, 0x1a, 0x10, 0x20, 0x34, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, + 0x02, 0x03, 0x06, 0x12, 0x04, 0xe1, 0x04, 0x04, 0x16, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, + 0x03, 0x01, 0x12, 0x04, 0xe1, 0x04, 0x17, 0x2b, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x03, + 0x03, 0x12, 0x04, 0xe1, 0x04, 0x2e, 0x2f, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x04, 0x12, + 0x04, 0xe2, 0x04, 0x04, 0x2e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x04, 0x06, 0x12, 0x04, + 0xe2, 0x04, 0x04, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe2, + 0x04, 0x16, 0x29, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe2, 0x04, + 0x2c, 0x2d, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3b, 0x02, 0x05, 0x12, 0x04, 0xe3, 0x04, 0x04, 0x29, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe3, 0x04, 0x04, 0x18, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe3, 0x04, 0x19, 0x24, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x3b, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe3, 0x04, 0x27, 0x28, 0x0a, 0x0c, 0x0a, + 0x02, 0x04, 0x3c, 0x12, 0x06, 0xe7, 0x04, 0x00, 0xeb, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, + 0x3c, 0x01, 0x12, 0x04, 0xe7, 0x04, 0x08, 0x1b, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3c, 0x02, 0x00, + 0x12, 0x04, 0xe8, 0x04, 0x02, 0x1f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xe8, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x01, 0x12, 0x04, + 0xe8, 0x04, 0x09, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe8, + 0x04, 0x1d, 0x1e, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3c, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x04, 0x02, + 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe9, 0x04, 0x02, 0x0a, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe9, 0x04, 0x0b, 0x18, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, 0x04, 0x19, 0x28, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe9, 0x04, 0x2b, 0x2c, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x3c, 0x02, 0x02, 0x12, 0x04, 0xea, 0x04, 0x02, 0x32, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x3c, 0x02, 0x02, 0x04, 0x12, 0x04, 0xea, 0x04, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, + 0x02, 0x02, 0x06, 0x12, 0x04, 0xea, 0x04, 0x0b, 0x1a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, + 0x02, 0x01, 0x12, 0x04, 0xea, 0x04, 0x1b, 0x2d, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3c, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xea, 0x04, 0x30, 0x31, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3d, 0x12, 0x06, 0xed, + 0x04, 0x00, 0xf0, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x3d, 0x01, 0x12, 0x04, 0xed, 0x04, + 0x08, 0x15, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3d, 0x02, 0x00, 0x12, 0x04, 0xee, 0x04, 0x02, 0x1c, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x05, 0x12, 0x04, 0xee, 0x04, 0x02, 0x08, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xee, 0x04, 0x09, 0x17, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x3d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xee, 0x04, 0x1a, 0x1b, 0x0a, 0x0c, 0x0a, + 0x04, 0x04, 0x3d, 0x02, 0x01, 0x12, 0x04, 0xef, 0x04, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x3d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xef, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, + 0x02, 0x01, 0x01, 0x12, 0x04, 0xef, 0x04, 0x09, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3d, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xef, 0x04, 0x17, 0x18, 0x0a, 0x0c, 0x0a, 0x02, 0x04, 0x3e, 0x12, 0x06, + 0xf2, 0x04, 0x00, 0xf5, 0x04, 0x01, 0x0a, 0x0b, 0x0a, 0x03, 0x04, 0x3e, 0x01, 0x12, 0x04, 0xf2, + 0x04, 0x08, 0x17, 0x0a, 0x0c, 0x0a, 0x04, 0x04, 0x3e, 0x02, 0x00, 0x12, 0x04, 0xf3, 0x04, 0x02, + 0x17, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf3, 0x04, 0x02, 0x08, + 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf3, 0x04, 0x09, 0x12, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x3e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf3, 0x04, 0x15, 0x16, 0x0a, 0x0c, + 0x0a, 0x04, 0x04, 0x3e, 0x02, 0x01, 0x12, 0x04, 0xf4, 0x04, 0x02, 0x19, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x3e, 0x02, 0x01, 0x05, 0x12, 0x04, 0xf4, 0x04, 0x02, 0x08, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x3e, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf4, 0x04, 0x09, 0x14, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x3e, + 0x02, 0x01, 0x03, 0x12, 0x04, 0xf4, 0x04, 0x17, 0x18, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, ]; include!("aptos.transaction.v1.serde.rs"); diff --git a/protos/rust/src/pb/aptos.transaction.v1.serde.rs b/protos/rust/src/pb/aptos.transaction.v1.serde.rs index 8465f85af84db..bf9261c30a9d3 100644 --- a/protos/rust/src/pb/aptos.transaction.v1.serde.rs +++ b/protos/rust/src/pb/aptos.transaction.v1.serde.rs @@ -2,6 +2,117 @@ // SPDX-License-Identifier: Apache-2.0 // @generated +impl serde::Serialize for AbstractionSignature { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.function_info.is_empty() { + len += 1; + } + if !self.signature.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("aptos.transaction.v1.AbstractionSignature", len)?; + if !self.function_info.is_empty() { + struct_ser.serialize_field("functionInfo", &self.function_info)?; + } + if !self.signature.is_empty() { + struct_ser.serialize_field("signature", pbjson::private::base64::encode(&self.signature).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AbstractionSignature { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "function_info", + "functionInfo", + "signature", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + FunctionInfo, + Signature, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "functionInfo" | "function_info" => Ok(GeneratedField::FunctionInfo), + "signature" => Ok(GeneratedField::Signature), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AbstractionSignature; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct aptos.transaction.v1.AbstractionSignature") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut function_info__ = None; + let mut signature__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::FunctionInfo => { + if function_info__.is_some() { + return Err(serde::de::Error::duplicate_field("functionInfo")); + } + function_info__ = Some(map.next_value()?); + } + GeneratedField::Signature => { + if signature__.is_some() { + return Err(serde::de::Error::duplicate_field("signature")); + } + signature__ = + Some(map.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(AbstractionSignature { + function_info: function_info__.unwrap_or_default(), + signature: signature__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("aptos.transaction.v1.AbstractionSignature", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for AccountSignature { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -36,6 +147,9 @@ impl serde::Serialize for AccountSignature { account_signature::Signature::MultiKeySignature(v) => { struct_ser.serialize_field("multiKeySignature", v)?; } + account_signature::Signature::Abstraction(v) => { + struct_ser.serialize_field("abstraction", v)?; + } } } struct_ser.end() @@ -56,6 +170,7 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { "singleKeySignature", "multi_key_signature", "multiKeySignature", + "abstraction", ]; #[allow(clippy::enum_variant_names)] @@ -65,6 +180,7 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { MultiEd25519, SingleKeySignature, MultiKeySignature, + Abstraction, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -91,6 +207,7 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { "multiEd25519" | "multi_ed25519" => Ok(GeneratedField::MultiEd25519), "singleKeySignature" | "single_key_signature" => Ok(GeneratedField::SingleKeySignature), "multiKeySignature" | "multi_key_signature" => Ok(GeneratedField::MultiKeySignature), + "abstraction" => Ok(GeneratedField::Abstraction), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -146,6 +263,13 @@ impl<'de> serde::Deserialize<'de> for AccountSignature { return Err(serde::de::Error::duplicate_field("multiKeySignature")); } signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::MultiKeySignature) +; + } + GeneratedField::Abstraction => { + if signature__.is_some() { + return Err(serde::de::Error::duplicate_field("abstraction")); + } + signature__ = map.next_value::<::std::option::Option<_>>()?.map(account_signature::Signature::Abstraction) ; } } @@ -171,6 +295,7 @@ impl serde::Serialize for account_signature::Type { Self::MultiEd25519 => "TYPE_MULTI_ED25519", Self::SingleKey => "TYPE_SINGLE_KEY", Self::MultiKey => "TYPE_MULTI_KEY", + Self::Abstraction => "TYPE_ABSTRACTION", }; serializer.serialize_str(variant) } @@ -187,6 +312,7 @@ impl<'de> serde::Deserialize<'de> for account_signature::Type { "TYPE_MULTI_ED25519", "TYPE_SINGLE_KEY", "TYPE_MULTI_KEY", + "TYPE_ABSTRACTION", ]; struct GeneratedVisitor; @@ -234,6 +360,7 @@ impl<'de> serde::Deserialize<'de> for account_signature::Type { "TYPE_MULTI_ED25519" => Ok(account_signature::Type::MultiEd25519), "TYPE_SINGLE_KEY" => Ok(account_signature::Type::SingleKey), "TYPE_MULTI_KEY" => Ok(account_signature::Type::MultiKey), + "TYPE_ABSTRACTION" => Ok(account_signature::Type::Abstraction), _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), } } diff --git a/protos/rust/src/pb/aptos.util.timestamp.rs b/protos/rust/src/pb/aptos.util.timestamp.rs index f746dba3fd7b1..df8a9f30f8a73 100644 --- a/protos/rust/src/pb/aptos.util.timestamp.rs +++ b/protos/rust/src/pb/aptos.util.timestamp.rs @@ -3,6 +3,7 @@ // @generated // This file is @generated by prost-build. +#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct Timestamp { /// Represents seconds of UTC time since Unix epoch diff --git a/protos/typescript/src/aptos/indexer/v1/grpc.ts b/protos/typescript/src/aptos/indexer/v1/grpc.ts new file mode 100644 index 0000000000000..20ecfd84421e7 --- /dev/null +++ b/protos/typescript/src/aptos/indexer/v1/grpc.ts @@ -0,0 +1,2131 @@ +/* eslint-disable */ +import { + ChannelCredentials, + Client, + ClientReadableStream, + handleServerStreamingCall, + makeGenericClientConstructor, + Metadata, +} from "@grpc/grpc-js"; +import type { + CallOptions, + ClientOptions, + ClientUnaryCall, + handleUnaryCall, + ServiceError, + UntypedServiceImplementation, +} from "@grpc/grpc-js"; +import Long from "long"; +import _m0 from "protobufjs/minimal"; +import { Timestamp } from "../../util/timestamp/timestamp"; +import { GetTransactionsRequest, TransactionsResponse } from "./raw_data"; + +export interface StreamProgressSampleProto { + timestamp?: Timestamp | undefined; + version?: bigint | undefined; + sizeBytes?: bigint | undefined; +} + +export interface StreamProgress { + samples?: StreamProgressSampleProto[] | undefined; +} + +export interface ActiveStream { + id?: string | undefined; + startTime?: Timestamp | undefined; + startVersion?: bigint | undefined; + endVersion?: bigint | undefined; + progress?: StreamProgress | undefined; +} + +export interface StreamInfo { + activeStreams?: ActiveStream[] | undefined; +} + +export interface LiveDataServiceInfo { + chainId?: bigint | undefined; + timestamp?: Timestamp | undefined; + knownLatestVersion?: bigint | undefined; + streamInfo?: + | StreamInfo + | undefined; + /** If not present, it means the data service is not available to serve anything yet. */ + minServableVersion?: bigint | undefined; +} + +export interface HistoricalDataServiceInfo { + chainId?: bigint | undefined; + timestamp?: Timestamp | undefined; + knownLatestVersion?: bigint | undefined; + streamInfo?: StreamInfo | undefined; +} + +export interface FullnodeInfo { + chainId?: bigint | undefined; + timestamp?: Timestamp | undefined; + knownLatestVersion?: bigint | undefined; +} + +export interface GrpcManagerInfo { + chainId?: bigint | undefined; + timestamp?: Timestamp | undefined; + knownLatestVersion?: bigint | undefined; + masterAddress?: string | undefined; +} + +export interface ServiceInfo { + address?: string | undefined; + liveDataServiceInfo?: LiveDataServiceInfo | undefined; + historicalDataServiceInfo?: HistoricalDataServiceInfo | undefined; + fullnodeInfo?: FullnodeInfo | undefined; + grpcManagerInfo?: GrpcManagerInfo | undefined; +} + +export interface HeartbeatRequest { + serviceInfo?: ServiceInfo | undefined; +} + +export interface HeartbeatResponse { + knownLatestVersion?: bigint | undefined; +} + +export interface PingDataServiceRequest { + knownLatestVersion?: + | bigint + | undefined; + /** `true` for live data service, `false` for historical data service. */ + pingLiveDataService?: boolean | undefined; +} + +export interface PingDataServiceResponse { + liveDataServiceInfo?: LiveDataServiceInfo | undefined; + historicalDataServiceInfo?: HistoricalDataServiceInfo | undefined; +} + +export interface GetDataServiceForRequestRequest { + userRequest?: GetTransactionsRequest | undefined; +} + +export interface GetDataServiceForRequestResponse { + dataServiceAddress?: string | undefined; +} + +function createBaseStreamProgressSampleProto(): StreamProgressSampleProto { + return { timestamp: undefined, version: BigInt("0"), sizeBytes: BigInt("0") }; +} + +export const StreamProgressSampleProto = { + encode(message: StreamProgressSampleProto, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.timestamp !== undefined) { + Timestamp.encode(message.timestamp, writer.uint32(10).fork()).ldelim(); + } + if (message.version !== undefined && message.version !== BigInt("0")) { + if (BigInt.asUintN(64, message.version) !== message.version) { + throw new globalThis.Error("value provided for field message.version of type uint64 too large"); + } + writer.uint32(16).uint64(message.version.toString()); + } + if (message.sizeBytes !== undefined && message.sizeBytes !== BigInt("0")) { + if (BigInt.asUintN(64, message.sizeBytes) !== message.sizeBytes) { + throw new globalThis.Error("value provided for field message.sizeBytes of type uint64 too large"); + } + writer.uint32(24).uint64(message.sizeBytes.toString()); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): StreamProgressSampleProto { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStreamProgressSampleProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.timestamp = Timestamp.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.version = longToBigint(reader.uint64() as Long); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.sizeBytes = longToBigint(reader.uint64() as Long); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamProgressSampleProto.encode(p).finish()]; + } + } else { + yield* [StreamProgressSampleProto.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamProgressSampleProto.decode(p)]; + } + } else { + yield* [StreamProgressSampleProto.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): StreamProgressSampleProto { + return { + timestamp: isSet(object.timestamp) ? Timestamp.fromJSON(object.timestamp) : undefined, + version: isSet(object.version) ? BigInt(object.version) : BigInt("0"), + sizeBytes: isSet(object.sizeBytes) ? BigInt(object.sizeBytes) : BigInt("0"), + }; + }, + + toJSON(message: StreamProgressSampleProto): unknown { + const obj: any = {}; + if (message.timestamp !== undefined) { + obj.timestamp = Timestamp.toJSON(message.timestamp); + } + if (message.version !== undefined && message.version !== BigInt("0")) { + obj.version = message.version.toString(); + } + if (message.sizeBytes !== undefined && message.sizeBytes !== BigInt("0")) { + obj.sizeBytes = message.sizeBytes.toString(); + } + return obj; + }, + + create(base?: DeepPartial): StreamProgressSampleProto { + return StreamProgressSampleProto.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): StreamProgressSampleProto { + const message = createBaseStreamProgressSampleProto(); + message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) + ? Timestamp.fromPartial(object.timestamp) + : undefined; + message.version = object.version ?? BigInt("0"); + message.sizeBytes = object.sizeBytes ?? BigInt("0"); + return message; + }, +}; + +function createBaseStreamProgress(): StreamProgress { + return { samples: [] }; +} + +export const StreamProgress = { + encode(message: StreamProgress, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.samples !== undefined && message.samples.length !== 0) { + for (const v of message.samples) { + StreamProgressSampleProto.encode(v!, writer.uint32(10).fork()).ldelim(); + } + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): StreamProgress { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStreamProgress(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.samples!.push(StreamProgressSampleProto.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamProgress.encode(p).finish()]; + } + } else { + yield* [StreamProgress.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamProgress.decode(p)]; + } + } else { + yield* [StreamProgress.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): StreamProgress { + return { + samples: globalThis.Array.isArray(object?.samples) + ? object.samples.map((e: any) => StreamProgressSampleProto.fromJSON(e)) + : [], + }; + }, + + toJSON(message: StreamProgress): unknown { + const obj: any = {}; + if (message.samples?.length) { + obj.samples = message.samples.map((e) => StreamProgressSampleProto.toJSON(e)); + } + return obj; + }, + + create(base?: DeepPartial): StreamProgress { + return StreamProgress.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): StreamProgress { + const message = createBaseStreamProgress(); + message.samples = object.samples?.map((e) => StreamProgressSampleProto.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseActiveStream(): ActiveStream { + return { id: undefined, startTime: undefined, startVersion: BigInt("0"), endVersion: undefined, progress: undefined }; +} + +export const ActiveStream = { + encode(message: ActiveStream, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== undefined) { + writer.uint32(10).string(message.id); + } + if (message.startTime !== undefined) { + Timestamp.encode(message.startTime, writer.uint32(18).fork()).ldelim(); + } + if (message.startVersion !== undefined && message.startVersion !== BigInt("0")) { + if (BigInt.asUintN(64, message.startVersion) !== message.startVersion) { + throw new globalThis.Error("value provided for field message.startVersion of type uint64 too large"); + } + writer.uint32(24).uint64(message.startVersion.toString()); + } + if (message.endVersion !== undefined) { + if (BigInt.asUintN(64, message.endVersion) !== message.endVersion) { + throw new globalThis.Error("value provided for field message.endVersion of type uint64 too large"); + } + writer.uint32(32).uint64(message.endVersion.toString()); + } + if (message.progress !== undefined) { + StreamProgress.encode(message.progress, writer.uint32(42).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ActiveStream { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseActiveStream(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.startTime = Timestamp.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.startVersion = longToBigint(reader.uint64() as Long); + continue; + case 4: + if (tag !== 32) { + break; + } + + message.endVersion = longToBigint(reader.uint64() as Long); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.progress = StreamProgress.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [ActiveStream.encode(p).finish()]; + } + } else { + yield* [ActiveStream.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [ActiveStream.decode(p)]; + } + } else { + yield* [ActiveStream.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): ActiveStream { + return { + id: isSet(object.id) ? globalThis.String(object.id) : undefined, + startTime: isSet(object.startTime) ? Timestamp.fromJSON(object.startTime) : undefined, + startVersion: isSet(object.startVersion) ? BigInt(object.startVersion) : BigInt("0"), + endVersion: isSet(object.endVersion) ? BigInt(object.endVersion) : undefined, + progress: isSet(object.progress) ? StreamProgress.fromJSON(object.progress) : undefined, + }; + }, + + toJSON(message: ActiveStream): unknown { + const obj: any = {}; + if (message.id !== undefined) { + obj.id = message.id; + } + if (message.startTime !== undefined) { + obj.startTime = Timestamp.toJSON(message.startTime); + } + if (message.startVersion !== undefined && message.startVersion !== BigInt("0")) { + obj.startVersion = message.startVersion.toString(); + } + if (message.endVersion !== undefined) { + obj.endVersion = message.endVersion.toString(); + } + if (message.progress !== undefined) { + obj.progress = StreamProgress.toJSON(message.progress); + } + return obj; + }, + + create(base?: DeepPartial): ActiveStream { + return ActiveStream.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): ActiveStream { + const message = createBaseActiveStream(); + message.id = object.id ?? undefined; + message.startTime = (object.startTime !== undefined && object.startTime !== null) + ? Timestamp.fromPartial(object.startTime) + : undefined; + message.startVersion = object.startVersion ?? BigInt("0"); + message.endVersion = object.endVersion ?? undefined; + message.progress = (object.progress !== undefined && object.progress !== null) + ? StreamProgress.fromPartial(object.progress) + : undefined; + return message; + }, +}; + +function createBaseStreamInfo(): StreamInfo { + return { activeStreams: [] }; +} + +export const StreamInfo = { + encode(message: StreamInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.activeStreams !== undefined && message.activeStreams.length !== 0) { + for (const v of message.activeStreams) { + ActiveStream.encode(v!, writer.uint32(10).fork()).ldelim(); + } + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): StreamInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStreamInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.activeStreams!.push(ActiveStream.decode(reader, reader.uint32())); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamInfo.encode(p).finish()]; + } + } else { + yield* [StreamInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [StreamInfo.decode(p)]; + } + } else { + yield* [StreamInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): StreamInfo { + return { + activeStreams: globalThis.Array.isArray(object?.activeStreams) + ? object.activeStreams.map((e: any) => ActiveStream.fromJSON(e)) + : [], + }; + }, + + toJSON(message: StreamInfo): unknown { + const obj: any = {}; + if (message.activeStreams?.length) { + obj.activeStreams = message.activeStreams.map((e) => ActiveStream.toJSON(e)); + } + return obj; + }, + + create(base?: DeepPartial): StreamInfo { + return StreamInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): StreamInfo { + const message = createBaseStreamInfo(); + message.activeStreams = object.activeStreams?.map((e) => ActiveStream.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseLiveDataServiceInfo(): LiveDataServiceInfo { + return { + chainId: undefined, + timestamp: undefined, + knownLatestVersion: undefined, + streamInfo: undefined, + minServableVersion: undefined, + }; +} + +export const LiveDataServiceInfo = { + encode(message: LiveDataServiceInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.chainId !== undefined) { + if (BigInt.asUintN(64, message.chainId) !== message.chainId) { + throw new globalThis.Error("value provided for field message.chainId of type uint64 too large"); + } + writer.uint32(8).uint64(message.chainId.toString()); + } + if (message.timestamp !== undefined) { + Timestamp.encode(message.timestamp, writer.uint32(18).fork()).ldelim(); + } + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(24).uint64(message.knownLatestVersion.toString()); + } + if (message.streamInfo !== undefined) { + StreamInfo.encode(message.streamInfo, writer.uint32(34).fork()).ldelim(); + } + if (message.minServableVersion !== undefined) { + if (BigInt.asUintN(64, message.minServableVersion) !== message.minServableVersion) { + throw new globalThis.Error("value provided for field message.minServableVersion of type uint64 too large"); + } + writer.uint32(40).uint64(message.minServableVersion.toString()); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): LiveDataServiceInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseLiveDataServiceInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.chainId = longToBigint(reader.uint64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.timestamp = Timestamp.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.streamInfo = StreamInfo.decode(reader, reader.uint32()); + continue; + case 5: + if (tag !== 40) { + break; + } + + message.minServableVersion = longToBigint(reader.uint64() as Long); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [LiveDataServiceInfo.encode(p).finish()]; + } + } else { + yield* [LiveDataServiceInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [LiveDataServiceInfo.decode(p)]; + } + } else { + yield* [LiveDataServiceInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): LiveDataServiceInfo { + return { + chainId: isSet(object.chainId) ? BigInt(object.chainId) : undefined, + timestamp: isSet(object.timestamp) ? Timestamp.fromJSON(object.timestamp) : undefined, + knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined, + streamInfo: isSet(object.streamInfo) ? StreamInfo.fromJSON(object.streamInfo) : undefined, + minServableVersion: isSet(object.minServableVersion) ? BigInt(object.minServableVersion) : undefined, + }; + }, + + toJSON(message: LiveDataServiceInfo): unknown { + const obj: any = {}; + if (message.chainId !== undefined) { + obj.chainId = message.chainId.toString(); + } + if (message.timestamp !== undefined) { + obj.timestamp = Timestamp.toJSON(message.timestamp); + } + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + if (message.streamInfo !== undefined) { + obj.streamInfo = StreamInfo.toJSON(message.streamInfo); + } + if (message.minServableVersion !== undefined) { + obj.minServableVersion = message.minServableVersion.toString(); + } + return obj; + }, + + create(base?: DeepPartial): LiveDataServiceInfo { + return LiveDataServiceInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): LiveDataServiceInfo { + const message = createBaseLiveDataServiceInfo(); + message.chainId = object.chainId ?? undefined; + message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) + ? Timestamp.fromPartial(object.timestamp) + : undefined; + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + message.streamInfo = (object.streamInfo !== undefined && object.streamInfo !== null) + ? StreamInfo.fromPartial(object.streamInfo) + : undefined; + message.minServableVersion = object.minServableVersion ?? undefined; + return message; + }, +}; + +function createBaseHistoricalDataServiceInfo(): HistoricalDataServiceInfo { + return { chainId: undefined, timestamp: undefined, knownLatestVersion: undefined, streamInfo: undefined }; +} + +export const HistoricalDataServiceInfo = { + encode(message: HistoricalDataServiceInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.chainId !== undefined) { + if (BigInt.asUintN(64, message.chainId) !== message.chainId) { + throw new globalThis.Error("value provided for field message.chainId of type uint64 too large"); + } + writer.uint32(8).uint64(message.chainId.toString()); + } + if (message.timestamp !== undefined) { + Timestamp.encode(message.timestamp, writer.uint32(18).fork()).ldelim(); + } + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(24).uint64(message.knownLatestVersion.toString()); + } + if (message.streamInfo !== undefined) { + StreamInfo.encode(message.streamInfo, writer.uint32(34).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HistoricalDataServiceInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHistoricalDataServiceInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.chainId = longToBigint(reader.uint64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.timestamp = Timestamp.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.streamInfo = StreamInfo.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HistoricalDataServiceInfo.encode(p).finish()]; + } + } else { + yield* [HistoricalDataServiceInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HistoricalDataServiceInfo.decode(p)]; + } + } else { + yield* [HistoricalDataServiceInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): HistoricalDataServiceInfo { + return { + chainId: isSet(object.chainId) ? BigInt(object.chainId) : undefined, + timestamp: isSet(object.timestamp) ? Timestamp.fromJSON(object.timestamp) : undefined, + knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined, + streamInfo: isSet(object.streamInfo) ? StreamInfo.fromJSON(object.streamInfo) : undefined, + }; + }, + + toJSON(message: HistoricalDataServiceInfo): unknown { + const obj: any = {}; + if (message.chainId !== undefined) { + obj.chainId = message.chainId.toString(); + } + if (message.timestamp !== undefined) { + obj.timestamp = Timestamp.toJSON(message.timestamp); + } + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + if (message.streamInfo !== undefined) { + obj.streamInfo = StreamInfo.toJSON(message.streamInfo); + } + return obj; + }, + + create(base?: DeepPartial): HistoricalDataServiceInfo { + return HistoricalDataServiceInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): HistoricalDataServiceInfo { + const message = createBaseHistoricalDataServiceInfo(); + message.chainId = object.chainId ?? undefined; + message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) + ? Timestamp.fromPartial(object.timestamp) + : undefined; + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + message.streamInfo = (object.streamInfo !== undefined && object.streamInfo !== null) + ? StreamInfo.fromPartial(object.streamInfo) + : undefined; + return message; + }, +}; + +function createBaseFullnodeInfo(): FullnodeInfo { + return { chainId: undefined, timestamp: undefined, knownLatestVersion: undefined }; +} + +export const FullnodeInfo = { + encode(message: FullnodeInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.chainId !== undefined) { + if (BigInt.asUintN(64, message.chainId) !== message.chainId) { + throw new globalThis.Error("value provided for field message.chainId of type uint64 too large"); + } + writer.uint32(8).uint64(message.chainId.toString()); + } + if (message.timestamp !== undefined) { + Timestamp.encode(message.timestamp, writer.uint32(18).fork()).ldelim(); + } + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(24).uint64(message.knownLatestVersion.toString()); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): FullnodeInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFullnodeInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.chainId = longToBigint(reader.uint64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.timestamp = Timestamp.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [FullnodeInfo.encode(p).finish()]; + } + } else { + yield* [FullnodeInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [FullnodeInfo.decode(p)]; + } + } else { + yield* [FullnodeInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): FullnodeInfo { + return { + chainId: isSet(object.chainId) ? BigInt(object.chainId) : undefined, + timestamp: isSet(object.timestamp) ? Timestamp.fromJSON(object.timestamp) : undefined, + knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined, + }; + }, + + toJSON(message: FullnodeInfo): unknown { + const obj: any = {}; + if (message.chainId !== undefined) { + obj.chainId = message.chainId.toString(); + } + if (message.timestamp !== undefined) { + obj.timestamp = Timestamp.toJSON(message.timestamp); + } + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + return obj; + }, + + create(base?: DeepPartial): FullnodeInfo { + return FullnodeInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): FullnodeInfo { + const message = createBaseFullnodeInfo(); + message.chainId = object.chainId ?? undefined; + message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) + ? Timestamp.fromPartial(object.timestamp) + : undefined; + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + return message; + }, +}; + +function createBaseGrpcManagerInfo(): GrpcManagerInfo { + return { chainId: undefined, timestamp: undefined, knownLatestVersion: undefined, masterAddress: undefined }; +} + +export const GrpcManagerInfo = { + encode(message: GrpcManagerInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.chainId !== undefined) { + if (BigInt.asUintN(64, message.chainId) !== message.chainId) { + throw new globalThis.Error("value provided for field message.chainId of type uint64 too large"); + } + writer.uint32(8).uint64(message.chainId.toString()); + } + if (message.timestamp !== undefined) { + Timestamp.encode(message.timestamp, writer.uint32(18).fork()).ldelim(); + } + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(24).uint64(message.knownLatestVersion.toString()); + } + if (message.masterAddress !== undefined) { + writer.uint32(34).string(message.masterAddress); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): GrpcManagerInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGrpcManagerInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.chainId = longToBigint(reader.uint64() as Long); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.timestamp = Timestamp.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.masterAddress = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GrpcManagerInfo.encode(p).finish()]; + } + } else { + yield* [GrpcManagerInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GrpcManagerInfo.decode(p)]; + } + } else { + yield* [GrpcManagerInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): GrpcManagerInfo { + return { + chainId: isSet(object.chainId) ? BigInt(object.chainId) : undefined, + timestamp: isSet(object.timestamp) ? Timestamp.fromJSON(object.timestamp) : undefined, + knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined, + masterAddress: isSet(object.masterAddress) ? globalThis.String(object.masterAddress) : undefined, + }; + }, + + toJSON(message: GrpcManagerInfo): unknown { + const obj: any = {}; + if (message.chainId !== undefined) { + obj.chainId = message.chainId.toString(); + } + if (message.timestamp !== undefined) { + obj.timestamp = Timestamp.toJSON(message.timestamp); + } + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + if (message.masterAddress !== undefined) { + obj.masterAddress = message.masterAddress; + } + return obj; + }, + + create(base?: DeepPartial): GrpcManagerInfo { + return GrpcManagerInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): GrpcManagerInfo { + const message = createBaseGrpcManagerInfo(); + message.chainId = object.chainId ?? undefined; + message.timestamp = (object.timestamp !== undefined && object.timestamp !== null) + ? Timestamp.fromPartial(object.timestamp) + : undefined; + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + message.masterAddress = object.masterAddress ?? undefined; + return message; + }, +}; + +function createBaseServiceInfo(): ServiceInfo { + return { + address: undefined, + liveDataServiceInfo: undefined, + historicalDataServiceInfo: undefined, + fullnodeInfo: undefined, + grpcManagerInfo: undefined, + }; +} + +export const ServiceInfo = { + encode(message: ServiceInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.address !== undefined) { + writer.uint32(10).string(message.address); + } + if (message.liveDataServiceInfo !== undefined) { + LiveDataServiceInfo.encode(message.liveDataServiceInfo, writer.uint32(18).fork()).ldelim(); + } + if (message.historicalDataServiceInfo !== undefined) { + HistoricalDataServiceInfo.encode(message.historicalDataServiceInfo, writer.uint32(26).fork()).ldelim(); + } + if (message.fullnodeInfo !== undefined) { + FullnodeInfo.encode(message.fullnodeInfo, writer.uint32(34).fork()).ldelim(); + } + if (message.grpcManagerInfo !== undefined) { + GrpcManagerInfo.encode(message.grpcManagerInfo, writer.uint32(42).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ServiceInfo { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseServiceInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.address = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.liveDataServiceInfo = LiveDataServiceInfo.decode(reader, reader.uint32()); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.historicalDataServiceInfo = HistoricalDataServiceInfo.decode(reader, reader.uint32()); + continue; + case 4: + if (tag !== 34) { + break; + } + + message.fullnodeInfo = FullnodeInfo.decode(reader, reader.uint32()); + continue; + case 5: + if (tag !== 42) { + break; + } + + message.grpcManagerInfo = GrpcManagerInfo.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [ServiceInfo.encode(p).finish()]; + } + } else { + yield* [ServiceInfo.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [ServiceInfo.decode(p)]; + } + } else { + yield* [ServiceInfo.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): ServiceInfo { + return { + address: isSet(object.address) ? globalThis.String(object.address) : undefined, + liveDataServiceInfo: isSet(object.liveDataServiceInfo) + ? LiveDataServiceInfo.fromJSON(object.liveDataServiceInfo) + : undefined, + historicalDataServiceInfo: isSet(object.historicalDataServiceInfo) + ? HistoricalDataServiceInfo.fromJSON(object.historicalDataServiceInfo) + : undefined, + fullnodeInfo: isSet(object.fullnodeInfo) ? FullnodeInfo.fromJSON(object.fullnodeInfo) : undefined, + grpcManagerInfo: isSet(object.grpcManagerInfo) ? GrpcManagerInfo.fromJSON(object.grpcManagerInfo) : undefined, + }; + }, + + toJSON(message: ServiceInfo): unknown { + const obj: any = {}; + if (message.address !== undefined) { + obj.address = message.address; + } + if (message.liveDataServiceInfo !== undefined) { + obj.liveDataServiceInfo = LiveDataServiceInfo.toJSON(message.liveDataServiceInfo); + } + if (message.historicalDataServiceInfo !== undefined) { + obj.historicalDataServiceInfo = HistoricalDataServiceInfo.toJSON(message.historicalDataServiceInfo); + } + if (message.fullnodeInfo !== undefined) { + obj.fullnodeInfo = FullnodeInfo.toJSON(message.fullnodeInfo); + } + if (message.grpcManagerInfo !== undefined) { + obj.grpcManagerInfo = GrpcManagerInfo.toJSON(message.grpcManagerInfo); + } + return obj; + }, + + create(base?: DeepPartial): ServiceInfo { + return ServiceInfo.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): ServiceInfo { + const message = createBaseServiceInfo(); + message.address = object.address ?? undefined; + message.liveDataServiceInfo = (object.liveDataServiceInfo !== undefined && object.liveDataServiceInfo !== null) + ? LiveDataServiceInfo.fromPartial(object.liveDataServiceInfo) + : undefined; + message.historicalDataServiceInfo = + (object.historicalDataServiceInfo !== undefined && object.historicalDataServiceInfo !== null) + ? HistoricalDataServiceInfo.fromPartial(object.historicalDataServiceInfo) + : undefined; + message.fullnodeInfo = (object.fullnodeInfo !== undefined && object.fullnodeInfo !== null) + ? FullnodeInfo.fromPartial(object.fullnodeInfo) + : undefined; + message.grpcManagerInfo = (object.grpcManagerInfo !== undefined && object.grpcManagerInfo !== null) + ? GrpcManagerInfo.fromPartial(object.grpcManagerInfo) + : undefined; + return message; + }, +}; + +function createBaseHeartbeatRequest(): HeartbeatRequest { + return { serviceInfo: undefined }; +} + +export const HeartbeatRequest = { + encode(message: HeartbeatRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.serviceInfo !== undefined) { + ServiceInfo.encode(message.serviceInfo, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHeartbeatRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.serviceInfo = ServiceInfo.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HeartbeatRequest.encode(p).finish()]; + } + } else { + yield* [HeartbeatRequest.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HeartbeatRequest.decode(p)]; + } + } else { + yield* [HeartbeatRequest.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): HeartbeatRequest { + return { serviceInfo: isSet(object.serviceInfo) ? ServiceInfo.fromJSON(object.serviceInfo) : undefined }; + }, + + toJSON(message: HeartbeatRequest): unknown { + const obj: any = {}; + if (message.serviceInfo !== undefined) { + obj.serviceInfo = ServiceInfo.toJSON(message.serviceInfo); + } + return obj; + }, + + create(base?: DeepPartial): HeartbeatRequest { + return HeartbeatRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): HeartbeatRequest { + const message = createBaseHeartbeatRequest(); + message.serviceInfo = (object.serviceInfo !== undefined && object.serviceInfo !== null) + ? ServiceInfo.fromPartial(object.serviceInfo) + : undefined; + return message; + }, +}; + +function createBaseHeartbeatResponse(): HeartbeatResponse { + return { knownLatestVersion: undefined }; +} + +export const HeartbeatResponse = { + encode(message: HeartbeatResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(8).uint64(message.knownLatestVersion.toString()); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHeartbeatResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HeartbeatResponse.encode(p).finish()]; + } + } else { + yield* [HeartbeatResponse.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [HeartbeatResponse.decode(p)]; + } + } else { + yield* [HeartbeatResponse.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): HeartbeatResponse { + return { knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined }; + }, + + toJSON(message: HeartbeatResponse): unknown { + const obj: any = {}; + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + return obj; + }, + + create(base?: DeepPartial): HeartbeatResponse { + return HeartbeatResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): HeartbeatResponse { + const message = createBaseHeartbeatResponse(); + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + return message; + }, +}; + +function createBasePingDataServiceRequest(): PingDataServiceRequest { + return { knownLatestVersion: undefined, pingLiveDataService: false }; +} + +export const PingDataServiceRequest = { + encode(message: PingDataServiceRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.knownLatestVersion !== undefined) { + if (BigInt.asUintN(64, message.knownLatestVersion) !== message.knownLatestVersion) { + throw new globalThis.Error("value provided for field message.knownLatestVersion of type uint64 too large"); + } + writer.uint32(8).uint64(message.knownLatestVersion.toString()); + } + if (message.pingLiveDataService === true) { + writer.uint32(16).bool(message.pingLiveDataService); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): PingDataServiceRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePingDataServiceRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.knownLatestVersion = longToBigint(reader.uint64() as Long); + continue; + case 2: + if (tag !== 16) { + break; + } + + message.pingLiveDataService = reader.bool(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [PingDataServiceRequest.encode(p).finish()]; + } + } else { + yield* [PingDataServiceRequest.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [PingDataServiceRequest.decode(p)]; + } + } else { + yield* [PingDataServiceRequest.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): PingDataServiceRequest { + return { + knownLatestVersion: isSet(object.knownLatestVersion) ? BigInt(object.knownLatestVersion) : undefined, + pingLiveDataService: isSet(object.pingLiveDataService) ? globalThis.Boolean(object.pingLiveDataService) : false, + }; + }, + + toJSON(message: PingDataServiceRequest): unknown { + const obj: any = {}; + if (message.knownLatestVersion !== undefined) { + obj.knownLatestVersion = message.knownLatestVersion.toString(); + } + if (message.pingLiveDataService === true) { + obj.pingLiveDataService = message.pingLiveDataService; + } + return obj; + }, + + create(base?: DeepPartial): PingDataServiceRequest { + return PingDataServiceRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PingDataServiceRequest { + const message = createBasePingDataServiceRequest(); + message.knownLatestVersion = object.knownLatestVersion ?? undefined; + message.pingLiveDataService = object.pingLiveDataService ?? false; + return message; + }, +}; + +function createBasePingDataServiceResponse(): PingDataServiceResponse { + return { liveDataServiceInfo: undefined, historicalDataServiceInfo: undefined }; +} + +export const PingDataServiceResponse = { + encode(message: PingDataServiceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.liveDataServiceInfo !== undefined) { + LiveDataServiceInfo.encode(message.liveDataServiceInfo, writer.uint32(10).fork()).ldelim(); + } + if (message.historicalDataServiceInfo !== undefined) { + HistoricalDataServiceInfo.encode(message.historicalDataServiceInfo, writer.uint32(18).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): PingDataServiceResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePingDataServiceResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.liveDataServiceInfo = LiveDataServiceInfo.decode(reader, reader.uint32()); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.historicalDataServiceInfo = HistoricalDataServiceInfo.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [PingDataServiceResponse.encode(p).finish()]; + } + } else { + yield* [PingDataServiceResponse.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [PingDataServiceResponse.decode(p)]; + } + } else { + yield* [PingDataServiceResponse.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): PingDataServiceResponse { + return { + liveDataServiceInfo: isSet(object.liveDataServiceInfo) + ? LiveDataServiceInfo.fromJSON(object.liveDataServiceInfo) + : undefined, + historicalDataServiceInfo: isSet(object.historicalDataServiceInfo) + ? HistoricalDataServiceInfo.fromJSON(object.historicalDataServiceInfo) + : undefined, + }; + }, + + toJSON(message: PingDataServiceResponse): unknown { + const obj: any = {}; + if (message.liveDataServiceInfo !== undefined) { + obj.liveDataServiceInfo = LiveDataServiceInfo.toJSON(message.liveDataServiceInfo); + } + if (message.historicalDataServiceInfo !== undefined) { + obj.historicalDataServiceInfo = HistoricalDataServiceInfo.toJSON(message.historicalDataServiceInfo); + } + return obj; + }, + + create(base?: DeepPartial): PingDataServiceResponse { + return PingDataServiceResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PingDataServiceResponse { + const message = createBasePingDataServiceResponse(); + message.liveDataServiceInfo = (object.liveDataServiceInfo !== undefined && object.liveDataServiceInfo !== null) + ? LiveDataServiceInfo.fromPartial(object.liveDataServiceInfo) + : undefined; + message.historicalDataServiceInfo = + (object.historicalDataServiceInfo !== undefined && object.historicalDataServiceInfo !== null) + ? HistoricalDataServiceInfo.fromPartial(object.historicalDataServiceInfo) + : undefined; + return message; + }, +}; + +function createBaseGetDataServiceForRequestRequest(): GetDataServiceForRequestRequest { + return { userRequest: undefined }; +} + +export const GetDataServiceForRequestRequest = { + encode(message: GetDataServiceForRequestRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.userRequest !== undefined) { + GetTransactionsRequest.encode(message.userRequest, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): GetDataServiceForRequestRequest { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetDataServiceForRequestRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.userRequest = GetTransactionsRequest.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GetDataServiceForRequestRequest.encode(p).finish()]; + } + } else { + yield* [GetDataServiceForRequestRequest.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GetDataServiceForRequestRequest.decode(p)]; + } + } else { + yield* [GetDataServiceForRequestRequest.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): GetDataServiceForRequestRequest { + return { userRequest: isSet(object.userRequest) ? GetTransactionsRequest.fromJSON(object.userRequest) : undefined }; + }, + + toJSON(message: GetDataServiceForRequestRequest): unknown { + const obj: any = {}; + if (message.userRequest !== undefined) { + obj.userRequest = GetTransactionsRequest.toJSON(message.userRequest); + } + return obj; + }, + + create(base?: DeepPartial): GetDataServiceForRequestRequest { + return GetDataServiceForRequestRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): GetDataServiceForRequestRequest { + const message = createBaseGetDataServiceForRequestRequest(); + message.userRequest = (object.userRequest !== undefined && object.userRequest !== null) + ? GetTransactionsRequest.fromPartial(object.userRequest) + : undefined; + return message; + }, +}; + +function createBaseGetDataServiceForRequestResponse(): GetDataServiceForRequestResponse { + return { dataServiceAddress: "" }; +} + +export const GetDataServiceForRequestResponse = { + encode(message: GetDataServiceForRequestResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.dataServiceAddress !== undefined && message.dataServiceAddress !== "") { + writer.uint32(10).string(message.dataServiceAddress); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): GetDataServiceForRequestResponse { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetDataServiceForRequestResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.dataServiceAddress = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GetDataServiceForRequestResponse.encode(p).finish()]; + } + } else { + yield* [GetDataServiceForRequestResponse.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [GetDataServiceForRequestResponse.decode(p)]; + } + } else { + yield* [GetDataServiceForRequestResponse.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): GetDataServiceForRequestResponse { + return { dataServiceAddress: isSet(object.dataServiceAddress) ? globalThis.String(object.dataServiceAddress) : "" }; + }, + + toJSON(message: GetDataServiceForRequestResponse): unknown { + const obj: any = {}; + if (message.dataServiceAddress !== undefined && message.dataServiceAddress !== "") { + obj.dataServiceAddress = message.dataServiceAddress; + } + return obj; + }, + + create(base?: DeepPartial): GetDataServiceForRequestResponse { + return GetDataServiceForRequestResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): GetDataServiceForRequestResponse { + const message = createBaseGetDataServiceForRequestResponse(); + message.dataServiceAddress = object.dataServiceAddress ?? ""; + return message; + }, +}; + +export type GrpcManagerService = typeof GrpcManagerService; +export const GrpcManagerService = { + heartbeat: { + path: "/aptos.indexer.v1.GrpcManager/Heartbeat", + requestStream: false, + responseStream: false, + requestSerialize: (value: HeartbeatRequest) => Buffer.from(HeartbeatRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => HeartbeatRequest.decode(value), + responseSerialize: (value: HeartbeatResponse) => Buffer.from(HeartbeatResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => HeartbeatResponse.decode(value), + }, + getTransactions: { + path: "/aptos.indexer.v1.GrpcManager/GetTransactions", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetTransactionsRequest) => Buffer.from(GetTransactionsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetTransactionsRequest.decode(value), + responseSerialize: (value: TransactionsResponse) => Buffer.from(TransactionsResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => TransactionsResponse.decode(value), + }, + getDataServiceForRequest: { + path: "/aptos.indexer.v1.GrpcManager/GetDataServiceForRequest", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetDataServiceForRequestRequest) => + Buffer.from(GetDataServiceForRequestRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetDataServiceForRequestRequest.decode(value), + responseSerialize: (value: GetDataServiceForRequestResponse) => + Buffer.from(GetDataServiceForRequestResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => GetDataServiceForRequestResponse.decode(value), + }, +} as const; + +export interface GrpcManagerServer extends UntypedServiceImplementation { + heartbeat: handleUnaryCall; + getTransactions: handleUnaryCall; + getDataServiceForRequest: handleUnaryCall; +} + +export interface GrpcManagerClient extends Client { + heartbeat( + request: HeartbeatRequest, + callback: (error: ServiceError | null, response: HeartbeatResponse) => void, + ): ClientUnaryCall; + heartbeat( + request: HeartbeatRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: HeartbeatResponse) => void, + ): ClientUnaryCall; + heartbeat( + request: HeartbeatRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: HeartbeatResponse) => void, + ): ClientUnaryCall; + getTransactions( + request: GetTransactionsRequest, + callback: (error: ServiceError | null, response: TransactionsResponse) => void, + ): ClientUnaryCall; + getTransactions( + request: GetTransactionsRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: TransactionsResponse) => void, + ): ClientUnaryCall; + getTransactions( + request: GetTransactionsRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TransactionsResponse) => void, + ): ClientUnaryCall; + getDataServiceForRequest( + request: GetDataServiceForRequestRequest, + callback: (error: ServiceError | null, response: GetDataServiceForRequestResponse) => void, + ): ClientUnaryCall; + getDataServiceForRequest( + request: GetDataServiceForRequestRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: GetDataServiceForRequestResponse) => void, + ): ClientUnaryCall; + getDataServiceForRequest( + request: GetDataServiceForRequestRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: GetDataServiceForRequestResponse) => void, + ): ClientUnaryCall; +} + +export const GrpcManagerClient = makeGenericClientConstructor( + GrpcManagerService, + "aptos.indexer.v1.GrpcManager", +) as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): GrpcManagerClient; + service: typeof GrpcManagerService; + serviceName: string; +}; + +export type DataServiceService = typeof DataServiceService; +export const DataServiceService = { + ping: { + path: "/aptos.indexer.v1.DataService/Ping", + requestStream: false, + responseStream: false, + requestSerialize: (value: PingDataServiceRequest) => Buffer.from(PingDataServiceRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => PingDataServiceRequest.decode(value), + responseSerialize: (value: PingDataServiceResponse) => Buffer.from(PingDataServiceResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => PingDataServiceResponse.decode(value), + }, + getTransactions: { + path: "/aptos.indexer.v1.DataService/GetTransactions", + requestStream: false, + responseStream: true, + requestSerialize: (value: GetTransactionsRequest) => Buffer.from(GetTransactionsRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetTransactionsRequest.decode(value), + responseSerialize: (value: TransactionsResponse) => Buffer.from(TransactionsResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => TransactionsResponse.decode(value), + }, +} as const; + +export interface DataServiceServer extends UntypedServiceImplementation { + ping: handleUnaryCall; + getTransactions: handleServerStreamingCall; +} + +export interface DataServiceClient extends Client { + ping( + request: PingDataServiceRequest, + callback: (error: ServiceError | null, response: PingDataServiceResponse) => void, + ): ClientUnaryCall; + ping( + request: PingDataServiceRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: PingDataServiceResponse) => void, + ): ClientUnaryCall; + ping( + request: PingDataServiceRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: PingDataServiceResponse) => void, + ): ClientUnaryCall; + getTransactions( + request: GetTransactionsRequest, + options?: Partial, + ): ClientReadableStream; + getTransactions( + request: GetTransactionsRequest, + metadata?: Metadata, + options?: Partial, + ): ClientReadableStream; +} + +export const DataServiceClient = makeGenericClientConstructor( + DataServiceService, + "aptos.indexer.v1.DataService", +) as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): DataServiceClient; + service: typeof DataServiceService; + serviceName: string; +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined; + +type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function longToBigint(long: Long) { + return BigInt(long.toString()); +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any; + _m0.configure(); +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/protos/typescript/src/aptos/transaction/v1/transaction.ts b/protos/typescript/src/aptos/transaction/v1/transaction.ts index 6ec0fd1472bd8..168f6f0c2448d 100644 --- a/protos/typescript/src/aptos/transaction/v1/transaction.ts +++ b/protos/typescript/src/aptos/transaction/v1/transaction.ts @@ -1106,6 +1106,11 @@ export interface MultiKeySignature { signaturesRequired?: number | undefined; } +export interface AbstractionSignature { + functionInfo?: string | undefined; + signature?: Uint8Array | undefined; +} + export interface SingleSender { sender?: AccountSignature | undefined; } @@ -1119,6 +1124,7 @@ export interface AccountSignature { /** 4 is reserved. */ singleKeySignature?: SingleKeySignature | undefined; multiKeySignature?: MultiKeySignature | undefined; + abstraction?: AbstractionSignature | undefined; } export enum AccountSignature_Type { @@ -1127,6 +1133,7 @@ export enum AccountSignature_Type { TYPE_MULTI_ED25519 = 2, TYPE_SINGLE_KEY = 4, TYPE_MULTI_KEY = 5, + TYPE_ABSTRACTION = 6, UNRECOGNIZED = -1, } @@ -1147,6 +1154,9 @@ export function accountSignature_TypeFromJSON(object: any): AccountSignature_Typ case 5: case "TYPE_MULTI_KEY": return AccountSignature_Type.TYPE_MULTI_KEY; + case 6: + case "TYPE_ABSTRACTION": + return AccountSignature_Type.TYPE_ABSTRACTION; case -1: case "UNRECOGNIZED": default: @@ -1166,6 +1176,8 @@ export function accountSignature_TypeToJSON(object: AccountSignature_Type): stri return "TYPE_SINGLE_KEY"; case AccountSignature_Type.TYPE_MULTI_KEY: return "TYPE_MULTI_KEY"; + case AccountSignature_Type.TYPE_ABSTRACTION: + return "TYPE_ABSTRACTION"; case AccountSignature_Type.UNRECOGNIZED: default: return "UNRECOGNIZED"; @@ -10255,6 +10267,114 @@ export const MultiKeySignature = { }, }; +function createBaseAbstractionSignature(): AbstractionSignature { + return { functionInfo: "", signature: new Uint8Array(0) }; +} + +export const AbstractionSignature = { + encode(message: AbstractionSignature, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.functionInfo !== undefined && message.functionInfo !== "") { + writer.uint32(10).string(message.functionInfo); + } + if (message.signature !== undefined && message.signature.length !== 0) { + writer.uint32(18).bytes(message.signature); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): AbstractionSignature { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAbstractionSignature(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.functionInfo = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.signature = reader.bytes(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + // encodeTransform encodes a source of message objects. + // Transform + async *encodeTransform( + source: + | AsyncIterable + | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [AbstractionSignature.encode(p).finish()]; + } + } else { + yield* [AbstractionSignature.encode(pkt as any).finish()]; + } + } + }, + + // decodeTransform decodes a source of encoded messages. + // Transform + async *decodeTransform( + source: AsyncIterable | Iterable, + ): AsyncIterable { + for await (const pkt of source) { + if (globalThis.Array.isArray(pkt)) { + for (const p of (pkt as any)) { + yield* [AbstractionSignature.decode(p)]; + } + } else { + yield* [AbstractionSignature.decode(pkt as any)]; + } + } + }, + + fromJSON(object: any): AbstractionSignature { + return { + functionInfo: isSet(object.functionInfo) ? globalThis.String(object.functionInfo) : "", + signature: isSet(object.signature) ? bytesFromBase64(object.signature) : new Uint8Array(0), + }; + }, + + toJSON(message: AbstractionSignature): unknown { + const obj: any = {}; + if (message.functionInfo !== undefined && message.functionInfo !== "") { + obj.functionInfo = message.functionInfo; + } + if (message.signature !== undefined && message.signature.length !== 0) { + obj.signature = base64FromBytes(message.signature); + } + return obj; + }, + + create(base?: DeepPartial): AbstractionSignature { + return AbstractionSignature.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): AbstractionSignature { + const message = createBaseAbstractionSignature(); + message.functionInfo = object.functionInfo ?? ""; + message.signature = object.signature ?? new Uint8Array(0); + return message; + }, +}; + function createBaseSingleSender(): SingleSender { return { sender: undefined }; } @@ -10353,6 +10473,7 @@ function createBaseAccountSignature(): AccountSignature { multiEd25519: undefined, singleKeySignature: undefined, multiKeySignature: undefined, + abstraction: undefined, }; } @@ -10373,6 +10494,9 @@ export const AccountSignature = { if (message.multiKeySignature !== undefined) { MultiKeySignature.encode(message.multiKeySignature, writer.uint32(50).fork()).ldelim(); } + if (message.abstraction !== undefined) { + AbstractionSignature.encode(message.abstraction, writer.uint32(58).fork()).ldelim(); + } return writer; }, @@ -10418,6 +10542,13 @@ export const AccountSignature = { message.multiKeySignature = MultiKeySignature.decode(reader, reader.uint32()); continue; + case 7: + if (tag !== 58) { + break; + } + + message.abstraction = AbstractionSignature.decode(reader, reader.uint32()); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -10470,6 +10601,7 @@ export const AccountSignature = { multiKeySignature: isSet(object.multiKeySignature) ? MultiKeySignature.fromJSON(object.multiKeySignature) : undefined, + abstraction: isSet(object.abstraction) ? AbstractionSignature.fromJSON(object.abstraction) : undefined, }; }, @@ -10490,6 +10622,9 @@ export const AccountSignature = { if (message.multiKeySignature !== undefined) { obj.multiKeySignature = MultiKeySignature.toJSON(message.multiKeySignature); } + if (message.abstraction !== undefined) { + obj.abstraction = AbstractionSignature.toJSON(message.abstraction); + } return obj; }, @@ -10511,6 +10646,9 @@ export const AccountSignature = { message.multiKeySignature = (object.multiKeySignature !== undefined && object.multiKeySignature !== null) ? MultiKeySignature.fromPartial(object.multiKeySignature) : undefined; + message.abstraction = (object.abstraction !== undefined && object.abstraction !== null) + ? AbstractionSignature.fromPartial(object.abstraction) + : undefined; return message; }, }; diff --git a/sdk/src/transaction_builder.rs b/sdk/src/transaction_builder.rs index 3ba9c981735d1..f2080bc456ab4 100644 --- a/sdk/src/transaction_builder.rs +++ b/sdk/src/transaction_builder.rs @@ -12,7 +12,10 @@ use crate::{ pub use aptos_cached_packages::aptos_stdlib; use aptos_crypto::{ed25519::Ed25519PublicKey, HashValue}; use aptos_global_constants::{GAS_UNIT_PRICE, MAX_GAS_AMOUNT}; -use aptos_types::transaction::{EntryFunction, Script}; +use aptos_types::{ + function_info::FunctionInfo, + transaction::{EntryFunction, Script}, +}; pub struct TransactionBuilder { sender: Option, @@ -155,6 +158,19 @@ impl TransactionFactory { )) } + pub fn add_dispatchable_authentication_function( + &self, + function_info: FunctionInfo, + ) -> TransactionBuilder { + self.payload( + aptos_stdlib::account_abstraction_add_dispatchable_authentication_function( + function_info.module_address, + function_info.module_name.into_bytes(), + function_info.function_name.into_bytes(), + ), + ) + } + pub fn implicitly_create_user_account_and_transfer( &self, public_key: &Ed25519PublicKey, diff --git a/sdk/src/types.rs b/sdk/src/types.rs index 22084b72bdc24..47f1bd6cd2671 100644 --- a/sdk/src/types.rs +++ b/sdk/src/types.rs @@ -22,11 +22,15 @@ use aptos_rest_client::{Client, PepperRequest, ProverRequest}; pub use aptos_types::*; use aptos_types::{ event::EventKey, + function_info::FunctionInfo, keyless::{ Claims, Configuration, EphemeralCertificate, IdCommitment, KeylessPublicKey, KeylessSignature, OpenIdSig, Pepper, ZeroKnowledgeSig, }, - transaction::authenticator::{AnyPublicKey, EphemeralPublicKey, EphemeralSignature}, + transaction::{ + authenticator::{AnyPublicKey, EphemeralPublicKey, EphemeralSignature}, + Auth, + }, }; use bip39::{Language, Mnemonic, Seed}; use ed25519_dalek_bip32::{DerivationPath, ExtendedSecretKey}; @@ -34,8 +38,12 @@ use keyless::FederatedKeylessPublicKey; use rand::Rng; use serde::{Deserialize, Serialize}; use std::{ + fmt, str::FromStr, - sync::atomic::{AtomicU64, Ordering}, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, time::{Duration, SystemTime, UNIX_EPOCH}, }; @@ -44,6 +52,7 @@ enum LocalAccountAuthenticator { PrivateKey(AccountKey), Keyless(KeylessAccount), FederatedKeyless(FederatedKeylessAccount), + Abstraction(AbstractedAccount), // TODO: Add support for keyless authentication } impl LocalAccountAuthenticator { @@ -65,6 +74,7 @@ impl LocalAccountAuthenticator { sig, ) }, + LocalAccountAuthenticator::Abstraction(..) => unreachable!(), } } @@ -355,6 +365,32 @@ impl LocalAccount { .into_inner() } + pub fn sign_aa_transaction_with_transaction_builder( + &self, + secondary_signers: Vec<&Self>, + fee_payer_signer: Option<&Self>, + builder: TransactionBuilder, + ) -> SignedTransaction { + let secondary_signer_addresses = secondary_signers + .iter() + .map(|signer| signer.address()) + .collect(); + let secondary_signer_auths = secondary_signers.iter().map(|a| a.auth()).collect(); + let raw_txn = builder + .sender(self.address()) + .sequence_number(self.increment_sequence_number()) + .build(); + raw_txn + .sign_aa_transaction( + self.auth(), + secondary_signer_addresses, + secondary_signer_auths, + fee_payer_signer.map(|fee_payer| (fee_payer.address(), fee_payer.auth())), + ) + .expect("Signing aa txn failed") + .into_inner() + } + pub fn address(&self) -> AccountAddress { self.address } @@ -364,6 +400,7 @@ impl LocalAccount { LocalAccountAuthenticator::PrivateKey(key) => key.private_key(), LocalAccountAuthenticator::Keyless(_) => todo!(), LocalAccountAuthenticator::FederatedKeyless(_) => todo!(), + LocalAccountAuthenticator::Abstraction(..) => todo!(), } } @@ -372,6 +409,7 @@ impl LocalAccount { LocalAccountAuthenticator::PrivateKey(key) => key.public_key(), LocalAccountAuthenticator::Keyless(_) => todo!(), LocalAccountAuthenticator::FederatedKeyless(_) => todo!(), + LocalAccountAuthenticator::Abstraction(..) => todo!(), } } @@ -384,9 +422,32 @@ impl LocalAccount { LocalAccountAuthenticator::FederatedKeyless(federated_keyless_account) => { federated_keyless_account.authentication_key() }, + LocalAccountAuthenticator::Abstraction(..) => todo!(), + } + } + + pub fn auth(&self) -> Auth { + match &self.auth { + LocalAccountAuthenticator::PrivateKey(key) => Auth::Ed25519(key.private_key()), + LocalAccountAuthenticator::Keyless(_) => todo!(), + LocalAccountAuthenticator::FederatedKeyless(_) => todo!(), + LocalAccountAuthenticator::Abstraction(aa) => { + Auth::Abstraction(aa.function_info.clone(), aa.sign_func.clone()) + }, } } + pub fn set_abstraction_auth( + &mut self, + function_info: FunctionInfo, + sign_func: Arc Vec + Send + Sync>, + ) { + self.auth = LocalAccountAuthenticator::Abstraction(AbstractedAccount { + function_info, + sign_func, + }) + } + pub fn sequence_number(&self) -> u64 { self.sequence_number.load(Ordering::SeqCst) } @@ -409,6 +470,7 @@ impl LocalAccount { LocalAccountAuthenticator::PrivateKey(key) => std::mem::replace(key, new_key.into()), LocalAccountAuthenticator::Keyless(_) => todo!(), LocalAccountAuthenticator::FederatedKeyless(_) => todo!(), + LocalAccountAuthenticator::Abstraction(..) => todo!(), } } @@ -713,6 +775,20 @@ pub struct FederatedKeylessAccount { jwt: Option, } +pub struct AbstractedAccount { + function_info: FunctionInfo, + sign_func: Arc Vec + Send + Sync>, +} + +impl fmt::Debug for AbstractedAccount { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("AbstractedAccount") + .field("function_info", &self.function_info) + .field("sign_func", &"") // Placeholder for the function + .finish() + } +} + impl KeylessAccount { pub fn new( iss: &str, diff --git a/testsuite/forge-cli/src/suites/land_blocking.rs b/testsuite/forge-cli/src/suites/land_blocking.rs index 5b2a2eafbe456..9cd6e219d9d99 100644 --- a/testsuite/forge-cli/src/suites/land_blocking.rs +++ b/testsuite/forge-cli/src/suites/land_blocking.rs @@ -2,7 +2,7 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use super::ungrouped::mixed_emit_job; +use super::ungrouped::mixed_compatible_emit_job; use crate::{suites::realistic_environment::realistic_env_max_load_test, TestCommand}; use aptos_forge::{success_criteria::SuccessCriteria, ForgeConfig}; use aptos_testcases::{ @@ -48,5 +48,5 @@ pub(crate) fn framework_upgrade() -> ForgeConfig { helm_values["chain"]["epoch_duration_secs"] = FrameworkUpgrade::EPOCH_DURATION_SECS.into(); })) - .with_emit_job(mixed_emit_job()) + .with_emit_job(mixed_compatible_emit_job()) } diff --git a/testsuite/forge-cli/src/suites/ungrouped.rs b/testsuite/forge-cli/src/suites/ungrouped.rs index 2830e63712dec..8dcc2528bdd79 100644 --- a/testsuite/forge-cli/src/suites/ungrouped.rs +++ b/testsuite/forge-cli/src/suites/ungrouped.rs @@ -543,6 +543,80 @@ pub fn mixed_emit_job() -> EmitJobRequest { ]) } +// framework_usecases can have new features, so might fail publishing. +pub fn mixed_compatible_emit_job() -> EmitJobRequest { + EmitJobRequest::default() + .mode(EmitJobMode::MaxLoad { + mempool_backlog: 10000, + }) + .transaction_mix(vec![ + // To test both variants, make module publish with such frequency, so that there are + // similar number of sequential and parallel blocks. + // For other transactions, make more expensive transactions somewhat rarer. + ( + TransactionTypeArg::AccountGeneration.materialize_default(), + 10000, + ), + ( + TransactionTypeArg::CoinTransfer.materialize_default(), + 10000, + ), + (TransactionTypeArg::PublishPackage.materialize_default(), 3), + ( + TransactionTypeArg::Batch100Transfer.materialize_default(), + 100, + ), + ( + TransactionTypeArg::VectorPicture30k.materialize_default(), + 100, + ), + ( + TransactionTypeArg::SmartTablePicture30KWith200Change.materialize( + 1, + true, + WorkflowProgress::when_done_default(), + ), + 100, + ), + ( + TransactionTypeArg::TokenV2AmbassadorMint.materialize_default(), + 10000, + ), + // ( + // TransactionTypeArg::ModifyGlobalResource.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::ModifyGlobalResourceAggV2.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::ModifyGlobalFlagAggV2.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::ModifyGlobalBoundedAggV2.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::ResourceGroupsGlobalWriteTag1KB.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::ResourceGroupsGlobalWriteAndReadTag1KB.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::TokenV1NFTMintAndTransferSequential.materialize_default(), + // 1000, + // ), + // ( + // TransactionTypeArg::TokenV1FTMintAndTransfer.materialize_default(), + // 10000, + // ), + ]) +} + fn fullnode_reboot_stress_test() -> ForgeConfig { ForgeConfig::default() .with_initial_validator_count(NonZeroUsize::new(7).unwrap()) diff --git a/testsuite/generate-format/tests/staged/api.yaml b/testsuite/generate-format/tests/staged/api.yaml index 72e38f150ea12..cef28c8ec8e5c 100644 --- a/testsuite/generate-format/tests/staged/api.yaml +++ b/testsuite/generate-format/tests/staged/api.yaml @@ -11,6 +11,13 @@ AbortLocation: TYPENAME: ModuleId 1: Script: UNIT +AbstractionAuthData: + ENUM: + 0: + V1: + STRUCT: + - signing_message_digest: BYTES + - authenticator: BYTES AccessPath: STRUCT: - address: @@ -49,6 +56,13 @@ AccountAuthenticator: TYPENAME: MultiKeyAuthenticator 4: NoAccountAuthenticator: UNIT + 5: + Abstraction: + STRUCT: + - function_info: + TYPENAME: FunctionInfo + - auth_data: + TYPENAME: AbstractionAuthData AggregateSignature: STRUCT: - validator_bitmask: @@ -321,6 +335,12 @@ FederatedKeylessPublicKey: TYPENAME: AccountAddress - pk: TYPENAME: KeylessPublicKey +FunctionInfo: + STRUCT: + - module_address: + TYPENAME: AccountAddress + - module_name: STR + - function_name: STR G1Bytes: NEWTYPESTRUCT: TUPLEARRAY: diff --git a/testsuite/generate-format/tests/staged/aptos.yaml b/testsuite/generate-format/tests/staged/aptos.yaml index 5e5c9c0e80697..d3067b891d50c 100644 --- a/testsuite/generate-format/tests/staged/aptos.yaml +++ b/testsuite/generate-format/tests/staged/aptos.yaml @@ -1,4 +1,11 @@ --- +AbstractionAuthData: + ENUM: + 0: + V1: + STRUCT: + - signing_message_digest: BYTES + - authenticator: BYTES AccessPath: STRUCT: - address: @@ -37,6 +44,13 @@ AccountAuthenticator: TYPENAME: MultiKeyAuthenticator 4: NoAccountAuthenticator: UNIT + 5: + Abstraction: + STRUCT: + - function_info: + TYPENAME: FunctionInfo + - auth_data: + TYPENAME: AbstractionAuthData AggregateSignature: STRUCT: - validator_bitmask: @@ -267,6 +281,12 @@ FederatedKeylessPublicKey: TYPENAME: AccountAddress - pk: TYPENAME: KeylessPublicKey +FunctionInfo: + STRUCT: + - module_address: + TYPENAME: AccountAddress + - module_name: STR + - function_name: STR G1Bytes: NEWTYPESTRUCT: TUPLEARRAY: diff --git a/testsuite/generate-format/tests/staged/consensus.yaml b/testsuite/generate-format/tests/staged/consensus.yaml index f9bb0aaf27da6..193d04823025c 100644 --- a/testsuite/generate-format/tests/staged/consensus.yaml +++ b/testsuite/generate-format/tests/staged/consensus.yaml @@ -1,4 +1,11 @@ --- +AbstractionAuthData: + ENUM: + 0: + V1: + STRUCT: + - signing_message_digest: BYTES + - authenticator: BYTES AccessPath: STRUCT: - address: @@ -37,6 +44,13 @@ AccountAuthenticator: TYPENAME: MultiKeyAuthenticator 4: NoAccountAuthenticator: UNIT + 5: + Abstraction: + STRUCT: + - function_info: + TYPENAME: FunctionInfo + - auth_data: + TYPENAME: AbstractionAuthData AggregateSignature: STRUCT: - validator_bitmask: @@ -540,6 +554,12 @@ FederatedKeylessPublicKey: TYPENAME: AccountAddress - pk: TYPENAME: KeylessPublicKey +FunctionInfo: + STRUCT: + - module_address: + TYPENAME: AccountAddress + - module_name: STR + - function_name: STR G1Bytes: NEWTYPESTRUCT: TUPLEARRAY: diff --git a/third_party/move/move-core/types/src/vm_status.rs b/third_party/move/move-core/types/src/vm_status.rs index 0db1e408c3a3b..0d34d3f59addc 100644 --- a/third_party/move/move-core/types/src/vm_status.rs +++ b/third_party/move/move-core/types/src/vm_status.rs @@ -565,9 +565,14 @@ pub enum StatusCode { SEQUENCE_NUMBER_TOO_BIG = 24, // The gas currency is not registered as a TransactionFee currency BAD_TRANSACTION_FEE_CURRENCY = 25, - // DEPRECATED. The feature requested is intended for a future Diem version instead of the current - // This code is deprecated as it is discarded. Use the verification error code - // FEATURE_NOT_ENABLED instead. + // Discards a transaction, because newly added code path hasn't yet been enabled, + // and transactions were discarded before the feature was introduced. + // To be used for example when new variants in the transaction - like new payload or authenticator + // types are introduced, that wouldn't be deserialized successfully by the previous binary. + // + // When the feature is "double" gated, i.e. new bytecode version introduces new things, + // but we don't want all the be enabled at the same time, such that it is safe to abort, + // use the verification error code FEATURE_NOT_ENABLED instead. FEATURE_UNDER_GATING = 26, // The number of secondary signer addresses is different from the number of secondary // public keys provided. @@ -589,9 +594,8 @@ pub enum StatusCode { GAS_PARAMS_MISSING = 38, REQUIRED_DEPOSIT_INCONSISTENT_WITH_TXN_MAX_GAS = 39, MULTISIG_TRANSACTION_PAYLOAD_DOES_NOT_MATCH = 40, - + ACCOUNT_AUTHENTICATION_GAS_LIMIT_EXCEEDED = 41, // Reserved error code for future use - RESERVED_VALIDATION_ERROR_6 = 41, RESERVED_VALIDATION_ERROR_7 = 42, RESERVED_VALIDATION_ERROR_8 = 43, RESERVED_VALIDATION_ERROR_9 = 44, @@ -732,7 +736,13 @@ pub enum StatusCode { TEST_VARIANT_TYPE_MISMATCH_ERROR = 1129, // A variant list is empty ZERO_VARIANTS_ERROR = 1130, - // A feature is not enabled. + // A feature is not enabled, and transaction will abort and be committed on chain. + // Use only when there is no backward incompatibility concern - as it is + // double-gated by an additional flag, i.e. new bytecode version introduces new things, + // but we don't want all the be enabled at the same time, such that it is safe to abort. + // + // If we are introducing code, that previous binary would discard such a transaction, + // you need to use FEATURE_UNDER_GATING flag instead. FEATURE_NOT_ENABLED = 1131, // Reserved error code for future use diff --git a/types/src/function_info.rs b/types/src/function_info.rs new file mode 100644 index 0000000000000..b1e82622a58cc --- /dev/null +++ b/types/src/function_info.rs @@ -0,0 +1,75 @@ +// Copyright (c) Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use crate::move_utils::{as_move_value::AsMoveValue, MemberId}; +use move_core_types::{ + account_address::AccountAddress, + value::{MoveStruct, MoveValue}, +}; +#[cfg(any(test, feature = "fuzzing"))] +use proptest_derive::Arbitrary; +use serde::{Deserialize, Serialize}; +use std::{ + fmt::{Display, Formatter}, + str::FromStr, +}; + +/// Reflection of aptos_framework::function_info::FunctionInfo +#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone, Hash)] +#[cfg_attr(any(test, feature = "fuzzing"), derive(Arbitrary))] +pub struct FunctionInfo { + pub module_address: AccountAddress, + pub module_name: String, + pub function_name: String, +} + +impl FunctionInfo { + pub fn new(module_address: AccountAddress, module_name: String, function_name: String) -> Self { + Self { + module_address, + module_name, + function_name, + } + } +} + +impl Display for FunctionInfo { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}::{}::{}", + self.module_address.to_hex(), + self.module_name, + self.function_name + )?; + Ok(()) + } +} + +impl From for FunctionInfo { + fn from(value: MemberId) -> Self { + Self::new( + value.module_id.address, + value.module_id.name.into_string(), + value.member_id.into_string(), + ) + } +} + +impl FromStr for FunctionInfo { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + Ok(MemberId::from_str(s)?.into()) + } +} + +impl AsMoveValue for FunctionInfo { + fn as_move_value(&self) -> MoveValue { + MoveValue::Struct(MoveStruct::Runtime(vec![ + MoveValue::Address(self.module_address), + self.module_name.as_move_value(), + self.function_name.as_move_value(), + ])) + } +} diff --git a/types/src/lib.rs b/types/src/lib.rs index 9081b6c0f0a4d..4a50857d1f44d 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -19,6 +19,7 @@ pub mod error; pub mod event; pub mod executable; pub mod fee_statement; +pub mod function_info; pub mod governance; pub mod indexer; pub mod jwks; diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index 38f4e5f700227..0bd27f22f799a 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -117,6 +117,7 @@ pub enum FeatureFlag { ENABLE_CALL_TREE_AND_INSTRUCTION_VM_CACHE = 83, /// AIP-103 (https://github.com/aptos-foundation/AIPs/blob/main/aips/aip-103.md) PERMISSIONED_SIGNER = 84, + ACCOUNT_ABSTRACTION = 85, } impl FeatureFlag { @@ -201,6 +202,7 @@ impl FeatureFlag { FeatureFlag::DISALLOW_INIT_MODULE_TO_PUBLISH_MODULES, FeatureFlag::PERMISSIONED_SIGNER, // FeatureFlag::ENABLE_CALL_TREE_AND_INSTRUCTION_VM_CACHE, + FeatureFlag::ACCOUNT_ABSTRACTION, ] } } @@ -276,6 +278,10 @@ impl Features { self.is_enabled(FeatureFlag::STORAGE_SLOT_METADATA) } + pub fn is_account_abstraction_enabled(&self) -> bool { + self.is_enabled(FeatureFlag::ACCOUNT_ABSTRACTION) + } + pub fn is_module_event_enabled(&self) -> bool { self.is_enabled(FeatureFlag::MODULE_EVENT) } diff --git a/types/src/transaction/authenticator.rs b/types/src/transaction/authenticator.rs index ed7643af29951..5a3a84e642f63 100644 --- a/types/src/transaction/authenticator.rs +++ b/types/src/transaction/authenticator.rs @@ -4,6 +4,7 @@ use crate::{ account_address::AccountAddress, + function_info::FunctionInfo, keyless::{ EphemeralCertificate, FederatedKeylessPublicKey, KeylessPublicKey, KeylessSignature, TransactionAndProof, @@ -17,7 +18,7 @@ use aptos_crypto::{ ed25519::{Ed25519PublicKey, Ed25519Signature}, hash::CryptoHash, multi_ed25519::{MultiEd25519PublicKey, MultiEd25519Signature}, - secp256k1_ecdsa, secp256r1_ecdsa, + secp256k1_ecdsa, secp256r1_ecdsa, signing_message, traits::Signature, CryptoMaterialError, HashValue, ValidCryptoMaterial, ValidCryptoMaterialStringExt, }; @@ -41,6 +42,30 @@ pub enum AuthenticationError { MaxSignaturesExceeded, } +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum AuthenticationProof { + Key(Vec), + Abstraction { + function_info: FunctionInfo, + auth_data: AbstractionAuthData, + }, + None, +} + +impl AuthenticationProof { + pub fn is_abstracted(&self) -> bool { + matches!(self, Self::Abstraction { .. }) + } + + pub fn optional_auth_key(&self) -> Option> { + match self { + Self::Key(data) => Some(data.clone()), + Self::Abstraction { .. } => None, + Self::None => None, + } + } +} + /// Each transaction submitted to the Aptos blockchain contains a `TransactionAuthenticator`. During /// transaction execution, the executor will check if every `AccountAuthenticator`'s signature on /// the transaction hash is well-formed and whether the sha3 hash of the @@ -313,8 +338,8 @@ impl TransactionAuthenticator { let mut account_authenticators: Vec = vec![]; account_authenticators.push(self.sender()); account_authenticators.extend(self.secondary_signers()); - if let Some(fee_payer) = self.fee_payer_signer() { - account_authenticators.push(fee_payer); + if let Some(fee_payer_signer) = self.fee_payer_signer() { + account_authenticators.push(fee_payer_signer); } account_authenticators }, @@ -364,6 +389,7 @@ impl TransactionAuthenticator { AccountAuthenticator::NoAccountAuthenticator => { // This case adds no single key authenticators to the vector. }, + AccountAuthenticator::Abstraction { .. } => {}, }; } Ok(single_key_authenticators) @@ -455,6 +481,7 @@ pub enum Scheme { MultiEd25519 = 1, SingleKey = 2, MultiKey = 3, + Abstraction = 4, NoScheme = 250, /// Scheme identifier used to derive addresses (not the authentication key) of objects and /// resources accounts. This application serves to domain separate hashes. Without such @@ -476,6 +503,7 @@ impl fmt::Display for Scheme { Scheme::SingleKey => "SingleKey", Scheme::MultiKey => "MultiKey", Scheme::NoScheme => "NoScheme", + Scheme::Abstraction => "Abstraction", Scheme::DeriveAuid => "DeriveAuid", Scheme::DeriveObjectAddressFromObject => "DeriveObjectAddressFromObject", Scheme::DeriveObjectAddressFromGuid => "DeriveObjectAddressFromGuid", @@ -486,7 +514,7 @@ impl fmt::Display for Scheme { } } -/// An `AccountAuthenticator` is an an abstraction of a signature scheme. It must know: +/// An `AccountAuthenticator` is an abstraction of a signature scheme. It must know: /// (1) How to check its signature against a message and public key /// (2) How to convert its public key into an `AuthenticationKeyPreimage` structured as /// (public_key | signature_scheme_id). @@ -511,7 +539,31 @@ pub enum AccountAuthenticator { authenticator: MultiKeyAuthenticator, }, NoAccountAuthenticator, - // ... add more schemes here + Abstraction { + function_info: FunctionInfo, + auth_data: AbstractionAuthData, + }, // ... add more schemes here +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)] +pub enum AbstractionAuthData { + V1 { + #[serde(with = "serde_bytes")] + signing_message_digest: Vec, + #[serde(with = "serde_bytes")] + authenticator: Vec, + }, +} + +impl AbstractionAuthData { + pub fn signing_message_digest(&self) -> &Vec { + match self { + Self::V1 { + signing_message_digest, + .. + } => signing_message_digest, + } + } } impl AccountAuthenticator { @@ -523,6 +575,7 @@ impl AccountAuthenticator { Self::SingleKey { .. } => Scheme::SingleKey, Self::MultiKey { .. } => Scheme::MultiKey, Self::NoAccountAuthenticator => Scheme::NoScheme, + Self::Abstraction { .. } => Scheme::Abstraction, } } @@ -555,6 +608,25 @@ impl AccountAuthenticator { Self::MultiKey { authenticator } } + /// Create a abstracted authenticator + pub fn abstraction( + function_info: FunctionInfo, + signing_message_digest: Vec, + authenticator: Vec, + ) -> Self { + Self::Abstraction { + function_info, + auth_data: AbstractionAuthData::V1 { + signing_message_digest, + authenticator, + }, + } + } + + pub fn is_abstracted(&self) -> bool { + matches!(self, Self::Abstraction { .. }) + } + /// Return Ok if the authenticator's public key matches its signature, Err otherwise pub fn verify(&self, message: &T) -> Result<()> { match self { @@ -569,6 +641,11 @@ impl AccountAuthenticator { Self::SingleKey { authenticator } => authenticator.verify(message), Self::MultiKey { authenticator } => authenticator.verify(message), Self::NoAccountAuthenticator => bail!("No signature to verify."), + // Abstraction delayed the authentication after prologue. + Self::Abstraction { auth_data, .. } => { + ensure!(auth_data.signing_message_digest() == &HashValue::sha3_256_of(signing_message(message)?.as_slice()).to_vec(), "The signing message digest provided in Abstraction Authenticator is not expected"); + Ok(()) + }, } } @@ -580,6 +657,7 @@ impl AccountAuthenticator { Self::SingleKey { authenticator } => authenticator.public_key_bytes(), Self::MultiKey { authenticator } => authenticator.public_key_bytes(), Self::NoAccountAuthenticator => vec![], + Self::Abstraction { .. } => vec![], } } @@ -591,18 +669,27 @@ impl AccountAuthenticator { Self::SingleKey { authenticator } => authenticator.signature_bytes(), Self::MultiKey { authenticator } => authenticator.signature_bytes(), Self::NoAccountAuthenticator => vec![], + Self::Abstraction { .. } => vec![], } } - /// Return an authentication key derived from `self`'s public key and scheme id - pub fn authentication_key(&self) -> Option { - if let Self::NoAccountAuthenticator = self { - None - } else { - Some(AuthenticationKey::from_preimage( - self.public_key_bytes(), - self.scheme(), - )) + /// Return an authentication proof derived from `self`'s public key and scheme id + pub fn authentication_proof(&self) -> AuthenticationProof { + match self { + Self::NoAccountAuthenticator => AuthenticationProof::None, + Self::Abstraction { + function_info, + auth_data, + } => AuthenticationProof::Abstraction { + function_info: function_info.clone(), + auth_data: auth_data.clone(), + }, + Self::Ed25519 { .. } + | Self::MultiEd25519 { .. } + | Self::SingleKey { .. } + | Self::MultiKey { .. } => AuthenticationProof::Key( + AuthenticationKey::from_preimage(self.public_key_bytes(), self.scheme()).to_vec(), + ), } } @@ -614,6 +701,7 @@ impl AccountAuthenticator { Self::SingleKey { .. } => 1, Self::MultiKey { authenticator } => authenticator.signatures.len(), Self::NoAccountAuthenticator => 0, + Self::Abstraction { .. } => 0, } } } diff --git a/types/src/transaction/mod.rs b/types/src/transaction/mod.rs index 5c2560926d9bc..2581e09e0d346 100644 --- a/types/src/transaction/mod.rs +++ b/types/src/transaction/mod.rs @@ -57,6 +57,7 @@ use crate::{ contract_event::TransactionEvent, executable::ModulePath, fee_statement::FeeStatement, + function_info::FunctionInfo, keyless::FederatedKeylessPublicKey, proof::accumulator::InMemoryEventAccumulator, state_store::{state_key::StateKey, state_value::StateValue}, @@ -75,11 +76,22 @@ pub use script::{ TypeArgumentABI, }; use serde::de::DeserializeOwned; -use std::{collections::BTreeSet, hash::Hash, ops::Deref, sync::atomic::AtomicU64}; +use std::{ + collections::BTreeSet, + hash::Hash, + ops::Deref, + sync::{atomic::AtomicU64, Arc}, +}; pub type Version = u64; // Height - also used for MVCC in StateDB pub type AtomicVersion = AtomicU64; +#[derive(Clone)] +pub enum Auth<'a> { + Ed25519(&'a Ed25519PrivateKey), + Abstraction(FunctionInfo, Arc Vec>), +} + /// RawTransaction is the portion of a transaction that a client signs. #[derive( Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash, @@ -318,6 +330,64 @@ impl RawTransaction { )) } + pub fn sign_aa_transaction( + self, + sender_auth: Auth, + secondary_signers: Vec, + secondary_auths: Vec, + fee_payer: Option<(AccountAddress, Auth)>, + ) -> Result { + let user_signed_message = if fee_payer.is_some() { + RawTransactionWithData::new_fee_payer( + self.clone(), + secondary_signers.clone(), + AccountAddress::ZERO, + ) + } else { + RawTransactionWithData::new_multi_agent(self.clone(), secondary_signers.clone()) + }; + let sender_authenticator = gen_auth(sender_auth, &user_signed_message)?; + + if secondary_auths.len() != secondary_signers.len() { + return Err(format_err!( + "number of secondary private keys and number of secondary signers don't match" + )); + } + let mut secondary_authenticators = vec![]; + for auth in secondary_auths { + let secondary_authenticator = gen_auth(auth, &user_signed_message)?; + secondary_authenticators.push(secondary_authenticator); + } + + if let Some((fee_payer_address, fee_payer_auth)) = fee_payer { + let user_signed_message = RawTransactionWithData::new_fee_payer( + self.clone(), + secondary_signers.clone(), + fee_payer_address, + ); + let fee_payer_authenticator = gen_auth(fee_payer_auth, &user_signed_message)?; + Ok(SignatureCheckedTransaction( + SignedTransaction::new_fee_payer( + self, + sender_authenticator, + secondary_signers, + secondary_authenticators, + fee_payer_address, + fee_payer_authenticator, + ), + )) + } else { + Ok(SignatureCheckedTransaction( + SignedTransaction::new_multi_agent( + self, + sender_authenticator, + secondary_signers, + secondary_authenticators, + ), + )) + } + } + /// Signs the given `RawTransaction`. Note that this consumes the `RawTransaction` and turns it /// into a `SignatureCheckedTransaction`. /// @@ -360,6 +430,27 @@ impl RawTransaction { } } +fn gen_auth( + auth: Auth, + user_signed_message: &RawTransactionWithData, +) -> Result { + Ok(match auth { + Auth::Ed25519(private_key) => { + let sender_signature = private_key.sign(user_signed_message)?; + AccountAuthenticator::ed25519(Ed25519PublicKey::from(private_key), sender_signature) + }, + Auth::Abstraction(function_info, sign_function) => { + let digest = + HashValue::sha3_256_of(signing_message(user_signed_message)?.as_slice()).to_vec(); + AccountAuthenticator::abstraction( + function_info.clone(), + digest.clone(), + sign_function(digest.as_ref()), + ) + }, + }) +} + #[derive( Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize, CryptoHasher, BCSCryptoHash, )] @@ -1017,7 +1108,8 @@ impl VMValidatorResult { Some(status) => status.status_type() == StatusType::Unknown || status.status_type() == StatusType::Validation - || status.status_type() == StatusType::InvariantViolation, + || status.status_type() == StatusType::InvariantViolation + || status.status_type() == StatusType::Execution, }, "Unexpected discarded status: {:?}", vm_status